history

青木日記 RSS

<前月 | 最新 | 次月>

2007-03-02

るびま本の再校

ここ数日のラッシュが終わって、 さて何をしようなあ……と気楽な気持ちで ToDo を整理していた、の、だが……

るびま本の再校が来てるじゃん (締め切り 3/5 内)。 ぜんぜん気楽じゃないっ。

しかしこれが終われば本当に楽に……ならねえ。 ふつぱいらを 3 月中に目途つけないといけないんだった。 諸々の事情でかなり放置してしまったから、 3 月内くらいは本格的にやろう。

(23:27)

ふつぱいら

そういえば、3/31 までに 450KB 書くのが目標だったような気がする。

気がする、とか言ってる時点でダメです。ありがとうございました。

(00:43)


2007-03-03

[ruby-dev:30411] FileUtils.mv raises Errno::EPERM

あ。忘れてた。

(22:27)

MacBookのハードウェア

いま MacBook に 15 枚ウィンドウを出してるんだけど、 この状態で expose を使うとすげー表示がカクカクする。 どうやら 10 枚くらいがきれいにアニメーションできる限界っぽい。 たぶんチップセット統合グラフィック (Intel GMA950 だっけ) がへぼいせいだろう。 メモリもかなり足りてなさげだけど。

確か MacBook Pro はチップセット別立てのグラフィックチップが載ってるんだよな。 モニタももうちょっと広いのが欲しいし、 次の MacBook も統合型だったら今度は Pro を買おうかな。

(23:16)

確定申告

そういえば、そろそろ確定申告の書類を準備しないとなあ。

(23:22)


2007-03-04

fcgi.rb

おれは秘かに fcgi.rb のメンテナでもあったのだー。はははははは

……メンテするプログラム多すぎだって、マジで。

fcgi.rb をマルチスレッド対応すんのは、確かすげー簡単なんだよ。 @default_parameters['FCGI_MAX_REQS'] に 1 以上の値を入れて、 FCGI#each_request の yield でスレッドを起こせばいい。

と思ってコードを眺めてたら、 マルチスレッドの話はその通りだったが、 graceful exit の条件が完璧に間違ってたことに気付いた。 これでは全然 graceful じゃない。

まあそれはあとで直すとして、スレッドのほうについて考える。 #each を使うのをあきらめて #finish を復活させると スレッド起動部分を外に出せるな。 そのほうがいいような気もする。 YARV 後だとスレッドプールを使いたいこともあるだろうし。 よし、思いたったが吉日で即導入。

(02:49)

fcgi.rb (2)

いや、嘘だった。俺が嘘だった。 やっぱシングルスレッドの graceful exit はこれでいいんだ。 マルチスレッドになるとちょっと変える必要があるってだけだ。

(02:53)

FastCGIのメンテナ

ああそういえば、俺がメンテしてるのは pure Ruby なfcgi.rb だけね。 fcgi.so は別の話。 gem がどうなってるのか知らんのだけど、どっちなんだろうね。

(03:32)

fcgi.rb (3)

あれ? libfcgi 2.4.0 は MAX_CONNS=1, MAX_REQS=1 に固定されてるな。 もしかしてネイティブの libfcgi ってマルチスレッド対応してないのか? なんかそれもちょっと考えづらいのだが。 どっか別のところにソースがあったりする?

(04:10)

本日のツッコミ (全2件) [ツッコミを入れる]

MoonWolf [fcgi.soはネィティブな意味でのスレッドセーフにしたつもり。
fcgi.rbまではちょっと手がまわらない。
体調回復したらメンテナンスに復帰します。
もうちょっとの間お願いします。ほんとすみません。]

青木 [いえいえ、fcgi.rb は自分でも使ってるので別に気にしませんよ。数が多すぎるのは自分の責任ですから。
それはともあれ、確かに fcgi.so はスレッドセーフにはなっているようですが、FastCGI プロセス自体が (まだ) マルチスレッドで動いていませんよね。ラップしている libfcgi が MAX_CONNS=1, MAX_REQS=1, MPXS_CONNS=0 固定ですから。]


2007-03-05

fcgi.rb (4)

クライアント側でマルチスレッドを実装しているライブラリが見付からない。

Perl はたぶん libfcgi の中にあるやつだよな。 これは libfcgi そのままなので、シングルスレッド。 標準添付の CGI::Fast.pm もいちおう見たけど同じ。

Python の FastCGI 実装の最新版はどこにあるんだ。 http://alldunn.com/python/fcgi.py でいいのかなあ。 last-modified が 2000 年なのがすごい気になるのだが。 少なくともこのファイルでは MAX_CONN=1, MAX_REQS=1 なので、 シングルスレッドだな。

Java も libfcgi の中にあるやつはシングルスレッド。

えええええ? もしかして本当にマルチスレッドクライアントなライブラリって存在しないの? マジかー。ちょっと信じられないんだけど。 誰かマルチスレッドな FastCGI クライアントライブラリを知ってたら教えてください。

(05:21)

net/smtp: TLS 関係でいろいろ変更

なんでこういうことになったんだかよくわからないのだが、 net/smtp で自動 STARTTLS をサポートした。こんな感じで。

require 'net/smtp'
 
s = Net::SMTP.new(host)
s.enable_starttls_auto
s.start(helo, user, pass) {
   s.open_message_stream(from, to) {|f|
     ....
   }
}

TLS 系のメソッドはガッツリ変えました。 このへんはどれも 1.9 から追加されたメソッドなので、 後方互換性はいっさい保たれていません。 これが 1.9 の宿命なのであきらめてね。

なお net/pop も同様に変更予定。

(09:34)

str.lines[1..-1]

文字列 str の 2 行目以降を取ろうとして str.lines[1..-1] と書いたら NoMethodError を食らった。 ああ、enumerator だからか。 これはちょっと、どうなのよ。

ということで ruby-dev にメールを投げる。

投げてから考えついたんだけど、 str.lines.drop(1) という逃げはありうるな。 しかし、だから aref がいらないかというと、うーむ。

