Gadgets
2009-07-11
2009-07-01
■[SKK] PySocialSKKServ を試してみました
引き続き Social IME がらみの話題です。
Social IME を skk サーバに見立てるものとしては
- Ruby による実装 by id:shunirr さん
- Python による実装 by kobun さん
- Perl による実装 by id:antipop さん
があるようです(他にもあるかも)。
なにか面白い発見があるかもと思い、server completion に対応しているという PySocialSKKServ を試してみました。
Debian で動かすので http://sourceforge.jp/projects/pysocialskkserv/releases?package_id=9074 から最新版の 0.5 をダウンロードします。
む、ファイル名が pysosicalskkserv.zip になってますね。
適当にディレクトリを掘ってその下で展開(でないとカレントにファイルがばらまかれちゃうので)。
まずはいきなり起動してみます。
% ./pysocialskkserv.py
./pysocialskkserv.py
Traceback (most recent call last):
File "./pysocialskkserv.py", line 660, in <module>
main()
File "./pysocialskkserv.py", line 630, in main
(options, args) = parseoptions()
File "./pysocialskkserv.py", line 98, in parseoptions
d = conf.getint('server', 'port')
File "/usr/lib/python2.5/ConfigParser.py", line 321, in getint
return self._get(section, int, option)
File "/usr/lib/python2.5/ConfigParser.py", line 318, in _get
return conv(self.get(section, option))
File "/usr/lib/python2.5/ConfigParser.py", line 511, in get
raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'server'
Config がおかしいと言われます。シュア。なにも作っていませんからね。お試しなので起動オプションで指定するとしましょう。-h をつけてオプション一覧を見ます。ショウミーオプションヘルプミー。
% ./pysocialskkserv.py -h ./pysocialskkserv.py Traceback (most recent call last): (略) ConfigParser.NoSectionError: No section: 'server'
うーん。設定ファイルは pysocialskkserv.cfg という名前のようなので作ってみます。何書けばいいのか判らないので中身は空で。だってヘルプ見たいだけですし。ヘルプミーアゲイン。
% touch pysocialskkserv.cfg % ./pysocialskkserv.py -h ./pysocialskkserv.py Traceback (most recent call last): (略) ConfigParser.NoSectionError: No section: 'server'
…頑固です。ここは素直に設定ファイルを書くことにしましょう。
(愚直にトライ&エラーでやったので全略)
どうやらこのような設定ファイルでよいようです。
[server] port=1183 debug=false pidfile=/home/hoge/var/run/pysocialskkserv.pid daemon=true [log] filelog=true syslog=false
% ./pysocialskkserv.py -h
./pysocialskkserv.py
Usage: pysocialskkserv.py [options]
Options:
-h, --help show this help message and exit
-p PORT, --port=PORT サーバー待ち受けポート番号
-d, --debug エラーログへデバッグ情報を記録する
-f, --filelog ファイルへログを記録する
-r RUN, --pidfile=RUN
プロセス番号保存ファイル
-s, --syslog syslogへログを記録する
ようやくヘルプが見れたやったー…ってなんか本末転倒のような気がしますが、とりあえず起動が出来るようになりました。
早速 Emacs 上の SKK から使ってみます。ノーマルな変換は問題なく動作しますが、目的の server completion がうまく補完してくれないようです。
以前やったように PySocialSKKServ さんと直接話をしてみましょう。
予測変換の候補を検索
% echo "4なすび~ "|nkf -e| netcat -q 2 skkserver 1183|nkf -w 1 茄子 茄子の 茄子と 茄子、 ナスビ 茄子を 茄子は 茄子が 茄子・ 茄子」 茄子( 茄子。 茄子アンダルシアの夏 茄子に 茄子アンダルシアの 茄子アンダルシア 茄子も 茄子とトマト 茄子の揚げ 茄子で 茄子さん 茄子や
ひらがなだけの予測変換候補を検索
% echo "4そし "|nkf -e| netcat -q 2 skkserver 1183|nkf -w 1 そして そしたら そしてその そしてこの そしてそれ そしてまた そしてお
む。これは。
普通に検索したときの返答
% echo "1なすび "|nkf -e| netcat -q 2 skkserver 1183|nkf -w 1/茄子/なすび/ナスビ/
server completion の場合は各候補が / でなく SPC 区切りで返ってきてしまっている、ということのようです。
まとめると、
- アーカイブのファイル名が typo ってます
- アーカイブはディレクトリごと固めてもらえると嬉しいな
- 設定ファイルが存在しなくてもヘルプは見れるほうが便利かと
- 設定ファイルのサンプルが同梱されているとありがたい
- 予測変換の場合の区切り文字が不正みたい
[追記: 2009-07-11]
「区切り文字はスペースで正解」というコメントを頂きました。感謝。
また、誤った指摘をしてしまい大変失礼致しました > kobun さん
さて、そうすると server completion がうまくいかなかった原因は別にある訳ですが、暇があるときに調べてみます。
といった感じでした。まる。
2009-05-07
■[Emacs][SKK] 予測する SKK
GW の習作として、Social IME の予測変換 API を利用した「予測する SKK」を作ってみました。
Social IME を skk サーバに見立てるものは既にあるようですが、それらとは違ったアプローチ。
- 直接 Social IME とお喋りする
- ターゲットはかなモードでの予測機能
で、使ってみた感想ですが、やっぱり反応がワンテンポ遅れますね。キャッシュをファイルに保存する機能もつけたので、一度索いたものはなんとかなるんですけど。
作ったばかりであまりテストできていませんが、暫く触ることが出来そうにないので取り敢えずここに転がしておきます。よろしければ遊んでみて下さい。
[追記: 2009-05-09]
バグ取りとかオプション追加とかでちょっとだけ変更しました。
※注: キャッシュファイルへの格納条件を(無条件に格納するように)変更しました。気になる方は申し訳ありませんが以前のキャッシュファイルを一旦削除下さい。
[追記: 2009-07-11]
また触れなくなるので、ちょっと機能追加した現状版をアップロードしておきます。
2008-09-28
■ [Emacs][Jinnavi] Jinnavi
コメントがうまく投稿できなかったのでこちらで。
Jinnavi (人狼BBS Navigator for Emacs)
もし実用的なら強力かも(笑)。ログ見る専用として、「仕事してると見せかけて人狼見てる」的な使い方もアリ?
http://dundubhi.blog118.fc2.com/blog-entry-117.html
あれは長いこと放置しちゃってて動かなくなってますね…。ごめんなさい。人狼から離れて久しいので、直す予定もいまのところなかったりします。久々にBBSを見に行ったら知らないキャラとか増えてるし…。
2008-01-02
■[Emacs][SKK] 縦型インライン表示の不具合
これがまた特定の場面で上手くいかないのさ.
主に以下のような場合.
ex ex ex[EOB][EOB]は, ファイルの終わり. End of buffer このとき,一番したのexの補完表示は上手くいくけど, その上や, その1つ上なんかは駄目なんだよね.
http://d.hatena.ne.jp/khiker/20080101
こちらを読んで不吉な予感がしたので SKK でも試してみる。あー、ホントだ、駄目じゃん。
viper を常用してると上記のような位置に EOB がくることは滅多にないので気付かなかった…などととりあえず言い訳しておいて。
えーと、これでいいんじゃなかろうか。
2007-10-25
■[Emacs][SKK] 複合語サーバが返した候補には色を付ける
先日の作業で skkserv2 と mecab-skkserv の検索結果にはアノテーションを付けて区別できるようにしてみたのだが、それだけでは自分には不足のようだ。
何度か SPC を押して候補一覧の状態になってしまえばアノテーションは候補の後ろに表示されるのですぐ気付くのだが、それ以前の段階だとアノテーションはエコーエリアに表示されるだけ*1なのでうっかり見逃してしまうことがあるようなのだ*2。
刺激が足りない。
そこで複合語アノテーションならば更に候補に色を付けてみることにした。`skk-treat-candidate-appearance-function' の雛形をちょっと変えただけだけど、この機能はこういう時に自由が効くのでとても重宝している。
(copy-face 'skk-henkan-face-default 'my-skk-compound-word-face) (set-face-background 'my-skk-compound-word-face "misty rose") (setq skk-treat-candidate-appearance-function (lambda (candidate listing-p) (let* ((value (skk-treat-strip-note-from-word candidate)) (cand (car value)) (note (cdr value)) (sep (if note (propertize (if (skk-annotation-display-p 'list) " ≒ " " !") 'face 'skk-tut-do-it-face) nil))) (cond (note (put-text-property 0 (length cand) 'face (if (string-match "<\\(?:skkserv2\\|MeCab\\)>\\'" note) 'my-skk-compound-word-face 'skk-henkan-face-default) cand) (put-text-property 0 (length note) 'face 'skk-tut-hint-face note) (cons cand (cons sep note))) (t (put-text-property 0 (length cand) 'face 'skk-henkan-face-default cand) cand)))))
さすがにここまでやっときゃ気付くだろう。
2007-10-21
■[Emacs][Viper] Viper patch 機能追加
久々に Viper の visual-mode patch に機能を追加してみた。
- `` block と tag block object を追加
- blockwise visual mode 対応
- text object に対して A, d, D, I, J, r, R, s, S, u, U, x, X, y, Y, O, ~ operater が使えるように
- visual mode から ex mode に移行した場合の prompt の default を "'<,'>" に変更
- text object の細かい bug を修正
- 行末での Word object の扱いに bug があったのを修正
- ("f-!-oo") のような所に cursor があった場合の ( ) block object の扱いがマズかったのを修正
- その他もろもろ
やっつけで作ったものも多いけど、これでだいたいの機能は揃ったのではなかろうか。gv とか作ってないけど使うのかなあ。自分が有効活用できてないので利点がなかなかピンとこない。
visual mode の後の repeat と block の yank は微妙なのでいずれなんとかしたいけど、スマートな解決方法を思い付かないので当面は放置かなあ。
2007-10-15
■ [Debian][Gnus] マルチパートのデフォルトの MIME type を変更する
Debian etch + Emacs snapshot + No Gnus でのお話。
最近 (といってもかなり昔に書いたメモだけど) Gnus でメールに hogehoge.diff なファイルをアタッチしても、そのパートが色付いて表示されないのが気になっていた。以前は diff-mode でハイライトされてカラフルで見易かったのに。特に設定を変えた覚えはないんだけど。Gnus の仕様が変わった? んなこたないよなあ…。
などと放置していたのだが、フと昔のメールを表示した際にちゃんと diff のパートがハイライトされていることに気付いた。あれ?
昔のメールと最近のものをよくよく見比べると、なるほど、前者は MIME type が text/x-patch となっているのに対して後者は text/x-diff になっている。ふーむ、どちらも特に自分で指定した覚えはなく単にデフォルトで提示されるタイプを使っているだけなのでそこいらが変わってるクサい。
ちょっと調べてみますか。ごそごそ。
Gnus はアタッチするファイルの拡張子を見て MIME type を決めるが、それは `mailcap-mime-extensions' で定義されている。mailcap.el を見るとちゃんと
(defvar mailcap-mime-extensions ... (".diff" . "text/x-patch") ...
となっていて Gnus では text/x-patch がデフォルトになっている。だが、C-h v で実際に値を見ると
... (".diff" . "text/x-diff") ... (".diff" . "text/x-patch") ...
とダブって登録されている。他の拡張子についてもいろいろ追加されているようだ。誰がやってんの?
mailcap.el 自身がやってました。というか `mailcap-mime-extensions' の docstring にちゃんと書いてあった。
It is merged with values from mailcap files by `mailcap-parse-mimetypes'.
mailcap-parse-mimetypes() は ~/.mime.types や /etc/mime.types などなどのファイルを調べて MIME type を追加してくれるらしい。Debian だと mime-support パッケージが入っていれば /etc/mime.types が存在する。覗いてみると
text/x-diff diff patch
確かにこういうエントリがあった。犯人はこいつか。
詳しく調べると mailcap.el と /etc/mime.types で86個の拡張子が重複しているようだ。そのうち MIME type が異なるものが35個。
単に重複してるものについては無駄だから消しちゃって、type が違うものについては mailcap.el のほうを採用しよう。えい。
(defadvice mailcap-parse-mimetypes (around delete-dup-entry activate) (let* ((parsed mailcap-mimetypes-parsed-p) (orig (or parsed mailcap-mime-extensions))) ad-do-it (unless parsed (setq mailcap-mime-extensions (let ((list mailcap-mime-extensions) entry ret add) (while (setq entry (car list)) (unless (assoc (car entry) (cdr list)) (add-to-list (if (member entry orig) 'ret 'add) entry)) (setq list (cdr list))) (nreverse (nconc add ret)))))))
こんなのを ~/.gnus.el に追加して無事 *.diff なファイルについてはデフォルトで text/x-patch を提示してくれるようになった。
これで自分が出すメールについては問題なくなったが、他からは text/x-diff で送られてくる可能性がある。そちらもちゃんと対処したいけど、それはまたいずれ。