2009-06-05

emacs23でインラインパッチが使えるようになった

[Macemacsjp-users 1649]ではしもと氏からemacs23で使えるインラインパッチをSVNのリポジトリに登録した、という投稿があった。実は結構前からCarbon Emacsからemacs23に移行したいのだが、インラインパッチがあたらないため、移行を見送っていた。 今回のパッチでとりあえず動くようになったので、その顛末を書いておく。 まずはCVSでemacsのソースを落としてくる。 最近、cvs.savannha.gnu.orgがRAIDトラブルでサービス不能になっていたが、2009年6月4日には復旧していた。中の人に感謝しつつ、emacsのソースを落とす。 % cvs -d:pserver:anonymous@cvs.savannha.gnu.org:/sources/emacs login % cvs -z3 -d:pserver:anonymous@cvs.savannha.gnu.org:/soruces/emacs co emacs 当然、インラインパッチもローカルに落とす。こっちはメールにも書かれている通り、sourceforge.jpのsvnレポジトリから落としてくる。 で、パッチをあてて、コンパイル。 % cd /path/to/emacs/source % patch -p 0 < /path/to/inline/patch/file % ./configure --with-ns % make bootstrap % make install インラインパッチのアナウンスメールほぼそのままの何も芸がないな。。。 で、ここまでくるとemacsのソースディレクトリにnextstep/Emacs.appが生成される。 インライン入力を有効にするために.emacsに下記のように設定を追加しておく。 (setq default-input-method "MacOSX") あとは、いつも使っていたelispパッケージをがりがりインストールしてあげればよい。実はこのelispパッケージのインストール時にwanderlustからgmailにメールを送信できない問題にぶちあっていた。しばらくはCarbon Emacsと併用して、問題がなければemacs23一本に絞る予定。 今日のまとめ
  • emacs23でインラインパッチをあててみた
  • 情報量は0bit

gmailのimap機能をwanderlustから使ってみる その2

