くまりゅう日記

もっと過去の日記

[BeOS | Blender | COLLADA | NPR | OpenGL | Riko | Rub | Ruby | Silverlight | TRPG | XNA | mono | monotone]


2012-01-30

日記

そろそろ早起きに戻したいなぁ。

とりあえず起きたとしても室温が10℃切ってる状態ではふとんから出られないというのはわかったのでおとなしくエアコンつけるか。

[TRPG] 初めてのオンラインセッションやった

土曜日にクトゥルフ神話TRPGのオンラインセッションやった。 ずっと誰も参加表明しないので本当に大丈夫かと心配したが、前日になって続々と集まりプレイヤー3人になったので決行。 13時から始めて19時前くらいには終わった感じかな?4時間程度のシナリオということでキャラ作成から始めてこの時間なら妥当なところでしょう。

オンラインセッション自体は初めてだったが、ボイスチャットだったこともあってか意外にも普通にやれた。 もちろん課題もいくらもあったわけだが。

オンラインセッションならではというかボイスチャットの問題点としては誰がしゃべってんのか判別しづらいことか。オフでやってれば当然声出てる位置がわかるし、顔見りゃいいんだが。Mumbleだと一応しゃべってる人の口アイコンが点灯はするんだが物音とかにも反応するので確実じゃないし、二人以上でしゃべられるとやっぱり判別は困難だ……。3Dサウンドで人毎に位置を設定できるようにすればいいのかもしれん。TeamSpeakだとそんな機能があるとかないとか?

あと関係ないけどヘッドセットの調子が悪くて度々聞き取りづらくなった。最近ボリュームコントロール部分の接触が悪くてねぇ。ヘッドセットはよくケーブルとかその辺りがへたれるんでもうワイアレスヘッドセットでも買うかなぁ。ワイアレスは電池と接続方法が不安なんだけど。

閑話休題。オンラインセッションの不便な点としてはすぐに資料を見せられないというのもあった。 ある程度スキャナで取り込んでおいたんだが、取り込んでなかった部分を見せたいと思ったときにひょいと見せられないのはめんどい。 スキャナで取り込んだやつもTiffになってたのでどどんとふでアップロードができなかった。 そういう意味で準備はちゃんとしておかないと大変だなぁと。

特に資料が無くて困ったのがキャラ作成。クトゥルフは能力値決めて技能選ぶだけで完成だし1、能力値もダイス振って決めるだけなので簡単だと思ってたんだが、職業別に技能があるのを忘れてた。職業のところをコピってなかったので職業毎の技能は読み上げる、というかチャット欄に書き込むことで対処したけど。 データもある程度まとまったルールサマリーみたいなのを用意できるといいね。まあこれはオンラインに限ったことではないんだが、特にオンラインだとちょっとルールブック見せてが出来ないからな。

逆にオンラインセッションで便利だったこともいくらかあるな。

ダイスはどどんとふのチャット欄に1D6とか書き込むだけでいいってのがある。1D6とか1D100くらいならべつにいいんだが、1D3とかリアルで振ろうとしたら一瞬戸惑うような物も問題なく出してくれるので助かる。

チャット欄は文字で残しておけるのがいい。上であげた職業毎の技能なんかは読み上げたら各自でいちいちメモっておかないといけないが、チャット欄に一回書いておけばしばらくは残ってるので安心だ。主な会話はボイスチャットだからそう簡単には流れないしね。 もちろんオフでも紙にでも書けば同じなんだが。

どどんとふのマップ機能は俺は使うべきを使ってなかったんだが、プレイヤーがある程度勝手にマップを書いて相談に使ってた。 俺の画面ではスクロールアウトしたところに書いてあったんでほぼ最後まで気付かなかったけどな! 本当は建物の白地図を用意しておいて設定してあげれば良かったんだが準備が間に合わなかった。 いやよく考えたら今回のシナリオの場合は白地図の必要すらなかったのか。スキャンはしてあったんだがな。 その場で書けもするんだがマス目を塗り潰すタイプなのでフリーハンドでちょこっと書く程簡単そうでなかったんでやめた。

キャラクターシートはExcelで簡単に作った物をGoogle Docsのスプレッドシートに上げてみんなで共有編集してた。 MSのOffice Web Appsも見たんだが、そっちは誰でも編集可に設定しても編集にはログインが必須なようでめんどいのでやめた。 Google Docsは誰でも編集可にするとURLさえ知ってれば本当に誰でも編集できてしまうのが便利だ。 どっちにしろ共有して同時編集できるのがとても便利。他人のキャラクターシートをいつでも確認できるし。 問題は表計算アプリなんぞでキャラクターシート作らんといけないことだよなぁ。 自動計算できるところは簡単に入れられるの楽だけど、レイアウトがちょっと難しい。 フォームをポトペタで作れて数人で共有編集できるデータベースとかあればいいんだけど。 どうもFileMaker Pro辺りでは数人レベルの簡易Web共有ができるっぽいけどね。 しかし表計算で皆好き勝手にメモとか書き込んでいたので、あまりしっかりしたフォームより紙のように適当に使えるほうが便利かもしれん。 iWorkの表計算みたいなのがあるといいのかもねー。

セッションはプレイヤーはTRPG自体初めてという人もいたが、既製シナリオなので俺が適当にやってもそれなりにちゃんと進むのとクトゥルフ自体ルールがとても簡単なのもあって問題なく進んだ。 途中までそういやTRPG初心者が入ってるの忘れてたーまあ普通にできてるからいいかー、と思うくらい問題なかった。 もちろんプレイヤーに経験者はいたので、その人達が積極的にフォローしてくれたおかげというのもある。というかプレイヤーに恵まれたのはでかいな。

時間的にはキャラ作成に2時間程かかっちゃったのがきついが、シナリオ自体は長いものじゃないのでさくさく進めた。キャラ作成さえもうちょいさくっと出来たらよかったねぇ。もっと複雑なゲームなら2時間かかるのは仕方ないがクトゥルフだぜ?そのへんは今後の課題ということで。