やっぱり、本当の行配列を得る方法も必要なのではなかろうか。

(10:06)

str.lines[1..-1] (2)

今回は [1..-1] だったから drop でもよいが、 [0..-2] とかだと rdrop がないとうまくない。 やっぱ rdrop は欲しいな。

lines[1..-2] みたいな場合ってどれくらいあるだろう。 行指向の文法で、ターミネータが前後にある場合か。 いかにも必要になりそうだなあ。 やはり drop_both も入れといたほうがよいやもしれん。

あ、drop_both のメソッド名は、lrdrop というのはどうだろうな。 見にくいか。

(10:16)

春だ

ドキがムネムネしてくると春だなあって思う。

(10:24)


2007-03-08

fcgi.rb (5)

前回の書きかたはちょっと誤解を招くなあ。

いま問題にしている fcgi.rb のマルチスレッド化というのは、 単にライブラリのコードをマルチスレッドセーフにするという話ではない。 アプリケーションに、複数の FastCGI リクエストを並列に処理させる話である。 まあ、その結果として並列にレスポンスを送り返す必要が出てくるので、 結局マルチスレッドセーフにもしないといけないんだけども。

で、俺が一番困ってるのは実装ではなく、 並列発行をオンオフするインターフェイスである。 もし前例があるんならそれの真似して済まそうと思ったんだけども、 それがないみたいなのでどうしようかなと。

でもまあ、ないんならないで勝手に都合のいいインターフェイスを 作っちまえばいいわけだから、それはそれで楽だ (それで実は前例があった、ということになると困るんだけど)。 いまんところ Hash 引数を使おっかなーという気分になっている。 こうね。

FCGI.each_request(multithreads: true) do |req|
   ....
end

この場合、FCGI_MAX_CONNS と FCGI_MAX_REQS は適当なデフォルト値になる。 パラメータを細かく制御したいときは同様に

FCGI.each_request(multithreads: true, max_connections: 10,max_requests: 50) do |req|
   ....
end

とする。MPXS はデフォルトで true なので必要ない。と思う。

(07:19)

すごれんすまにゅある / 返り値の記述 (1)

リファレンスマニュアルでの返り値の記述について真面目に考える。

返り値について、何を書くべきだろうか。

  • 意味
  • 型?

……うん、まあ、こんなもんでしょう。 型は意味じゃないのかと問われると困るが。

では、どのように記述するか。 基本的に、意味は日本語で説明しなければならない。 で、それをどこに書くかだ。

  1. 普通に段落で書く
  2. @return を用意する

うーん。俺としては、あんま @return 使いたくないんだよな。 既存のドキュメントを見るかぎり、 @return を導入してもあんまりうまく文章を分けられそうにない。

例えば String#index のように返り値が重要なメソッドの場合 (function 的なメソッドと呼んでおく)、 第一段落 (メソッドの要約) に書くべきだろう。 「パターン pattern を文字列から検索し、そのインデックスを返す。 パターンが見付からなかったら nil を返す」 で十分に返り値の説明になっていると思う。

また Array#each のように返り値なんてどーでもいいメソッドの場合 (procedure 的なメソッドと呼んでおく)、 そんなもんはどーでもいいので引数の説明のあとにでも 「self を返します」と一言書いておけば十分だろう。

それに対して引数の説明はけっこう繁雑であるし、 引数と違って複数ありうるので、 @param を導入する意味はあると考える。 例えば String#index の第一引数 pattern について 条件を詳しく説明したほうがよいだろう。

ということで、俺としては @return は導入せず、 引数の意味が重要なときだけ第一段落に書く、 というのがよいのではないかと思う。

(20:10)

すごれんすまにゅある / 返り値の記述 (2)

返り値の型を書くべきだろうか。 また、書くとすればどう書くべきだろうか。

うーん。どうなんですかねえ。書く場合のデメリットを挙げると、

  • 同じことが (きっと) 文章に書いてある
  • 既存のドキュメントには書いてない (ので手間がかかる)

うう、なんかすでにこの時点でヤバいような気がしてきた。 ML にはいちおう型の記述方法の提案を出してはみたけど、 やっぱやめよっかなあ。

(20:15)

すごれんすまにゅある / 返り値の記述 (3)

@param を導入した主な理由は、 チェックを自動化し、書き忘れを防ぐことである。 実はあんまり再利用については考慮していない。 したがって @return についても @param と同様の規準で考えてみよう。

@return を導入するとチェックが自動化できるか。 んー、まあ、できるよな。書いてあるかどうかはわかる。

しかし、@return がなかったら返り値について書き忘れるかというと、 それはどうなんだろう。 function 的なメソッドで返り値を面倒だからとか、 うっかりとかで書き忘れることってあるのだろうか。 procedure 的なメソッドで忘れることならありそうだけど。

うーん、そうか……。 procedure で書き忘れるのを防止するために @return を導入する、 というのは意味があるな。 でもって、書き忘れのないようにするために @return を導入するなら すべてのメソッドにつけることにしないとまずい。

付けたほうがいいという結論に傾いてまいりました。

(20:27)

本日のツッコミ (全7件) [ツッコミを入れる]

Siena. [procedure 的なメソッドだと、事実上未定義、ということもありますよね。
self を返すのか、最後に評価した式を返すのか、意識してないコードとか。
後付けで self を返すことにする、と決まったり。
というわけで、@return 未定義、も許容するの希望。

あと、どんな例外が上がる可能性があるのかがリファマに書いてなくて、不便に思うことがしばしば。
いろいろテストして大丈夫だろうと思ったコードで、後になってから思いもよらぬメソッドから思わぬ例外が発生して、あちこち対処しなくちゃならなくなったり。
すごれんすまにゅあるでも、例外の記述は変わりません?]

青木 [このルールは標準添付ライブラリまでの範囲の話なので、返り値はすべて決まってる (決めてもらう) ものと考えてます。書いてなくても結局使う人がいるんだもん。
例外は @raise で書きます。]

