Hatena::ブログ(Diary)

mooz deceives you

(about 'mooz) ; => "See http://mooz.github.com/index-ja.html"

 

December 30 (Fri), 2011

2011 12/30

およそ一年前,元旦から 2011 01/01 - mooz deceives you という記事を書き,昨年の出来事と本年の抱負について語った.そこでは主に「学術的な方面でのインプットとアウトプットを行なう」「自分に対する投資を惜しまないこと」「本を読むこと」「静的型付け言語である程度大きな物を書く」「型推論の勉強と補完フロントエンドの作成」ということをあげたようだ.果たしてそれらは実行に移せていただろうか.

この m10n では本年を振り返る体で,最近の脳内状況を吐き出していきたい(だらだらと書いたところ,予想以上に長くなってしまった).

作成したもの

年月を顧みる上で外せないのは自身の書いたコードだろう.ここではそのマイルストーンの中から,何からの形式でウェブへ公開したものをとりあげ,想い出などを綴ってみることにする.

percol

mooz/percol ? GitHub

canythin や zaw.zsh などに刺激を受け,今年の 2 月頃より作り始めたツール.この percol については記事を書くつもりでいたが,もう少し完成度を高めてからにしようと考えていたところ,結局ずるずると一年近くが過ぎてしまった.

そもそも percol とは何か.コマンドライン版 anything.el / unite.vim といえばキャッチーでわかりやすいだろうか.私は「UNIX のパイプに新風を」と喧伝しているが,実際のところは

  1. 入力を行単位で分割し
  2. インタラクティブに正規表現マッチングをかけて絞り込みを行ない
  3. 選択した行を標準出力へ吐き出す

というシンプルなツールだ.percol には勢い余って「アクション」や「マーク」の機能も設けてみたが,これはあまりコマンドラインと相性が良くなかった.何かうまいインタフェースや利用例を皆様にお教え頂きたいところだ.

開発を始めたきっかけを思い出してみる.先に述べたように,canything, zaw.zsh という先行のソフトウェアがあった(dmenu やその派生ソフトウェアまで含めると数知れない).ではなぜ,再び同じようなものを作ろうと思い立ったか.まず canything (C による実装) は日本語の入力に対応していないように見え,バッファのサイズが定数で固定されていた.また zaw.zsh (zsh スクリプトによる実装) は実装言語の特性を生かした zsh との密な連携が素晴らしいのだが,実装言語の特性により大量のデータを流し込んだ際の速度に不満がある.こうした理由から,そこそこ高速で日本語入力にも対応し,なおかつカスタマイズの楽しさを持ったもとを作ろう,と考えて Python による実装を開始した.curses を触ってみたい,という不純な気持ちも多少あったように記憶している.

開発の過程では様々なことを学んだ.Python のつまらなさ(基本的に Python は面白くない言語であると感じた)と幾分かの面白さ(果たしてそれは言語としての面白さだったろうか? 今となっては分からない),tty や curses に関する知識,コードを設計するに際して用いた MVC モデル,など.独自のマークアップ言語を作ったり,日本語の入力へ対応したりと,様々な試みを行なう日々は刺激に満ちていた.あれは間違いなく coding youth であったと思う.願わくばいつまでもその youth の中にありたいものだ.

shadow.el

mooz/shadow.el ? GitHub

shadow.el に関しては以前に次のような記事を書いた.便利であるとは思うが .shd ファイルを用意するのをついつい忘れ,ほとんど利用はできていないのが実状だ.

Shadow.el - Emacs に Shadow.vim を - mooz deceives you

私にとって Emacs Lisp はたまに触るから良いのだと思う.そのようなわけで,この shadow.el から今日に至るまで,Emacs Lisp とはやや距離を置いてきた.そろそろ何かをはじめる時期なのかも知れないし,まだその時期ではないのかも知れない.

Rios::Proxy

mooz/rios ? GitHub

Ruby 会議の LT に申し込んでみたらどうか? というお誘いを頂き,無い知恵を絞って開発を行なったのがこの Rios::Proxy だ.これについては Ruby 会議で実際に発表を行わせていただき,それに関する記事も書いた.

Rios::Proxy について #rubykaigi 2011 で発表しました - mooz deceives you

Ruby 会議での LT 発表は,様々な点で想像を上回っていた.あれほど大人数の前で発表を行なう機会など,そうそうないことだろう(中学の時分に行なった合唱コンクール以来の体験だった).旧知の人々を含め様々な人と交流するきっかけともなった.

Rios::Proxy からも様々なことを学んだ.C による Ruby の拡張ライブラリを含んだ gem の作成方法や pty の利用方法など.しかしながら,それ以上に大きな収穫が,この開発には隠れていた.それは『デーモン君のソース探検』との出会いだ.

そもそも pty の使い方を探ろうと考え,以前から読もうと考えていた『デーモン君のソース探検』を購入したのだが,これが名著だった.全く素晴らしい本だと思う.著者の氷山素子さんという方は謎の人物で,検索しても素性に繋がる情報が出てこない.ニコラ・ブルバキのごとく,ハッカーらによる筆名なのではないかと邪推しているが,実際のところは分からない.これを読んでおられる方でご存知の方はいらっしゃらないものだろうか.

org.js

org.js

org-mode の記法でメモを取るようになってからしばらくたつと,そのレンダリングをブラウザ上でやりたいと思うようになった.いちいち Emacs を使って変換を行なうことが,馬鹿馬鹿しく思えてきたのだ.それはちょうどスマートフォンを買った頃でもあり,Dropbox 上に置いた org-mode のファイルを綺麗に整形してスマートフォンで読みたいという欲求も出てきた.Android ということで素直に行けば Java で実装することになるところだが,応用範囲を考えると JavaScript による実装の方がよかろうと思い,結局は実装言語として JavaScript を選んだ.

はじめ JavaScript 用のパーサジェネレータを使う練習にでもと思い org-mode 記法の文法を探したが,どうも求めるものは見つからない.その実状は Emacs Lisp で書かれた一万行以上のコードが唯一の正典であるという由々しきものだった.Ruby や Python で書かれたパーサも存在したが,期待するほど出来が良くない.そうして色々と調べた末に,手書きでトップダウンパーサを作成する決断をした.

あの選択は誤りであったと今になって思う.世にはびこる部品の欠けた org-mode パーサを一つ増やしてしまう前に,org-mode 記法の文法を作成すべきではなかったろうかと.文法の作成などより,実装の方が何十倍も楽しいことだろう.しかし,いつまでも楽しさだけを追い求めていて良いのだろうか?

以前,次のような文章を書いた.

そして何が残る? - mooz deceives you

己の楽しみのために,信頼性のない,利用者を混乱させるだけの選択肢を今までいくつ増やしてきたろうか.そう自問し,もはや興味を失ってメンテンナンスを行わなくなったコード片に思いをめぐらせる.

「頼むから,あのようなコードが利用されませんように」

そう願わざるを得ないという現実は,コードを書く人間としてあまりに悲しい.

今年出会った方々の中に,自身の作成したソフトウェアのメンテナンスに非常な責任感を持つ人が何人かいらっしゃる.幸いにもそうした方々と共にコードを書く機会に恵まれ,問題意識は高まる一方だ.狼少年にならないためにも,投げ出すコードの数は少なくしていきたい.

学術的なインプットとアウトプット

主にデータベースシステム,データストリーム処理,OS,ストレージ,ネットワークなどについて学んでいたように思う.その際 Evernote や Dropbox を使い,学んだことはできるだけ情報として残しておくように気を配った.個人的な話にはなるが,私は自分の脳というものをあまり信用していない.勝手に記憶が脳から抜け出していってしまっても,彼らを攻めることはできないと考えている.

アウトプットを,今この文章を書いている存在として目に見えるかたちで行えなかったのは,反省すべき点であったかもしれない.しかし適度な分離を行なう上では,ある程度,仕方のないことなのだろう.人に講釈を垂れたり,ペーパーを書いたり,勉強会へ参加する機会などには恵まれていた.これは昨年と比べ,大きな進歩であると思う.

アカデミアに対して思うことは多い.よく「象牙の塔」という言葉で表現されるその世界は,私に古代ギリシャのウロボロスを想起させる.己の尾を喰らう蛇.学会へ参加するたびに,そのような印象を抱く.多くの人々が感じる,アカデミアとエンジニアリングの間に感じる隔たり.その狭間を埋めようなどという,大それたことは考えていない.イソップの寓話に,鳥にも獣にもなれないコウモリの話があった.私は,このコウモリが嫌いではない.そういったスタンスで関わっていくことが,私にとって満足の行く結果に結びつくのだろうと考えている.

最近では,基盤システムの実装を全くの趣味として始めた.言語としては C++ を使っているので,昨年の目標であった「静的型付け言語である程度大きな物を書く」がようやく始まったかたちになる.とはいっても,まだ実装を始めたばかりで,コードも数千行程度.この目標は,来年に持ち越しだろう.とにかく,このおかげで最近は毎日がとても充実している.やっぱりコーディングって面白っ!

著作

幼少よりの夢として「著作を上梓する」というものがあったのだが,様々な方々のお力添えがあり,それが今年かなってしまった.あっけのないものだと思う.でも,とにかくかなってしまったのだ.これに関しては以下の記事で触れた.

Mozilla 勉強会で ECMAScript 6 の WeakMap について LT しました - mooz deceives you

「コツコツが勝つコツ」という,中学の時分に恩師に教えて頂いた安っぽいフレーズを,何度も思い浮かべたものだ.私はただ自分の楽しみのためにコードを書いてきたが,それがこうした結果に繋がった.本当に恵まれているものだと思う.となれば,今度はお返しだろう.持続可能な開発.これを念頭に置いて開発を行っていきたい.

sayusayu 2012/08/30 15:54 kainさんが報告されてますが、Firefox15にするとログインできません。
gpum以外のアドオンを無効にしましたがやはり駄目です。
以前のバージョンから上記の報告にもあるように既読にできなくなっていたのですが、そのまま使用していました。
もうアップデートはされないんでしょうか?
非常に便利なアドオンで重宝していたので、対応して頂けるとありがたいのですが…。

sayusayu 2012/08/30 15:56 違うところに書き込まれてしまったようです。
すいません。

November 22 (Tue), 2011

最終鬼畜キーボードブラウジングの資料

発表資料

Firefox Hacks Rebooted 発売記念 最終鬼畜キーボードブラウジング と題されたセミナーが,先日の OSC 2011 で行われました.私も末席を汚すかたちで発表者の一人に加えて頂きましたので,その際の資料を公開しておきます.

感想

プレゼンテーションは難しいですね.

keysnailと猫が好きkeysnailと猫が好き 2011/11/23 19:36 はじめまして。
Keysnailは自分のブラウジングに欠かせない機能でして、
大変助かり、重宝しております。

記事とは無関係なのですが、
Keysnailのコーディングについて質問させていただきます。

次のような場合に、prompt.readにて入力フォーム表示中に、
Ctrl+gを押下してしまうと、後処理を実行できないようなのですが、
このような場合の対応方法がありましたら、
是非、ご教授いただければとおもいます。

前処理
prompt.read
後処理

以上、大変お忙しことと存じますが、
何卒、よろしくお願いいたします。

moozmooz 2011/11/23 22:15 >keysnailと猫が好きさん

はじめまして.ご利用ありがとうございます.

Ctrl + g は入力をキャンセルするものですが prompt.read() 自体に入力のキャンセル後に必ず処理をする機能は備わっていません.

prompt.read() の発展版として prompt.reader() というものが存在するのですが,こちらには入力キャンセルの有無に関わらず後処理を実行する機能が備わっています.

使い方は以下の使用例を参考にしてみてください.

prompt.reader({
message: "input string: ",
callback: function (input) {
alert("inputed => " + input);
},
onFinish: function () {
alert("finished");
}
});

keysnailと猫が好きkeysnailと猫が好き 2011/11/24 17:29 moozさん

教えていただき、ありがとうございました!
おかげさまで、考えていた機能を実現することができました。
20行程度のコードですが、悩んでいた分、
機能が意図どおりに動作したときの嬉しさはひとしおでした!
自分でニヤついてるのがわかるほどです(笑)

今後もKeysnailの発展を願っております。
本当にありがとうございました!

mizizinemizizine 2014/06/27 12:23 こんにちは mooz さん! おせわになります。keysnail に強く興味をひかれている者です。
しかし、もはや keysnail は更新されないと思ったほうがいいでしょうか。できることなら Thunderbird の最新版に対応してくださると嬉しいです。(いまは percol にいっしょうけんめいなのかなぁ。
リソースは有限なのでしかたないけど、)でもいいソフトだと思うので、できれば更新されつづけていってほしいなぁ。
初対面なのに、いきなりクレクレくん的なご挨拶で失礼しちゃってますけど、おゆるしを。
それではまた。

moozmooz 2014/06/29 10:59 >mizizineさん

こんにちは。

KeySnail 自体は今後も開発していくつもりです。最新のFirefoxでも問題なく動作します。

ただし Thunderbird 版については私が Thunderbird を利用していないため、サポートをサボってしまっています。スミマセン。。

October 02 (Sun), 2011

Mozilla 勉強会で ECMAScript 6 の WeakMap について LT しました

2011/10/01 に開催された Mozilla 勉強会@東京 6th で WeakMap について LT を行わせて頂きました.発表資料,メタ的な説明,勉強会の感想,そして Firefox Hacks Rebooted の説明を記します.

発表資料

説明

ECMAScript 6*1 に導入される予定の機能に WeakMap というものがあります.これは平たく言うと「連想配列」で,ようやく ECMAScript にもまともな連想配列*2が導入されて喜びもひとしおな方も多いことでしょう.

その WeakMap ですが,以前 Proxy を先走って実装してくれた Mozilla が再び先走って実装を行なっています.結果として Firefox 6 からこの WeakMap は利用可能となりました.

今回は 5 分間の LT ということで仔細な話は無理と判断し,抑えておくべき WeakMap のポイントを中心に簡単な説明を行いました.ある程度は興味を持って頂けたようでなによりです.

勉強会

私用により勉強会は途中からの参加となってしまい,他の方々の発表を拝聴させて頂くことがほとんどできず,残念な思いをしました.今回は(今回も)濃い話が多かったようです.そうした話を聞くことが出来る機会は本当に限られていることでしょう.次の機会は絶対に逃すまいと考えているところです.

様々な人との出会いがあった一日でもありました.以前,全く別の機会でお話させて頂いた人との再会.以前,お世話になっていた人との再会.そして,ウェブ上でお世話になっている人との対面.勉強会の,大切な醍醐味の一つでしょうか.

Firefox Hacks Rebooted

スライドの冒頭で説明がある通り Firefox Hacks Rebooted がオライリー・ジャパンさんより出版されます.私も生意気ながら執筆に携わらせて頂きました.500 ページ超の,物質的にも内容的にも「ずっしり」とした一冊です.Mozilla 系の技術に関する余すところのない解説は当然ながら,昨今の目まぐるしく進化する Web 技術動向に関する包括的な説明など,Web に関わる人*3なら必携の,非常に充実した内容になったと自負しております.

発売まで,ひと月を切りました.この一冊が,書店にて皆様と出会うことを願って.

*1:または ES.next!

*2:ただちょっと癖がある

*3:つまり,この記事を見ている皆さんです!

September 11 (Sun), 2011

atool を使い dired のサポートする圧縮形式を増やす

atool を使い dired のサポートする圧縮形式を増やす設定を紹介する.

atool

atool <http://www.nongnu.org/atool/> というツールがある.

これは様々な圧縮形式・ツールに対するフロントエンドツールで,ファイルの拡張子から適切な圧縮形式を推測し,内部で適切なコマンドを呼び出してくれるという優れもの.

標準で搭載しているシステムは少ないが,たいていはソフトウェアリポジトリに入っている.例えば Ubuntu なら apt でインストールすることができる.

sudo apt-get install atool

使い方は簡単で,例えばファイル FILE を解凍する場合は次のようにすれば良い.

aunpack FILE

tar xvfgunzip など圧縮形式毎にコマンドを記憶する時代は終わった.こうして人間は退化していく.

dired の圧縮・解凍機能

dired というツールがある.

これは Emacs 上で動くファイラで,とりたてて「ここが優れている」という部分もないが,標準で付属してくるため未だ利用する者も多い.

さて,そんな dired にはファイルを圧縮・解凍するコマンドが存在する.デフォルトの状態ではファイルを選択した(ポイントを上に持ってきた)状態で Z キーを押すと,選択されたファイルが圧縮されている場合は解凍され,未圧縮の場合は gzip 形式で圧縮される*1

圧縮ファイルの場合は解凍され,未圧縮ファイルの場合は圧縮されると書いた.では「そのファイルが圧縮されているかどうか」という判断はどのようにして行なっているのだろうか.dired は拡張子による判断方式を採用しており,内部に「このパターンにマッチする場合は圧縮ファイルなので,このプログラムを使って解凍すること」というルールを保持している.

そのルールの中身を覗いてみよう.

(defvar dired-compress-file-suffixes
  '(("\\.gz\\'" "" "gunzip")
    ("\\.tgz\\'" ".tar" "gunzip")
    ("\\.Z\\'" "" "uncompress")
    ;; For .z, try gunzip.  It might be an old gzip file,
    ;; or it might be from compact? pack? (which?) but gunzip handles both.
    ("\\.z\\'" "" "gunzip")
    ("\\.dz\\'" "" "dictunzip")
    ("\\.tbz\\'" ".tar" "bunzip2")
    ("\\.bz2\\'" "" "bunzip2")
    ;; This item controls naming for compression.
    ("\\.tar\\'" ".tgz" nil))
; snip

見ると,非常に限られたルールしか用意されていないことが分かる.広く使われている zip に対するルールすら見当たらない.

しかしながら,そこは拡張性の高い Emacs.この dired-compress-file-suffixes へは後から自由にルールを追加することができる.必要なものがあれば,自分で追加すれば良い.

といっても ("\\.zip\\'" "" "unzip") という具合に適切なプログラムを拡張子毎に追加していくのはさすがに骨が折れる.今回は,ここで先ほどの atool を利用することにした.とりあえず様々な圧縮形式を登録しておき,適切なプログラムは全て atool に判断してもらおうというわけだ.

dired の圧縮・解凍機能で atool を使う

というわけで dired の圧縮・解凍機能で atool を使うような設定を行なった.コードを以下に示す.

(defvar my-dired-additional-compression-suffixes
  '(".7z" ".Z" ".a" ".ace" ".alz" ".arc" ".arj" ".bz" ".bz2" ".cab" ".cpio"
    ".deb" ".gz" ".jar" ".lha" ".lrz" ".lz" ".lzh" ".lzma" ".lzo" ".rar"
    ".rpm" ".rz" ".t7z" ".tZ" ".tar" ".tbz" ".tbz2" ".tgz" ".tlz" ".txz"
    ".tzo" ".war" ".xz" ".zip"))