俺のルール把握およびシナリオ把握度合いが微妙という問題はあったが、マスタリングの仕方自体はそう忘れてないようでよかった。 絶対的に上手くいったとは言わないが、もう数年はTRPGやってないというブランクや初のオンラインセッションで初対面の3人相手に慣れてないゲームをやるという状況を考えれば、スムーズに進んでプレイヤーに楽しんでもらったというだけで十分な成果だろう。

配信してたので観客もけっこう居たわけだが、その中からも面白かったとかNPCのロールプレイしてやりてーとかいう声が出たのは嬉しかったな。 今回観客で面白いと思った中からも次の参加者が出てくれる。これを継続的にやってユーザー拡大を狙おう。拡大してどうすんだという話もあるが、まあ、プレイヤーに困らないじゃん?誰かマスターもやってくれるかもしんないじゃん?

継続的にということで2週間に一回くらいできるといいかなぁとか思ってたが、TRPGの準備がけっこう大変だというのも思い出せたのでやはりマスターやるのは1ヶ月に1回がせいぜいだろう。とりあえず来月にも1回やりたい。パラノイアやりたいとか言われてんだけど一度もやったことないし、あのテンションは維持できんのかというのが難しそうなんだよねぇ。少なくともパラノイアについてわかってるプレイヤー集まらないといけないというのも難しいかも?オンラインセッション用ルールというのが無料公開されて和訳までされてるからルールについては心配ないのは嬉しいけどね。

  1. 現代で装備とかいらんしな。


2012-01-25

日記

日記書いたのに上げ損ねてた。そうこうしてる間に状況が変わるので書いたものはどうしたものかと。

ここしばらく体調が良くなくてだらだらと半休にしてみたりしてたが、半休ではなかなか良くならんのでちゃんと休んでだいたい回復した。 体調が良くない時はさっさと治るまで休むべきだな。

[TRPG] オンラインセッションやりたい

思った以上に仕事が忙しくてオンラインセッションのテストができず。 プレイヤー募集開始はしたが、募集スレに書いといたくらいじゃ集まらんな。配信して宣伝もしないとならんか。

オンラインセッション環境はいろいろ検討したけど、ボイスチャットにMumble、支援ツールにどどんとふを使うことにしてみた。

支援ツールの炬燵というのがあってこいつはボイスチャットも標準装備なんだが、部屋を立てるには自分でサーバになる必要があるようだ。サーバ立てること自体はそう問題ないんだが、オンラインセッションに配信も同時にやるのでADSLでは上り帯域が不安。できるだけ外のサーバを使えるものにしたかった。

ボイスチャットはTeamSpeak3かMumbleあたりがメジャーなようなのでどっちにしようかなと。SkypeはPeerCastと相性悪かった覚えがあるのであまり使いたくない。説明を見てるとMumbleは普通にインスコするだけで日本語化されてるようなのでこれが楽そうだな。オープンソースなのも気分的に良い。サーバはフリーサーバがいくらかあるのでそこを使わせてもらおう。

支援ツールのほうもどどんとふだとフリーサーバがあるのでこれを使うことに。これでサーバは全部外なので帯域は自分の分+配信の分だけで済む。 今後もしょっちゅうやるようならいつもフリーサーバ借りるのも気が引けるのでVPS辺りにMumbleと支援ツールのサーバをピアキャスTRPG用として立てるのもいいかもね。

ところでボイスチャットの様子を配信しようとすると、音声はどう接続すればいいんだろうか。マイク入力をMumbleとエンコーダで同時には使えないよね?というかエンコーダにはボイチャの音全部載せないといけないからマイク入力じゃだめか。かといってステレオミックスだと自分の声が載らん。

いろいろ試してたんだが、俺はUA-4FX使ってて都合により変なつなぎ方してるのでなんとかなった。マイクはUA-4FXにつながってる。Mumbleの入力はUA-4FXを指定すればOKだ。Mumbleの出力(というかWindowsの出力)はUA-4FXに入る。このときUA-4FXのアナログ出力にはマイクとPCの出力がミックスされたものが出てる。これをPCオンボのライン入力に入れて、エンコーダ入力はPCオンボのライン入力を指定すればミックス結果をエンコできる。

PCからの出力がUA-4FXに入ってそれをまたPCに入れてるが、アナログ側はライン入力を再生しない限りはループもしない。単にMumble→マイクミックス→エンコーダになる。Mumbleの出力も入力もUA-4FXを指定している形になるが、UA-4FXはループバックモードにしない限りPCからUSBで出力されたものをUSB入力に渡さないのでこれもループしない。入力はマイク→Mumbleのみになる。

やっぱり音声入力って簡単そうだけどやってみると結構大変だよなぁ。 と思ったが、最初からマイク入力を再生有効にしつつMumbleに入れて、ステレオミックスをエンコーダに入れればいいだけじゃね。マイク入力の再生さえできれば簡単じゃねぇか……。

配信して宣伝もしたけど興味ありそうな人はいくらもいるけど参加表明までする人はいないなぁ。どどんとふのテストがてら部屋を立てたらいくらか人が来て楽しそうにいじってたので表明はないがいざとなれば3人くらいは来るのかもしれん。ぶっつけ本番いくかー?

どどんとふは便利だがキャラクターシート管理まではできないのね。Excel辺りで作ってGoogle Docsに共有でもしとけばいいか。いやGoogleはあまり好きじゃないのでまずOffice Web Appsを試そう。どっちにしろ表計算でキャラクターシート作るのめんどいんだけどなぁ。

irpack 0.2.7

ちょっと前にirpack 0.2.7を出しました。 念のため書いておくとirpackとはIronRubyで動くスクリプトをexeにまとめあげる物です。

変更点は、irpackコマンドが起動しなかったのとREADMEに書かれていたコマンドの例が間違っていたのを修正しただけです。 Rakeタスクしか使ってなかった人には関係ないです。

irpackコマンドが起動するかどうかのテストまでは書いてなかったんだよなぁ。書いとくべきだろうか。めんどいんだが。

irpackはここしばらくは特に強化予定はないです。バグ報告があれば対応したいくらい。機能リクエストもあれば検討するけど。