Siena. [なる。@return は、それはそれで納得です。
書いてなくても使うひと対策で、「未定義」として決定を先送りする、というのは無しということですね。

えと、@raise で書けるのは分かるのですが。
果たして、発生する可能性のある例外を漏れなく網羅するという方針なのかしら、ということでして。]

青木 [もちろん、全部書くのが前提です。ただ、SystemCallError の下位クラスとかは現実的に無理なような気もしています。あと、ArgumentError とか TypeError も頻度が高すぎるのでたぶん省略することになるでしょうね。フツー起きる、ってことで。]

Siena. [たびたびどうもです。ArgumentError や TypeError については御意。

正直なところ、コーディングの際に Errno::* が厄介に感じてます。
どのメソッドでどんなシステムコールを呼んでいて、どのシステムコールがどんなエラー番号を返す可能性があるのかを把握してないと例外安全なコードを書けないのは、低水準で大変ですよね。
思慮が足りない人なので、テストでカバーしきれなくて、思わぬところで思わぬ例外が上がってしまい。なかなかコードが安定したという安心感を得られず、何か潜んでいいないかと不安がつきまといます。
Ruby を変えて SystemCallError 以下を抽象化するなどは今回の本旨でないので、リファレンスマニュアルとしては、(完璧でなくても) できるだけ文書化されていて欲しいと思うのです。せめて依存するシステムコールの一覧くらいないと、man してとも言いにくいです。]

青木 [書かないとは言ってません。「(OSごとに違う分まで) 全部書くことはできない」ってだけです。POSIXで決まってる分くらいはたぶん書けるでしょう。]

Siena. [とても手間がかかり過ぎるので善処するけれどカバーしきれない、ということと誤解していました。失礼しました。実際、それも仕方ない作業量かもしれませんが、できる範囲ででも検討していただければとても心強く思います。
しつこくなってしまってごめんなさい。ここらで退場させていただきます。]


2007-03-10

Finder? が落ちた

さっきサーバに ssh ログインしたら SSHKeyChain が突然死した。 これはわりとよくあることなのだが、今回はそのあとがある。

「Appleにレポートを送信しますか」のダイアログが出るが、 このダイアログにカーソルを合わせるとずっとレインボーになっててボタンが押せない。 何が起きてんのかと思ってアクティビティモニターを起動したり ダッシュボードを呼んだりした (プロセスモニタが動いてるから) のだが、 どっちも動いてない。 それどころか、ウィンドウを切り替えてしまうと そのアプリケーションが連鎖的にまきぞえくらって止まっていくようだ。

やむをえず電源ボタンを押すと 「再起動しますか」のダイアログが出たが、 このダイアログもずっとレインボーになっててボタンが押せない。 やむをえず別のマシンから ssh で入って sudo shutdown -h now でようやく止められた。

ssh で入れるということはカーネルはちゃんと動いてるということだ。 ウィンドウシステムがどっかおかしくなってたぽいな。 ウィンドウシステムだけ再起動ってできるんだろうか。 launchd になんかシグナル送ればいけるか?

(17:18)

本日のツッコミ (全3件) [ツッコミを入れる]

まるまる [Finder が落ちることは、うちの iMac G5 でもままあります。
killall Finder で Finder だけ再起動できると思います。]

つんつん [(esc) + (option) + (コマンドキー) アプリの強制終了]

青木 [おー、ありがとうございます。今度落ちたら試してみます。]


2007-03-13

やる気レス

激しく less.

ちなみに、ものすごい勢いでファイルを読み込む less コマンドのことではない。

ちなみに、普段は le に alias している。

Java めどい

めどい

現状でも Ruby で 4000 行だから Java だと1 万行は越えるよなあ……。 かったるいなあ……。

超久しぶりに Java 書いたら try 〜 catch の文法を忘れていた。

Mac のポインティングデバイス

俺的には MacBook でもマウスである。 確かにトラックパッドも意外と使いやすいんだけども、 長時間使うならやっぱりマウスがいい。 Mighty Mouse はシンプルな外見に反して実は 4 つボタンがあり、 右クリックもできるし expose も呼び出せるしダッシュボードも起動できる。 かなり便利。

スクロールボタンとサイドボタンの割り当ては 「expose - すべてのウィンドウ」と 「expose - アプリケーションウィンドウ」の 組み合わせが気に入っている。

BIC で Mac

こないだ池袋 BIC で Mac 見てたら F9 が切ってあって愕然とした。 F12 は動くのに。全然ウリがわかってないんだなあと思った。 しかも一番でかいモニタの iMac では Windows XP を起動していた。 本当に何を考えているんだ。 そんなもん、小さいモニタのマシンでこっそり動かしとけ。

Mac OS X でのウィンドウ切り替え

expose でけっこう満足してるんだけども、 やっぱりウィンドウ切り替えはキーボードだけでやりたいときもある。 そんなわけで QuickSilver というのと witch というのを入れてみた。 ……けど、けっきょく使ってなかったりして。

便利だとは思うのだが、なんかめどい。 どうも用途に合わない。

(16:01)

本日のツッコミ (全3件) [ツッコミを入れる]

hisaboh [F9押下後、カーソルキー+enterはどうでしょ。
F9押下後、tabキーというのもありました。
F9とカーソルキーが遠いので、alt+Cmd+↓あたりにexposeを割り当てておくといい感じです。]

gak [Ctrl+F4はどうでしょう。
Cmd+Tabもありますね。]

snip [shinhさんのsevilとか。QuickSilver前提らしいですが。]


2007-03-16

net/http の NTLM 認証

ようやく NTLM 認証パッチとやらをマージした。 ext/Win32API/lib/win32/sspi.rb が増えた。 エラーが全部 RuntimeError で rescue できんので 例外クラスを増やしてくれとリクエストしておいた。 あとは net/http 側で他の認証も合わせて もうちょいうまくマージしたいところだな。

(22:29)

Mac OS X でのウィンドウ切り替え (2)

長くなったんでこっちに。

