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@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)
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)
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)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
刷新したRubyリファレンスマニュアルに「名前(愛称)」があると良いですね。
「るびー りふぁれんす まにゅある」略して「るりま」、とか(待
そして「るびーリファレンスマニュアルを見なさい!」というのは、
「るりまれ!」
というとか?(ぐぐれ!と同じ感覚)
「結構るりまったんですけれど、分かりませんでした」とか。