PeerCastStation日記

JSON-RPC部分のテスト書き進める。

しかしテスト書いてて思ったが、引数の型チェックなんかをしていちいちエラー返すのがめんどい。 普通のライブラリならちゃんとチェックしないで落ちても、あーなんか例外で落ちたーとわかるからいいんだが、 RPCだとちゃんと正常にエラーを返してあげないといけないので落ちっぱなしとか困るわけだわ。 まあ.NET側の例外をJSON化してエラー情報としてぶん投げてやってもいいんだが、そんなもの受け取ってもソースみないとよくわからんだろうからちと不親切。 引数の型チェックくらいはやっといたほうがいいね。

引数の型チェックくらいはやっといたほうがいいのはわかるんだが書くのはめんどい。 RPCMethodAttributeという属性をつくって、これがついてるメソッドはRPCに公開してるメソッドということにしてるんで、 ついでに引数の型情報とか引数の名前情報も拾って勝手にチェックするようにしようか。 Jayrockではそうなってるっぽいんだけど、結局自前で同じようなの書くはめになるのか。

結構めんどくさかったが、なんとなく書けたのでテストに通してみたら何事もなく通ってしまった。 いやまあ通ったのはいいことだけど、そうすんなり行くと思わなかったぜ。

とりあえず一通りテストは書けたっぽい。あとはクライアント側。JavaScriperにならないと。

ちょっとAPIの設計に関係するところでアクセス制御関係の機能を追加しないといけなかったので、それが出来たらクライアント側書こ。


2012-01-10

日記

TRPG熱が上がったので初のオンラインセッションをやることに。

オンラインセッションはやりたいと思ってはいたもののやらずじまいでずっといたが、なんか急にピアキャスでオンラインセッション募集スレなるものが立ってたので気になった。具体的に募集があったわけでもないのでどういう経緯で立ったのか不思議である。さらにそのスレを見た日にはオフでD&Dやってる模様の配信が立ってたりしてTRPG熱が急上昇。これはもう俺もやるしかないというわけだ。

しかしどんなゲームやればいいんだろうかと悩んだら、SAN値減るやつやろうと言われた。クトゥルフか。確かにやりたかった物の一つではあるがマスターやったことないしちょっと不安かな?

ピアキャスでのTRPGはごく稀に配信する人がいるくらいでメジャーなものではないので1TRPG初心者が入ることも想定したい。クトゥルフは下手すると詰むのでそれより最悪サイコロ振ってるだけでも進むゲームの方がいいかなーと。俺もTRPG数年ぶりなので上手くマスタリングできない可能性高いしね。

サイコロ振ってるだけでも進むゲームとしてハンターズ・ムーンはどうかと思ったんだが、リスナーの食いつきはあまりよくないようだ。やったことはないが雰囲気的にはある程度マンチなことをしないと余裕で全滅しそうなところもどうかとは思う。かといってシノビガミはロールプレイできないと厳しいだろ。

とかなんとか考えたんだが、とにかくプレイヤーが集まらんことにはどうにもならん。人を集めるならクトゥルフが知名度的に一番よさげだし、基本は普通の現代物でキャラクターも一般人なので説明も少なくて済むし、ルールも簡単なので全員初心者とかでなければなんとかなりそうだ。詰みそうなら俺がヒント大盤振舞いすればなんとかなるのでクトゥルフやろう。

ところでクトゥルフ持ってたっけかと探してみるとクトゥルフと帝国がみつかった。これだけ持ってるとは思えないのでルールブックも持ってるんだよな……?しかし記憶が正しければ持ってるのはクトゥルフd20だった気がするんだ。

さらに家のTRPG箱を探すとH.Pラブクラフト アーカムもみつかった。あとクトゥルフd20な。うわーやっぱりd20版だよ!BRP版買っておけばよかったと思った覚えがあるんですよ。d20版はちょっとルールとかデータがめんどくさそうだし、いきなりやるのは不安だな。そもそもプレイしたことないし。

まあ普通にBRP版買うかと調べてみたらどこも売り切れ。え、サプリメントもリプレイも出てるのに絶版ですか?おいふざけんなよ。と思ったがエンターブレインの公式通販では在庫有りになってて買えそう。絶版じゃなくて流通在庫が無いだけか。しかしAmazonとかにもなくてマーケットプレイス12000円とか倍の値段になってるんだがほんとに買えるのかなぁ。とりあえずクトゥルフ神話TRPGとクトゥルフ2010を注文しといてみた。すぐ届くといいなぁ。てか出たばっかりのはずのるるいえばけーしょんは逆に在庫切れなんすね。

シナリオ作るのは大変そうだが初めてなので既製のものを使おう。ロール&ロールを探せばなんか出てくんだろう。

あとはオンラインセッションの環境を整えればいいのかな。これが一番不安だ。最近忙しいからなかなかテストできん。

上手くいけば21か22日にはプレイするつもり。ルールブックが早く届かないようなら無理だが、その場合は別なゲームを考えるか。

  1. TacticalRPGですか?となんども聞かれた。そんな言葉の方が初めて聞くよ!

PeerCastStation日記

PeerCastStationもやってるよ。

JSON-RPCでのHTTP APIサーバを書いたのでテスト書き。

テストはIronRubyで書いてるんだが、JSONのパーサライブラリは標準でついてるかな?あ、いちおう入ってそうだからこれ使おう。と思ったらjson/pureが無いとかなんとか。なんで中途半端に入ってんだよ……。

gemで入れようかとしたけど拡張ライブラリがビルドできねぇとか言われて入らないので諦めた。YAMLで読み込めばいいかと思ったがYAMLもなんか動かん。困ったな。

調べたらちょっといじってevalすれば読み込める的なことがあった。そう言われてみればそうか。:=>nullnilに置き換えてevalしたら読み込めた。普通に考えればこれではいろいろと問題ありすぎるんだが、テストに使う分には問題ねぇだろ。

