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

PowerShellでWeb上のZipファイルをダウンロードして解凍する

Monday, 22 June 2009 09:45 by sabro

ちょっと、とあるWebサーバ上にあるZipファイルを定期的にダウンロードして解凍する必要が出てきたんで、適当な言語でスクリプト作ることにしました。ただ、要件としてWindows上で動作する必要があって、せっかくなんで、前から気になってたPowerShellでやってみることにしました。

# Zipファイル操作用のライブラリをロード
[System.Reflection.Assembly]::LoadFile('C:\temp\ICSharpCode.SharpZipLib.dll')

# WebClientクラスのインスタンスを作成
$wc = New-Object System.Net.WebClient

# Zipファイルをダウンロード
$wc.DownloadFile("http://www.hoge.com/fuga.zip","C:\temp\temp.zip") 

# Zipファイルを解凍
$zip = New-Object ICSharpCode.SharpZipLib.Zip.FastZip
$zip.ExtractZip("C:\temp\temp.zip", "C:\temp\" + [DateTime]::Now.ToString("yyyyMMdd"), "")



Zipファイルを解凍する方法は、COMを通してエクスプローラの機能を使うとか、コマンドラインで解凍ソフトを呼び出すとか色々あるみたいだけど、今回は、ICSharpCode.SharpZipLib.dllを使ってみました。PowerShell上で、外部アセンブリのクラスを使用したい場合は、リフレクションを使ってアセンブリをロードしておく必要があるみたいなので最初にロードしてます。[System.Reflection.Assembly]::LoadFileみたいな呼び方してるけど、静的なメンバを呼び出す時はこうしないといけないらしいです。

次にWebClientのインスタンス化、New-Objectコマンドでインスタンス作成です。そのインスタンスのDownloadFileメソッドを使用して、ファイルを同期的に取得しています。

最後に、ICSharpCode.SharpZipLib.dllのFastZipクラスを使用して解凍。解凍したファイルは、日付ごとのフォルダに格納してます。

とまあ、こんな感じで結構簡単にできました( ̄∇ ̄)でも、いざ実行してみるとエラーが・・・( ̄□  ̄ ||  どうやら、PowerShellではデフォルトの実行ポリシーが「Restricted」になっていて全てのスクリプトの実行が禁止されているとのこと。実行ポリシーは他に「AllSigned、RemoteSigned、Unrestricted」があるそうですが、今回はインターネット上のスクリプトのみ署名を求める「RemoteSigned」にポリシー変更してみました。

Set-ExecutionPolicy RemoteSigned


これをPowerShellのプロンプト上で実行してやれば動くようになりました(^^)

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

メタバース連動サービス、クリエモンを正式リリースしました

Saturday, 9 May 2009 21:28 by sabro

以前の記事で紹介したクリエモンを正式リリースしました。
クリエモン

クリエモンは、セカンドライフアバターの表情をWebに投稿、共有できる新感覚サービスです。アップロードされたパーツを組み合わせて表情を作成し、セカンドライフのアバターに適用できます。
クリエモンについて

もうすでにいろいろな表情がアップロードされていますよ。
表情パーツ

正式版での一番の変更点は、クリエモン対応アバター開発キットの提供です。
クリエモンアバター開発キット

これは、クリエモンの表情カスタマイズ機能をもったオリジナルアバターを開発するためのキットです。これでセカンドライフのアバターCGMが盛り上がる可能性がありますね。
きぐるみちゃん

クリエモンは、ちょっとWebサービスを組み合わせてみた程度のサービスではなく、全く新しいコンセプトのサービスとして、1年掛けてじっくり開発してきました。セカンドライフは、今明らかに下り坂であり、撤退企業もあいついでいる中で、あきらめかけたこともあったのですが、なんとか公開まで持って行けました。自分はそろそろWebだけで完結するサービスは衰退期に入っており、ちょっとの期間流行するようなものは出せても、個人ではメインストリームとなるようなものは作れなくなったのではと考えています。そんな環境の中で、メタバース連動サービスは、新規性があり、個人でもアイデア次第で大企業を凌駕できる可能性を秘めているのではないでしょうか。

Tags:  
Categories:   Second Life
Actions:   Permalink | Comments (0) | 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 (0) | Comment RSSRSS comment feed

RSSの登録更新をお願いします

Sunday, 26 April 2009 05:19 by sabro

なんとか、BlogEngine.NETへの移行が終わりそうです。

トップページのURLは変わりませんが、RSSのURLが変わります。

今日の23:00くらいに、エイやッと入れ替える予定なので、RSSの更新をお願いしまーす。

Tags:  
Categories:   その他
Actions:   Permalink | Comments (0) | Comment RSSRSS comment feed

BlogEngine.NET on Monoハマり中( ̄□  ̄||

Tuesday, 14 April 2009 14:56 by sabro

BlogEngine.NETをMonoで動かすのは、やはりムズイです。環境は故合って、Mono 1.2.4 & BlogEngine.NET 1.4.5 でやってますが、うまく動いてくれません( ̄□  ̄||

BlogEngine.NET Modifications for Mono/Linuxを参考に、以下やったこと、binのリネーム以外は全てWeb.Configの修正です。

System.Managementの読み込みを削除
Mono 1.2.4では使えないNamespaceのようで、かつDBを使用せずXMLでやれば不要そうだったので削除。
Description属性を4つ削除
Web.Configのprovider定義タグではdescription属性が使えないらしいので削除。
DBBlogProviderタグ削除
SqlMembershipProvider削除
DbMembershipProvider削除
SqlRoleProvider削除
DbRoleProvider削除
XMLでやれば不要そうで、かつ動作不良の原因ぽかったので削除。
Compression HttpModuleを削除
ページに「?」が表示されるらしいので削除。
Binディレクトリをbinにリネーム
Linuxのファイル名が大文字、小文字を区別するので変更。
httpRuntimeを削除
クリエモンと同居させてるからか、Machine.Configで、httpRuntimeを読む時エラーになったのでWeb.Configのを削除したらなぜか直ったw。
StrageLocationを仮想パスでなく絶対パスで書く
Web.Configに「StorageLocation="~/App_Data/"」とあって、これを絶対パスで書かないとエラーになる部分があったので変更。しかし、絶対パスにしてもエラーになった・・・orz
最後のは、Mono1.2.4のHostingEnvironment.MapPathで、仮想パスをハジくチェックをしているのが原因だが、Mono 2.0のソースを見たらチェックしなくなっていたので、2.0以上でやらないと動かせないらしい。

 

public static string MapPath (string virtualPath)
{
if (virtualPath == null || virtualPath == "")
throw new ArgumentNullException ("virtualPath");

if (UrlUtils.IsRelativeUrl (virtualPath)) {
string msg = String.Format ("The relative virtual path '{0}', is not allowed here.", virtualPath);
throw new ArgumentException (msg);
}

HttpContext context = HttpContext.Current;
if (context == null)
return null;

return context.Request.MapPath (virtualPath);
}

というわけで、Mono 2.4も出てるらしいので、もうちょっとバージョンが上がったMonoVMで動かしてみようと思います。でも前、クリエモンを乗せたらうまく動かなかったんだよな~( ̄~ ̄)

あと、タイミングのいいことに、昨日、BlogEngine.NETが9ヶ月ぶりにバージョンアップして1.5になったそうなので、そっちも試してみようと思います。昨日、インストールがうまくいってたら、即、アップデートが必要だったと思えば失敗してよかったのかな(^^)

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

ブログエンジン移行計画中

Monday, 6 April 2009 16:57 by sabro

近々、ブログエンジンの移行を計画しています。

このブログは自宅サーバで運営してますが、CPUがPentium3というのもそろそろ限界かと思い始めて、先日NTT-X Storeで、HPのML115を買いました。年度末セールで、2台で21500円で買えて、ウホウホ言って喜んでたら、2日後に19500円になってました・・・orz

まあ、そんなわけでこの機会に、アプリも含めたサーバの再構築をしてみようと思ったわけです。最近は、Linux Monoでクリエモンとか動かしてるし、Monoで動くいいブログエンジンないかなーと探してたら、めっさいいのがありました。

BlogEngine.NET

BlogEngine.NETは、.netのブログエンジンを代表するようなプロダクトですが、Mono対応が売りのひとつになっています。いや素晴らしい(^^)

とりあえず、これでいってみようと思います。

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

FlexのHTTPアクセスで「#2032: ストリームエラー」が出てハマる

Tuesday, 27 January 2009 16:48 by sabro

クリエモンでは、FlexのHTTPServiceタグを使って、FlashからHTTP通信してたんだけど、なんかIE6でうまく動いてないことに気づいた。以下のようなエラーが出る。

[RPC Fault faultString="HTTP request error" faultCode="Server.Error.Request" faultDetail="Error: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2032: ストリームエラー。 URL: http://www.creamon.net/hoge/fuga"]. URL: /hoge/fuga"] 
at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler() 
at mx.rpc::Responder/fault() 
at mx.rpc::AsyncRequest/fault() 
at private::DirectHTTPMessageResponder/errorHandler() 
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction() 
at flash.events::EventDispatcher/dispatchEvent() 
at flash.net::URLLoader/flash.net:URLLoader::redirectEvent() 
at [io]

ちょっと調べてみたところ、Error #2032: Stream Error.っていうエントリにかなり詳しく書いてあったんだけど、エントリの内容全て試しても直らなかった。

で、色々あーだこーだやった結果、悪かったのは、mod_deflateの圧縮通信だったと判明。エントリのコメントを後から検索してみたら、そのことも書いてあった・・・orz とりあえず、Flashが通信するURLだけgzipかけないようにして対応しといた。

Tags:   , ,
Categories:   Flash
Actions:   Permalink | Comments (0) | Comment RSSRSS comment feed

セカンドライフ連動Webサービス「クリエモン」の先行テスト版リリースしました

Thursday, 11 December 2008 15:50 by sabro

3月くらいからコツコツと、.NETで開発してきたセカンドライフ連動型Webサービス「クリエモン」の先行テスト版をリリースしました。

クリエモンは、セカンドライフで配布しているアバターの表情を、Webサイト上でCGMする、そこそこ画期的なサービスです。ユーザが日々アップロードする「目、鼻、口、その他装飾」のパーツを組み合わせて表情を作り、それをセカンドライフからロードして使います。

クリエモン
http://www.creamon.net/

[トップページ]

[マイページ]

アバターはちょっとしたハックで日本人向けのアニメ調に仕上げました。パッと見、セカンドライフに見えないのではないでしょうか。右上のパーツに表情がロードされてるのも確認できると思います。

[セカンドライフ]

アバター配布場所
nippori(164/164/21)

将来的に有料オプションはつけるかもですが、ずっと無料でも使えます。まずは、気軽に試してみてください。

Tags:   , ,
Categories:   Second Life
Actions:   Permalink | Comments (0) | 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 (0) | 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 (0) | Comment RSSRSS comment feed