ヒマをみつけて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

MonoRailのインテグレーション層はActiveRecordで

Saturday, 5 April 2008 02:33 by sabro

MonoRailは、あくまでMVCのVとCを受け持つフレームワークなので、DB周りの処理には別のライブラリを使う必要があります。で、それには普通ActiveRecordを使用します。

実は、MonoRailは、CastleプロジェクトというエンタープライズなWebライブラリ群の一つとして開発されています。ActiveRecordも、このCastleプロジェクトの一プロジェクトとして開発されており、MonoRailとの親和性はとても高くなっています。RailsでいうところのScaffoldも出来るとか。

ただ、やっぱりクラスは定義する必要があったり、主キーは属性ベースで設定したりと、Rubyとは結構違う部分もあるみたいです。

それにしても、プロジェクト名はRubyのと全く同じだけどいいのかと思ってしまう。Rubyの人は怒らないのかな。単にマイナーすぎて相手にされてないだけか・・・。

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

MonoRailのViewEngine

Sunday, 30 March 2008 11:18 by sabro

Sabroは、MonoRailのViewEngineに、AspViewを使用していますが、実際には様々なタイプのViewEngineがあり、用途に合わせて使い分けることができます。

以下の表は、MonoRailのサイトからコピーしたものですが、それぞれのエンジンの特徴が簡単に比較できます。

Engine Language Compiled Helpers ViewComponents
WebForms Any .net language Yes Yes No
NVelocity Velocity No Yes Yes
Brail boo Yes Yes Yes
AspView
(from Contrib)
C# Yes Yes Yes
StringTemplate (from Contrib) String Template No Partially Yes

機能的には、NVelocityが使いやすそうだったのですが、これはインタプリタ型だったので、パフォーマンスが気になりました。そこで、コンパイル型のなかで比較をしたのですが、WebFormはMVCでないのでスルー、Brailは独自言語でViewを作成するのが、ちょっと気になったのでスルーして、AspViewに落ち着いたという感じです。

まあでもAspViewも、よく分かっているわけではないので、Viewについては、もうちょっと使用感を見てから正式に決めようかと考えています。

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

ASP.NET MVCフレームワークとかあったなぁ

Saturday, 29 March 2008 13:43 by sabro
そういえばMonoRailじゃなくても、.NETのMVCありましたね (^ ^) ← 忘れていた人
ASP.NET MVC Framework

まだPreview版なので、MonoRailでやりますが。
Tags:   ,
Categories:   .NET
Actions:   Permalink | Comments (40) | Comment RSSRSS comment feed

MonorailをVS2005 ExpressEditionで開発する方法まとめ

Wednesday, 26 March 2008 16:03 by sabro

VS StandardEdition以上だと、MonoRailのインストーラで、MonoRail Projectというプロジェクトテンプレートが作られて、かなり簡単に開発を進めれるのですが、ExpressEditionの場合は、開発を始めるまでも一苦労です。以下にその手順を紹介します。

1. VC# ExpressEditionでクラスライブラリ作成

VC#2005 ExpressEditionで、好きなフォルダにクラスライブラリプロジェクトを作成します。このフォルダは後に、WebのDocumentRootになるので注意。ちなみにMonoRailは、VS2008に公式には対応していないそうです。

2. 参照設定追加

以下のライブラリを参照設定に追加します

  • System.Web
  • Castle.MonoRail.Framework
  • Castle.MonoRail.Views.AspView
System.Webは最初から.NETにあります。Castle.MonoRail.Frameworkは、MonoRailのコアとなるライブラリで、MonoRailのプロジェクトページからダウンロードできます。最後のCastle.MonoRail.Views.AspViewですが、これは少し特殊で、AspViewというViewEngineを使用する場合のみ必要になります。ダウンロードも別途AspViewのサイトから行います。

3. コントローラクラスの作成

MonoRailはMVCなフレームワークです。そこで、コントローラクラスも必要になってきます。まずは、クラスライブラリプロジェクトに、「Controllers」という名前のフォルダを追加し、その中に、SmartDispatcherControllerを継承したクラスを作成します。クラスを作成したら、その中に適当な名前の関数を定義しておきましょう。この関数名はURLの一部になります。

4. ビルド出力パスの変更

次にプロジェクトのプロパティから、ビルドの出力パスを「bin\Release\ → bin\」と変更します。いらなくなったDebug、Releaseフォルダはエクスプローラから削除しておきましょう。

5. VisualWebDeveloperでWebサイト作成

VisualWebDeveloperを起動し、メニューの新規プロジェクトで、ASP.NET Webサイトを作成します。このとき、場所はファイルシステムの先ほど作成したプロジェクトのフォルダを指定します。(ソリューションフォルダ、プロジェクトフォルダなどあって分かりにくいですが、binを直接含んでいるフォルダです)。すると、Webサイトは既に存在します、というダイアログが表示されるので、「既存の場所に新しいWebサイトを作成するを選んでOKを押します。プロジェクトが作られたら、DeveloperWebサーバの仮想パスを「/」にしておきます。

6. web.configの編集

web.configをプロジェクトに追加後、内容を全て消して、Minimal Web.Config for MonoRail with AspViewにあるAspView用のweb.config最小設定を貼り付ける。さらに、以下の内容を自分のプロジェクト用に編集する。

  • aspviewタグ → referenceタグ → assembly属性を自分のプロジェクトの名前に
  • monoRailタグ → controllersタグ → assemblyタグの内容を自分のプロジェクトの名前に

7. ビューの作成

VisualWebDeveloperのプロジェクト直下にViewsという名前のフォルダを作成。さらにその下に、コントローラ名のフォルダを作り、コントローラクラスに定義されているメソッド名と同じ名前のViewを作成します。


Controllerクラス名 HomeController
Controllerクラスのメソッド名 Index
作成するView Views\Home\Index.aspx


作成したViewの先頭には、次のディレクティブを書いておきます。ブラウザが真っ白なのもアレなので、動作確認用に何か文字列も書いておきましょう。
<%@ Page Language="C#" Inherits="Castle.MonoRail.Views.AspView.ViewAtDesignTime" %>

8. 動作確認

まずは、Webプロジェクトのプロパティから、開始オプション → ページを指定するで作成したページを指定します(上記の例なら、/Home/Index.mvc)。指定後はデバッグを開始してみます。ビルドエラーが発生しますが、気にせず最後に成功したビルドで実行します。初回起動時は、デバッグ用にweb.configの書き換えダイアログが表示されるのでOKを押します。手順があっていれば、HTMLが正しく表示されるはずです。

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

MonoRailをやってみる

Sunday, 23 March 2008 05:31 by sabro

SecondLife向けサービスの案が浮かんだので、ちょっと久々にWeb開発やることにします。

何の言語で作るか、かなり迷ったのですが、libsecondlifeという.NETで作られたSecondLife向けライブラリと連携できるようにしておいた方が、将来的に便利そうなので、.NETでMonoRailを使って開発することにしました。.NETでWeb開発というと、ASP.NETが主流(というかこれ以外は普通使わない)なのですが、これだと余分なJavascriptコードが入ったり、HTMLが汚くなりがちなので、あえてMonoRailでやります。

早速、検索をかけてみたのですが、日本語情報は壊滅状態でした ( ̄□  ̄ ||)
まあ、ゆっくりと調べながらやっていこうと思います。

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