テストをちょっと書いたら実装側にいろいろ問題あるのが判明。APIリクエストはPOSTで受け取るんだけど、POSTのボディっていつ終わるか判別できないじゃないですか?調べてみたらContent-LengthをくっつけるかHTTP/1.1なら何か変なエンコーディング形式を指定するとわかるんだと。1.1のやつは対応めんどくさそうだから1.0で。Content-Lengthが無かったらLength Requiredを返すとクライアントはContent-Lengthをくっつけてくれるようだ。HTTPのGETなんかは知ってるつもりだったけどPOSTを直接投げることってあんまりないから知らなかった。いろいろとめんどい仕様があるもんだな。

JSON-RPC 2.0はメソッド呼び出しの引数に配列(普通に順番で指定)かオブジェクト(キーワード引数的に名前で指定)が渡せる。サーバ側は両方対応しないといけない……んだろうけどこれめんどいね。対応自体はそれほど大変でもないんだけどテスト2つずつ書かないといけないじゃないですか。なんてこった。


2012-01-05

日記

久々に会社行ったらすげー寒かった。本来5日から始業のところ4日に行ったので人少なくてとても寒い。普段は冬でも冷房入ってるくらいなのにな。

年末年始はあまり休日出勤もせずに5連休。帰省もしなかったので本当にだらーんと休めた。 最近は日曜以外は出てたりもしたし夏の休日シフトとの合わせ技で祝日なんかずっとどっか消えた状態だったので3連休以上自体かなり久々だよ。 そんなに休んだらぜったい身体壊すわーと思ったんだが全然問題なかった。忙しいと元気だな。

まだしばらくは忙しいけど今月も中旬以降はどうだろうな。暇にはならんがピークは過ぎた感があるのでちょっとずつ生活リズムも戻していかないと。

VITAのアンチャーテッドをクリアした。PS3持ってないからアンチャーテッド自体初めてだったけど、ふむこんなもんかという感じ。普通に面白かったけど、ハードのローンチタイトルにありがちなハードの機能をとりあえず使ってみました的なイベントが邪魔くさい。よくあるデモシーン中に急に出てくるボタンを押せ的なやつが、矢印が出てきてタッチパネルでなぞれ的な物になってた。たまになぞったつもりでも失敗するんだが何で失敗したんだかよくわからんのがひどい。そもそもこのボタンを押せ的なイベント1は本当にゴミクズで一刻も早く廃れるべきだと思っているので、それがタッチになろうが何になろうが俺はぶち切れるだろう。

ゲーム自体は楽しかったけれども、じゃあPS3買って他のやつもやろうか!という程ではなかったな。よく出来てるけどそれ以上の魅力はなかった。最近やったゲームではアサシンクリードのいまいちな点は目立つけど独特なゲームって方が好きだな。まあストーリーの好みもあるか。

アンチャーテッド消せば俺の4GBしかないメモカにも他にゲーム何か入るなーと思ったんだけど今VITAでやりたいゲーム特にないな。ドリクラZeroとか買おうかと思ったがこの手のゲームはめんどくさくてすぐ積みそうだ。PSPのゲームもできるのを思い出してダラバーを入れてみたらスティックで操作しやすいし、画面も思ったより綺麗でこれはいいと思った。なんかPSPのゲーム探すか。セブンスドラゴン2020とかもやってみたいけどどうなんだろうな。

そういやVITAのPlaystation StoreアプリがPSPのより使いづらくなっててとても残念なんだけどなんとかならんのかな。ゲーム探そうとすると50音順でしか探せねぇっておかしいでしょ。PSPではジャンル別とかダウンロード専売とかいろいろ細かく分類されてたんだけどなぁ。VITAソフトはまだ数無いから問題ないんだけど、PSPソフトはもう名前知ってないと探せないレベル。早いところ改善をお願いしたい。

  1. そしてたいていは失敗するとすぐデモシーンの最初から見直しだ。

PeerCastStation日記

HTTPインターフェースの作成中。従来のPeerCastと同じようにCGI的な作りにしようとしてたんだがとてもめんどうなことに気付いてやめた。

HTTPでやりとりする部分はMVCで言えばControllerなわけで、それでHTMLまでレンダリングしなくちゃいけないCGI的な作りはめんどいなぁと。成功したら成功したページに遷移して、失敗したら元のページにエラー情報持たせて表示するとかめんどいでしょ。Viewは完全にクライアント側に持たせた方がきれいだ。

というわけでHTTP経由のAPIを使って、クライアント側のJavaScriptをやりとりしよう。これがAJAXってやつか。今までなんでわざわざこんなめんどいことするのだろうと思ってたわけだが、クライアントとサーバを綺麗に分離できるって利点があるわけね。

ついでにJSONをHTTPやりとりさえできるならクライアントがWebブラウザじゃなくてもいいわけで。前から作ろうと思っていた外部ツールからの操作インターフェースもこれで兼ねられるのが嬉しい。レスポンスがHTMLだと人間が読むものでプログラム的に解釈するのは難しいからな。

適当にJSONでやりとりすればいいかなーと思ったんだけどJSON-RPCっていう仕様があるようなのでそれに則るようにした。 .NETではJayrockというJSON-RPCのサーバ・クライアントライブラリがあってとても便利そうなんだけど、サーバ側はASP.NET前提のようなのでASP.NETを諦めたPeerCastStationでは使えない。JSON-RPC自体はJSONのパースさえできれば難しいところはなんらないので自前でサーバ書こう。

JSONパーサはSilverlightだとSystem.Jsonに入ってるが、.NETだとSystem.Jsonねぇよ……。ライブラリとしてはあったんだがライセンスがWCF Prereleaseどうこうとかいうライセンスだったので読むのめんどい。使わないほうがよさそうだ。JSONへのシリアライズ辺りのクラスは標準でもあったんだが、シリアライズじゃなくてJSONを直接使おうとするのは難しそうだ。結局Json.NETというのがメジャーなようなのでこれを使うことに。

あとはJSONというか動的型付け言語と静的型付け言語のギャップがめんどいくらいで大変なところもなくさくさくと実装できた。テスト書くのめんどいでしゅううう。

