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

BlogEngine.NET-1.6への移行手順

Friday, 19 March 2010 16:52 by sabro

BlogEngine.NETを、バージョン1.5から1.6へアップデートしました。さぶろーは、Mono On Linuxで動かしているので若干特殊ですが、移行手順を書いときます。

  1. App_Dataディレクトリをバックアップ
  2. App_Code内の、ExtensionManagerディレクトリを削除(今回から、BlogEngine.Coreへ移動したため不要になったそうです)
  3. 1.6の全ファイルを、1.5へ上書き
  4. App_Dataを1.5のバックアップで上書き
  5. App_Data/settings.xmlに設定項目が追加されたので、1.5で使っていたのものに以下の項目を追加
      <commentsperpage>20</commentsperpage>   <moderationtype>1</moderationtype>   <numberofreferrerdays>1</numberofreferrerdays>   <commentblacklistcount>2</commentblacklistcount>   <commentwhitelistcount>1</commentwhitelistcount>   <enableerrorlogging>False</enableerrorlogging>   <trustauthenticatedusers>True</trustauthenticatedusers>
  6. Web.Configで、System.Managementアセンブリを読み込んでいる部分をコメントアウト(Linuxのみ)
  7. Web.Configを、web.configへリネーム(Linuxのみ)
  8. BlogEngine.Web/admin/Comments/default.aspxを、Default.aspxへリネーム(Linuxのみ)

Linuxなんで、ファイルの大文字、小文字を気をつけないとアクセスできないんですね、う~ん微妙( ̄∇  ̄ )

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

開発環境をMonoDevelopへ移行しました

Sunday, 14 February 2010 12:30 by sabro

長いことVisualStudio使ってましたが、じつは去年の終わりくらいにMonoDevelopへ移行しました。MonoDevelopは、去年末に出したバージョン2.2から、Windowsを本格的にサポートしたみたいで、若干おかしい動きもありますが、開発に重大な支障なく使えてます。

移行したメインの理由は、Viモードがあるからです。VisualStudioでも有料のVimプラグインや、VimエディタからVisualStudioを操作するようなツールはあるんですが、MonoDevelopはIDEが最初からViのキー入力をサポートしており、メニューで設定をいじるだけでコードエディタでViキーバインドが使えるようになります。まだまだサポートしているキー自体は少ないですが、それでも作業効率が上がった気がします。もちろん、インテリセンスもちゃんと使えますよ( ̄∇  ̄ )

さて、お目当てはViモードだったんですが、他にもいくつか良い点がありました。

1つ目は、C#の最新の構文が使えるようになったことです。じつは、さぶろーは、VisualStudio2005を使っていました。、MonoRailが正式にVS2008をサポートしてないという話だったからです。たぶん2008でも開発は出来るだろうと思うんですけど、大事をとって2005にしていたのでした。2005は、C#2.0までしかサポートしないんで、ラムダ式、LINQ、型推論、拡張メソッドなどの便利な機能が使えません>< MonoDevelop2.2は、C#3.0をサポートしているほか、一部C#4.0をサポートしているそうです ←(これはMonoの話でMonoDevelopは関係なかったかも)。今ではラムダ式使いまくりです(^^)

2つ目は、フリーでありながらExpressEditionの制約がないことです。MonorailをVS2005 ExpressEditionで開発する方法まとめで書いたとおり、ExpressEditionではVSC#とVSWDを切り替えつつ開発していく必要があり、プロジェクト構成も汚くなりがち。MonoDevelopでは、VSのStandardEdition以上と同じく、1つのIDEでクラスライブラリも、ASP.NETプロジェクトも同一のソリューション上で開発できます。

3つ目は、Monoで動かない機能は、そもそも作れないようになっていることです。VisualStudioで作って、Linux上のMonoVMで動かそうとすると、Monoでは動作しないような場合があるんですが、MonoDevelopはMonoと足並みを揃えて開発されているので、そのようなことがありません。MonoVMで動かしたいという方は、検証が楽になると思います。

