2001-04-06 (Fri) [長年日記]
_ make
最近はコマンドのメッセージの国際化が進んでいて便利になったが、 同僚は次のような屈辱的なメッセージを受け取ったらしい。
$ make Makefile:2: *** 分離記号を欠いています (8 個の空白でしたが、TAB のつもりですか?). 中止。
「その通りです。ごめんなさい。」
2001-04-09 (Mon) [長年日記]
_ 締め日
4月の昇給を期待していたところへ下記のようなメールが。
1. 変更前: 20 日締めの当月 25 日支払い 変更後: 15 日締めの当月 25 日支払い 2. 1 に伴い、4 月分(4月25日支払分)のみ日割計算になります 給与額 × 26/31 = 4 月分給与額
うがー、何か納得行かねー。
2001-04-10 (Tue) [長年日記]
_ mod_ruby
mod_rubyで、Rubyでリクエストハンドラを書けるようにしてcvsにcommitした。
# cat.rb require "singleton" class Cat include Singleton def handler(r) begin body = open(r.filename).read r.content_type = "text/plain" r.send_http_header r.print(body) return Apache::OK rescue Errno::ENOENT return Apache::NOT_FOUND rescue Errno::EACCES return Apache::FORBIDDEN rescue return Apache::SERVER_ERROR end end end
みたいなスクリプトを書いといて、httpd.confで、
RubyAddPath /home/shugo/ruby RubyRequire cat <Location /cat> SetHandler ruby-object RubyHandler Cat.instance </Location>
なんて設定をしておくと、/cat/以下にアクセスした場合はCat#handlerが呼ばれる。 別にSingleton使わなくても、Object.newして特異メソッド定義するだけでもいいけど。
後は他のハンドラも定義できるようにしなきゃな。
_ mod_rd2html.rb
ちょっと実用的なモジュールをRubyで書いてみたり。 これはRDをHTMLに変換するモジュール。
# mod_rd2html.rb require "singleton" require "rd/rdfmt" require "rd/rd2html-lib" class RD2HTML include Singleton def handler(r) begin open(r.filename) do |f| tree = RD::RDTree.new(f) visitor = RD::RD2HTMLVisitor.new r.content_type = "text/html" r.send_http_header r.print(visitor.visit(tree)) return Apache::OK end rescue Errno::ENOENT return Apache::NOT_FOUND rescue Errno::EACCES return Apache::FORBIDDEN rescue return Apache::SERVER_ERROR end end end
たとえば、httpd.confで、
RubyRequire mod_rd2html <Location /rd> SetHandler ruby-object RubyHandler RD2HTML.instance </Location>
なんて設定をすると、http://www.foo.org/rd/foo.rdでfoo.rdをRDに変換した結果が 見られるわけ。 ERbを使うモジュールなんかも簡単にできそうだな。
2001-04-17 (Tue) [長年日記]
_ David Lee Roth
今週のヘヴィ・ローテーションはDavid Lee Roth BandのEAT'EM AND SMILE。 もう15年も経つのか。
_ libwrap-ruby, libchasen-ruby
libwrap-rubyとlibchasen-rubyをdebian.orgにITPした。
_ 予約
明日は歯医者です。どきどき。
2001-04-19 (Thu) [長年日記]
_ ERuby::Compiler
erubyを拡張ライブラリとして利用できるようにした。
require "eruby" file = ARGV.shift || STDIN compiler = ERuby::Compiler.new print compiler.compile_file(file)
erubyは一気に0.9.0にするかな。 (二年もたつのにまだ0.1.3だったのか...。)
_ 渡辺真理
Pythonユーザの7%は渡辺真理を支持しているらしい。
<URL:http://python.friendly.co.jp/html/showPoll.pyp?qid=6842>
Rubyユーザの今井美樹支持率は何%くらいなんだろう。
2001-04-24 (Tue) [長年日記]
_ 末尾再帰
前もやったけど末尾再帰の最適化をRuby 1.7に実装してみた。
<URL:http://www.shugo.net/archive/ruby17-tail-recursive.diff>
末尾再帰の最適化とは、簡単にいうと、
def foo(...) ... return foo(...) end
のような末尾再帰でスタックを食い尽くさないようにすること。
どうやって実現しているかというと、あるメソッド(A)内の最後のメソッドコール(B)では、 Aに戻って来る必要がないことを利用して、Bの前にAの呼び出し前に戻ってしまう、という 方法を使っている。上記のコードでは、return foo(...)という部分でいったんfooの呼び 出し元に戻ってから再びfooを呼ぶので、何回fooを呼んでもスタックを食い尽くすことが ないってわけ。現状ではメソッドコールのたびにsetjmp()するので効率が悪いけど、上手 くやれば改善できると思う。
ところがmake testに通らない。原因は、
def foo proc { return "hello" }.call end p foo
みたいなのが
-:3:in `call': return from proc-closure (LocalJumpError) from -:3
というエラーになること。 最適化でProc#callの前にfooの呼び出し元に戻るので、Procがorphan (みなしご)になっちゃうわけですね。
これは難しいなあ。 orphanなProcからreturnした時は、例外を上げる代りにcontinuationで 元のメソッドに戻ることにするとかいうのは...だめだろうな。
_ 続き
上のバグの対処法を思いついたけど、上手く動かない。 うーん、今日はPC持って帰るか。
2001-04-25 (Wed) [長年日記]
_ 末尾再帰(2)
何とか不具合を解消してmake testは通るようになった。 (CFLAGSに-DTAIL_RECURSIVEを追加されたし。)
<URL:http://www.shugo.net/archive/ruby17-tail-recursive-2.diff>
ところが、今度は次のようなコードで問題が。
def bar a = 1 return binding end eval("p a", bar)
うーむ。
_ 謎のエラー
ずっと次のようなエラーが出るのに原因がわからないシェルスクリプト (実はめったにloginしないホストの.bashrc)があった。
bash: /home/shugo: is a directory
上手く動作しているように見えるのだが、必ず上記のエラーが出る。 しかし何回viで見ても原因がわからない。
ところが今日エラーの原因がわかった。 わかってみれば簡単なことだったんだけど、みなさんは原因がわかりますか? (ヒントは上の文章の中にあります。)
_ 親不知
歯(というか歯茎?)が痛いのは親不知のせいだった。 今週はorphanに苦しむ週らしい。