テスト書こうとして思ったんだが、そういやJSON-RPCをHTTPで使った時にGETに対する反応ってどうすればいいんだろう。クライアントから送られてきたJSONリクエストに対してレスポンスを返すのでPOST前提で書いてたんだが、リクエスト送れないGETではどうしたものか。GETはHTTPの仕様的に実装必須らしいのでエラーにするのはよくなさげ。しかしURLエンコードされたJSONをリクエスト扱いするとかいやだよ?

JSON-RPCの仕様では特に記述されていない、というか2.0の仕様ではHTTPにすら触れていない。1.1の仕様では一回のPOST接続で沢山リクエストしてもいいのよ?とかぐらいしか書かれていないのでGETでどうしろということもないようだ。

実装を見るとJayrockではRPCでアクセスできるメソッドの一覧や引数などのヘルプページを返してくれるようだ。なるほどこれはとても素敵。GETでさらにパラメータを渡すとアクセス用のJavaScriptとかテスト用ページも出てくる。致せり尽せりだがここまで自前で実装するのはしんどいね。とにかくGETの時はRPCの実行はしなくてよさげなのは分かったので、適当にバージョン情報か何かをJSONで返すようにしておくあたりが精々だろう。

それにしてもテスト書くのめんどくせぇな……。


2011-12-27

日記

IronRubyとOpenTKで何か作るのを止めてたのはmonoでIronRubyが動かないからだけじゃなかった……。

monoでIronRubyが動かねぇなんてのは言い訳だろ!ということでまたいじろうかと思ったんだけど、LOOX UでANGLE使っても表示みだれちゃうから手を出せないでいたんだった……。ANGLEとGMA500の相性が悪いのかと思ったんだが、Firefoxでkhronos.orgトップページのくるくる回る立方体はちゃんと表示されるので必ずしも全くだめというわけでもないようだ。以前のバージョンでは普通に動いてたしな。じゃあFirefoxのANGLEぱくってくればいいのかとやってみたが自分でビルドしたのとかわらず。初期化パラメータをいくらかいじってみたが全然かわらん。ということはOpenTK+ANGLEとGMA500の相性が悪いとしか言えねぇなぁ。OpenTKのソース確認しながら調べるしかないか。

調べてみたけど悪そうなところは特にないなぁ。原因さっぱりわからず。試しに以前CRubyで作った拡張ライブラリをANGLEのlibEGL.dllとlibGLESv2.dllで動かしてみたらやっぱり表示が乱れてしまった。うひゃあ。GMA500と最近のANGLEの相性が悪いってことか。なんでFirefox内のWebGLはそれっぽく動いてるんだろう……。 OpenTKも自作の拡張ライブラリも使い方が悪いという可能性もなくはないが、使い方というほどいじれる場所もないんだぜ。

ANGLEのサンプルで調べてみるしかねぇか。これは正しく動いた気がするんだよな。……ってやっぱり表示乱れてんじゃねぇか!うう詰んだ。ANGLEまでデバッグする気ねぇぞ。

……できた。Direct3D9Exを使わないようにしたらちゃんと動いた。Intelドライバで新しい機能なんて使っちゃいけなかったんだ!結局ANGLEをいじるところまで手を出しちゃったが、オプション一ついじっただけだし、とにかく解決して一安心だわ。

解決したのはいいんだが通勤中プログラミングは最近進められてないPeerCastStationをやることにしたのでまたグラフィックスいじるのはおあずけに。

irpack 0.2.6

けっこう前に出来てたirpack 0.2.6をやっとリリースした

Rakeタスク追加して、Rakefileで各種オプションやら埋め込むファイルやら指定できるようになった。 コマンド版より便利なので今後はこれが主要な使い方になるんじゃないかと思う。 俺も前からコマンド版はあんまり使ってなくてirpack.rbをrequireして直接使ってたし。

俺的にはもうだいたい完成なんだが、あとはどうしようかなぁ。 やることとしてはgemの埋め込みあたりが思いつくんだけど、俺がIronRubyでgemはあんまり使ってないんだよ。 gemについてもうちょっと詳しくならないといけないしな。

今は実行ファイルしか作れないけど1、クラスライブラリのdllを作れるようにするというのは面白いかもしれない。 なんとかしてクラスとメソッドのシグネチャを指定するとラッパクラスが生成されてC#側からそのクラスが普通に呼び出せる。中身はIronRubyのVM立ち上げてやりとりしてるだけ。というのはいかがでしょうか。 何に使うのかというとIronRubyのホストをしたいけどどうすればいいんだっけ?というのがめんどいのでなんとかしたいだけです。

作るのはそんなに難しくないんだけど、どうやってシグネチャ指定するのよっていうのとどの単位でVM立ち上げればいいんですかねって辺りがちょっと考える必要があるか。ネタ的には結構好きだけど実用性はちょっと疑問なので実際には作らんだろう。リクエストでもあれば別だけど。

やるとすればやっぱりgem埋め込みだな。まあ自分で使うのに欲しいわけじゃないから要望でもない限りPeerCastStation優先な感じだが。

  1. dllも作れるけど普通にMainメソッドがあるだけなのでdllとして実用的ではない。


2011-12-15

日記

疲れがとれにゃい。

Catalyst11.12でOpenGL 4.2対応というので入れてみたら確かに4.2になった。そりゃそうだ。しかしグラボも挿してないのでA8-3850とかいうCPUに内蔵されてるGPUでGL4.2ですよ。なんかすげーな。最近グラフィック関係いじってもないので宝の持ち腐れですが。

うーん、しかしちょっとまたグラフィックスもいじりたくなってきたな。グラフィックスというよりげーむえんじん作りたい。IronRubyとOpenTKでGLES2のラップをしたものまでは作ったからそれのOpenGL版を作りたかったんだが、MacBookでだらりとやろうとしたらmonoでIronRubyが動きやしないので諦めたんだった。IronRubyじゃなくてJRubyとJoglの方がいろいろといいんだろうな。でもできればIronRubyの方を贔屓にしたい。JRubyはメジャーだからな。メジャーなもの使ってもおもしろくないだろ!

