トップ 最新 追記   RSS 1.0 FEED  

Journal InTime


2004-08-06 (Fri) [長年日記]

_ Xでの解像度の変更

XでCtrl+Alt+[+]とかで解像度を変更できるけど、仮想画面のサイズ(XF86Config-4のVirtualで設定するやつ)のサイズは変わらないようだ。 これだと、アプリケーションを全画面モードにした時に画面からはみ出して しまうので、あまりうれしくない(プレゼンの時に解像度を切替えたりしたいのだ)。

何とか、Xを再起動せずに仮想画面のサイズを変えられないかなあ。

_ IMAP interface for morg (2)

そりゃもう、嬉しいですよ >IMAPインタフェース

でも、検索じゃなくてメールボックスとして実装した方が面白いかも

[たださんのツッコミより引用]

勝手に特徴的な単語を抽出してメールボックス名を作っちゃったりするんでしょうか。 面白いかもしれないけど、うまく行くかなあ。

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

_ ただただし [じゃあせめて、一度検索したキーワードをメールボックスにして覚えておいてくれるとか。RandomNoteみたいに h..]

_ shugo [なるほど、それは便利そうですね。]


2004-08-07 (Sat) [長年日記]

_ LLW

5:30に起きたのに10:00の開始時刻に間に合わなかった。 東京は遠い。

自分の発表は何が何だかわからないうちに終わってしまっていた。

会場から「デザインパターンなんか使わずにサクッと短く書くのがLLの醍醐味では」とのツッコミが。 個人的には別にLLじゃなくてもオッケーなんだけどな(generic typeがあればJavaでも耐えられると思う)、と思いつつも、LLWであることを思い出し、その言葉を呑み込む。 結局、「デザインパターンを無理にそのまま使う必要はないけど、そんな感じのコードは自然に出て来るので、コミュニケーションの時にそういうパターンを表す用語があると便利ですよ」というお決まりの返答。 まあ、しばしば(自分もふくめて)用語の使い方が間違ってて誤解があったりもするわけですが。

ちなみに書いたコードはこれ。

<URL:http://svn.shugo.net/src/llw2004/trunk/ls-lR.rb>

$ LANG=C \ls -lR > ls-lR.txt
$ ruby /path/to/ls-lR.rb ls-lR.txt

のようにls -lRの出力を食わせると、シェル風の操作ができるというもの。 使えるコマンドはquit/pwd/cd/ls/dfs/bfsの6つ。 dfs/bfsはfind風に深さ優先探索・幅優先探索を行う。

行数はRubyが一番多かった(上のは配布した資料のものに加えて、Readline対応している - 本番でtypoしそうだったので - からさらに長くなっている)。 馬鹿正直にデザインパターンを使ったせいもあるけど(デザインパターンが テーマだったので)、Pythonはendがないから行数が減ってずるいよな、とか思ったり(あ、Pythonもわりと好きです、私は)。

ちなみに、全564行から、class/module/def/end/空行をのぞくと238行だったりする。

Tags: その他

_ LLW懇親会

色々な人にはじめて会うことができた。 実ははじめてじゃなかったりすると申し訳ない(でもたぶんおたがいさまだ)ので あえて名前はあげない。

やっぱりMIMEのライブラリは標準でほしいよなあ。

Tags: その他

2004-08-08 (Sun) [長年日記]

_ mod_ruby-1.2.1

リリースしました。 sargeに間に合うかな?

Tags: mod_ruby

_ スターバックスのマフィン

まずかった・・・敗北。

Tags:

_ Dr Pepper

LLWの会場で麦茶のボタンを押したのに、Dr Pepperが出て来た・・・惨敗。

Tags:

2004-08-09 (Mon) [長年日記]

_ mod_ruby-1.2.2

Apache2でSEGVが発生するバグがあったので修正してリリース。 まだおかしいとこもあるようだけど...。

Tags: mod_ruby

_ mod_rewrite

httpd.confの中でmod_rewriteを使う分には何も問題がないのだけど

.htaccessの中で使おうとすると403エラーになってしまう。

[徒然日記より引用]

うーん、手もとでは.htaccessでもmod_rewriteが使えてしまいました。 こんなので試しました。

