http://www.iwill-japan.co.jp/whats_new/SeeMore.asp?vID=78
Iwill Japan 撤退だと―――――――――――――っ!? 俺はどこから DK8ES を買ったらいいんだよ! 嫌だー HDAM Express は嫌だああああああああ
(14:42)
Ajax かあ。ネーミングも JavaScript 使いまくりなとこも嫌だが インクリメンタルサーチばっかり例に出されるのが何より嫌だ。 俺はインクリメンタルサーチなんて大嫌いだ!
いいかおまいら、今そこにメイドさんがいて御主人様からの命令を待っていると考えてください! ちゃんと最後まで命令を聞いてから行動を始めるメイドさんと、 命令の途中で仕事にとりかかるメイドさんと、どっちを選ぶわけ? そりゃ前者でしょ、フツーそうだよ、間違いないよ。
というわけで命令を最後まで聞かず動きはじめるインクリメンタルサーチは悪。 言うことは最後まで聞け!
(15:58)
なんで Emacs が嫌いって、 インクリメンタルサーチがデフォルトなのもデカいな。 他にもカーソルの動きかたが気に食わんとか、 勝手に人の書いた文字を消すとか、いろいろあるけど。
(16:10)
せめて打鍵の間隔が空いたときをみはからって 結果を表示するくらいの奥ゆかしさを発揮できないもんかなあ。 バカ正直にキーを打つたびにパカパカ表示を変えやがって。 目がチカチカして実に見苦しい。
あー、そうですか富豪プログラミングですか。 けっ、マシンパワーを無駄遣いしてれば富豪かよ。アホくさ。
(16:31)
8 年使った EIZO E55D がついに死亡。 困ったなあ、これから Windows マシンをどうしよう。 モニタ買う金なんかないし、 とりあえずメインの L665 を CPU 切替器につないで共有するしかないか。
(23:51)
また忘れたし。このさい毎日 reminder 流すか。
それはともあれ、もうじき ruby-dev summary を 始めてから 10000 通を突破しそうだな。 ruby-dev summary はこのへんからどぞー↓
(23:53)
http://hotwired.goo.ne.jp/news/technology/story/20050303303.html
だってさ。PDF のサンプルを読んでみると、 カバーする範囲は『CPUの創りかた』と似ているようだ。 しかし成果物が Apple I というのがいいなあ。
(13:35)
少なくともぼくにとっては JavaScript が言語としてどうかは問題ではありません。 (HTML only) と (HTML + JavaScript/Java/ActiveX) の差を問題にしています。
ちなみにこの日記にも JavaScript がひっついてきますが、それはオフにできるし、 オフにしても読むうえで問題がない部分だからどうでもいいんです。 でもサービスを受けるために JavaScript オンを強制されるのは嫌。
付け加えれば、 新しい技術は嫌いつつ吸収するというのがぼくのスタイルでもあります。 たぶん一年くらいしたら何食わぬ顔して Ajax 使ってるんじゃないかな。
でもインクリメンタルサーチだけは実装しません。意地で。
(13:46)
出たらしい。objdir を分けると楽にコンパイルできそうである。
~/obj % mkdir ruby-yarv; cd ruby-yarv ~/obj/ruby-yarv % cp ../../src/ruby/eval.c . ~/obj/ruby-yarv % patch -p0 < ../../src/yarv-0.2.0/evalc.patch ~/obj/ruby-yarv % ../../src/ruby/configure --prefix=/usr/pkg/ruby-yarv --disable-install-doc && make && make test && sudo make install ~/obj/ruby-yarv % cd .. ~/obj % mkdir yarv-0.2.0; cd yarv-0.2.0 ~/obj/yarv-0.2.0 % /usr/pkg/ruby-yarv/bin/ruby extconf.rb && make && sudo make install gcc -fPIC -g -O2 -I. -I/usr/pkg/ruby-yarv/lib/ruby/1.9/i686-linux -I/usr/pkg/ruby-yarv/lib/ruby/1.9/i686-linux -I. -DDISPATCH_THREADED_CODE -DDISPATCH_DIRECT_THREADED_CODE -DOPT_BASIC_OPERATIONS -DOPT_REGEXP_MATCH -DOPT_INSNS_UNIFICATION -DOPT_STACK_CACHING -DINLINE_METHOD_CACHE -DHAVE_TYPE_ULONG -c compile.c In file included from compile.c:39: optunifs.inc:126: parse error before `struct' optunifs.inc:133: parse error before `for' optunifs.inc:134: conflicting types for `iv' optunifs.inc:130: previous declaration of `iv' optunifs.inc:134: `insns' undeclared here (not in a function) optunifs.inc:134: warning: data definition has no type or storage class optunifs.inc:134: parse error before `}' optunifs.inc:135: parse error before `->' optunifs.inc:135: conflicting types for `rb_ary_concat' /usr/pkg/ruby-yarv/lib/ruby/1.9/i686-linux/intern.h:58: previous declaration of `rb_ary_concat' optunifs.inc:135: warning: data definition has no type or storage class optunifs.inc: In function `insns_unification': optunifs.inc:150: stray '\' in program optunifs.inc:150: parse error before `;' optunifs.inc:161: stray '\' in program optunifs.inc:161: parse error before `!=' optunifs.inc:166: `unified' undeclared (first use in this function) optunifs.inc:166: (Each undeclared identifier is reported only once optunifs.inc:166: for each function it appears in.) optunifs.inc:173: `insn' undeclared (first use in this function) optunifs.inc: At top level: optunifs.inc:176: parse error before `return' make: *** [compile.o] Error 1
あれ? ……ああ、CR LF か。
~/obj/yarv-0.2.0 % for i (*.c *.h *.inc **/*.rb) { tounix $i > tmp; mv tmp $i }
で、make benchmark までは何事もなく行ってしまったので以下略。
次、AlphaServer DS20E で試す。
環境
tunami:~/src/yarv-0.2.0 % uname -srm OSF1 V5.1 alpha tunami:~/src/yarv-0.2.0 % gcc --version gcc (GCC) 3.4.3 Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. tunami:~/src/yarv-0.2.0 % /usr/local/pkg/ruby-yarv/bin/ruby --version ruby 1.9.0 (2005-03-03) [alphaev6-osf5.1b] tunami:~/src/yarv-0.2.0 % grep CFLAGS Makefile CFLAGS = -mieee -O2 -mcpu=ev6
あっさりと動いたのでベンチマークとアセンブリ出力だけはっとこ。
i686-linux だとベンチマークは平均 5.08 倍速になっているが、 Alpha EV6 だと 2.26 倍になってしまった。 個人的には 2 倍になってりゃ十分だと思うんだが、 so_object で YARV のほうが遅くなっているのが気になる。 これが遅くなるということは、一般的なプログラムも遅くなる可能性があるからだ。
(18:03)
■ ささだ [ありがとうございます。so_object は GC の実行時間が支配的ですが、まだ GC のチューニング(mark する領域について)をしていません。]
http://www.rubyist.net/~matz/20050309.html#p03
* ブロックパラメータ名が外側のローカル変数と重複したらエラー(前田くんの勝ち)※
やったー! 俺もこのほうがいいと思ってたんだよ。 変数のネストなんてないほうが絶対すっきりするって。
(19:52)
ょゎさんとこで発覚した現象だが、 Ruby CVS HEAD で tDiary を動かすとデータファイルが消える。
結論から言うと原因はこれ。 このコードは tdiary/default.rb 1.23 で入っているので、 tDiary 1.5.3 以降の全バージョンで発現すると思われる。
--- tdiary/defaultio.rb 2 Aug 2004 12:54:12 -0000 1.1.1.2 +++ tdiary/defaultio.rb 24 Mar 2005 02:11:52 -0000 1.2 @@ -189,8 +189,8 @@ while l = fh.gets( "\n.\n" ) begin headers, body = TDiary::parse_tdiary( l ) - style = headers['Format'] || 'tDiary' - diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" ) + _style = headers['Format'] || 'tDiary' + diary = eval( "#{style( _style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" ) diary.show( headers['Visible'] == 'true' ? true : false ) diaries[headers['Date']] = diary rescue NameError
該当コードを発見する方法…… ruby に -d をつける
しかし、例外が起こるとファイルが消えるというのもそれはそれで変だな。 何が起こっているのだろう。
あー、わかった。
def restore( fh, diaries ) : (前半略) : # read and parse diary while l = fh.gets( "\n.\n" ) begin headers, body = TDiary::parse_tdiary( l ) style = headers['Format'] || 'tDiary' diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" ) diary.show( headers['Visible'] == 'true' ? true : false ) diaries[headers['Date']] = diary rescue NameError rescue raise end end ensure fh.flock( File::LOCK_UN ) end end
style(style) の行で NoMethodError が起こるが それは NameError の下位クラスなので rescue されてなかったことになり、 ファイルには記録がないことになる。 で、消してるのはここか。
module tDiary class DefaultIO def transaction( date ) : : if diaries.empty? File::delete( @dfile ) # also delete parser cache @tdiary.store_parser_cache( date, nil, nil) end
ちなみに、ここはロックされてないように見える。 restore から store の間に別のプロセスが 記事を追加していたら、それを消してしまう可能性があるのではないか。 ……とは言え、相当なレアケースだからどうでもいいような気もするな。
(16:45)
I/O してると Ruby CVS HEAD でシグナルがきかなるよ問題。
loop { sleep 1 } では死にきれないことがあったので、 結局 nonblocking mode と select(2) を使うことにした。 これでしばらく様子を見よう。
(03:16)
あれ? RAA から fcgi が消えてる。 そうか、こないだの RAA 整理で消えたのか。
うーん、ソースがないのも不便だよなあ。 せめて fcgi.rb だけでも見える場所に置いておくか。
(03:37)
■
ma2 [ちょっと前にfcgi.rbをWindowsで使ったのですが,
> trap('SIGPIPE','IGNORE')
これがWindowsではエラーになってしまうようです(SIGPIPEが存在しないため?)。
・WindowsXP Pro (SP2)
・ruby 1.8.1 (2003-12-25) [i386-mswin32]]
■
青木 [追試してみました。シグナルと、最近入った
nonblocking 関係を外せば動作するようです。
ただ、Win32 だとシグナルの代わりにメッセージを
使うみたいなので、これに対応しないと実用に
ならないだろうと思います。
ちなみに、fcgi.rb 以外の環境は何をお使いでしょうか?]
■
ma2 [fcgi.rb以外の環境というとサーバの環境でしょうか。
Apache 1.3.33(win)
mod_fastcgi 2.4.1
で使っています。
cgi周りは標準のcgi.rbに堀川さんのcgisup.rbをかませて,1.6/1.8の互換環境にしています。]
■
青木 [そうか、Windows でも Apache 動くんでしたっけ。
なぜかすっきり忘れてました。
で、ちょっと Apache2 で試してみましたが、「動作
しますね」は嘘すぎました。どうも最初の FCGI.cgi?
がすでに動作していないようです。FastCGI development
kit の Windows 対応コードを見るかぎり、pure Ruby
で対応するのは凄まじく面倒そうです。
当面あきらめます。]
■
ma2 [了解しました。
では無理せず?Unix系(うちはSolarisかFreeBSDなんですが)で使います。]
ちょっと待て! もしかして Rails の ActionMailerって TMail 使ってんの?! なんか Rails な人は TMail 併用率が高いなあと思ってたら、 そういうことか……。
そういえば Rails のソースツリーを見たときに vendor/tmail というのがあったような気がする。 でも「ああ、俺のと名前がかぶってる」と思って終わりだったんだ。 それくらい予想外だったってことか。 やばいな、いきなり蚊帳の外でいられなくなってしまった。 もうちょっと真面目にメンテしようかな。
とか言ってると、やることが加速的に増えていくんだよなあ。 ただでさえスラッシング気味なのはどうにかしないと。
あ、最近妙に TMail のダウンロードが多いのも Rails の影響なんだな。また一つ謎が解明された。
TMail と言えば、かねがね直したいと思っているところがいくつかある。
「構造を簡単に」 「インターフェイスを簡単に」 「ソースコードを簡単に」 の方向で改変していきたい。
(21:13)
I/O + シグナルがらみで再度問題に遭遇した。 以下のような cat コマンドで stdin を読むと Ctrl-C が効かない。
Signal.trap(:INT) { exit 1 } Signal.trap(:PIPE, "IGNORE") while s = ARGF.read(1024) print s end
fcgi.rb まわりで得た経験のおかげで今回はすぐに回避方法がわかる。 Signal.trap(:INT, "EXIT") にするか、 シグナルをトラップするのをやめて例外 Interrupt を rescue すればよい。
しかし、なんかめんどくさいなあ……。 せめて「シグナルを受けたら、スタックトレースを吐かずに異常終了する」 という選択肢が欲しいところだ。 パイプラインの途中でトレースを吐かれるのは邪魔すぎる。 例えば Signal.trap(sig, "ERROR_EXIT") というのはどうだろう。
(21:25)
『エキスパート C プログラミング』には 「三項演算子くらい使えるようになっとけ」 みたいなことが書いてあったなあ (p.195)。 それまではなんとなく使わないほうがいいのかなあと 思ってたけど、それを読んでからは気にせず使うようになったんだ。
ただ、C は別にいいんだけど、むしろ Ruby がちょっとねえ。 Ruby だと真偽値を返すメソッドに「?」が付いてるから
obj.m? ? t : f
となって「?」が重なってしまう。
a==b ? t : f
くらいならいいんだが。
ちなみに
expr ? expr : f
は
expr || f
じゃん? 副作用は入ってないと考えてさ。 三項演算子はそれの同類 (として使えるもの) だと思うんだよな。 二つまとめて「オブジェクト選択演算子」とでも呼んだらどうだろう。
※ Ruby の場合、 a ? x : y は条件 a によって x か y を選択し、 x || y は x の存在に基いて x か y を選択していると考えられる。
(21:49)
■ taimamiso [TMailは3〜4年使っていますが、これほどマニュアルも整備されていて、歴史もあって、多様なメールに対応しているライブラリってRubyには他に無い、JavaでいうJavaMailに相当するくらい、不可欠なんじゃないかと思っています。なので、「1.0 にむけて かなり仕様・実装を変更しまくる」という方針がちょっと気になってしまいます。ああ、今TMail使っているけど、後々新バージョンへの対応が大変になるかもなあ…とか思いながらコードを書いちゃうので。]
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ ただただし [命令の途中で仕事を始めるメイドさんの方が、おっちょこちょいぽくて萌える。]
■ 青木 [インクリメンタルサーチはドジって
転んだりしないので萌えません!]
■ しぎたに [インクリメンタルサーチはうろ覚えな文字を検索するときにちょこっとだけ重宝します
正規表現使えよ、とも思うのですが、emacsの正規表現はエスケープ仕様を覚えられませんので(^^;]
■ hyuki [結城もインクリメンタルサーチは苦手。ところで今日、青木さんはインクリメンタルに日記更新してますね :-)]