唐突にコンパイラを作ることにした。記述言語は Ruby でコンパイル対象言語はC♭ (C フラットと読め。C のサブセット)。ターゲットマシンは ix86/Linux のはずだけど、とりあえずはメインマシンが AMD64 なので AMD64 で行ってみた。
~/c/cflat % cat test/hello.cb aamine@serenadeintmain(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@serenadeHello, World!~/c/cflat % file hello aamine@serenadehello: 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 の動的パーサ生成について考え中。
うーむ。やっぱりシンボルの連接には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)
足し算と関数呼び出し (らしきもの) ができるようになった。
~/c/cflat % uname -srmLinux 2.6.8-11-amd64-k8 x86_64~/c/cflat % cat test/add2.cbintmain(int argc, char **argv){ printf("ret=%d\n", f(76)); return 0;} intf(int i){ return i + 1;}~/c/cflat % ruby -I./lib ./bin/cbc test/add2.cb~/c/cflat % file add2add2: 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 % ./add2ret=77
Linux/AMD64 の calling convention を初めて真面目に調べたよ。最初の 6 個が rdi, rsi, rdx, rcx, r8, r9 で残りがスタックらしい。まだレジスタをちゃんと割り付けるロジックを書いてないので、手で割り当てるのが非常にめんどくさかった。
(19:58)
net/smtp の SSL 対応パッチをとりこみ中。
うーむ、いまさらだが、なんで SSL::Context じゃなくてverity と cert を別々に受け取っているのだろう。このへんは何も考えずにパッチをとりこんだから意図がわからんな。あっさり context にしてしまおう。
(09:49)
コミット完了。いつもながら、smtp と pop はテストがめんどくさい。
[変更点]
ついでに 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)
クーラー 2 台に電子レンジを付けた時点で「バツン!」と凄い音がしてブレーカーが落ちた。最近は横着して UPS とか入れてないもんで、外向けサーバを含む全マシンが停止してしまった。真面目に UPS を入れていた時には何も起こらず、適当な運用を始めるとブレーカーが落ちるあたり、世の中はよくできている。
ファイルシステムは ext3 か RaiserFS だから被害は最小に留められたと思うけど、やっぱ UPS くらい入れておくかなあ。でも UPS 入れても Linux だと UPS 監視ソフトを動かすのが面倒だったりするんだよなあ。最近は USB 接続の UPS も操作できるようになったんだろうか。
genpower はあんま変化なしか。
APC は高いから避けたい。
NUT というのも UPS 関係ぽい。USB も使えそう。このへんを調べてみよう。
NUT (Network UPS Tools) 公式サイト
http://www.networkupstools.org/
サポートしてる UPS はどんなのがあるかというと、えーと、このへんか。
http://www.networkupstools.org/compat/stable.html
うう、やっぱり持ってる UPS がない。買わなきゃだめかー。
(14:11)
Ruby の CVS レポジトリをミラーしてる cvsup がこんな文句を言ってきたんだけど、何だろう?
ruby/ChangeLog,v: Checksum mismatch -- will transfer entire fileruby/lib/rinda/ring.rb,v: Checksum mismatch -- will transfer entire file
(17:16)
http://slashdot.jp/articles/06/08/23/1344251.shtml
西田さんが自費出版か……。そんなのめんどくさいだろうに、よくやるなあ。
ぶっちゃけた話、この人の文章はあまり好きじゃないんだけど、純粋に知識面だけで見れば貴重な本だとは思う。そんなわけで 1 冊予約しておいた。
(02:34)
うーむ、FF3 出たのか。なつかしい。DS ごと買っちゃおうかなあ。
システムは FF5 風になったんだな。3 では使えなかったジョブも役に立つようになってるだろうか。学者なんてハイン戦しか役に立たなかったもんなあ。
……ぐあ、賢者が合体召喚を使えなくなってる?!ということはクリスタルタワーは忍者忍者賢者賢者ではなくなるのか?召喚の白黒がそのままの効果だったら嫌になるほど使えねーぞ。
クリスタルタワーと言えば、ちょっとは短くなってんだろうねアレ。確か FF シリーズ最長のラストダンジョンなんだよね。体感では FF2 のジェイド + パンデモニウムのほうが明らかに長いんだが、あれは敵の出現率が高いからそう感じるだけらしい。しかも FF2 の敵はバカみたいに強いし。
パンデモニウムと言えば、FF3 にはマサムネあったっけ?ラグナロクのイメージが強すぎて思い出せない。(攻略本を見つつ) えーと、あ、やっぱあるね。エクスカリバーと攻撃力同じなのか。しかしマサムネのが命中率が高い。
だんだん思い出してきた。確か FF3 にも結構強い敵がいたな。カタカナ 4 文字で黒いやつ。そうだクムクムだ。ファイガ、ブリザガ、サンダガ、ブレクガ、デスを使うらしい。あれが徒党を組んで出てくると泣ける。
だが FF3 で強いと言えばやはりくらやみのくもではなかろうか。全ターン「はどうほう」は酷すぎる。行動が読みやすいのは楽だけど。あのへんも変わってるのかなあ。一回目のくらやみのくも (無敵) で手裏剣を使い果たすのはとてもありがちだ。
うう、やっぱり欲しくなってきた……。
(16:36)
■ささだ [とても欲しくなってきた!]
LL ring の「LLで関数プログラミング」でしゃべってきました。聞いていただいた皆さん、ありがとうございました。
今回わたしは基本的にウケをとるか解説するか火種を撒くか、てな狙いでしゃべってみました。なので、喋ってることが一貫してない面があったかもしれません。もうちょっと前もって内容を詰めておいたほうがよかったのかなあという気もします。
ちなみに、「関数型言語は使いたいけど 遅延評価は欲しくないなんて そんなの微妙すぎ〜」は、おっぱい占いをもじってみたつもりだったの。スベったネタを解説するのも不粋だけどな。
ちなみに、リングのロープを一番上から乗り越えるのを休憩時間中にやってみたけど、見事に失敗しました。
超幹事主催 (?) の二次会に参加。主な内容
暗号化しすぎた。
続いて、帰れなくなった人達による徹夜三次会。なぜ 9 人もいますか?一言でまとめると、あとで書く。
いつまでたっても Ruby のリファレンスマニュアル整備計画が進展しない件を高橋さん・西山さんと相談した結果、気合いと根性で実行することになりました。8/31 までに (loveruby.net で) svn レポジトリを公開して、9/20 までに (loveruby.net で) 新システムを公開します。
こんなんできるんですかねえ。
(07:49)
12 時間も寝てしまった……。
Ruby リファレンスマニュアル計画の目標について。
[クラスリファレンスについて]
[その他について]
分担について。
[俺が一人でやること]
[他の人の協力を求めること]
ファイルは一つか二つだけサンプルを作るので、それを参考にして他のファイルをコミットする、ということにする予定。
(20:44)
とりあえず Subversion をインストールしよう。
tukumo:~/src/subversion-1.3.2/apr/dso/unix % make aamine@tukumomake[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.lodso.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 oncedso.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 -ldltukumo:~/src/subversion-1.3.2 % aamine@tukumo
でけた。
(22:16)
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@tukumocd /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=normalLoaded suite testStartedEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.......E..........EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE..EEEEEEEEEEEFinished 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@tukumocd /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=normalLoaded suite testStarted..........................................................................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 errorsmake: *** [check-swig-rb] Error 1
1.1.4 は Debian 側の Subversion だな。まあ、Ruby も Subversion も複数あるから、どっかで混じったんだろう。このエラーは無視。
(22:42)
Debian パッケージが一致せずapache2-threaded-dev がインストールできないので、WebDAV を使うのはあきらめた。しょーがないので svnserve(+ssh) を使うことにする。
(23:18)
今日の man-rd-ja.tar.gz を取ってきて分類。うげー、500 ファイルもあるのかよ。
とか言いつつ 3 時間強で分類完了。
pack テンプレートと sprintf フォーマットは ReFe でも扱いに苦労したけど、やっぱりこれは問題だなあ。テキストレベルでの include で対応するべきか……。
組み込みライブラリのクラス・モジュール・関数・定数・変数という分類はどうにかしたい。今度のデータベースはメソッド単位で管理することになるので、関数と定数はそこに混ぜればよい。問題は変数だ。Object か Kernel のあたりに無理矢理つっこもうかなあ。
(01:58)
そういえば昨日何回か同じことを尋ねられたので、声を大にして宣言しておきたい!
わたしはあくまで「Ruby な人」であって「Haskell な人」ではないので 4649。
ちなみに昨日『みんなの Python』が当たったのを見せびらかしたら見せる人見せる人全員に「次は『ふつうの Python プログラミング』か!」とか言われたんですが、それナイから! ありえないから!ていうかそんなに SBCr から Python ばっか出してどうすんの!
(02:31)
Development Environment Conference
http://shibuyajs.org/articles/2006/08/28/development-environment-conference
告知きたー。
と、いうわけで、Shibuya.js の開発環境カンファレンスで喋ることになりました。まわりがかなり豪華なので、どういうネタを仕込むか考え中 (ネタを仕込むのは前提なのかっ)。
(21:23)
レポジトリに trunk/ を作るのを忘れてた。どうせ rev 1 だし、レポジトリを全部作り直してしまおうと思いたった(……のが間違いの始まりだった)。
rm -rf して mkdir して svnadmin create してsvnserv.conf と passwd 書き換えて svnserve 起動っと。よし接続。
~ % svn co svn://svn.loveruby.net/rubydoc/ rubydocsvn: Authorization failed
はい?
30 分くらい悩んだあげく、svnserve.conf でこの行をコメントアウトしてしまっていたことに気付いた。
authz-db = authz
これは Apache 用の設定だからコメントアウトしちゃだめなのねー。やられた。
(03:33)
愛称ですか。確かに名前は重要だな。「るりま」でもいいけど、ちょっと紛らわしすぎるかなあ。書いてるときは大丈夫だと思うけど、発音したときが。
で、 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 以下はすべて動的生成される。
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 とか) はプリプロセッサでテキスト的に結合される。
(#@include などをすべて処理して生成される) .rd ファイルは以下のような構造を持つ。
require ライブラリ名require ライブラリ名 <ライブラリドキュメント> --- 既存クラスに追加されるメソッド1--- 既存クラスに追加されるメソッド2 = class クラス名 < スーパークラス名 include モジュール名include モジュール名 <クラスドキュメント> == クラスメソッド--- メソッド1--- メソッド2--- メソッド3 == メソッド--- メソッド1--- メソッド2--- メソッド3 = module モジュール名 <モジュールドキュメント> == モジュール関数--- メソッド1--- メソッド2--- メソッド3 == メソッド--- メソッド1--- メソッド2--- メソッド3
新リファレンスマニュアルで最終的に提供される機能は以下の通り。
(04:22)
■takaBSD [> 愛称ですか。確かに名前は重要だな。「るりま」でもいいけど、
私は「るりふぁ」に一票。
でも「ReFe」と区別つきにくいかしら。]
記述フォーマットに、既存の 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 にするか svn+ssh にするかで悩む。
まあ、svn+ssh のが安全は安全だよな。しかし、どーせ公開するもんをいじるんだからカジュアルに svn でいいような気もする。
Windows からだと、どーなんすかね。svn+ssh でも面倒ではないのかな。とりあえず svn+ssh 環境を自分のところで作ってみるか。
(07:03)
あ、そうか。メソッドの記述はもっと Ruby に近付けてしまおう。
--- m(params)--- m!(params)--- m?(params)--- m=(params)--- [](params)--- []=(params)--- +(params)--- *(params)--- +@(params)--- ~(params)
これならパースをしくじることもないし。
(10:58)
■zunda [Tortoise SVNとpageant.exe (PuTTY)の組み合わせは一度鍵対を作っちゃえば十分便利ですよ。]
■znz [String#[]のようなものはどうするのでしょうか?
省略可能引数というものでもないし。
RDocのように複数行並べて1つにまとめる?]
■青木 [Windows でも大丈夫なんですね。
それじゃ素直に svn+ssh にしましょうか。]
■青木 [パースの時点で一つにまとめます。
それくらいは ReFe でもすでにやってるので、同じですね。]
■ささだ [https は?]
■青木 [なんでか知らないけど apxs (のパッケージ) が入れられない。
ので mod_dav_svn がビルドできない。ので無理。]
■ささだ [うへぇ。atdot.net 使う?]
俺、がんばって Subversion の Ruby インターフェイス入れてたけどさ、よくよく考えると、今回の設計じゃ Ruby インターフェイスを使う場所なんてなかったよ。コミットと同時にワーキングコピーを svn up してデータベースをリビルドすればいいだけだもんな。
(17:24)
ああそうか、問題がわかった。
apache2-dev (= apache2-threaded-dev) が libapr0-dev に依存しているのだが、libapr0-dev 2.0.54-5 はセキュリティホールが見付かって公開停止になりあらゆるミラーから消されているということか。いつ復活するんだろうなあ……。しかも AMD64 だと復活するの遅そうだよなあ……。なんかいい方法ないんかのう。
そうか! Ruby インターフェイスを使う必要がないのならSubversion を新しくする必要はないんだ。ということは mod_svn も Debian のパッケージで入れればいいんじゃないか。簡単な話だったな。ちょっとセットアップしてみますよ。
ていうか HTTPS のセットアップがめんどくせーな。問題は認証のとこだけなんだから、Digest 認証を使うことにして HTTP でいいか。
(22:52)
Apache2 + WebDAV + Subversion + auth_digestが予想外に簡単にできてしまった。これでいこう。あと一時間。
(22:59)
さらによくよく考えてみると、Ruby インターフェイスを使う Subversion がサーバの Subversion である必要性はなかった。サーバ上に Subversion が二つあってもいいんだし。なんだ、どこにも問題ないじゃん。
(23:03)