もちろん、良い点だけではなく、不満点もいくつかありました。

  • MonorailのViewEngineの1つ、AspView用のaspxファイルでで開けないものがある
  • デバッグ時に、変数の値がなかなか表示されないことがある

 

aspxが開けなかった問題は少し面倒でしたが、別途テキストエディタで開いて編集しています。

最後に、移行時に行なった作業ですが、MonoDevelopはVisualStudioのプロジェクトをそのまま開くことが出来るので、基本的には作業不要でした。ただ、日本語は文字化けしたので、Shift-JISから、UTF-8への変換だけ行ないました。

さぶろーは、かなりMonoDevelop気に入ってしまいましたが、みなさんどう感じましたでしょうか。MonoVM上でプログラムを動かしたい方にはオススメです( ̄∇  ̄ )

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

Linux Monoで、BlogEngine.NETを動かす

Sunday, 26 April 2009 11:44 by sabro

なんとかこのブログも、PebbleからBlogEngine.NETへ移行できました。

もちろん、Linux Mono上で動いているのですが、その設定を書いてみます。バージョンは、Monoが1.9.1、BlogEngine.NETが1.5.0です。

ホントはもっとバージョンが新しいMonoを使おうかと思ってたのですが、実は、クリエモンが、Mono1.9.1以下のバージョンでしか動かなかったんです(_ _ || Mono2.4は、MonoRailの、URL Routingがうまく動きませんでした。どうやら、System.Web.HttpApplicationクラスで、web.configから設定を取得するコードが2.4から修正されて、Routingの設定が読めなかったみたいです。Mono2.2と2.0では、正規表現のオプションRegexOptions.ReferenceIgnoreCaseがサポートされてないようで、正規表現でURL Routingを割り当てる部分でエラーがでました。ブログをホストするマシンをクリエモンと別にするという手もあったんですが、ブログのためにマシンを追加するのも億劫だったので( ̄∇ ̄)

さあ、設定の手順ですが、実は結構簡単です。ここにたどり着くまでは、すごく大変だったんですけどね( ̄□  ̄||

1、ドキュメントルートに、BlogEngine.NETを設置
BlogEngine.NETを本家からダウンロード・解凍すると、「BlogEngine.Web」というディレクトリが出来るのでドキュメントルートにコピーします。
2、Web.Configの修正
まず、Web.Configを小文字のweb.configに修正します。これをやっとかないと動かないページがありました。次に、web.configを開いて、System.Managementのアセンブリを読み込んでいる部分をコメントアウトします。これは、DBを使う場合で使用されるようなので、デフォルトのまま、データをXMLに保存する場合はコメントアウトしても問題ありません。たぶん・・・。
3、Tag Cloud Widgetの修正
Tag Cloudのコントロールが、そのままでは動かないので、「BlogEngine.Web/widgets/Tag cloud/edit.ascx」のReferenceディレクティブを修正します。
<%@ Reference VirtualPath="~/widgets/Tag cloud/widget.ascx" %>
↓
<%@ Reference Control="~/widgets/Tag cloud/widget.ascx" %>
たぶん、WindowsならVirtualPathで動くんでしょうねぇ。

これで一応動きますが、実はブログのインポートにハマりどころがありました( ̄□  ̄|| BlogEngine.NETのインポートは、インポートツールを使用して行うんですが、これがどうやらアプリ内部で設定しているURLが全て小文字になっていて、大文字小文字を区別するLinuxだと動かないようです。ちょっと調べてみるとCodePlexBlog Importerっていうプロジェクトがあって、これがBlogEngine.NETのインポートツールかなと思ったらビンゴだったので、ソースを見てみたのですが、あまりの酷さに愕然・・・。

  • URLが全て小文字で記述されていて、Linuxのサービスにアクセスできない
  • URLの最後に"/"をつける、CleanPath関数があるんだけど、それをインポートするRSSにも適用してる。だから、「http://○○/rss.xml/」みたいなURLにアクセスしにいく・・・orz
  • コンテンツのフィルタ部分にバグがある
ちょっと諦めて、RSSをRubyスクリプトでパースして、Firefoxを自動実行するiMacros用のマクロを生成、iMacrosを走らせて30分放置という荒技で対処しました( ̄∇ ̄)

まあ、こんなところです。コメントが移行できなかったのが少し残念ですがとりあえず、おkということで、やっとクリエモンの続きに入れるかな。

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

Mono2.0がリリース

Tuesday, 7 October 2008 16:16 by sabro

いつの間にか、Mono2.0がリリースしてました。Monoトップページも大幅リニューアルしてます。

今回のリリースの最大の売りは、やはりLINQやラムダ式などのC#3.0の機能がつかえることみたいです。他にもバグフィックスや、パフォーマンスアップなど目白押しのようです。今作ってるサービスを、Mono2.0向けに作り直したくなってきました(まあ、しませんが)。

より詳しい情報は、Mono 2.0 Release Notesをご覧ください。

ここからは、宣伝です。今作っているセカンドライフ向けサービスの完成がいよいよ近づいてきました。つきましては、10月18日から2週間開催されるLSL Convention 2008で、お試し版をリリースする予定です。興味のある方(いるのか?)は、ぜひご来場ください。

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

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

Enyim Memcached は Mono1.9.1上では使えない

Sunday, 25 May 2008 12:21 by sabro

ずっと、Windows環境で開発してるんだけど、本番ではLinux上のmod-mono-server上で稼働させる予定です。なので、1回は試しとかないとまずいよねということで、デプロイしてみたら、Enyim Memcachedがコケました orz

スタックトレースは以下↓

System.TypeInitializationException: An exception was thrown by the type initializer for CreamonModel.Utility.MemCachedUtil ---> System.TypeInitializationException: An exception was thrown by the type initializer for Enyim.Caching.Memcached.ServerPool ---> System.NotImplementedException: The requested feature is not implemented.
at System.Configuration.ConfigurationElement.get_EvaluationContext () [0x00000]
at Enyim.Caching.Configuration.MemcachedClientSection.PostDeserialize () [0x00000]
at System.Configuration.ConfigurationElement.DeserializeElement (System.Xml.XmlReader reader, Boolean serializeCollectionKey) [0x00000]
at System.Configuration.ConfigurationSection.DeserializeSection (System.Xml.XmlReader reader) [0x00000]
at System.Configuration.Configuration.GetSectionInstance (System.Configuration.SectionInfo config, Boolean createDefaultInstance) [0x00000]
at System.Configuration.Configuration.GetSectionInstance (System.Configuration.SectionInfo config, Boolean createDefaultInstance) [0x00000]
at System.Configuration.Configuration.GetSectionInstance (System.Configuration.SectionInfo config, Boolean createDefaultInstance) [0x00000]
at System.Configuration.ConfigurationSectionCollection.get_Item (System.String name) [0x00000]
at System.Configuration.Configuration.GetSection (System.String path) [0x00000]
at System.Web.Configuration.WebConfigurationManager.GetSection (System.String sectionName, System.String path) [0x00000]
at System.Web.Configuration.WebConfigurationManager.GetSection (System.String sectionName) [0x00000]
at System.Web.Configuration.HttpConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000]
at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000]
at Enyim.Caching.Memcached.ServerPool..cctor () [0x00000] --- End of inner exception stack trace ---

 

2行目を見ると、System.Configuration.ConfigurationElementクラスの、EvaluationContextプロパティをGetするところで落ちてるみたいなので、 最新の、Mono1.9.1のソースで該当箇所を確認すると・・・。

  [MonoTODO]
protected ContextInformation EvaluationContext {
get {
throw new NotImplementedException ();
}
}

 


ちょっ Σ( ̄□  ̄||

なんか例外投げてました orz う~ん、Enyim Memcachedは、.NETのMemcachedClientで唯一ジェネリック対応メソッドがあって使いやすいのになぁ。 別のライブラリを使うか、Monoがちゃんと実装されるのを待つか。うーん困った。

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