家に帰れてないのでそのへんのオープンネットワークから (Now in カラオケボックス)。

成人式自体はすぐに終わってしまって(二部とかあったけどどうもいいので帰ってきた)、なんか途中家に ssh しようと思ったら繋がらなくておかしいと思いつつ一度帰宅したら停電していた。立ち上げ直してから同窓会へ。

懐かしい顔ぶれでちょっと頭の中にいるようだった。いろいろ考えていろいろな人に話しかけてみた。だいたい就職している人がいたり、進路はっきり考えてたりすげぇなと思った。

聞いていたなかで一フレーズのみ印象に残っていて途中からどうもうまく気持ちが乗らなくなってしまった (別に悪い話ではない)。なんか俺がこれやって楽しんでる場合じゃねぇなとか、なんとか。ならこのクソ日記を更新するのではなく行動に移せという、はなしだ、が。


楽しいとか楽しくないとか、それ以前の人がいっぱいるけれども、やはり悩めるだけの余裕がある自分はその価値がないほど幸せなのだろう。極めて、幸せな境遇にあるのだ。


もっと相手の事を考えなければならない。矛盾しているけどそういうこともあるだろう。プライオリティのもっと高いことがある。

変更があったとき「j と k で移動できるだけなんでしょー?」とか思って内容をよく読まなかったのを激しく後悔するとともに、使いこなせていなかったことを深くお詫び申し上げたいと思う所存であります。謎

o を押すと新しくタブ開いて、なおかつアンテナは次のサイトにフォーカス移動してくれるので、 o で開いてみて、見終わったら閉じてまた o を押すというちょーこうそく個人サイトリーディングが可能。やばい。(「アンテナ設定」で「ボタンを表示する 常にオン」にしとくといいみたい)

あと自分がアンテナに登録しているのはイラストサイトばっかりなのですが、スクリーンショットを表示させるようにすると想像以上に便利な感じになりました。あーいままでなんでやらなかったんだろう。

一昨日と昨日やったことのまとめ。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 プログラミング初体験☆でした。別にエロくない。