Joglに手を出しづらいのはパッケージが多すぎてよくわからんのもある。これは一回設定すりゃ大したこともないだろうが。

PeerCastStation日記

HTMLベースのUIを作成中。

テンプレートの適用もできて特に問題なく動いた。テンプレートを適用するにあたってファイルの文字コードをどう判別しようかとちょっと悩んだが、UTF-8決め打ちで問題もあるまい。

テンプレートエンジンはDotLiquidを使った。トップページが綺麗だからドキュメントとかわかりやすそうと選んだんだが、綺麗なのはトップページだけだった。残念ながらドキュメントが弱くて最初にちょっと手間取ったが、文法以外はそう複雑なものでもないのでちょっとソースを見たらだいたいわかる。文法はRuby版Liquidのページにある。

はまったのはテンプレート適用時に参照できる変数として適当なオブジェクトを渡したら文句言われるところ。HashとかICollectionとかならそのままアクセスできるんだけど、それ以外の普通のオブジェクトだと組み込み型かILiquidizableを実装した型じゃないとだめだぞと怒られてしまう。仕方ないのでILiquidizableを実装したラッパクラスを作って渡してやろうとするんだが、ILiquidizableはObjectを返すToLiquidメソッドだけを持っていて、さてこいつは何を返したものかと。

適当にプロパティに数値や文字列やコレクションのみを持つ匿名オブジェクトを作って返してやったら上手くいったのでそれで良かったらしい。おそらく最初から匿名オブジェクトを渡すのでもいけたんじゃないかとも思うが詳しく見てないし、登録したいオブジェクトがけっこう多くて匿名オブジェクトの生成は遅延したかったのでこれでいいだろう。

あとは表示したい物をまとめたりHTML書いたりしてみてそこそこできた。表示のみ。UIというからには表示だけじゃなくて操作もできないといけないんだが、そっちはさっぱり書いてねぇわ。

今まで通りのGUIもあるので自分でデバッグがてら使ってたんだが、しばらくしてから操作したらオブジェクトにアクセスできない的な例外が。接続が切れたとかなんとか。そういやUIとコア部分はAppDomainを分けてたので同一プロセス内ではあるもののリモート扱いなんだった。しかしリモート扱いとはいえ同一プロセス内、接続が切れるとかありえねぇ。

原因はなんとなく分かってて、リモート先に渡したオブジェクトは適当な時間で貸し出し期限切れになってしまうって奴だろう。回避するにはMarshalByRefObjectを継承してるクラスでInitializeLifeTimeServiceメソッドをオーバーライドしてnullを返してやればいい。nullを返すと無期限にしてくれるんだとさ。やったー。

いやいやちょっと待て。本当に無期限にしていいものか考え物だな。今まで考えてなかったが、リモート先に公開したオブジェクトがクライアントからいまだに参照されてるかどうかってのは分からないんじゃないか?参照されてるかどうかわからんということはGCしていいかどうかわからん。そこで貸し出し期限てのを設けて、期限が切れたらもうリモート先から参照されてないんじゃねーということになっているわけだ。となると期限を無期限にすると一生GCされなくなっちゃう。なんでもかんでも無期限にしちゃだめだなこりゃー。シングルトン的などっちにしろいつまでも生きてるような物だけが無期限にしていい奴か。

ちゃんと調べてみるとクライアント側でまだ使ってたら適宜延長してやるとか、何かメソッドが呼ばれたら自動延長するとかいう方法が取れるようだ。どっちにしてもめんどい。後者は比較的簡単そうだがUIに使うには向いてないな。ユーザの操作によってアクセスされるから間隔は結構あるし。

よく考えてみるとAppDomainをUIとコアで分けたのはUI部分をASP.NETをホストしてやろうとしたからで、ASP.NETのホストを諦めた今となっては分けることに必須じゃない。分かれてたほうがUIの動的アンロードとかできてちょっとかっこいいよねーというのはあるけど、ちょっとかっこいい代償がUI作るのめんどいになるのは高くついてませんかね。UIの動的アンロードなんてしないし!

そんなわけでとりあえずAppDomainは分けない方向に戻そうかと。あちこちにMarshalByRefObjectをつけまくったのが無駄になるなぁ。でも今後コア部分だけサービス化しようとかへんなこと考えた時に使えるかもしんない……ってその時はその時にまた考えたほうがいいだろうな。一旦消すか。


2011-12-13

日記

だるい。ちょっとだけ風邪っぽいのかも。周りの人が軒並み風邪引きでこわい。

もう今年中には出ないんじゃないかと思ってたSilverlight5の正式版がしれっと出てたけど、当然のようにMacでXNA描画は対応していないので全く使い物にならないのであった。 だったらJavaアプレットでJoglでも使った方が楽じゃねというね。(たぶん)ゲームパッドも使えるし。 Silverlight自体終了のふいんきなので仕方ないのかもしれない。OSX自体も終了のふんいき……は言いすぎかもしれないが、まあそんなに力入れるべきターゲットに見えないのは確かだ。

しかしIEがWebGLに対応するとは全く思えないし、MetroモードのIE10ではSilverlightも動かないっていうしブラウザ上の3D表示はどうするんですかね。え、ブラウザ上で3D表示なんかいらねーよって?そりゃごもっとも。なぜかJavaScriptからXNAで描画できるようになってるという可能性は否定できないが、やっても誰も使わんだろうな。

一方でGoogleはNativeClientとかいうのを大々的に宣伝してるけどChromeでしか動かないし今時CPU依存なつまるところActiveXでしょそれ?という物を誰が好んで使うのかと。まあ主にChromeOS用でたまたまChromeOS以外でも使えちゃうだけなんだろうけど。

WebOSがオープンソース化だと……。事実上終了のお知らせのような。結局日本でデバイス出なかったな。

[Ruby] IronRubyにrakeがない

irpackのRakeタスクを作ってみたのはいいがIronRubyにはrakeコマンドがついていないのであった。

Rake自体は標準添付なので直接起動してやればいいんだが。

ir -rrake -e 'Rake.application.run'

