一昨日と昨日やったことのまとめ。rubyclr (なんか rubyclr のサイトって title 要素の内容がないんだけど) について。

rubyclr 自体は .NET Framework があれば動くので VS.NET はいらないのですが、UI 開発などの行程で VS.NET が激しく便利なので少なくとも C# Express ぐらいはインストールしといたほうがいいと思います。(rubyclr の開発言語は C++ なので C++ のほうがいいかも)

わかったこと

  • 一旦アプリケーションループに入ると Ruby のスレッドスイッチが入らない (Timer で割り込みかけることで解決)
  • VS.NET で作ったクラスはそのまま rubyclr で読み込める (常に C# などと同時に開発可能)
  • clr なインスタンスに instance_eval かけると死ぬ
  • .NET はセキュリティに厳しい (ruby 関係ない)
  • .NET はスレッドに厳しい (ruby 関係ない)

とりあえず VS.NET で作ったファイルを読み込むには

require 'rubyclr'
reference_file "CompiledAssembly.exe"

とかやると、CompiledAssembly.exe に定義されたクラスが全てインポートされる。(もちろん public なものしかアクセスできない。フォームに配置したコントールはデフォルトで private なので Ruby から参照したいときは書き換える必要あり)

namespace Hogehoge 以下の Unco クラスは Ruby では Hogehoge::Unco で参照できる。

.exe にしてありますが、プロジェクトのプロパティで、出力の形式(デフォルトは Windows アプリケーション) をクラスライブラリにすれば dll になって単体で実行できなくなるみたいです。けど IDE で実行できなくなるのでデバッグし辛い。


Ruby のスレッドスイッチが起きないのは致命的というか、DRb 使えない Ruby とか Ruby で書く意味があんまりない、とまでは言わないけれど結構そんな残念な感じになってしまったので解決法考えた。というかトイレいったら思いついた。

# threadTimer という名前で配置。Interval は 10 で、最初から Enabled を true にしてある。
form.threadTimer.Tick do |sender, arg|
    Thread.pass
end

フォームに Timer を配置して、.NET 側から Ruby に定期的に割り込み入れるようにする。

ただし、この Thread.pass されたスレッドでフォーム内のコントロールを参照すると、参照した時点で謎のエラー (簡素なダイアログ) で落ちてしまう。(Thread.pass する前、つまりタイマー割り込みのイベント内では大丈夫です。)

subtech - MisuzillaSubtechImpl - Windows Forms とスレッド によると安全性のために落ちているらしい。Ruby のスレッドと .NET のスレッドとの関係性がいまいちわからないけれど、おまじない書くと一応大丈夫になる。

reference 'System.Windows.Forms'
System::Windows::Forms::Form.CheckForIllegalCrossThreadCalls = false

true にしといて別の方法で同期とったほうがいいかもしれない。(今回書いていたコードではこのおまじないを使わないで Timer 割り込みで UI を更新するようなコードにした)


あとは rubyclr のサンプルを見ながらやれば特に困ったことにはならなかった。でも exerb でまとめるとどうしてもセグフォるので誰かうまくいったら教えて欲しいです。

どうでもいいけど Ruby でスクリプト書くときも VS.NET を立ち上げっぱなしにしておけばどんなプロパティがあるかわかって便利だった。というか MSDN はどうも読みにくい……MSDN 見てから developer.apple.com 見ると癒される。


そういえば、もともと VB6 を触った事があったのでメソッド名とかはだいたい想像がついて .NET の浅い部分ではそんなに悩んだりはしなかった。

セキュリティシステムあたりがまだ理解できてない。


そんな感じの .NET プログラミング初体験☆でした。別にエロくない。

なんかすんごい何度も書いてる気がするけど、モチベーションの維持が一番難しいのだ。だから自分はモチベーションがあるときは失わないように必死だし、モチベーションがないときはどうすればモチベーションがでるか考えている。ただこれは実際「自分の中で完結する解決方法」でしかない。外部的要因によって強制的にスイッチが切られたら終わりなのだ。そう都合良くいかない。解ってる。解ってる。

表現だけを考えている。伝えるのに一番いい方法があるはずだ。まんぞくして自信がついたら終わりだ。それを持ってなおかつ相反する何かを持ち続けられるほどメモリをつんでいない。

例えばコンピュータは、こちらの表現を正確に受け取る。コンピュータは誤解はしない。でもコンピュータはソースコードの美しさを評価しない。


相手の望んでいることを考えるのが心底嫌いだ。


友人 (方向が違うのだけど、その方向をおれは取り入れていきたい) と文章がどうとかいう話をした。よくわからない。必要以上に導きたくない。想像のためのきっかけを作りたいと思う。後に残らないものを作りたいとは思わない。でも入り込みやすい要素は必要だと思う。バランスが掴めない。あるいは距離感なのかな。必要最低限でいい。特に論理的に導きだせるなら答えを言う必要はない。みんな俺より頭いいんだから、それぐらいできるはずだ。自分はそれをする気になるまでの導入を作れるようにならないといけない。


何周して戻ってくる。二週目? 眠い。

今まで「眠い」で終わる日記を何回かいたんだろう。

なんか ntp の設定してたら年が明けてた。iptables の設定わからない。別に普通の日だなぁ。当たり前か。

今年は

  • 50mm で納得いく写真がとれるようになりたい
  • Ruby 極めたい
  • Perl の型グロブをしっかり理解したい
  • Haskell やる気になりたい
  • unlambda をとりあえず極めたい
  • 可愛い女の子と新世界に旅立つ。

最後のがもちろん最もプライオリティが高いものであるが、実現可能性が著しく低いので、まず先に時間移動の方法を見つけたい。