MacBook に右コマンドキーがなくて不便すぎる。 しばらく耐えていたが、ついにキレて解決策を探す。
とりあえず、モディファイアをいじるには kext を使わなくてはいけないらしいことがわかった。
どうも、目的のものはありそうにないなあ。 そもそも日本語キーボードでないとカナキーがないので、 その時点でかなり数が減ってしまう。しょうがないので、 一番ソースコードが新しくていじりやすそうだった KeyRemap4MacBook をさくっとパチッて、 かな/カナキーと英数キーを Command に変えた。
いま使ってるんだけど、動いているような気がするな。
それにしても、カーネルモードのコードをいじるのは 恐ろしいものだ。
(00:55)
論文も終わったので心穏やかにるびま本の原稿を進める。 実に気楽だ。
書籍化するにあたり、 添削ポイントに全体を通した 通し番号を付けることにした。例えば 「[style01] コーディングスタイルはライブラリ全体で統一する」 と付くわけだ。 また巻末付録のポイント一覧には逆に そのポイントが参照されているページが書いてあり、 相互にたどることができる。
で、それの処理をする。 Ruby だとこういう処理が本当に書きやすい。
次に図を書く。
これまでは Linux で X で tgif だったわけだが、 なんかいろいろと嫌になってきたので、 Mac で何か探すことにする。
OmniGraffle というのと LineForm というのが 比較的安くてよさそうだ。 しかし LineForm は機能的に 「絵」を描くほうが得意そうな感じがする。 俺が書きたいのは とにかく箱と線がつながってる図なので、 OmniGraffle を買うことにする。 ダウンロード版 OmniGraffle standard で 9800 円。 安くていいですな。
最初に起動したとき「ライセンスがありません」 とか言われて何だそりゃと思ったけど、 実は買ったときのメールにライセンスキーが書いてあった。 そういうことはちゃんと README に書いとけ。
(19:07)
だーから Amazon は、
Amazon.co.jpで、 以前に青木 峰郎の著書をチェックされたお客様に、 このご案内をお送りしています。 『Rubyレシピブック 第2版 268の技』、好評発売中です。 ご注文は以下をクリック。
って俺に送ってくんなー!
(16:06)
すっかり Mac に移行する気になったので、 メール環境も Mac に移行することにした。 かといって Mac だけでしか見られないのも不便なので、 IMAP を使うことに。
サーバは何使ったらいいのか迷ったけど、 特別な機能が欲しいわけでもないので、 無難に courier-imap を使うことにする。 設定も (ログインパスワードを忘れていたことを除けば) 何事もなく済んでしまった。
ところが IMAP サーバ側にメールボックスを作るところでちょっ とつまづく。 何度やっても "invalid mailbox name" とかなんとか言われて作 れない。 どうも、新しいメールボックスを作るときに Mail.app で「受信 箱」を 選択しておかなければいけなかったようだ。
この問題に気付いてからは順調に進んだ。 まず ML ごとにメールボックスを作って振り分けルールを設定す る。 それから Trash と Draft と Sent を作って、 「メールボックス」>「このメールボックスの用途」 でゴミ箱と草稿と送信済みを割り当てる。
次にちょっと悩んだ点が既存メールの移行だ。 これまでは Mew なのでメールボックスが Mh だが、 インポートできるリストはアプリケーション名が並んでいる だけで、mbox とか Mh とかのジェネリックな名前がない。
しかし、どうも「その他」が mbox のことらしいので、 これを利用することに決める。 まず TMail を使ってこんなスクリプトを書き、 Mh から mbox へ変換する。
require 'tmail' mh = TMail::MhMailbox.new(ARGV[0]) mbox = TMail::UNIXMbox.new(ARGV[1]) mh.each_port do |port| port.copy_to mbox.new_port end
と、書いてから思ったけど、 TMail::Mailbox#copy があれば ワンライナーで書けるな。 追加しておこう。
で、mbox に変換できたらそれを Mail.app に読み込む。 最初 mbox ファイルを見付けてくれなくて苦しんだが、 ~/Mail とかのありがちなところに置いとかないとダメみたい。
読み込みが終わると (けっこう時間がかかる)、 「読み込み」というメールボックスの下に 読んだやつが出てくるので、それをごっそりと IMAP のメールボックスに移動して終わり。
さいしょ、個人宛のメールがかたっぱしから SPAM に分類されてちょっとゲンナリしたが、 すべて選択してまとめて「SPAMじゃない」 チェックができたので特に実害はなかった。 そのうち学習してくれることを期待しよう。
(22:07)
なんだかんだでわりと快適な Mac 生活が送れるようになってきた。 残る懸念は端末のバックスペース問題である。
ssh で Linux マシンにログインすると バックスペースが効かなくなる。 これが重症で、stty では直らない。 bash だと大丈夫で zsh がダメというのが 嫌すぎる。
これを回避しようとすると、 Terminal.app の 「delete キーで backspace を送信」 を使わなければならない。 しかし、これをオンにすると今度は ssh 先の less とか vi でバックスペースが 使えなくなるという悲惨な事態が待っている。 ムゴい。
(23:02)
■
Takayama Fumihiko [はじめまして。
Emacs な人が Mail.app に移行しようと思うと
エディタがネックになっていたと思うのですが、
そこら辺はいかがなさったのでしょうか?]
■ zunda [バックスペースはCtrl+Hでどうでそ?(また二本指か]
■
青木 [わたしはあんまり Emacs を深く使うわけじゃないので、
カーソル移動のキーバインドがだいたい使えれば満足なんですよ。
Mail.app は Ctrl-b, f, p, n, と Ctrl-k, o くらいは使えるので、
ほとんど違和感なく使えています。]
■
青木 [いや、Ctrl-h でもダメなところが今回の悲惨なとこでして。
zsh か、vi/less か、どっちかが必ず犠牲になる構造になってるんです。
具体的にどういう理由でそうなるのかはもうちょい調べてみないとなんとも。]
■
Takayama Fumihiko [なるほど、納得です。ありがとうございました。
ちなみに backspace は screen を挟むと問題なく扱えるので、
そこら辺から原因をさぐると良いかもしれませんね。]
■
青木 [なるほど。screen を使えば通るんですか。
とりあえずそれで試してみます。]
あ、そういえば、結局 Ruby 会議のプレゼンは出さなかった。 ちょっと、今年はちゃんと出られるのかどうかわかんないので。 まあ、出すとすればリファレンスマニュアルなんだけども、 リファレンスマニュアルは 8 月が目標だからなあ。 きっと来年くらいのほうが、 いろいろ成果が出ていて (あるいは出ていなくて) おもしろいさ (と自分で納得する)。
(02:07)
で、そのリファレンスマニュアル刷新計画だけど、 9 日あたりから第三段階を開始する予定。 こんどは第二段階よりもさらに手間がかかるので、 あらためて ruby-list と日本 Ruby の会 ML で 人材を追加募集する予定。
メールの移行がだいたい完了。 とちゅう、大量に (1 万通くらい) メールを読み込んで 移動しまくってたらすげー重くなったので、 いったん Mail.app を再起動した。
さて、ML のメールが 1 万通くらいたまったときに どうなるのか見ものだな。
(02:47)
簡単なレポートくらいなら TextEdit で書けるなあ。 ……と思って書いてたら文字数が数えられないことに気付く。 なんかないのか?
あった。
http://blogs.dion.ne.jp/fujidana/archives/517367.html
なるほどね、AppleScript というのを使うと 動いているプロセスにちょっかいを出せるんだ。 Mac における COM みたいなもんか。
しかしこの AppleScript って コードの字面が実にかったるいな。 Ruby で書けるとよいのだが。 なんか書けそうだな。 RubyCocoa という単語をなんとなく思い出すんだが、 もしかしてこういうことに使えるのだろうか。
使えそうな気がするな。 NSApplication のあたりが怪しい。 これで TextEdit を操作できるんじゃないだろか。
とりあえずインストールしとこ。 1.9 (YARV前) で動くかなあ。
だめだった。追究するのもめんどいので (というかレポート書かなきゃいかんので) あきらめてバイナリを使う。
rb-appscript というのを一緒に使うと いろいろ楽に書けるようだ。こうか。
~ % cat textedit-wc.rb require 'appscript' p Appscript.app('TextEdit').documents[1].characters.get.size ~ % ruby-1.8.2 textedit-wc.rb 80
動いた〜。
ていうか 80 字しか書いてないのに AppleScript 書き始めるのってどうよ。
ん? もしかしてこれって文字数じゃなくてバイト数かな。 いやそんなことはなかった、文字の配列だった。 それはそれでなんか気になるが、とりあえずはこれでいいや。
(05:38)
■
hisa [AppleScriptの代わりとしては、rb-appscriptとかぶってますが、RubyOSAというものもあります。実際どう違うのかよく知らないのですが、rubyosaの方は、将来のMac OS Xにのっかっる可能性も高そうだし友人が作ってるし、ということで推しておきます。
RubyCocoaに関しては、SIMBLプラグインとしてアプリにへばりつくという方法で使えるようになりつつあります(開発中)。
RubyOSA - http://rubyosa.rubyforge.org/
SIMBL - http://www.culater.net/software/SIMBL/SIMBL.php]
■
青木 [あ、そうか、RubyCocoa と rb-appscript は別ものなんですね。
このへんは何がなにやらわからないので、勉強してみます。]
ちょっと GUI なアプリケーションが 作りたくなったので RubyCocoa を 使ってみることにする。
まあ、とりあえず Hello, World。
require 'osx/cocoa' class HelloApp < OSX::NSObject def quit(notifier) exit end end app = OSX::NSApplication.sharedApplication app.setDelegate HelloApp.alloc.init win = OSX::NSWindow.alloc.initWithContentRect_styleMask_backing_defer([200.0, 300.0, 250.0, 60.0], 15, 2, 0) win.setTitle 'Hello RubyCocoa' win.setLevel(3) # floating window win.orderFrontRegardless button = OSX::NSButton.alloc.initWithFrame([10.0, 10.0, 210.0, 40.0]) win.contentView.addSubview button button.setBezelStyle 4 button.setTitle 'Hello, World!' button.setTarget app.delegate button.setAction 'quit:' button.setEnabled true app.run
NSWindow の initWith なんたらという メソッド名がやたら長い。 これはなんか理由を聞いたことあるなあ。 RHG 読書会で聞いたんだっけ。 キーワード引数名がエンコードされてるので ハッシュだと順番が変わってしまってだめ、 というやつだな。
(05:12)
■
hisa [長いメソッド名は、とても説明的なので意味をつかみやすいのがメリットだと思うのですが、引数のラベルと実引数をObjective-Cのように対で書けない場合には、むしろ読みにくくてデメリットになってしまいます。ということで、RubyCocoaではobjc_sendというメソッド (0.10.1以降)でそこのところをサポートしています。
http://www.fobj.com/hisa/d/20070209.html#p01]
■
青木 [お、その話も以前聞いたような気がします。
もう実装されてたんですね。ありがとうございます。
ついでに、alloc.objc_send(:initXXX, ...) が
new(...) にできたりはしませんか?]
■
青木 [ああそうか単純な変換じゃだめなんだ。
「With」がうまくないですね。
なんかいい方法ないのかなあ。]
■
青木 [全部 with だったら無条件で
with を付けてしまえばいいのかなあ……。]
メモリが足りないような気がする。
しばらくコード書いたり Xcode 動かしたり ダラダラ巡回したりしてから ふとダッシュボードを呼び出すと、 3, 4 秒すべてが停止している。 expose もカクカクする。
アクティビティモニターで見てみると、 Safari と iPhoto が 200MB ずつ使っていた。 それからダッシュボードが全部まとめて 100MB、 Emacs が 80MB、 Xcode と Mail がそれぞれ 50MB などなど。 これだけで 700MB 近い。 システム自体のメモリ使用量と VRAM 割り当て分と、 この他に Terminal.app とかいろいろで 完璧に埋まってるわけだ。うーむ。
じゃあメモリ増設するかって思うけど、 MacBook は 2GB が最大なんだよなあ。 しかもスロットが 2 本しかないので、 全部交換になる。 1GB 増やすためだけに 1GB 捨てるのはなんか惜しい。 それに、2GB に増えてもなあ。 1GB でもときどき動作が ひっかかるくらいだから、 めちゃくちゃ足りない というわけではないんだよなあ。 いっそ 4GB に増やせるならいいんだけど。
そういや MacBook Pro はどうなんだろう。 ……最大 3GB? なんだその微妙な最大容量は。 MacBook Pro だってデュアルチャネルなんだから、 2 の倍数にすりゃいいのに。 32 ビットモードで 4GB 付近になると 何か問題があるのだろうか。
やっぱソフトウェア的な問題があるらしい。
http://blog.japan.zdnet.com/apple/a/2006/10/core_2_duo_macbook_pro3gb.html
4GB 越えは 64 ビットを待てということかな。
(23:21)
MacBook に戻る。
Safari はタブを閉じたあとにメモリを戻さない、 という話があるけど、これは微妙だよなあ意味的に。 free (release) してもカーネルに メモリを返さないって意味なら、 そりゃありうるよな。 malloc の実装次第だ。 free してないって話なら酷すぎだが、 さすがにそれはないと思うので たぶん前者だろう。
まあとりあえずは Safari がデカくなってきたら いったん終了させる、でしのごうかな。 メモリをたくさん積める 64 ビット Mac が出たら買い換えよう。
(23:43)
今日は著者の久野先生に来ていただいて JavaScript 読書会。いや面白かった。 今日はクライアントスクリプティングとか DOM とかの話だったので俺は そのへんの知識を利用してこそこそ REPL ページを作っていた。 えらい苦労した。
飲み会方面では、(主に) 藤本さんに Mac OS X 方面のことを教えてもらった。 勉強になりました。 ずっと Mac 方面は見ないふりをしてきただけに、 なにもかも新鮮で楽しいな。
『Programming Dashboard』ていう本を買ったので 何かのウィジェットを作りたくなった (フツー逆だろ)。 とりあえず ReFe ウィジェットあたりが 手頃なのではなかろうか。
ダッシュボードウィジェットは HTML と JavaScript でできているので、 表示はそのへんでがんばればよいらしい。 あとは Ruby (ReFe) にアクセスする方法を 探せばよいわけだ。
最も簡単な手段を選ぶなら、widget.system で refe コマンドを呼ぶだけでよい。 しかしどうせなら dRuby で ReFe サーバに アクセスしてインクリメンタルなサーチを 実装してみたい気がする。 いやまあもちろん、 1 文字ごとに ReFe 呼んでもいいけど、 さすがに重そうだからなあ。
となるとウィジェットから Ruby を動かす必要がある。 Objective C のライブラリは プラグインできるみたいなので、 このへんの仕組みをどうにか利用すればよいわけだ。 組み込み Ruby API を使って mod_ruby みたいなものを作ればいけそうな気がする。 Windows で言えば ActiveScriptRuby だな。
それはそれとして、Ruby を動かさずに 済ます方法もあるような気がする。 dRuby プロトコルを Ruby を使わずに 実装すればよいのだ。 JavaScript オブジェクトを 直接 Marshal フォーマットでマーシャルすれば Ruby を使わずに dRuby にアクセスできるのでは ないだろうか。試してないけど。できるかなあ。 うーん? dRuby ってクライアントも オブジェクトをエクスポートしないといけないから、 そこが難しいかもしれないね。
net/http の拡張案、というか、 俺的にはほとんど導入確定の変更について。
[ruby-core:08383] の NTLM てのも できれば入れたいんだけど、 そのままでは使えないパッチなので ちょっとねえ。
(00:08)
だめだやはり酒飲むとだめだ。 dRuby 使う必要ないじゃん。 Ruby がインプロセスで動いてるんだったら、 その Ruby で直接データベースを叩けばいい。
(00:15)
http://numata.designed.jp/programming/cocoabrowser/index.html
Cocoa その他のリファレンスを コラム形式で検索できるツール。 かなり便利そう。 さっそくインストールした。
(00:45)
Mac OS X の Terminal.app から Linux へ ssh でログインしたときに backspace が効かないことがあるよ問題について。
前回 screen を使うとうまくいくというツッコミをもらったので試してみた。 すると vi は動いた。すばらすい。 しかし jless がどうしても backspace を deleteと認識してくれない。 もう、なんなんだよ jless……。 Linux を使いはじめたころにも同じ問題に遭遇したことがあるけど、 まだあのポリシーは変わっていなかったのか。
ものは試しで TERM=xterm にしてみると、 screen なしでも vi で backspace が動いた。 しかし jless がやっぱりダメ。
じゃあ Terminal.app の「delete キーでbackspace キーを送る」 をオフにして TERM=xterm ではどうなんだろう。 すると、vi と jless はいけるんだが、今度はzsh がダメ。 むき〜〜〜〜〜。
くくく、それじゃ 「delete キーで backspace キーを送る」オフ、 TERM=xtermにして screen 起動でどうだ。 よおおおおおしこれで全部通ったあああ!
まとめると、どうやら zsh, vim, jless のそれぞれにバラバラの条件があるらしい。
結論。まず jless をまともに動かすためには 「delete で backspace」を付けてはいけない。 しかしそれだと zsh と vim で困るので、 TERM=xterm にして、さらに screen を起動。 マジでうざい……。
(00:03)
.zshrc の先頭に以下のコードを入れて全自動になった。
if [ $TERM = xterm-color ] # remote login from Mac OS X then export TERM=xterm screen fi
当然ながら、家では Mac 以外に xterm-color を送ってくる端末がいないことが前提である。
(00:25)
http://phoenix.mo-blog.jp/cafegoraku/2006/01/post_edc3.html
わけあって池袋の歴史を調べてたら、 東京オリンピック当時の池袋東口の写真を載せてるブログが見付かった。 あまりに雰囲気が変わってなくてギョッとした。
(04:55)
net/http の NTLM パッチをくれた人からメールが来たので、 とりあえず返事書いた。要約すると、 「sspi.rb を自分でメンテしてくれるなら別にいいよ」 ってことで。
ところで、この日記で愚痴ってたのを 連絡してくれた人がいるそうで、助かりました。 どうも最近 ruby-core で英語メール書くのが きつくて…… (自分宛なら結局返事を書くんだけどさ)。
ruby-talk は流量多すぎてもはやついていけず。 いちおうスレッドの Subject だけは見てるけど、 全然関係ない Subject はさくっと無視します。
(21:09)
いいかげん動かないコンピュータくらいは捨てようと決意して パソコンリサイクルについて調べた。
回収はメーカーごとなのか。 DEC のパソコンは誰が回収してくれるんだろう。 合併されたら責任は合併した会社になるのかな。 ということで hp にメールを書いてみた。
メーカーが回収できない場合には パソコン 3R 推進センター http://www.pc3r.jp/home.html というところが回収してくれるらしいのだが、 サーバ・ワークステーションは対象外って書いてあるんだよな。 ワークステーションを捨てたくなったらどこに頼めばいいんだろう。
富士通の回収スキーム http://azby.fmworld.net/recycle/about_recycle.html によると、サーバ・ワークステーションは 「廃棄方法は市区町村にご相談ください」らしい。 つまり粗大ゴミってことかなあ。 まあ、それも聞いてみるか。
(21:29)
むっ!
http://www.city.inuyama.aichi.jp/kurasu/gomi/recycle/002.html
DEC・COMPAQ については hp に連絡しろって書いてあるな。 やっぱ買収・合併のときは買収したほうに責任が移るようだ。
サーバ・ワークステーションについてはこんな記述があった。
http://www.city.nanto.toyama.jp/webapps/www/service/detail.jsp?id=2289
> ただし、プリンターなどの周辺機器、ワープロ専用機、PDA、 > ワークステーション、サーバーなどは対象となっていません。 > (小型家電品として「燃えないごみ」の日に出せます。)
どうやらサーバ・ワークステーションには回収義務がないようである。 いえーい。
(21:40)
Mail.app の format=flowed による行折り返しをやめさせるべく、 もういっかい StopFold を試す。
えーと、Mail.app を終了して、 ~/Library/Mail/Bundles に StopFold.mailbundle をコピーして、
~/src/stopfold-0.3 % defaults write com.apple.mail EnableBundles YES ~/src/stopfold-0.3 % defaults write com.apple.mail BundleCompatibilityVersion 2
で、起動と。うあー、やっぱだめだ。 なんでだめなんだよう。
ざくざく検索してると、EnableBundles を書き込むときに
% defaults write com.apple.mail EnableBundles -bool True
としてる例もあった。 これも念のため試してみたが、やっぱダメ。 もしかしてこの値がちゃんと書き込まれてないのかなあと思ったけど、
~/src/stopfold-0.3 % defaults read com.apple.mail | grep -i bundle BundleCompatibilityVersion = 2; EnableBundles = 1;
と、いう出力を見る限り、ちゃんと書き込まれてるし。
API が変わったのかとも思ったんだけど、 class-dump で見る限り、 StopFold が置き換えてるあたり (NSAttributedString) は何も変わってないんだよな。 なんなんだろういったい。
そもそも、コンソールを眺めていると、 StopFold がロードされたっていうメッセージが出てない。 どうやらロードすらされてないらしい。ということは、 どうにかしてロードさせられれば勝てるかもしれん。
あああ、いったいどうしてなんだろう……って、 StopFold.mailbundle を ls してもディレクトリになってないな。 なんだこれ。
……おや?
あれ?!
えええ? なんだこれ? Finder だとディレクトリに見えるのに ls だと空ファイルに見えてる。 なんだこれは。どうしてこんなことになってんの? よくわからないが、とりあえず rm して cp -r でコピーしてみよう。
げっ、今度は動いた。マジかよ。
なんか原因がよくわからない。 Xcode から DnD したのがダメなのかーと思ったけど、 いま試すとシンボリックリンクになる。 少なくとも空ファイルにはならないな。 シンボリックリンクになってるのを ロードしようとするとダメとかそういうことか?
うーん、まあ最終的に動いたからいいか。 これで安心して Mail.app が使えるよ……。
(23:51)
わけあって Mac OS X 上で Ruby/SDL のインストールを試みる。
……げっ、X が必要なのか。 くそう、できるだけ X は入れたくなかったのだが、しょうがない。 Mac Ports で入れて、Ruby/SDL のテストしたら消そう。
[参考になりそうなページ]
うーむ、なんか激しくめんどくさそうだな。 なんでこんなに面倒なんだろう。 上記のページを見ていった感じ、 原因は二つありそうだ。
一つめは、Mac OS X のウィンドウシステム (というか Cocoa かな) とのインタラクションのために特殊な初期化が必要なこと。 そのためにはパッチを当てて特殊な Ruby を作る必要がある。 これは Windows で言う ruby (エントリポイントが main) と rubyw (エントリポイントが WinMain) の違いに対応している。
二つめは、SDL ライブラリ自体が特殊な初期化を必要としていること。 エラーメッセージから見て、 おそらく Cocoa に接続してるんだと思うんだけど。 C レベルだと SDL は main をマクロで置き換えて独自の初期化を入れているが、 Ruby だとそういうことができないので死ぬと。
ただ、一つめの問題と二つめの問題は 重複しているような気がするんだよな。 拡張ライブラリか、せめて組み込み Ruby インターフェイスでどうにかできんのかこれ。 だいたい SDL にしても、 main をマクロで置き換えるしか手段がないというのは酷い。 なんか代替手段はないのかよこれ。
SDL のソースコードを見てみた。……うーん、ほとんど当たってる。 そもそも、rubyw を作るパッチてのが SDL から切り出したように見えるな。 関数の名前が全部同じだ。
これで SDL の関数を呼んでいなければ 単純に rubyw で置き換えられるわけだが、 そういうわけにもいかなそうだなあ。 そもそも rubyw パッチはちゃんと動いてたのか? 見る限り、src/main/macosx/SDLmain.m には SDL アプリケーションを終了させる専用コードが入ってるから、 これを省略しちゃったらまずいんではなかろうか。 それとも SDL の quit イベントというのは Cocoa の終了イベントそのものなのかな。 それなら実際には問題は起こらないけど。
うーん。とりあえず、rubyw パッチをパッチじゃなくて 組み込み Ruby アプリケーションにしてみようかな。 いまどき 1.8.2 なんて使いたくないし。
(22:05)
パッチをファイルに戻して、 1.9 でも rubyw を作れるようになった。 ……と思ったけど、なぜか 1.8.2 の libruby にリンクされている。 cc に -L を付けるのを忘れてた。
動いた。ちゃんと Dock に出てくるなあ。 でも終了ハンドラがないので強制終了しかできない。
うーむ、作ってみてわかったんだが、 これは RubyCocoa の処理とかなり重なってるような気がする。 うまく組み合わせれば pure Ruby + RubyCocoa + Ruby/SDL で行けるのではないか。 見た感じ、SDL の独自の初期化のほとんどは RubyCocoa で書けそうである。 いまのところ足りないことがわかってるのはプログラム終了部分で、 SDL のイベントを送らなければいけないように見える。 ここを Ruby/SDL のコードで (Rubyで) 書けば パッチも拡張ライブラリも組み込み Ruby もなしで行けるのではないか (もちろん RubyCocoa と Ruby/SDL は拡張モジュールだけど)。
(23:47)
うーん、やっぱ当面は rsdl を使うのがてっとりばやいな。 もうちょっと俺の RubyCocoa での経験値があがったらどうにかできるやもしれん。
(02:37)
日常的に使いはじめるとやっぱけっこう問題があるなあ。
まず、ファイルをテキストとして挿入する手段が見付からない。 diff をその場にはっつけたいのに。 しょうがないから一回 Emacs で読み込んでコピペしてるけど、 めんどくさくてしょうがない。 端末からコピペだとタブが消えるし。最低だ。
もいっぱつコピペがらみの問題。 Wiki から (ブラウザから) 長い文章をコピペしたら、行間情報までコピーしてくれた。 標準テキストなのにも関わらず。どうにかしてこれを元に戻そうとしたが、 リッチテキストにしてもそもそも行間を制御する設定が存在せず、何やっても元に戻らない。 しかも最低なのが、送信するメールにまで情報が残ることだ。 なぜか行の間に空行が入ってる。これは完璧にバグだろ。
ついでに Mail.app じゃないけどコピペにまつわる問題その3。 あ、いや、Adobe reader から Mail.app だから関係はあるか。 Adobe reader から数式とかルビ混じりの文章をコピペすると激しく化ける。 まあ、これはたぶん文字コードがらみもあると思うので、 しょうがないって言えばしょうがないんだけどさ、 もうちょっと素直にコピペしてくれてもいいと思うんだよなあ。 なんで Π (ギリシャ文字の大文字 π) が Q になるんだよう。
行の折り返しもそうだけど、Mail.app はどうも文章作成側がヘボい。 表示関係とか SPAM フィルタとか検索は気に入ってるので なんとか Mail.app を使いたいんだが、このままではEmacs で文章を作って Mail.app に貼り付けるというアホなことになってしまう……。
もうなんか、あまりにムカついてきたんでフィードバックを送信しまくっておいた。
(20:08)
嘆いていてもしょうがないな。 TextEdit でテキストの文字数を数えられるなら、 Mail でファイルをテキストとして挿入することもできるのではなかろうか。 メールを複数編集してたときが問題だけど、それはあとで考えよう。
(20:22)
はっ! そうだ! Finder からファイル (の内容) をコピーできれば、 ペーストするだけでうまくいくな。 この方向で考えてみよう。
(20:27)
ファイルやクリップボードの内容をテキストとして読み込んで、 他のアプリケーションにテキストを再エクスポートするアプリケーションを作ればいいのかな。 結局 xclipstr みたいのだよな。 俺はどこに行っても似たようなもんを作ることになるんだなあ。
いちから作るのもアレだしな。テキストエディットで開いて、 標準テキストに変換して、すべて選択してコピー、でいけるだろうか。
(21:07)
……というか、こんなのはすでになんかあるような気がしてきた。 お、Change into Plain Text というソフトを使うとプレーンテキストへの変換はできるっぽいな。
……なにい! pbcopy / pbpaste ってコマンドがあるのか! これでいいじゃん!
(21:35)
普段この日記はメール経由で書いてるんだけど、 ときたまウェブから更新するときもある。 で、Safari は普通のテキストエリアだと Emacs キーバインドになるんだけど、 なぜか tDiary のときだけ Ctrl-a, e, p, とかがinput に奪われるんだよね。 行の先頭に戻ろうと思って Ctrl-a 押したら更新されたりとか。 BitChannel だとそういうことはないので、 なんでだろうと気になっていた。
で、今日ようやく理由がわかった。 input に accesskey が指定されてると、 Ctrl + accesskey がそっちに取られる。 やってくれたよ Safari。
こんなのやってらんないので、 tDiary のテンプレートからあらゆる accesskey を抹殺しておいた。
(23:09)
accesskey をいじったら止まらなくなり、結局デザインをかなり変えた。 まあ、見たところ h1 が出たことくらいしかわからんと思うけど。 コードもかなりいじっている。
(04:22)
いろいろ変えた。
(07:05)
あああ、すっかり tDiary モードになっていた。 何してたんだっけ俺。 そうか Mail でファイル挿入しようとしてたんだ。
なんか pbcopy でいけそうだな。
% pbcopy < ec.diff
で、CMD-V でメールに貼り付けられる。 diff の出力をこれでつっこめばいいな。
……と、思ったら問題起きた。 マルチバイト文字 (EUC-JP) が入ってるとうまく動かない。
ううむ。UTF-8 に変換したらいけたりするのか? → だめぽい。超期待したのに。
お、JIS だといけた! しかし今度は Mail への貼り付けで化ける。 なんだそれは。
ということは残るは SJIS か。 おお! SJIS だと大丈夫だあー。 これをシェルスクリプトにしておこう。
#!/bin/sh nkf -s ${@+"$@"} | pbcopy
ペーストボードの中身を強制的にプレーンテキストにするのもpbcopy と pbpaste でいけるな。
#!/bin/sh pbpaste -Prefer ascii | pbcopy
これで OK。なんだ、できてみれば簡単だったな。
(09:12)
そもそもなんで Mail のコピペがどーのこーのと言い始めたかと言えば、 リファレンスマニュアル第三段階はじめるよーというメールを書こうとして Wiki から作業手順をコピペしたら酷いことになったというのが今日の最初の事件であった。
そんなわけで今日もまた第三段階は始まりそこねたのであった、まる。 いまから寝るとたぶん夜に起きるから、たぶんそのころ書くよ!
(09:49)
るびま本の校正が来ることをすっかり忘れていた。 22 日から松江だから、それまでに終わらせないと……。
はやいとこリファレンスマニュアルも進めないといけないし、 ふつぱいらもあるし、プライベートなタスクもあるし。 やっばいなー、全然暇ないじゃん。 論文が終わったら余裕ができると思ってたんだけど、大間違いであった。
うーん、リファレンスマニュアルの #@todo 入れは自分でやろうと思ってたけど、 これも誰かに任せようかなあ。
(10:05)
Amazon のギフト券、安くなってないか? 確かこの前まで 10000 円買ったら 1000 円のギフトカードをくれたと思うんだけど、 12 月は 500 円だった。
1 月は (論文のために) 6 万も使ったけど、やっぱ500 円なのだろうか。 そういやポイント制になるのはいつからだっけ。 ……2 月か。ということは 1 月分はまだギフト券なのかな。
(10:21)
外出に備えて、超大急ぎで SMTP と IMAP を SSL 化する。
とりあえず止まっても被害の少ない IMAP のほうからやってみる。
% sudo aptitude install courier-imap-ssl
完。
もうちょっとだけ書く。 実際にはこんな素直にはいかなくて、 そもそも courier-imap-ssl パッケージが必要ということがわからんかった。 だって courier-imap の設定に SSL なんたらって書いてあるんだもん。 そうしたら、いかにもその項目を設定すればよさそうに見えるじゃん。 で実際サーバも上がってくるんだけど、それではいかんらしい。 実に紛らわしい。
この勢いで exim のほうもやってしまおう。 STARTTLS と plain auth を使う。
設定はテンプレそのままで行けたので特に問題なし。 ただし /etc/exim4/exim.key とか exim.crt とか passwd のオーナーを Debian-exim に変える必要があった。
……うう、Mail.app からつなぐと "A TLS packet with unexpected length was received" と言われて接続が切れる。なんだこれは。
そういえば net/smtp が STARTTLS に対応していたなあと (作者なのに) 思い出し、試してみると、サクッと通ってしまった。 ううむ、これはむしろ嫌すぎる。
そもそも Mail.app は STARTTLS なんだろうか。 実は SMTPS でしたとかいうオチはいやだぞ。 なんかこのへんの情報が全然ないなあ。
うーん、もういい。 あきらめて外から送信するときは IMAP の Outbox を使うよ。
(07:31)
重い腰を上げてようやく各方面にメールを投げた。
さて第三段階はガシガシとドキュメントを書くわけだが、 具体的にどのくらいあるのだろうか。
~/c/bitclust % ruby tools/stattodo.rb ~/c/rubydoc/refm/api/src 14349 / 14349 (100.0%)
15000 エントリだそーですよ。うはー。 ちなみにそのうち tk が 5000 エントリくらい。
(09:22)
ささださんのツッコミに従って SSH ポートフォワーディングを試してみた。
~ % ssh -f -2 -N -L localhost:10025:mail.loveruby.net:25 mail.loveruby.net
と実行しといて、 Mail.app から localhost の 10025 番に接続する。
あれ? なんで失敗するんだろう。 telnet だとちゃんと exim が出てくるのだが。 いやログイン失敗だから接続はできてるんだな。 パスワードが違う? そんなことないよな昨日このパスワードで試したばっかりだし。
わかった! SMTP/TLS 以外のときには SMTP AUTH がオフになるように設定してたのが裏目に出たんだ。 ポートフォワーディング時はローカルホストからの接続になるんだから SMTP AUTH はいらないな。認証なしにすればいい。
よっしゃ通ったー。
(17:27)
松江のオープンソースラボに来ております。 参加者は、まつもとさん、笹田さん、前田さん、うささん、中田さん、青木。 まあ、わたしはオマケなんですが。
昨日の話題アラカルト。
新しい仕様を入れるのは延期して、12 月ごろの仕様で1.9 を出すらしい。
M17N をその 1.9 に (本当に) 入れるらしい。 M17N を入れたとして -K や環境変数をどのくらい影響させるかいろいろ検討した。 File は -K を反映すればよさげ。 stdin, stdout, stderr だけは環境変数も反映? (Python もそうらしい) Windows で Dir.glob すると encoding がユニコードになったりする? ソケットはデフォルト binary のがいいかも。 その他の文字列を返すシステムコールは binary か。 StringIO は最初に与えた文字列のエンコーディングとかか。 #string で文字列を得るときに渡す方法もありうるかも。
文字列のエンコーディングが決まるのは読み出し時のみで、 書き出し時にはエンコーディングのことは何も気にしない。 勝手にエンコーディングを統一したりしない。 エンコーディングを変換してくれるストリームみたいなものはあってもよい。
ヒアドキュメントの、文字列本体のインデントを削る文法を導入したい。 どこまで削るか。 終端記号のインデントまで? 本体 1 行目のインデントまで? 本体中の一番浅いインデントまで? タブは 8 スペースか。
private メソッドの仕様どうするか。 いずれにしても 1.9 には入らないので好き勝手な案が乱れ飛ぶ。 ちなみに俺は 「もう protected なんて廃止して今の private 相当にしちゃえばいいんだよ! (代わりに private がクラスプライベートになる)」 という互換性なんてまるで考えてない案を挙げてみた。
(09:55)
Mac OS X で Ruby をコンパイルしたときの警告を見ていて、 Mac OS X で dlopen が使われていないことに気付く。 OS X 10.3 以降は dlopen が推奨らしいので、 dlopen を使わせるように変更した。 オープンソースラボから記念コミット。
(10:32)
1.9 で make test-all すると ripper が死ぬ、 ということでデバッグ。
新しく追加された規則に Ripper 用アクションがなくて、
$
(12:29)
まつもとさん、笹田さん、中田さんが 3 人で多重代入まわりの NODE の構造について (キーワード引数をみすえたりみすえなかったりしつつ) 議論していたのがようやく終わった模様。
そのかたわらで俺は yarvtest 以下のテストをひたすら test/ruby にポート。 何も失敗しなくてつまらない……とか言ってたら、
a, *b, c = 1, 2, 3, 4
で testrb が戻ってこない。 test_assignment.rb は 2 つエラーか。
TDD (two-channel driven development)。
おんせんにはいりたいなあ
(16:28)
マシン移動のアレで ruby-cvs ML が止まっていたらしい (いまは復活してる)。
Windows 関係でシグナルハンドラが全然動いてなかった疑惑。
今日はみんなコミットする日らしい。
__FILE__ が毎回違うオブジェクトを返すということを初めて知る。
(16:31)
夕食時の話題。
キーワード代入。 実はキーワード引数ってキーワード代入があればいいんじゃね? という話。
(verbose:v, noop:n) = {:verbose => true, :noop => false}
みたいなことができて、 同じ文法でパラメータリストが書ける、とか。 ようするにパターンマッチですな。
ピザを 6 つに切るべきだった、 ということを切り終わってから述べたことによって わたしは非難された (英訳、5 点)。
引数なしの super が特別扱いされるために 引数ゼロの super を super() と書かざるを得ない件について。 「このメソッドの引数リスト」 を表現する文法があればよいのではないかという話に展開。 「*」で「このメソッドの引数リスト」が表現できたらよいのではないか、とか。 メソッドのデレゲートも
def m(a, b, c = nil, *d, &block) @obj.m(*) end
で書ける。人呼んで star system (?)。 いかにも Rails 方面の人が濫用しそうだよね、 という点で意見の一致を見る。
バーナー 4 発 (クアッドバーナー) の気球。 松江は気球飛ばし用地として有望。
第 3 回「protected はどんな名前にすればよかったか」会議〜。 protected という名前は実は前田さんの提案であったことが 昨日明らかにされたわけだが、 非常にミスリーディングな名前であることは異論がないと思う。 Rails 方面の人々はよく protected と書いているが、 そのほとんどすべてが間違いなのではないかという説もある。
カニクリームコロッケは俺が独占していたわけではない。
で Ruby の protected は C++ で言えばfriend みたいなもんなので、 いっそ friend にしたらいいんじゃないかとか、 いや P で始まんなきゃだめだから priend だとか、適当なことを言い合う。 C++ の本のどれかに、フランス語で「友達」みたいな意味の単語で 「ぽるてーじゅ」(?) とかなんとかいう語を使うという案が載ってたと思うんだけど、 なんだったかなアレ。 あ、C++ じゃなくて『エキスパートCプログラミング』かも。
(09:42)
昨日の名言。 「俺がアルコールに依存してるんじゃない、 アルコールが俺に依存しているんだ」
笹田さんの 「test/unit とか optparse が動かないとき用のテストが欲しー」 というリクエストにより、 make test のちょっと改良版みたいなものを作り始める。
昼ごはんのあと、中田さんが酒を買っていた。
(13:23)
ピザを 6 つに分ければよかったということを あとから指摘して怒られたというのは不正確である、 その前日にもみんながゴマを思いきりすりまくったあとに 「ゴマはあまり完全にすらないほうがいいらしい」 と発言して非難囂囂であったというコンテキストがあればこそ問題であるのだ、 ということを書け、と怒られたので、謹んでここに追加する次第である。
flock でブロックしている間はシグナルハンドラが動かない件。 当初は「ささださんがコマンドを打つとうまくいかない」 という説が有力であったが、詳細な検証の結果、 1.8.x の細かいバージョンによって動いたり動かなかったりするということがわかった。 昼食時にまつもとさんが事情を思い出し、謎はすべて解けたーということで解決。
String#each について。 1.9 では String#each がなくなったわけだが、 やっぱり不便でしょうがない。 なんで不便かとつらつら考えた結果、 Array (Enumerable) のメソッドよりも String のメソッドのほうが ぜんぜん使い勝手がいいということに気付いた。 ということで、Array にもっとメソッドを追加しようよというメールをいま書いている。
(14:05)
子供自慢大会会場と化すオープンソースラボ。
VC++ 8 だけで落ちるバグ発生。 malloc した領域の未初期化 (?) が原因らしい。
まつもとさんと笹田さんは昨日からずっと パラメータのノード構造の変更をやっている。 なかなか難しいらしい。
気球飛ばし地として有望なのは松江でなくて「やすぎ」らしい。
(16:46)
ファイバ入れよう説。 ここで言うファイバとはノンプリエンプティブなユーザレベルスレッドのこと。 別名「しょぼいスレッド」。 ファイバがあればけっこう速い generator.rb が書けるよとか。
むしろこるーちん?
また ripper の make test-all でバスエラーになっていた。 パーサ本体の変更に Ripper のアクションが追従してなかったのが原因、修正。
この合宿中はバージョンが「年・月・日」までだと危ない。 常に svn up しまくっていないとヤバい変更が入ってて修正されてないことがある。 もっとも、svn upしても修正されてないこともある。 会場ローカルなその場しのぎパッチが流通している。
(17:52)
合宿最終日。
昨夜は断固として温泉へ GO
test/unit というか optparse が動かないときのためのテストとして bootstraptest を追加。make btest で動く。 yarvtest (と make test) を make btest で置き換える感じでいきたい。
#define RUBYVM 1
前田さんは fastthread を書き直そうとしている。
オープンソースラボの部屋に入った次の瞬間に 躊躇なくイーサネットケーブルをつなぎはじめるあたりに インターネット廃人の意地を見た。
だから String#each 復活させようよ。
gruby (golf ruby)
文字列配列から一発で StringIO を作る方法が欲しいと 執拗に中田さんに要求する。
(11:34)
というわけで東京に帰ってきました。 まつもとさん・前田さんはじめ NaCl のみなさんに大変にお世話になりました。 ありがとうございました。
で、こっから昨日の話。
また子供自慢大会だった。
net/http の NTLM 対応パッチ改訂版が来たのでコミットしてしまおうと作業を始める。 しかし、真面目に見るとけっこう問題があって泣けた。 raise するときは例外クラス書いてくれよ (とかなんとかいろいろやってたのでまだコミットしてない)。
今度はちゃんとピザを 6 つに切った。
まつもとさん一家勢揃いでえらく大層なお見送りであった。
バスの中でもまだ Ruby 話は続く。 キーワード引数の穴はないのか、OSS ラボの議論の続きをやる。 俺の考えた範囲では、
def kwm(x = nil, k:) end kwm(k:1)
というときに x = {:k=>1}, k = nil になってしまうのが直感的でないと感じた。 でもこれを特別扱いしてしまうと互換性は保てないし一貫性もなくなるので、 (1.9 でキーワード引数を導入したとして) k = 1 にするのはむずかしいな。
それと関連して、「引数として明示的にデフォルト値を渡す」 という構文があるといいのかなあと思った。 例えば次のようなメソッドがある場合、
def m(a = 77) end
m() と呼ぶと a = 77 になるが、明示的に引数を渡して m(xxx) と書いても a = 77 にできるような xxx が欲しい。 いまはデフォルト値を直接書かないとその値にはできない。
飛行機の中でもまだ Ruby 話は続く。 マルチ VM の使い道を考える。 デバッガを作るってのは我ながらいい案だと思った。
ゴルフ専用 Ruby、ごるびー。 デフォルトで -a などの便利オプションがオン、 重要ライブラリは全部 require 済 (g.rb を含む)、 g.rb によるメソッド補完呼び出しを有効にするため putc などの邪魔なメソッドはすべて undef、 -eruby オプションで eruby スタイルの出力、 ソースコードが 7 ビットクリーンなときは -7 オプションで 7 ビット列にパックできる。 gruby -eruby -7 だと Hello, World は 12B に縮むのでPHP に勝てる。 という与太話を浜松町の飲み屋で繰り広げた。 gruby 禁止のレギュレーションが即座に設けられるであろうことは確実。
そんなこんなの 4 日間でありました。 全体を通した感想としては、 やっぱ直接対面しての開発は非常に話が早くて楽。 まつもとさんが parse.y いじってコミットしたあとに ripper をすぐに追従できる、とか。 それから、今回は飲み会ネタがけっこう使えそうなのが多かったかな。 キーワード代入とか。
(23:36)
キーワード代入についてちゃんと書いたっけ?
文法は諸説あるんだけども、例えば、
(k1:, k2:) = {:k1 => 5, :k2 => 6} p k1 # => 5 p k2 # => 6
という感じ。 これをメソッドの仮引数リストでやれば、
def m(k1:, k2:) p k1 # => 5 p k2 # => 6 end m k1:5, k2:6
となる (ただし、特殊な場合を特別扱いすることで括弧を減らしてある)。
よーするにハッシュのパターンマッチだよな。 これまで多重代入ではスカラと配列だけが扱えたわけだけども、 これをキーがシンボルの Hash にも広げようってことだ。
この方法は、現在の Hash を明示的に使う方法との互換性が非常に高い。
(00:25)
うーん、make test-all が 23 日から変になってるなあ。 なぜか「Fixnum#+ がない」というエラーが出ている。 ちょうど Fixnum#+ を一時的に undef するテストを入れたんだけど、 もしかして俺のせいかな。
でもそれだったらどのプラットフォームでも同じエラーになるはずだよな。 昨日は make test-all が通ってたような気がするのだが、 なんで手元の環境だと止まらないんだろ。
(00:33)
なんかさ、「俺のパッチが 8 ヶ月放置されてんぞゴルァ」 っていう英語のメールが来たんだよ。Ruby/OpenSSL のだけどね。 これってゆうぞうさんにフォワードすればよいのかな?
(01:08)
そういえば、結局 yarvtest 以下を 完全に置き換えるまでいかなかったんだよな。 最初は test/ruby にもってく方針だったけど、 今後は bootstraptest に持ってくことになるかな。 あるいは bootstraptest のほうは簡略化したテストを置き、 test/ruby のほうに網羅的なテストを置いてもいいな。
(02:00)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ ただただし [おめでとう〜]
■ 酒井 [おめでとー
理解できるか分からないですけど、読んでみたいです。]
■ n [乙]
■ 青木 [ありがとうございます。終わってよかったですホント。
内容は……ちょっと、アレかも。]