トップ 最新 追記   RSS 1.0 FEED  

Journal InTime


2001-04-03 (Tue) [長年日記]

_ 回覧板

回覧板が回って来た。 町内会の花見があるらしい。 会費4000円は結構痛いなあ。 (どうせ貧乏ですよーだ。)


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-11 (Wed) [長年日記]

_

何か奥歯が痛いような気がするけど、気のせいに違いない。


2001-04-15 (Sun) [長年日記]

_ 花見

今日は町内会の花見だった。 とはいっても花見とは名ばかりで実は単なる宴会。 土曜に雨が降ったので室内だったし。


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-18 (Wed) [長年日記]

_ 長いも

朝長いもを食べたら、嘔吐と下痢の波が押し寄せて来た。

昔から長いもとかマカダミアナッツとか食べるとのどがかゆくなるんだけど、 こんなのははじめて。


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だったのか...。)

_ modruby ML

ようやくmod_rubyのMLを作成。

<URL:http://www.modruby.net/index.html#ml>

_ 渡辺真理

Pythonユーザの7%は渡辺真理を支持しているらしい。

<URL:http://python.friendly.co.jp/html/showPoll.pyp?qid=6842>

Rubyユーザの今井美樹支持率は何%くらいなんだろう。


2001-04-22 (Sun) [長年日記]

_ eruby

erubyにまた些細なバグが発覚。 ゴールデンウィーク前には0.9.2を出すかな。


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に苦しむ週らしい。


2001-04-26 (Thu) [長年日記]

_ libwrap-ruby

libwrap-ruby(ruby-tcpwrap)がDebian sidにinstallされてるみたい。

_ 解決編

謎のエラー の原因はスクリプトの最後に~という行があったこと。 どうしてそんなのが見つからなかったのかわからない人は次のコマンドを実行して みてください。

$ cat > foo
echo foo
~
^D
$ sh foo 
foo
foo: /home/shugo: is a directory
$ vi foo

森に木を隠す、というトリックでした。