F4 とかはだいたい試してみたんですが、 なんか微妙に望むものと違うんですよ。 普段は expose でいいんだけども、 原稿書きのときだけ Emacs と特定の端末だけを行き来したいんです。 でも Cmd+Tab だと端末が複数あるときに全部上がってきちゃうので困る。 witch だと option キーが小さすぎるし右にないので困る。 他のは手数が多すぎ。

ようするに Windows の Alt+Tab が欲しいってことか。 witch を Cmd+Tab に割り当てられればいいんだけども、 その設定方法がわからんのです。 普通に設定しようとすると Cmd+Tab が拾われちゃうし、 かといって Cmd+Tab を切る方法もわからない。 ~/Library 以下をいじるとどうにかできたりするのかなあ。

(23:47)

Mac OS X でのウィンドウ切り替え (3)

とりあえず Cmd-1 を使うことにした。

(23:58)

Macな世界とかGPLな世界とか

全部使ってみればいいじゃん。 人生ずっと貧乏が続くわけでもなし。

(00:38)

本日のツッコミ (全4件) [ツッコミを入れる]

Takayama Fumihiko [Cmd + Tab が押されたときは適当なキーコード (Cmd + Shift + Option + Tab とか) を吐くように
KeyRemap4MacBook をいじるのはどうでしょうか。]

青木 [うう、やっぱそうなっちゃいますかね。最後の手段はそれかなあ。]

りんごちゃん [http://www.youtube.com/watch?v=sWa3iuZnHJs
ここで、コマンド+タブに割り当てる方法やってますよ。]

さく [わたしはPullTabでCmd+Tabをカスタマイズ可能にしてWitchに割り当ててました。
と書きつつりんごちゃんさんのリンクを見たらまさにそれですね。]


2007-03-17

単行本フィード

マンガの単行本がいつ出るか知らせてくれる RSS フィードってないんかな。 自分の買ってるシリーズだけ限定で配信されるようなやつ。 こういうのは plagger でできるんだろうか。

http://plagger.g.hatena.ne.jp/SweetPotato/20061119/1163938121

あるらしい。 これは便利そうだなあ。

(11:37)

Leopard

「れぱーど」だったのか。 ずっと「れおぱるど」だと思ってた。

(16:31)

Mac OS X でのウィンドウ切り替え (3)

> ■ りんごちゃん [http://www.youtube.com/watch?v=sWa3iuZnHJs
> ここで、コマンド+タブに割り当てる方法やってますよ。]
>
> ■ さく [わたしはPullTabでCmd+Tabをカスタマイズ可能にしてWitchに割り当ててました。
> と書きつつりんごちゃんさんのリンクを見たらまさにそれですね。]

そっか、PullTab というのを使うとできるんですね。 ありがとうございます。これか。

http://www.ragingmenace.com/software/pulltab/index.html

Dock のロードをフックして Cmd+Tab を取らせないようにするのか。 APE てのが必要らしいけど、 Cmd+Tab だけのために 3 つもソフトウェアを入れるって嫌だな。 もっと単純にできないのかなこれ。

手抜きプログラムで済ませられないか考えてみよう。 APE + PullTab をパラメータ決め打ちで書いたら短かくならないだろうか。 とりあえず APE のソースコードを見てみよ。

……オープンソースじゃないのか。困ったな。

でもまあ、あれだ、ようするに Dock の起動をフックすりゃいいんだから、 なんか手はありそうな気がする。 DYLD_INSERT_LIBRARIES あたりを使えばいいんかな。

(17:44)

Leopard (2)

そういえばサガ 2 でメカの武器に 「レオパルド 2」というのがあったような気がする。 どうやって戦車を装備するのだというツッコミがお約束。

(18:01)

本日のツッコミ (全3件) [ツッコミを入れる]

UmaShika [>ずっと「れおぱるど」だと思ってた。
同じく.. orz]

 [パンター、ティーガー、レオパルド…AFVの血?
(それともパンテル、ティーゲル、レオパルドン!?)
当然ジャギュアと言って周りから…]

スパイダーマン [レオパルドンとおもってました。]


2007-03-18

YARV で BitClust

そーいえば BitClust は YARV で動くんだろうかー、 と思って試してみたらあっさり動いた。 しかし微妙に遅くなっている。0.03 秒くらい。

~/c/bitclust % time ruby bin/refe.rb -d tmpdb strin index >/dev/null
method expand: 0.055 (n_methods:3)
class  expand: 0.008 (n_classes:1)
type   expand: 0.009
ruby bin/refe.rb -d tmpdb strin index > /dev/null  0.19s user 0.07ssystem 68% cpu 0.368 total
 
~/c/bitclust % time ruby-yarv bin/refe.rb -d tmpdb strin index >/dev/null
method expand: 0.062 (n_methods:3)
class  expand: 0.007 (n_classes:1)
type   expand: 0.008
ruby-yarv bin/refe.rb -d tmpdb strin index > /dev/null  0.22s user0.07s system 72% cpu 0.392 total

んー、でも、起動が遅くなっていることも考えると、 実行自体はそれなりに速くなってるんだろうな。 やはりもうちょっと時間のかかるプログラムでないとあまり意味がない。

パースのほうを計測すれば速度差が出るかもな。 ディスク書き込み直前までの実行時間を計測してみよう。

~/c/bitclust % time ruby =bitclust -d ./tmpdb3 update --stdlibtree=../rubydoc/refm/api/src
ruby =bitclust -d ./tmpdb3 update --stdlibtree=../rubydoc/refm/api/src  6.04s user 0.18s system 98% cpu 6.333 total
 
~/c/bitclust % time ruby-yarv =bitclust -d ./tmpdb4 update --stdlibtree=../rubydoc/refm/api/src
ruby-yarv =bitclust -d ./tmpdb4 update --stdlibtree=../rubydoc/refm/api/src  5.95s user 0.20s system 99% cpu 6.161 total

やっぱ微妙に速いな。0.1 秒くらい。 BitClust は I/O と (C レベルの) 文字列処理のかたまりだから、 こんなもんだろうね。

(17:05)


2007-03-19

敗北

