Emacsで会社と家の設定を自動切換

| 【5分で読めるよ!】 | コメント(0) | トラックバック(0)

 この記事はEmacs Advent Calendar jp: 2010の17日目です。先日は@Oh_CanNotAngelさんでした。毎日参考になります。


 さて、僕はいつもMacBookで開発しています。家でも会社でも、同じMacBookで開発しています。もちろん立ち上げているのはEmacsです。この前ちょっとEmacsをやめようとも思いましたが、これはもう仕方ないです。

 会社と家でいったりきたり開発をしていると、その場所々々で設定を切り替えて使うことが多くなってきます。たとえばネットワークとか。twittering-modeを起動したらプロキシが設定されてなくてうぎゃーとかなったりします。

 .emacs.elを家と会社で別々にする、というのも手ではありますが、Dropboxで同期しているので管理が面倒です。

 そんなときEmacsが、今いる場所にあわせて勝手に設定を切り替えてくれたらいいですよね。

 今日はそんな「空気のように、意識せず使えるEmacs」を目指してみたいと思います。

Emacsで会社にいるのか調べる

 Emacsで場所を調べるにはどうすればいいでしょう? GPSとか使えばいいんでしょうが、僕には衛星の知り合いがいないのでそのような難しいことはできません。

 まあ、ようは別に今いる場所が川崎か六本木かを知らなくても、今会社にいる、とかがわかればいいわけです。なので単純にIPアドレスで比較してみました。

 EmacsからIPアドレスは以下の関数machine-ip-addressで取得できます。

(defun machine-ip-address (dev)
  "Return IP address of a network device."
  (let ((info (network-interface-info dev)))
    (if info
      (format-network-address (car info) t))))

 これを使うと、「会社にいるかどうかを判定する関数officep」が以下のように書けます。IPアドレスのマッチ部分は好きなように置き換えてください。うちの会社は「10.0.100.」というIPアドレスをもらうので、IPアドレスが「10.0.100.」で始まっているときは会社にいる、と判定できます。

※追記(12/18 14:03): @usk_tさんから変数名が違うという指摘をいただいたので修正しました。

(defvar *network-interface-names* '("en1" "wlan0")
  "Candidates for the network devices.")

(defun officep ()
  "Am I in the office? If I am in the office, my IP address must start with '10.0.100.'."
  (let ((ip (some #'machine-ip-address *network-interface-names*)))
     (and ip
          (eq 0 (string-match "^10\\.0\\.100\\." ip)))))

 評価すると、

(officep)
=> t

 どうやら今僕は会社でブログを書いているみたいです。

実用例

 僕のofficepの実用例をあげておきます。

E-mailアドレス

 プログラムのヘッダレベルコメントに、自分の名前とE-mailアドレスを入れることってまあありますよね。僕は、趣味のプログラムと会社の製品で、アドレスと会社を使い分けたいので以下のようなコードを書いてます。

(setq user-full-name "深町英太郎 (E.Fukamachi)"
      user-mail-address (if (officep)
                          "fukamachi_e@ariel-networks.com"
                          "e.arrows@gmail.com"))

 まあ会社でこっそり趣味のプログラム書いたりしてると意味ないんですけどね。

プロキシ

 ノートPCを使っているとネットワークが切り替わったときに問題がつきまとうことがあります。たとえば、アリエルでは社内のプロキシサーバ経由でないと外部のネットワークにアクセスできません。すると、EmacsでWebサイトを見たり、Twitterを見たりできなくなってしまいます。

 そこで僕は会社にいるときだけプロキシを設定するようにしてみました。

(if (officep)
    (progn
      (let ((protocol "http")
            (domain "192.168.0.230")
            (port "3128"))
        (setq url-proxy-services
              `((,protocol . ,(concat domain ":" port))))
        (setq w3m-command-arguments-alist
              `(("" "-o" ,(format "http_proxy=%s://%s:%s" protocol domain port))))
        (eval-after-load 'twittering-mode
          `(setq twittering-proxy-use t
                 twittering-proxy-server ,(concat protocol "://" domain)
                 twittering-proxy-port ,port)))
      t)
    (progn
      (setq url-proxy-services nil)
      (setq w3m-command-arguments-alist nil)
      (eval-after-load 'twittering-mode
        `(setq twittering-proxy-use nil
               twittering-proxy-server nil
               twittering-proxy-port nil))))

 家でも会社でTwitterが見られます。

まとめ

 こんな感じでしょうか。

 他には、会社にいるときだけJavaモードをrequireしたり、文字コードをShift_JISにしたり、モードラインに「リリースまであと何日!」とか表示して自分を追い込んだりすることができます。

 僕は空気が読めませんが、僕のEmacsは空気が読めるわけです。偉いですね。

 明日のAdvent Calendarは@r_takaishiさんです。さらに明後日は弊社の菅原さんです。楽しみにしましょうね。

トラックバック(0)

トラックバックURL: http://e-arrows.sakura.ne.jp/mt/mt-tb.cgi/177

コメントする

このブログ記事について このアーカイブについて

このページは、深町英太郎が2010年12月16日 09:28に書いたブログ記事です。

ひとつ前のブログ記事は「anything-ari.elを作りました」です。

次のブログ記事は「Common Lispでapply-macro」です。

Ariel Labs
Name:深町英太郎
Age:23歳
Living:京都府
Company:はてな
Hatena Id:id:nitro_idiot
Facebook:eitarow.fukamachi
mixi:ID:6756132
Twitter:nitro_idiot
GitHub:fukamachi
LinkedIn:eitarowfukamachi

Techonrati

Technorati search

» リンクしているブログ

Powered by Movable Type 4.23-ja