history

青木日記 RSS

<前月 | 最新 | 次月>

2005-03-01

Iwill Japan 撤退

http://www.iwill-japan.co.jp/whats_new/SeeMore.asp?vID=78

Iwill Japan 撤退だと―――――――――――――っ!? 俺はどこから DK8ES を買ったらいいんだよ! 嫌だー HDAM Express は嫌だああああああああ

(14:42)

IE

透過 PNG はだめなんだっけ……

(17:58)


2005-03-02

インクリメンタルサーチが嫌い (1) Ajax

Ajax かあ。ネーミングも JavaScript 使いまくりなとこも嫌だが インクリメンタルサーチばっかり例に出されるのが何より嫌だ。 俺はインクリメンタルサーチなんて大嫌いだ!

いいかおまいら、今そこにメイドさんがいて御主人様からの命令を待っていると考えてください! ちゃんと最後まで命令を聞いてから行動を始めるメイドさんと、 命令の途中で仕事にとりかかるメイドさんと、どっちを選ぶわけ? そりゃ前者でしょ、フツーそうだよ、間違いないよ。

というわけで命令を最後まで聞かず動きはじめるインクリメンタルサーチは悪。 言うことは最後まで聞け!

(15:58)

インクリメンタルサーチが嫌い (2) Emacs

なんで Emacs が嫌いって、 インクリメンタルサーチがデフォルトなのもデカいな。 他にもカーソルの動きかたが気に食わんとか、 勝手に人の書いた文字を消すとか、いろいろあるけど。

(16:10)

インクリメンタルサーチが嫌い (3)

せめて打鍵の間隔が空いたときをみはからって 結果を表示するくらいの奥ゆかしさを発揮できないもんかなあ。 バカ正直にキーを打つたびにパカパカ表示を変えやがって。 目がチカチカして実に見苦しい。

あー、そうですか富豪プログラミングですか。 けっ、マシンパワーを無駄遣いしてれば富豪かよ。アホくさ。

(16:31)

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

ただただし [命令の途中で仕事を始めるメイドさんの方が、おっちょこちょいぽくて萌える。]

青木 [インクリメンタルサーチはドジって
転んだりしないので萌えません!]

しぎたに [インクリメンタルサーチはうろ覚えな文字を検索するときにちょこっとだけ重宝します
正規表現使えよ、とも思うのですが、emacsの正規表現はエスケープ仕様を覚えられませんので(^^;]

hyuki [結城もインクリメンタルサーチは苦手。ところで今日、青木さんはインクリメンタルに日記更新してますね :-)]


2005-03-03

モニタ死亡

8 年使った EIZO E55D がついに死亡。 困ったなあ、これから Windows マシンをどうしよう。 モニタ買う金なんかないし、 とりあえずメインの L665 を CPU 切替器につないで共有するしかないか。

(23:51)

ruby-dev summary

また忘れたし。このさい毎日 reminder 流すか。

それはともあれ、もうじき ruby-dev summary を 始めてから 10000 通を突破しそうだな。 ruby-dev summary はこのへんからどぞー↓

(23:53)


2005-03-04

Apple I を自作してコンピュータの基礎を学ぶ本

http://hotwired.goo.ne.jp/news/technology/story/20050303303.html

だってさ。PDF のサンプルを読んでみると、 カバーする範囲は『CPUの創りかた』と似ているようだ。 しかし成果物が Apple I というのがいいなあ。

(13:35)

JavaScript

少なくともぼくにとっては JavaScript が言語としてどうかは問題ではありません。 (HTML only) と (HTML + JavaScript/Java/ActiveX) の差を問題にしています。

ちなみにこの日記にも JavaScript がひっついてきますが、それはオフにできるし、 オフにしても読むうえで問題がない部分だからどうでもいいんです。 でもサービスを受けるために JavaScript オンを強制されるのは嫌。

付け加えれば、 新しい技術は嫌いつつ吸収するというのがぼくのスタイルでもあります。 たぶん一年くらいしたら何食わぬ顔して Ajax 使ってるんじゃないかな。

でもインクリメンタルサーチだけは実装しません。意地で。

(13:46)

YARV 0.2