しばらく我慢していたがついに Mac に GNU ls を入れてしまった。 ls filename -s ってやることが多いんだよね俺……。

(11:21)

かずひこさん迎撃飲み会

迎撃。フランスだもんなあ。フランスですよ。 気をつけて行ってきてください。

今回は、かずひこさんの壮大にして邪なる計画が明らかになった。 われわれはいかにしてこの強大な力に抗えばよいのであろうか。

akr さんから net/http が遅ぇー、 とのお達しがあったので手抜きコミット。 とりあえずバッファサイズを 1KB → 16KB にしてみた。 なんで select やめたのか調べて、問題なさそうならselect に戻すかな。

モテへの道:最初の飲み会でプロポーズしてはいけない。

(11:56)

size = 26

ruby-reference-manual-diff って ML 名はどう考えても長すぎる。 refm と refm-diff でいいよ。

(23:01)

ReFe2 の高速化 (1)

リファレンスマニュアル計画。 @param とかの仕様を決めたまま実装してなかったので サクッと実装しますか、と思ったのだが、 refe s i とかやると無限ループかよ、 ってほど時間がかかることに気付いてしまった。

s で始まるクラスはすごい多いし、 i は Object のメソッドにひっかかるので、 組み合わせでものすごいたくさんのメソッドにマッチする。 で、そのものすごいたくさんのメソッドを 全部ロードして線型マッチするので遅い、 ということらしい。どちらかと言えば特にロードが遅い。 新 ReFe では、とにかくロードするエントリ数を押さえることが勝利への鍵である。

ReFe2 の高速化 (2)

  • 継承したメソッドをキャッシュしてるのにキャッシュを読んでなかったのを修正
  • キャッシュの持ちかたを変えてファイルアクセスを減らすようにした
  • 名前だけの段階で限界まで候補を減らすようにした
  • マッチした名前が多すぎるときはどうせ一つには決まらないので丁寧な絞り込みをやめた
  • webrick/config の gethostbyname で 0.1 秒くらい損してたので、 必要ないときは require しないように変更した

これで現状見付かっている最悪のケースでこのくらいまで抑えた。

~/c/bitclust % time refe2 -d db.big s i >/dev/null
refe2 -d db.big s i > /dev/null  0.24s user 0.05s system 98% cpu0.290 total

普通はもっと候補が少ないので、もうちょい速い。

~/c/bitclust % time refe2 -d db.big arr map >/dev/null
refe2 -d db.big arr map > /dev/null  0.13s user 0.05s system 97% cpu0.181 total

この速度はかなり限界っぽいよ。

(02:54)

りふぁれんす

http://doc.loveruby.net/refm/api/view/class/Array

全体的に見ためを変えて、一覧ページでは要約だけ出すようにしてみた。

継承したメソッドもいちおう表示してはみたけど、 private メソッドを削ってないせいでエントリが無駄に多い。 system とか出てるし。 コードを改善するまでは名前だけにしておこう。

……というか、同じクラスのメソッドまで出てるなこれ。 なんでだ。

Object のメソッドがえんえん継承されるのも微妙に不便だなあ。 しかしなければないで困るような気もする。

クラスごとにまとめるかなあ。

名前をキーにして継承したメソッドを 全部同列に並べるオプションも欲しいところだ。

りふぁれんす (2)

そして @param 関係はまたしても先送りにされている罠

(03:09)

本日のツッコミ (全2件) [ツッコミを入れる]

かずひこ [このエントリを読んだ人は、私が最初の飲み会でプロポーズしたと誤解しそうじゃないですか! めっそうもない!]

青木 [言われてみるとそう見えなくもない (笑)。順番変えました。]


2007-03-21

『数学ガール・ミルカさんとテトラちゃん』

http://www.hyuki.com/girl/

結城さんの新作が発表されましたね。 ときどき結城さんの日記で連載されていたやつの書籍化です。 実はレビューさせてもらってたんですが、 一言で感想を言うのは難しいので印象に残ったところをピックアップしてみたい。

蹴りたいのは背中だけではなかった。 「よ?」(nil)。ミルカさんのツンデレ比率 9:1 (当社計測)。 フィボナッチ・サイン (なぜか ONE PIECE を思い出した)。 で、24 乗根。

てことで俺も買うから君も買え。

(15:02)


2007-03-22

Cflat (Java 版)

パーサジェネレータは悩んだすえに JavaCC + jjtree を使うことにした。

この記述の冗長さはどうにかしてほしい。 なんで nonterminal にカッコつけるんだよ?! "AST" + nonterminal 名がノード名っていう jjtree のデフォルトも気に入らねえし。 nonterminal のシンボルは小文字で始めさせてくれ。

値をとるときに val = って書くのもイマイチだよなあ。 肝心の規則が見づらくなる。俺としては二次元的に

<TERM> <TERM> <TERM>
a      b      c

って書くのがいいと思うんだ。

LL(k) はわりと便利。 でもやっぱ演算子優先順位の処理が面倒だな。

(12:44)

Cflat コンパイラ / Java (2)

~/c/stdcompiler/src % cat test1.cb
int
main(int argc, char **argv)
{
     printf("Hello, World!\n");
     return 0;
}
~/c/stdcompiler/src % java -classpath build/classes Compiler --dump-ast test1.cb
ToplevelNode
ListNode
ListNode
   DefunNode
    TypeNode
    FixedParamsNode
     SlotNode
      TypeNode
     SlotNode
      TypeNode
    ScopeNode
     ListNode
     BlockNode
      FuncallNode
       VariableNode
       ListNode
        StringLiteralNode
      ReturnNode
       IntegerLiteralNode

← いまココ

(16:26)

Cflat コンパイラ / Java (3)

しまった! 原稿レポジトリの下に入れてしまった。 cflat レポジトリに入れるべきだったな。

(16:28)

Cflat コンパイラ / Java (4)

やっぱ Ruby は偉大だ……。

(17:49)

本日のツッコミ (全2件) [ツッコミを入れる]