なげーよ。まあgemで別途rakeを入れとけばいいだけかもしんない。標準添付されてるものをgemであらためて入れるということを普段やらんからすぐ忘れるな。

irpackをrakeに依存させて強制的にrake入れさせたほうがいいんだろうか。どうしても必要ってわけじゃないからいらないか。


2011-12-06

日記

最近8時出勤を諦めて9時出勤にしてみたらだいぶ楽になった。

朝に1時間余裕が出来たおかげで平日すこしながらも作業する余裕ができた。7時に家を出ようとすると5時に起きても作業時間は1時間も取れなくてあまり作業する気にならなかった。ちょっと悩んだらすぐ時間切れになっちゃうもんね。8時に出るなら1時間半、ちょっと寝過ごしても1時間くらいは作業できるようになったわ。まあしょっちゅう大幅に寝過すんですけどね。

しかし平日に作業できるとだいぶ気が楽になる。やっぱ仕事ばっかりやってちゃだめだねー。やってることはどっちにしろプログラム書いてるだけなんだけどさ。

PeerCastStation日記

少しづつ進める。

ASP.NETのホスティング自体はCassiniのソースを参考に書けたんだが、これはこれでいいんだろうか。なんかSystem.Web.Compilation.BuildManagerHostとかいうドキュメントに載ってない隠しクラス使ってんだが……。 いやmonoでサポートされてなかったらダメじゃね?調べたらサポートされてたわ。あー、しかし追加されたのが今年の4月。最近すぎる。mono 2.6.xをターゲットにしてるんでちょっと無理っぽいなー。

どうしようかと悩んでたらASP.NETはオーバースペックじゃね?と言われたんでやっぱりそうだと思い直してASP.NETは諦め、テンプレートエンジンを探す。いろいろ探したけどDotLiquidってのが手軽そうだったのでこれを使うことに。

普通のHTTPでファイルをホストする部分まで書いたがテンプレートエンジンはまだ関係ない。あとはhtmlとかにテンプレート適用して返すだけだわ。どういうAPIにするか考えないといけないけど。

そうそう、mono 2.6.xをターゲットにしてるのはUbuntuで使えるようにと思ってのことだったんだけど、そういやmonoのプレインストールやめるかもという話もあったのでどうなったのかあらためて調べてみた。すると11.10でmonoの2.10.5が入ってるとのこと。おっと、3.0まで更新されないのかと思ってたんだが2.10系が入ってしまったか。これなら.NET4も使えるんだが、.NET3.5にこだわる必要もないかなぁ?

まあみんながみんな最新のUbuntu使ってるわけでもないし(11.10はLTSでもないし)、monoの2.6.xを目標にするのは悪くもないか。あと.NET3.5はWindows7では標準なのは楽かも。.NET3.0では無理かと聞かれたことはあるんだがLINQが使えないのはさすがに無理だった。何もインストールさせてもらえないVistaマシンで使おうとしたんだろうか……。

[mono][Ruby] monoの正規表現はIronRubyを動かせない

monoはIronRubyを動かせない。

もちろん試しにmono ir.exeとちょろっと打ってみると何の問題もなく起動はするんだけど、そのままrequire 'rubygems'とでも打ってみると’>= 0’がだめなバージョン指定だとかなんとかとよくわからないことをのたまう。RubyGemsの中で文句を言うのでこのクソgem野郎がとか思ってその場所を見にいってみるが特に変なことはないようだ。つか.NETではちゃんと動いてるしそりゃそうか。

ちゃんと見てみるにバージョン指定を解析する正規表現にひっかからないのが問題だったようだ。

/\A\s*(=|<|>|!=|<=|>=|~=)?\s*([0-9]+(\.[0-9a-zA-Z]+)*)\s*z/

こんな感じの正規表現だった。ぱっと見はよくわからんが、まあ’>= 0’にはマッチしそうというのはわかる。これがなんでmonoだと動かないの?

短くしていってみるとマッチがおかしい。/\A\s*(=|<|>|!=|<=|>=|~=)?\s*/ =~ '>= 0'のマッチした部分を見ると’>’ですって。ちょっと諦めるの早すぎじゃないですかね?もうちょっと長くマッチできるでしょう。

IronRubyのRuby→CLR正規表現の変換が何かやってるのかとも思ったが、CLRのRegexを直接使っても同じだった。monoの正規表現実装の問題かよー。

以前も調べたがmonoの正規表現は文字クラスの減算を実装してないせいもあって、IronRubyで使われる正規表現を動かせるレベルにないようだ。こまったなー。 試したのはOSXでmonoの2.10.6を使ってだけど、最新のソースを見ても最近正規表現周りに手が入った様子はないので変わらんだろう。

解決方法は二つ思い付く。

  1. monoの正規表現を直す。めんどい。
  2. 鬼車をCLRに移植してIronRubyからそれを使えるようにする。めんどい。

結論: めんどい。

どっちが楽かというと難しいが、2の方が楽かな。monoはiPhoneやAndroidで手一杯のようだから誰もハードに使ってない(と思われる)正規表現を直してくれと言っても直らないだろう。自分で直す手もあるが正規表現のエンジンとか書くの大変そう。

鬼車移植はJRubyでは既にJavaに移植したやつを使ってるらしいのでこれは説得力があるし、それをC#に再移植という手もある。問題は.NETの正規表現ってコンパイルして最適化とかしてくれるんだが自前で移植した鬼車ではそこまでできないだろうというところ。それはどのエンジン使うか選択できればそれでいいんじゃないかという気がする。

一番の問題はどっちにしても大変だし問題あるよと言っても勝手に直ったりしないだろうということだ。しかし俺も忙しくて手を出してる暇がないしなぁ。誰かやってくれー。


2011-11-30

日記

日記書くことないなぁ。

平日は帰ってきて寝て起きて仕事行く以外ほんと何もやってないし。 土日は寝て起きて本読んで寝て起きて本読んでおわり。

[Ruby] endlessでRuby

とてもどうでもいいが、Rubyってend無しでも書けんじゃねと思ってちょっと試してみたら例外処理以外はけっこうなんとかなりそうだったが色々とめんどいところが出てきて不便だった。

