history

青木日記 RSS

<前月 | 最新 | 次月>

2004-02-03

やばっ

……寝すぎた。 何時間寝てたのか恐くて数えられん。

RHG 読書会 reloaded #6

先週の土曜日は RHG 読書会 2-6 でした。 記録はいつもどおり RWiki に書いてあります。 読書会のはだいたいメモってたんですが、 宴会の話を思い出せないので誰か書いてください。

一周目は 7 回で終わったのに二周目はいまだ GC ですよ。 先は長いね。

ところで読書会中に話が出たんですが、 どうやら拡張ライブラリリファレンスマニュアルを誰も知らなかったようです。

つかってね!

ユーザマニュアルとかも含めてもうちょい体裁を整えたいところだけど……。 来年度の課題かな。

(06:22)

言語の文法

言語の文法の好き嫌いをいろいろ言うのって楽しいんだけど すぐにフレームになるから不便だね。 それに論理的に長短が議論できるような論点であっても 慣れるとどっちでもよくなったりするので困る。 個人的には end と {} の違いくらいはどうでもいいかな。 もし明日から突然 Ruby が {} になってもあんまり困らないし逆も同様。

でも強いて好き嫌いを挙げるなら、 標準的な記法で書いたときに grep しやすい文法は好きだ。 ただしコマンドラインシェルとエディタで書く場合ね。 Ruby の def はその点で便利なんで好きだな。 C 系の言語は嫌い。

(07:08)

Rubyクックブック

いちおう全部の項目が揃ったみたいです。 これからびしばしテストするよ! 鬼のように!

ちなみにクックブックは Ruby 1.8.1 がターゲットです。 新しいメソッドもライブラリも使いまくり。

(07:27)

BitChannel / メニュー変更

CSS 対応ブラウザではメニューが縦に出るようにしてみた。 さらに CSS2 対応なら常時右上表示だ。

でも本文に重なっちゃうのがいまいちなのですぐやめるかも。

BitChannel / メニュー項目の使用頻度

こないだ勝手にコマンドの使用頻度を予想してみたんだけど、 httpd のログを見れば実際の数がわかるじゃないかーと気付いた。 BitChannel 公開以来のを全部足すとこうなった。

recent      612
history     437
edit        422
annotate    356
list        282
diff        272

えーっ。Diff が一番少ないのか。 ちょっと信じがたい。

それともあれか、 History を Diff のつもりで使ってる人がいるとか、 Annotate は珍しいから押してみてるとか、そういうことかねえ。 History の半分を Diff に移動すると納得できる値になるもんな。

メニューの順番を変えたところだし、 結論を出すのはもうちょっと試してからにしよう。

(13:58)

BitChannel / diff

もしかして unified diff だから人気がないのだろうか?

(16:07)

ML

潔く BitChannel ML を作るべきか……。

(18:34)

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

まちゅ [僕は[Recent]→[Diff]です。最終更新に色が付くようになれば[Diff]の代わりに[Annotate]を使うと思います。[History]はほとんど使わないですねぇ。]

sugi [Diff を使うのは、通りすがりの一見さんよりも常連さんというか、
そのページに深く関わっている人なのではないでしょうか?
一見さんは、直前との Diff よりも History の方を見るような気がします。]

あおき [言われてみれば確かに、前の状態を
知らなければ Diff は使わないですもんね。
自分ではあまり使ってなかったのですが、
色が付いてみると Annotate も便利。納得。
(w3m で無意味なのが気になると言えば気になる)]


2004-02-08

>>284

「最後の一人はいただく」云々は「拡張モジュール」の話かな。 無道編 p.156 にのってる。素直に言ったほうがわかりやすいのに、 とか言われても、256 倍だから素直に書くわけにはいかないじゃん。

でも、RHG でさんざん「拡張ライブラリ」って書いたら もうどっちでもよくなった。ありがちだ。

Rubyクックブック

高橋さんのところにも出てますが、 初校 (?) が印刷されてきました。 出版時期ですが、春が売れ時なのでその前には出版されるでしょう。 というか、しないとまずいです。

お役立ち度。 既に tdiarygrep とか BitChannel を書くときに使いまくってるというか、 使ったのを端から載せたというか……。 少なくとも自分で使ってみて便利だったということは、 なにかしら役に立つでしょう。

あと、文字列処理の章 (担当青木) が特にそうなんですが、 容赦なく Ruby 1.8 (1.8.1) 仕様です。 1.8 の機能が使えるときは全て 1.8 仕様。

では 1.6 ではどうするか。 最後の章に「古いRubyでも新しいRubyの機能を使う」とか 「互換性を保ったままメソッド名を変更する」みたいな項目が一揃い書いてあるので、 それを使ってどうにかしろというスタンスです。卑劣だね。

マルチプラットフォームの恩恵

それにしても、RHG のときは Linux と Windows くらいしか持ってなかったので 動作確認にかなり苦労しましたが、今回は執筆陣だけで 重要プラットフォームをほとんどカバーできるので楽です。めちゃ楽。 やっぱり実際の動作をその場ですぐ確かめられるのはいいね。

あ、そういえば AlphaNT 入手したって言ったっけ?

(15:02)

test-all-ruby

家のメインマシンには test-all-ruby というコマンドがある。 読んで字の如く、ruby 1.4.6 から ruby 1.8.1 + CVS HEAD までの 全バージョンでコマンドを実行するという力技ツールだ。 こんな具合に使う。

~/c/cookbook % test-all-ruby -e 'p File.basename("a.rb", ".*")'
ruby-1.4.6:
"a"
ruby-1.6.0:
"a"
ruby-1.6.1:
"a"
ruby-1.6.2:
"a"
ruby-1.6.3:
"a"
ruby-1.6.4:
"a"
ruby-1.6.5:
"a"
ruby-1.6.6:
"a"
ruby-1.6.7:
"a"
ruby-1.6.8:
"a"
ruby-1.8.0:
"a"
ruby-1.8.1:
"a"
ruby:
"a"
 
