WordPress で日記をつけ始めました
anything 的絞りこみコマンド percol が migemo 対応しました
先日のエントリで percol というとっても便利なコマンドを紹介しました.migemo 対応してくれたら更に便利だなーと思っていたのですが,id:mooz さんがばっちり --match-method に migemo を追加して下さいました.
percol で migemo を使うには C/Migemo と PyMigemo を導入する必要があります.備忘として Ubuntu 11.10 とWidnows7 での導入方法を記しておきます.めんどくさいのでインストール場所は全部デフォルトの場所で,migemo の辞書の文字コードは utf-8 を使うことにします.
各ソフトウェアのバージョン
Ubuntu 11.10 に導入する
Ubuntu の環境は以下のようなになってます.
まずは cmigemo の導入です.KaoriYaさんからアーカイブをダウンロードしてきます.
$ wget http://cmigemo.googlecode.com/files/cmigemo-default-src-20110227.zip $ unzip cmigemo-default-src-20110227.zip $ cd cmigemo-default-src
このソースの中の src/wordbuf.c は limits.h をインクルードし忘れているので,以下のように修正します.
$ diff -u src/wordbuf.c.bck src/wordbuf.c --- src/wordbuf.c.bck 2012-05-11 21:52:44.006214700 +0900 +++ src/wordbuf.c 2012-05-11 19:40:39.310948000 +0900 @@ -9,6 +9,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <limits.h> #include "wordbuf.h" #define WORDLEN_DEF 64
あとはビルドするだけです.
$ ./configure $ make gcc $ make gcc-dict; cd dict; make utf-8; cd .. # 辞書のビルド # make gcc-install
これで /usr/local/bin に cmigemo,/usr/local/share/migemo に辞書,/usr/local/lib に libmigemo.so がインストールされます.
次は PyMigemo を導入します.
$ wget http://www.atzm.org/etc/files/pymigemo/pymigemo-0.3.tar.gz $ tar xvf pymigemo-0.3.tar.gz $ cd pymigemo-0.3 $ python setup build # python setup install
これで無事ビルドされるはずです.
最後に percol を入れます.
$ git clone git://github.com/mooz/percol.git $ cd percol # python setup.py install
ビルドはこれだけです.あと設定ファイルが必要ですが,無駄に長くなるので前のエントリ]を見て下さい.
Windows7 64bit に導入する
Windows の環境は以下のようになっています.
- Windows7 64bit
- Cygwin 1.7.11
- python 2.6.7
- zsh 4.3.12
Cygwin は既に導入されている前提とします.私は Cygwin のもともと全パッケージをインストールしているので,以下の工程での細かい必要パッケージがわかりません.cmigemo も Windows用 dll ではなく,ソースからビルドします.
まずは cmigemo ですがすこし make のコマンドが変わるだけです.先程と同様に src/wordbuf.c の修正は必要です.
$ wget http://cmigemo.googlecode.com/files/cmigemo-default-src-20110227.zip $ unzip cmigemo-default-src-20110227.zip $ cd cmigemo-default-src $ edit src/wordbuf.c $ ./configure $ make cyg $ make cyg-dict; cd dict; make utf-8; cd .. # 辞書のビルド # make cyg-install
これで /usr/local/bin に cmigemo と cygmigemo1.dll,/usr/local/share/migemo に辞書,/usr/local/lib に libmigemo.dll.a がインストールされます.
次に PyMigemo をビルドします.先程とライブラリの名前が違うので,そのままではビルドできません.
$ wget http://www.atzm.org/etc/files/pymigemo/pymigemo-0.3.tar.gz $ tar xvf pymigemo-0.3.tar.gz $ cd pymigemo-0.3 $ python setup build running build running build_ext building 'migemo' extension (中略) gcc -shared -Wl,--enable-auto-image-base build/temp.cygwin-1.7.11-i686-2.6/pymigemo.o -L/usr/lib/python2.6/config -lmigemo -lpython2.6 -o build/lib.cygwin-1.7.11-i686-2.6/migemo.dll /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: cannot find -lmigemo collect2: ld returned 1 exit status error: command 'gcc' failed with exit status 1
setup.py を修正すればいいのかもしれませんが,わからなかったので手動で libmigemo.dll.a とリンクしてコンパイルします.
$ gcc -shared -Wl,--enable-auto-image-base build/temp.cygwin-1.7.11-i686-2.6/pymigemo.o \ -L/usr/lib/python2.6/config -L/usr/local/lib -lmigemo.dll -lpython2.6 \ -o build/lib.cygwin-1.7.11-i686-2.6/migemo.dll # python setup install
これでビルド完了です.
percol は先程と全く同じ工程で出来ますので省きます.
使ってみる
実際にしぼり込んでみます.
$ ls | percol --match-method migemo
前のエントリで作成した search-document-by-percol はドキュメントを絞り込みますが,これもばっちり日本語のパスが含まれていても絞り込んでくれるようになりました.1000以上の候補があってもサクサク絞り込んでくれますし,migemo かつ AND 検索できるようなドキュメント検索ツールは今までにないものだと思います.
zsh の履歴検索もできるかと思ったのですが,日本語を使ったコマンドが .zsh_history に正しく保存されず文字化けっぽくなってしまいます.どなたか解決策をご存知の方に教えていただきたい!
おわりに
この機能が実装されて本当に便利すぎて滂沱の涙が出てきました.mooz さん本当にありがとうございます.もう拝まずにいられません.ぜひぜひこのエントリを見た人も使ってみてください.
anything 的な絞りこみコマンド percol の紹介
いつも KeySnail でお世話になっている id:mooz さんが,percol という超絶便利コマンドを作ってらっしゃいます.このコマンドはとてもライフチェンジングなコマンドなのですが,あまり Web 上に情報がないので紹介がてら布教してみようと思います.
percol のインストール&使い方
percol は入力の1行を1候補として,部分一致かつ AND 検索で絞り込みし,選択した候補を出力するコマンドです.端的に言えば Emacs の anything.el のコマンド版です.
インストール方法や基本的な使い方は github リポジトリの README に全部書いてありますが備忘録として書いておきます.
$ git clone git://github.com/mooz/percol.git $ cd percol # python setup.py install
これでインストールは完了です.インストール場所を変えたければ,setup.py に --prefix オプションをつけます.
percol を動かす前に,percol の設定ファイルが必要です.とりあえず README からそのままコピーしてきた以下の内容のファイルを,${HOME}/.percol.d/rc.py に保存します.
# X / _ / X percol.view.PROMPT = ur"<bold><yellow>X / _ / X</yellow></bold> %q" # Emacs like percol.import_keymap({ "C-h" : lambda percol: percol.command.delete_backward_char(), "C-d" : lambda percol: percol.command.delete_forward_char(), "C-k" : lambda percol: percol.command.kill_end_of_line(), "C-y" : lambda percol: percol.command.yank(), "C-a" : lambda percol: percol.command.beginning_of_line(), "C-e" : lambda percol: percol.command.end_of_line(), "C-b" : lambda percol: percol.command.backward_char(), "C-f" : lambda percol: percol.command.forward_char(), "C-n" : lambda percol: percol.command.select_next(), "C-p" : lambda percol: percol.command.select_previous(), "C-v" : lambda percol: percol.command.select_next_page(), "M-v" : lambda percol: percol.command.select_previous_page(), "M-<" : lambda percol: percol.command.select_top(), "M->" : lambda percol: percol.command.select_bottom(), "C-m" : lambda percol: percol.finish(), "C-j" : lambda percol: percol.finish(), "C-g" : lambda percol: percol.cancel(), })
このファイルでキーバインドやプロンプトを変えることができるようなので,好みに合わせて変えてみてください.
percol の簡単な使い方は,行で分割されている出力をパイプで percol に入力します.例えば
$ ls / | percol
とすると
このようにルートにあるファイルが候補になります.文字を入力して絞り込んだり,C-n, C-p で移動して1つの候補を選びます.最後に決定 (Enter, C-m, C-j) を押すとその候補を標準出力します.
関数を作る
percol は絞り込みするためのコマンドなので,あらかじめある目的の候補群から絞込みをする関数を作っておくと便利です.典型的な例が README にも書いてある,シェルの履歴を percolで絞込みする関数です.
まずこの関数を .zshrc に書いておきます.
function percol_select_history() { local tac_cmd which gtac &> /dev/null && tac_cmd=gtac || tac_cmd=tac BUFFER=$($tac_cmd ~/.zsh_history | sed 's/^: [0-9]*:[0-9]*;//' \ | percol --match-method regex --query "$LBUFFER") CURSOR=$#BUFFER # move cursor zle -R -c # refresh } zle -N percol_select_history bindkey '^R' percol_select_history
コマンドラインで C-r を押すと
このような画面になり,正規表現部分一致かつ AND 検索で過去のコマンド履歴を絞り込めます.Enter を押すと現在選択中の行のコマンドがコマンドラインに挿入され,そのまま実行するなり,一部改変して実行するなりできます.この関数が便利すぎて非常に泣けてきます.
他にもいくつか関数を自作してみましたので紹介します.
私はドキュメントファイルは特定のディレクトリにおいてあることがほとんどなので,ディレクトリ中のドキュメントファイルを絞り込んで開く関数を作っています.
function search-document-by-percol(){ DOCUMENT_DIR="\ /path/to/doc/directory1 /path/to/doc/directory2" SELECTED_FILE=$(echo $DOCUMENT_DIR | xargs find | \ grep -E "\.(pdf|txt|odp|odt|ods)$" | percol --match-method regex) if [ $? -eq 0 ]; then gnome-open $SELECTED_FILE fi } alias sd='search-document-by-percol'
これを .zshrc に書いておきます.この関数を呼び出せば,ドキュメントファイルが列挙され絞り込むことができます.gnome-open はファイルの拡張子に対応するプログラムを起動するコマンドなので,OS に応じて open なり,cygstart なりに変えてください.この関数のお陰で(ファイル名やキーワードを覚えてさえいれば)どのファイルにも5秒程度でアクセスできるようになりました.
次の関数はカレントディレクトリのファイルを絞り込んでプロンプトに挿入します.
function insert-file-by-percol(){ LBUFFER=$LBUFFER$(ls -A | percol --match-method regex | tr '\n' ' ' | \ sed 's/[[:space:]]*$//') # delete trailing space zle -R -c } zle -N insert-file-by-percol bindkey '^[c' insert-file-by-percol
これを .zshrc に書いておくと,M-c で絞込みを開始します.カレントディレクトリのファイルの補完は当然 zsh の TAB でできます.しかし file001〜file100 のように同じ接頭語のファイルが複数あるディレクトリでファイルを補完する場合には,この関数のほうが有利かもしれません.マークすることにより同時に複数ファイルを挿入できます.
まとめ
anything 的な絞りこみコマンド percol の紹介をしました.最近 Emacs でも anything 脳が着々と進み,そろそろ OS レベルで anything 的なインターフェースを用意してくれないかなー,と思っていた矢先 percol を見つけたので大変重宝しています.
percol の以前にも同じようなコマンドとして zaw や canything が開発されていました.が,前者は zsh 依存ですし,後者は正規表現や日本語が扱えず少々機能不足です.その点 percol のいいところは
- python さえあればどこでも動きます.私は基本的には Ubuntu で使っていますが,Cygwin on Winodws7 でも普通に動きます.すばらしい.
- アクションで拡張可能.絞込み中に TAB を押すとアクションが選択できます.デフォルトでは,標準出力する,というアクションしかありませんが,python スクリプトを自分で書けばいくらでもアクションを定義できるようです.ユーザの発想次第でいくらでも便利に拡張できると思います.
あたりがあげられるかと思います.
逆に悪い点というか,個人的な要望としては以下の様な点があります.
- percol が起動するのに少々時間がかかります.Ubuntu ではほぼ気になりませんが,Cygwin だと0.5秒ほどかかります.許容範囲内ではありますが.
- 一旦マークした後に絞り込み条件を変更するとマークが解除されてしまいます.絞り込みを渡り歩きながら複数候補をマークすることができないので,若干不便です.
日本語入力はできますが,個人的には migemo れると最高.正規表現との混在はめんどくさいと思うので,--match-method migemo とかあると感涙に咽びなきます.ばっちり対応して頂きました.anything 的絞りこみコマンド percol が migemo 対応しましたも御覧ください.
もし percol に興味を持った方は,github の README をとりあえず真似してみて,履歴検索の威力をためしてみるといいと思います.
最後に mooz さん,とってもすばらしいコマンドを開発していただきありがとうざいます.
Emacs は外部 elisp がなくても強い (Emacs Advent Calendar jp: 2011 5日目)
ブログを引っ越ししましたので,5秒後に移動します
org-mode のファイルをはてな記法に変換する org-export-hatena.el を作成
前々から org-modeからはてなダイアリーに投稿するelispを書いた - うどん駆動開発 を 参考にして,org-mode をはてな記法に変換する関数を init.el に書いていたが, 単独の elisp にしてみた.
使い方
hogehuga
注文していたサーバー PRIMEGRY TX100 S1 が届いた
低価格静音サーバー PRIMEGRY TX100 S1
前々から自宅サーバを作りたかったのだが,注文していた FUJITSU のPRIMEGRY TX100 S1(以下TX100)が届いた.TX100 は富士通の静音省電力タワー型のサーバー.最新のパソコンと比べるとスペックは高くないが,そんなに負荷の高い処理をさせるつもりはないので,安いの重視で選んでみた.主なスペックは以下のとおり.
詳細は カタログ をみるといいでしょう.
届いた TX100 がこちら.
思ったよりも箱がでかい.中身を取り出してみるとこちら.
サーバー自体は,タワー型とはいえ,ミドルサイズなのでそこまで邪魔にはならなさそう.キーボード,マウスも付いている.なんと,保証書などを入れておくクリアファイルまで付いている行き届きよう.国産っぽいですね.
RAID1構成にするつもりなので,2TBのハードディスクを2つ買っておいた.Western Digital の WD20EARX です.大容量と安さだけで選びました.
サーバーの右側には取っ手がついており,ここを外して中身をいじります.
蓋を開けると,パーツがネジ1つのみで固定されていて,ネジは工具なしで手で外すことができます.ネジを外して中を見てみると,配線の取り回しなどはかなり考えられており,工具いらずでハードディスクの入れ替えなどができます.
WD のハードディスク2つをセットして,電源をつけると無事立ち上がり BIOS が起動しました.
静音というだけあって,動作音は全然しない.扇風機(弱)のほうがよっぽどうるさいです.省電力も期待したいところですが,ワットメーターとかがないので確認しようがない.
結局購入したのは
- サーバー: 12,800円
- ハードディスク: 5,580円×2
で,総額23,960円という格安でサーバーが用意できてしまいました.あとはOS のインストールをするだけです.Debian squeeze を使う予定.頑張ってサーバーの構築をしていきたいと思います.