みずしま [こんにちは。

> なんで nonterminal にカッコつけるんだよ?!

一応理由はあって、nonterminalの呼び出し時に引数を渡すためなんですが、
ほとんどの場合、引数なんか渡さないんだから括弧は省略させてくれよ!と
思ったことはあります。

> 二次元的に
> <TERM> <TERM> <TERM>
> a b c
> って書くのがいいと思うんだ。

これだと逆に、nonterminalの定義を変更して、TERMを追加したりしたとき、
<TERM> <NEWTERM> <TERM> <TERM>
a b c d

のようにいちいちそれにあわせて名前の位置をずらさなきゃならないという
デメリットがあるので、どっちがいいかは一概には言えないような。]

青木 [書くほうの手間をとるか、読むほうの手間をとるかによるでしょうね。わたしは読みやすければちょっとくらい書く手間が増えてもいいと思います。それに、規則を変えたらどうせアクションとかも変わるんだろうし、そんなところでせせこましくタイプ量を節約してもしかたないんじゃないですか。]


2007-03-25

英雄伝説 空の軌跡 the 3rd

http://www.falcom.com/info/index.html

とりあえず叫ぶよ! 俺は!

英雄伝説の新作きたあああああ―――――――――――!!

次はキャラとか変えてくると思ってたので空の続きになったのは意外だ。 さすがに次はリベールじゃないんだろうな。 おれ SC だけでもリベール 3 周したし。 やっぱ SC のラストの流れからして帝国の旅かな。 とするとオリビエは出てきそうだけどクローゼはどうなんだろう……。 ジンさんはどこでも来てくれそうだ。 アガット&ティータはギリギリか。 でもなんとか理屈をつけて出して全員出してくれそうな気もするね。

あれ? あと一人いたような。ジョゼットだ。 ……いやわかってますよシェラ姉ね。

というかそもそも主人公はエステルなのか。 SC でレベル 90 以上いったんだから 今回はその続きというわけにもいかないだろうし。 エステルヨシュアがレベル 1 からってのもなんか変だし。 遊撃士ランクももう上がない。 いや S 級が目標ってのもありうるのか。 ケビンが主人公だとしっくりこないしなあ。 一番前面の人もものすごく主人公っぽくないビジュアルだし。 つーか、SC のラストで父ちゃんが 「他の者たちが担うことになるだろう」 って言ってたのはどうなったんだ。

今回は「4th に続く」は勘弁してほしい。

いまからラスダン&ラスボスの音楽が楽しみでならない。 そういえば音楽はまた同じテーマを使うのかな。 また同じだとさすがに飽きそうだが、 しかし変わったらそれはそれでイメージが違うとかの不安が……。

リシャール大佐はどこで出てくるんだろう。 リベール外で出番があるのか。

もしかして別の国だと遊撃士ランクはリセットされる? いやそんなことないよな遊撃士協会はインターナショナルな組織だったはずだ。

そうか帝国だけじゃなくて各国を順番にまわるという可能性もあるか。 あ、これいいなあ。例のなんとか自治区に行けばティータも出せるし、 共和国に行けばジンさんが出せるじゃん。 んで最終章がリベール決戦とかだと燃える。 あーでもそれは二回やったしマンネリ感が出てしまうか。 むしろ帝国首都決戦かな。

FC で、グランセルに全員が集まってくるあたりがすごく好きなんだよなー。 あまりにベタだけどそれがよい。 王城突入からレーヴェ戦につづいてエレベータで降りていって ラストダンジョンの音楽がかかるあたりが最高です。

SC はグランセル襲撃からリベルアーク不時着までがいい。 アルセイユのムービーのあたりで燃えメーターが振り切れた。 でもあのムービー作ったところでスタッフが 力尽きたのかってくらいリベルアーク内部は残念な感じ。 というかその前の四輪の塔も残念な感じ。 執行者が 4 人いるからって同じことを 4 回やらなくてもいいのにさ。 そのへんのバリエーションは FC のほうがよくできていた。

そういや妙に操作しづらいメニューを改善してほしい。 いまどこにフォーカスが当たってるのかわかんないんだよね。

またフルブラン出ないかなあ。 なんかウェブのレビュー見てるとあのなぞなぞがすげー不評なんだけど、 俺はフルブラン大好きです。 敵を倒すだけの手配魔獣クエストより全然おもしろいじゃん。 遊撃士協会の看板を盗んでいくあたりがお茶目だし。

学園祭も大好きだけど。 あのイベントで空の軌跡を抜け出せなくなったんだよな。 そこまではチマチマやってたけど、 学園祭からは 1 日 1 章の勢いでクリアしたから。

その他に印象に残ってる依頼と言えばツァイスの部品探し、 ツァイスの「臨時司書の残業」シリーズ、 ツァイスのスニーカー試作……って、ツァイスばっかりかよ。

ま、何にしてもこれは買うね! たとえパソコン本体ごとでも買うよ俺は!

(00:59)


2007-03-27

MacBook / メモリが足りない

メモリ不足が限界。 Safari のウィンドウ切り替えが遅い、 ダッシュボード出るのが遅い、 アプリケーション切り替えで待たされる、 端末から Safari に切り替えて調べものして戻ってくると ruby の起動が遅い、javac の起動はもっと遅い遅い遅い。 もう我慢できん。 1GB 捨てるのがもったいねーとか言ってないで 2GB にする。

(20:32)

『Rubyist Magazine 出張版 正しいRubyコードの書き方講座』

http://book.mycom.co.jp/book/978-4-8399-2320-4/978-4-8399-2320-4.shtml

るびま本、ようやく出ます。 この本は Rubyist Magazine の添削連載の書籍化です。 既存の記事すべてに加えて書き下ろしが一本入っています。 さらに、 まつもとさん、たださん、咳さん、角谷さん、西山さん、ささださん という豪華メンバーによるコラムもついて超おとく。 公式には 3 月 27 日発売ですが、年度末ゆえ、 店頭に並ぶのはもう少しあとになるようです。

サポートサイトはこちら。

http://i.loveruby.net/ja/rubimabook/