まあなんでそんな話を思い付いたのかってif修飾子は()で括った複文にも適用できる、というか()の中に当然のように複文が書けるのに気付いたからだった。

1(
2  foo
3  bar
4) if baz

みたいな。書いてみると今まで出来ないと思ってたのが不思議なくらい普通だな。

これだったら||=の右辺にも複文を素直に書けんじゃねーか。今まで気付かずにbegin~endでやってたからちょっとすごい見た目になってたんだよねぇ。

1def hoge
2  @hoge ||= begin
3    foo
4    bar
5  end
6end

こんなんだったのが、

1def hoge
2  @hoge ||= (
3    foo
4    bar
5  )
6end

こんな感じに。あらちょっとわかりやすい。||= beginという一瞬何事かと思うコードも好きですけどね。

そんな感じで()と修飾子のifやらなんやらを組み合わせて、さらにブロックは{}を使うよう徹底したらend無しでもいけんでねという気がした。が、例外処理が無理っぽい気がする。rescue修飾子だと意味違っちゃうし、def~endも使わずdefine_methodで代用するので普通のrescueができねえわー。

あとelsecaseも使えなくて悲しい。if~else?:使えばいけるけど、elsifが無理なんで多段は厳しい。

あ、うそうそ。if修飾子は条件が不成立だったらnil返すのか。||でつないでやればelse相当になるじゃん。うわでも条件成立して実行した結果がnilとかfalseだったら駄目か。いまいちだな。

まあ出来たから何ってわけでもないんですけどね。

 1FizzBuzz = Module.new {
 2  define_singleton_method(:fizzbuzz) {|num|
 3    ('fizzbuzz' if num%15==0) ||
 4    ('fizz'     if num%3==0) ||
 5    ('buzz'     if num%5==0) ||
 6    (num)
 7  }
 8}
 9
10(1..30).each {|i|
11  puts FizzBuzz.fizzbuzz(i)
12}

FizzBuzz書いてみたらこんなんなった。なんかちょっとJavaScriptっぽくなっちゃった。きもい。

結論: endは必要

PeerCastStation日記

半月以上放置してしまったが、やっとちょっといじることができた。

HTTPインターフェースのためにASP.NETをホスティングしようとして上手くいってなかった続き。Not Found的なメッセージが出力されるので渡すパスが間違ってんだろうと調べてたら、SimpleWorkerRequestに渡すパスはアプリがマウントされてる仮想パスからの相対パスが正しいようだ。絶対パス渡してたわ。頭の/を抜いてあげたらちょっと動くようになったっぽい。返ってくる値が空文字列ですが。

サンプルを見たらSimpleWorkerRequestに渡してるStreamWriterをちゃんと閉じてるな。MemoryStreamをラップしたやつだから大丈夫だと思ってたがStreamWriter自身でもバッファリングされてんのか。StreamWriterを閉じてからMemoryStreamの中身を取得したらちゃんとページの内容がとれた。やったー。

しかしここからがちょっと大変。ASP.NETのアプリはたとえばpublic_html/binの中にdllとして置かれるんだが、ホスティング元の親アプリのアセンブリとか自動的参照してくれるわけではないので、明示的に参照するとpublic_html/binの中に親アプリのアセンブリもコピられちゃう。コピんなよと消すと当然ながらアセンブリが読み込めねーと文句行ってくるわけだ。AppDomainが別でアセンブリ読み込み基準パスはpublic_html/binの中になるのか。こまったね。

解決方法としては親アプリのアセンブリをGACに入れておけばいいんだけど、いちいちインストールしないといけなくてめんどいよねそれは。なんとかできないかなぁ。 ApplicationHost使わなければいいのかもしれないけど、それはそれでひどく大変そうなんだよなぁ。

あれ、Cassiniのソース見てたらなんか裏技っぽい方法で起動してるな。つかべつにApplicationHost使わなくても簡単そう。これちょっと参考にやってみるか。

他にはSimpleWorkerRequestはHTTPヘッダを一切返してくれないしリクエストヘッダも送れないのでそれもなんとかしないといけない。というかSimpleWorkerRequestはいじるの前提のクラスっぽい。これはそこまで大変じゃなさそうなので手をつけさえすればすぐできると思うけど。

そんなわけだがASP.NETのホスティングはなかなか大変そう……。俺がASP.NETのアプリを作る方法すら知らんというのも問題だわな。もうめんどくさいから自前でIronRubyをホストしてRackのアダプタ用意した方が早いんじゃね。Rubyならまだ慣れてるし。 でもIronRubyはmonoで動かした時がとても不安か。うーん。


2011-11-21

日記

ごろごろしてたら貴重な土日が終わってしまった!

いやなんかキャプボが届いたり本屋行ったりふとんほしたり洗濯したり買い物行ったりした気はするんだけど作業らしい作業もなく本読んでごろごろしてるだけで二日終わってしまったような。土日だからなにかやらないとと気張ってしまうのが逆によくないような気がするな。気軽に作業できん。

経験上土日にまとめてやろうとするより平日こつこつ作業した方が捗るんだよなぁ。できるだけ早起きしよう。平日の残業少なめにして休日出勤したいくらいなんだが、ほんとにやったら怒られそうだな。

キャプボはIntensity Shuttleを買った。ほっとゆず・かりんもいっしょに大量に届いた。277円/本で近くのスーパーよりAmazonが安かったのでつい……。12本もあればひと冬もつかな?

Intensity ShuttleはUSB3.0で相性が厳しいという話だったのでちょっと不安だったが、拍子抜けするくらい何事もなく動いた。A75Mのチップセット内蔵USB3.0、のはず。買ってから1080p対応してねーことに気付いたんだが、ゲーム取り込む分には720pで問題ない。PC画面取り込みもできればやりたかったが、まあ720pで出力すれば……狭いか。そのかわり10bit入力ができるようだ。使わん……。PC画面取り込みもできたところでおそらくどうせ使わないからべつにいいか。


ページのトップへ | トップ | 追記 | kumaryu.net by kumaryu