2007年 01月 06日

svn svk リポジトリ構成

作り直すにあたりリポジトリ構成で困った。前もって trunk branches tags は作っておくべきだ……

svk を使うとバージョン文字列にリビジョン番号が使えない。ので日付と時刻にしてみよう。

Ruby/Cocoa の変更

メソッドの引数の間にシンボルおく方法が使えなくなるのが微妙にアレだなぁ。キモイのはキモイんだけどコードの意味がわかりにくくなるんだよなぁ……メソッド名の途中で改行はできないから、クソながいやつはクソながく書かないといけない

コピペこぴぺ

http://lab.lowreal.net/trac/browser/CSS%20Bullets/trunk (移動)
UDP だけ使うようにするとやたらシンプルだなぁ。ただこれでちゃんとうまく動くかまだわからない。

  • ポート番号

svk push するときは --verbatim 使おう。。

UDP がとどかない

OK

  • Windows -> Mac (via Hamachi)
  • Windows (Parallels) -> Mac (via Hamachi)
  • Windows (Parallels) -> Windows (via Hamachi)
  • Windows -> Windows (Parallels) (via Hamachi)
  • ubuntu -> Windows
  • Windows -> ubuntu
  • Windows -> ubuntu (via Hamachi)
  • Windows (Parallels) -> ubuntu (via Hamachi)

NG

  • Mac -> Windows (via Hamachi)
  • Mac -> Windows (Parallels) (via Hamachi)
  • Mac -> ubuntu (via Hamachi)
  • ubuntu -> Mac (via Hamachi)
  • ubuntu -> Windows (via Hamachi)
  • ubuntu -> Windows (Parallels) (via Hamachi)

Mac と ubuntu からの送信がうまくいってないのかな

svk revision

svk info //mirror/hogehoge

でミラーリポジトリ指定してあげると Mirrored From からリビジョン番号がとれるっぽい。どういう番号なのかわからないけど

gerry++

なんで突然 gerry が頻発するようになったんだろう

ハライター的には汚いトイレが多いJRの駅(多い気がするだけ?)はできるだけ利用したくない。ショッカーめ

2007年 01月 05日

parallels UDP

どうも paralles とホスト間で RingServer が見つけられない。

Hamachi を入れて試してみたけどだめっぽい。でも他の Windows 機を RingServer にすると paralles 内からも発見できる。

#<Errno::EBADF: Bad file descriptor - connect(2)> (DRb::DRbConnError)

とかでてるからそもそもなんかおかしいみたいだ

One click installer でインストールしなおしたら上のエラーはでなくなった。
しかし相変わらず RingNotFound。ホストコンピュータじゃなければ接続できるっぽいんだけどなぁ

やっぱり DNS でした。少し前の secondlife さんのアレと全く同じハマりをしてた

オートリロードってだけなら、RingServer と TuplseSpace とか使わないで、UDP パケットなげっぱなしでリレーするだけでもいいかも? これなら逆方向から接続しなおすとかないからホスト名ひくとかいらない、よなぁ。 リクエストのシーケンス番号つけて一回着たのは無視するようにしとかないと無限ループする予感でこわい。

Rake って便利だなぁとおもった瞬間

require 'rake'
require 'rake/packagetask'

Rake::PackageTask.new('PackageBaseName', VERSION) do |pkg|
	pkg.need_zip = true
	pkg.package_files.include('plugins/*', TARGET, RESOURCES, 'README*')
end

rake test 実行するのもいいけど、パッケージングもたのしい

Socket プログラミング

ほとんどわからない。(recv(4096)) とかやるけど4096以上きたときってどうなるんだろう。送信側とあらかじめ決めておくのかな

Socket プログラミング

とりあえず最小構成書いてみないとね!!! っていうかいまさら Socket プログラミングかよ遅くねpgrとか言われそう。

require 'socket'

@s = UDPSocket.new
@s.bind('', 9989)
p @s

loop do
	p @s.recv(1014)
end

require 'socket'

['<broadcast>', 'localhost'].each do |host|
	p host
	@s = UDPSocket.open
	begin
                # ないと permission error
		@s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
		p @s.send('aaa', 0, host, 9989)
	ensure
		@s.close
	end
end

送るだけ送る。"aaa" が二回表示される。

うちの環境の片思い

Mac さんから Windows さんへは思い (UDP) が伝わらない
Windows さんから Mac さんへは伝わる。

なんでだ!! Mac さんの思いはもっと報われるべきじゃないのか!!

UI 再考

もっかい考え直し。限りなくシンプルになったので UI いらない気がする。
メニューだけの構成にしようか、なぁ。またかよって感じだけどそれが一番簡単だ。

2007年 01月 04日

VisualStudio.NET と Ruby を密に連携してエロエロするメモ

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

doc

ドキュメント書くのめんどす。。

publish memo

  1. mac で cd mac; rake publish
  2. win で cd win; rake package
  3. 鯖上で cd win; rake publish
  4. 鯖上で rake publish

IconReset

IconReset はコマンドラインからも書き換えができるので自動化しやすくていい感じ
ただこれを使うということはビルドプロセスが Windows でしか動かないということになるのでちょっとめんどいですね、みたいな

gerry++

itai