この本のウリは、ズバリ! コラムです。コラム。 このメンバーを集めた時点でほぼ勝ちは決まったようなもんです。

添削はウェブ版に加筆訂正したもの、ということになっていますが、 実際は訂正するばっかりでほとんど加筆していません。 いや、だって、 ただでさえ長い添削記事に加筆したら誰も読み切れないので。 代わりに、連載時はイマイチめだってなかった 「添削ポイント」を本文中で明示したうえ、ID を割り当てて、 本全体を通して相互参照できるようにしてあります。 これでかなりリファレンス的な価値は高まったんではないかと思います。 すえながーく使っていただければ。

(00:47)

本日のツッコミ (全3件) [ツッコミを入れる]

ゆーぼー [ようし、即買い。Rubyって手抜きを結構許しているので、他人の書いたスクリプトを見て驚くことばかり。精神は一つでも、作法は自分で決めてね。というスタイルですね。Railsやっていますが嵌りっぱなしで浮き上がれません。]

斎藤ただし [次はぜひmorqを添削してください ;)]

青木 [ありがとうございます。他の人のコードを見るのは勉強になりますね。わたしも添削していて逆に新しいことに気付いたりします。

>斉藤さん
いや morq はなんか添削してはいけないような気がしますです、はい]


2007-03-29

マルチバイト対応 Subversion 用コミットメールスクリプト

Subversion のコミットメール (のログ) が化けるよー!

ということで、いったい何人が書きなおしてるのかわからんが Subversion のコミットメールスクリプトを書き直してみた。

メール送信は SMTP を使う。 レポジトリのエンコーディングとかの環境に依存する部分は 全部コマンドラインオプションから指定させる仕様にした。 詳しくは --help 見てね。

% svn-commit-mail.rb --help
Usage: svn-commit-mail.rb [options] <repository> <rev>
         --svnlook=PATH               svnlook command location.(default:/opt/local/bin/svnlook)
         --host=NAME                  SMTP server address.
         --port=NUM                   SMTP server port.
         --from=ADDR                  Mail from.
         --to=ADDR                    Mail to.
         --repository-encoding=NAME   Character encoding ofrepository content.
         --mail-encoding=NAME         Character encoding of the mail.
         --diff-deleted               Create diff for deleted files
         --debug-smtp-mailer          Dumps SMTP session.
         --help                       Prints this message and quit.

ちなみに --to は複数指定可能。

リファレンスマニュアルのソースコードは euc-jp で コミットログは UTF-8 だけども、 いまんとこ化けずに送れているようだ。

……よく考えると、メール送信は別のプログラムにして パイプでつないだほうが利便性が高いような気がするな。 まあ、それだと今度は --to と --from を二回指定するのがめどいか。 いや To: と From: だけ送信プログラムのほうに生成させればいいのか?

(11:38)


2007-03-30

MacBook のメモリ増設

MacBook のメモリを増設して 2GB にしてみた。

2GHz, 2way, 2GB という「2」尽くしなスペックになった。 HDD も 200GB だとモアベターだが、残念なことに 80GBである。

空きメモリがガバッと増えて、 いまのところはかなりスカスカ動いている。 しかし 3 日くらい使い続けたあとでないと真価はわからない。

ちなみにメモリは秋葉原のドスパラで売っていた 1GB 9800 円のバルクモジュール。 チップも得体の知れない安物なのでちょっと心配だ。

(00:14)

Mac OS X 最大の利点はテキスト入出力にあり

MacBook を買って 2 ヶ月くらいたったいまになっても、 おれは次も Mac を買おうと心に決めている。 その原因は何なのか冷静に反省してみたところ、 テキスト入出力環境が主因ではないかと思う。 すなわち、

  • そこそこまともな端末エミュレータがある
  • ほとんどすべてのテキストウィジェットで Emacs キーバインドが使える
  • テキストウィジェットでまともに SKK が使える
  • フォント表示がきれい

という 4 点だ。

おれがコンピュータを使う目的は ウェブとメールとプログラミングと原稿書きである。 その 4 つすべてにおいてテキスト表示は重要であり、 また 3 つにおいてテキスト入力が中心的な役割を占める。 したがってテキストの入力と表示の品質がコンピュータ全体の使い勝手を左右する。 その観点において、Mac OS X はおれの嗜好に激しく合っている。 どのような点でおれの嗜好に合っているのか、順番に詳しく述べる。

第一点。まともな端末エミュレータがあること。 シェルが使えない環境で作業するなんておれは無理だ。 プログラミングは端末で zsh と vi を使いたいし、 原稿書きには ReVIEW が動かないと困る。 Windows は「まっとうな」シェル環境を使えるようにするだけで 疲れるから嫌だ。

第二点。いろいろなところで Emacs バインドが使えること。 Mac OS X ではいろいろなウィジェットで Emacs バインドが使える。 構造的には、Cocoa (というか CoreFoundation?) のNSText なんたらの デフォルトが Emacs キーバインドになっているかららしい。 当然カスタマイズもできる。スゲー。

