また悲惨なバグ。今度は metaconfig を使うと動かないらしい。
metaconfig で思い出した。 誰の要望かすっかり忘れたけど 「setup.rb (マルチパッケージ) で、処理するパッケージの順番を指定したい」 っていう要望がありました。 自分では解決した記憶がないんですが、いつのまにか解決されていました。 metaconfig の中で declare_packages(%w( a b c )) とすると a b c の順番で処理されるようになります。
『ANSI Common Lisp』 Paul Graham 著, 久野雅樹・須賀哲夫共訳、 ピアソンエデュケーション, 2002。
だってさー、『Common Lisp 入門』を見ながら Allegro CL で試すと片っ端から仕様が変わってるんだもん。
そういえば Squark の絵本ってやつも見てきました。 あれは……アレは……何?
見事に玉砕。 久しぶりにジャンクという言葉の意味を思い知った。
そういえば『C プログラミング診断室』再版になったんだね。 小さくなってコンパクト (同義反復)。
「Lispのわかりやすさ」from Matz日記
http://www.rubyist.net/~matz/?date=20030909#p01
この話題に関連していいフレーズを思いついたんですが、 微妙に話がずれてるのでここに書いておきます。
それゆえ、Lisp は強力で、簡潔に書ける。 しかし、読みやすいとは限らない。 のではないかと思うのです。
tmpdir.rb と tempfile.rb の「e」の違いが気になって気になってしかたがない。
こういう感じの働きをする Enumerable#max_by, min_by が欲しくなった。
module Enumerable
def max_by
max {|a,b| yield(a) <=> yield(b) }
end
def min_by
min {|a,b| yield(a) <=> yield(b) }
end
end
ちなみに Haskell には Data.List.maximumBy, minimumBy があるが、 これは Ruby のブロック付き max/min と同じような領域をカバーする。
~ % href maximumBy
Data.List,maximumBy
maximumBy :: (a -> a -> Ordering) -> [a] -> a
maximumBy f xs
リスト xs の要素の中で最大のものを返す。
大小の比較に f を使う。
see also: maximum, minimumBy, compare
maximumBy (compare) [1,2,3,4] = maximum [1,2,3,4] = 4
もうパソコンなんてどうでもよくなってきた最近ですが、 G5 2GHz dual はちょっと欲しくなりました。なんかイイよアレ。 いま 50 万あったら AlphaServer ES40 とどっちを買うかかなり悩むな。
そう、ES40 が 25 万で売ってるんですよ。 ES40……Alpha 21264 500MHz × 4、メモリ 2GB に冗長電源三つ、 匡体の大きさは巨大冷蔵庫並。強いて欠点を挙げるならば、 電気代が正視できない額になるであろうことと、 Compaq 時代のマシンなので [d|i|g|i|t|a|l] ロゴが付いてないことか。
ところで「ましーん」という響きで Love Machine を思い出した。 懐かしすぎる。
いまは CD-R 焼きのためだけに P2 300MHz のマシンを 使っているのだけども、こいつがなんとなく邪魔になってきた。 しかも 4 倍速ドライブなのでとても遅い。 Libretto L1 の外付け CD-R ドライブにすら負けてしまう。
そこで新しい CD-R ドライブを買って、 ついでにマシンも dPW600au を使ってみることにする。 なんでわざわざ Alpha を使うのかと言うと特に全然意味はない。
でも改めて考えてみると、そもそもマシンを分ける必要ってないのかな。 今のマシン (P4 2.4GHz) の力をもってすれば、 バックグラウンドの CD-R 焼きなんて余裕かもしれない。
いや待て、IDE バスに空きがないんじゃなかったか?
CD-ROM ドライブと入れ換えればいいのか。
困ったな。メインマシンでも大丈夫なのか。 でももうドライブ付けちゃったから Alpha でやろう。
さて用意したドライブはどこぞのものとも知れない ATAPI 48 倍速の CD-R ドライブだ。 秋葉原でできるだけ安いのを買ってきた。 これを付けて起動してみる。
何事もなくブートした。dmesg で確認すると、ちゃんと認識されている模様。 とりあえず普通の CD-ROM を読ませると、ちゃんとマウントできた。 まあこのへんは当然だろうな。
さて CD-R を焼くにはどうすればいいんだっけ。 えーと、Linux の場合 ATAPI CD-R だと SCSI エミュレーションを入れないといけないのかな。 lilo.conf に append="hdc=ide-scsi" と書いて lilo してリブートすればいいらしい。 でも Alpha には lilo なんてありません。 aboot というのを使います。
あれ? aboot の設定ってどこでやるんだっけ……
つづく
http://page.freett.com/shelarcy/diary2003-08.html#haskell_heapsize
8/16 に書いた Hugs の件について。 Hugs が「ヒープが足りない」とかなんとか言ってきたら、 +h オプションでヒープを増やせばいいそうです。 うわあ、これは恥ずい……。
いちおう言い訳するとですね、 まさかいまどきメモリを固定サイズで割り当ててそれ使い切ったら終わり、 なんてことがあるとは思わなかったんですよ。
続き。
Linux で ATAPI の CD-R ドライブを使うには まず IDE の SCSI エミュレーションレイヤを動作させる必要がある。
で、そのためにはカーネルにコマンドラインパラメータを渡さなければならない。 カーネルのパラメータは x86 マシンだと lilo.conf などに書くが、 Alpha は lilo でなく aboot なので /etc/aboot.conf に書く。
dpw600au % cat /etc/aboot.conf 0:1/vmlinuz ro root=/dev/sda1 console=ttyS0 hdc=ide-scsi
そんでリブートすると dmesg がこんなふうになる。
:
:
:
ide_setup: hdc=ide-scsi
:
:
:
hdc: AOPEN CD-RW CRW4852 1.00 20030123, ATAPI CDROM drive
ide1 at 0x170-0x177,0x376 on irq 15
Floppy drive(s): fd0 is 2.88M
FDC 0 is a post-1991 82077
:
:
:
このように hdc が検出されるが ide1 の上には出てこない。
でもって次に ide-scsi モジュールをオンにしてみると、
dpw600au % sudo modprobe ide-scsi scsi1 : SCSI host adapter emulation for IDE ATAPI devices scsi : 2 hosts. Vendor: AOPEN Model: CD-RW CRW4852 Rev: 1.00 Type: CD-ROM ANSI SCSI revision: 02 Detected scsi CD-ROM sr0 at scsi1, channel 0, id 0, lun 0 sr0: scsi3-mmc drive: 40x/40x writer cd/rw xa/form2 cdda tray Uniform CD-ROM driver Revision: 3.11
という具合に SCSI ドライブとして検出された。 cdrecord -scanbus を実行してちゃんと見えるか確かめてみる。
dpw600au % sudo cdrecord -scanbus
Cdrecord 1.10 (alphaev67-unknown-linux-gnu) Copyright (C) 1995-2001 J��g Schilling
Linux sg driver version: 2.1.40
Using libscg version 'schily-0.5'
scsibus0:
0,0,0 0) 'DEC ' 'RZ2CC-KA (C) DEC' '5520' Disk
0,1,0 1) 'DEC ' 'RZ2DC-KA (C) DEC' '5520' Disk
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
scsibus1:
1,0,0 100) 'AOPEN ' 'CD-RW CRW4852 ' '1.00' Removable CD-ROM
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) *
1,6,0 106) *
1,7,0 107) *
このように、1,0,0 としてちゃんと見えている。あとは読んで書くだけ。
dpw600au % cdda2wav -D 1,0,0 -x -B : : dpw600au % cdrecord dev=1,0,0 speed=48 -audio -useinfo -eject -v *.wav Cdrecord 1.10 (alphaev67-unknown-linux-gnu) Copyright (C) 1995-2001 J��g Schilling TOC Type: 0 = CD-DA cdrecord: Invalid argument. shmget failed dpw600au %
……はい?
Google してみたところ、環境変数で CDR_FIFOSIZE=4000k とすればいいらしい。 正確に言うと、シェアードメモリの最大量を超えないように設定すればいいらしい。 シェアードメモリの最大量は /proc/sys/kernel/shmmax で見られる。 デフォルトだとこれが 4MB になっているから、 4MB 以下にすれば大丈夫というわけだな。 だから逆に shmmax のほうを増やしても解決できる (実験済)。 axp-list で見付かるということは Alpha 特有なのかな?
dpw600au % CDR_FIFOSIZE=4000k sudo cdrecord dev=1,0,0 speed=48 -audio -useinfo -eject -v *.wav
Cdrecord 1.10 (alphaev67-unknown-linux-gnu) Copyright (C) 1995-2001 J��g Schilling
TOC Type: 0 = CD-DA
scsidev: '1,0,0'
scsibus: 1 target: 0 lun: 0
Linux sg driver version: 2.1.40
Using libscg version 'schily-0.5'
atapi: 1
Device type : Removable CD-ROM
Version : 0
Response Format: 1
Vendor_info : 'AOPEN '
Identifikation : 'CD-RW CRW4852 '
Revision : '1.00'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags : SWABAUDIO
Drive buf size : 1359872 = 1328 KB
FIFO size : 4096000 = 4000 KB
Track 01: audio 54 MB (05:24.62) no preemp
Track 02: audio 18 MB (01:51.70) no preemp
:
:
Performing OPC...
Starting new track at sector: 0
Track 01: 54 of 54 MB written (fifo 100%).
Track 01: Total bytes read/written: 57264144/57264144 (24347 sectors).
:
:
7 分で焼き終わった。さすがに 48 倍速は速い。
strscan と fileutils のテストをインポートした。 net 以下は諸事情により後回し。
■ ささだ [Net 以下は、と空目。]
初めて Win2000 がクラッシュした。 エクスプローラでふらふらディレクトリを渡り歩いてたら Alt + ← したとたんに IE が SEGV して OS ごと停止。 ちょっとびっくりした。 ファイルの被害はないようだ。
明後日 9/20 (土) は RHG 読書会です。 RHG 二周目の第一回をやります。 場所とか書くのが面倒なので詳しいことはこのへん↓からどうぞ。
とりあえずぼくとしては今回こそ読書会のタイミングで オンライン版を同時更新したいと!
いやいやいや。今回も楽しかったです。 なんか特に今回は (余談が) 白熱していたような気がしますです、はい。 ログはいつも通り RWiki に載ってますのでどうぞ。
どーでもいいですが RWiki 書いてて 3 回もコンフリクトしてしまいました。 こういうときは本当に CVS が欲しくなるね。
ところで今回は Gauche の Shiro さんと慶應の酒井さんに初めてお会いしました。 珍しいことに、あんまりイメージと離れていなかったように思います。
Tru64UNIX 5.1B げとずさー!
バージョン 0.1 0.2 合わせたダウンロード数は 47 という無惨な数字が出ました!
ちなみに同じく 5/11 からの合計で Racc が 2110、 strscan が 1884、 ReFe が 1299、 TMail が 1212、 setup.rb が 612、 Ripper ですら 63 でした。
……いや、ちょっと本気で予想外?
■ ささだ [日本の Haskeller は 47人?]
Enumerable#with_index ってのはどうだろう。 つーか前に誰かが案を出してたような気がするけどもう覚えてらんない。
module Enumerable
def with_index( mid )
idx = -1
__send__(mid) do |*args|
idx += 1
yield(idx, *args)
end
end
end
[2,4,6].with_index(:each) do |idx, i|
puts "index #{idx}: #{i}"
end
{1=>5, 2=>10, 3=>15}.with_index(:each) do |idx, key, val|
puts "index #{idx}: #{key} => #{val}"
end
あぁ、each_with_index と引数の順番が違うし。 「*」を使うためにはやむを得ない。
Tru64UNIX をインストールしようと思ってインストールして何事もなくうまくいってリブートしたとたんに HDD がクラッシュした。
世の中の無常を感じたのでしばらく旅に出ます。 探さないでください。
■ すぎむし [旅 < ruby-dev summaryはぁ (;_;)]
今まで意識してなかったけど、 Windows 2000 の C:\ にある arcldr って、 もしかして Alpha のファームウェアの ARC のこと?
ちなみにβ版だけだけど Alpha 用の Windows 2000 もあったそうな。
「$RANDOMIZE」という Subject で SPAM が来た。 sh?
ruby-talk とかで、イテレータの |i| を省略したいっていう意見が出ることがある。 そのくらい真面目に書けよ! と思っていたんだけども、 今日とつぜん自分でも省略したい気分になった。Haskell で
map (chr) [0,1,2,3,...]
みたく書けるのは、ちょっといいなあ、と思う。
でもちょっとだけだな。
ソース (調味料の) を買ってきた。 蓋についてるシールに「カレーにもブルドックソース」 と書いてあった。 余計なお世話だと思った。
いーかげん (WinMe に) ムカついてたので Libretto L1 を売り払う。 もう純正外付け CD-R ドライブ付きでも 40000 にしかならないのか。 ヒンジ緩みと言われても、Libretto L シリーズは元々ヒンジ緩いだろ。
でも 10% 増額に引かれてうっかり Sofmap ポイントプールにしてしまった。 Sofmap ポイントなんかいくらあっても食費にできないじゃん! (切実)
そういえば、ピースが六角形をつなげて作ってあるパズルがあったなあ。 ピースを全部きっちり枠にはめこむと完成。 全部で 50 通り以上はめかたがあるらしいんだけど、 一つもわからなかった。
それと同じ系統で、テトリスのピースみたいなのを組み合わせて 直方体を作るパズルもあったな。そっちは解くのは簡単なんだけど、 はめこみかたの解を全部見付けるのが目標。 これはなんとか全部わかったような気がする。
ピースが三角形の組み合わせとか、四角形 5 つのもあったな。
てなことを、akr さんの日記を見て思い出したわけです。
さらに関係ないけど三次元版テトリスってのもあったなあ。 四角い井戸を入り口から覗いているようなビューで、底にブロックを揃えていく。 縦横どちらかが揃ったら消える。 そのかわりブロックが四角形 5 つのがあって、かなりムズい。
デザインパターンが「デザパタ」なら リファクタリングは「リファクタ」でよくね?
ついに 1 まんえんを切った。 完全になくならないうちに From A でも買ってこよう。
2 週間前の牛乳は飲めるのか、いや飲まねばなるまいとか (健気にも) 思ったが 匂いをかいだ瞬間捨てた。
そういえば strscan で ^$ が効かないバグがあったなあ。 あれを直すとほとんどソースコード総書き換えになりそうで躊躇してるんだけど。
久々に連鎖バグにはまった。
(起)
net/pop.rb で、ソケットをつないだ後、started? になる前に サーバが接続を切るとソケットが閉じられなくなるというバグレポートが来る。
(承)
pop だけでなく smtp と http も同様のバグがあることに気付き、直し始める。
(転)
ついでにテストスクリプトを足して実行してみたら、 Net::HTTP#get のブロック中からの break が動かなくなっていることを知る。
(結)
CVS HEAD の break がバグってた。
ただしそれとは別に、HTTP#get から break すると入力バッファに前の レスポンスの残骸が残ってしまうのでまともに使えないということもわかった。
さらに、1.8.0 の net/smtp には 「絶対に QUIT が発行されずソケットも close されない」 というとんでもねーバグがあることがわかった。
started? の件はどうにかした。 #start の中で、!started? なのにソケットが開いてたら常に閉じるようにしただけ。
略語で思い出したけど、中学校の美術の授業で
「インスタントラーメンは語呂がいいからいつまでたっても略されない」
という話があった。なんで美術でそんな話になったのかは覚えてないけど。 でもインスタントラーメンは語呂がいいというより略称が考えにくいから 略されないのではなかろうか。
というところまで (トイレで) 考えて、 インスタントラーメンと instance_eval は 「インスタン」まで同じということに気が付いた。 そう言われてみると、module_eval が mod eval と略したくなるのに比べて instance_eval は省略したい気持ちが少ないような気がする。 せいぜい inseval か。ieval でもよさそうだな。 というか eval が既に evaluate の略であることは考慮しなくていいのか?
オチなし。
それはそうと「リファク」だと李白を思い出しますね。 国破れて SAMBA あり……は杜甫か。
ああ、そういえば Ripper ってものもありましたねえ。 改めて考えると結構積み残しがあるな (やる気なし)。
先週休んだから今週は ruby-dev summary もあるのか……。
まあ気が向いたものからヘロヘロっとやろうかな。
■ なかだ [collect{|x|[yield(x), x]}.max[1]
ならyieldが半分で済むかも。]
■ あおき [それだと empty? のときに落ちるですよ。
かと言って to_a 付け始めたりすると美しくないし。]