K.Sasada's Home Page

Diary - 2006 March

研究日記

弥生

_31(Fri)

昨日まで YAPC。

凄い熱気。英語がわからなくてとてつもなく残念。

全体的に高橋メソッドばかりだった気がする。

_30(Thu)

色々と勉強させていただきました。感謝。

というか、色々とすみません。陳謝。


IRC で英語勉強しないとなぁ、と言ったら http://www.jgram.org/http://www.popjisyo.com/WebHint/Portal.aspx を教えてももらった。前者の日本語の問題がすげえ難しいと思った。


http://shootout.alioth.debian.org に YARV が試験的に追加されてるらしい(http://shootout.alioth.debian.org/gp4sandbox/)。おおお。


そういえば、今日帰ったら財布の中身が300円弱だった。俺は小学生か。


IRC に dblack が居たのでちょっと聞いてみたら、it will be in the denver area, october 20-22 だって。


ダメダメな感じで眠い。

_shiro(Thu Mar 30 10:39:48 JST 2006)

 大丈夫。わしも$5以下のことがある>財布の中身。

_nishio(Fri Mar 31 11:18:09 JST 2006)

 最近、食事して代金を払ったら17円しか残らないというハプニングがありました(苦笑

_29(Wed)

YAPC::Asia の会場から。プレゼンテーションが和訳されててえらいなぁと思った。


花見どうしようかな。誰かやりたい人いる?

_斎藤ただし(Wed Mar 29 16:23:02 JST 2006)

 もし今年もお花見するなら、参加したいです(と一人でも意思表明してみます)。

_dfft(Wed Mar 29 21:33:23 JST 2006)

 昨年は4月の中旬ぐらいだったかと思います。今年もそれぐらいでいかがでしょうか。

_ささだ(Thu Mar 30 01:21:20 JST 2006)

 あら、そんなに遅かったでしたっけ。ちなみに、今年は開花が早いようなので、ちょっと急いだほうがいいかしらん?

_28(Tue)

アスペクト指向入門をざっと読んだ。で、感想を書いていたんだけど、何度も消えてしまった orz

とりあえず、難しいということはわかった。真ん中くらいがAspectJ入門書になっていて、入門が簡単に行かないという感じ。難しい概念だから、しょうがないのかも。

あと、会話形式の解説は、大変読みやすくて良かった。が、その中だけで反論を出していて、とくにそのままという話題が多かったので、どっちの主張が正しいのかよくわからなかった。よくわからない、検討中の事項を多く会話形式の中に問題点やよく指摘される点として盛り込んでいるのはわかったんだけど、気合を入れて考えないとわからなくて、読みやすさとのギャップが大きく、混乱した。


動的であることとeval使いまくりなこととはとりあえず同じではないよね。


おお、RailsConf。カッコイー。


なんか、NaClさん超忙しそう。


次のやーまには eval の仕組みでもやってみようか。いや、スタックフレームの説明からはじめないといけないから大変だな...。


うーむ、Enumerable#grep なんて使ったこと無かった。

そういえば、rand 0 が rand() 相当だということを知らなかった。


そういえば、rubyco さんみたいな人が python を調べてくれると、俺にとってはありがたいんだなぁ。チュートリアル見ろよって感じだけど。


opensparc-t1: OpenSPARC T1。こんなものを見つけてしまってさあ大変。もう、ほかの事そっちのけですよ。


明日の YAPC のチケットが見当たらない。チケットがないと、やっぱり入れないのかなあ。


http://pc8.2ch.net/test/read.cgi/tech/1094825807/613-614

なんというか、はじめて聞いた意見でかなりびっくりした。無料の Webzine で季節に合わせた特集って必要なのか? 4月の入門特集って、紙媒体ならありかもしれんけど。かなり信じられない意見を見た感じ。やっぱり、与えられないとダメですか。そうですか。自分で探す努力はしませんか。(こういうこと書くと必死だな、とか言われるんだろうか)

新しいライブラリなどへの速報性の高い記事なんかは、大変意味があってよいとおもうんだけど(moriq さんの Rails 記事は、まさにそれだった)。

内容はしょぼいですか。そうかぁ。少なくとも、まつもとさんや青木さんの記事はとてもとてもクオリティ高いと思うんだけれど。

ちなみに、4月は出しません。ごめんね。5月は、初心者特集したほうがいいんだろうかねぇ。うーん、気がすすまねえ。

俺が初心者特集してもなぁ。きっと大変なことになったりするんじゃなかろうか。


私はエクマプラズムという単語を思いついた。


チケットみっけた。良かった。

_きむら(Tue Mar 28 17:07:16 JST 2006)

 さしずめpycoさん? Pythonの挙動が知りたいということでしょうか?

_ささだ(Tue Mar 28 17:36:48 JST 2006)

 そうです。

_arton(Tue Mar 28 21:56:35 JST 2006)

 ささださん、YARVの初心者入門書いてるじゃん。

_あらいしゅんいち(Wed Mar 29 00:19:21 JST 2006)

 チケットを福岡に忘れてきました。なんとかせねば。

_ささだ(Wed Mar 29 01:21:28 JST 2006)

 ありゃぁ>チケット

_27(Mon)

はっきり言って、YARV では eval は遅くなります。

使わないようにしましょう。


と言って使わなくなるわけがないんだよな。


うーむ、未踏ほんとどうしようかな。うーむむむ。


リナザウの上で imap over ssl でメールを見るにはどうすればいいんだろう。

動機はふつけるのレビューをリナザウで読みたい、ということなんだけど。まぁ、あれはダウンロードすればいいのか。


うーむ、リナザウ、無線Lanが再接続うまくいかない...。なんでー。


もしかしてはじめて?大学へ歩いてきた。多分もうないだろう。だらだら歩いて実に1時間半。


笑い話に YARV では eval したら sleep(1) (<- 1 秒) とかしておけばきっとみんな使わなくなるだろう、というのがありました。

だから遅くなる、というわけじゃなくて、コンパイルが遅いんですよねぇ。どうしたもんだかな。

もちろん、遅いといっても、1秒余計にかかる、とかじゃなくて、ループの中に eval があると遅い、とかそういうレベルですが。


そういえば、桜が結構咲いてますね。今年も花見をしますか? 4/1 くらいに。


今回の投票は血液型。

なんか、血液型を答えるのを嫌がる人がいる、ということを聞いて。

そんで、http://psychology.jugem.cc/?eid=41 を紹介されたり。いやー、凄いところもあるんだね。


kita さん効果凄いな。


うわ、教育用言語ワークショップの席、全部埋まっていた。しまったなぁ。ダラダラしていたら。YAPC 行くの決定になった。おわ、大島さんもいらっしゃったのか。うう、やっぱこっちもさっさと手配しておけばよかった。

各言語の話はあんまり興味がなくて、パネル討論が見たかったのだ。残念。あと懇親会。うーん。ぬかった。

_shiro(Mon Mar 27 18:45:31 JST 2006)

 evalを廃止して、evaluateExpressionDynamicallyAtRuntimeという名前にしてみるとか。

_あらいしゅんいち(Mon Mar 27 19:19:37 JST 2006)

 血液型を嫌がった張本人の一人です。

_26(Sun)

ダメな日は続く。


binding メソッドとは、いったいなんだろうね。

リファレンスマニュアルには

変数・メソッドなどの環境情報を含んだ Binding オブジェクトを生成して返します。通常、eval の第二引数として使います。

と書いてあるので「生成」なんだな、とわかる。しかし、元になっている情報はわからない。

つまり、

  • 現在のコンテキスト(環境)をオブジェクトとして生成して返す
  • 現在のコンテキスト(環境)を包んだ(含んだ)新しい環境をオブジェクトとして生成して返す

という解釈が可能で、

eval(..., binding)
eval(..., binding)

という(大変よく見る)例は前者、

b = binding
eval(..., b)
eval(..., b)

とやるのは後者を期待するわけです。

YARV では、というか Ruby 2.0 では後者になります。こればっかりは、どうしようもないので勘弁してね。

現状では変わらないから、前者という解釈だったんだけど、これからは後者になります。


さて、先週は数年ぶりに岐阜にじいちゃんばあちゃんをたずねて行ったんだけど、色々と貴重な話をしてもらう。戦争の話とか、いろいろ。

あと、和服をもらってくる。形見分けっぽい。色々整理するんだとか言ってたんだけど。まぁ、そういう年なのはわかるけど、ちょっと切ない。まだまだ元気で居てください。

_25(Sat)

なんか、ダメな日。モウダメだー。

_24(Fri)

るびまインタビュー、次は角谷さんなんですが、質問募集。一緒にインタビュー行ってくれる方も募集。むしろ編集してくれる人募集。


DSLを作るとき、Rubyをそのまま使うと、Rubyの機能を色々使えるんですよ! なんて。

いや、かなりこれが効くんだけど。

_きむら(Fri Mar 24 13:00:35 JST 2006)

 Audrey Tangのブログでささださんの名前が出てたんですけど、何か約束でもしてるんですか?

_ささだ(Fri Mar 24 18:44:40 JST 2006)

 YAPCとかで会いませんか、というメールをいただきました。

_きむら(Sat Mar 25 01:14:50 JST 2006)

 ああなるほど。Rubyist とか日本の Pugs hackerに会いたいみたいなことは前にも書いていましたね。

_23(Thu)

戻り。

メールがイッパイ。

_22(Wed)

あー、寝坊した。


さて、名古屋行くぞって、ほんとは行くのは岐阜なんだけど。新幹線で名古屋で降りて。

旅のお供はどうしようかな、OS自作入門はちょっと重すぎるな。ということで、ノートPCだけでいいや。

_shugo(Wed Mar 22 13:51:55 JST 2006)

 岐阜を名古屋っていうなー

_21(Tue)

久々にファミレスに篭る。

ついつい現実逃避にステーキ食ってパフェ食って。2500円の散在。もういいや。


うう、最近 YARV に手が付かない。ううむ。


なんか、GC の話は何いってんだかよくわかんなくて、追えなくなっちゃったので、退散。

まぁ、GC は難しいよね。世代別 GC やスレッドローカル GC(その前にスレッドローカルアロケーションか)とか、やりたいねぇ。

その前に concurrent GC かしらん。


ぐは、アレの締め切りをすっかり忘れていた orz ごめんなさいごめんなさい。


ふーむ、spufs なんてものがあるのか。


何年ぶりかに野球中継を見たんですが、勝ってよかったですねえ。 イチローはかっこいいなぁ。


値を保存してるってのは eval.cのrb_eval()の result のことだろうか。まぁ、それよりも、主張がようわからん、ということなんだけど。2ch は難しいね。


さて、夕飯は何を食べよう。


Fedora Core 5 を入れたんだけど、vmware tools がインストールが出来ない...。ヘッダファイルがないらしいが。うーん。

_20(Mon)

ふつはすから帰宅。相変わらず楽しいなあ。


http://d.hatena.ne.jp/moro/20060319

いやー、デモは威力抜群ですよ。 今回は(今回も)ある程度濃くて、良いセッションになったと思いますねえ。


def ...; rescue ...; end みたいなもんかな> rb_funcall_protect

ensure かもしれんけど。


司法省への情報提出要求でGoogle勝訴の一方、FTCへのGmailログ提出命令 むぅ、Gmail が。

見られちゃ困る情報は暗号化しておけってことやなぁ。


やっぱり、自分の考えや既存の決定に執着する傾向があって、どうにも保守的な人間なんだなぁ、と思う。改めないと。


明日、名古屋に行くことになった。


Python Workshop the Edge 2006 うっかりしていたら、募集締め切りだった。残念。IronPython の話を聞くほかの機会はないかな。


そういえば、明日名古屋に行く金がない orz どうしようかな。


未だにGCでメモリ資源以外の資源回収、と言っている人がいるんだなぁ。まだまだGCについての情報は十分じゃないのか。


銀行に行って解決。そして、銀行の口座も1万円を切っていたので、なんとかする。

最近、財布とかにお金がない、というのが多い。OSCの日には、財布からお札が消えた。別に、500円玉が10枚あったとか、そういうわけではなく。


ぐわー、学割を貰ってくるのを忘れていた orz

明日行くのやめようかな。


そもそも、Rubyは処理速度度外視だからなぁ。Lispを驀進中(もしかして俺だけか)といえば同じ道なんだろうけれど、処理速度度外視という設計でも許されている現状というのは特筆に価すると思う。

さて、10年後、100年後は?

_阿部@アルファシステムズ(Mon Mar 20 20:50:09 JST 2006)

 おひさしぶりです。元並木研の阿部です。

土曜日のOSCの時にブースを尋ねてくださった方がいらしたそうで、

多分笹田さんじゃないかなあと思ったのですが当たってますか?

間違いだったらすみません。(--;)

また何かのイベントでお会いしたときはよろしくおながいします。

_ささだ(Tue Mar 21 01:32:42 JST 2006)

 私でーす。本当はセミナーも出たかったんだけどね。

_19(Sun)

OSC2006 終わった。疲れた。


発表は、まぁ、無駄に濃すぎてポカーンって感じだったけど、まぁ。まぁ。たまにはこんなのもいいか、と私は思うんだけれど、聞いていただいた方が楽しんでいただけていれば嬉しいなあ。


ほか、色々会議。


30日OS本(なんとサイン本)を購入。わーい。ちょっと読んだけど、楽しいね。

OS研究をしたい人が、川合さんの文章に対して、明確な回答を書くことが出来るか。出来ないのなら、これを研究室の学生に読ませるのはちょっと怖い気もする。でも、まぁ早道ではあるかな。


383さんへ。この場合は多分ヒープじゃなくてマシンスタックでしょう。


rb_protectn って何だろう。


今日はHaskell〜。


artonさんから Microsoft .NET入門 改訂2版 を2冊、るびまプレゼント用にいただけました。どうもありがとうございます。

発送は6月くらいになりそうなので、それまでに私は読ませていただけるわけです。感謝。


来年度未踏なぁ、どうしようかな。


腹減った。

_きむら(Sun Mar 19 14:12:25 JST 2006)

 OSC2006見させていただきました。たのしかったっす。何か質問できればよかったんですけど何も思い浮かばなかった…

_ささだ(Sun Mar 19 14:44:52 JST 2006)

 楽しんでいただけて何よりです。ご挨拶できずに失礼しました。

_あだむ from mixi(Sun Mar 19 15:18:23 JST 2006)

 土曜日は家でのんびりしてました。おそらくドッペルゲンガーかと。

_18(Sat)

結局、ほぼ PTT の資料を使いまわす感じで。 明日、というか今日起きれるかな...。

うぅ、眠い。が、家に帰らなければ。気をしっかり持って。


起きれた。よかった。

_17(Fri)

PTT終わり。さすがに疲れた。OSCどうすっかな。


またspamか。


今日は大掃除と飲み会。


マシンが立ち上がらなくなった orz


そして明日の資料はまだ1ページもできていない orz

_16(Thu)

なんか、やっぱり柔らかい方向に大幅修正するかな...。


PTT資料、以前の発表資料をつなぎ合わせたら96ページ。どうしようかな、これ。

_15(Wed)

VS8でtab browser を作ってみた。とても簡単で初心者向けだ。昔はCOMがどうだとかで挫折したんだよなぁ。

でも、細かい挙動はまだまだか。

書いたコードは300行弱。改行、自動生成含む。楽だなあ。


掃除中。しかし、色々出てくる。どうしようかな、こいつら。


う、まつもとさん、災難でしたね。まつもとさんクラスでも顔パスにはならないのね。


公開してみた>http://www.atdot.net/svn/wb

http://www.atdot.net/svn/wb/trunk/Form1.cs 書いたのはほとんどここだけ。


久々にatdot.netをrebootした。何か不具合があったらご連絡ください。


久々にSubversionリポジトリを作ったり何なりしてしまった。初めて cvs2svn を使ったり。勝手に trunk/branches/tags ディレクトリに分かれるのね。便利。


いや、ほんとに初心者なんだってば。C#の文法をちゃんと勉強したの、これが初めてで。型のある(C以外の)言語を使ったのも、とても久しぶりで。まぁ、C++ の知識で(それよりも、Windowsプログラミングの経験のほうが大きいか?)、すんなり溶け込めたという感じです。

そんなこんなで今ちょっとHaskell初心者もしています。


http://oss.timedia.co.jp/index.fcgi/kahua-web/show/column/%BA%A3%C6%FC%A4%CE%B0%EC%B9%D4 を shiroさんところ経由で見て.

・・・なんかどんどん長くなってかっこ悪くなってしまったのでやめた.


ところで,クイズです.

a, b, c = nil
p [a,b,c] #=> nil, nil, nil

こんな感じで,a, b, c全部が同じ値に初期化されますよね.同じ値で複数の変数を初期化するときのイディオムです.おぼえておいてください.

・・・という嘘について,間違いを指摘してください.


2ch で話題になっているGCの話は, 296 さんが言っているように「GCされる可能性があるんじゃないか」ということで,GCされる可能性はあります.でも,可能性であって,「必ずGCされる」というわけではありません.

それがGCされるかされないか,とかは,色んな条件,たとえばRubyのビルドに使ったコンパイラによっても挙動が変わったりします.理由は「保守的GC」を考えてもらえればいいんではないかと.

問題にならないかというと,やはり問題になるケースはあって,たとえば偶然すげぇでかいメモリをくっている(例えば100M個の配列)オブジェクトがGCされない,ということは,ありえるわけです.で,それを回避するのは,ちょっと難しい.

で,そういうのはレアケースなので,あまり問題になっていない,と.

保守的GCはRuby実装のしやすさもそうですが,拡張ライブラリの実装の書きやすさにも多分に影響します.つまり,C言語レベルで楽をするか,RubyレベルでexplicitなGCを得るか,という,トレードオフの問題になっています.

なので,そういうのが嫌なら他の処理系を使うしかないです.


拡張ライブラリの書きやすさと,処理系の効率は反比例します.多分.で,Rubyは,拡張ライブラリの書きやすさを取っています.かなり書きやすいです.処理系自身も,そんな書き方の延長になっています.だから,Rubyの標準ライブラリのCソース(array.cとか)はとても読みやすいです.


いや,Ruby以外は全然知らないから嘘かもしれないけど.


そういえばですね,こっそりと投票をやっているわけですよ.

http://www.namikilab.tuat.ac.jp/~sasada/diary/vote.cgi

とりあえず13号の人気投票,票を入れてやってください.


13号プレゼント当選者決めました。メールが行ってたら当選、行ってなかったら落選です。


明日、PTT です。

うーむ、ウェブ上では公開されてませんが、明日、農工大工学部でやります。

日時:2006年 3月16日(木)18:30 から

場所:東京農工大学 工学部情報コミュニケーション工学科 7号棟 3階3K室

      JR中央線東小金井駅南口から,西へ向かって徒歩8分程度です。
      農工大の東門に建物の配置図があります。
      http://www.cs.tuat.ac.jp/access.html
      に案内図があります。

食事:
      ありません。東小金井駅近辺のモスバーガー、途中のピーコック (マク
      ドナルドあり)などをご利用ください。

話者:
笹田耕一(東京農工大学大学院)

話題:
次期Ruby処理系の開発

概要:
オブジェクト指向スクリプト言語 Ruby はその使いやすさから世界中で利用され
ている実際的なプログラミング言語である。しかし、現行の処理系はプログラム
の実行方式が構文木をたどるという単純なインタプリタであり、速度的な問題が
あった。そこで、発表者は命令列(バイトコード)実行型の Ruby 用仮想マシン
YARV: Yet Another RubyVM を開発している。YARV はすでに Ruby のほとんどの
機能を備えており、さまざまな最適化により高速に Ruby プログラムを実行でき
るよう工夫している。他にもネイティブスレッドへの対応などを行っている。

そこで、本発表では YARV の内部実装について概観し、Ruby 2.0 に向けての今
後の課題を示す。

というわけで、興味があって暇な人は農工大工学部へどうぞ。


そして、その準備を全然していなくて、どうしようかな、という感じです。


OSC YARVのセッションの人にお知らせを投げました。

 本セッションでは Ruby 2.0 の処理系になるらしい YARV: Yet Another
RubyVM について、「Ruby 2.0 は YARV によってこんなふうに素敵になる〜」と
いう話ではなく「〜を実現するためにこういうことをしている」という話をしよ
うと思っております。

YARV: Yet Another Ruby VM
http://www.atdot.net/yarv/

(上記URLから YARV 0.4.0 がダウンロード可能です。ラップトップPCがある方
は、入れておくとよいかと思います)


 というわけで、Rubyのこと(Rubyの文法とRubyの実装)と、Cのことがわかっ
ていないとちょっと大変かもしれません(いや、とても大変)がご容赦ください。


 と思っていたんですが、思いのほか多くの方にご参加いただけるようなので、
やっぱりやわらかい、わかりやすい話にしたほうがいいのかなぁ、と迷っていま
す(本当に多くの方なんですね。45人リミットで47人です。10人集まったら御の
字だなぁ、と当初考えておりました)。

 というわけで、どんなお話をご希望されるか、私(ko1 at atdot dot net)まで
ご希望をお送り頂けると大変助かります。なるべく、ご要望に沿った話が出来るよ
う、当日準備したいと思っております。何もなければ、硬めの話になる予定です。

例(今思いついたものを挙げてます):
(硬め:あくまで例です)
・YARV命令詳細
・YARVビルド手法:命令記述と半自動命令生成
・VM命令ディスパッチの高速化技法
・メソッドディスパッチの高速化技法
・YARVのスタック管理
・例外処理全般
・Ruby C 拡張ライブラリ構成法とYARVでの実現
・evil eval
・Procオブジェクトの生成と管理〜ブロックとの違い〜
・super〜意外と難しい実現手法〜
・Rubyの摩訶不思議な定数探索の意味と実装方法
・ネイティブスレッドの生成と管理
・Ruby並列化の挑戦と障害
・JavaVM / .NET CLI における Ruby 実装手法の考察
・Multi-VM インスタンスの生成と管理
・YARVにおけるピープホール最適化
・Rubyにおける静的最適化の不可能な理由
・.NET や JavaVM と YARV の違い
・Parrot vs. YARV

(柔らかめ:あくまで例です)
・YARV命令概観
・Ruby on RailsとYARV
・test-allで見るYARVの完成度
・RubyとJavaって何がどうちがうの?
・さるでもわかる、YARVのいんすとーる
・ねこでもわかる、すたっくましん
・いぬでもわかる、こんぱいらといんたーぷりた
・こんなにすごいぞ YARV! とってもはやいぞ YARV!
・未踏プロジェクト光と影
・Rubyist Magazine 舞台裏
・Rubyist な人たち
・YARVを作ってこんなにもてもてになれました


 ご自分が好きなVM、作ったVM、幼少のころから慣れ親しんだVMなどあれば、教
えていただけるとそういうバックグラウンドの方がいらっしゃるんだな、と思っ
て話ができるので、そちらもメールにて教えていただけると大変助かります。

あなたならどんな話を聞きたいですか?

明日の PTT は、固めの話でなんか選ぶかなぁ。


いけね,YARV開発に参加するには,が抜けていた.


Winny がどうの、と言ってますけど。

ソフトウェアは使い方次第でこんなに大変なことになる、ということがわかりやすい例になったように思います。

しかし、技術者としてどういう対応をすればいいんだろうね。

_きむら(Wed Mar 15 08:59:09 JST 2006)

 IEコンポーネント使用ですか? そーすきぼんぬ。

_ささだ(Wed Mar 15 09:11:00 JST 2006)

 そうですねぇ。Subversionにでも突っ込んでみようかしらん。しかし、どのファイルをリポジトリに置くべきなのかわからん orz

_きむら(Wed Mar 15 14:37:26 JST 2006)

 どもです。会社からだと拾えないので家に帰ってから拝見させていただきます。

_ささだ(Wed Mar 15 15:52:16 JST 2006)

 あら、なんかアクセス障害かなんかありますか。それとも、svn が入ってないとかそういうことかな。

_きむら(Wed Mar 15 16:45:40 JST 2006)

 あー単にFirewallで弾かれるだけのことです。svn list だけはできるんですが(笑)

_ささだ(Wed Mar 15 17:57:17 JST 2006)

 なるほど。

_zunda(Thu Mar 16 04:07:42 JST 2006)

 Pythonの拡張ライブラリをCで書くとリファレンスカウントを忘れてSIGSEGVとおともだちになれます。

_sheepman(Thu Mar 16 17:38:34 JST 2006)

コード自動生成の部分と最適化関連の話を聞きたいです。

_14(Tue)

ブロックなしのmapは結構やってたような気がする...。


rubycoさんの日記とか、他の有名な方の日記などでRubyの使い方の提案やライブラリの紹介があると、どわーっと広がっている(ように、日記などの反応が見える)。

るびまでは、全然そういうのが無いので、無力感を感じる。もっとスパンは短く、記事も短いものをどんどん出していくというスタイルのほうがいいのか?

blog みたいな形式のほうがさっと読めて、嬉しいんだろうか。だとすると、るびまである必要はないし。うーん。もちろん、記事の内容によるんだろうけど。どっちもあったほうがいいんだろうけど。うーむ。

そろそろ、色々辛くなってきてるから、いっそのこと。


OSC2006、YARVのセッションが80人部屋になっているのを見て驚愕。泣きついて45部屋に戻してもらった。


確定申告、昼前に行ったらえらい混んでた。

_arton(Tue Mar 14 18:51:58 JST 2006)

 ああ、なんということを >いっそのこと。 っていうか「id:rubima」ではてなに掲載してみたらどうだろうか? 1日が巻頭言で、中旬にずーとインタビューがあったり。小出し重要ということではと思ってみたり(あ、愚にもつかない思いつきネタが閃いたので後で書く)

_向井(Tue Mar 14 21:46:19 JST 2006)

 確かに、ボリューム満点であるために逆に「あとでよむ」フラグをつけて放置されちゃったりすることはあるかもしれませんねぇ。

_ささだ(Wed Mar 15 08:03:29 JST 2006)

 小出しにするんだったら団体でやる必要もないのかも、とか。

_きむら(Wed Mar 15 09:00:48 JST 2006)

 はてなにされると会社にいて暇なときに読むということができましぇん(><)

_やぎ(Wed Mar 15 10:18:44 JST 2006)

確かに「月1で取りに行く」っていう行動は、Web2.0っ子にはあまり馴染まないかもしれません。

しかし、

「小出しにするんだったら団体でやる必要も〜」

ということは無いと思います。

「RSSを一つ購読すれば、Rubyに関する面白記事が数日ごとに読める」ってのはかなり魅力的です。

_ささだ(Wed Mar 15 11:02:23 JST 2006)

 小出しにすると団体でやる意味がない、というか、団体だとやりづらいような気がしますねえ。つまり、編集を介在させるコストが増大しそう。それだと、結局団体でやるのは困難、かも。やぎさんの言っているのは、artonさんの方式で、執筆者が勝手にやればいいという感じなんかな。なんか、よきシステム(ソフトウェアに限らず。この場合スキームというのか?)があればいいんですが、なんかないっすかね。それとも、編集というものをやめてしまって、とりあえず実験してみる?

_ささだ(Wed Mar 15 11:03:59 JST 2006)

 個人的(執筆者的)には「締め切り」の設定が難しくて挫折しそう。

_eto(Wed Mar 15 23:07:13 JST 2006)

 フローとストックの違いと思うのがいいかと思います。

_eto(Wed Mar 15 23:07:36 JST 2006)

 フローとストックの違いと思うのがいいかと思います。ストックが充実していればこそ、フローがうまく働くのです。なので、やっぱりストックは重要。ていうか、ささださんの心労を作り出している一人としてもうしわけなく思ってます。次回からこそはきっと締切前に…。

_arton(Fri Mar 17 22:08:14 JST 2006)

 ちょっと誤解があるかも(etoさんは誤解してないと思う)。編集済みのテキストを小出しに放流していくということなので、順繰りに日記みたく記事を書いていくということではないです。

_ささだ(Sat Mar 18 00:50:10 JST 2006)

 まぁ、それも考えましたが、やっぱり編集コストはかなり増大しますよね。

_arton(Sat Mar 18 03:39:55 JST 2006)

 そこで、はてなライターじゃなくてはてなライティングマシンを作ると。元のるびまからランダムな行数をランダムな間隔(ただし30日で完了するように)で千切っては投げ千切っては投げ(ということは元ネタとして本来のるびまは当然今まで通りに必要)。というかはてなライダー(中の人ししゃも)というのがいいな。

_ささだ(Sat Mar 18 07:11:10 JST 2006)

 機械的なのも考えたけど、自動化できるかは難しいなと思ってました。いや、やってみるとそうでもないのかも?

_13(Mon)

今日の驚き。

  • 東小金井の駅がめんどくさくなってる!
  • 雪だ!
  • ピーコック2階にLAOXが入ってる!

Pugs は Perl6 を実装したー、とか聞いて、すげーと思っていたんだけれど、Perl6 の構文解析をして、Parrot(とか)にコンパイルしているって話なのね。あんまり凄くない。

と、私は構文解析を甘く見てるんだけど、でも自分では書けない。興味ないから、凄さがわからないのよね。


明日は確定申告に行かないといけない。

_12(Sun)

C# 2.0 には partial class というものがあるのか。プログラミングC#には載ってないな。しかし、どういう機能かイマイチわからないな。コンパイラ(リンカ)が頑張る話なのか?


今更ながら、closure の実験。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;

namespace cstest {
    class Program {

        delegate int FuncType();

        static FuncType[] makeClosure()
        {
            int loc = 10;
            return new FuncType[] {
                delegate () {
                    // inc
                    loc += 1;
                    p("inc: " + loc);
                    return 0;
                },
                delegate () {
                    // dec
                    loc -= 1;
                    p("dec: " + loc);
                    return 1;
                },
            };
        }

        static void Main(string[] args)
        {
            FuncType t1, t2;
            FuncType []ts;
            ts = makeClosure();
            t1 = ts[0];
            t2 = ts[1];

            t1();
            t1();
            t2();
            t2();

            Console.Read();
        }
        static int foo(int x)
        {
            return x + 1;
        }
        static void p(Object obj)
        {
            System.Console.WriteLine(obj);
        }
    }
}

Ruby でいうと、

def make_closure
  loc = 10
  return proc{p loc+=1}, proc{p loc-=1}
end

t1, t2 = make_closure
t1.call
t1.call
t2.call
t2.call

ちゃんと、出来るんだなぁ。

で、どうやっているかというと、loc というローカル変数はローカル変数っぽいけどdelegate本体のクラス(言葉変?)のフィールドとしてコンパイルされるから、無限extentが実現できている、と。なるほど。

型があるっていいなぁ。


しかし、やっぱり closure を .call なしで書けるのはいいなぁ。

Ruby でも、lambda を予約語にすれば出来ると思うんだけど。つまり、lambda を代入する変数は closure を格納することはわかるわけだから、その他の代入がない限り closure であるということはわかる。というか、lambda で代入したローカル変数は、その後代入禁止にするというのはどうだろう。

うーん、影響範囲が大きすぎるかな。とりあえず id なんてローカル変数は使わないだろうから、意図しない closure 呼び出しは回避できたりしないかな。


一度、きちんと型を解析してみるかなぁ。


すみませんすみません。Googleばっか見てます。


久々に3時間ほど散歩。


クロージャ変換について考えてみたんだけど、eval がある限り無理。

なのだが、eval を考えない場合。うーん、きちんと解析できないのであんまり嬉しくないか。

def m
  sq = lambda{|x|
    x*x
  }
  sq.call(10)
end

の場合は、sq はメソッドに出来る。sq.call は sq(10) というメソッド呼び出しに出来る。

def m
  3.times{|i|
    p i
  }
end

は、今でも十分高速だと思う(Procオブジェクトを作らない)。が、例えばtimesの中でメソッド呼び出しにしたらどうなるだろう。あんまり速くなりそうにないな。


などと、全然違うことを調べていて思った。

_arton(Sun Mar 12 10:56:34 JST 2006)

 partial classは、同一クラスの自動生成用ファイルとユーザーコード対象用ファイルの分割が主眼なのでクラス生成者=コンパイラが頑張るという話だと思います。

_ささだ(Sun Mar 12 13:22:26 JST 2006)

 主眼はそこだというのはわかりますが、実装がそうなっているかとはわからなかったもので。例えば、Moduleをまたいでいたらどうなる、とか。動的にpartial classを追加できるのか、とか。Reflection系をダラダラ眺めているんですが、多分出来ないかなぁ、とは思っています。が、DynamicMethodでは出来なくもないかも、とか。

_arton(Sun Mar 12 13:29:18 JST 2006)

 なるほど初心者らしい着眼点ですね。C#という売り物の言語ではなく、MRのほうで実験的に出している言語(F#とか)を見たほうが良いのではないでしょうか。

_ささだ(Sun Mar 12 13:32:35 JST 2006)

 そもそもC#だったら、型違いでコンパイルできなかった orz

_arton(Sun Mar 12 13:33:37 JST 2006)

 http://research.microsoft.com/search.aspx?View=en-us&charset=iso-8859-1&qu=DynamicMethod (全然違うのがヒットしたけど、もしかしたら面白いかも)

_ささだ(Sun Mar 12 13:35:36 JST 2006)

 うう、まずF#とは何かの調査から始めないといかんですねぇ。MLか。それだと、ちょっとターゲットは違いそうなので、やっぱり IronPython ですねぇ。

_arton(Sun Mar 12 13:53:50 JST 2006)

 上のPPTのAdonですが、実行時にメソッドを再構成(オプティマイズ)してそれを呼び出すというようなことをしているので、あながち無関係とは言えないかも知れません(メソッドの追加はできないとは思うけど)。http://www.doc.ic.ac.uk/~phjk/Software/Adon/

_11(Sat)

とりあえず Scheme でも作ってみようかなあと思ったんだけど、tail call の最適化がうまいこと思いつかなかったので諦める。

  do {
    ret = func.Invoke(args);
    func = TailCallFunction;
    args = TailCallFunctionArgs;
  } while (func != null);

こんなのを思いついたが、全ての関数呼び出しにこれを付けるのはどうなんだろう。


Google で探し回ったんだが、どこにも(MSDN以外)利用例が載ってない orz 使われてないんだろうな。


IronPythonを使うため、VS2005EEをインストールしてみる。ついでに、anonymous delegator も評価できるか。


おー、あるではないか。MethodBody というものが。.NET 2.0 になって、やっと、というのがなんとも。IronPython のために入れたのかなぁ。

と思ったら、IronPython ではつかってなかった。まぁいいか。


とりあえず、初心者なのでちょーてきとーに逆アセンブラを作った。オペランドの表示はしない。


逆アセンブルして気づいたんだけど、てきとーに作ったメソッド foo に、なんか変な前処理がくっついている。なんだこりゃ。


変な前処理だと思ったら、params のための変数の用意だった。なるほど、こうやるのか。


Format の方法がようわからん。


んー? MethodInfo とか MethodBody とか取れても、そのメソッドが定義されている Module が取得できないじゃん。はて、なんか方法は無いのか。


できた。


ウワーン、Module#< を知らなかった。なんて初心者。


うーむ、本当に本当に久しぶりに Window アプリケーションでも作ってみるか。


http://www.atdot.net/~ko1/tmp/LiveDisassembler.exe。すげぇ久々なWindowアプリケーション。

昔にやってたより、Windowアプリケーション作りやすくなったねえ。って、俺が知らなかっただけ?

.NET 2.0 が入っている人用。C#初心者によるC#(というかCLR)初心者用逆アセンブルソフト。逆アセンブルする対象は「今実行しているもの」というのが、普通の逆アセンブラと違う。だから Live。


なんだかんだで、色々と使い方を調べながらやったら4時間くらいかかってしまった。

一番苦労したのがFormEditorの使い方。というか、コンポーネントの使い方か?

ああ、まだまだ初心者だ。


配列のソートが難しい。というか、配列の扱い自体がとてもめんどくさい。map とか使いたい。


Drag&Dropに対応してみた。楽チン。


なんかゴテゴテしちゃったけど、とりあえず色々くっつけてみた。

http://www.atdot.net/~ko1/tmp/LiveDisassembler.exe

CLI 初心者用逆アセンブラソフトウェア LiveDisassembler。

しかし、Live にするんだったら、もうちょっと色々やりようはあるよな。


なんか .NET 2.0 のリファレンスを見ていると、いろいろと動的言語のための拡張がある。というか、メソッドの使い回しが出来るじゃん、これ。

やっぱ MS も mix-in したかったんだろうか。


なんか、出来そうとわかったら、途端にやる気がなくなってきた。


そういえば、CodeZine というので C# の技術文書があったなぁ、きっとリフレクション系も充実しているに違いない、と思って見に行ったんだけど、全然無かった。

もしかして、こういうILを弄る人ってとても少ないのか?


DynamicMethod がどうのこうの、というのはもう2年も前のことらしい。なんというか、激しく遅れている。

まぁ、Ruby触り始めたのも1.6.7からだったしな。

_10(Fri)

IronPython のメソッド呼び出しコストと、C#のメソッド呼び出しコストの比較をしないとなぁ。どっかに資料ある?

デリゲータを使ってインラインメソッドディスパッチ、とかそういうネタを考えてみた。キャッシュするのは static field でいいだろう。

Pythonなんとか、とかいうのが今度日本のMSでやるらしいけど、そういう技術的な話も聞けるんだろうか? 聞けるなら行ってみたいなあ。


そういえば、システムコールの read が返ってくるタイミングというのはどこかで規定されてるんでしょうか。環境依存?


LocalBuilder lvar = ilGen.DeclareLocal(typeof(Object));
ilGen.Emit(OpCodes.Newobj, typeof(Test2).GetConstructor(new Type[0]));
ilGen.Emit(OpCodes.Stloc, lvar);
ilGen.Emit(OpCodes.Ldloc, lvar);
ilGen.Emit(OpCodes.Callvirt, typeof(ITest2).GetMethod("foo")); 
ilGen.Emit(OpCodes.Ret);

なんか素敵な発見だ。これが動いた。えーと、何が素敵かと言うと、

test(){
  Object lvar = new Test2();
  lvar.foo();
}

が動いた、つまり、Object#foo なんてないのに呼び出せた、というのが素敵。verifier が動いていない?

これがあると、動的言語は(method_missing みたいなのを考えなければ)callvirt で実装できそうな気がする。


で、IronPython はどっちを使っているか、だなぁ。

しかし、Rubyも結構素直に実装できそうだな。Singleton method とか Module の include とかどうなるかと思ったけど。


そもそも、artonさんのNETRubyではメソッドディスパッチをどうやってるんだろう。

あれ、ぱっと見た感じ、MSILをぐちゃぐちゃしているところが無いなあ。


真面目に IronPython を調査しなくちゃいけなくなってしまった。めんどいなぁ。


その前に mono でさっきのコードが動くかどうか調べないといけないのか。


MethodRental というクラスを見つけたが、なんか想像していたのと違う。うーむ。

しかし、これを使えば動的な再定義が出来るんだなぁ。しかし、再定義は出来るのに、加えることが出来ないとはどういうことだ。


むぅ、EmitWriteLine メソッドはないだろ...。


うーむ、クラスにちょっと変更を加えたクラスを作る方法がわからん。クラス A があって、そいつにメソッド foo() を加えたクラス B を作る。継承はなしで。

MethodRental が使えそうだが、こいつの引数には IL 列が必要らしいが、クラス A の各メソッドの IL 列を取る方法がわからない。


うーむ。どっかにそれっぽいのはありそうな気がするんだがなぁ。見つからん。disassembleする過程で必要だと思うんだが。

うーむ。MethodBase#MethodHandle あたりが使えるかと思ったんだが。うーむ。


う、そもそも MethodRental は Mono にはナサゲ。

うーむ。実装の使いまわしがしたいしたいしたい。

無理なのかなぁ?


.NET 2.0 だと何とかなってたりしないのかな、この辺。


最悪、独自中間コードからILを生成して、それを保存。コピーを作るときはその独自中間コードから、またIL生成やり直し、というところか。無駄無駄無駄ー。すげぇ富豪的。


JITコンパイルしてしまえばILは要らなくなるんだから、そんなもの何時までも残ってると思うんじゃねーよ、ということなのか?


しかし、割り切ってしまえば、なんか、高性能な Ruby インタプリタの雛形はすぐに出来そうだ。一週間くらいで。


むー、IronPythonの論文がどっかにあったと思ったんだが、見つからん。メソッドディスパッチをどうやってるか知りたいんだよー。

IronPython を IL にコンパイルした結果ってファイルに出力できるのかな。出来るんだったらディスアセンブルして確認できるんだが。

_arton(Fri Mar 10 23:18:28 JST 2006)

 メソッドディスパッチは単にNETRubyの共通メソッド呼び出しルーチン(型合わせしたりする死ぬほど遅いやつ)をリンクするだけですませてたはず(NETRubyはどちらかと言うとEmitで遊びたいってのを除けば実用的にはMulti RubyインスタンスとMulti Threadの実験が主だし)。

_9(Thu)

なぜアプリケーションドメインとアンマネージドコードの話をしたかというと、これはそのままRubyのVMとC拡張ライブラリの話にマップできるからなんですね。

OSに手を入れない限り、グローバル変数を使っている == rb_global_variable() を呼んでいる拡張ライブラリはどうやっても別ドメインに出来ない。Windowsの場合、OSを握っているので、出来るかもしれない。

今考えているのは、Multi-VM対応拡張ライブラリのためのお作法を一つ用意(Init_xxxの代わりにInitMulti_xxxを呼ぶ)して、無ければ対応していないということにしようかな、と。InitMulti_xxxは名前が変だな。


new Hoge() というのは鬱陶しいね。しかし、メソッドの仮引数宣言でparamsで引数を展開できるんだったら、呼び出し時も配列を展開する機能が欲しいなぁ。


うーん、動的なメソッドの定義をどうやればいいのかよくわからんなぁ。.NETの型というものを知りたいだけなんだが。

verifierがどこの段階で走り出すのかも、よくわからん。


Rubyにも、色々属性がつけられると面白いよね、という話は何度も出てきた。

今考えてるのでは変数に属性をつけて、たとえば

def method(arg1$<type: String>, arg2$<respond_to: to_s>)
  ...
  arg1 = foo()
  arg2 = bar()
  ...
end

みたいなコードにすると($<key: value> とする)、

def method(arg1, arg2)
  raise ContractError unless arg1.kind_of? String
  raise ContractError unless arg2.respond_to? :to_s
  ...
  arg1 = foo()
  raise ContractError unless arg1.kind_of? String
  arg2 = bar()
  raise ContractError unless arg2.respond_to? :to_s
  ...
end

みたいなコードが生成される。Effelみたいに、コンパイル時にチェックを入れるかどうかを選択できるようにしておく。デバッグ時はこのオプションで実行してみる。

コンパイラに手を加えるのはとても楽だと思うので、あとはパーサがこんな感じで属性を認識してくれるといいなぁ。

うーん、前も書いたような気がするな。


これをごり押しして頑張れば型推論も...。出来るんだろうか。


ところで、respond_to? が配列を引数に取るというのはどうだろう。


		void main(string[] args)
		{
			AppDomain theDomain = AppDomain.CurrentDomain;
			AssemblyName asmName = new AssemblyName();
			asmName.Name = "DynamicAssembly1";
			AssemblyBuilder asmBuilder = 
				theDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
			ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule1");
			TypeBuilder typeBuilder = modBuilder.DefineType("DynamicType1", TypeAttributes.Public);

			MethodBuilder metBuilder = typeBuilder.DefineMethod("DynamicMethod1",
				MethodAttributes.Public | MethodAttributes.Static, 
				typeof(void), new Type[0]);

			ILGenerator ilGen = metBuilder.GetILGenerator();

			/*
			 * System.Console.writeLine("foo"); 
			 */
			ilGen.Emit(OpCodes.Ldstr, "foo");
			ilGen.Emit(OpCodes.Call, 
				getMethod("WriteLine", typeof(System.Console), typeof(string)));
			ilGen.Emit(OpCodes.Ret);

			MethodInfo mi = typeBuilder.CreateType().GetMethod("DynamicMethod1");
			p(mi);
			mi.Invoke(null, new Object[0]);
			pause();
		}

		static MethodInfo getMethod(string mid, Type klass, params Type [] param_types)
		{
			return klass.GetMethod(mid, param_types);
		}

とりあえずこんな感じか。

TypeBuilder#CreateType というところで verify してるのかなぁ。


さて、ここまでの情報を見て、Rubyのメソッド呼び出しを.NETのcallvirtにマップできるか?(それを知るためのC#入門) IronPython ってどうやってんのかなぁ。

一番安易な解は、メソッドを全部delegatorにすることなんだろうけど。それしかないかなぁ。


TypeBuilder#CreateType() が呼ばれた後には、メソッドの追加などは出来ないらしい。残念。

面白いことに、同じ名前のメソッドはいくつでも作れるらしい。

		void main(string[] args)
		{
			AppDomain theDomain = AppDomain.CurrentDomain;
			AssemblyName asmName = new AssemblyName();
			asmName.Name = "DynamicAssembly1";
			AssemblyBuilder asmBuilder = 
				theDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
			ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule1");
			TypeBuilder typeBuilder = modBuilder.DefineType("DynamicType1", TypeAttributes.Public);
			
			for(int i=0; i<10; i++)
			{
				defineMethod(typeBuilder, "mid1", "mid1 invoked#" + i);
			}
			Type type = typeBuilder.CreateType();

			foreach(MethodInfo mi in type.GetMethods())
			{
				if (mi.IsStatic) 
				{
					mi.Invoke(null, new Object[0]);
				}
			}

			pause();
		}

		static void defineMethod(TypeBuilder typeBuilder, string mid, string outstr)
		{
			MethodBuilder metBuilder = typeBuilder.DefineMethod(mid,
				MethodAttributes.Public | MethodAttributes.Static, 
				typeof(void), new Type[0]);

			ILGenerator ilGen = metBuilder.GetILGenerator();

			/*
			 * System.Console.writeLine("foo"); 
			 */
			ilGen.Emit(OpCodes.Ldstr, outstr);
			ilGen.Emit(OpCodes.Call, 
				getMethod("WriteLine", typeof(System.Console), typeof(string)));
			ilGen.Emit(OpCodes.Ret);	
		}

しかも、ちゃんと呼べる。

しかし、呼び出されるのは一個だけだと思うんだが...。どうやって使い分けるんだろう。


出力してディスアセンブルしてみる。


//  Microsoft (R) .NET Framework IL Disassembler.  Version 1.1.4322.573
//  Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:0:5000:0
}
.assembly DynamicAssembly1
{
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module DynamicModule1
// MVID: {9CF48E3A-B154-466A-BE19-6078191FEA93}
.imagebase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001
// Image base: 0x00fe0000
//
// ============== CLASS STRUCTURE DECLARATION ==================
//
.class public auto ansi DynamicType1
       extends [mscorlib]System.Object
{
} // end of class DynamicType1


// =============================================================


// =============== GLOBAL FIELDS AND METHODS ===================


// =============================================================


// =============== CLASS MEMBERS DECLARATION ===================
//   note that class flags, 'extends' and 'implements' clauses
//          are provided here for information only

.class public auto ansi DynamicType1
       extends [mscorlib]System.Object
{
  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#0"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#1"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#2"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#3"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#4"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#5"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#6"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#7"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#8"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public static void  mid1() cil managed
  {
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "mid1 invoked#9"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method DynamicType1::mid1

  .method public specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // コード サイズ       7 (0x7)
    .maxstack  2
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method DynamicType1::.ctor

} // end of class DynamicType1


// =============================================================

//*********** 逆アセンブリが完了しました ***********************

うーん、同じシグネチャだよなぁ。

あ、GetMethod("mid1") だと、曖昧だって怒られるな。多分、普通に呼び出しても同じなんだろう。


この辺の技術について語れる初心者向けの場所ってないですかねぇ。


アセンブリとか、タイプとかはわかったが、module が何者か(何のためにあるのか)わからんなぁ。


delegator の型を宣言しないといけないのはめんどいなぁ。

delegator の実体は MethodInfo とそれに対する Invoke なんだろうか。


む、null.GetType() はダメなのか。


object.class は object.GetType() ということはわかったが、ancestors 相当はなんだろう。


DelegateはDelegateか。ふむ、なるほど。


			funcType func = new funcType(func_impl);
			func.Invoke(10);
#=>
デリゲートで Invoke を直接呼出すことはできません。

なんで? 何が違うんだろ。


		void main(string[] args)
		{
			funcType func = new funcType(func_impl);
			// func(10);
			Object [] func_args = {10};
			Type [] types = {typeof(int)};
			MethodInfo mi = func.GetType().GetMethod("Invoke", types);
			if (mi != null) 
			{
				mi.Invoke(func, func_args);
			}
		}

こうやったら起動できた。コンパイル時になんとなくチェックしてるだけ?


delegate と virtual なメソッドコールとの速度比較。

delegate

real    0m1.938s
user    0m0.015s
sys     0m0.031s

normal

real    0m1.407s
user    0m0.015s
sys     0m0.047s

テストコード

		delegate int funcType(int i);
		funcType delfunc;

		void main(string[] args)
		{
			int cnt = 0xffffff;
			delfunc = new funcType(func_impl);
			if (args.Length > 0) 
			{
				p("normal");
				for(int i=0; i<cnt; i++)
				{
					test_nor();
				}
			}
			else {
				p("delegate");
				for(int i=0; i<cnt; i++)
				{
					test_del();
				}
			}
		}

		void test_nor()
		{
			func_impl(10);
		}
		void test_del()
		{
			delfunc(10);
		}

		public virtual int func_impl(int bar)
		{
			return 3;
		}

意外と速い。フィールドアクセスのコストとかも考えると、ほとんど変わらない?

IronPython は結構素直に実装できそうだなあ。


左耳がとても痛いので耳鼻科に行こう。


外耳炎と言われた。何がまずかったんだろうか。


OSC2006のYARVのセミナー、満席になってた。間違ってるよ。絶対間違ってるよ。2.0な話はしないんだってば。


T氏ネタ。プログラマな中学生で「ぷろちゅ」。

_arton(Thu Mar 09 09:09:06 JST 2006)

>この辺の技術について語れる初心者向けの場所 http://discuss.develop.com/dotnet-clr.html 全リストは、http://discuss.develop.com/ 後、Monoのほうにも当たってみると良いかも。 モジュールについてはhttp://www.atmarkit.co.jp/fdotnet/technology/idnfw11_01/idnfw11_01_02.htmlかな。 >なんとなくチェック なんでだろう? とりあえずDelegate#DynamicInvokeを使えば呼べるけど。 http://msdn.microsoft.com/msdnmag/issues/01/04/net/を読むと、「他のコンパイラならOKかも」とか書いてあるから、なんとなくみたい。ただし、思うに、func(10);と書けるわけだから「無駄なことするな、ごるぁ」という意味はあるのじゃないかな。Invokeを呼ぶと静的型チェックできなくなるし。

_ささだ(Thu Mar 09 10:06:34 JST 2006)

 おお、理解できました>モジュールの意味、というか、アセンブラの意味

_8(Wed)

rubycoさんに習って私も微笑みつつC#を基礎から勉強してみよう。


まず、無料でもらったVS2003で、とりあえずconsoleアプリプロジェクトを作ってみる。

まぁ、何事もなく終わった。で、プログラミングC#に書いてあるとおり、とりあえずSystem.Console.writeLine("Hello")とやってみて、無事に出来た。

次に、printfっぽいことができるのかと思い、System.Console.writeLine("{1}", 0)とやってみると、実行時エラー。そうか、これは実行時エラーなのか(当たり前だ)。

気を取り直して、"{0}", 0 とやってみると、きちんと動くことを確認。

とりあえず、これがどんなMSILかを知りたいと思うのは人情なので、逆アセンブラをぐぐってみると、ildasmというのがそれだと知る。使ってみると、なんかWindowが出てきてウザイ。/text でコンソールに直接垂れ流すそうなので、それを実行してみると、きちんと動いた。よかった。

ついでに、いちいちSystem.Console.writeLine()と打つのがとてもとても面倒くさいので p メソッドを作る。ついでに gets()相当としてpause()メソッドを作る。

		static void p(Object obj)
		{
			System.Console.WriteLine("{0}", obj);
		}

		static void pause()
		{
			System.Console.Read();
		}

まぁ、こんな感じで、p(1) を逆アセンブルしてみると、

      IL_0000:  ldc.i4.1
      IL_0001:  box        [mscorlib]System.Int32
      IL_0006:  call       void ca1.Class1::p(object)

こんな感じになって、スタックに1 積んで boxing して p を呼んでいる事がわかる。うーん、素直だ。

ちなみに、ldc.i4.n は 0 〜 8 らしい。7までじゃないんだね。


初期化しない変数は使っちゃダメ、ということなので、

		static void Main(string[] args)
		{
			int a;
			bool foo = args.Length == 1;
			if(foo)
			{
				a = 1;
			}
			p(a);
			pause();
		}

こんなコードを書いてみたが、シンタックスエラー。えらい。Rubyもこれくらいやったほうがいいのかなぁ。


しかし、なんで CIL の資料が MSDN に入ってないのかね。OpCodes のフィールドとして現れてるけど、やっぱりリファレンスが欲しいじゃないか。

ECMA C# and Common Language Infrastructure Standards でとってこれるけど、めんどいし PDF だ。しくしく。

まず、C# というと CIL が気になるのは人情だろう。


というわけで、ついでなので System.Reflection.Emit を使ってみる。


と思って調べてみたら、そもそもAssemblyというものがわからず、ドメインとか何がなんだかわからず、挫折。めんどくせー。

C# は初心者には難しい言語ですね。

おとなしく3部を見ることにしよう。


と、その前に匿名メソッドと、それがどうコンパイルされるかを見てみようと思って、頑張ってdelegateとやらを書いていたら、さっぱりコンパイルできない。

...もしかして、C#のバージョンか orz 2005をインストールしないといけないのかー。うーむ。

うーむ、確認したかったイテレータも同様か。atmark itに記事があるからいいか。しかし、読んでもようわからんかった。

C# は初心者には難しい言語ですね。


なんとなく、structというものがどんなもんか試してみたくなったので、

		class HeapStruct
		{
			int a, b, c, d, e, f, g;
		}
		struct StackStruct
		{
			int a, b, c, d, e, f, g;
		}

		class C
		{
			public void main()
			{
				// p(1);
				heapcall(0);
				//stackcall(0);
			}
			void heapcall(int d)
			{
				HeapStruct h = new HeapStruct();
				p(d);
				heapcall(d+1);
			}
			void stackcall(int d)
			{
				StackStruct s = new StackStruct();
				p(d);
				stackcall(d+1);
			}
		}

こんなのを作ってみると、heap のほうが 8000程度、stackのほうが16000程度、と不思議な結果に。空の構造体だから割り当てられなかったのかな。

しかし、stack overflow については何もイベントが飛んでこないで、ただ死ぬなぁ。JIT コンパイラがどうの、と言う時といわないときが。


とりあえずリフレクション。

				Type type = typeof(C);
				p(type);
				p(Activator.CreateInstance(type));
#=>
RootNameSpace.MainClass+C
RootNameSpace.MainClass+C

インナークラスは + で連結するのか。気持ち悪いな。

// OK
Type type = Type.GetType("RootNameSpace.MainClass+C");
// NG
Type type = Type.GetType("C");

レキシカルにたどってはくれないらしい。まーそうだよなぁ。

Object#getType メソッドで自分の型がわかるのか。

1.getType() というのは動かなかった。不思議だ。一段メソッド呼び出しをかませて boxing すれば出来るのに。1.getType()でも、一段boxingすればいいのに。

嘘。すみません。getType じゃなくて GetTypeなのね。なぜここだけPascal。

ILを見てみると、

        IL_0002:  ldc.i4.1
        IL_0003:  box        [mscorlib]System.Int32
        IL_0008:  call       instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()

ということで、きちんとboxing していることがわかる。


やはり初心者としては、obj.__send__ :foo 相当のメソッドを作ってみたいわけです。さて、出来るだろうか。とりあえず、__send__ :foo, 1 相当。

			public void main()
			{
				Object []args = {123,};
				p(__send__("foo", args));
				pause();
			}
			Object __send__(String mid, Object[] args)
			{
				Type []types = new Type[args.Length];
				int i=0;
				foreach(Object e in args)
				{
					types[i++] = e.GetType();
				}
				Type thisType = this.GetType();
				MethodInfo mInfo = thisType.GetMethod(mid, types);
				return mInfo.Invoke(this, args);
			}
			public int foo(int i)
			{
				p("foo: " + i);
				return 10;
			}

こんな感じにしたら動いた。面倒だから、もういいか。


Javaと一緒で p("foo: " + i); は動くんだな。


やはり初心者としてはInvokeと普通のメソッド呼び出しのコストは気になります。ということで、

			MethodInfo fooMethod;
			Object[] invokeParams;

			public void main()
			{
				fooMethod = this.GetType().GetMethod("foo");
				invokeParams = new Object[0];

				for(int i=0; i<0xfffff; i++)
				{
					test_normal();
					// test_invoke();
				}
			}

			public void foo()
			{
				//
			}
			void test_normal()
			{
				foo();
			}
			void test_invoke()
			{
				fooMethod.Invoke(this, invokeParams);
			}

結果:

$ time ./ca1
invoke
real    0m11.172s
user    0m0.015s
sys     0m0.062s

normal:
real    0m1.969s
user    0m0.031s
sys     0m0.015s

5倍以上か...。

たった5倍というべきか?


アプリケーションドメインとはMulti-VMの単位みたいなものか。どの程度独立してるんだろうな。


スレッド切り替えを起こすのはなんだろう。System.Threading.Thread にそれらしいのは無かった感じ。


			public void main()
			{
				System.Threading.Thread t1 = new System.Threading.Thread(
					new System.Threading.ThreadStart(t1func));
				System.Threading.Thread t2 = new System.Threading.Thread(
					new System.Threading.ThreadStart(t2func));
				counter = 0;

				t1.Start();
				t2.Start();
				System.Threading.Thread.Sleep(1000);
				t1.Abort();
				t2.Abort();
				p("t1: " + t1.ThreadState);
				p("t2: " + t2.ThreadState);

				t1.Join();
				t2.Join();
			}
			int counter;
			public void t1func()
			{
				pause();
				p("t1");
			}
			public void t2func()
			{
				pause();
				p("t2");
			}

Thread#Abort() は Read() しているスレッドを中断できないようで。

やっぱそうだよねぇ。


lock(obj){...} というのはシンタックスシュガーかな。ふーむ、Rubyにもあったほうがいいのかしらん。

module Lockable
  InitialLockMutex = Mutex.new

  def lock
    until defined?(@__lockable_mutex__)
      InitialLockMutex.synchronize{
        @__lockable_mutex__ = Mutex.new
      }
    end

    @__lockable_mutex__.synchronize{
      yield
    }
  end
end

obj.extend(Lockable)
obj.lock{
   ...
}

こんな感じか?


			public void main()
			{
				lock(this)
				{

				}
			}
#=>

      .method public hidebysig instance void
              main() cil managed
      {
        // コード サイズ       18 (0x12)
        .maxstack  2
        .locals init ([0] class RootNameSpace.MainClass/C CS$00000004$00000000)
        IL_0000:  ldarg.0
        IL_0001:  dup
        IL_0002:  stloc.0
        IL_0003:  call       void [mscorlib]System.Threading.Monitor::Enter(obje
ct)
        .try
        {
          IL_0008:  leave.s    IL_0011

        }  // end .try
        finally
        {
          IL_000a:  ldloc.0
          IL_000b:  call       void [mscorlib]System.Threading.Monitor::Exit(obj
ect)
          IL_0010:  endfinally
        }  // end handler
        IL_0011:  ret
      } // end of method C::main

まぁ、想像通りか。.try/finally というのがよくわからなくて気持ち悪いが。


ところで、多分誤植を見つけたんですが、どこに届ければいいんでしょう。


とりあえず一通り見終わり。COMのあたりは案の定さっぱりわからなかった。

Emitのあたりの調査はどうするかな。


変数に params というものを入れると文法エラーになってウギャーと思って、キーワードだったわけですが、調べてみると m(a, *b) みたいなもんだということで、使ってみた。

			public void main()
			{
				p(__send__("foo", 1));
			}

			Object __send__(String mid, params Object [] args)
			{
				Type []types = new Type[args.Length];
				int i=0;
				foreach(Object e in args)
				{
					types[i++] = e.GetType();
				}
				Type thisType = this.GetType();
				MethodInfo mInfo = thisType.GetMethod(mid, types);
				return mInfo.Invoke(this, args);
			}
			public int foo(int a)
			{
				p(a);
				return a*2;
			}

うまくいった。これで send は実装できた気がする。型とか以外。

			public int bar(C1 c1)
			{
				return 0;
			}
			public class C1
			{
			}
			public class C2
			{
			}
			public class D1 : C1
			{
			}

			__send__("bar", new D1());

は動いた。ふーん。


おお、Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs にありました。どうもありがとうございます> artonさん Lisp はまだ見つからない。

お、これかな? Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\Samples\clisp


全然関係ないんだけど、ERbにbindingの代わりにhashを渡せたりしないのかね。そうすれば、毎回文字列を eval する代わりにメソッドでどかっと出来るんだけど。

require 'erb'
puts ERB.new(%q{
  <%= a + b %>
}, [:a, :b]).run(:a=>1, :b=>2)

こんな感じに。

うーむ、ERB.new に keys を渡すのがとても筋が悪い。でも、Ruby script を作る時点で keys を知らないといけんからなぁ。いっそ、run に普通に引数として渡すような感じはどうだろう。

puts ERB.new(%q{
  <%= a + b %>
}, [:a, :b]).run(1, 2)

Rucheme の関数定義はこんな感じでやった。

new に限定しなきゃいいのか。

# foo はメソッド名、a, b が引数
puts ERB.define_method(:foo, :a, :b, %q{
  <%= a + b %>
})

foo(1, 2)

こんなんどうですかね。キャッシュなんて考えなくて済む。


binding が無いと困るのは、ローカル変数よりもむしろ self のほうだったか。あ、でも foo を定義する場所次第だな、これは。定義する場所も渡してあげないといけないんだなぁ。


require 'erb'

module ERBMethodDefinalbe
  def define_erb_method(mid, *args)
    src = args.pop
    src = ERB.new(src).src
    
    module_eval "def #{mid}(#{args.join(', ')})\n" + src + "\nend"
  end
end

class Foo
  extend ERBMethodDefinalbe

  define_erb_method(:foo, :a, :b, "<%= a+b %>")
end

puts Foo.new.foo(1, 2) #=> 3

超てきとー。

しかし、表示のための eval を使わないので、圧倒的に速いと思う。

うーむ、任意の self が渡せないのはやっぱりきついかなぁ。Web アプリケーションを作ってる人に聞かないとわからんな。


なんか死ぬほどメモリ食うなあ>VS2003


未踏ユースで javaflow というのを使っていて、なるほど、と思っていた。

要はserializableなcontinuationなんだが、原理は単純。ただ、Javaだから出来るという印象だよなぁ、などと。

Ruby でやってみようかと思ったんだけど、ちょっとめんどい。

_babie(Wed Mar 08 02:20:09 JST 2006)

 バロス。真っ先に ildasm.exe 使う初心者なんていねぇwww。

_arton(Wed Mar 08 10:52:37 JST 2006)

 MSILのリファレンスは、SDKに適当なLispのサンプルと一緒に入ってるよ(MS-Wordだけど)。  アプリケーションドメイン間のインターフェイスにはRPC(Remotingとか)が必要なくらい独立してます(つまり、アプリケーションから見れば全然別世界。セキュリティ境界=実行時ユーザー境界なのでそれはそうだろうという気はします)。

_ささだ(Wed Mar 08 12:08:31 JST 2006)

 unmanaged code を混ぜるとアプリケーションドメイン間が混ざっちゃったりしないんでしょうか。それとも、ローダが頑張ったりするのかな。

_むらまさ(Wed Mar 08 17:03:40 JST 2006)

 MSDN Product Feedback Centerとかでしょうか。http://lab.msdn.microsoft.com/productfeedback/default.aspx

_ささだ(Wed Mar 08 19:33:54 JST 2006)

 あ、書籍のほうです。プログラミングC#。

_arton(Wed Mar 08 22:13:09 JST 2006)

 unmanagedを混ぜるのは秘伝っぽい。ドキュメントがすごく少なくて僕にはとりあえず手が出ない領域なので残念ですがわかりません。

_7(Tue)

あいまい検索のようなものの代わりに空目検索というのはあるんだろうか、と思ってぐぐってみたら、ヒットしなかった。誰もやってないのかな。

ビットマップにしてオフライン検索とかすると出来るんだろうか。変人と愛人を空目できる人工知能。


えーと、未踏開発期間が終わりました。

2/24 に、千葉PM2005年度上期成果報告会がありました。品川の電通のビルで、朝から晩までやってました。この電通のビルというのが、セキュリティがきつくて、集合時間に10分ほど遅れていったら、パスが必要、ということで会議場まで行けないでやんの。30分ぐらいまごまごして、迎えに来てもらって、やっと入れた。ご迷惑おかけしました。

  1. ひがさん講演
  2. BioRuby/ChemRuby
  3. 昼飯
  4. Tuigwaa
  5. まつもとさん講演
  6. YARV
  7. Mayaa
  8. 千葉先生講演

という感じで、ひが・まつもと・千葉先生講演会だったわけですが、まぁ、未踏の成果発表もやっていた、という感じです。どの発表も面白かったんですが、Java の人たちの話はどうにもよくわからないことが多かったかな。ひがさんの話も、なんでそこまでするのかわからなかった。これは、Javaとかで開発した経験がないからなんでしょうね。Java でログのためにmix-inが欲しいと痛切に感じたことはあるんだけど。しかし、そのためにバイトコード変換を、というのはやりすぎだと感じる。千葉先生はご自分の発表で「コンパイラを信頼しない人はいない」と言っていたけど、たとえばようわからん人(いや、千葉先生がそうだと言っているわけではないですが)が作ったらしいコンパイラは誰も信用しないでしょう。その対比はどうかと。

片山さん(BioRuby)の発表スライドを先に見せてもらったら、大きな文字で Java vs. Ruby という文字が。俺もまったく同じページを(色だけ違った)用意してきたのでびっくりした。考えることは同じ。

考えることは同じ、といえば、私の前の発表でまつもとさんがYARVの話を大方してくれたおかげで喋るネタがかなりなくなってしまった。でも、結局35分ちょい喋ってしまったけど。

自分の発表は、まぁ見ている人が少しは楽しんでくれたような気がしたのでよかった。反応が思ったより良かった。しかも、質問は結構突っ込んだところを聞いてきて、面白かった。さすがJava、というか業務で使っている人たちなんだなぁ、という感じ。未踏ユースなどでの反応とは毛色が違います。

発表会に関して、次の記事にまとめられています。ありがたいことです。

また、YARVについての記事は次にまとめられています。ありがたいことです。後藤さんの記事は色々参考にさせていただいているので光栄です。

少しミスがあったようなので、修正依頼を投げてみたんだけど、ナシのつぶて。まぁ、マスコミの方はそんなもんなんでしょうかね。そもそも、私は公開するほどいい顔はしていないので、顔写真は掲載しないで欲しいんだけれど、そういうのを拒否する権利は無いものなんでしょうかね。やれやれ。表に出て喋るってのは、そういうことは覚悟しろ、ってことなんですかね。サングラスして喋るわけにもいかんしな。

どっかのマスコミの人が IPAX 2005 でYARVのブースに来てくれて、こんなのは書く意味がない、とばっさり切ってくれたんですが、今回は書いてくれたようです。ありがたいですね。

未踏というと、面白おかしいかったり、見てくれが綺麗だったり、ぱっと使えるものに対してだけに対外的な評価が高く、YARVみたいな技術だけの地味〜〜〜〜〜〜な奴は見向きもされない、という印象がありましたが、今回は色々取り上げていただき、また興味を持ってもらったようで何よりです。

いや、ぱっと見すごそうな Tuigwaa は、やっぱり面白そうと目に映るわけですが。

知己の方がいらっしゃったのも、嬉しかったですね。藤原さん、わざわざお運びいただいてありがとうございました。

まぁ、そんな感じで予想外に大掛かりな成果発表会(お客さんが200人ほど集まってくださったらしい)でしたが、それなりに好評に終わったようで、よかったです。関係者の皆様、どうもありがとうございました。


さて,今後ですが,またYARVのお話をすることになりました.

  • 3/16(木)に農工大工学部にて PTT(まだウェブには情報が無いですね)
  • 3/18(土)に大久保にてOSC2006Spring(18-5A-1 生YARV Maniacs

後者は3人くらいを相手に濃いい話をして,ついでに色々意見を聞いて開発もしてしまおうと思ってたんだけど,なんか空席わずかって書いてある.おかしい.スタッフには申し込み人数が見えるんだが,なんか桁が一つ違う.みんな騙されてるよ.面白おかしい話はしないんだよ! PHPとかWikiとかのほうが面白そうだって,絶対.まぁ,午前だしな.きっとみんな寝坊するから,てきとーなのに入れておけってことなんだろう.多分.

わざわざ参考文献とか付けて,タイトルも変てこにして,とっつきにくくしたのになぁ.

ユーザ参加型の開発セミナー(YARVを開発)ということにして,皆さんにコードレビューしてもらうってのはどうだろう.1時間じゃ無理か.

うう、80人部屋ってことはないだろうけど、80人部屋になったら最悪だ。

ちなみに,午後には 18-B2A-4 最近のRuby〜RailsとRuby/Tk〜というセミナーをやって,こちらも盛況(申し込み人数を見る限り).内容については調整中です.

ちなみに私は「仮想化技術の活用方法」というセミナーを見たいんだけど、仮想化の方法はやってくれないんだろうかなぁ。やっぱり。


C# について全然知らなかったので,プログラミングC#第4版を買う.


リナザウ,というかPDAというか,盗られるとアレなのでパスワードを設定してるんですが,他の方はどうやってるのかな.やっぱりうっとおしくてしょうがない.


えーと、RubyはDSLがやりやすいんだったよね。


うーん、久々に酔っ払うまで外で飲んでしまった。どうも、お疲れ様です、ほんとに。


C#の本を、待ち時間があったので、一部をざっと読んだんだけど、印象としてはC++。Javaを足して割った、とか聞いていたのだけれど、C++ ++という印象で、だからC#かと、すごい納得してしまった夜。

ここまで効率主義だとは思わなかった。

_きむら(Tue Mar 07 14:22:41 JST 2006)

 肖像権とか引っかかりそうな気がしますが >写真。わたしは某Cマガジンと関係するwebページに写真が載せられたとき(Rubyでの集まりネタです)はあらかじめ公開してよいか確認されました。

_hio(Wed Mar 08 00:10:34 JST 2006)

 #って半分しかあがってない〜?とずっとおもってたけど、++を2つ縦に重ねて#!?

_6(Mon)

恐ろしく久しぶりに部屋の整理。うわー・・・。


Ruby/Qte で何か作ってみようかと思ってみたんだけど、チュートリアルを見ても概念がさっぱりわからなかったのですが、どの辺を見るのがよいでしょうか。

Qt って近づいたこともないと思う。

ソースを読んでみるしかないかなー。


ああ,今SPAか.一度行ってみたいんだよな.なかなか縁が無い....


そういえば、家族用PCで、IEでページが表示されなくなるページがある。Googleとか。ソースを見ると、いろいろ書いてあるので、どこかで表示系が腐ってるんだと思うんだけど、何がなんだか。しょうがないのでFirefoxを使ってもらっているんだけど、気持ちが悪い。

ソースネクストのアンチウイルスソフトを使っているからかなあ。JWordとか、その辺かも、とかは思っているんだけど。

Administratorではその症状が起きずに、ユーザだと起きるという不思議。


帰宅途中(私はバイク)、急に車線変更で割り込んできた馬鹿(車)が居た。運転席で一人、カーナビでTV番組を見ているようだった。勘弁してくれ。


JVMに新しいバイトコード命令という話。大変興味深い。

さて、我らがRubyはどうなるのかというと、どうなるんだろうなぁ。オブジェクトに対して、柔軟にクラス階層が(再)定義できれば出来そうな気はするんだけど。

その前に、クロージャの実現ってどうするのかしらん。JVMレベルではサポートしない、というのが順当か。

そうすると、define_method がなぁ。

class C
  define_method(:foo){
    # block
  }
end

を、

class C
  @@defined_method[:foo] = proc{
    # block
  }
  def foo
    @@defined_method[:foo].call
  end
end

のシンタックスシュガーとすればできるか。

... YARV もそうしちゃおうかな。

しかし、それだと self が変わってしまうなあ。あぁ、なんて嫌な仕様なんだ。


self だけ考えれば、

  def foo
    self.instance_eval &@@defined_method[:foo]
  end

でいいのか。

あー、もうこれだけにしちゃいたいぜ(まだ、色々ダメ)。

なんて嫌な仕様なんだ。

_kzk(Mon Mar 06 13:02:18 JST 2006)

 Qtはドキュメントが充実しているので、まずはこちらを(http://doc.trolltech.com/)。一番重要な概念は"Signals and Slots"です。それからTutorialの最初の方をちょっと読んで、クラス図を眺めてどんなwidgetが有るかなーと模索する感じが良いと思います。

_ささだ(Mon Mar 06 16:41:52 JST 2006)

 どうもありがとうございます。英語ばっかりだったり、どのバージョンを見ればいいのかわからなかったり(素人)ですが、見てみます。

_むらまさ(Tue Mar 07 11:27:23 JST 2006)

 IEはキャッシュが壊れているのではないでしょうか。一旦全部削除してみてはいかがでしょう。

_ひだか(Tue Mar 07 22:33:25 JST 2006)

 Zaurus の Qt は2.3ベースのドキュメントをみるのがいいです。http://www.kde.gr.jp/~ichi/qt-2.3.2/ に日本語訳があります。Qt/Embedded なので存在しないメソッドやらクラスやらあるのですがそのへんはとりあえずソース参照というのが早かったりします

_ささだ(Tue Mar 07 23:28:26 JST 2006)

 毎度毎度ありがとうございます。IEのキャッシュは、(多分)全部消したんですよねぇ。ZaurusのT

_ささだ(Tue Mar 07 23:29:04 JST 2006)

 毎度毎度ありがとうございます。IEのキャッシュは、(多分)全部消したんですよねぇ。ZaurusのQteはバージョンを見ると1.5.3とか書いてあったような気がするんですが、それが2.3.2ベースってことなのかな。

_ひだか(Wed Mar 08 00:37:44 JST 2006)

 Qtopia 1.5.3 + Qt/Embedded 2.3.2 です。Qtopia は qcop というプロセス間 signal-slot みたいなものとかアプリケーションの関連付けとかそれをサポートするためのQPEApplicationとかがはいっています。X11やウィンドウマネージャがなくてもそれっぽいことができるようなデスクトップ環境、ということになっています。

_5(Sun)

今日もダメな日。


そろそろ再起動か。

_4(Sat)

GCマークで利用するルートは色々あるので、「参照がない」と見えても、誰かが参照している可能性があります。

_3(Fri)

ひな祭り。ちらし寿司。


_2(Thu)

self.func() みたいな感じで local.func() (local はダメだろうけど)みたいな・・・。


やっと重い腰を上げて、リナザウにsshで入れるようにした。これであの使いづらすぎるキーボードを打たなくてもよくなった(なんか本末転倒)。

電源を落とす(サスペンドする、ふたを閉める)と、Wireless Lanは切断してしまうんだが(これはまぁ、しょうがない)、ソフトウェア的には接続しっぱなしになっているようで、再起動をしても、再接続してくれず、接続中という表示になる。なので、切断、再接続という手順を踏まねばならず、めんどう。これは不具合だよね。

さて、開発にはあとクロスコンパイル環境と、その結果を転送するためのネットワークドライブが必要だと思うんだけど、さてどうしよう。

リナザウと Linux box、もしくはWindowsでファイル共有するときにする常套手段ってないですかね。

というか、リナザウ用ソフト開発の常套手段。


るびま、今月のプレゼントは凄く反応がいいなぁ。


リナザウで予定管理などをしてみたいと思うのですが、私は Outlook なんぞ持っていません。何か、PC と連動できるいい方法を知りませんか。


うーむ、Qualendar と Sunbird が簡単に連携できるといいと思うんだが、そう簡単でも無さそうで。


りなざうのソフトウェアキーボードですが、ジェスチャーでバックスペースを入れられないのがすごいストレス。

_ひだか(Thu Mar 02 18:26:45 JST 2006)

 おひさしぶりです。Cygwinでよかったら。CoLinuxとかのほうが便利そうですが移行が面倒でずっとこれ使ってます。ファイル転送はふつうにNETBIOSで。http://takahr.dhis.portside.net/cgi-bin/rwiki.cgi?cmd=view;name=QtopiaSDK+on+Cygwin;em=Qtopia

_ささだ(Thu Mar 02 22:27:53 JST 2006)

 なるほど。cygwinで出来るんですね。gcc が 2.9.x なのが悲しいところですが。ところで Zaif を入れてみたんですが、数字などがキーボード必須でちょっと悲しかったです(ソフトウェアキーボードを表示するのはちょっとたるい)。

_ひだか(Thu Mar 02 23:16:17 JST 2006)

 Zaifはカーソルキーで数値入力できます。ビュースタイルでペンで入力したいということであれば、ダブルタップすると電卓が出てくるんでそこで時刻以外は入力はできます。時刻は時計みたいなパネルを作ろうかなぁとかおもっただけで全く手をつけていません(A300では困らないから)。gccは2.9系列じゃないと標準のQtライブラリとリンクできないのです。ZPlayerあたりは3系列を混ぜて(C-linkageで)使っているかも。

_ささだ(Thu Mar 02 23:24:00 JST 2006)

 おー。電卓で行けました!(メニューから起動した電卓で入力できなかったのでてっきりできないものかと) これから常用してみます。三日坊主にならなきゃいいけど。 gccについてですが、なるほど。Qtを考えなければ 3.x 系でもいけるかも、なんですねぇ。私の目的は Ruby というか YARV のビルドおよび評価なので、いけるかも。でも、Qt アプリケーション作れないのはさびしいか。

_ひだか(Thu Mar 02 23:42:23 JST 2006)

 メニューから起動したときはフォーカスが数値入力できる欄からずれていることがあるので…って言われてはじめて気づきました。メニューからは削除しちゃおうかなぁ。。。しばらく前から思っていたのですが Ruby は gcc3 でビルドして Ruby/Qte を gcc2 でビルドすればまさに C-linkage で混ぜることはできるのかなと思います。試してないけど。

_1(Wed)

3月。


em/www 経由でメールが送れない。時間が解決するかと思ってたんだけれど、はて。


温泉とか、全然日記に書いていなかったのだけれど、これからちょっとずつ思い出していこう。


志望校に合格とのこと。大変めでたい。


メールが届き始めた。

_shugo(Wed Mar 01 18:18:48 JST 2006)

 ご家族ですか。おめでとうございます

_ささだ(Wed Mar 01 20:24:33 JST 2006)

 そうです。ありがとうございます。これで我が家も一段落。

Sasada Koichi / sasada@namikilab.tuat.ac.jp
$Date: 2003/04/28 10:27:51 $