第三点。AquaSKK がヒジョーに、ヒジョーによくできてる。 Emacs のオリジナル SKK (と ddskk) 以外で おれの嗜好に合う SKK は AquaSKK が初めてであった。 具体的には、

  • ひらがなと同じようにカタカナを変換できること (例えば「ヘンカン」を変換できる)
  • 「z[」で「『」などの、z を使ったキーバインドが使えること

この二つの機能がある。それだけ。 こんなの実装するのは超簡単なはずなんだけど、 なぜか実装してない SKK が多くて嫌になる。

あと、安定してることも重要。 Debian の skkinput は、AMD64 だからかもしんないけど、 しょっちゅう落ちてた。あれはいくらなんでも落ちすぎ。 Windows の SKK IME もときどき落ちてた。 しかもアプリケーションを切り替えてると挙動がおかしくなったり、 知らないうちに MS IME に切り替わってたりもした。 そういう変なトラブルが起きると追跡する気力も起きない。 AquaSKK はまだ一回もそういうウンザリゲンナリな 挙動を起こしてないので非常に印象がよい (これから悪くなるかもしれない)。

最後に第四点。フォント表示がきれい。 これは単にヒラギノの品質が高いということにとどまらず、 OS X のフォント描画エンジンまでひっくるめて品質が高いからこそだと思う。 メイリオを OS X で表示させるとけっこうきれいに描画されるって話もあるし。 おれも OS X を使い始めるまでは フォントなんてどうでもいいと思ってたけど、 この美しさは一回知ってしまったらもう戻れないね。 少なくとも、Windows や Linux の既存の表示で満足することはもう永久にない。 ちなみに「既存の表示」には Vista (メイリオ) も含む。

以上の四点が、おれが OS X を使い続けたいと思う理由である。 expose やダッシュボードも好きだけど、 「ぜひ使い続けたい」と思うほどの理由ではない。 逆に嫌な点もやっぱりあるけども、 「もう OS X は使いたくない」と思わせるほどには嫌ではない。

(01:27)

Mac OS X で嫌なところ

OS X の好きなところを書いたので、 嫌いなところもいちおう書いておきたい。

  • Command / Ctrl / Option / CapsLock はカスタマイズできるのに「カナかな」「英数」キーがカスタマイズできない

どう見ても片手落ちです。 Apple 日本支社はもっと強力に要求をねじこんでいただきたい。

  • 右 Command をつけろ

enter とかいらないから give me Command

  • PageUp に対応するキーバインドを用意してほしい

ようするに Alt-V な。 Command-V がペーストだから割り当てられないのはわかるけど、 本当に本当に本当にどうにかしてください。

  • 「戻る」「次のタブ」「前のタブ」のキーバインドを標準化してほしい

Finder と Safari と iTerm で全部キーバインドが違うのはどーいうことよ。 こんなんだったら全部ブラウザに合わせて Alt + ← に統一した Windows のがいいよ。 こういうときこそ強権を発動して HIG で統一すべきだろ。

  • Command-Tab をカスタマイズさせろ

割り当てを変えられるか、 またはアプリごと / ウィンドウごとを選択させてほしい。

  • Apple Mail の行折り返し

あれマジでやめてください。

(01:57)

Safari のキャッシュがなんか変

Safari のキャッシュまわりがどっかおかしいような気がする。 アンテナのページをリロードすると文字化けしたり、 日記をリロードすると一部の画像が表示されなくなったりする。 んでキャッシュを捨てると直る。 なんだろうなこの症状は。 HTTP ヘッダの情報のキャッシュされかたがおかしいとか、 そういう感じなのかなあ。

(02:20)

本日のツッコミ (全2件) [ツッコミを入れる]

りんごちゃん [MacOSXのキーバインドについては以下のページが詳しいです。
PageUp程度ならoption-v等に割り当てることで解決可能かもしれません。
http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html]

青木 [なるほど、これは便利そう。ありがとうございます。option はちょっと小さいかな……。とりあえず指の配置が近いところで Command-B に割り当ててみました。]


2007-03-31

ケータイ変えた

携帯を変えてみた。W43HII という機種。 どうせメールしか使ってないから一番安いのでいいかなーと思ったんだけど、 1 万円出すとワンセグケータイが買えるというのでそれを買ってみた。

へー。けっこうきれいに見えるんだなあ。 ちゃんとワイド画面で表示されている。 映像が切れたりもしないし、たいしたもんだ。 地震以外でテレビを見るのは何ヶ月ぶりだろう。

それはそれとして、デフォルトのメニューが酷い。 何が酷いって、メニュー項目がフラフラ動いてんの。 わざわざ選択しにくくしてどうするんだよ。 速攻で別のメニューに変えたけど、シンプルなのがない。 アニメーションとかどうでもいいから、 シンプルで見やすいのをつけてほしい。

あとフォントも酷い。 この汚なさはありえない。 解像度が高くなってるくせにフォントの品質が上がってないから無惨だ。 しかも半角カナを使いまくってるから汚なさ倍増。 待ち受け画像とかより、フォントを変えられるようにすべきだな。

ついでに配色も酷いな。 どうしてフォントが汚なく見える配色しかないんだろうか。 待ち受け画像とかより、以下略

(12:20)

あと 2 日

激しく鬱。

(13:05)

やる気レス

ここ数日のやる気なさは異常

(14:37)

やる気レス 2

単に眠いだけのような気がしないでもない。 本当に眠い。つくづく眠い。

あー。どうせ起きてても活動する気は起きないし、もう寝よかな……。

(14:40)

ruby-core

3 月からとつぜん ruby-core というか ruby-Bugs が 活発になったような気がするんだけど、なんか原因があるのかな。

(14:42)

MacBook のメモリ増設 (3)

さっきから iPhoto でサムネイルを無駄にスクロールしたり 無駄に Safari でタブを大量に開いたり 何度も ruby をコンパイルしたりして空きメモリをなくしてみた (「非使用中」メモリはある) んだけど、全然遅くならないね。 すばらすい。2 万円分の効果はあったらしい。

(16:17)

やる気レス III

ちょっと元気を出して net/http の 「Connection: ヘッダの扱いがなんかおかしいよバグ」 を修正しようと思ったら make test-all TESTS=net/http した瞬間にバスエラーで落ちた。 これはもう寝ろってことだよな。うん。しょうがないよバスエラーだし。

(16:19)

『On Lisp』

On Lisp 届いた。思ったより小さくて薄いな。

(01:17)

Frequently Asked Question

Q. 冷蔵庫の奥でキュウリが液状化していました。 これからの人生、なにに気をつけて生きていけばいいでしょうか。

A. 人生まで液状化しないように気をつけろ

(03:10)

本日のツッコミ (全2件) [ツッコミを入れる]

なかだ [活発になったというか、コメントがつくたびに過去のコメントも全部含めて新規スレッドでfeedしなおす、という凶悪なことをはじめたから > ruby-Bugs]

青木 [あー、それで同じ Subject のがいっぱいあるんですか。スレッドをメールで再現してくれるといいのになあ。]


<前月 | 最新 | 次月>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS