history

青木日記 RSS

<前月 | 最新 | 次月>

2006-08-10

そうだコンパイラつくろう

唐突にコンパイラを作ることにした。 記述言語は Ruby でコンパイル対象言語はC♭ (C フラットと読め。C のサブセット)。 ターゲットマシンは ix86/Linux のはずだけど、 とりあえずはメインマシンが AMD64 なので AMD64 で行ってみた。

~/c/cflat % cat test/hello.cb                               aamine@serenade
int
main(int argc, char **argv)
{
    printf("Hello, World!\n");
    return 0;
}
~/c/cflat % ruby -I./lib bin/cbc test/hello.cb              aamine@serenade
~/c/cflat % ./hello                                         aamine@serenade
Hello, World!
~/c/cflat % file hello                                      aamine@serenade
hello: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.0, dynamically linked (uses shared libs), not stripped

Hello, World! (だけ) はコンパイルできるようになった。 次は式のコンパイルを真面目にやろうかな。 レジスタアロケーションは大変なので後回しにして、 とりあえずはスタック使いまくりでやってみよう。

(03:42)

Racc: その場でパーサ生成

まだ Racc の動的パーサ生成について考え中。

うーむ。やっぱりシンボルの連接には Java の某パーサジェネレータみたいにメソッド呼び出しを使うのがいいかもなあ。

g.defvar = g.type . IDENT . option(g.initval) . char(';') {....}

見ためはちょっとスッキリしたかなあ。 それに instance_eval しなくて済む。 しかし option とか many がちょっと浮く感じがしないでもない。 「g.」をどこに入れたらいいのかわかりにくい気もする。うーん。むずい。

いっそのこと文字列で書くというのはどうかねえ。

g.defvar = _("type IDENT [initval] ';'") {....}

スッキリしてはいるのだが。いるのだが……。 何か大切なものを失っているような気がする。 それにこれって埋め込みアクションが書きにくいし。

いやそんなことない。 連接の演算子を導入すればいいんだ。 それならこう書ける。

g.scope = _ { push_scope } + _('defvar* stmts') { pop_scope; .... }

見ためがイマイチだけど、 どうせ埋め込みアクションなんて滅多に使わないんだからいいか。

結論としては、まだ決心つかず。 なんかいい方法ないっすかね。

(03:56)

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

成瀬 [文字列にするのがアリなら、Rubyの文法に手を入れてしまうという禁じ手も・・・。]

青木 [いやー、それはさすがに禁じ手すぎるでしょう。
そもそも自分で文法を作る気なら元の Racc で
よかったわけですし。]


2006-08-14

そうだコンパイラつくろう (2)

足し算と関数呼び出し (らしきもの) ができるようになった。

~/c/cflat % uname -srm
Linux 2.6.8-11-amd64-k8 x86_64
~/c/cflat % cat test/add2.cb
int
main(int argc, char **argv)
{
    printf("ret=%d\n", f(76));
    return 0;
}
 
int
f(int i)
{
    return i + 1;
}
~/c/cflat % ruby -I./lib ./bin/cbc test/add2.cb
~/c/cflat % file add2
add2: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.0, dynamically linked (uses shared libs), not stripped
~/c/cflat % ./add2
ret=77

Linux/AMD64 の calling convention を初めて真面目に調べたよ。 最初の 6 個が rdi, rsi, rdx, rcx, r8, r9 で残りがスタックらしい。 まだレジスタをちゃんと割り付けるロジックを書いてないので、 手で割り当てるのが非常にめんどくさかった。

(19:58)


2006-08-15

net/smtp の SSL 対応

net/smtp の SSL 対応パッチをとりこみ中。

うーむ、いまさらだが、なんで SSL::Context じゃなくて verity と cert を別々に受け取っているのだろう。 このへんは何も考えずにパッチをとりこんだから意図がわからんな。 あっさり context にしてしまおう。

(09:49)

net/smtp の SSL 対応 (2)

コミット完了。 いつもながら、smtp と pop はテストがめんどくさい。

[変更点]

  • use_ssl_tls という字面が激しく気にいらなかったので use_ssl と use_tls に分離した。 細かいこと言えば use_xxx というのも好きじゃないんだが net/https がもうそうなっちゃってるので合わせるしかないか。
  • enable_tls は verity と cert を受け付けるようになっていたが net/https に合わせて SSLContext を受け付けるように変えた。 Ruby 1.9 なので仕様変更上等ってことでよろしく。

ついでに Net::SMTP.default_ssl_port と default_tls_port を追加。 SMTP/SSL が 465 番、SMTP/TLS が 587 番でいいんだよなあ。 SMTP/SSL は /etc/services にも載ってたから大丈夫だと思うのだが、 TLS が自信ない。

さらについでに、mailfrom とか rcptto とかを 直に叩けるようにメソッドを公開した。 なんでいきなり公開したかと言えば、 Google が QUIT でいきなり接続ぶちきるのに対応するため。 QUIT だけ rescue EOFError したいじゃん。

(11:48)


2006-08-19

RHG読書会

今日の RHG 読書会は所用により欠席。

(15:47)


2006-08-23

ブレーカー落ちた

クーラー 2 台に電子レンジを付けた時点で 「バツン!」と凄い音がしてブレーカーが落ちた。 最近は横着して UPS とか入れてないもんで、 外向けサーバを含む全マシンが停止してしまった。 真面目に UPS を入れていた時には何も起こらず、 適当な運用を始めるとブレーカーが落ちるあたり、世の中はよくできている。

ファイルシステムは ext3 か RaiserFS だから 被害は最小に留められたと思うけど、やっぱ UPS くらい入れておくかなあ。 でも UPS 入れても Linux だと UPS 監視ソフトを動かすのが面倒だったりするんだよなあ。 最近は USB 接続の UPS も操作できるようになったんだろうか。

genpower はあんま変化なしか。

APC は高いから避けたい。

NUT というのも UPS 関係ぽい。USB も使えそう。 このへんを調べてみよう。

NUT

NUT (Network UPS Tools) 公式サイト
http://www.networkupstools.org/

サポートしてる UPS はどんなのがあるかというと、 えーと、このへんか。

http://www.networkupstools.org/compat/stable.html

うう、やっぱり持ってる UPS がない。 買わなきゃだめかー。

(14:11)

ブレーカー遮断の余波

くはー、書きかけのメールが根こそぎ消えてる。 一回くらいセーブしろよ俺!

(14:12)

Ruby の cvsup

Ruby の CVS レポジトリをミラーしてる cvsup が こんな文句を言ってきたんだけど、何だろう?

ruby/ChangeLog,v: Checksum mismatch -- will transfer entire file
ruby/lib/rinda/ring.rb,v: Checksum mismatch -- will transfer entire file

(17:16)

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

zunda [apcupsdはUSB接続でもおっけーですよ。あ、高いのか。まあ、停電が終わるまでUPSの電池が持つと仮定して、監視無しで使ってもいいのかなーとか思ったりもします。]

青木 [それも考えなくはなかったのですが、自分の
使いかたからすると、UPS はデータを保護
するのが第一目的なんですよ。そうすると、
がんばって運転を継続するよりは、とにかく
速攻でシャットダウンしちゃったほうが
いいわけです。]


2006-08-24

GNU開発ツール

http://slashdot.jp/articles/06/08/23/1344251.shtml

西田さんが自費出版か……。 そんなのめんどくさいだろうに、よくやるなあ。

ぶっちゃけた話、この人の文章はあまり好きじゃないんだけど、 純粋に知識面だけで見れば貴重な本だとは思う。 そんなわけで 1 冊予約しておいた。

(02:34)


2006-08-25

リメイクFF3

うーむ、FF3 出たのか。なつかしい。 DS ごと買っちゃおうかなあ。

システムは FF5 風になったんだな。 3 では使えなかったジョブも役に立つようになってるだろうか。 学者なんてハイン戦しか役に立たなかったもんなあ。

……ぐあ、賢者が合体召喚を使えなくなってる?! ということはクリスタルタワーは忍者忍者賢者賢者ではなくなるのか? 召喚の白黒がそのままの効果だったら嫌になるほど使えねーぞ。

クリスタルタワーと言えば、ちょっとは短くなってんだろうねアレ。 確か FF シリーズ最長のラストダンジョンなんだよね。 体感では FF2 のジェイド + パンデモニウムのほうが明らかに長いんだが、 あれは敵の出現率が高いからそう感じるだけらしい。 しかも FF2 の敵はバカみたいに強いし。

パンデモニウムと言えば、FF3 にはマサムネあったっけ? ラグナロクのイメージが強すぎて思い出せない。 (攻略本を見つつ) えーと、あ、やっぱあるね。 エクスカリバーと攻撃力同じなのか。 しかしマサムネのが命中率が高い。

だんだん思い出してきた。確か FF3 にも結構強い敵がいたな。 カタカナ 4 文字で黒いやつ。そうだクムクムだ。 ファイガ、ブリザガ、サンダガ、ブレクガ、デスを使うらしい。 あれが徒党を組んで出てくると泣ける。

だが FF3 で強いと言えばやはりくらやみのくもではなかろうか。 全ターン「はどうほう」は酷すぎる。行動が読みやすいのは楽だけど。 あのへんも変わってるのかなあ。 一回目のくらやみのくも (無敵) で手裏剣を使い果たすのはとてもありがちだ。

うう、やっぱり欲しくなってきた……。

(16:36)

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

ささだ [とても欲しくなってきた!]


2006-08-27

LL ring

LL ring の「LLで関数プログラミング」でしゃべってきました。 聞いていただいた皆さん、ありがとうございました。

今回わたしは基本的にウケをとるか解説するか火種を撒くか、 てな狙いでしゃべってみました。 なので、喋ってることが一貫してない面があったかもしれません。 もうちょっと前もって内容を詰めておいたほうが よかったのかなあという気もします。

ちなみに、 「関数型言語は使いたいけど 遅延評価は欲しくないなんて そんなの微妙すぎ〜」 は、おっぱい占いをもじってみたつもりだったの。 スベったネタを解説するのも不粋だけどな。

ちなみに、リングのロープを一番上から乗り越えるのを 休憩時間中にやってみたけど、見事に失敗しました。

LL ring 飲み会

超幹事主催 (?) の二次会に参加。主な内容

  • とある商業ゲームは Ruby + SDL で実装されている (ある理由によりタイトルは書けないが、RPG ツクールではない。さっそく注文しといた)
  • ドドドについて
  • ドッギャーンについて
  • 次の本の打ち合わせ
  • 次じゃない本の打ち合わせ
  • ひのきのぼうでラスボスを倒す方法について (暗号)

暗号化しすぎた。

続いて、帰れなくなった人達による徹夜三次会。 なぜ 9 人もいますか? 一言でまとめると、あとで書く。

Ruby リファレンスマニュアル整備計画

いつまでたっても Ruby のリファレンスマニュアル整備計画が進展しない件を 高橋さん・西山さんと相談した結果、気合いと根性で実行することになりました。 8/31 までに (loveruby.net で) svn レポジトリを公開して、 9/20 までに (loveruby.net で) 新システムを公開します。

こんなんできるんですかねえ。

(07:49)

LL ring / 抽選

あさましくボールをゲット。そして

『みんなの Python』が当たった。

(08:07)

Ruby リファレンスマニュアル刷新計画 (2)

12 時間も寝てしまった……。

Ruby リファレンスマニュアル計画の目標について。

[クラスリファレンスについて]

  • Subversion でファイルを直接コミットできること
  • ファイル単位、クラス単位、メソッド単位でドキュメントを見られること
  • クラス単位のときは、継承したメソッドも同時に表示できること
  • メソッドのドキュメントを検索できること (最低でも ReFe レベル)
  • 既存クラスにメソッドを追加するライブラリをうまく取り扱うこと
  • 複数のクラスを含むライブラリをうまく扱うこと
  • Ruby のバージョンごとにドキュメントを分割すること (ソースドキュメントではすべて同居させる)
  • 現在手作業で埋め込んでいるクラスやメソッドのインデックスはすべて自動生成する
  • 現「添付ライブラリ」を統合
  • 静的 HTML アーカイブを全自動で生成できること
  • HTML Help を半自動で生成できること (コマンド一発で生成できるが、そのコマンドは手で打たなければいけない)

[その他について]

  • インストールマニュアル
  • 旧ユーザガイド + 旧チュートリアルの内容を書き直して新チュートリアルとする
  • 旧「Ruby言語仕様」と旧「Rubyの文法」を再統合して新「Ruby言語仕様」とする
  • 拡張ライブラリリファレンスマニュアルを復活・統合

分担について。

[俺が一人でやること]

  • Subversion レポジトリのセッティング
  • ドキュメント閲覧用ウェブアプリケーション
  • その他のドキュメントの物理的配置の決定

[他の人の協力を求めること]

  • 青木の決定したファイル配置に既存のドキュメントを配置しなおす
  • フォーマットの変換 (手作業でないとできない)
  • CSS

ファイルは一つか二つだけサンプルを作るので、 それを参考にして他のファイルをコミットする、 ということにする予定。

(20:44)

Subversion 1.3.2 のインストール

とりあえず Subversion をインストールしよう。

tukumo:~/src/subversion-1.3.2/apr/dso/unix % make                 aamine@tukumo
make[1]: Entering directory `/home/aamine/src/subversion-1.3.2/apr/dso/unix'
/bin/sh /home/aamine/src/subversion-1.3.2/apr/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE   -DHAVE_DLFCN_H -I../../include -I../../include/arch -I../../include/arch/unix  -c dso.c && touch dso.lo
dso.c:24:2: error: #error No DSO implementation specified.
dso.c: In function 'apr_dso_load':
dso.c:144: error: 'os_handle' undeclared (first use in this function)
dso.c:144: error: (Each undeclared identifier is reported only once
dso.c:144: error: for each function it appears in.)
make[1]: *** [dso.lo] Error 1

あれ?

configure --with-dso がいけなかったかな。 付けないでやってみよう。

cd subversion/tests/libsvn_delta && /bin/sh /home/aamine/src/subversion-1.3.2/libtool --tag=CC --silent --mode=link gcc  -g -O2  -g -O2 -pthread   -L/home/aamine/src/subversion-1.3.2/apr-util/xml/expat/lib  -rpath /usr/local/pkg/subversion-1.3.2/lib -o vdelta-test  vdelta-test.o ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la /home/aamine/src/subversion-1.3.2/apr-util/libaprutil-0.la -lgdbm /home/aamine/src/subversion-1.3.2/apr-util/xml/expat/lib/libexpat.la /home/aamine/src/subversion-1.3.2/apr/libapr-0.la -lrt -lm -lcrypt -lnsl  -lpthread -ldl
tukumo:~/src/subversion-1.3.2 %                                   aamine@tukumo

でけた。

(22:16)

Subversion / Ruby インターフェイス

swig かあ……。Ruby 1.9 対応してんのかなあ。

/home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c: In function `svn_swig_rb_set_revision':
/home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c:2418: error: `RE_OPTION_IGNORECASE' undeclared (first use in this function)
/home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c:2418: error: (Each undeclared identifier is reported only once
/home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c:2418: error: for each function it appears in.)
make: *** [subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.lo] Error 1

えらーキター。あああ、鬼車に対応してないよ……。 しょうがない、ガリガリ書き換えるしかないな。

……と、思ったけど、これを追加するだけで通った。

#include <version.h>
 
#if (RUBY_VERSION_CODE >= 190)
#define RE_OPTION_IGNORECASE ONIG_OPTION_IGNORECASE
#endif

とても嫌な予感がするけど、make check-swig-rb もやってみようか。

tukumo:~/src/subversion-1.3.2 % make check-swig-rb                aamine@tukumo
cd /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby; \
  /usr/local/pkg/ruby-20060827/bin/ruby -I /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby \
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/test/run-test.rb \
    --verbose=normal
/home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:59:in `BasicObject#__send__': private method `define_method' called for Svn::Core:Module (NoMethodError)
        from /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:59:in `Svn::Util#set_methods'

あああ、__send__ で private メソッドを呼んでるし。パッチ!

--- subversion/bindings/swig/ruby/svn/util.rb.org       2006-08-27 22:28:11.000000000 +0900
+++ subversion/bindings/swig/ruby/svn/util.rb   2006-08-27 22:28:14.000000000 +0900
@@ -1,3 +1,9 @@
+unless Object.method_defined?(:funcall)
+  class Object
+    alias funcall __send__
+  end
+end
+
 module Svn
   module Util
 
@@ -56,8 +62,8 @@ module Svn
           target_id = target_name.intern
           target_method = ext_mod.method(meth)
           target_proc = Proc.new{|*args| target_method.call(*args)}
-          target_mod.__send__(:define_method, target_id, target_proc)
-          target_mod.__send__(:module_function, target_id)
+          target_mod.funcall(:define_method, target_id, target_proc)
+          target_mod.funcall(:module_function, target_id)
           @@wrapper_procs << target_proc
         end
       end

tukumo:~/src/subversion-1.3.2 % make check-swig-rb                aamine@tukumo cd /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby; \
  /usr/local/pkg/ruby-20060827/bin/ruby -I /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby \
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/test/run-test.rb \
    --verbose=normal
Loaded suite test
Started
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.......E..........EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE..EEEEEEEEEEE
Finished in 3.489725 seconds.
 
  1) Error:
test_add_force(SvnClientTest):
NoMethodError: private method `initialize' called for #<Svn::Ext::Client::Svn_client_ctx_t:0x002aaaad2e6c60>
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/client.rb:52:in `BasicObject#__send__'
 
中略
 
119 tests, 46 assertions, 0 failures, 100 errors

またしても __send__ で private メソッドを呼んでいる。パッチ!

--- svn/core.rb.org     2006-08-27 22:34:00.000000000 +0900
+++ svn/core.rb 2006-08-27 22:34:19.000000000 +0900
@@ -151,7 +151,7 @@ module Svn
       class << self
         def new(providers=[], *rest)
           baton = Core.auth_open(providers)
-          baton.__send__("initialize", providers, *rest)
+          baton.funcall(:initialize, providers, *rest)
           baton
         end
       end
@@ -405,7 +405,7 @@ module Svn
         undef new
         def new
           info = Core.create_commit_info
-          info.__send__("initialize")
+          info.funcall(:initialize)
           info
         end
       end
--- svn/client.rb.org    2006-08-27 22:36:56.000000000 +0900
+++ svn/client.rb       2006-08-27 22:37:15.000000000 +0900
@@ -49,7 +49,7 @@ module Svn
         undef new
         def new
           obj = Client.create_context
-          obj.funcall(:initialize)
+          obj.__send__(:initialize)
           obj
         end
       end

これで普通にテストができるようになった。

tukumo:~/src/subversion-1.3.2 % make check-swig-rb                aamine@tukumo
cd /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby; \
    /usr/local/pkg/ruby-20060827/bin/ruby -I /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby \
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/test/run-test.rb \
    --verbose=normal
Loaded suite test
Started
..........................................................................E...................E........................
Finished in 301.156637 seconds.
 
  1) Error:
test_create(SvnFsTest):
Svn::Error::VERSION_MISMATCH: subversion/libsvn_fs/fs-loader.c:137 Mismatched FS module version for 'bdb': found 1.3.2, expected 1.1.4
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:64:in `Svn::Ext::Fs#svn_fs_create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:64:in `Method#call'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:64:in `Svn::Fs#create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/fs.rb:27
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/fs.rb:27:in `Svn::Fs#create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/fs.rb:27:in `SWIG::TYPE_p_svn_fs_t#create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/test/test_fs.rb:31:in `test_create'
 
  2) Error:
test_create(SvnReposTest):
Svn::Error::VERSION_MISMATCH: subversion/libsvn_fs/fs-loader.c:137 Mismatched FS module version for 'bdb': found 1.3.2, expected 1.1.4
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:64:in `Svn::Ext::Repos#svn_repos_create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:64:in `Method#call'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/util.rb:64:in `create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/repos.rb:37
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/repos.rb:37:in `create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/svn/repos.rb:37:in `Svn::Repos#create'
    /home/aamine/src/subversion-1.3.2/subversion/bindings/swig/ruby/test/test_repos.rb:80:in `test_create'
 
119 tests, 612 assertions, 0 failures, 2 errors
make: *** [check-swig-rb] Error 1

1.1.4 は Debian 側の Subversion だな。 まあ、Ruby も Subversion も複数あるから、どっかで混じったんだろう。 このエラーは無視。

(22:42)

Subversion サーバ

Debian パッケージが一致せず apache2-threaded-dev がインストールできないので、 WebDAV を使うのはあきらめた。 しょーがないので svnserve(+ssh) を使うことにする。

(23:18)

Ruby リファレンスマニュアル刷新計画 (4)

今日の man-rd-ja.tar.gz を取ってきて分類。 うげー、500 ファイルもあるのかよ。

とか言いつつ 3 時間強で分類完了。

pack テンプレートと sprintf フォーマットは ReFe でも扱いに苦労したけど、 やっぱりこれは問題だなあ。 テキストレベルでの include で対応するべきか……。

組み込みライブラリのクラス・モジュール・関数・定数・変数という分類はどうにかしたい。 今度のデータベースはメソッド単位で管理することになるので、 関数と定数はそこに混ぜればよい。問題は変数だ。 Object か Kernel のあたりに無理矢理つっこもうかなあ。

(01:58)

Ruby リファレンスマニュアル刷新計画 (5)

RDP のアーカイブから拡張ライブラリリファレンスを救出。

(02:27)

宣言

そういえば昨日何回か同じことを尋ねられたので、 声を大にして宣言しておきたい!

わたしはあくまで「Ruby な人」であって「Haskell な人」ではないので 4649。

ちなみに昨日『みんなの Python』が当たったのを見せびらかしたら 見せる人見せる人全員に「次は『ふつうの Python プログラミング』か!」 とか言われたんですが、それナイから! ありえないから! ていうかそんなに SBCr から Python ばっか出してどうすんの!

(02:31)

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

hyuki [刷新したRubyリファレンスマニュアルに「名前(愛称)」があると良いですね。]

成瀬 [「るびー りふぁれんす まにゅある」略して「るりま」、とか(待]

hyuki [そして「るびーリファレンスマニュアルを見なさい!」というのは、
  「るりまれ!」
というとか?(ぐぐれ!と同じ感覚)

「結構るりまったんですけれど、分かりませんでした」とか。]


2006-08-28

開発環境カンファレンス

Development Environment Conference
http://shibuyajs.org/articles/2006/08/28/development-environment-conference

告知きたー。

と、いうわけで、Shibuya.js の開発環境カンファレンスで喋ることになりました。 まわりがかなり豪華なので、 どういうネタを仕込むか考え中 (ネタを仕込むのは前提なのかっ)。

(21:23)

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

きむら [たとえ富士山よりも高い競争率があろうとも申し込む所存でしたが当日は通っている医者に行く日ですた orz]

nobsun [12:04にアクセスしたらもう締め切られてた。orz]

青木 [うは、めっちゃ早いですね。
最近のチケットプレミア率は異常だなあ。]

青木 [お会いできなくて残念です…… > きむらさん]

青木 [3 分で定員になったらしい。ありえない。]


2006-08-29

svnserve: authz でハマる

レポジトリに trunk/ を作るのを忘れてた。 どうせ rev 1 だし、レポジトリを全部作り直してしまおうと思いたった (……のが間違いの始まりだった)。

rm -rf して mkdir して svnadmin create して svnserv.conf と passwd 書き換えて svnserve 起動っと。 よし接続。

~ % svn co svn://svn.loveruby.net/rubydoc/ rubydoc
svn: Authorization failed

はい?

30 分くらい悩んだあげく、 svnserve.conf でこの行をコメントアウトしてしまっていたことに気付いた。

authz-db = authz

これは Apache 用の設定だからコメントアウトしちゃだめなのねー。 やられた。

(03:33)

Rubyリファレンスマニュアル刷新計画 (5) URL レイアウト

愛称ですか。確かに名前は重要だな。 「るりま」でもいいけど、ちょっと紛らわしすぎるかなあ。 書いてるときは大丈夫だと思うけど、発音したときが。

で、 URL でのファイル配置を決めた。

rubydoc/
    refm/
        spec/      「Ruby言語仕様」
        api/       「クラスリファレンス」
            files/
                _builtin
                English
                Env
                Win32API
                abbrev
                base64
                banchmark
                  :
                  :
            classes/
                Object
                String
                  :
                  :
            methods/
                Object/
                    __id__
                    __send__
                    allocate
                    ancestors
                    autoload
                    class
                    clone
                    display
                      :
                      :
                String/
                      :
                      :
        capi/      「拡張ライブラリAPIリファレンス」
            検討中
    faq/
    tutorial/

refm/api 以下はすべて動的生成される。

Rubyリファレンスマニュアル刷新計画 (6) 物理レイアウト

refm/api 以下のデータは、 レポジトリでは require 名単位で管理される。 その配置は以下のとおり。

api/src/
    _builtin/
        Object
        Array
        String
          :
          :
    English.rd
    Env.rd
    Win32API.rd
    abbrev.rd
    base64.rd
    bigdecimal.rd
    bigdecimal/
        jacobian.rd
        ludcmp.rd
        newton.rd
        utils.rd
    cgi.rd
    cgi/
          :
          :

src/ 以下では *.rd だけが意味を持ち、 その他のファイル (Object とか) はプリプロセッサでテキスト的に結合される。

Rubyリファレンスマニュアル刷新計画 (7) ソースドキュメントの構造

(#@include などをすべて処理して生成される) .rd ファイルは以下のような構造を持つ。

require ライブラリ名
require ライブラリ名
 
<ライブラリドキュメント>
 
--- 既存クラスに追加されるメソッド1
--- 既存クラスに追加されるメソッド2
 
= class クラス名 < スーパークラス名
 
include モジュール名
include モジュール名
 
<クラスドキュメント>
 
== クラスメソッド
--- メソッド1
--- メソッド2
--- メソッド3
 
== メソッド
--- メソッド1
--- メソッド2
--- メソッド3
 
= module モジュール名
 
<モジュールドキュメント>
 
== モジュール関数
--- メソッド1
--- メソッド2
--- メソッド3
 
== メソッド
--- メソッド1
--- メソッド2
--- メソッド3

Rubyリファレンスマニュアル刷新計画 (8) 提供される機能

新リファレンスマニュアルで最終的に提供される機能は以下の通り。

  • ライブラリ単位のドキュメント
  • クラス単位のドキュメント
  • メソッド単位のドキュメント
  • あるライブラリに含まれる全クラスおよび追加メソッドの検出
  • require ツリーの自動生成
  • あるクラスに含まれる全メソッドのリスト
  • クラス階層の表示
  • 継承と include を「潰した」ときのクラスのメソッド一覧
  • メソッドを起点として、そのメソッドがどのクラスで定義されるかの一覧
  • メソッドオーバーライドの表示
  • 親クラスの表示
  • すべての子クラスの表示
  • クラスを起点として、それを提供するライブラリの表示
  • メソッドを起点として、それを提供するライブラリの表示
  • 最低でも ReFe と同レベルの補完検索

(04:22)

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

takaBSD [> 愛称ですか。確かに名前は重要だな。「るりま」でもいいけど、
私は「るりふぁ」に一票。
でも「ReFe」と区別つきにくいかしら。]


2006-08-30

Ruby リファレンスマニュアル刷新計画 (8) 記述フォーマット

記述フォーマットに、既存の RD をそのまま使うつもりは全くない。 なんでかってーと ((<...>)) とか (({...})) とかが激しくウザいので。 こいつらを一掃する機会を俺は虎視眈々と狙っていたのだ。

例えば HTML の var に相当する ((|...|))。 今はこれを手でつけてるけど、こんなん全部自動化できる。 HTML の code に当たる (({...})) も 99% は自動で付けられる。 むしろ「code で囲まない」タグを用意したほうが効率がいいだろう。 この二つは変換も自動でできるので楽だ。

URL の構造が変わるので ((<...>)) はどっちにしろ人間による変更が必要。 記法は WikiName ちっくに [[tag:arg]] とするかな。

メソッドシグネチャの記述もこれまでより厳しく統一する。 なお、今回のフォーマットだと 「== class クラス」「== module クラス」の中では クラス名があらかじめわかってるので、 「--- concat(str)」でよい。 「--- String#concat(str)」と書く必要はない。 括弧は省略禁止。

二項演算子は「self + other」

単項演算子は「+self」「~self」

aref は「self[a, b]」、 aset は「self[a, b] = rhs」。

省略可能引数 (param = optval) とリスト引数 (*param) の扱いが問題だ。 いまは「(a[, b])」のように書いてあるけど、これってわかりやすいかねえ。 いっそ Ruby プログラムと同じにしてしまったほうが楽じゃないだろうか。 いまの形式ってパースも面倒だし (表記はツール側で変換するという手もある)。

Ruby のバージョンによって記述が違うときは、 専用プリプロセッサを使って次のように書く。

#@if(version >= "1.8.0")
Ruby 1.8.0 では……
#@end

単に「#if」「#end」を使わないのは、 ソースコードリスト中に現れる可能性が高いため。

(05:55)

svn or svn+ssh

公開するときのプロトコルを svn にするか svn+ssh にするかで悩む。

まあ、svn+ssh のが安全は安全だよな。 しかし、どーせ公開するもんをいじるんだから カジュアルに svn でいいような気もする。

Windows からだと、どーなんすかね。 svn+ssh でも面倒ではないのかな。 とりあえず svn+ssh 環境を自分のところで作ってみるか。

(07:03)

Ruby リファレンスマニュアル計画 (9)

あ、そうか。 メソッドの記述はもっと Ruby に近付けてしまおう。

--- m(params)
--- m!(params)
--- m?(params)
--- m=(params)
--- [](params)
--- []=(params)
--- +(params)
--- *(params)
--- +@(params)
--- ~(params)

これならパースをしくじることもないし。

(10:58)

Ruby リファレンスマニュアル計画 (10)

alias とメソッド追加とメソッド置き換えの存在が激しくめどい

(19:08)

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

zunda [Tortoise SVNとpageant.exe (PuTTY)の組み合わせは一度鍵対を作っちゃえば十分便利ですよ。]

znz [String#[]のようなものはどうするのでしょうか?
省略可能引数というものでもないし。
RDocのように複数行並べて1つにまとめる?]

青木 [Windows でも大丈夫なんですね。
それじゃ素直に svn+ssh にしましょうか。]

青木 [パースの