~/c/cookbook % test-all-ruby -e 'p File.extname("a.rb")'
ruby-1.4.6:
/tmp/rbNqlet2:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.0:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.1:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.2:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.3:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.4:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.5:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.6:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.7:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.6.8:
-e:1: undefined method `extname' for File:Class (NameError)
ruby-1.8.0:
".rb"
ruby-1.8.1:
".rb"
ruby:
".rb"

中身

~/c/cookbook % cat =test-all-ruby
#!/bin/sh
for r in ruby-1.4.6 \
         ruby-1.6.0 \
         ruby-1.6.1 \
         ruby-1.6.2 \
         ruby-1.6.3 \
         ruby-1.6.4 \
         ruby-1.6.5 \
         ruby-1.6.6 \
         ruby-1.6.7 \
         ruby-1.6.8 \
         ruby-1.8.0 \
         ruby-1.8.1 \
         ruby
do
    echo "$r: "
    $r "$@"
done

(21:43)

hier 自慢

ちなみに最近は stow を使ってる。 新しくコンパイルしたものから順番に stow 化してるので、 いまんとこはこの程度。

~/c/cookbook % ls /usr/pkg
autoconf-2.59        firebird-0.7    libpcap-0.8.1  ruby-1.6.7
automake-1.8         gawk-3.1.1      lua-5.0        ruby-1.6.8
blackbox-0.61.1      gd-2.0.15       man-1.5k       ruby-1.8.0
cdrtools-2.00.3      ghc-5.04.1      rcs-5.7        ruby-1.8.1
cdrtools-2.01alpha   ghc-5.04.3      ruby-1.4.6     squid-2.5.4
curl-7.10.8          ghc-6.0.1       ruby-1.6.0     subversion-0.33.1
cvsup-16.1f          graphviz-1.8.5  ruby-1.6.1     subversion-0.34.0
darcs-0.9.15         groff-1.18.0    ruby-1.6.2     sudo-1.6.7p5
electricfence-2.0.5  gs-5.10         ruby-1.6.3     tcpdump-3.8.1
ethtool-1.8          j2sdk1.4.0_01   ruby-1.6.4     tex-7.2
expat-1.95.7         j2sdk1.4.1_01   ruby-1.6.5
ezpm3-1.0            lavaps-2.4      ruby-1.6.6

/usr/pkg という名前は NetBSD から持ってきたのだが、意味は違う。

ちなみに /usr/local はこんなことになってる。

~/c/cookbook % ls -ld /usr/local
lrwxrwxrwx    1 root     root            1 Jan 18 17:46 /usr/local -> .

(21:57)

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

なかだ [それは全部static link?]

あおき [「それ」が ruby であれば、--disable-shared で --prefix も分けてます。
パッケージのほうは --prefix=/usr, DESTDIR=/usr/pkg/xxxx で入れてる
だけなので、基本的にバージョンごとの共存はできません。]

あおき [libc その他は dynamic link です。]

なかだ [あそうか、libもあるからprefixごと分けなきゃ無理か。]


2004-02-10

CVS/Root

% for i (**/CVS/Root) { echo http://cvs.loveruby.net:/src >! $i }

の一行で書き換えられるんだから別にいいじゃん。

(18:50)

Ripperは死んでない   と思う

http://d.hatena.ne.jp/moleskin/20040210#p9

RE_OPTION_POSIXLINE があるということは ripper 0.0.5 なんでしょうか。 であれば、それは古すぎるんで CVS から取ってください。

% cvs -d :pserver:anonymous@rubyforge.org:/var/cvs/ripper co ripper

あ、でも 0.0.x とは互換性がないや。

それはそれとして、Ripper は FreeRIDE の人達にあげちゃったので、 あんまり積極的に関わる気はありません。 けど、全然進捗がないし、しばらくたっても進まなかったら やっぱりぼくがやるしかないでしょうねえ……。鬱。

パッケージ整頓

というか、今メンテしてるパッケージはいくつあるんだろう。

  • net/http
  • net/smtp
  • net/pop
  • fileutils
  • strscan
  • ReFe
  • setup.rb
  • Racc
  • TMail
  • BitChannel
  • tdiarygrep
  • href
  • (ruby-dev summary)
  • (ripper)

う……。

なんとか削ろう。

  • net/http
  • net/smtp 小物
  • net/pop 小物
  • fileutils 小物
  • strscan 小物・ほぼ仕様確定
  • ReFe
  • setup.rb 小物
  • Racc ほぼフリーズ
  • TMail
  • BitChannel
  • tdiarygrep 小物
  • href 小物
  • (ruby-dev summary) いまは月イチなのでたいしたことない
  • (ripper)

すると残りはこれだけか。

  • net/http
  • ReFe
  • TMail
  • BitChannel
  • (ripper)

これを、メンテしたい順 (興味ある順) に並べるとこうなる。

  • BitChannel
  • net/http
  • TMail
  • ReFe
  • Ripper

嫌いなほうから順番に一言。

Ripperね、Ripperはめちゃくちゃ大変なんすよ。メンテが。 もうめんどくさいったらありゃしない。 根本的にイベント数が多すぎなのだ。

TMail かあ。メールも嫌いじゃないんだが……いや嘘だった、MIME は大嫌いだ。 文句なしに嫌いだ。頭の先から爪の先まで嫌いだ。なんなんだよあのクソ仕様。 考えたやつらはサドだね。間違いない。

それはそれとして、何気に TMail は惜しいのだな。 ちょっと追加すればかなり使い勝手がよくなるはずなんで 「ちょっと」を追加したいんだけど、 どうも萌えなくてさ (それが理由かっ!)。 手を入れるだけの情熱がたまってない。

ReFe は……特に嫌いじゃないんだけど、 さすがにいじるところがなくなってきてたりする。 これ以上はソースのほう (リファレンスマニュアル) をどうにかしないと進化できないんじゃないだろうか。

最近はなぜか HTTP 萌え、なので net/http は 急速にメンテ意欲が湧き中。

BitChannel は文句なしに楽しい。実に楽しい。 やっぱり俺はなんだかんだ言って実利中心野郎なのだった。

結論: アプリケーションさいこう。

(23:10)

BitChannel 0.1.0

「BitChannelを書籍に収録したいのだけどパッケージはないだろうか」 という問い合わせをもらったので、 ここぞとばかりにパッケージを作った。 こういうときだけは無闇やたらと仕事が早い。

(00:01)


2004-02-12

GC の合成

[ruby-list:39145] からの COM の話なんだけど、 ようするにこれって mark & sweep (Ruby) と reference count (COM) の連結問題だよね。

と、考えると気分がスッキリするかもしれないし逆に鬱になるかもしれない。

あと、メールの返信を書いてる途中に rb_hash_* のリファレンスマニュアルがないことに気付いたので ついでに書いておいた。

(22:42)

Ruby拡張ライブラリプログラミングガイド

ずいぶん前に書いて忘れてたのを Wiki に置きました。

Ruby の拡張ライブラリを書くときには GC の知識が致命的なまでに重要なのですが、 README.EXT では GC が軽視されすぎです。 拡張ライブラリを書こうとするならば、 まず「メモリ管理はインタプリタが適当にやってくれる」 という認識を捨てるところからスタートするべきです。

(追記) 一気に書き殴っただけあって穴が多かった。 読み直しが必要だな。

(23:09)


2004-02-15

Rubyリファレンスマニュアル / 機能別索引

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%B5%A1%C7%BD%CA%CC%BA%F7%B0%FA

こんなものがあるなんて知らなかった……。

(18:54)

置き換えないjcode.rb

Ruby の jcode.rb は既存のメソッドを置き換えるけど、 新しい名前でメソッドを追加したほうが便利じゃないだろうか。 んで jcode.rb はそれを require して、 メソッドを置き換えるコードだけにすればいい。

(22:04)

Rubyクックブック

一日かけてやっと文字列の章が読み終わった。 なんで自分の担当なのにこんなに時間がかかるんだ。 自分の担当だからかかるのかな。 そもそも文字列処理の章は長すぎるのだ。 なんでこれだけで 130 ページもあるんだよ。 実に全体の 1/4 ですか。恐るべし文字列処理。

明日やることを忘れないようにメモ: setup.rb と tdiarysearch.rb をアレする。 FileUtils::Dryrun モジュールを作る。

(01:59)

>>442

ああっ! そういえば RHG 公開しなきゃ。 クックブックが終わったらやるか……とか言ってると絶対やらないよな……。 おもいきって明日やろうかな。fileutils をのばして。

そもそも何が問題かと言うと、 一部に生 LaTeX が入ってんのねアレ。 だからそこを手で変換しないといけないんだけど、 そこがめんどくさくて。はあ。

(03:47)

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

やまだあきら [「置き換えないjcode.rb」を読んで思い出しました。以前、小松さんのjstring.rbの標準添付を提案したことがあります[ruby-dev:20097]。そのまま流れてしまいましたが、やっぱり置き換えない形のほうがよいですよね。]

あおき [どこかで似た話があったなあと思ってたんですよ。
けっこう最近の話ですね。import-module とか考えると
長くなりそうだから、とりあえず String に直接定義では
だめだろうか……。]


2004-02-16

Eiffel

ム板Cleanスレより

58 :デフォルトの名無しさん:04/02/14 19:47
    どうする〜?
    Eiffel?

(22:23)

tdiarysearch レポジトリ移動

tdiarysearch を tDiary の contrib レポジトリに移動しました。 今後はこっちだけ更新する予定です。

% cvs -d :pserver:anonymous@cvs.tdiary.sf.net:/cvsroot/tdiary co contrib/util/tdiarysearch

(23:56)

RHG 全章公開

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

『Rubyソースコード完全解説』の全章を HTML で公開しました。 ただし初校をベースにしているので、 ただでさえ多い間違いがさらに増えています。 要注意。

(03:06)

fileutils.rb

CVS HEAD で FileUtils::DryRun を追加。 働きは名前のとおり。表示だけして実際には何もしないというモジュール。

つか、FileUtils::NoWriteって使いようがないよね、と、 クックブックの原稿読んでるときにゆうぞうさんに言われたのがきっかけ。

(04:58)


2004-02-19

ruby-list でよくある会話

ウェブのワーキングコピーを整理してたらこんなのが出てきた。

ruby-list でよく見られる対話、その 1
 
  だれか「こーであーでそーいうメソッドが欲しいんですぅ」
  まつもとさん「機能は問題ありません。よい名前があれば採用しましょう」
 
ruby-list でよく見られる対話、その 2
 
  だれか「これこれこういうライブラリがあればカッコいいっすよ!」
  まつもとさん「適切な名前が決まったら標準添付してもよいですよ」
 
ruby-list でよく見られる対話、その 3
 
  だれか「あとメソッド一個あればいいんだけどなあ……」
  ある Rubyist「でもその名前じゃまつもとさん説得できないでしょ」
 
ruby-list でよく見られる発言、その 4
 
  だれか「あー、これは超便利だぁー。でもこの名前はよくないなあ……」
 

名前じゅーよー。

でも今は ruby-list じゃなくて ruby-dev かもしんない。

(09:41)


2004-02-20

TMail 0.10.8 released

めちゃくちゃ久しぶりに TMail をアップデートした。

(10:03)

RHG HTML 版

なるほどねえ。 書籍版を持っていても電車の中で読むという需要があるんですね。 そうならそれで、もうちょっと品質を上げたいところだな。 ぼちぼち直していこう。

あと、ょゎさんリクエストの name タグですが、 どう実装したらいいものか悩んでます。 連番だと途中に項目を追加するだけでずれてしまうし、 かと言っていちいち名前を指定するのもうざったい。

スクリプトで連番を振って、 後から追加するときは手動でタグを入れればいいかなあ。

(10:07)

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

ただただし [連番は100飛ばしで、といういにしえの技が。]

あおき [……べーしっく?]


2004-02-23

Rubyクックブック → レシピブック?

この土日は目一杯 Ruby クックブックの読み合わせをやってました。 13:00 から 23:00 までかかったよ。 文字列の章はやたらと長いし、 CGI の章ではやたらと横道にそれまくるし。

ちなみに本の題名はレシピブックとかなんとかいうらしい。

ruby-dev summary

そんなわけで今週の ruby-dev summary はこれからやります。

(15:51)


2004-02-25

rcrchive

http://rcrchive.net

ところでみなさん、rcrchive は読んでますか?

(22:41)

+15 日

牛乳が 2/10 賞味期限だった。 経験的には加熱すれば安全圏だな。

(22:42)


2004-02-26

cmd.exe

なんでいまさら cmd.exe の仕様を調べねばならんのだ……。

公式仕様がみつかりません。

(05:25)

追記

そもそもなぜこんなことを調べているかというと、クックブックがきっかけです。 「Rubyスクリプトを名前だけで実行可能にする」という項目があって、 そこに mswin32 版 ruby が使ってる方法を書いてたんです。 そうしたら、ゆうぞうさんに「%0 ってないの?」とつっこまれて、 調べてるうちに深みにはまった。

調べた結果は次の通り。 cmd.exe にも %0 は存在して、実際最初は「"%0"」だった ([ruby-dev:18895] instruby.rb 1.32)。 しかし Ruby が複数インストールされている環境を考慮して絶対パスになった。 ([ruby-dev:19370] instruby.rb 1.40)。

(06:08)

VC++ for Alpha

Alpha 用の VC++ が 6.0 まであるなんて知らなかった。

(06:11)

UNIX → Windows

UNIX プログラマ向けに Windows 世界の概要を説明してくれる本ってないですかねえ。 内容はこんな感じだといいなあ。

  • 文字コード関係 (主にユニコード)
  • ファイルシステムと hier
  • レジストリの hier
  • パッケージの管理
  • アカウント管理
  • プロセスとサービス
  • COM 基礎
  • バッチファイルのまとめ
  • WSH
  • .NET

もちろん全部概要でいいんですけど。 入門よりもしっかりしていて、 ちゃんとプログラミングするんでもない、 その中間くらいが欲しい。

……というか、これはほとんど「俺が知りたいことリスト」 みたいなもんだな。

(06:40)

cmd.exe (2)

instruby.rb の変更ってこれですか。 タイムリーだなあ。

--- instruby.rb 23 Feb 2004 00:09:48 -0000      1.61
+++ instruby.rb 25 Feb 2004 12:16:14 -0000      1.62
@@ -74,6 +74,7 @@
 end
 
 def with_destdir(dir)
+  return dir if $destdir.empty?
   dir = dir.sub(/\A\w:/, '') if File::PATH_SEPARATOR == ';'
   $destdir + dir
 end
@@ -157,11 +158,11 @@
     open(with_destdir(batfile), "w") { |b|
       b.print <<EOH, shebang, body, <<EOF
 @echo off
-if "%OS%" == "Windows_NT" goto WinNT
+if not "%~d0" == "~d0" goto WinNT
 #{ruby_bin_dosish} -x "#{batfile}" %1 %2 %3 %4 %5 %6 %7 %8 %9
 goto endofruby
 :WinNT
-#{ruby_bin_dosish} -x "#{batfile}" %*
+"%~dp0#{ruby_install_name}" -x "%~f0" %*
 goto endofruby
 EOH
 __END__

なるほど。cmd.exe の変態記法をチェックして分岐するんですね。 まあ記法の変態さ加減では sh も負けてないか……。

えーと、%~f0 が %0 のフルパスで、%~dp0 が %0 の drive + dirname か。 利点は、prefix 以外にインストールされても rdoc が動く……でいいのかな。

(10:15)

カタ

コード=カタって表現を見るとどうしてもガン=カタを連想する。

(10:22)

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

(う) [でも、昨夜なかださんと相談して、またcmd.exeの時だけ挙動を変えちゃったりしたのでした。てへ。]

(う) [あと、cmd.exeの仕様は、微妙なこと以外はWindowsのヘルプに普通に載ってます。]

あおき [ぐお。本当だ。ありがとうございます。
MSDN ばっかり見てました……。]


2004-02-28

ruby / print str.taint

うーむ……

$SAFE = 1
path = 'danger'.taint
puts File.expand_path(path)   # 通る

print str.taint は通ってしまうのか。 通さないと不便だが、通すのも嬉しくないような気がするな。 puts File.expand_path('~') なんてのが通ると CGI を実行してるユーザと そのホームディレクトリも推測できてしまう。

この場合はむしろ expand_path が例外をあげるべきかなあ。 微妙だ。

(04:22)


2004-02-29

--with-lookup-order-hack=INET

IPv6 ready なはずの NetBSD 上で getaddrinfo しても v6 なアドレスが返ってこない。 なんでかと思ったら --with-lookup-order-hack のせいだった。 自業自得じゃん。

でもこれを付けとかないと drb のテストが通らないんだよなあ。 困った。

(12:09)