ずーと昔にgmailのimap機能をwanderlustから使ってみるていう記事をポストしたんだけど、どうやら古い情報になってしまったぽい。昔の記事ではsmtpにsslを使えと書いていたが、今のGMailの仕様ではstarttlsを使えといっている。今回は情報をアップデートして、環境を作り直すときに不幸にならないようにしておく。 (setq wl-smtp-posting-user "gmailのメールアドレス") (setq wl-smtp-posting-server "smtp.gmail.com") (setq wl-authenticate-type "login") (setq wl-smtp-posting-port 587) (setq wl-smtp-connection-type 'starttls) (setq ssl-certificate-verification-policy 1) ということでwl-smtp-posting-port587にして、wl-smtp-connection-typestarttlsにすると幸せになれる。僕はこれに気が付かずにメールが遅れなくなりかなりハマってしまった。 ちなみにssl-certificate-verification-policy0にしておくと、gmail.comの証明書の正当性(opensslで上位の認証局が確認できるか)を調べてしまう。gmail.comの証明書の上位はopensslの証明局に登録されていないので、Cannot open: elmo-network-initialize-sessionと怒られてしまい、smtpサーバに接続できない。0以外の値を入れておけば、証明書の正当性をチェックしないらしいので、とりあえず1を入れておく。証明書の正当性を確認できないのが気持ち悪いなら、エラーの内容でググれば対応策が書かれたサイトが見つかるはず。 今日のまとめ
  • gmailのsmtpサーバに接続するときにはSSLではなくSTARTTLSを使わなければならない
  • 困ったときはググるのもいいけど、その前にベンダーが提供している情報を参照しろ

2009-06-01

OpenBSD 4.5の/var/backupに感動した話

最近、色々考えることがあって、OpenBSD 4.5をまじめに使ってみている。 で、感動したのがOpenBSD(他の*BSDでも同じだと思うけど)は/var/backupに/etcの下にあるコンフィグファイルとかのバックアップを2世代分保持していて、変更があったらdaily cronで差分をroot宛てに"hostname.domain daily output"ていうsubjectで送信してくれる。つまり、このメールを後生大事にとっておくとマシンに万が一のことがあったら何とか復旧できるかもしれない。まぁ、こういう重要なファイルは自分でバックアップをとっておくとか、設定内容はちゃんとメモしておくとかすればいいんだけど、往々にしてそんなめんどくさいことは後回しになってしまう。なので、このシステムはずぼらな鯖管には嬉しすぎるシステムなわけ。 ただ、OpenBSDはあとからportsとかでがんがんパッケージを追加して環境を整えるべきなんだけど、当然後から入れた分については/var/backupの対象外になってしまう。で、/var/backupにファイルを配置する仕組みや差分をとる仕組みについてちょっと調べたのでメモしておく。 まず、daily cronでは/etc/securityというshell scriptを起動して、daily insecure outputを出力している。ただ、/etc/securityは/var/backup以下にあるfoo.currentと対象ファイルの差分を計算して、差分があればdiffの内容を出力し、出力結果をまとめて標準出力に出しているだけぽい。つまり、/var/backupでバックアップをとっておくファイルの指定はできない。man 8 securityを読むと
Check for changes in files listed in /etc/changelist
と書いてあったので、どうやら/etc/changelistをごにょごにょすると幸せになれるらしい。/etc/changelistはプレインテキストファイルなので中身をcatで見てみると、確かに/var/backupでバックアップをとっているファイルが列挙されている。ただ、いくつかのファイルは行頭に"+"が書かれていて、これはファイルの内容ではなく、MD5のチェックサムでバックアップをとっているとのこと。 なので、/etc/changelistの中にバックアップをとりたいファイルをフルパスで書いてあげれば、/etc/securityが起動したときに最初のバックアップを取ってくれる。でも、大体はdaily cronで/etc/securityが起動する前に設定ファイルを編集したいと思うので、そんなときは/etc/securityを実行してしまうか、バックアップファイルを作ってしまうのがよいかも。例えば、バックアップしたいファイルのフルパスが/path/to/fileだったらpath_to_fileてなる。なので、ファイル名はpath_to_file.currentになるはず。ここは/var/backupの中を直接のぞいてもいいし、/etc/securityの_fnchgという関数の定義を見てもいい。 というわけで今日のまとめ
  • daily insecurity outputは/etc/securityの出力結果
  • /var/backupでバックアップを取るためには/etc/changelistに対象ファイルのフルパスを書いておく
    • 行頭に+をつけるとファイルのMD5ハッシュ値を記録する
  • /etc/changelistに追加した直後にファイルを編集する必要がある場合は/etc/securityを実行するか、自分で/var/backupの下にバックアップファイルを作る
ちなみにMac OS Xにも/var/backupはあるけど、中身は空っぽ。多分、FreeBSDにも同じような仕組みがあって何らかの設定が必要なんじゃないかな。ちなみにこのエントリはOpenBSDの4.5で試した結果を書いているけど、他のバージョンでもほぼ同じだと思う。詳しくはmanを見てねて感じで。

2009-01-23

elscreen-gfのチートシート

とーぜん、開発はemacsを使っていています。だって便利だもん。 で、コードを読むときにこの関数てどこで使われているか/定義されているかを知りたいときは多々あります。根性でgrepしてもいいですが、世の中にはGNU ID UtilsとかGNU GLOBALとか便利なツールもあるので、こういうツールを使ったほうが時間の節約にもなります。 しかも、emacsから使うならelscreen-gfという便利なlispがあります。まぁ、このあたりはelscreen-gfとかで検索したら色々出てくると思うからばっさり省略。 今日の本題はelscreen-gfでglobalを使うときのチートシートです。 elscreen-gfはglobalだけじゃなく、上記のGNU ID Utilsやgrepなども使えますが、phpの開発が主体なのでGNU GLOBALしか使っていません。一応、たしなみとしてGNU ID Utilsやctagもインストールしているけどね。。。 で、phpのコードの中でGNU GLOBALを使うときは以下な感じ。
elscreen-prefix-keyC-g t gtagの実行
elscreen-prefix-keyC-g l カーソルがある箇所の関数、もしくは任意の関数を調べる(0で定義している箇所を探し、1で使われている箇所を探す)
elscreen-prefix-keyC-g lを実行したらglobalの結果を整形してElScreen-GFバッファに結果が表示される。そのバッファでは以下が使える。
n 下の行に移動
p 上の行に移動
> バッファの最後に移動
< バッファの最初に移動
N 次のファイルに移動
P 前のファイルに移動
o 該当するファイルの該当行にジャンプする
O 該当するファイルの該当行にジャンプする(読み込み専用)
q ElScreen-GFを終了する
一応、elscreen-gf.elではわかりやすい関数名で書かれている。

2009-01-19

ptp遊び (その後)

かなーり以前にptp遊びをしていて、このBlogでもptpcamで遊んだら面白そう、というエントリを残したんだけど、実はあのあとにちょっとゴタゴタあってptpではちゃんと遊んでいませんでした。ただ、このBlogにGoogleからptpcamというキーワードでたどり着いている人がいるので、ちょっとだけアップデート。 て、言っても、Fedora 10でちょろっとだけ使ってみた、ということだけです。 えと、まず昔にlibptpで遊んだときはgcc4でコンパイルできないよ、ぎゃおーと叫んでいたと思いますが、Fedora 10ではきっちりコンパイルできました。とくにトリッキーなことはしていないです。ふつーに./configure && make && sudo make installでインストールまでいけると思います。ただ、libusb-develは必要かも。つかったバージョンはlibptp2の1.1.10。多分最新のstableだと思うんだけど、ちょっとリリースした日が古いかも。 あと、ptpcamで遊ぼうと思ったんだけど、gphoto2にD80を先に奪われちゃったので断念しました。多分、gphoto2のgvfs関係のパッケージを削除したらいけるんじゃないかな。あと、runlevelが3な状態でもいけそうな気がする。もっとちゃんとしたいならgvfs関係をちゃんと設定するとか。 というわけで、libptp2はFedora 10でコンパイルできるけど、まじめに使おうとしたら、ちょっとめんどくさかったという話でした。

2009-01-05

なぞのUCD-DISKIO-MIB

会社のFedoraなマシンのサーバステータスをrrdtoolsを使ってグラフ化してます。グラフ化している値の中でUCD-DISKIO-MIBのdiskIONReadとdiskIONWrittenを使ったディスクIOの読み込みと書き込みをグラフ化しているんだけど、最近ちょっと変。 どう変なのかというと、sdaのつもりでとっていたdiskIONReadやdiskIONWrittenの値がループでバイスの値になっているぽい。つまり、
nabeo@foo:~[8413]% snmpwalk -c public -v 1 bar diskIODevice UCD-DISKIO-MIB::diskIODevice.1 = STRING: ram0 UCD-DISKIO-MIB::diskIODevice.2 = STRING: ram1 UCD-DISKIO-MIB::diskIODevice.3 = STRING: ram2 UCD-DISKIO-MIB::diskIODevice.4 = STRING: ram3 UCD-DISKIO-MIB::diskIODevice.5 = STRING: ram4 UCD-DISKIO-MIB::diskIODevice.6 = STRING: ram5 UCD-DISKIO-MIB::diskIODevice.7 = STRING: ram6 UCD-DISKIO-MIB::diskIODevice.8 = STRING: ram7 UCD-DISKIO-MIB::diskIODevice.9 = STRING: ram8 UCD-DISKIO-MIB::diskIODevice.10 = STRING: ram9 UCD-DISKIO-MIB::diskIODevice.11 = STRING: ram10 UCD-DISKIO-MIB::diskIODevice.12 = STRING: ram11 UCD-DISKIO-MIB::diskIODevice.13 = STRING: ram12 UCD-DISKIO-MIB::diskIODevice.14 = STRING: ram13 UCD-DISKIO-MIB::diskIODevice.15 = STRING: ram14 UCD-DISKIO-MIB::diskIODevice.16 = STRING: ram15 UCD-DISKIO-MIB::diskIODevice.17 = STRING: sda UCD-DISKIO-MIB::diskIODevice.18 = STRING: sda1 UCD-DISKIO-MIB::diskIODevice.19 = STRING: sda2 UCD-DISKIO-MIB::diskIODevice.20 = STRING: sdb UCD-DISKIO-MIB::diskIODevice.21 = STRING: sdb1 UCD-DISKIO-MIB::diskIODevice.22 = STRING: sr0 nabeo@foo:~[8414]%
というつもりでMIB値をとっているつもりが、いつのまにか
UCD-DISKIO-MIB::diskIODevice.1 = STRING: ram0 UCD-DISKIO-MIB::diskIODevice.2 = STRING: ram1 UCD-DISKIO-MIB::diskIODevice.3 = STRING: ram2 UCD-DISKIO-MIB::diskIODevice.4 = STRING: ram3 UCD-DISKIO-MIB::diskIODevice.5 = STRING: ram4 UCD-DISKIO-MIB::diskIODevice.6 = STRING: ram5 UCD-DISKIO-MIB::diskIODevice.7 = STRING: ram6 UCD-DISKIO-MIB::diskIODevice.8 = STRING: ram7 UCD-DISKIO-MIB::diskIODevice.9 = STRING: ram8 UCD-DISKIO-MIB::diskIODevice.10 = STRING: ram9 UCD-DISKIO-MIB::diskIODevice.11 = STRING: ram10 UCD-DISKIO-MIB::diskIODevice.12 = STRING: ram11 UCD-DISKIO-MIB::diskIODevice.13 = STRING: ram12 UCD-DISKIO-MIB::diskIODevice.14 = STRING: ram13 UCD-DISKIO-MIB::diskIODevice.15 = STRING: ram14 UCD-DISKIO-MIB::diskIODevice.16 = STRING: ram15 UCD-DISKIO-MIB::diskIODevice.17 = STRING: loop0 UCD-DISKIO-MIB::diskIODevice.18 = STRING: loop1 UCD-DISKIO-MIB::diskIODevice.19 = STRING: loop2 UCD-DISKIO-MIB::diskIODevice.20 = STRING: loop3 UCD-DISKIO-MIB::diskIODevice.21 = STRING: loop4 UCD-DISKIO-MIB::diskIODevice.22 = STRING: loop5 UCD-DISKIO-MIB::diskIODevice.23 = STRING: loop6 UCD-DISKIO-MIB::diskIODevice.24 = STRING: loop7 UCD-DISKIO-MIB::diskIODevice.25 = STRING: sda UCD-DISKIO-MIB::diskIODevice.26 = STRING: sda1 UCD-DISKIO-MIB::diskIODevice.27 = STRING: sda2 UCD-DISKIO-MIB::diskIODevice.28 = STRING: sdb UCD-DISKIO-MIB::diskIODevice.29 = STRING: sdb1 UCD-DISKIO-MIB::diskIODevice.30 = STRING: sr0
になっていたりする。つまり、いつの間にかloop0とかというデバイスができてしまっている。 MIB値をとっているシェルスクリプトではデバイスの番号をきめ打ちで書いているので、こういうことに対応できない。多分、udevあたりの設定でloop0を作らないようにできると思うんだけど、調べるのがめんどいし、そもそも決め打ちで書くなよということもあったので、最初にdiskIODeviceで必要なデバイスの番号を調べてから、本命のMIB値をとりにいくようにスクリプトを書き直した。 ここまできたらシェルスクリプトじゃなくて、Rubyとかで収集用スクリプトを組んだほうがいいと思うけど、いまいちRubyは勉強不足なのでできていない。今年の目標かなぁ。。。

org-modeでTODOを管理

一年の計は元旦にあり、ではないが今年から自分のタスクをorg-modeを使って管理してみようと思う。ここでは自分用に設定と使い方をメモとして残しておく。 そもそも、これまでは自分のタスク管理は特にツールは使わず、メールやスケジュール帳などで管理をしていた。基本的にタスク処理は投入された時点での優先順位に従ってベストエフォートで行ってきたが、如何せんベストエフォートなのでドロップすることもあった。あと、自分の性能としてマルチタスクも弱いので、疑似マルチタスクでなんとか処理能力もあげたい、なんてことも考えている。 ということで、emacsの設定。今使っているemacsはM-x emacs-versionとするとGNU Emacs 22.3.1 (i386-apple-darwin9.5.0, Carbon Version 1.6.0) of 2008-11-01 on leopard.localと表示される。つまり、Carbon Emacsの2008年秋版。このCarbon Emacsには標準でorg-modeの5.23aが入っている。以下はこの環境でorg-modeの設定。
(require 'org) ;; 拡張子がorgのファイルをorg-modeで扱う (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) ;; キーバインドの設定(global map) (define-key global-map "\C-cl" 'org-store-link) (define-key global-map "\C-ca" 'org-agenda) ;; TODOファイルの登録 (setq org-agenda-files (list "/path/to/file/todo-00.org" "/path/to/file/todo-01.org") ;; TODOのタスクの種類としてTODO Wait Doneを定義 :: C-c C-tでTODO -> Wait -> Doneと切り替わる (setq org-todo-keywords '("TODO" "Wait" "Done")) (setq org-todo-interpretation 'sequence)
サイトによっては他にも設定をしているみたいだけど、とりあえずorg-modeの試食ができればいいのでこれくらいにしておく。 あとはよく使うと思われるキーバインドをメモっておく。
階層の操作 追加 : C-c C-RET 階層を深くする : M-Right 階層を深くする(下の階層も同時にする) : M-S-Right 階層を浅くする : M-Left 階層を浅くする(下の階層も同時にする) : M-S-Left 第一階層のみの表示 (トグル) : Shift-TAB すべてを開く : C-c C-a 次の項目に移動 : C-n 同階層の次の項目に移動 : C-c C-f 前の項目に移動 : C-p 同階層の前の項目に移動 : C-c C-b TODOリスト TODOリストを追加 : M-S-RET TODOの状態を変更 : C-c C-t org-todo-keywordsの順番でトグルする TODOのアイテムのみを表示する : C-c C-v 表組 項目の区切り : | 行の区切り : |-
このリストを育ててチート表にしたら便利だろうなぁ。ということでTODO追加。