RewriteEngine on
RewriteBase /~shugo
RewriteRule foo.txt /home/shugo/public_html/bar.html

ちなみにhttpd.confの設定はDebianのデフォルトのままで

<Directory /home/*/public_html>
  AllowOverride FileInfo AuthConfig Limit
  Options Indexes SymLinksIfOwnerMatch IncludesNoExec
</Directory>

となってます。

あ、ひょっとして

AllowOvverride all

[徒然日記より引用]

このvが一コ多いせいとか。

でもPHPでは動くんですよね。うーん。

うちの動作環境は以下の通りです。

Server: Apache/2.0.50 (Debian GNU/Linux) DAV/2 mod_ruby/1.2.2 Ruby/1.8.2(2004-07-29)
Tags: mod_ruby

_ 死なない

今度は、

mod_rubyを組み込むと/etc/init.d/httpd stopしてもプロセスが残ります

[徒然日記より引用]

とのこと。

うーん、

# apachectl stop

でも同様でしょうか。

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

_ ay [「.htaccessの中で使おうとすると403」というとFollowSymLinksもSymLinksIfOwner..]

_ smbd ["AllowOvverride"は手で書いた際のtypoです。すみません 両者とも未解決のままです(T_T 詳細は自..]


2004-08-10 (Tue) [長年日記]

_ GPG fingerprint

そういえば、肝心の高橋さんのをもらいわすれたー。 まあ、平時にはあまり必要ないか。

Tags: その他

2004-08-11 (Wed) [長年日記]

_ 死んだ

mod_rubyがやっと死んでくれた。

かずひこさんのマシンにアカウントをもらってデバッグをしたのだが、 どうもmomongaのlibpthread.soがstripされてるらしく、gdbが 使えなかった。 *1

というわけで、glibcのビルド。後で考えたら、glibc-debugパッケージの libpthread.aから作れば早かった。 で、追っかけてみると、どうもSIGTERMを二回受け取ってるせいのようだ。

というわけで、以下のパッチで死ぬんじゃないかと思います。

<URL:/tmp/mod_ruby-ruby_child_cleanup.diff>

何でmomongaでしか問題が起きないのかは気になるところだが、スレッドとシグナルの組合せは鬼門なので、あまり深追いしないでおこう。

Tags: Ruby

*1  ちなみに、Debianだとlibpthread.soはstripしてないようだ。

_ Rubyの標準ライブラリを全部インストールする方法

debian-ruby MLでの「Rubyの標準ライブラリをインストールするのにruby-stdlibなんて仮想パッケージがあったらいいんじゃないか」という意見に対する鵜飼さんの回答:

# apt-get install $(grep-available -n -s package -F source -X ruby1.8 | grep lib)

(8/2のメールを今ごろ読んでたり。)

Tags: Debian

_ IPAフォントのインストーラパッケージ

会社の後輩に「作って」と言って作ってもらったもの。 クレームは彼の日記の方にお願いします:p

Tags: Debian

2004-08-12 (Thu) [長年日記]

_ sidebar

tDiaryでsidebarを使うようにしてみた。

tDiaryのサイトではabsoluteを使ってるところが多いけど、CLIEで見た時に 表示モードによっては悲しいことになるので、floatを使うことに。 まあ、どうせCLIEではBloglinesで読むんだけど。

_ アンテナとBloglinesの使い分け

そうなると、他のツールで生成されている日記/ウェブログは携帯の画面には出てこないようにしてしまいたいところ。そこで、そういうサイトはBloglinesで見ることにした。これならアンテナ経由で読めないような場合でも、読み落としがないしな。

ただ、RSS feedしてないサイトはそうもいかない。それはもう、あきらめるとして、アンテナの方に特別な「携帯除外フラグ」を立てて、携帯からアクセスしたときだけ非表示にするようにした。

[ただのにっき(2004-08-11)より引用]

わたなべさんに教えてもらったんですが、RSS feedしてないサイトは、 はてなアンテナのメール機能+ BloglinesのEmail Subscriptionで読むようにしました。

ただ、CLIEでもあまり見やすくはないので、携帯だとどうかなあ。

_ tDiaryQuote 0.0.1

選択されたテキストをtDiaryで引用するためのfirefox用extensionを作ってみた。 はじめてにしてはまあまあの出来だと思う(けどすでにどこかにありそう)。

動作環境

  • tDiary 2.0.0
  • bq.rb
  • RD style

使い方

  1. 設定ダイアログで、update.rbのURLを設定する。
  2. 引用したいサイトを表示(この時のURLが引用に使われる)。
  3. 引用したい部分を選択。
  4. 右クリックのメニューから「tDiaryで引用」をクリック。
  5. tDiaryの編集画面が別のタブで出るので、後は普通に編集。

ToDo

  • 他のスタイルへの対応。
  • 引用する時のタイトルをセクションのタイトルにする。

_ tDiaryQuote 0.0.2

さっそくbug fix。

修正点

  • トラックバック送信先URLが見つからなかった場合は、plugin_tb_urlを 空にするよう修正。
本日のツッコミ(全2件) [ツッコミを入れる]

_ ただただし [ブラウザの幅を狭めると、下に回っちゃうのが難点ですねぇ >float]

_ shugo [たしかに。 やっぱ、NetFrontのレンダリングがいけないんでしょうねえ。]


2004-08-13 (Fri) [長年日記]

_ RDF探し

日記の更新情報を見たい人*1のRDFがないことを知った。

アンテナを作るしかないか…

[Kouji TAKAO diaryより引用]

tDiaryだったらtdiary2rssというのがあります。 html2rssというのも あるみたい。

_ 水族館

画像の説明

浜田にあるアクアスという水族館に行って来た。 同じ島根県なのに片道二時間以上...。

子供はわーきゃー言ってました。サメがこわくて。

写真はシロイルカ。

Tags: 家族

2004-08-14 (Sat) [長年日記]

_ mod_ruby with mod_rewrite解決

Options ExecCGI

...

なーんてしてしまっていた

で、これのせいでOptionsがExecCGIだけで、FollowSymLinks/SymLinksIfOwnerMatchが無効になってしまったらしい

[徒然日記より引用]

うう、すみません、設定のサンプルがあまりよくなかったですね。 修正しときました。

Tags: mod_ruby

_ おいでな祭

祭

八雲村の祭(おいでな祭という名前らしい)に。

花火が目当てだったのだが、けっこう近くで上がったので、子供は 大泣きだった。 おまけに疲れて寝てしまったものだから、車まで抱っこして歩くハメに。

Tags: 家族

2004-08-16 (Mon) [長年日記]

_ DSA-537-1 ruby

Andres Salomon noticed a problem in the CGI session management of Ruby, an object-oriented scripting language. CGI::Session's FileStore (and presumably PStore, but not in Debian woody) implementations store session information insecurely. They simply create files, ignoring permission issues. This can lead an attacker who has also shell access to the webserver to take over a session.

[Debian -- Security Information -- DSA-537-1 rubyより引用]

そういえば、前に同じような提案([ruby-dev:11261])をしたけど、 スルーされていたようだ。

Tags: Ruby

2004-08-17 (Tue) [長年日記]

_ Python Decorators

Pythonにはdecoratorというのがあるのか。いいなぁ。Rubyにも欲しいなぁ。例えばsoap4rで、webmethodというattributeを持っているメソッドだけをWeb serviceとして公開するとか使いたい。

上記blogで、symbolを返すというのもいいんだけど、classとのアナロジからは、defにはmethodオブジェクトを返したい。IRCでもそんな話をしていて、とするとunbound methodを? とかややこしそうで話が先へ進まない。

[NaHi Blogpoints - Powered By Bloglinesより引用]

あと、

synchronize \
def f
  ...
end

みたいに二行にする時に\を入れるのがちょっとどうかな、とか。

Tags: Ruby

_ ITmedia エンタープライズ:CVSにまた新たな脆弱性

セキュリティ調査会社iDefenseは8月16日発表したアドバイザリーで、Concurrent Versions System (CVS)にまた新たな脆弱性が見つかったことを明らかにした。

[ITmedia エンタープライズ:CVSにまた新たな脆弱性より引用]

ということだそうです:(

追記:

どうも二カ月前に修正されてたものらしいです。何で今さら。

_ check-update.txt に修正

後輩が書いていたスクリプトにsymlink vulnerabilityが発覚。

かずひこさんに脆弱性を指摘され,前田さんから聞いた tempfile(1) を使って修正しました.

[?日坊主(2004-08-17)より引用]

というわけで、みなさんアップデートを:)


2004-08-18 (Wed) [長年日記]

_ svnの不具合

$svn up

svn: Can't recode string

_ なにがどうなってるのかワカラナイ…orz

[大学生日誌(2004-08-17)より引用]

うちでもSEGVするようになって、デバッグ用にリビルドしたら直ったんですが、

Due to an unfortunate but necessary change to the apache2 packages that changed the ABI of libapr0, your package needs to be rebuilt against the latest apache2 packages.

[Debian Bug report logs - #266191 - mod-ruby needs to be recompiled for apache2 LFS transitionより引用]

これと同じ問題ですかね。

_ tDiaryQuote 0.0.3

設定画面でテンプレートを編集することによって、他のスタイルでも 利用できるように修正。

_ ビーバー

ビーバー

下の子がテレビの台をかじっていた。やっぱり男の子は元気だな。

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

_ ま2 [すごいですね > テレビ台 うちの子供(三歳)は,小さいときよく雑誌をやぶっては食べてました。]

_ shugo [食べますよねえ>紙 今朝もテレビ台をかじっていてちょっと飲みこんだかも:(]

_ ま2 [あまりに食べるので「食物繊維」とあきらめてました > 紙]


2004-08-19 (Thu) [長年日記]

_ The Jolt Programming Language

その名も「Jolt」!

ハッカー御用達のカフェイン飲料Joltにちなんで名付けられたらしい。 ドメイン名もwww.jolt-lang.orgと、ちゃんと-lang.orgの伝統(?)にのっとっている。

この言語はC++をリプレースするのを目的とする、静的型のシステム言語なのだが、 文法が(静的型があることを除けば)Rubyそっくり。「end文法」だし。

[Matzにっき(2004-08-18)より引用]

がーん、と思って見てみたら、そんなにRubyそっくりというほどではないようだ。

まつもとさんは、

Rubyの特徴であったブロックもGroovyではなんかハック的な文法*1であったのに対して、 こちらのブロックはきちんとRubyとそっくりのセマンティックスになっている。「do〜end」と「{〜 }」の両方が使えるところまでRubyそっくり。

[Matzにっき(2004-08-18)より引用]

と書かれているが、メソッド定義側の

class Vector is
   ...
   proc binop(do op: proc(int32, int32: int32)): int32 is
      v: int32 := this[0]
      for i in 1 .. this.size - 1
         v := op(v, this[i])
      end
      return v
   end
   ...
end

というのはちょっとRubyとは違うような。 これってGroovyみたいなセマンティクスじゃないのかなあ。

Tags: 言語

_ Apache::MethodDispatcher

外国人に、mod_rubyにmod_pythonのpublisherみたいなのはないか、と聞かれて作ってみた。 でも、

if !cls.public_instance_methods(false).include?(method_name)
  return FORBIDDEN
end

というのはどうも今一つ。 やはりDecoratorか。

Tags: mod_ruby

_ まつもとさんのツッコミ

"do"は"&"の置換であり、静的型言語なのでパラメータや戻り値の

型も指定されている、と読むんじゃないでしょうか。

[Journal InTime - The Jolt Programming Language , Apache::MethodDispatcherより引用]

なるほど、&の方でしたか。 yieldの方を期待していたのですが、yieldの説明を見て、何か違うな、と。

_ 文法変更

実はbabelの方も文法を変更をしようかな、とか。

  • 改行を文のセパレータに。thenも改行でいいかな。
  • 引数がないメソッド呼び出しにも括弧を使用 (括弧がない場合はbound methodを返す)。
  • x.fooはx.get_foo()、x.foo = yはx.set_foo(y)として扱う (Satherはそれぞれx.foo(), x.foo(y))。
  • :=を=に、=を==に、::=は:=に変更。
  • case insensitiveに。
  • $は廃止。
  • outパラメータの廃止。代りに多値を導入。

    divmod(x: int, y: int): int, int is
      return x.div(y), x.mod(y)
    end
    
    foo is
      a, b := divmod(38, 5)
    end   
  • 返り値の有無による多重定義の廃止。 返り値があるメソッド呼び出しも文に(dummy変数で受け取る必要なし)。
  • 構文糖としてのfor文の導入。

    for i, j in x.elt!, y.elt! do
      ...
    end

    は、

    loop
      i := x.elt!
      j := y.elt!
    end

    と同じ。

  • 同じく構文糖としてのwhile文。

しかし、迷うなあ、いろいろ。

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

_ まつもと ["do"は"&"の置換であり、静的型言語なのでパラメータや戻り値の 型も指定されている、と読むんじゃないでしょうか。..]


2004-08-20 (Fri) [長年日記]

_ defined?と改行

defined?と引数の間って改行が入ってもいいんだ。

foo = 1
p defined?
foo

出力結果:

"local-variable"

parse.yをながめていて気付いた。

しかし、何のために?

Tags: Ruby

_ Linux体験講座

島根大学の縄手先生の講座に、社長やまつもとさん、かずひこさん、その他大勢(失礼)と参加。 細かいところを(小声で、愛をこめて)つっこんだりしていたが、とても興味深かった。

一般の人向けのRubyによるプログラミング入門的な講座だったのだが、自宅の近所の奥さんが来ていたりして、びっくり。 時代は変わったものだ。

最後に演習の時間があったのだが、講座で説明された機能しか使っては いけないという縛りがあったので、会社のみんなもけっこう苦労していた。 中でも、

Loto6のような1から48までの数を6個作るスクリプトを考えましょう.やはり rand を使います.

ヒントと手順

* ループでくり返し乱数発生させます.

* 作った乱数は配列に順次格納します.

* もし前に出た数と同じものが出ると破棄します.

* 数が6個できあがったら出力します.

[Samplesより引用]

というのが曲者で、「えー、Array#include?も使っちゃだめなのかよ」という声多数。 まあ、Rubyだと思わなければ簡単なんですが。

縛りがないなら解はいろいろありそう。

candidates = (1..48).to_a
ary = (1..6).collect {
  candidates.delete_at(rand(candidates.length))
}
p ary

とか、

rand_stream = Object.new
def rand_stream.each
  loop do
    yield(rand(48) + 1)
  end
end
rand_stream.extend(Enumerable)
ary = []
6.times do
  ary.push(rand_stream.detect { |j| !ary.include?(j) })
end

とか。

まつもとさんはワンライナーでredoを使って書いていたようだ。

Tags: Ruby

_ 包丁とミキサーとフライパン

包丁とミキサー

フライパン

奥さんが注文していた包丁とミキサーとフライパンが届いた。

Tags: 買い物

_ めんたいこフランスパンとハンバーグとかぼちゃのスープ

めんたいこフランスパンとハンバーグとかぼちゃのスープ

というわけで、今夜は洋風のごちそうである。

パンも自家製でなかなかいける。けど、この間の方がもうちょっとおいしかった。同じ材料でも色々なところで違いが出るようだ。

Tags:

_ thenと:

いつの間にthenの代りに:が使えるようになってたんだ。

if foo:
  print "foo\n"
end

「次はこっそりendが省略可能になる」とはうささんの予言。

Tags: Ruby
本日のツッコミ(全8件) [ツッコミを入れる]

_ まつもと [私のはこんな感じ a=[]; 6.times{n=rand(48)+1; redo if a.include?..]

_ shugo [だいたい想像通りでした。 > しかし、やっぱ使う機能に制限がつくととたんにRuby的じゃなくなりますねえ。 はい..]

_  [ヒントと違うけど珠玉のプログラミングかプログラミング作法で読んだやつはこんな雰囲気でした。 a=[]; 48.t..]

_ shugo [へー、そんなやり方もあるんですね。 Loto6って順番は関係ないんですね。知らなかった...。]

_ ささだ [puts((1..48).sort_by{rand}[0...6])]

_ shugo [ここから最短競争が始まる予感 でもこれ以上短いのは無理かな? [0,6]にするとかを除くと。]

_ KENN [Loto6は順番に関係なく6つの数字を選ぶだけですが、Numbersは順番が関係するストレートと無関係なボックスの両..]

_ shugo [ふむふむ。おとなしく年末ジャンボにしときます。]


2004-08-21 (Sat) [長年日記]

_ 城床公園

まつもとさんおすすめの城床公園*1に行ってみた。

行くまでの道がかなり山奥感を演出していて、えらいとこに来てしまった、と 後悔しかけたが、着いてみるとなかなか立派な公園だった。 そりで滑れるところもあったりして、子供も大喜び。

ただ、帰りに、水車小屋の横のパイプにしたたか頭を打ってしまった。 奥さんに見てもらうと、内出血ぽくなっているようだ。とほほ。

Tags: 家族

*1  白潟公園と勘違いしていた。


2004-08-22 (Sun) [長年日記]

_ mod-ruby needs to be rebuilt to revert the apache2 ABI transition

The apache2 LFS transition has (sadly) been reverted, due to us spotting a few more bugs than we were willing to deal with in the 8 day time limit we were given. So, what this means is that your package needs to be updated.

[Debian Bug report logs - #267346 - mod-ruby needs to be rebuilt to revert the apache2 ABI transitionより引用]

えー。

Tags: Debian

_ ロールケーキ

ロールケーキ

手作りロールケーキもぐ。

Tags:

2004-08-23 (Mon) [長年日記]

_ .NET Framework 2.0 SDK Beta 1 x86

The Microsoft(R) .NET Framework Software Development Kit (SDK) version 2.0 includes everything developers need to write, build, test, and deploy .NET Framework applications--documentation, samples, and command-line tools and compilers.

[Download details: .NET Framework 2.0 SDK Beta 1 x86より引用]

いつの間にか出ていた。 たぶん、genericsがサポートされていると思うので、要チェックだ (monoと互換性があるといいな)。


2004-08-24 (Tue) [長年日記]

_ X-Ruby-CVS-SHA256Info

commitメールにSHA256を使うように変更。

X-Ruby-CVS-SHA256Info: ruby/ChangeLog, 1.2673.2.453, 0696c873fe9a961d45ff508d961e358cea0325de0ddc03100dba443dd31d62f0

長いよ。

Tags: Ruby

_ ピザ

ピザ

これも手作りである。宅配のピザって原価率低そうだよなあ。

Tags:

2004-08-25 (Wed) [長年日記]

_ tdiarytimes-flashstyle.rb

日記を登録した時間帯をタイムライン上に記録します。記録されたエントリは日時の経過と共にフェードアウトしていきます。

[trd by phonondrive - tdiarytimes-flashstyle.rbより引用]

今更ながら使ってみた。

_ monoのgenericsとrelfection API

monoでrelfection APIを使って、

class Foo<T> {
    public static void Bar(T o)
    {
        System.Console.WriteLine(o);
    }
}

class Test {
    static void Main ()
    {
        Foo<int>.Bar(0);
    }
}

のようなコードを生成してみた。

using System;
using System.Reflection;
using System.Reflection.Emit;

public class GenericTypeCreator {
    public static void Main()
    {
        AppDomain domain = AppDomain.CurrentDomain;
        AssemblyName assemblyName = new AssemblyName();
        assemblyName.Name = "test";
        AssemblyBuilder assembly =
            domain.DefineDynamicAssembly(assemblyName,
                                         AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder module =
            assembly.DefineDynamicModule("test", "test.exe");
        TypeBuilder foo =
            module.DefineType("Foo",
                              TypeAttributes.Public |
                              TypeAttributes.Class,
                              typeof(object));
        GenericTypeParameterBuilder[] typeParameters =
            foo.DefineGenericParameters(new string[] { "T" });
        GenericTypeParameterBuilder typeParameter = typeParameters[0];
        MethodBuilder bar =
            foo.DefineMethod("Bar",
                             MethodAttributes.Public |
                             MethodAttributes.Static,
                             null,
                             new Type[] { typeParameter });
        ILGenerator barIl = bar.GetILGenerator();
        MethodInfo writeLine =
            typeof(Console).GetMethod("WriteLine",
                                      new Type[] { typeof(object) });
        barIl.Emit(OpCodes.Ldarg_0);
        barIl.Emit(OpCodes.Box, typeParameter);
        barIl.EmitCall(OpCodes.Call, writeLine, null);
        barIl.Emit(OpCodes.Ret);

        MethodBuilder main =
            foo.DefineMethod("Main",
                             MethodAttributes.Public |
                             MethodAttributes.Static,
                             null, Type.EmptyTypes); 
        ILGenerator mainIl = main.GetILGenerator();
        Type gt = foo.GetGenericTypeDefinition();
        Type intFoo = gt.BindGenericParameters(new Type[] { typeof(int) });
        MethodInfo intBar = null;
        foreach (MethodInfo m in intFoo.GetMethods()) {
            if (m.Name == "Bar")
                intBar = m;
        }
        mainIl.Emit(OpCodes.Ldc_I4_0);
        mainIl.EmitCall(OpCodes.Call, intBar, null);
        mainIl.Emit(OpCodes.Ret);
        foo.CreateType();
        assembly.SetEntryPoint(main, PEFileKinds.ConsoleApplication);
        assembly.Save("test.exe");
    }
}

実行結果:

excelsior:gmcstest$ gmcs codegen.cs && ./codegen.exe && ./test.exe
ALPHA SOFTWARE: Mono C# Compiler 0.96.0.0 for Generics
Compilation succeeded
0

とこう書いてしまうと、簡単なのだが、ちょっとしたことではまって、えらく 時間がかかってしまった。

Type#BindGenericParameters()は、Type#GetGenericTypeDefinition()で 取得したTypeオブジェクトに対して呼び出さなければならない。 ところが、TypeBuilderに対して呼び出していたため、NullReferenceExceptionが 発生していた。 *1

やっぱりエラーメッセージ重要。 *2

Tags: 言語

*1  後で調べると、TypeBuilderのGetGenericDefinition()は何らかの 処理を行った後にthisを返しているようだ。

*2  追記: エラーメッセージがわかりにくくて苦労したという意味です。

_ monoのJITコンパイラが生成したx86コードを読む

monoに-v -v -vというオプションを与えるとディスアセンブルして表示して くれるようだ。

you can disassenble the code

do this:

mono -v -v -v foo.exe > x

[Exploring: What does newobj look like?より引用]

ちなみにILレベルのディスアセンブラはmonodisという別のコマンド。 こちらの方にはよくお世話になっている。

_ babel

おっ。Satherの.NET実装だ。ちょっと期待しちゃうぞー。IteratorとParametrized classを、CLI(.NET2.0)のIteratorとGenericsにいかに統合するかが鍵かな。 あとはCode inclusionがネックか。

[oka326 blogより引用]

おお、はじめてblogで反応が。

しかし、ずっとほったらかしてたので期待させてしまって申し訳ない気もする。 Satherと互換性なくなるかもしれないし。 *1

一番悩ましいのはcode inclusionですね。C#の普通の継承とどう辻褄を 合わせるか。

相互運用性を確保するには何らかの形でC#的な継承を許さないといけない と思うけど、SatherにそのままC#的な継承を追加してしまうのもどうかと。 今のところ、C#のクラスから継承したクラスの子孫のみに普通の継承を許して、それらはSatherのクラスにincludeすることはできないようにする、 くらいしか思いつかない。 あと、ソースがないクラスもincludeできた方がうれしいとは思うけど、 今のところプライオリティは低いですね。

当面の目標はparameterized typeのサポート。

しかし、コンストラクタの問題とか、色々悩みはつきないなあ。

Tags: babel

*1  もっともSatherとの互換性なんてあんまり重要じゃなさそうだけど。

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

_ oka326 [どうも、blog見つけていただいたようです。Satherで書いているかと思いきやC#だったんで意外といえば意外。でも..]


2004-08-27 (Fri) [長年日記]

_ oka326さんのツッコミ

Satherで書いているかと思いきやC#だったんで意外といえば意外。でもその方がいいですね。Code inclusionなんぞいらんので、Satherを断ち切ってどんどんいい言語に仕上げて言ってください。.NETとの親和性の高さに期待してます:-)

[Journal InTime - tdiarytimes-flashstyle.rb , monoのgenericsとrelfection API , monoのJITコンパイラが生成したx86コードを読む , babelより引用]

ありがとうございます。

C#なのは、単純にその方が実装が楽だったからです(言語じゃなくてライブラリの機能的に、ですが)。

code inclusionにはいいところもあって、たとえば、SAMEがサブクラスに 展開されるのは結構うれしいですね。

とかいいつつ、単一継承 + delegationの言語的なサポートとかにしちゃうかもしれないですけど。

Tags: babel

_ parameterized type はじめの一歩

svnのheadで 以下のコードをコンパイルできるようになった。

class VALUE_HOLDER{T} is
  attr value: T;

  create(value: T): SAME is
    res ::= new;
    res.value := value;
    return res;
  end;

  get: T is
    return value;
  end;

  set(value: T) is
    self.value := value;
  end;
end;

class MAIN is
  main is
    x: VALUE_HOLDER{STR} := #VALUE_HOLDER{STR}("foo");
    #OUT + x.get + "\n";
    x.set("bar");
    #OUT + x.get + "\n";
  end
end

ここからが大変そうだけど。

Tags: babel

_ C# 2.0の匿名メソッド

C# 2.0の匿名メソッドって

addButton.Click += delegate {
    listBox.Items.Add(textBox.Text);
};

みたいに書けるんだ (と今更C# 2.0 Specificationを読んで知った)。

てっきり、

addButton.Click += new EventHandler(sender, e) {
  listBox.Items.Add(textBox.Text);
};

としか書けないと思いこんでいた (C# プログラミング言語の将来の機能という文書のせいだ)。

名前を指定しなくていいだけじゃなくて、使わない時はパラメタを省略してもいいらしい。*1

Tags: 言語

*1  ただし、outパラメタは省略できないし、省略する時は全部省略しないといけないようだ。


2004-08-28 (Sat) [長年日記]

_ ねずみ

ムカデが出なくなったと思ったら今度はねずみかよ。 米の袋を食い破って食べていたようだ。糞もいっぱいあったし:(

猫を飼うとねずみやゴキブリがいなくなるらしいけど、それって 食べてるってことだよね...。 ねずみホイホイや殺鼠剤も後の処置に困りそうだし、やっぱり超音波か。

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

_ @@@@ [超音波も人によっては聞こえるらしいですしねぃ。 乾物類は缶などに入れるようにして,忌避剤撒いてみたら?]

_ shugo [人体への影響が本当にないかどうかは気になるところですね。 とりあえずホームセンターに行ってみます。]

_ ただただし [猫飼いませんか…?]

_ woods [http://d.neverland.to/toshi/?date=20040827#p08 というような話もありま..]

_ shugo [うう、やっぱり猫ですかねえ。 でも子供が小さいしなあ。]

_ なをぞ [うちも4-5年ほど前クマネズミが出て困ったことがありました。そのときはまずヤツの行動を探るため,夜寝るときに180分..]

_ shugo [うーん、がんばります...。]


2004-08-30 (Mon) [長年日記]

_ ささださん来訪

ささださんが松江に来られて、ヨタ話の後、YARVについていろいろお話 をうかがう。 開発はさくさく進んでいるようだ。 来年の2月ごろにはみなさんのお手元にRiteが届けられるかもしれない。

Ruby2の仕様についてもいろいろ話したが、衝撃の事実が。 まつもとさんいわく、Ruby2では本物の多値を導入してもいいかも、との こと。わーい。つまり、Valuesみたいなのは(少なくともRubyレベルからは) アクセスできなくなる。 ちなみに、

x = 1, 2

の挙動はまだ決まってないらしい。x = 1かエラーかな?

あと、ブロックパラメータによる外側の変数のhideはなくしましょうよ、 と(何度目かわからない)プッシュをしてみたのだが、やはりまつもとさん の考えを変えることはできなかった。

というわけで、一勝一敗。

Tags: Ruby

2004-08-31 (Tue) [長年日記]

_ CLUとLisp

まつもとさんに聞いた話。

Liskovはあるインタビューで、CLUのセマンティクスはLispの影響を受けている、 と答えているらしい。 いったいどこがどうLispなんだろう...。

Tags: 言語