(eval-after-load "dired-aux"
  '(progn
     (require 'cl)
     (loop for suffix in my-dired-additional-compression-suffixes
           do (add-to-list 'dired-compress-file-suffixes
                           `(,(concat "\\" suffix "\\'") "" "aunpack")))))

この設定により,大抵の圧縮ファイルは dired で Z キーを押せば解凍できるようになる.

atool がサポートする圧縮形式のリスト *2 は man ページに記載されているため,以下のようなスクリプトを使って抽出した.

#!/usr/bin/env ruby
# Usage: man atool |& ./extract.rb

manpage = $stdin.read
manpage.sub!(/.*^ARCHIVE TYPES/, "")
manpage.sub!(/^CONFIGURATION.*/, "")

exts = manpage.
  scan(/\((\.(?:\.|[a-z0-9A-Z])+)(?:[ ,]+(\.(?:\.|[a-z0-9A-Z])+)\))*/).
  flatten.
  reject { |elem| elem.nil? }.
  map { |ext| ext.split(".")[-1] }.
  uniq

puts exts.join("\n")

まとめ

atool を使い dired のサポートする圧縮形式を増やす設定を紹介した.この圧縮・解凍機能は最低限の実装という印象で,実際に使ってみると様々な改善点*3が見えてくる.それらに関しては,気が向いたときにでも改善を図っていきたい.

*1dired-do-compress という関数が呼ばれている

*2my-dired-additional-compression-suffixes

*3:そのファイルが圧縮されるのか解凍されるのかが分からない.圧縮・解凍が同期的に行われブロックする.など.

sr10sr10 2011/10/03 04:05 unpってのもありますん。
でもatoolの方が高機能臭い。

moozmooz 2011/10/04 11:40 >sr10さん

おお,unp なんてものもあるのですね.そちらは unpack 専用と.

August 20 (Sat), 2011

汗臭い言葉

人の言葉には臭いがあると思う.

経験に基づく知識を語るとき,その言葉は自然と汗臭いものとなる.その人の恨み,苦労,達成感などが一緒くたになり,頭の中で「はやく俺を出してくれ!」と暴れ回っているような,そんな知識だ.臭わないわけがない.

一方で,ある種の言葉には全く臭いが感じられないこともある.書物,ウェブ,他人の言葉などからやってきて,ある程度かたちを変えて頭の中に収まったものだ.彼らは清潔で行儀良く,とてもおとなしくしている.そしてあまりおとなしいがあまりに,人は彼らの存在を忘れてしまうことも多い.

僕の発する言葉は,たいていが後者に属するものだ.

人と話していて「物知りですね」と言われることがある.幼い頃は喜んでもいたが,最近ではこの言葉も素直には受け取れなくなってきた.この自覚があるためだ.

僕はもっと汗臭い知識を語りたいと思う.