http://www.atdot.net/yarv/

出たらしい。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 までは何事もなく行ってしまったので以下略。

YARV 0.2 (2) Alpha EV6

次、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)

壊れていく

今度はラジカセが壊れた……しくしく

CVS レポジトリをバックアップしとこう。

(18:18)

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

ささだ [ありがとうございます。so_object は GC の実行時間が支配的ですが、まだ GC のチューニング(mark する領域について)をしていません。]


2005-03-06

net/http

とりあえずヘッダフィールドの配列化だけ 1.8 にコミット。 他のメソッド追加までやる時間はなかったので……明日か?

(16:44)


2005-03-09

おでかけ

ばーちゃんが危篤というので田舎にいってきた。 つかりた……。

ついでに習字の練習もしてきた。 「永字八法」と言って「永」の字が基本らしい。

Ruby 2.0 のブロックローカル変数仕様案

http://www.rubyist.net/~matz/20050309.html#p03

* ブロックパラメータ名が外側のローカル変数と重複したらエラー(前田くんの勝ち)※

やったー! 俺もこのほうがいいと思ってたんだよ。 変数のネストなんてないほうが絶対すっきりするって。

(19:52)


2005-03-24

Ruby CVS HEAD + tDiary でデータ消滅 (1)

ょゎさんとこで発覚した現象だが、 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 をつける

Ruby CVS HEAD + tDiary でデータ消滅 (2)

しかし、例外が起こるとファイルが消えるというのもそれはそれで変だな。 何が起こっているのだろう。

あー、わかった。

    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)


2005-03-27

fcgi.rb

I/O してると Ruby CVS HEAD でシグナルがきかなるよ問題。

loop { sleep 1 } では死にきれないことがあったので、 結局 nonblocking mode と select(2) を使うことにした。 これでしばらく様子を見よう。

(03:16)

fcgi.rb (2)

SIGUSR1 での graceful exit の実装が おかしかったことも発覚したのでついでに直しておいた。

(03:18)

fcgi.rb (3)

あれ? RAA から fcgi が消えてる。 そうか、こないだの RAA 整理で消えたのか。

うーん、ソースがないのも不便だよなあ。 せめて fcgi.rb だけでも見える場所に置いておくか。

(03:37)

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

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なんですが)で使います。]


2005-03-30

Rails + TMail

ちょっと待て! もしかして Rails の ActionMailerって TMail 使ってんの?! なんか Rails な人は TMail 併用率が高いなあと思ってたら、 そういうことか……。

そういえば Rails のソースツリーを見たときに vendor/tmail というのがあったような気がする。 でも「ああ、俺のと名前がかぶってる」と思って終わりだったんだ。 それくらい予想外だったってことか。 やばいな、いきなり蚊帳の外でいられなくなってしまった。 もうちょっと真面目にメンテしようかな。

とか言ってると、やることが加速的に増えていくんだよなあ。 ただでさえスラッシング気味なのはどうにかしないと。

あ、最近妙に TMail のダウンロードが多いのも Rails の影響なんだな。また一つ謎が解明された。

TMail

TMail と言えば、かねがね直したいと思っているところがいくつかある。

  • メールボディの Base64 エンコーディングを自動解除する
  • MIME B エンコードの高速化
  • フィルタ的な使いかたに対応する (入力と出力をできるだけ同じにする)
  • パーサをシンプルにする
  • メソッド名規則の統一 (互換性を捨てる必要あり)

「構造を簡単に」 「インターフェイスを簡単に」 「ソースコードを簡単に」 の方向で改変していきたい。

(21:13)

I/O operation differs signal handler (再)

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)

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

taimamiso [TMailは3〜4年使っていますが、これほどマニュアルも整備されていて、歴史もあって、多様なメールに対応しているライブラリってRubyには他に無い、JavaでいうJavaMailに相当するくらい、不可欠なんじゃないかと思っています。なので、「1.0 にむけて かなり仕様・実装を変更しまくる」という方針がちょっと気になってしまいます。ああ、今TMail使っているけど、後々新バージョンへの対応が大変になるかもなあ…とか思いながらコードを書いちゃうので。]


<前月 | 最新 | 次月>
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