ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

monorail-RC3 が mono1.2.4上で動いた

Sunday, 21 September 2008 07:52 by sabro

複数のエラーが複雑に絡み合って大変でしたが、とりあえずDBからデータをとってきて、それをページに表示するところまで来ました。まだ、画像が一部表示されなかったり、おかしな部分もありますが、まあなんとかなるかな。

とりあえず、ハマッタ部分を列挙しときます。

1.AspView上でのViewComponent
MonorailのViewEngineの一つ、AspViewを使っているのですが、このエンジン上でViewComponentを使う時は引き渡す値がNullだといけないようです。たまたまNullを渡してしまうロジックがあったので、空のオブジェクトをデフォルトで生成しておくよう修正しました。
2.MysqlDataReader.GetValueの仕様
MysqlDataReader.GetValueで、DBの値をオブジェクトとして取得したものを、リフレクションでオブジェクトのフィールドにセットしていたのですが、その際実行される暗黙的キャスト処理が、Windows上では動作するがMono上では動作せず「Unknown target conversion type」とエラーが出ていました。これはメチャクチャ嵌ったんですが、MysqlDataReaderのドキュメントを見ると、以下のような文が書いてありました。
For optimal performance, MySqlDataReader avoids creating unnecessary objects or making unnecessary copies of data. As a result, multiple calls to methods such as GetValue(Int32) return a reference to the same object. Use caution if you are modifying the underlying value of the objects returned by methods such as GetValue.
どうやら、DBから同じ値を取得した場合、2回目は前回取得した値の参照を返すようで、おそらくこれのせいでキャストが失敗したのではないかと考えています(あくまで予想です)。対策として、データを取得する際、明示的にGetStringやGetInt32などを使用することで回避できました。
3.Enumのフィールドにリフレクションで値セット時の挙動
前述のとおり、DBからとってきたデータは、リフレクションでオブジェクトのフィールドにマッピングしています。Enumフィールドに対してDBの数値型のカラムから取得した値をセットした場合、Windowsでは問題なくキャストしてくれるのですが、Monoではエラーになっていました。Enum.ToObjectを使用してリフレクションの前にEnumオブジェクトに変換しておくと、うまく動作しました。まあEnumに数値を割り当てる時は通常はキャストが必要なのでこれは仕方ないかもしれません。
4.フォルダ名の大文字、小文字
Windows上で正しく動作しているからフォルダ名の大文字、小文字は気にしてなかったのですが、Linuxでは当然これらを区別するので、プログラムから指定するパスと実際のディレクトリが正確に一致していないと、ファイルが見つからないことになります。javascriptが入っているフォルダが見つからないなーと思ったらこれが原因でした。
5.AspViewのディレクトリ区切り文字列
ViewEngineのAspViewがSubViewのあるディレクトリを探す際に、環境に合わせた区切り文字を取得できるPath.DirectorySeparatorCharを使わず、"\"をディレクトリ区切り文字列として使用していました。これでは当然Windowsでしか動きません( ̄□  ̄ || 作者のブログに慣れない英語でコメントしてみたのですが、Mono環境を持ってないのでテストできないそうです。逆によかったらパッチを送ってくれと頼まれたのですが、Sabroが使っているのはMonorail-RC3に会わせた少し古いバージョンでTrunkとはかなりクラス構成が変わっています。一応Trunkのものを持ってきて動かそうと試みてみたのですが、別のエラーが出て動作するところまでいきませんでした。そこで、申し訳ないですがパッチは送らずに、ローカルでソースを修正して使うことにしました。作者さんすいません m(_ _)m

やっぱ、まだMonoは色々問題あるなぁ。まあ半年の努力が無駄にならなくてよかったよかった(・∀・)

Tags:   , , ,
Categories:   .NET
Actions:   Permalink | Comments (52) | Comment RSSRSS comment feed

monorail on mono でハマりまくる ( ̄□  ̄ ||

Friday, 19 September 2008 15:45 by sabro

monorailで作ってるセカンドライフ向けのWebサービスだけど、当然WindowsServerなんか使うお金はないので、Linuxサーバのmono上で動作させる予定だったのです。

まあ、.NETは中間言語にコンパイルされるし、VisualStudioで開発したものも、どうせ動くっしょとタカをくくって今まで動作確認してませんでした。しかし、開発も終盤にさしかかったので、昨日ホイッとmono1.2.4上にデプロイしてみたら、なんとエラーでまくりでした ( ̄□  ̄ ||

まず、変数をキャストする際に、Unknown target conversion type というエラーが出てたのですが、これはMySQLのドライバ(connector/NET)が新しすぎたことが原因だったみたいでした。5.1系だったのを、1.0系にしてやれば、それは直りました。(追記:これは勘違いだったみたいで、MySqlDataReader.GetValueを使用していたのがダメだったようです。型を判別してGetStringとかを使えば直りました。ドライバも5.1系でOKでした

次は、CreateSemaphore という処理で謎のエラーが・・・。これは、Bug #33682を見ると、なんとコネクションプーリング用のセマフォを取得するのに、Win32APIを直接叩いているとのこと。なんだその作りは orz
パッチがあるようですが、とりあえずPoolingをオフにして先に進むことにしました。

そして、ようやくMySQLドライバがらみのエラーは消えたようですが、今度はエラーになってもスタックトレースが表示されず、ApacheのInternal Server Errorの画面しか返ってこなくなりました。とりあえず疲れたので続きは明日。

これで動かなかったら、これまで半年開発してきた努力が全て無駄になってしまうのだが・・・大丈夫なのか (-_ - ||

Tags:   , ,
Categories:   .NET
Actions:   Permalink | Comments (48) | Comment RSSRSS comment feed