<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>M-Tea</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/" />
    <link rel="self" type="application/atom+xml" href="http://www.m-tea.info/atom.xml" />
    <id>tag:www.m-tea.info,2009-10-11://1</id>
    <updated>2010-03-16T13:49:51Z</updated>
    <subtitle>ミルクティの香りとともに、気長にコンピュータ技術を中心にいろいろな情報を発信するサイト</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.261</generator>

<entry>
    <title>Windows Azureアプリケーション開発入門 を購入してみて</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/03/windows-azure.html" />
    <id>tag:www.m-tea.info,2010://1.78</id>

    <published>2010-03-16T13:45:38Z</published>
    <updated>2010-03-16T13:49:51Z</updated>

    <summary>Windows Azureアプリケーション開発入門 を購入し、読んでみたので記録...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6345275%2f&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13533038%2f" target="_blank">Windows Azureアプリケーション開発入門</a> を購入し、読んでみたので記録としてのこしてみます。 </p>
<p>ちなみに、表紙はこんな感じです。 </p><a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6345275%2f&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13533038%2f" target="_blank"><img border="0" src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8222%2f82229400.jpg%3f_ex%3d128x128&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8222%2f82229400.jpg%3f_ex%3d80x80" /></a> ]]>
        <![CDATA[<h2>購入理由</h2>
<p>
今までは、「Windows Azure入門」を利用してきました。
</p>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" border="0"></a>
<p>
このWindows Azure入門、非常にまとまった本であるが、ある１点だけ欠点がありました。
それは、ソースコードが旧SDK情報であるため、そのまま写経しても動かないということです。
</p>
<p>
このブログの最初のころは、この入門書片手に挑戦をしていました。おかげで色々調べるきっかけとなってよかったのですが、さすがに動かないコードは辛いということで、
新しい本を購入してみた。
</p>
<h2>内容</h2>
<p>
非常によくまとまっていて良いと思う。
特に、前半分と後半分で毛色が違っています。
</p>
<p>
目次を見ると
</p>
<ul>
<li>
Ｗｉｎｄｏｗｓ Ａｚｕｒｅの特徴
</li>
<li>
Ｗｉｎｄｏｗｓ Ａｚｕｒｅ
</li>
<li>
Ｗｉｎｄｏｗｓ Ａｚｕｒｅ ｐｌａｔｆｏｒｍ ＡｐｐＦａｂｒｉｃ
</li>
<li>
ＳＱＬ Ａｚｕｒｅ
</li>
</ul>
<p>
と概要部分を説明頂き、そのあと価格などについても言及されています。
</p>
<p>
（今後、価格改定等があれば旧い情報になってしまうかもしれませんが、
課金ポイント等を記載頂いているので、最初は凄く助かると思います。）
</p>
<p>
その後
</p>
<ul>
<li>
基本的な．ＮＥＴアプリケーション開発
</li>
<li>
ＰＨＰによるＦａｓｔ ＣＧＩアプリケーション開発
</li>
<li>
ストレージサービスを用いた実用的なＷｉｎｄｏｗｓ Ａｚｕｒｅサービスの開発
</li>
</ul>
<p>
とあり、具体的な開発について記載があります。ASP.NETだけではなく、PHPなどの
環境についても言及があること。また、ストレージを別建てにしてある点は良いと思います。
</p>
<p>
さらに
</p>
<ul>
<li>
 より実践的なＷｉｎｄｏｗｓ Ａｚｕｒｅ ｐｌａｔｆｏｒｍの利用法 
</li>
</ul>
<p>
と既存のASP.NETのポーティングなどについても記載があり、凄く興味深い本です。
</p>
<p>
開発者で、Azure 上でプログラムをとりあえず書いてみたいという方にはお勧めだと思います。
</p>
<h2>Windows Azure入門との比較</h2>
<p>
では、Windows Azure入門が不要かというと、そうではないとおもいます。
</p>
<p>
Windows Azure入門の前半部分の Azure プラットフォームの基本スタンスなどの解説は今後アプリケーションを
展開していく上で理解していないといけないポイントかと思います。
</p>
<p>
また、サンプルプログラムが古いとはいえ、一つのアプリケーションを ASP.NET / ストレージ / Worker 全てを
まんべんなく会得する例としては非常に良いと思います。
</p>
<p>
また、ある程度のエンジニアであるならば、Windows Azure入門の旧いコードを自力で現在のSDK用に直し移植する
というのは、理解度を向上させると思います。
</p>
<h2>感想</h2>
<p>
最後に
</p>
<ul>
<li>
Windows Azureアプリケーション開発入門 は良いです。
</li>
<li>
余力があるなら、Windows Azure入門の前半は読んでみてもいいかもしれません。
</li>
<li>
スパルタ的に理解するのであれば、Windows Azure入門を最新のSDK向けに独学で移植するのも、より実践的です。
</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>TDD Boot Camp北陸に参加してきて</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/03/tdd-boot-camp.html" />
    <id>tag:www.m-tea.info,2010://1.77</id>

    <published>2010-03-14T03:36:27Z</published>
    <updated>2010-03-14T03:39:11Z</updated>

    <summary>TDD Bootcamp の体験談を聞いていたら、是非参加してみたいとおもってい...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://kokucheese.com/event/index/750/">TDD Bootcamp</a> の体験談を聞いていたら、是非参加してみたいとおもっていました。 </p>
<p>そうすると、 <a href="http://kokucheese.com/event/index/1307/">TDD Boot Camp 北陸</a> なるものが開催されるということで、参加してきました。 </p>
<p>北陸エンジニアグループ,katzchangさん、t_wadaさん、その他参加者の皆さんありがとうございました。 </p>]]>
        <![CDATA[
<h2>TDD BootCampに参加して</h2>
<h3>TDDと自分</h3>
<p>
じつは、TestUnitがある！ということ、TDDという言葉がある事は知っていましたが、
実際にTDDを実体験するのは初めてでした。
</p>
<p>
そんな自分が、今回TDD Boot Camp 北陸に参加して、疑問に思う事を沢山質問してきました。
</p>
<p>
その一部を記録として残しておきたいと思います。
</p>
<h3>TDDで生じた疑問とその議論結果</h3>
<p>
講演、実際のペアプロを2回で疑問に思った事とその議論結果についてまとめておきます。
</p>
<p>
t_wadaさんを含め、議論に参加頂いた方に感謝します。
</p>
<h2>黄金の回転について</h2>
<h3>教えていだたいた事</h3>
<p>
TDDについて以下のような手順を頂きました。
</p>
<ul>
<li>
テストを書き Red を確認
</li>
<li>
テストを通す、明確な実装を書きGreenを確認
</li>
<li>
リファクタリング
</li>
<li>
テストを通し、Greenを確認
</li>
</ul>
<p>
最初に戻る。
</p>
<p>
この点は凄く理解できたのですが、その実現過程で疑問が生じました。
</p>
<h3>例</h3>
<p>
まず最初にテストを書く
</p>
<pre class="prettyprint">
	void test_三の倍数だとFuzzが返却される(){
		assert( &quot;Fuzz&quot; , fuzzbuzz( 3 ) );
	}
 
 
</pre>
<p>
最初に assert( &quot;Fuzz&quot; を先に書く、 fuzzbuzzのI/F等は後から考えるという主張を面白く考えました。
</p>
<p>
このテストを通し「Red」を確認して
</p>
<p>
そのあとに、明白な実装を書く
</p>
<pre class="prettyprint">
	string fuzzbuzz(int n){
		return &quot;Fuzz&quot;;
	}
 
 
</pre>
<p>
このテストを通し「Green」を確認。
</p>
<p>
この手順で書いていくという流れを教えていただきました。
(これで、テストのテストも行えると)
</p>
<p>
これで、１黄金回転が終わったので、次の回転ということで
</p>
<pre class="prettyprint">
	void test_三の倍数だとFuzzが返却される(){
		assert( &quot;Fuzz&quot; , fuzzbuzz( 3 ) );
	}
	void test_1だとFuzzが1される(){
		assert( &quot;1&quot; , fuzzbuzz( 1 ) );
	}
 
 
</pre>
<p>
のテストを書き、Redを確認、その後自明な実装をしてしまう
</p>
<pre class="prettyprint">
	string fuzzbuzz(int n){
		if ( n % 3 == 0 )return &quot;Fuzz&quot;;
		//API名失念ですが、整数を文字列に変換する標準のクラスライブラリ
		return String.ToString(n);	
	}
 
 
</pre>
<p>
このような実装を行い、&quot;green&quot;確認。
</p>
<h3>発生した疑問!!</h3>
<p>
開発者の視点からすると、
</p>
<pre class="prettyprint">
	void test_三の倍数だとFuzzが返却される(){
		assert( &quot;Fuzz&quot; , fuzzbuzz( 3 ) );
		assert( &quot;Fuzz&quot; , fuzzbuzz( 6 ) );
		assert( &quot;Fuzz&quot; , fuzzbuzz( 9 ) );
	}
 
 
</pre>
<p>
のようなテストコードを書きたくなるなと思う。
</p>
<p>
しかし、既に
</p>
<pre class="prettyprint">
	void test_三の倍数だとFuzzが返却される(){
		assert( &quot;Fuzz&quot; , fuzzbuzz( 3 ) );
	}
	void test_1だとFuzzが1される(){
		assert( &quot;1&quot; , fuzzbuzz( 1 ) );
	}
 
 
</pre>
<p>
と
</p>
<pre class="prettyprint">
	string fuzzbuzz(int n){
		if ( n % 3 == 0 )return &quot;Fuzz&quot;;
		//API名失念ですが、整数を文字列に変換する標準のクラスライブラリ
		return String.ToString(n);	
	}
 
 
</pre>
<p>
で、Greenになっている。
この状況で、他の3の倍数を追加しても、「Green」のままで、テストのテストである
Redが書けない事になるのではないか？
</p>
<p>
ということが疑問点です。
</p>
<h3>テストの順番</h3>
<p>
この場合、例が単純すぎるかもしれないけれども、
先に3の倍数の時に、テストが失敗する例をもう少し上げておき、
その後にその他のテストをした方が
良いのではないかという事を議論させていただきました。
</p>
<h2>動的言語とredになるテスト</h2>
<p>
私は、持参した環境にrubyしか入っていなかったので、ruby言語でTDD体験してきました。
(今思えば、ペアの方のPCを借りるとC#でも体験できたのではないかと思い、少し残念でした)
</p>
<h3>今回のお題</h3>
<p>
あるメッセージを検閲して、フィルタする WordFilterを作るというのがお題でした。
</p>
<p>
WordFilter に NG Word を登録しておき、メッセージをそのWordFilterにその語を検知(detect)して含まれている事を確認する。
またフィルターして &lt;censored&gt; に置換する物を作りましょう。というものでした。
</p>
<h3>発生した疑問</h3>
<p>
rubyで体験するということで、どうしても出てくるのが、動的言語という点です。
</p>
<p>
黄金の回転を回していくという事で以下のような手順を通すかと思います。
</p>
<p>
例えば、検知(detect)メソッドをTDDで実現していく際に
</p>
<pre class="prettyprint">
   def test_detect
      assert( wordfilter.detect(&quot;NGWord を含むメッセージ&quot;) )
   end
 
 
</pre>
<p>
というテストを書きます。このテストを赤くする方法として、
</p>
<pre class="prettyprint">
   class WordFilter
     def detect( message )
       nil
     end
   end
 
 
</pre>
<p>
という方法と
</p>
<pre class="prettyprint">
   class WordFilter
   end
 
 
</pre>
<p>
という方法があります。
</p>
<p>
前者は、nil が返却されるために red になります。
後者は、メソッドがないために、実行時エラーが発生して red になります。
</p>
<p>
コンパイラが介在する言語だと、コンパイルエラーに相当する部分がありますが、
それを動的言語では実行時エラーとして検出されることになります。
</p>
<p>
この実行時エラーをもって、テストが Red になったというのは、妥当なのか？
という疑問が出てきました。
</p>
<h3>議論結果</h3>
<ul>
<li>
動的言語では、実行時エラーも重要なので、この失敗をもって red とし、greenになる実装に移る
</li>
<li>
実行時エラーを検出して(red)、その後 nil を返す実装をして(red) その後、greenになる実装に移る
</li>
</ul>
<p>
この2つがあるが、後者ではく前者で十分ではないかという議論になりました。
</p>
<p>
議論をしていて思ったのが、後者のred -&gt; red -&gt; greenはより厳密だとおもうのですが、スピード感が失われるからかなと。
</p>
<h2>内部の実装が透けて見えてしまう!?</h2>
<p>
オブジェクト指向だと隠蔽化で処理が隠れる利点(場合によっては欠点?)があります。
</p>
<p>
また、t_wadaさんの講演で「テストは内部実装に依存するようなものを書かない」という
事もありました。
</p>
<p>
それを踏まえて、以下の疑問点と議論がでてきました。
</p>
<h3>仕様変更</h3>
<p>
先ほどの WordFilterに複数単語を登録して、検出、検閲出来るようにしてほしい。
また、後から単語登録が出来るようにしてほしい。
</p>
<p>
このような依頼がきました。
</p>
<h3>内部実装が透けて見えるテスト</h3>
<p>
複数単語が登録できるということで
</p>
<pre class="prettyprint">
   def test_add_words
      wordfilter = WordFilter.new(&quot;単語1&quot;,&quot;単語2&quot;)
      wordfilter.add(&quot;単語3&quot;,&quot;単語4&quot;)
      assert_equal( [&quot;単語1&quot;,&quot;単語2&quot;,&quot;単語3&quot;,&quot;単語4&quot;] , wordfilter.words )
   end
 
 
</pre>
<p>
このようなテストを書いてみました
</p>
<h3>疑問点１</h3>
<p>
この
</p>
<pre class="prettyprint">
  assert_equal( [&quot;単語1&quot;,&quot;単語2&quot;,&quot;単語3&quot;,&quot;単語4&quot;] , wordfilter.words )
 
 
</pre>
<p>
は、内部実装が 配列で実現している事を明確にしているのではないかということです。
確かに、WordFilter は 内部で配列を持ち単語群を管理する実装になっていますが、
たまたまなわけです。将来ハッシュで管理したくなるかもしれません。
(実際、単語の頻度を保持してほしいとか仕様変更がありましたし、それに伴い Hash化されるかもしれません)
</p>
<p>
この内部実装変更で、リストで管理しているという事、及び順番まで保証するようなテストは
いかがなものか？
</p>
<h3>議論結果</h3>
<p>
確かに、それは問題なので、可能ならこれを変えた方がいいという事で、以下のように変えました。
</p>
<pre class="prettyprint">
   def test_add_words
      wordfilter = WordFilter.new(&quot;単語1&quot;,&quot;単語2&quot;)
      wordfilter.add(&quot;単語3&quot;,&quot;単語4&quot;)
      assert( wordfilter.words.include?(&quot;単語1&quot;) )
      assert( wordfilter.words.include?(&quot;単語2&quot;) )
      assert( wordfilter.words.include?(&quot;単語3&quot;) )
      assert( wordfilter.words.include?(&quot;単語4&quot;) )
   end
 
 
</pre>
<h3>内部実装を知ったテスト</h3>
<p>
複数単語が含まれているか？をチェックする為に、実装として
単語集合から正規表現を構築してそれでマッチを行っていました。
</p>
<h3>追加したテストと疑問点</h3>
<p>
ただ、正規表現の文字列のエスケープ処理が必要になるのではなかということが
開発者視点で気になり以下のコードを追加しました。
</p>
<pre class="prettyprint">
   def test_detect_with_specialchar
      wordfilter = WordFilter.new(&quot;/&quot;)
      assert( wordfilter.detect(&quot;/&quot;) )
   end
 
 
</pre>
<p>
これは、内部が正規表現を使っている事を前提にテストをしているから、
いかがなものなのか？
</p>
<p>
これが疑問になりました。
</p>
<h3>議論の結果</h3>
<p>
これは、内部で正規表現を使っていても、使っていなくても通るベキコードなので
内部に依存したテストではないという事になりました。
</p>
<h3>事後の議論</h3>
<p>
帰りの車の中で、@fujiwoさんとお話していて、このパターンをテストケースに入れれるかどうか
というのは、悩ましいという話になりました。
</p>
<p>
デベロッパ視点だから、いれれるのでしょうけど、経験を持った人でないと入れれないよねという
話も出ました。
</p>
<h2>TDD BootCamp 北陸に参加して</h2>
<ul>
<li>
久々にコードを沢山書いて、設計議論が出来て面白かった
</li>
<li>
TDDは疲れる(だから悪いとか、良いとかいわない)
</li>
<li>
ペアプロは面白い
</li>
</ul>
<p>
凄く楽しかったです。
</p>
<p>
また、t_wada賞を頂きました。
個人的には「割と普通とは違う視点で議論してた」というポイントから頂けたのではないかと
思いました。
</p>
<p>
皆さん、ありがとうございました。
</p>
<p>
（後日談に続きます）
</p>
]]>
    </content>
</entry>

<entry>
    <title>TDD Bootcamp 北陸を終えて(@fujiwoさんとの議論)</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/03/tdd-bootcamp-fujiwo.html" />
    <id>tag:www.m-tea.info,2010://1.76</id>

    <published>2010-03-14T03:27:28Z</published>
    <updated>2010-03-14T04:13:30Z</updated>

    <summary>昨日のTDD BootCamp北陸に参加して（今も合宿組は続いていると思いますが...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>昨日のTDD BootCamp北陸に参加して（今も合宿組は続いていると思いますが) その後、別所で @fujiwoさんと議論をさせてもらいました。 </p>]]>
        <![CDATA[<h2>議論内容</h2>
<blockquote>
<p>@k1ha410: あ、せっかくなので、少し議論につきかってもらいっていいですか？ </p>
<p>@k1ha410: 昨日のお題は、twitterのつぶやきの 不適切な語を含むフィルターだったとおもいます。 </p>
<p>@k1ha410: で、不適切な語を後から、フィルターに追加できるようにという 仕様変更を頂いて色々検討していきました。 </p>
<p>@k1ha410: WordFiltter#Add( word ) な I/F を検討して、その後対象性を求めるためにWordFiltter#Delete(word) な I/F も検討しました。 </p>
<p>@k1ha410: で、僕らのチームで Test を書いていく際に次の挙動についてどうなるかについて話題になりました。 </p>
<p>@k1ha410: WordFiltter.Add( "AAA") WordFiltter.Add( "AAA") WordFiltter.Delete( "AAA") WordFiltter.Delete( "AAA") </p>
<p>@k1ha410: この手順で呼ばれた時に、どのような挙動をするか、あるいは Delete １回だけの時にどうなるかです。 </p>
<p>@k1ha410: Add /Delete という名前からすると、重複登録が許されるようにも思えるのですが、WordFilter としては 重複登録はいかがなものかと。 </p>
<p>@fujiwo: 二回目の WordFiltter.Add( "AAA") は「何もしない」か「失敗する」んじゃないんですか。 </p>
<p>@k1ha410: はい、そのような挙動もありだとおもいます。「何もしない」か「失敗する」 </p>
<p>@fujiwo: そうでない挙動は何故ありだと考えるんですか。 </p>
<p>@k1ha410: で、失敗するは Add という名前でもいいような気がするのですが、何もしないは Add という名前じゃないような気がしました (I/Fの名前は重要なので) </p>
<p>@fujiwo: 何故ですか ＞何もしないは Add という名前じゃない 。 </p>
<p>@k1ha410: 個人的な感想ですが、追加ということは、ある集合に要素が入る事だと思っていました。つまり、今回だと フィルターする単語集合に追加されるということ。 </p>
<p>@fujiwo: # 空っぽのリストを空っぽにするのは RemoveAll でいいと思います。 </p>
<p>@fujiwo: # 「空っぽにする」＝「何もしない」です。両者の挙動がたまたま同じだけ。 </p>
<p>@k1ha410: 追加して失敗するは、Add してわかるとおもうのですが、何もされないというのは、どうなものかと。 </p>
<p>@fujiwo: Add も同じだと思います。RemoveAll の例と。 </p>
<p>@fujiwo: 空っぽのリストにとっては、RemoveAll に対するアクションがたまたま「何もしない」というだけ。 </p>
<p>@k1ha410: なるほど。 </p>
<p>@fujiwo: メッセージ名と挙動のマッピングをするのは、実インスタンスの判断で構わないと思います。 </p>
<p>@fujiwo: メッセージを投げるのは、呼ぶ方の都合。 </p>
<p>@fujiwo: メッセージに対するアクションは呼ばれる方の都合。 </p>
<p>@k1ha410: はい。 </p>
<p>@fujiwo: メソッド名＝メッセージ名 </p>
<p>@k1ha410: メッセージに対するアクション名　＝　メソッド名　ではないのでしょうか？ </p>
<p>@fujiwo: インタフェースに表れているものは、メッセージ名です。 </p>
<p>@k1ha410: メッセージを投げる側は、何も考えず、メッセージ名でなげてるだけのようなので。 </p>
<p>@fujiwo: そうです。アクション名＝メソッド名だと思います。 </p>
<p>@fujiwo: メソッド != メッセージ </p>
<p>@fujiwo: アクション = メソッド </p>
<p>@k1ha410: 多くの言語が、メッセージの名前とメソッド名をダイレクトにマッピングする手抜きをしてるだけのような気がしますが（手抜き？） </p>
<p>@fujiwo: メッセージ＝インタフェースに表れる名前 </p>
<p>@fujiwo: そうですね。多くの言語でメッセージ名とメソッド名は同じ名前にマッピングされます。 </p>
<p>@k1ha410: （ダイナミックな言語では、そこの名前解決に介在できますが） </p>
<p>@fujiwo: はい。 </p>
<p>@fujiwo: ですが、たとえば、ポリモーフィズムが良い例で、メッセージに対してアクション (=メソッド) は一対一にマッピングされません。 </p>
<p>@k1ha410: あ、それはいい例ですね。 </p>
<p>@fujiwo: あるメッセージに対して、「何もしない」というアクション (=メソッド) があっても問題ありません。 </p>
<p>@k1ha410: あ、そうか。個人的に興味があったのは、Ａｄｄという追加メッセージでなにもしないというのが有りかという、名前の問題だという事がわかりました。 </p>
<p>@fujiwo: ですから、私はあるメッセージ Add に対して、インスタンスが「その状態によって」「何もしない」というアクションを選択してもおかしくないと考えます。 </p>
<p>@k1ha410: というのと、RemoeveAll の何もしないについてに何もしないで違和感を感じなかったのは、別の理由（後始末の処理の過程の制約だから仕方がないかもしれない）からだというのがわかりました。 </p>
<p>@fujiwo: ただ、k1ha410さんがもともと問題にされてたのは、インタフェースに「何もしない」が表れるのがおかしい、ということなんですよね。きっと。 </p>
<p>@k1ha410: 例えば、AddIfNoExist(word) というインタフェース名（メッセージ）で、追加しないは許します。 </p>
<p>@fujiwo: つまり、Add("AAA") を二回成功したんなら、その後は、二回だけ Delete("AAA") が成功すべき、と。 </p>
<p>@k1ha410: はい。２度成功したなら、Deleteも２度成功して欲しいとおもいたい。 </p>
<p>@fujiwo: なるほど。 </p>
<p>@fujiwo: それは先程私がいった、Add の実際のインスタンス側でのアクションが何か、という話とは別ですね。 </p>
<p>@fujiwo: インタフェース側に現れてる問題ですから。 </p>
<p>@k1ha410: しかし Add("AAA") Delete("AAA") Delete("AAA") で２度目の Delete は 失敗しないという 挙動に関しては仕方がないと感じるかもしれません。 </p>
<p>@fujiwo: これは「Add って何?」って問題ではないですか? 違うかな。 </p>
<p>@k1ha410: そんな気がしてきました。 </p>
<p>@fujiwo: それも「WordFilter にとって、Add とは?」 </p>
<p>@fujiwo: Add というのはたぶん名前としては相応しくなくて、AddNGWord とかの方がいいと思います。 </p>
<p>@k1ha410: なるほど。 </p>
<p>@k1ha410: いま WordFilterという物に AddFilterWord とか AddNGWord とかだと Filterという物に(単語)追加するんだったら、それは フィルターする語だろうから Add で十分だろうと思ってた部分が、も少し考えないといけないのかなという気になってきました。 </p>
<p>@k1ha410: AddNGWord だと ２重登録が何もしないについて、なんとなく納得してもいいかもしれない。 </p>
<p>@fujiwo: うーん。Add でもいい気がしてきました。 </p>
<p>@fujiwo: WordFilter.Add だと、WordFilter.Add(aFilterWord) という引数になる感じがします。それでもいい気がしてきました。 </p>
<p>@k1ha410: とすると、Addという動詞の意味になるのかなと。（たぶん、その人の持ってる感性になるんですね） </p>
<p>@fujiwo: AddNGWord だと、Add だけだと Add されるものが限定されないので、AddNGWord としている感じ。 </p>
<p>@k1ha410: (ゴシゴシ目を確認中） </p>
<p>@k1ha410: あ、ＯＫ </p>
<p>@fujiwo: ちょっと前二つの発言を編集しました。 </p>
<p>@k1ha410: (WordFilter) に (単語) を "追加" </p>
<p>@k1ha410: と </p>
<p>@k1ha410: (WordFilter)に (単語)を"ＮＧワードとして追加" </p>
<p>@k1ha410: の違いですね。 </p>
<p>@fujiwo: ええ。そうです。Exactly. </p>
<p>@k1ha410: 前者だと、追加なのに、追加されないのは、いかがなものか？だけど、ＮＧワードとして追加だと、追加されないのは、それはそれでいいのかもという気になります。 </p>
<p>@fujiwo: ええ。 </p>
<p>@k1ha410: たぶん C# とかのコンテキストだと (WordFilter) に (単語) を "追加"は (WordFilter) に (単語:&lt;String:NGWORD&gt;) を "追加" くらいの定義に見えるんですよね。 </p>
<p>@k1ha410: ruby だと (WordFilter) に (単語:&lt;NGWORD&gt;) を "追加" </p>
<p>@k1ha410: 大抵引数もメッセージのシグネチャとして見えるので、NGWORD が含まれていると思える。 </p>
<p>@k1ha410: public void Add( string NGワード ); だと思うので。 </p>
<p>@k1ha410: なんとなく、分かってきました。 </p>
<p>@k1ha410: ありがとうございます。 </p>
<p>@fujiwo: おもしろいですね。ありがとうございます。 </p>
<p>@k1ha410: こんな事を考えてると、テスト１個書くのに時間がかかりました＞昨日 </p>
<p>@fujiwo: いや。本当にk1ha410さんらしい議論だと思います。 </p>
<p>@k1ha410: その後の統計を考えると、重複登録なんてしたくないのは同意できるのですが、それがインタフェース名に現れないといけないだろうという。 </p>
<p>@fujiwo: t_wada 賞を受賞した所以だと思います。 </p>
<p>@k1ha410: （昨日の例だと、統計処理は、後々の仕様変更だったはずなので、最初の段階では、追加できるだけでいいはず） </p>
<p>@fujiwo: はい。 </p>
<p>@fujiwo: これ後日譚として面白いかも知れないので、#tddbc に公開しましょうか。 </p>
<p>@k1ha410: はい。したいですね。 </p>
<p></p></blockquote>]]>
    </content>
</entry>

<entry>
    <title>IronRuby 1.0 RC2のリリース</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/02/ironruby-10-rc2.html" />
    <id>tag:www.m-tea.info,2010://1.75</id>

    <published>2010-02-11T04:05:06Z</published>
    <updated>2010-02-11T04:10:27Z</updated>

    <summary>IronRuby 1.0 RC2の公開がされたので、リリースノートを見てみた。 ...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>IronRuby 1.0 RC2の公開がされたので、リリースノートを見てみた。 </p>
<p>IronRuby 1.0 RC2は <a href="http://ironruby.net/download">http://ironruby.net/download</a> から </p>]]>
        <![CDATA[<h2>IronRuby 1.0 RC2のリリースノート</h2>
<p>
詳細は
<a href="http://rubyforge.org/frs/shownotes.php?release_id=42661"
>Release Name: 1.0-rc2</a>
を参照ください。
</p>
<h3>適当に内容をかみ砕くと</h3>
<ul>
<li>
.NET 4.0 RC互換でビルドされてる
<a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=40175"
>http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=40175</a>
</li>
<li>
クリティカルなバグフィクスと機能向上がある
</li>
<li>
リリース候補なのでみんな使って報告してほしい
<a href="http://ironruby.codeplex.com/WorkItem/Create.aspx"
>Bug報告はこちら</a>
</li>
<li>
1.0 RC2は 0.9.4.というバージョン
</li>
</ul>
<p>
主な変更点は
</p>
<ul>
<li>
ir -e 引数処理の扱い方の修正
</li>
<li>
-Sオプションがサポートされた
</li>
<li>
BEGIN  END ブロックがサポートされた
</li>
<li>
open(&quot;|shell_command&quot;) がサポートされた（autospecの為に）
</li>
<li>
irbのトランスレート時間が 34%向上
</li>
<li>
SilverlightでIronRuby 実行時にデバッグが出来るようになった
</li>
<li>
Adaptive loop compilation &lt;どういう事だろう? By K1ha410&gt;
</li>
<li>
eval中の暗黙の引数のsuper
</li>
<li>
RUBY_PLATFORM がセットされるように（Environment.OSVersion.Platform）
</li>
</ul>
<p>
詳しいBUG FIXを見ると色々興味深いものがでてくる。
</p>
<h2>さいごに</h2>
<p>
興味ある方は、IronRuby を是非試してみましょう。
</p>]]>
    </content>
</entry>

<entry>
    <title>Jruby on GAEで google アカウントを利用してみる</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/02/jruby-on-gae-google.html" />
    <id>tag:www.m-tea.info,2010://1.74</id>

    <published>2010-02-02T15:23:05Z</published>
    <updated>2010-02-02T15:25:01Z</updated>

    <summary>Google App Engine では google アカウントを用いた認証が...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="GAE" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="jruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>Google App Engine では google アカウントを用いた認証ができるようである。それを Jrubyから利用してみるという事で試してみた。 </p>
<p>(ハッカソン用の事前調査用の記事です) </p>]]>
        <![CDATA[
<h2>使い方</h2>
<h3>インストール</h3>
<p>
必要なのは、appengine-apis の user.rb ライブラリ
</p>
<ul>
<li>
Gemfile
</li>
</ul>
<pre class="prettyprint">
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path &quot;.gems/bundler_gems&quot;

# List gems to bundle here:
gem &quot;appengine-rack&quot;
gem &quot;appengine-apis&quot;
gem &quot;sinatra&quot;
 
 
</pre>
<ul>
<li>
config.ru
</li>
</ul>
<pre class="prettyprint">
require 'appengine-rack'
AppEngine::Rack.configure_app(
    :application =&gt; &quot;application-id&quot;,
    :precompilation_enabled =&gt; true,
    :version =&gt; &quot;1&quot;)

require 'app.rb'

configure :development do
  class Sinatra::Reloader &lt; ::Rack::Reloader
    def safe_load(file, mtime, stderr = $stderr)
      ::Sinatra::Application.reset!
      super
    end
  end
  use Sinatra::Reloader
end

run Sinatra::Application
 
 
</pre>
<h3>アプリケーション</h3>
<ul>
<li>
app.rb
</li>
</ul>
<pre class="prettyprint">
require 'sinatra'
require 'appengine-apis/users'

helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

get '/' do
  @user_name = AppEngine::Users.current_user
  if @user_name 
    @url = AppEngine::Users.create_logout_url('/')
    @login_or_out = &quot;logout&quot;
  else
    @url = AppEngine::Users.create_login_url('/')
    @login_or_out = &quot;login&quot;
  end
  erb %{
&lt;html&gt;
&lt;head&gt;&lt;/head&gt;
&lt;body&gt;&lt;%= h @user_name &amp;&amp; @user_name.email %&gt;&lt;a href=&quot;&lt;%= @url %&gt;&quot;&gt;&lt;%= @login_or_out%&gt;&lt;/a&gt;&lt;/body&gt;
&lt;/html&gt;
}
end
 
 
</pre>
<h3>AppEngine::Users.current_user</h3>
<p>
現在のユーザ情報が取得できる。
</p>
<p>
もし、ログインしていない場合は nil が返却される。
</p>
<p>
ログイン時はユーザ情報が取得でき、AppEngine::Users.current_user.emailでメールアドレスが取得できる。
</p>
<h3>AppEngine::Users.create_logout_url( path )</h3>
<p>
ログアウトのURLを取得する。
ログアウト後、どのpathへ遷移するかを、pathで指定する
</p>
<h3>AppEngine::Users.create_login_url( path )</h3>
<p>
ログインのURLを取得する。
ログイン後、どのpathへ遷移するかを、pathで指定する
</p>
<h2>おわりに</h2>
<p>
これを使えば、googleアカウントで認証ができるようになる。
お手軽認証にはもってこいだと考える。
</p>
]]>
    </content>
</entry>

<entry>
    <title>JrubyからJavaのコードを呼び出してみた</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/02/jrubyjava.html" />
    <id>tag:www.m-tea.info,2010://1.73</id>

    <published>2010-02-01T14:39:29Z</published>
    <updated>2010-02-01T14:42:33Z</updated>

    <summary>Rubyな人とJavaな人でGAE/Jを取り組むこととなったので、ハイブリッド案...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="jruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>Rubyな人とJavaな人でGAE/Jを取り組むこととなったので、ハイブリッド案が出来ないか検討した結果をまとめておく。 </p>]]>
        <![CDATA[<h2>Jruby と Java </h2>
<p>
JrubyはJavaVMの上で動くRubyなので Jruby から Java のライブラリを
呼び出す事が出来る。
</p>
<p>
また逆にJavaからJruby環境を用いてrubyスクリプト評価も出来る。
</p>
<h3>GAE/Jの環境だと</h3>
<p>
GAE/Jの環境だと、JavaとJruby(rack) を混在させ、web.xml等で
制御する事も可能かと思う。
</p>
<h3>図にまとめてみた</h3>
<a href="http://photozou.jp/photo/show/291813/32541934"><img src="http://art17.photozou.jp/pub/813/291813/photo/32541934.png" alt="JrubyJava" width="450" height="175" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/32541934">JrubyJava</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<h2>JrubyからJava</h2>
<p>
JrubyからJavaを利用するに当たり以下のURLを参考にした。
</p>
<ul>
<li>
 
<a href="http://www.okisoft.co.jp/esc/ruby/tut-08.html"
>JRuby から Java へのアクセス</a>
</li>
</ul>
<ul>
<li>
 
<a href="http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby"
>Scripting Java from JRuby</a>
</li>
</ul>
<h3>自作のJavaライブラリ</h3>
<p>
とりあえず(Java良く知らないけど) Java のライブラリを作ってみた。
初めて書いたので、jarの作り方すら分からなかったけど(^^;
</p>
<p>
以下のクラスを、myCustomLib.jar とした。
</p>
<pre class="prettyprint">
package myCustomLib;

public  class CustomLib {
    public static int Add( int x , int y )
    {
        return x+y;
    }
    public static int Add( int[] nums )
    {
        int sum = 0;
        for ( int ii=0; ii&lt;nums.length; ++ii)
            sum += nums[ii];
        return sum;
    }

    public static String AddAndConvertToString(int x , int y )
    {
        return Integer.toString(Add(x,y));
    }

    public static int[] Inc( int[] nums )
    {
        for ( int ii=0; ii&lt;nums.length; ++ii)
            nums[ii] += 1;
        return nums;
    }
}
 
 
</pre>
<h3>Javaからcallしてみた</h3>
<p>
どのようにJavaから呼び出せばいいのか？となるので、mainを作って呼び出してみた
</p>
<pre class="prettyprint">
public class Hello {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.print(&quot;Add \n&quot;);
        System.out.print(myCustomLib.CustomLib.Add(6, 7));

        System.out.print(&quot;\nAdd nums\n&quot;);
        int[] n = {5,6,7};
        System.out.print(myCustomLib.CustomLib.Add(n));

        System.out.print(&quot;\nAdd AddAndConvertToString\n&quot;);
        System.out.print(myCustomLib.CustomLib.AddAndConvertToString(7,8));

        int[] n2 = {5,6,7};
        System.out.print(&quot;\nAdd inc\n&quot;);
        int[] r = myCustomLib.CustomLib.Inc(n2);
        for (int ii=0; ii&lt;n2.length; ++ii )
        {
            System.out.print(r[ii]);
        }
    }
}
 
 
</pre>
<h3>Jrubyから呼び出し</h3>
<p>
以下の手順で行った
</p>
<ol>
<li>
myCustomLib.jarファイルをWEB-INF\lib\へコピー
</li>
<li>
sinatraのアプリケーションから呼び出す
</li>
</ol>
<pre class="prettyprint">
require 'sinatra'
import 'myCustomLib.CustomLib'

get '/' do
    x = 1+2
    y = CustomLib.Add(5,6)
    ary = [5,6,7]
    y2 = CustomLib.Add(ary.to_java(:int))
    y3 = CustomLib.AddAndConvertToString(5,6)
    y4j = CustomLib.Inc(ary.to_java(:int))
    y4  = y4j.to_a
    &quot;hello world x:#{x} y:#{y} y2:#{y2} y3:#{y3} #{y3.class} y4:#{y4.join(' ')} #{y4.class}&quot;
end
 
 
</pre>
<p>
注意点
</p>
<ul>
<li>
importで利用するクラスの完全な名前(というのかな?)をimport
</li>
<li>
呼び出す時に、数値や文字列はそのままでいいみたい
</li>
<li>
配列は to_java や to_a を用いて ruby配列&lt;-&gt;Java配列の変換をする
</li>
</ul>
<p>
等が必要そうである。
</p>
<h2>まとめ</h2>
<p>
とりあえず、基本的な型でJava &lt;-&gt; Ruby の相互変換は出来た
</p>
]]>
    </content>
</entry>

<entry>
    <title>あなたのクラウドアプリでAzureを使う10の理由 (10 reasons to use Azure for your cloud apps)</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/azure10-10-reasons-to-use-azure-for-your-cloud-apps-1.html" />
    <id>tag:www.m-tea.info,2010://1.72</id>

    <published>2010-01-25T08:32:50Z</published>
    <updated>2010-01-25T08:38:07Z</updated>

    <summary>「10 reasons to use Azure for your cloud ...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://blogs.techrepublic.com.com/10things/?p=1282">「10 reasons to use Azure for your cloud apps」</a> を無理やり日本語文字を使って読んでみた。 </p>]]>
        <![CDATA[<h2>きっかけ</h2>
<p>
<a href="http://blogs.techrepublic.com.com/10things/?p=1282"
>「10 reasons to use Azure for your cloud apps」</a>
(あなたのクラウドアプリでAzureを使う10の理由) の記事を紹介していただいた。
</p>
<p>
流し読みをしたが、今回は適当に訳をしてみようかと思いたった。
(元の記事の方には連絡とってないけどいいのかな...?)
</p>
<p>
問題があったら消します。
</p>
<p>
なお、英語は嫌いだし、中学生以降英語をした記憶がないので（おおげさ）、文法も用法も適当です。
その辺ご了承ください。
</p>
<h2>10 reasons to use Azure for your cloud apps(あなたのクラウドアプリでAzureを使う10の理由)</h2>
<h3>Familiarity of Windows(Windows を知っているから)</h3>
<p>
AzureはWindowsに基づくので、あなたはアプリケーションをWindowsアプリのために使用した同じプログラミング言語(Visual Basic、C++、C#)で記述すること出来ます。
ASP.NETと他のおなじみのWindows技術とともに、Visual StudioのようなIDEを使用することもできます。
これは、会社がAzureプラットホームのためにアプリケーションを作成できる開発者を簡単に見つけることが出来、
そして、Azure環境が非常に標準的なWindows環境のように見えるので、既存のWindowsアプリケーションのクラウド対応版を容易に作成できます。
</p>
<h3>64-bit Windows VMs (64ビットWindows VM)</h3>
<p>
Azureアプリケーションは64ビットWindows Server 2008の仮想マシンで動作しています。
それらはクラウド用に設計されたハイパーバイザです。
アプリケーションはWebRoleまたはWorkerRoleのVMインスタンスを使って開発されるので、
OSを管理して、維持すること必要はありません。
アプリは、各々のVMに代々起こるWindows Azureエージェントを通して、他のAzureコンポーネントと相互運用します。
Azureで、あなたはコードに集中することができて、ハードウェアについて心配する必要がありません。
</p>
<h3>Azure SDK</h3>
<p>
マイクロソフトはWindows Azureソフトウェア開発キット（SDK）を提供します。
それは自分のコンピュータで走らせることができるAzure環境のバージョンを含みます。
それはWindows Azure Development Fabricと呼ばれており、
そして、それはAzureエージントとストレージを含みます。
アプリケーションを開発して、デバッグするとき、あなたはローカルで動作ことができます、
開発後それをクラウドの方へ移動してください。
マイクロソフトから、SDKとともに、あなたはVista / Studio 2008と2010 のためのツールを
ダウンロードすることができます。
</p>
<p>
<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&displaylang=en"
> download the tools for Vista Studio 2008 and 2010, along with the SDK</a>
</p>
<h3>Scalability and flexibility(スケーラビリティと柔軟性)</h3>
<p>
Azure を使って、あなたは10 ?10,000(1万) または 10,000,000 (1000万)人のユーザから
利用されても確実に動作する
アプリケーションとスケールすうアプリケーションを追加コードなしに簡単につくることができます。
Azure ストレージは、クラウドの中でスケーラブルで、安全な、パフォーマンス効果的なストレージサービスを提供します。
</p>
<p>
あなたがウェブアプリを作成した後、アプリケーションの利用するプロセッサの数を指定することができます。
アプリケーション利用者が増加する要求に応ずるために拡大する必要があるならば、
より多くのプロセッサを使うために設定を変えることは簡単です。
「収入の範囲で支払い、利用者が増加するので追加支払いをする」
ことは、素早く市場にあなたの新しいアプリを持ってきて、より速くあなたの顧客の要求における変更を可能にします。
</p>
<h3>Cost benefits and pricing model(コスト効果と価格設定モデル)</h3>
<p>
クラウドの中で資源を利用することは、オンプレミスのリソースの構築と拡大のコスト削減させることができます。
オフプレミスにハードウェアがあるので、あなたはIT管理のコストを下げることもできます。
あなたが必要とする時に必要なコンピュータ処理時間と、ストレージ領域だけの代金を払わなければならないので、
ウェブベースのアプリケーションを作成して、テストして、デバッグして、配信するためのコストは下がります。
</p>
<p>
Azure 料金は消費量に依存していて、計算時間は時間(hour)単位、ストレージは月単にのデータサイズと月単位のデータ転送量に依存しています。
</p>
<p>
<a href="http://www.microsoft.com/windowsazure/pricing/"
> Windows Azure Platform Pricing -- Windows Azure Platform</a>
</p>
<h3>Data center in the cloud（クラウドのデータセンター）</h3>
<p>
SQL Azureは、エンタープライズデータセンターを会社に提供します。（維持に関する&quot;騒ぎ&quot;,&quot;頭痛&quot;,&quot;メンテナンスコスト&quot;抜きで)
データの自動フェールオーバの冗長なコピーによる高可用性と信頼性を得ます。
あなた自身データをバックアップすることについてのどんな心配もしなくてよくなります。
</p>
<p>
SQL Serverのテーブル、インデックス、ビューと同様なリレーショナルデータベースモデルであり、なじみがあるWindows DBAです。
しかし、SQL Azure Serverはより多くの柔軟性のために複数のコンピュータで分散されています。
SQL AzureとSQL Serverの違いに関して詳しくは、 
<a href="http://go.microsoft.com/?linkid=9692818"
>Similarities and Differences - SQL Azure vs. SQL Server</a>
を見てください
</p>
<h3>Support resources(サポートリソース)</h3>
<p>
Azure が他のWindowsプラットホームと同じ普通のツールとテクノロジを使用するので、
マイクロソフトと企業を提供された資源（例えばTechNetとMSDN）の確立したサポート構造を利用することができます。
また社外のWindows用開発者の巨大なコミュニティを利用でき、質問や問題があり振り向くと誰かがいます。
</p>
<h3>Interoperability(相互接続性)</h3>
<p>
Azure で、オンプレミスアプリケーションがクラウドサービスを利用するハイブリットアプリケーションを構築する事が出来ます。
（例えばクラウドデータベースとストレージサービス）
情報提供サービスは、オンプレミスアプリケーションとクラウドサービスとモバイル機器間で働きます。
</p>
<p>
Azureは、オープンスタンダードとインターネットプロトコル（例えばHTTP、XML、SOAPとREST）をサポートします。
Java、PHPとRubyで記述されるアプリケーションのためにSDKとEclipseのためのAzureツールがあります。
</p>
<h3>Security(セキュリティ)</h3>
<p>
セキュリティがクラウドへの移行を考慮している企業の最も大きい懸念のうちの1つであるということを知って
マイクロソフトはセキュリティマインドでAzureを設計しました。
.NET Access Control Serviceはをidentitiesを統合する方法を提供します、
そして、Security Assertion Markup Language（SAML）トークンはユーザがアクセスを与えられるかどうか決定するために
アプリケーションにより用いられます。
マイクロソフトは、規制基準を満たすために、そのコンプライアンスフレームワークを設計しました。
詳細は、
<a href="http://www.windowsecurity.com/articles/Microsoft-Azure-Security-Cloud.html"
>Microsoft Azure: Security in the Cloud.</a>
を見てください
</p>
<h3>Something for everyone</h3>
<p>
Windows Azureは、ホスティングプロバイダ、ISV、システムインテグレータとカスタムソフトウェア開発者のためになることができます。
ホスティングプロバイダは、彼らのサービスを彼らには既存の基盤がなくて、より多くの基盤投資なしで新しいサービスを拡大することができます。
ISVは大きな資本支出なしでウェブアプリとSaaSをつくって、配備して、管理するためにAzureを使うことができます。
そして、彼らはより速くそれらのアプリケーションをスケールさせ、効果的にコストを節約できます。
システムインテグレータは、既存のオンプレミスインフラで動作する物をAzureの能力を利用することができます。
カスタムソフトウェア開発者はハードウェアコストを含む企業内開発の費用を都合できない顧客のソフトウェア解決をつくることができます。
そして、彼らは高価なデータセンターを建設して、維持することのないサービスとして顧客に彼らの応用を加えることができます。
</p>
<h2>おわりに</h2>
<p>
とりあえず、訳してみました。
</p>
<p>
たぶん、このような記事の書き方はしないだろう。
</p>
]]>
    </content>
</entry>

<entry>
    <title>Azure の アカウント管理者 と サービス管理者</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/azure-1.html" />
    <id>tag:www.m-tea.info,2010://1.70</id>

    <published>2010-01-22T11:25:41Z</published>
    <updated>2010-01-22T11:35:58Z</updated>

    <summary>Azureの管理者について twitter で情報を頂いたので、それについてまと...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>Azureの管理者について twitter で情報を頂いたので、それについてまとめてみる。 </p>
<p>なお、本情報の使用に関しては各自の責任でお願いします。 (間違いがありましたらご指摘頂けると幸いです) </p>]]>
        <![CDATA[<h2>きっかけ</h2>
<p>Twitterで「 <a href="http://twitter.com/k1ha410/statuses/8025119756">もう一つ。取得した複数アカウントに同一クレジットカードの割り当てOK? RT @iwata_m: 気になる。。 RT @k1ha410: Cloud Bootstrap に応募したアプリのアカウントはやっぱり CTP から本番に移行しないといけないのかな? どきどき #Azure</a> 」とつぶやいていたら、 </p>
<p><a href="http://twitter.com/tumada">tumada</a> 様から以下のようなつぶやきを頂きました。 </p><a href="http://photozou.jp/photo/show/291813/32113086"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="20100122_twitter" src="http://art22.photozou.jp/pub/813/291813/photo/32113086.jpg" width="449" height="450" /></a><br /><a href="http://photozou.jp/photo/show/291813/32113086">20100122_twitter</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> 
<p>[ <a href="http://twitter.com/tumada/status/8054461306">status１</a> ] [ <a href="http://twitter.com/tumada/status/8054565750">status２</a> ] [ <a href="http://twitter.com/tumada/status/8054736848">status３</a> ] [ <a href="http://twitter.com/tumada/status/8054818203">status４</a> ] </p>
<p>一応、つぶやき中のURLは以下のアドレスでした。（上から順番に） </p>
<ul>
<li>http://msdn.microsoft.com/ja-jp/azure/ee943806.aspx </li>
<li>http://msdn.microsoft.com/ja-jp/azure/ee943806.fig3-5(ja-jp,MSDN.10).jpg </li>
<li>http://msdn.microsoft.com/ja-jp/azure/ee943806.fig3-7(ja-jp,MSDN.10).jpg </li></ul>
<h2>Azureの管理者</h2>
<p>tumada様からの情報を元に、自分なりの理解をしたところ以下のようになりました。 </p><a href="http://photozou.jp/photo/show/291813/32113085"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="20100122_azure" src="http://art17.photozou.jp/pub/813/291813/photo/32113085.jpg" width="450" height="283" /></a><br /><a href="http://photozou.jp/photo/show/291813/32113085">20100122_azure</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> 
<h3>支払い＝開発者の場合</h3>
<p>支払＝開発者の場合、開発者がアカウント管理者とサービス管理者となるようです。 </p>
<h3>支払い＝会社で開発者と異なる場合</h3>
<p>購買や経理関係の方がなどがアカウント管理者となり、プロジェクトマネージャや開発側がサービス管理者となるようです。 </p>
<h3>1人で複数のAzureアカウントを持つ人</h3>
<p>ケースが２つあって、 </p>
<ul>
<li>各Azureアカウントに「開発者がアカウント管理者とサービス管理者」というスタイル </li>
<li>アカウント管理者「開発者がアカウント管理者とサービス管理者」というスタイル </li></ul>
<p>前者で気になるのが、各Azureアカウントに同一クレジットカードを結びつけてよいのか？であるが、 <a href="http://twitter.com/shin135/statuses/8053745779">できるそう</a> である。砂金様はそのようなスタイルでアカウントをもっておられるようですが、後者の方がお勧めかと思う。 </p>
<h2>さいごに</h2>
<p>CTPからアカウント移行という一時的な情報ですが、教えていただのでまとめてみました。 </p>
<p>なお、この情報は正確かどうかは保証できませんので、各自の責任でお願いします。 </p>]]>
    </content>
</entry>

<entry>
    <title>VMware Player 3.0 簡易インストール Ubuntu 9.10 編</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/vmware-player-30-ubuntu-910.html" />
    <id>tag:www.m-tea.info,2010://1.69</id>

    <published>2010-01-18T08:57:38Z</published>
    <updated>2010-01-18T09:00:03Z</updated>

    <summary>Ubuntu 9.10 を VMWarePlayer 3.0 にインストールした...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="VMWare" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>Ubuntu 9.10 を VMWarePlayer 3.0 にインストールした。 </p>
<p>なんと、Ubuntu も 簡易インストールに対応していたので記録しておく。 </p>]]>
        <![CDATA[
<h2>はじめに</h2>
<p>
以前の記事
「
<a href="/2009/10/vmware-player-30.html"
>VMware Player 3.0 簡易インストール</a>
」
「
<a href="/2009/11/vmware-player-30-windows-7.html"
>VMware Player 3.0 簡易インストール Windows 7 編</a>
」
で、Windows XP と Windows 7 の簡単インストールについて書いた。
</p>
<p>
Ubuntu 9.10 も簡易インストールで入ったので、その記述をしておく。
</p>
<h2>インストール</h2>
<p>
Ubuntu 9.10 は以下の手順でインストールを行う。
</p>
<ul>
<li>
Ubuntu 9.10 のダウンロード
</li>
<li>
VMWare Player 3.0 を起動し、 Ubuntu の簡易インストール
</li>
</ul>
<h3>Ubuntu 9.10 のダウンロード</h3>
<p>
ダウンロードは「
<a href="http://www.ubuntulinux.jp/products/JA-Localized/download"
>Ubuntu Desktop 日本語 Remix CDのダウンロード</a>
」から行う。
</p>
<h3>インストール</h3>
<p>
VMWarePlayer 3.0を起動します。
</p>
<a href="http://photozou.jp/photo/show/291813/31825416"><img src="http://art18.photozou.jp/pub/813/291813/photo/31825416.jpg" alt="vm00" width="450" height="383" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825416">vm00</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ダウンロードしたubuntuのISOイメージを指定します。
指定すると「このOSは簡易インストールを使用します」と表示され、簡易インストール対応である事が分かる。
</p>
<p>
次をクリックして、ユーザ情報とパスワードを設定する。
</p>
<a href="http://photozou.jp/photo/show/291813/31825421"><img src="http://art17.photozou.jp/pub/813/291813/photo/31825421.jpg" alt="vm01" width="450" height="330" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825421">vm01</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
また、仮想マシンの名前と保存先を指定する。
</p>
<a href="http://photozou.jp/photo/show/291813/31825423"><img src="http://art19.photozou.jp/pub/813/291813/photo/31825423.jpg" alt="vm02" width="450" height="330" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825423">vm02</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
最後に、仮想ディスクのサイズを指定すればＯＫ。
</p>
<p>
パフォーマンス等を気にすると色々出てくると思うが、とりあえずはデフォルトでＯＫ。
</p>
<a href="http://photozou.jp/photo/show/291813/31825429"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825429.jpg" alt="vm03" width="450" height="330" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825429">vm03</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
次にをクリックすると、完了画面となり、完了をクリックするとVMが起動してインストール開始である。
</p>
<a href="http://photozou.jp/photo/show/291813/31825434"><img src="http://art17.photozou.jp/pub/813/291813/photo/31825434.jpg" alt="vm04" width="450" height="330" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825434">vm04</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ハードウェアをカスタマイズをクリックすると、メモリ、プロセッサ数、ネットワークアダプタのモード等が変更できるので、
カスタマイズしたい場合には「ハードウェアをカスタマイズ」をクリックのこと
</p>
<a href="http://photozou.jp/photo/show/291813/31825436"><img src="http://art19.photozou.jp/pub/813/291813/photo/31825436.jpg" alt="vm05" width="450" height="330" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825436">vm05</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ＶＭが起動すると、後は順次インストールが開始される。
</p>
<a href="http://photozou.jp/photo/show/291813/31825440"><img src="http://art17.photozou.jp/pub/813/291813/photo/31825440.jpg" alt="vm06" width="450" height="306" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825440">vm06</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825444"><img src="http://art20.photozou.jp/pub/813/291813/photo/31825444.jpg" alt="vm07" width="450" height="409" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825444">vm07</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825447"><img src="http://art22.photozou.jp/pub/813/291813/photo/31825447.jpg" alt="vm08" width="450" height="395" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825447">vm08</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825450"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825450.jpg" alt="vm09" width="450" height="395" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825450">vm09</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825454"><img src="http://art22.photozou.jp/pub/813/291813/photo/31825454.jpg" alt="vm10" width="450" height="316" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825454">vm10</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825460"><img src="http://art20.photozou.jp/pub/813/291813/photo/31825460.jpg" alt="vm11" width="450" height="316" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825460">vm11</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
インストール中に上記のような画面でしばらくとまる。
</p>
<p>
裏で VMWare Tool をインストールしている。時間がかかるが、しばらくほっておいてください。
</p>
<a href="http://photozou.jp/photo/show/291813/31825465"><img src="http://art18.photozou.jp/pub/813/291813/photo/31825465.jpg" alt="vm12" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825465">vm12</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
インストールが完了すると、ログイン画面がでてくる（クールだ）
</p>
<a href="http://photozou.jp/photo/show/291813/31825469"><img src="http://art18.photozou.jp/pub/813/291813/photo/31825469.jpg" alt="vm13" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825469">vm13</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ユーザ名を選択し、最初に設定したパスワードを入力するとログインできる
</p>
<a href="http://photozou.jp/photo/show/291813/31825472"><img src="http://art18.photozou.jp/pub/813/291813/photo/31825472.jpg" alt="vm14" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825472">vm14</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825477"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825477.jpg" alt="vm15" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825477">vm15</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ログイン出来たら、まずは パッケージのアップデートをしておこう。
Windows でいう Windows Updateみたいなものだ。
</p>
<p>
手順は以下の通り
</p>
<a href="http://photozou.jp/photo/show/291813/31825482"><img src="http://art17.photozou.jp/pub/813/291813/photo/31825482.jpg" alt="vm16" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825482">vm16</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
「システム」→「システム管理」→「アップデートマネージャ」の順でクリックする。
</p>
<a href="http://photozou.jp/photo/show/291813/31825485"><img src="http://art20.photozou.jp/pub/813/291813/photo/31825485.jpg" alt="vm17" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825485">vm17</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
「再チェック」をクリックすると、パスワード入力を求められる。
</p>
<p>
Windows Vista や Windows 7 でいう UAC みたいなものだ。
</p>
<a href="http://photozou.jp/photo/show/291813/31825490"><img src="http://art19.photozou.jp/pub/813/291813/photo/31825490.jpg" alt="vm18" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825490">vm18</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
アップデートが終わると
</p>
<a href="http://photozou.jp/photo/show/291813/31825495"><img src="http://art19.photozou.jp/pub/813/291813/photo/31825495.jpg" alt="vm19" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825495">vm19</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
アップデートのインストールをクリックして、インストールを行う。
</p>
<a href="http://photozou.jp/photo/show/291813/31825500"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825500.jpg" alt="vm20" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825500">vm20</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<a href="http://photozou.jp/photo/show/291813/31825508"><img src="http://art18.photozou.jp/pub/813/291813/photo/31825508.jpg" alt="vm21" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825508">vm21</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ネットワークからダウンロードを行い
</p>
<a href="http://photozou.jp/photo/show/291813/31825512"><img src="http://art20.photozou.jp/pub/813/291813/photo/31825512.jpg" alt="vm22" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825512">vm22</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ダウンロードしたファイルをインストールする。
</p>
<a href="http://photozou.jp/photo/show/291813/31825517"><img src="http://art19.photozou.jp/pub/813/291813/photo/31825517.jpg" alt="vm23" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825517">vm23</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
インストールが終わると再起動する。
</p>
<a href="http://photozou.jp/photo/show/291813/31825519"><img src="http://art18.photozou.jp/pub/813/291813/photo/31825519.jpg" alt="vm24" width="450" height="365" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825519">vm24</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
あとは、先ほどのログイン画面が出てきて、再度ログインすれば、更新されたOSで Ubuntu が利用できる。
</p>
<h2>おわりに</h2>
<p>
基本インストーラに頼って、デフォルト設定でＯＫです。
ubuntu などが、こんなに簡単に入っていいのだろうか？
（いいんです）
</p>
]]>
    </content>
</entry>

<entry>
    <title>VMware Player 3.0 本体のインストール</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/vmware-player-30-1.html" />
    <id>tag:www.m-tea.info,2010://1.68</id>

    <published>2010-01-18T08:34:31Z</published>
    <updated>2010-01-18T08:37:52Z</updated>

    <summary>VMWarePlayer 3.0 を別のマシンにインストールしたので、ついでにス...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="VMWare" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>VMWarePlayer 3.0 を別のマシンにインストールしたので、ついでにスクリーンショットを撮った。 </p>
<p>インストール記事としてまとめておく。 </p>]]>
        <![CDATA[
<h2>はじめに</h2>
<p>
以前の記事
「
<a href="/2009/10/vmware-player-30.html"
>VMware Player 3.0 簡易インストール</a>
」
「
<a href="/2009/11/vmware-player-30-windows-7.html"
>VMware Player 3.0 簡易インストール Windows 7 編</a>
」
で、Windows XP と Windows 7 の簡単インストールについて書いた。
</p>
<p>
ちょっとマシンを入れ替えた際に、VMWarePlayer3.0を再度インストールしたので、
VMWarePlayer3.0のインストールについて記載しておく。
</p>
<p>
(検索結果にも VMWare Player 3.0 インストール というキーワードで訪れてくれているようなので)
</p>
<h2>インストール手順</h2>
<p>
基本は以下の手順でインストール可能である。
</p>
<ul>
<li>
VMware Player 3.0のダウンロード
</li>
<li>
インストール
</li>
<li>
再起動
</li>
<li>
ライセンスの許諾
</li>
</ul>
<h3>VMware Player 3.0のダウンロード</h3>
<p>
ダウンロードは以下のサイトから行う。
<a href="http://www.vmware.com/jp/products/player/"
>VMware Player 、仮想マシン、仮想PC</a>
</p>
<p>
ユーザ登録が必要です。(既にユーザ登録してあるので、手順は割愛します。確か姓名とメールアドレスが必要でした)
</p>
<h3>インストール</h3>
<p>
ダウンロード済みのファイルをダブルクリックしてインストールします。
</p>
<p>
ダブルクリックすると以下のようにインストール準備が始まります。
</p>
<a href="http://photozou.jp/photo/show/291813/31825204"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825204.jpg" alt="vm00" width="450" height="385" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825204">vm00</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ダブルクリックすると以下のようにインストール準備が始まります。
</p>
<a href="http://photozou.jp/photo/show/291813/31825208"><img src="http://art17.photozou.jp/pub/813/291813/photo/31825208.jpg" alt="vm01" width="450" height="342" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825208">vm01</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
次をクリックし
</p>
<a href="http://photozou.jp/photo/show/291813/31825211"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825211.jpg" alt="vm02" width="450" height="342" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825211">vm02</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
インストール先を選択します。
</p>
<a href="http://photozou.jp/photo/show/291813/31825214"><img src="http://art20.photozou.jp/pub/813/291813/photo/31825214.jpg" alt="vm03" width="450" height="342" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825214">vm03</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
また、ショートカット作成先も選択します。
</p>
<a href="http://photozou.jp/photo/show/291813/31825217"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825217.jpg" alt="vm04" width="450" height="342" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825217">vm04</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
続行をクリックすると
</p>
<a href="http://photozou.jp/photo/show/291813/31825220"><img src="http://art21.photozou.jp/pub/813/291813/photo/31825220.jpg" alt="vm05" width="450" height="342" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825220">vm05</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
インストールが開始されます。
</p>
<a href="http://photozou.jp/photo/show/291813/31825222"><img src="http://art19.photozou.jp/pub/813/291813/photo/31825222.jpg" alt="vm06" width="450" height="342" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825222">vm06</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
インストール後再起動が必要となります。
</p>
<a href="http://photozou.jp/photo/show/291813/31825228"><img src="http://art22.photozou.jp/pub/813/291813/photo/31825228.jpg" alt="vm07" width="450" height="335" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825228">vm07</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
再起動後、VMWare Player を起動すると、使用許諾が表示され、承諾するとメニューが表示されます。
</p>
<a href="http://photozou.jp/photo/show/291813/31825232"><img src="http://art20.photozou.jp/pub/813/291813/photo/31825232.jpg" alt="vm08" width="450" height="383" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31825232">vm08</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<h2>おわりに</h2>
<p>
基本インストーラに頼って、デフォルト設定でＯＫです。
</p>
]]>
    </content>
</entry>

<entry>
    <title>GoogleAppEngine(Jruby) インストール</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/googleappenginejruby.html" />
    <id>tag:www.m-tea.info,2010://1.67</id>

    <published>2010-01-18T00:53:14Z</published>
    <updated>2010-01-18T00:54:58Z</updated>

    <summary>Google App Engine で ruby(jruby)を使うための手順に...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="GAE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>Google App Engine で ruby(jruby)を使うための手順について記載しておく </p>]]>
        <![CDATA[
<h2>はじめに</h2>
<p>
Google App Engine は Python と Java のSDKが公開されているが、
JVMが動作するという事で、その上に様々な言語の環境を作る事が出来る。
</p>
<p>
今回は、Google App Engine(GAE)に Ruby (JRuby)環境を構築する手順を
書いておこうかと思う。
</p>
<h2>構築手順</h2>
<p>
環境を構築するには、以下の手順でインストールしていく
</p>
<ul>
<li>
Rubyのインストール
</li>
<li>
JDKのインストール
</li>
<li>
google app engine のインストール
</li>
</ul>
<h3>Rubyのインストール</h3>
<p>
<a href="/2010/01/ruby-186.html"
>Ruby 1.8.6 のインストール</a>
ファイルをダウンロードしてインストールしていく。
</p>
<h3>JDKのインストール</h3>
<ul>
<li>
ダウンロード
<a href="http://java.sun.com/javase/ja/6/download.html"
>Java SE ダウンロード</a>
<br/>より、Java SE Development Kit (JDK)をダウンロードする。
</li>
</ul>
<ul>
<li>
インストール
<br/>ダウンロードした実行ファイルをダブルクリックしインストールを実施する。
<br/>基本的に、ライセンス確認、インストール方法の選択等がでてくるが、
<br/>そのまま入力すればＯＫである
</li>
</ul>
<div id="photozou_photo_stream_291813_1089287"></div> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a><script type="text/javascript" charset="UTF-8" src="http://photozou.jp/feed/js/291813/1089287/UTF-8/8/list.js"></script>
<h3>google app engine のインストール</h3>
<p>
さいごに、ruby用の google app engine をインストールする。
</p>
<p>
単純に考えると
</p>
<ul>
<li>
jrubyのダウンロードとインストール
</li>
<li>
google app engine Java SDKのダウンロードとインストール
</li>
</ul>
<p>
等が必要であるが、これはらこの後の作業で自動的に行われる。
</p>
<p>
手順は以下の通り
</p>
<ul>
<li>
コマンドラインを起動する
</li>
<li>
以下のコマンドを叩く
</li>
</ul>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
c:\&gt; gem update --system
c:\&gt; gem install google-appeingine
 
 
</pre>
<p>
スクリーンショットは以下の通り
</p>
<div id="photozou_photo_stream_291813_1089678"></div> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a><script type="text/javascript" charset="UTF-8" src="http://photozou.jp/feed/js/291813/1089678/UTF-8/8/list.js"></script>
<h3>完了</h3>
<p>
これで、インストール完了である。後は開発するだけ
</p>
<h2>さいごに</h2>
<p>
わずらわしい作業なしに、ruby 開発環境用の google-app-engine の設定ができた。
これは、凄く助かる。
</p>
]]>
    </content>
</entry>

<entry>
    <title>Ruby 1.8.6 のインストール</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/ruby-186.html" />
    <id>tag:www.m-tea.info,2010://1.66</id>

    <published>2010-01-17T23:58:11Z</published>
    <updated>2010-01-18T00:01:21Z</updated>

    <summary>今更ながらではあるが、Ruby 1.8 (Matz氏実装のRuby)を Wind...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="GAE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>今更ながらではあるが、Ruby 1.8 (Matz氏実装のRuby)を Windows にインストールした際のメモを記載する </p>]]>
        <![CDATA[
<h2>概要</h2>
<p>
既に 1.9.1が安定バージョンとして出ていますので、今更ながら 1.8 シリーズなのか?となりますが
ここでは 1.8.1 を入れる。
</p>
<h3>インストール手順</h3>
<ul>
<li>
Ruby Installer for Windowsよりダウンロード
</li>
<li>
ダウンロードファイルのインストール
</li>
</ul>
<h2>インストール</h2>
<h3>ダウンロード</h3>
<p>
<a href="http://rubyforge.org/projects/rubyinstaller/"
>Ruby Installer for Windows</a>
より、「RubyInstaller」のrubyinstaller-1.8.6-p383-rc1.exeを入手する。
</p>
<a href="http://photozou.jp/photo/show/291813/31809195"><img src="http://art21.photozou.jp/pub/813/291813/photo/31809195.jpg" alt="ruby_install01" width="451" height="338" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31809195">ruby_install01</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
なお、1.8.6を選択するが、RC1と製品候補版である。しかし、1.9シリーズではなく1.8を利用する。
</p>
<h3>インストーラの起動</h3>
<ul>
<li>
ダウンロードしたrubyinstaller-1.8.6-p383-rc1.exeをダブルクリック
<br/>インストーラに従いインストール
</li>
</ul>
<a href="http://photozou.jp/photo/show/291813/31809207"><img src="http://art17.photozou.jp/pub/813/291813/photo/31809207.jpg" alt="ruby_install02" width="450" height="347" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31809207">ruby_install02</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<ul>
<li>
ライセンス確認
</li>
</ul>
<a href="http://photozou.jp/photo/show/291813/31809211"><img src="http://art18.photozou.jp/pub/813/291813/photo/31809211.jpg" alt="ruby_install03" width="450" height="347" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31809211">ruby_install03</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
ライセンスを確認し同意する
</p>
<ul>
<li>
インストール先設定
</li>
</ul>
<a href="http://photozou.jp/photo/show/291813/31809219"><img src="http://art22.photozou.jp/pub/813/291813/photo/31809219.jpg" alt="ruby_install04" width="450" height="347" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31809219">ruby_install04</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<p>
(Add Ruby executables to your PATHのチェックを付ける)
</p>
<ul>
<li>
インストール開始
</li>
</ul>
<a href="http://photozou.jp/photo/show/291813/31809225"><img src="http://art21.photozou.jp/pub/813/291813/photo/31809225.jpg" alt="ruby_install05" width="450" height="347" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31809225">ruby_install05</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<ul>
<li>
インストール完了
</li>
</ul>
<a href="http://photozou.jp/photo/show/291813/31809233"><img src="http://art19.photozou.jp/pub/813/291813/photo/31809233.jpg" alt="ruby_install06" width="450" height="347" style="border:0" /></a><br /><a href="http://photozou.jp/photo/show/291813/31809233">ruby_install06</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a>
<h2>インストール確認</h2>
<p>
コマンドプロンプトを開いて「ruby -v」と入力し、バージョンが表示されればOK
</p>
<h2>おわりに</h2>
<p>
基本的に、インストーラ手順に従えばＯＫ。便利なものである。
</p>
]]>
    </content>
</entry>

<entry>
    <title>IronRuby の Runtime Error と スタックトレース</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/ironruby-runtime-error.html" />
    <id>tag:www.m-tea.info,2010://1.64</id>

    <published>2010-01-10T09:04:40Z</published>
    <updated>2010-02-11T09:15:16Z</updated>

    <summary>IronRubyのスクリプトを C# から呼び出していて、Rubyソースにバグが...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>IronRubyのスクリプトを C# から呼び出していて、Rubyソースにバグがあり例外が発生した際、そのままではトレースできない。 </p>
<p>どのようにトレースするかについて、まとめてみる。 </p>]]>
        <![CDATA[
<h2>IronRuby Scriptのエラー</h2>
<p>
例えば以下のようなプログラムを実行すると、以下のような実行結果が得られる
</p>
<pre class="prettyprint">
using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Run3();
            Console.ReadLine();
        }

        private static void Run3()
        {
            var engine = IronRuby.Ruby.CreateEngine();

            var src = @&quot;
hash = Hash.new
hash['abc'] = 123

puts ahsh['abc']
&quot;;
            var source = engine.CreateScriptSourceFromString(src);
            var scope = engine.CreateScope();
            scope.SetVariable(&quot;k2&quot;, &quot;abc&quot;);
            try
            {
                source.Execute(scope);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }
    }
}
 
 
</pre>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
undefined method `ahsh' for main:Object
   場所 Microsoft.Scripting.Interpreter.ThrowInstruction.Run(InterpretedFrame frame)
   場所 Microsoft.Scripting.Interpreter.Interpreter.RunInstructions(InterpretedFrame frame)
   場所 Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   場所 Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)
   場所 IronRuby.Runtime.RubyScriptCode.Run(Scope scope, Boolean bindGlobals)
   場所 IronRuby.Runtime.RubyScriptCode.Run(Scope scope)
   場所 Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink)
   場所 Microsoft.Scripting.SourceUnit.Execute(Scope scope)
   場所 Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
   場所 ConsoleApplication1.Program.Run3() 場所 Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:行 28
 
 
</pre>
<p>
これは、「hash」を typo して「ahsh」としてしまったために発生しているのである。
この短さであれば、原因は簡単に分かるが、このスタックトレースからだと分かりにくい。
</p>
<p>
せめて、rubyスクリプトのコールスタックが出てくれないと困るという事で
以下のようにする。
</p>
<pre class="prettyprint">
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Run4();
            Console.ReadLine();
        }

        private static void Run4()
        {
            var engine = IronRuby.Ruby.CreateEngine();

            var src = @&quot;
hash = Hash.new
hash['abc'] = 123

puts ahsh['abc']
&quot;;
            var source = engine.CreateScriptSourceFromString(src);
            var scope = engine.CreateScope();
            scope.SetVariable(&quot;k2&quot;, &quot;abc&quot;);
            try
            {
                source.Execute(scope);
            }
            catch (Exception e)
            {
                var rubyexception = IronRuby.Runtime.RubyExceptionData.GetInstance(e);
                Console.WriteLine(e.Message);
                foreach (var l in rubyexception.Backtrace)
                {
                    Console.WriteLine(l.ToString());
                }
            }
        }
    }
}
 
 
</pre>
<p>
このようにすると、以下のような ruby 風のスタックトレースが取れる。
</p>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
undefined method `ahsh' for main:Object
:0
c:\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:28:in `Run4'
c:\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:9:in `Main'
mscorlib:0:in `_nExecuteAssembly'
mscorlib:0:in `ExecuteAssembly'
Microsoft.VisualStudio.HostingProcess.Utilities:0:in `RunUsersAssembly'
mscorlib:0:in `ThreadStart_Context'
mscorlib:0:in `Run'
mscorlib:0:in `ThreadStart'
 
 
</pre>
<p>
このスタックトレースだと、さほど変わらないように思えるかもしれないが、これが
複数のライブラリ等を利用するようになると、非常に重要である。
</p>
<h3>補足</h3>
<p>
IronPythonでは、「ScriptingRuntimeHelpers.GetDynamicStackFrames」で取得出来るらしいが、
IronRubyでは現在(2010/01/10)利用できないようである。
</p>
<h2>おわりに</h2>
<p>
IronRubyの実行時エラーについて取得する方法について書いたが、実は
スクリプトのパースエラーについても取得できないといけない。
</p>
<p>
これは、ErrorListener をScriptSource.Compileに渡し取得する必要がある。
これはまた別の機会にでも。
</p>
]]>
    </content>
</entry>

<entry>
    <title>Azure の IISからIronRuby</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/azure-iisironruby.html" />
    <id>tag:www.m-tea.info,2010://1.63</id>

    <published>2010-01-10T07:36:12Z</published>
    <updated>2010-02-11T23:28:38Z</updated>

    <summary>Azureで独自のハンドラ ( IIS と IHttpHandler ) で、独...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://www.m-tea.info/2010/01/azure-iis-ihttphandler.html">Azureで独自のハンドラ ( IIS と IHttpHandler )</a> で、独自のハンドラを追加できた。 </p>
<p>これを応用して、IronRubyを動かしてみたい </p>]]>
        <![CDATA[<h2>まずは、HandlerとWeb.Config</h2>
<p>
前回の
<a href="/2010/01/azure-iis-ihttphandler.html"
>Azureで独自のハンドラ ( IIS と IHttpHandler )</a>
を踏まえていきなりコードを書く。
</p>
<h3>IHttpHandler</h3>
<pre class="prettyprint">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Microsoft.Scripting.Hosting;

namespace IronRubyHosting
{
    public class HttpHandlerFactory : IHttpHandlerFactory
    {
        private static readonly object GlobalLock = new object();
        private static HttpHandler Handler;

        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            if (Handler == null)
            {
                lock (GlobalLock)
                {
                    if (Handler == null)
                    {
                        try
                        {
                            Handler = new HttpHandler();
                            Handler.InitIronRuby();
                        }
                        catch (Exception e)
                        {
                            context.Response.StatusCode = 200;
                            return null;
                        }
                    }
                }
            }
            return Handler;
        }

        public void ReleaseHandler(IHttpHandler/*!*/ handler)
        {

        }
    }


    public sealed class HttpHandler : IHttpHandler
    {
        // from IHttpHandler
        public bool IsReusable
        {
            get { return true; }
        }

        // from IHttpHandler
        public void ProcessRequest(HttpContext context)
        {
            lock (this)
            {
                try
                {
                    HttpServerProcess(context);
                }
                catch (Exception ex)
                {
                    var s = &quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;error&lt;/title&gt;&lt;/head&gt;\n&quot;;
                        s += &quot;&lt;body&gt;&lt;h1&gt;Exception&lt;/h1&gt;\n&quot;;
                        s += &quot;&lt;pre&gt;\n&quot;;
                        s += System.Web.HttpUtility.HtmlEncode( ex.Message );
                        s += &quot;\n&quot;;
                        s += System.Web.HttpUtility.HtmlEncode( ex.StackTrace );
                        s += &quot;\n&quot;;
                        s += &quot;&lt;/pre&gt;\n&quot;;
                        s += &quot;&lt;/body&gt;&lt;/html&gt;\n&quot;;
                        context.Response.Write(s);
                        context.Response.ContentType = &quot;text/html; charset=utf-8&quot;;
                }
            }
        }

        ScriptRuntime runtime;
        ScriptEngine engine;
        public void InitIronRuby()
        {
            runtime = IronRuby.Ruby.CreateRuntime();
            engine = runtime.GetEngine(&quot;rb&quot;);
        }
        private void HttpServerProcess(HttpContext context)
        {
            var req = context.Request;
            var res = context.Response;
            var scope = engine.CreateScope();

            scope.SetVariable(&quot;req&quot;, req);
            scope.SetVariable(&quot;res&quot;, res);

            var src = @&quot;
$KCODE='u'
s = &lt;&lt;EOS.ToString
&lt;html&gt;
&lt;head&gt;&lt;title&gt;タイトル&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;hello I'm IronRuby&lt;/body&gt;
&lt;/html&gt;
EOS
res.Write( s );
res.ContentType =  'text/html; charset=utf-8'
&quot;;

            var source = engine.CreateScriptSourceFromString(src);
            source.Execute(scope);
        }
    }
}
 
 
</pre>
<p>
基本は、前回のHTTP Handlerをベースとしている。
また、IronRubyとの繋ぎ込みは、
「
<a href="/2009/11/c-ironruby.html"
>C# から IronRuby スクリプトの呼び出し</a>
」
「
<a href="/2009/11/c-ironruby-cironruby.html"
>C# から IronRuby スクリプトの呼び出し(C#からIronRubyの変数に値を設定してみる)</a>
」
「
<a href="/2009/12/c-ironruby-1.html"
>C# から IronRuby スクリプトの呼び出し方法</a>
」
等で記載した方法を用いている。
</p>
<p>
IISへの応答は Ruby Script で行っている。
この時、 .NET クラスへの文字列を渡す所があるので、ToString等を用いている。
</p>
<h2>おわりに</h2>
<p>
とりあえず、IISから直接IronRubyへのつなぎ込みが出来た。
</p>
<p>
ちなみに、この状況が
「
<a href="/2009/12/azureironruby.html"
>[速報]AzureからIronRubyを起動(疎通確認)</a>
」
である。
</p>
<p>
次は、RackやSinatraとの繋ぎ込みである
</p>
]]>
    </content>
</entry>

<entry>
    <title>Azureで独自のハンドラ ( IIS と IHttpHandler )</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/azure-iis-ihttphandler.html" />
    <id>tag:www.m-tea.info,2010://1.62</id>

    <published>2010-01-08T14:50:05Z</published>
    <updated>2010-01-08T14:53:35Z</updated>

    <summary>WorkerRole と HttpListener で、「WorkerRoleで...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://www.m-tea.info/2010/01/workerrole-httplistener.html">WorkerRole と HttpListener</a> で、「WorkerRoleでHttpListenerを単純に使うわけにはいかないようである」となってしまい悲しい状況である。 </p>
<p>とはいえ Azure では IIS 経由があるので、そっち経由で IronRuby につながらないかと思い調査してみる。 </p>]]>
        <![CDATA[
<h2>ASP.NET の仕組み </h2>
<p>
まずは IIS と ASP.NET がどのように繋がっているか、全く分からないので、調べてみた。
</p>
<p>
以前FITEAで小野さんに講演していただいた時に詳細を聞いた記憶があったので、探してみると
<a href="http://dotnetfan.org/blogs/dotnetfanblog/archive/2007/06/18/2591.aspx"
>どっとねっとふぁんBlog : ASP.NET の仕組み</a>
が見つかった。
</p>
<h3>大まかな手順</h3>
<p>
記事を読んでいくと
</p>
<blockquote>
<p>
ASP.NET がリクエストを受け取ったときに最初に生成されるのが HttpContextオブジェクトです。HttpContext オブジェクトにはブラウザからのリクエストの内容が 格納されるだけでなく、ユーザ情報やキャッシュ、アプリケーション、セッションといったオブジェクト、そしてブラウザに送るレスポンスの内容も格納されます。各ページの処理で利用する Application、Cache、Request、Response、Session といった組み込みオブジェクトは、実際には HttpContext オブジェクトの中身を参照していると考えられます。
</p>
</blockquote>
<p>
と記述があり、「HttpContext」が肝のようである。
</p>
<p>
さらに
</p>
<blockquote>
<p>
これらのクラスはIHttpHandlerインターフェースを実装しているか、またはIHttpHandlerインターフェースを実装しているクラスをよびだすIHttpHandlerFactoryインターフェースを実装しています。このIHttpHandlerインターフェースがASP.NETの仕組みでは重要な役割を担っており、IHttpHandlerインターフェースが持つProcessRequestメソッドが呼び出されることで各ページの処理が開始されるのです。Pageクラス（.aspxファイル）もその仕組みの中で動作していることは、PageクラスがIHttpHandlerを継承していることからもわかります。
このような仕組みを理解していると、IHttpHandlerインターフェースを実装するクラスを作成し、web.configに登録することで独自のリクエスト処理機能を組み込んでASP.NETを拡張することが可能になります。実際にマイクロソフトのサイトの中では.mspxという拡張子が利用されていますが、これはIHttpHandlerインターフェースを利用した拡張例と考えられます。 
</p>
</blockquote>
<p>
を踏まえると「IHttpHandler」が重要そうである。
</p>
<p>
「HttpContext」がHttpListenerでいう「HttpListenerContext」に相当し、
「IHttpHandler」は、HttpListenerでいうと「HttpListenerのGetContextが戻ってきたときに渡るハンドラ」と
考える事が出来る。
</p>
<p>
これを踏まえると
</p>
<ul>
<li>
IHttpHandlerインタフェースのクラスを作る
</li>
<li>
IISに作ったインタフェースに処理が渡るように設定する
</li>
</ul>
<p>
をすればよいかと考えた。
</p>
<h2>IHttpHandlerとweb.config</h2>
<p>
参考にしたのは
<a href="http://github.com/jschementi/ironruby/tree/master/Merlin/Main/Hosts/IronRuby.Rack"
>Merlin/Main/Hosts/IronRuby.Rack at master from jschementi's ironruby - GitHub</a>
IronRubyとIIS用のRackハンドラ。（おい
</p>
<p>
しかも、解説記事があります。（おい
<a href="http://blogs.msdn.com/shozoa/archive/2009/06/11/running-rack-based-web-application-on-iis.aspx"
>Rack ベースの Web アプリを IIS で動かしてみました</a>
</p>
<p>
車輪の再実装だといわれようが、理解をするためには必要なので、挑戦する。
(Azure上で動かしたいので、自分が理解してないものをポーティングなんて出来ないしね)
</p>
<h3>IHttpHandlerの作り方</h3>
<p>
まず、Factoryが必要そうである。（もしかしたら必要ないかもしれない）
</p>
<p>
とりあえず IronRuby 用の Handlerを参考にしつつ以下のようにしてみた。
</p>
<pre class="prettyprint">
    public class HttpHandlerFactory : IHttpHandlerFactory
    {
        private static readonly object GlobalLock = new object();
        private static HttpHandler Handler;

        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            if (Handler == null)
            {
                lock (GlobalLock)
                {
                    if (Handler == null)
                    {
                        try
                        {
                            Handler = new HttpHandler();
                        }
                        catch (Exception e)
                        {
                            context.Response.StatusCode = 200;
                            return null;
                        }
                    }
                }
            }
            return Handler;
        }
        public void ReleaseHandler(IHttpHandler/*!*/ handler)
        {
        }
    }
 
 
</pre>
<p>
Factory は IHttpHandlerFactory を継承して作る必要があり、
ReleaseHandlerとGetHandlerを実装する必要があるようである。
</p>
<p>
GetHandlerは、HttpHandler インスタンスを作り返却する責任があるようだ。
このHttpHandlerは、自分用のハンドラーでこの後実装する。
</p>
<p>
次に HttpHandler であるが、これは、IHttpHandlerを継承して作る必要があるようである。
</p>
<pre class="prettyprint">
    public sealed class HttpHandler : IHttpHandler
    {
        // from IHttpHandler
        public bool IsReusable
        {
            get { return true; }
        }

        // from IHttpHandler
        public void ProcessRequest(HttpContext context)
        {
            lock (this)
            {
                try
                {
                    HttpServerProcess(context);
                }
                catch (Exception ex)
                {
                    var s = &quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;error&lt;/title&gt;&lt;/head&gt;\n&quot;;
                        s += &quot;&lt;body&gt;&lt;h1&gt;Exception&lt;/h1&gt;\n&quot;;
                        s += &quot;&lt;pre&gt;\n&quot;;
                        s += System.Web.HttpUtility.HtmlEncode( ex.Message );
                        s += &quot;\n&quot;;
                        s += System.Web.HttpUtility.HtmlEncode( ex.StackTrace );
                        s += &quot;\n&quot;;
                        s += &quot;&lt;/pre&gt;\n&quot;;
                        s += &quot;&lt;/body&gt;&lt;/html&gt;\n&quot;;
                        context.Response.Write(s);
                        context.Response.ContentType = &quot;text/html; charset=utf-8&quot;;
                }
            }
        }
        private void HttpServerProcess(HttpContext context)
        {
            var req = context.Request;
            var res = context.Response;
            res.Write(&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;タイトル&lt;/title&gt;&lt;/head&gt;&lt;body&gt;hello&lt;/body&gt;&lt;/html&gt;&quot;);
            res.ContentType = &quot;text/html; charset=utf-8&quot;;
		}
    }
 
 
</pre>
<p>
ProcessRequest及びIsReusableの実装が必要で、
実際の処理はProcessRequestの中で行うようである。
</p>
<p>
今回は簡単なhtml文章を返却する。
</p>
<h3>これらのソース</h3>
<p>
Windows Azure の WebRole (ASP.NET) のプロジェクトに C# の クラスソースファイル(.cs)を追加して
そのソースコードに追加した。
</p>
<p>
本来なら、別のDLL(アセンブリ)にすればいいハズであるが、経験不足でどのようにするのが良いか
判断付かなかったので、この方法をとっている。
</p>
<h3>web.config</h3>
<pre class="prettyprint">
    &lt;system.web&gt;
?省略?

      &lt;httpHandlers&gt;

?省略?

        &lt;add verb=&quot;*&quot; path=&quot;*.xxx&quot; validate=&quot;false&quot; type=&quot;IronRubyHosting.HttpHandlerFactory, WebRole1&quot; /&gt;

?省略?

      &lt;/httpHandlers&gt;

?省略?

    &lt;/system.web&gt;

?省略?

    &lt;system.webServer&gt;
?省略?
      &lt;handlers&gt;
?省略?
        &lt;add name=&quot;ironruby&quot; verb=&quot;*&quot; path=&quot;*.xxx&quot;  type=&quot;IronRubyHosting.HttpHandlerFactory, WebRole1&quot; resourceType=&quot;Unspecified&quot; /&gt;
?省略?
      &lt;/handlers&gt;
    &lt;/system.webServer&gt;
 
 
</pre>
<h3>できあがり？</h3>
<p>
これで http://localhost/nanntoka.xxx のように 拡張子 xxx でアクセスすると
自分のハンドラーに飛んできて返答を返す。
</p>
<h2>おわりに</h2>
<p>
ここまで、すんなりきているようであるが、実は3回ほどプロジェクトを作りなおしてる。
</p>
<p>
とりあえず、IISからIHttpHandler経由でProcessRequestを呼び出す事が出来た。
</p>
<h2>参考</h2>
<ul>
<li>
 
<a href="http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/b9759e1c-f114-4eef-9a4c-7fc69d5367dd"
>HttpHandler, (404) Not Found</a>
</li>
<li>
 
<a href="http://d.hatena.ne.jp/seki-moto/20091211/httphandler"
>.NETでコントローラを作ってみる</a>
</li>
<li>
 
<a href="http://msdn.microsoft.com/ja-jp/library/ms228090(VS.80).aspx"
>方法 : 同期 HTTP ハンドラを作成する</a>
</li>
<li>
 
<a href="http://github.com/jschementi/ironruby/tree/master/Merlin/Main/Hosts/IronRuby.Rack"
>Merlin/Main/Hosts/IronRuby.Rack at master from jschementi's ironruby - GitHub</a>
</li>
<li>
 
<a href="http://blogs.msdn.com/shozoa/archive/2009/06/11/running-rack-based-web-application-on-iis.aspx"
>Rack ベースの Web アプリを IIS で動かしてみました </a>
</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>IronRuby と C# バインディングの注意点2</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/ironruby-c-2.html" />
    <id>tag:www.m-tea.info,2010://1.61</id>

    <published>2010-01-03T18:29:01Z</published>
    <updated>2010-01-03T18:30:54Z</updated>

    <summary>IronRuby と C#のバインディングを通じて、Azure上でホスティング出...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>IronRuby と C#のバインディングを通じて、Azure上でホスティング出来ないか？を検討している。 </p>
<p>その中でIronRuby と Hash構造について気になった事が出てきたのでまとめておく </p>]]>
        <![CDATA[
<h2>.NET な環境で Hash構造</h2>
<p>
.NETな環境でも Ruby の Hashに近い構造があった。
「System.Collections.Generic.Dictionary ジェネリック クラス」である。
</p>
<p>
このクラスを元にIronRubyとの連携についてみてみる。
</p>
<h2>HttpRequestのHeaders プロパティ</h2>
<p>
何故、Dictionaryに興味が出たかというと、作業の関係上
HttpRequestのHeaders プロパティが出たからである。
</p>
<p>
結論から言うと、、HttpRequestのHeaders プロパティは
System.Collections.Specialized.NameValueCollectionであり、Dictionaryではなかった。
</p>
<p>
このNameValueCollectionとIronRubyの事でハマったので記載する
</p>
<h3>検証コード</h3>
<pre class="prettyprint">
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Run2();
            Console.ReadLine();
        }

        private static void Run2()
        {
            var engine = IronRuby.Ruby.CreateEngine();

            var src = @&quot;
puts '&lt;&lt;&lt;c1&gt;&gt;&gt;'
c1.each do |item|
  puts item.class
  puts item.inspect
end
puts '&lt;&lt;&lt;c2&gt;&gt;&gt;'
c2.each do |item|
  puts item.class
  puts item.inspect
end
&quot;;
            var source = engine.CreateScriptSourceFromString(src);
            var scope = engine.CreateScope();

            var c1 = new System.Collections.Specialized.NameValueCollection();
            c1.Add(&quot;abc&quot;, &quot;123&quot;);
            c1.Add(&quot;def&quot;, &quot;234&quot;);
            c1.Add(&quot;ghi&quot;, &quot;456&quot;);

            var c2 = new System.Collections.Generic.Dictionary&lt;string, string&gt;();
            c2.Add(&quot;abc&quot;, &quot;123&quot;);
            c2.Add(&quot;def&quot;, &quot;234&quot;);
            c2.Add(&quot;ghi&quot;, &quot;456&quot;);

            scope.SetVariable(&quot;c1&quot;, c1);
            scope.SetVariable(&quot;c2&quot;, c2);
            source.Execute(scope);

        }
    }
}
 
 
</pre>
<h3>NameValueCollection</h3>
<p>
このオブジェクトは System::String をキーとし、値も System::String である。
これを IronRubyから利用する場合には
</p>
<pre class="prettyprint">
var c1 = new System.Collections.Specialized.NameValueCollection();
c1.Add(&quot;abc&quot;, &quot;123&quot;);
c1.Add(&quot;def&quot;, &quot;234&quot;);
c1.Add(&quot;ghi&quot;, &quot;456&quot;);

scope.SetVariable(&quot;c1&quot;, c1);
 
 
</pre>
<p>
とした後
</p>
<pre class="prettyprint">
c1.each do |item|
  puts item.class
  puts item.inspect
  ## use item
end
 
 
</pre>
<p>
のようにした。
</p>
<p>
Ruby の Hash をご存知の方だと
</p>
<pre class="prettyprint">
hash.each do |key,val|
  ## use key and val
end
 
 
</pre>
<p>
としたいかと思うが、実際には違った。 Rubyの等価コードだと以下のように
思えるかと思う。
</p>
<pre class="prettyprint">
hash.keys.each do |key|
  ## use key
end
 
 
</pre>
<h3>Dictionary</h3>
<p>
このオブジェクトは System::String をキーとし、値も System::String である。
これを IronRubyから利用する場合には
</p>
<pre class="prettyprint">
var c2 = new System.Collections.Generic.Dictionary&lt;string, string&gt;();
c2.Add(&quot;abc&quot;, &quot;123&quot;);
c2.Add(&quot;def&quot;, &quot;234&quot;);
c2.Add(&quot;ghi&quot;, &quot;456&quot;);

scope.SetVariable(&quot;c2&quot;, c2);
 
 
</pre>
<p>
とした後
</p>
<pre class="prettyprint">
c2.each do |item|
  puts item.class
  puts item.inspect
end
 
 
</pre>
<p>
のようにした。
</p>
<p>
この結果
</p>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
System::Collections::Generic::KeyValuePair[System::String, System::String]
[abc, 123]
System::Collections::Generic::KeyValuePair[System::String, System::String]
[def, 234]
System::Collections::Generic::KeyValuePair[System::String, System::String]
[ghi, 456]
 
 
</pre>
<p>
となり、Ruby の Hash のような感じがする。
</p>
<h2>これらの違い？</h2>
<p>
まだ詳しく調べていないが、「GetEnumerator メソッド」が影響していると
考えられる。
</p>
<h2>さいごに</h2>
<p>
当然のことながらRubyと.NET構造、よく似ているようで違う。
しかし ruby の each などが絶妙な形で融合している。
この点は興味深い。
</p>
<p>
皆さんもぜひ試していただけると(あまりいない)
</p>
]]>
    </content>
</entry>

<entry>
    <title>IronRuby と C# バインディングの注意点1</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/ironruby-c-1.html" />
    <id>tag:www.m-tea.info,2010://1.60</id>

    <published>2010-01-03T16:14:13Z</published>
    <updated>2010-01-03T16:16:29Z</updated>

    <summary>IronRuby と C#のバインディングを通じて、Azure上でホスティング出...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>IronRuby と C#のバインディングを通じて、Azure上でホスティング出来ないか？を検討している。 </p>
<p>その中でIronRuby の文字列と .NET(C#)の文字列の間にさらに気になった事が出てきたのでまとめておく </p>]]>
        <![CDATA[
<h2>MutableStringと.NET String</h2>
<p>
先日
<a href="/2009/12/cironruby-mutablestring.html"
>C#とIronRubyのかけ橋 MutableString</a>
なる物を書いた。
その記事を書きつつ、自分で失敗して半日悩んだので、その事例について書いておく
</p>
<h3>検証コード</h3>
<pre class="prettyprint">
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Run();
            Console.ReadLine();
        }


        private static void Run()
        {
            var engine = IronRuby.Ruby.CreateEngine();

            var src = @&quot;
hash = Hash.new
hash['abc'] = 123

k1 = 'abc'
puts hash[k1] #=&gt; 123
puts hash[k2] #=&gt; nil
puts k1.class
puts k2.class
puts hash[k2.to_s] #=&gt;123
puts k2.to_s.class
&quot;;
            var source = engine.CreateScriptSourceFromString(src);            
            var scope = engine.CreateScope();
            scope.SetVariable(&quot;k2&quot;, &quot;abc&quot;);
            source.Execute(scope);

        }
    }
}
 
 
</pre>
<p>
上記のコードは、RubyのHashオブジェクト hash のキー&quot;abc&quot;と値 123 をマッピングする
物である。
</p>
<p>
その値を参照する為に hash['abc'] などとしてアクセスしている。
</p>
<pre class="prettyprint">
k1 = 'abc'
puts hash[k1] #=&gt; 123
 
 
</pre>
<p>
このコードは動いて当然。 k1 は Ruby の String である。そのため、普通に動く。
(たぶん内部では MutableStringのはず)
</p>
<p>
問題は次のコード
</p>
<pre class="prettyprint">
var scope = engine.CreateScope();
scope.SetVariable(&quot;k2&quot;, &quot;abc&quot;);
source.Execute(scope);
 
 
</pre>
<p>
とした後の以下のコード。
</p>
<pre class="prettyprint">
puts hash[k2] #=&gt; nil
 
 
</pre>
<p>
このコードはnilが変える。
</p>
<p>
調べてみると
</p>
<pre class="prettyprint">
puts k1.class
puts k2.class
 
 
</pre>
<p>
k1のクラスは'String'であるが、k2は'System::String'である。
</p>
<p>
では、どのように.NETからMutableString を渡すか？というと1つの方法は
以下のようにする事である。
</p>
<pre class="prettyprint">
puts hash[k2.to_s] #=&gt;123
puts k2.to_s.class
 
 
</pre>
<h2>さいごに</h2>
<p>
IronRubyと.NETバインディングは比較的簡単であるが、上記のような点は
気にする必要がある。
</p>
<p>
ちなみに .inspect すると、&quot;&quot; か '' の違いとして表示されるので、
興味深い。
</p>
<p>
皆さん試してみてください。(試すのか?)
</p>
]]>
    </content>
</entry>

<entry>
    <title>WorkerRole と HttpListener</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2010/01/workerrole-httplistener.html" />
    <id>tag:www.m-tea.info,2010://1.59</id>

    <published>2010-01-03T12:57:58Z</published>
    <updated>2010-01-03T13:01:21Z</updated>

    <summary>WorkerRoleへ外部から接続 で、外部に接続できる事が分かった。  Azu...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://www.m-tea.info/2009/12/workerrole.html">WorkerRoleへ外部から接続</a> で、外部に接続できる事が分かった。 </p>
<p>Azure上でIronRuby動作を目指し、WorkerRoleでIronRubyを目指そうと思う </p>]]>
        <![CDATA[<h2>IronRubyとWeb</h2>
<p>
通常のRubyでWebアプリケーションというと Ruby on Rails というアプリケーション
フレームワークを使う。
</p>
<p>
また、WebアプリケーションフレームワークとWebサーバを接続する為には、Rackという
層が用意されている。
</p>
<p>
Azure上で IronRubyを使うためには以下のような道具があるかと思う
</p>
<ul>
<li>
IIS
<br/>いわずとしれた Windows用 Web Server
</li>
<li>
WebRick
<br/>pure ruby で記述されている Web Server
</li>
<li>
Thin
<br/>ruby用のWeb Server
</li>
<li>
.NET HttpListener
<br/> .NET 2.0以降で利用できる .NET環境用Webサーバライブラリ
</li>
</ul>
<p>
これらのどれかと Rack がつなぎ込めればいいと思う。
</p>
<p>
今回は「.NET HttpListener」との接続で検討する。
</p>
<h2>.NET HttpListener</h2>
<p>
このライブラリは以下のように利用する。
</p>
<pre class="prettyprint">
int port = 8080;
var prefix = string.Format(&quot;http://*:{0}/&quot;,port); // 受け付けるURL
HttpListener listener = new HttpListener();
listener.Prefixes.Add(prefix); // プレフィックスの登録
listener.Start(); //スタート
while(true)
{
    HttpListenerContext context = listener.GetContext();

    HttpListenerRequest req = context.Request;
    HttpListenerResponse res = context.Response;
    var s = @&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;タイトル&lt;/title&gt;&lt;/head&gt;&lt;body&gt;hello&lt;/body&gt;&lt;/html&gt;&quot;;
    var content = System.Text.Encoding.UTF8.GetBytes(s);
    res.OutputStream.Write(content, 0, content.Length);
    res.Close();
}

 
 
</pre>
<ul>
<li>
HttpListenerオブジェクトを作成
</li>
<li>
Prefixesの追加及びStart()でサーバを開始
</li>
<li>
listener.GetContext()でリクエストを取得(リクエストが到着するまでブロック)
</li>
<li>
得られたコンテキストからHttpListenerRequest及びHttpListenerResponseを取得
</li>
<li>
応答文字列を作成し、返答し Close()
</li>
</ul>
<h2>WorkerRole との結合</h2>
<p>
以下のコードで結合してみた。
</p>
<pre class="prettyprint">
public override void Run()
{
    // This is a sample worker implementation. Replace with your logic.
    Trace.WriteLine(&quot;WorkerRole1 entry point called&quot;, &quot;Information&quot;);
    try
    {
        HttpServerInit();
    }
    catch (Exception ex)
    {
        Trace.WriteLine(&quot;Exception HttpServerInit &quot;, &quot;Information&quot;);
        Trace.WriteLine(ex.ToString() , &quot;Information&quot;);
        Trace.WriteLine(ex.StackTrace, &quot;Information&quot;);
    }

    while (true)
    {
        try
        {
            HttpServerProcess();
        }
        catch (Exception ex )
        {
            Trace.WriteLine(&quot;Exception HttpServerProcess &quot;, &quot;Information&quot;);
            Trace.WriteLine(ex.ToString(), &quot;Information&quot;);
            Trace.WriteLine(ex.StackTrace, &quot;Information&quot;);
        }

        Thread.Sleep(10000);
        Trace.WriteLine(&quot;Working&quot;, &quot;Information&quot;);
    }
}

HttpListener listener;
private void HttpServerInit()
{
    var port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[&quot;IronRubyHttp&quot;].IPEndpoint.Port;
    var prefix = string.Format(&quot;http://*:{0}/&quot;,port); // 受け付けるURL
    listener = new HttpListener();
    listener.Prefixes.Add(prefix); // プレフィックスの登録
    listener.Start();
}

private void HttpServerProcess()
{
    HttpListenerContext context = listener.GetContext();

    HttpListenerRequest req = context.Request;
    HttpListenerResponse res = context.Response;
    var s = @&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;タイトル&lt;/title&gt;&lt;/head&gt;&lt;body&gt;hello&lt;/body&gt;&lt;/html&gt;&quot;;
    var content = System.Text.Encoding.UTF8.GetBytes(s);
    res.OutputStream.Write(content, 0, content.Length);
    res.Close();
}

 
 
</pre>
<h3>結果</h3>
<p>
しかし、以下のコードで例外が発生し成功しない。
</p>
<pre class="prettyprint">
    try
    {
        HttpServerInit();
    }
    catch (Exception ex)
    {
        Trace.WriteLine(&quot;Exception HttpServerInit &quot;, &quot;Information&quot;);
        Trace.WriteLine(ex.ToString() , &quot;Information&quot;);
        Trace.WriteLine(ex.StackTrace, &quot;Information&quot;);
    }
 
 
</pre>
<h2>まとめ</h2>
<p>
WorkerRoleでHttpListenerを単純に使うわけにはいかないようである。
</p>
<h2>参考</h2>
<ul>
<li>
 
<a href="http://www.atmarkit.co.jp/fdotnet/dotnettips/695httplistener/httplistener.html"
>簡易Webサーバを実装するには？［2.0のみ、C#、VB］</a>
</li>
<li>
 
<a href="http://labs.unoh.net/2007/05/rackweb.html"
>RackでWebアプリのWebサーバー依存を無くす </a>
</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>C#とIronRubyのかけ橋 MutableString</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/cironruby-mutablestring.html" />
    <id>tag:www.m-tea.info,2009://1.58</id>

    <published>2009-12-31T13:11:12Z</published>
    <updated>2009-12-31T13:14:18Z</updated>

    <summary>IronRubyのMutableString固有のメソッド  IronRuby ...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>IronRubyのMutableString固有のメソッド </p>
<p>IronRuby と C#のバインディングを通じて、Azure上でホスティング出来ないか？を検討している。 </p>
<p>その中でIronRuby の文字列と .NET(C#)の文字列の間について気になったのでまとめておく。 </p>]]>
        <![CDATA[
<h2>MutableString</h2>
<p>
IronRubyのString実装は MutableStringと呼ばれるクラス(実装はC#)で作られている。
</p>
<p>
またIronRubyが.NET/DLR上で動作し、CLRのクラスライブラリとの親和性を考えると
内部表現は UCS-2表現となる。
</p>
<p>
しかし、Rubyの文字列は Ascii / いわゆるShiftJIS / EUC-JP / UTF-8 などを
自在に操る CSI である。
</p>
<p>
その為、IronRubyではこれらの間を吸収する MutableString を使い実現している。
</p>
<p>
参考までに IronPython はそのようなことはない。
</p>
<h2>C#とのつなぎこむ</h2>
<p>
どうしても Azureで IronRubyを利用すると考える場合、文字列の連結が必要となる。
</p>
<p>
主に、IISから来たデータ(主に.NET の String) を IronRuby へと、また逆
IronRubyからの応答を .NET の Stringに変換する事が必要となってくる。
</p>
<h3>.NETのStringを取得</h3>
<p>
MutableStringからどうしても .NETのStringが欲しくなる。この時どのようにするか。
</p>
<pre class="prettyprint">
str = &quot;ruby string&quot;
dotNetObject.Func(str.ToString())
 
 
</pre>
<h3>Byte配列</h3>
<p>
MutableStringからどうしても RubyのStringのバイト列が欲しくなる。この時どのようにするか。
</p>
<pre class="prettyprint">
str = &quot;ruby string&quot;
dotNetObject.Func(str.ToByteArray())
 
 
</pre>
<h3>.NET&lt;-&gt;IronRuby</h3>
<p>
.NETとIronRuby間で文字列変換を行う際にはこれらが必要となるので、覚えておく。
</p>
<h2>さいごに</h2>
<p>
バインディング部を C#ソースコードで行うか、Rubyソースコードで行うかによるが、
上記のメソッドは IronRuby特有のメソッドである。覚えておいて損はないと思う。
（得もないと思う）
</p>
]]>
    </content>
</entry>

<entry>
    <title>WorkerRoleへ外部から接続</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/workerrole.html" />
    <id>tag:www.m-tea.info,2009://1.57</id>

    <published>2009-12-31T02:25:01Z</published>
    <updated>2009-12-31T02:30:09Z</updated>

    <summary>AzureでIronRubyがホスティング出来ないかと作業中に、 WorkerR...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>AzureでIronRubyがホスティング出来ないかと作業中に、 WorkerRoleへ外部から接続する方法について挑戦したので、記録しておく。 </p>]]>
        <![CDATA[
<h2>外部からWorkerロールへの接続</h2>
<p>
最近、外部のインターネットから WorkerRole へ通信できるように出来るようになったらしい。
ということで、その方法を試してみる。
</p>
<h3>設定</h3>
<p>
ソリューションエクスプローラから、WorkerRoleを選択肢、そのプロパティ画面を開く。
</p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><img class="mt-image-none" alt="20091231_WorkerRole01.png" src="http://www.m-tea.info/image/2009/20091231_WorkerRole01.png" width="367" height="241" /></span>
<p>
そして、その中の「EndPoints」を選択しそこに外部から接続するポートを指定する。
</p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><img class="mt-image-none" alt="20091231_WorkerRole02.png" src="http://www.m-tea.info/image/2009/20091231_WorkerRole02.png" width="628" height="245" /></span>
<p>
設定した実際の例は以下のようになる。
</p>
<pre class="prettyprint">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;ServiceDefinition name=&quot;IronRubyHost&quot; xmlns=&quot;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&quot;&gt;
  &lt;WorkerRole name=&quot;WorkerRole1&quot;&gt;
(snip)
    &lt;Endpoints&gt;
      &lt;InputEndpoint name=&quot;IronRubyHttp&quot; protocol=&quot;tcp&quot; port=&quot;8080&quot; /&gt;
    &lt;/Endpoints&gt;
(snip)
  &lt;/WorkerRole&gt;
&lt;/ServiceDefinition&gt;
 
 
</pre>
<p>
今回は、IronRubyポーティング用のプロジェクトを用いて設定していたので、name=&quot;IronRubyHttp&quot;としているが、
名前は任意の物を指定できる。
</p>
<h3>コーディング</h3>
<p>
次に応答するプログラムを書いてみる。
</p>
<p>
以下のように書き、実行する。
</p>
<pre class="prettyprint">
public override void Run()
{
    Trace.WriteLine(&quot;WorkerRole1 entry point called&quot;, &quot;Information&quot;);

    var port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[&quot;IronRubyHttp&quot;].IPEndpoint.Port;

    var listner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    var listen = new IPEndPoint(IPAddress.Any, port);
    listner.Bind(listen);
    listner.Listen(1);

    while (true)
    {

        try
        {
            Socket socket = listner.Accept();
            var buff = System.Text.Encoding.ASCII.GetBytes(&quot;Hello&quot;);
            socket.Send(buff);
            socket.Close();
        }
        catch (Exception ex )
        {
            Trace.WriteLine(&quot;Exception HttpServerProcess &quot;, &quot;Information&quot;);
            Trace.WriteLine(ex.ToString(), &quot;Information&quot;);
            Trace.WriteLine(ex.StackTrace, &quot;Information&quot;);
        }

        Thread.Sleep(10000);
        Trace.WriteLine(&quot;Working&quot;, &quot;Information&quot;);
    }
}
 
 
</pre>
<h3>確認</h3>
<p>
telnet ソフトから Azureの 8080 ポートへ接続すると、 Hello が表示される。
</p>
<h3>ポート</h3>
<p>
注意しておきたいのは、
&lt;InputEndpoint name=&quot;IronRubyHttp&quot; protocol=&quot;tcp&quot; port=&quot;8080&quot; /&gt;で指定したポートは
外部インターネットと接続するポート番号であり、各ロールの待ち受け用の番号では
ないということである。各ロールで受ける際には、RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[&quot;IronRubyHttp&quot;].IPEndpoint.Port
のようにして行う。
</p>
<p>
この点を理解しなかったために、かなり手間取った。
</p>
<p>
イメージにすると以下のようになる。
</p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><img class="mt-image-none" alt="20091231_WorkerRole03.png" src="http://www.m-tea.info/image/2009/20091231_WorkerRole03.png" width="1218" height="651" /></span>
<h2>おわりに</h2>
<p>
このようにして外部との接続が可能となり、Tomcatなどを動かす事もできるようである。
</p>
<h2>参考</h2>
<ul>
<li>
 
<a href="http://d.hatena.ne.jp/machi_pon/20091209/1260330524"
>Azure上のテストコードの整理 ついでにWorkerRoleから起動したTomcatで、JDBCを使ってSQL Azureへ接続</a>
</li>
<li>
 
<a href="http://d.hatena.ne.jp/machi_pon/20091210/1260413975"
>Azure上で、WorkerRoleから任意のサーバーアプリケーションを起動する方法</a>
</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>Azure 上でログを記録する方法? </title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/azure.html" />
    <id>tag:www.m-tea.info,2009://1.56</id>

    <published>2009-12-30T13:53:45Z</published>
    <updated>2009-12-30T13:56:09Z</updated>

    <summary>Azureをデプロイし問題を解決していく時に必要な道具としてログがある。  今回...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>Azureをデプロイし問題を解決していく時に必要な道具としてログがある。 </p>
<p>今回、デプロイ後のログ収集について分かった事をメモとして残しておこうと思う。 </p>]]>
        <![CDATA[<h2>Azure上のログの取得方法</h2>
<h3>Diagnostic経由のログ</h3>
<p>
Azure上でログを取得する場合
</p>
<ul>
<li>
System.Diagnostics.Trace.WriteLine
</li>
<li>
System.Diagnostics.Trace.TraceInformation
</li>
</ul>
<p>
を利用した。このログは、Roleを実行しているVMの中に保存されている。
</p>
<p>
このログは単純には閲覧できないようである。
一つの方法は、ストレージへの転送を行うことで実現するらしい。
</p>
<h3>設定ファイル修正</h3>
<p>
ServiceConfiguration.cscfgの「name=&quot;DiagnosticsConnectionString&quot;」をAzure Storage に変更しておく。
以下のコードの次の項目は自分のアカウント情報に切り替える。
</p>
<ul>
<li>
AccountName=
</li>
<li>
AccountKey=
</li>
</ul>
<pre class="prettyprint">
&lt;ConfigurationSettings&gt;
  &lt;!-- &lt;Setting name=&quot;DiagnosticsConnectionString&quot; value=&quot;UseDevelopmentStorage=true&quot; /&gt;--&gt;
  &lt;Setting name=&quot;DiagnosticsConnectionString&quot;  value=&quot;DefaultEndpointsProtocol=https;AccountName=XXXXX;AccountKey=XXXXX&quot; /&gt;     
&lt;/ConfigurationSettings&gt;
 
 
</pre>
<h3>詳しい説明</h3>
<p>
<a href="http://microsoftpdc.com/Sessions/SVC15"
>Windows Azure Monitoring, Logging, and Management APIs</a>
に、PDC 09年の動画がある。
</p>
<p>
今回はそれを参考に設定した。
</p>
<h3>Diagnosticの設定</h3>
<p>
以下のコードを追加することで、
ストレージに転送される。
</p>
<pre class="prettyprint">
public override bool OnStart()
{
    DiagnosticMonitorConfiguration conf = DiagnosticMonitor.GetDefaultInitialConfiguration();
    conf.Directories.ScheduledTransferPeriod = TimeSpan.FromSeconds(2);
    conf.Logs.ScheduledTransferPeriod = TimeSpan.FromSeconds(2);
    // Set the maximum number of concurrent connections 
    ServicePointManager.DefaultConnectionLimit = 12;

    DiagnosticMonitor.Start(&quot;DiagnosticsConnectionString&quot;,conf);
 
 
</pre>
<h2>Storage用ツール</h2>
<p>
転送されたログを管理するために以下のストレージアクセスツールを見つけた。
ログの転送には、前者のを利用する方がいいと思う。
（僕はこちらを利用している）
</p>
<ul>
<li>
　
<a href="http://www.cerebrata.com/Products/CloudStorageStudio/Default.aspx"
>Cloud Storage Studio</a>
</li>
</ul>
<ul>
<li>
　
<a href="http://azurestorageexplorer.codeplex.com/"
>Azure Storage Explorer</a>
</li>
</ul>
<h2>さいごに</h2>
<p>
問題解決に向けて、事実の把握は重要である。その一つとしてログがあるが、このログの確認について、
ここでは書いてみた
</p>
<h2>参考</h2>
<h3>WEB</h3>
<ul>
<li>
　
<a href="http://microsoftpdc.com/Sessions/SVC15"
>Windows Azure Monitoring, Logging, and Management APIs</a>
</li>
<li>
　
<a href="http://kame-taro.spaces.live.com/blog/cns!CD806281181610EF!1447.entry"
>Azureにデプロイしたらロールステータスが　Initializing ? Busy ? Stopping ?のループで一向に Readyにならない</a>
</li>
</ul>
<h3>書籍</h3>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" border="0"></a>
]]>
    </content>
</entry>

<entry>
    <title>[速報]AzureからIronRubyを起動(疎通確認)</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/azureironruby.html" />
    <id>tag:www.m-tea.info,2009://1.55</id>

    <published>2009-12-28T11:43:28Z</published>
    <updated>2009-12-28T16:45:19Z</updated>

    <summary>AzureのWebRole と IronRuby RC1 のつなぎこみが出来たの...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>AzureのWebRole と IronRuby RC1 のつなぎこみが出来たのでうれしくなってスクリーンショットを取った </p>]]>
        <![CDATA[<h2>証拠写真</h2><a href="http://photozou.jp/photo/show/291813/31078035"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="2009年12月28日現在のIronRubyとAzureのつなぎこみ" src="http://art19.photozou.jp/pub/813/291813/photo/31078035.jpg" width="450" height="281" /></a><br /><a href="http://photozou.jp/photo/show/291813/31078035">2009年12月28日現在のIronRubyとAzureのつなぎこみ</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> 
<p></p>
<h2>挙動</h2>
<p>とりあえず、ステージング環境にデプロイした。 </p>
<p>そのＵＲＬの最後の拡張子を.rbにすると「hello I'm IronRuby.」と返答をする。 </p>
<p>暫定的にURLをさらしておく。 http://　（公開終了）　.cloudapp.net/xxx.rb　</p>
<p><strike>(12/18日限定です。) </strike>(公開終了しました) </p>
<h2>おわりに</h2>
<p>これから、分かった事を記録していこうと思う。 </p>]]>
    </content>
</entry>

<entry>
    <title>Windows Azure 体験5</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/windows-azure-5.html" />
    <id>tag:www.m-tea.info,2009://1.54</id>

    <published>2009-12-25T12:48:59Z</published>
    <updated>2009-12-25T12:51:19Z</updated>

    <summary>前回はTABLEについて書いてみた。今回はQUEUEについて書いてみる。  前回...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>前回はTABLEについて書いてみた。今回はQUEUEについて書いてみる。 </p>
<p>前回同様書籍をベースにいろいろと挑戦してる。書籍を元に記載しているので、若干説明足らずである。その辺は、ご了承いただきたい。 </p>
<p>ただ、今回は非常に順調に進んだのでうれしい。 </p>]]>
        <![CDATA[<h2>Queue</h2>
<p>
Azure Storage は次の3つがあるようである
</p>
<ul>
<li>
Table
</li>
<li>
Blob
</li>
<li>
Queue
</li>
</ul>
<p>
今回は「Queue」について挑戦してみた。
</p>
<h3>Queueとは？</h3>
<p>
一般的なキュー等については、
<a href="/2009/12/post-8.html"
>以前のBLOG記事</a>
に記載した。
</p>
<p>
しかし、Azureのキューは必ずFIFOではないようである。
また、Azure StorageのQueueの説明に MSMQ(Microsoft Message Queuing)みたいなものと
説明があった。実際に MSMQを知らないので、こちらも勉強が必要だ。
</p>
<h3>登場したクラス</h3>
<ul>
<li>
メッセージ
<br/>CloudQueueMessageはキューに詰め込むメッセージクラスであり、文字列またはバイト列を含む。
</li>
<li>
キュー
<br/>CloudQueueは、ロール間の通信路を示すクラスである
</li>
</ul>
<h3>実装</h3>
<ul>
<li>
キューの生成
</li>
</ul>
<pre class="prettyprint">
static CloudQueue GetQueue()
{
    var account = CloudStorageAccount.FromConfigurationSetting(&quot;DataConnectionString&quot;);
    var client = account.CreateCloudQueueClient();
    var queue = client.GetQueueReference(&quot;thumbnailsqueue&quot;);
    return queue;
}
protected void CreqteQueue()
{
    GetQueue().CreateIfNotExist();
}
 
 
</pre>
<p>
以上のようにして、以下のPage_Initなどでキューを生成した
</p>
<pre class="prettyprint">
void Page_Init(object sender, EventArgs e)
{
    CreateBlob();
    CreqteQueue();
}
 
 
</pre>
<ul>
<li>
キューへの追加
</li>
</ul>
<pre class="prettyprint">
var uniqBlobName = string.Format(&quot;img_{0}_{1}.jpg&quot;,
    DateTime.UtcNow.ToString(&quot;yyyyMMddHHmmss&quot;),
    Guid.NewGuid().ToString());

var container = blobStorage.GetContainerReference(@&quot;photo&quot;);
var block = container.GetBlockBlobReference(uniqBlobName);
var s = Converter.ConvertToAsciiOnlyString(TitleTextBox.Text);
block.Metadata[&quot;title&quot;] = Converter.ConvertToAsciiOnlyString(TitleTextBox.Text);
block.UploadFromStream(FileUpload1.FileContent);

var queue = GetQueue();
var message = new CloudQueueMessage(uniqBlobName);
queue.AddMessage(message);
 
 
</pre>
<p>
上記のようにして、BLOBに追加した後、キューをGetQueue()で取得し、
そのキューにCloudQueueMessageのインスタンスを追加した。
なおCloudQueueMessageには、uniqBlobNameを渡した。
</p>
<ul>
<li>
キューからメッセージの取得
<br/>ワーカーロールを作成し、その中でキューの取得を行った。
<br/>OnStart で RoleEnvironment.Changing += RoleEnvironmentChanging;
<br/>のコメントアウトとRoleEnvironmentChangingのコメントアウト。
<br/>あと#region Setup CloudStorageAccount Configuration Setting Publisherから#endregion
<br/>までを追加
</li>
</ul>
<pre class="prettyprint">
public override bool OnStart()
{
    // Set the maximum number of concurrent connections 
    ServicePointManager.DefaultConnectionLimit = 12;

    DiagnosticMonitor.Start(&quot;DiagnosticsConnectionString&quot;);

    // For information on handling configuration changes
    // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
    //RoleEnvironment.Changing += RoleEnvironmentChanging;

    #region Setup CloudStorageAccount Configuration Setting Publisher

    // This code sets up a handler to update CloudStorageAccount instances when their corresponding
    // configuration settings change in the service configuration file.
    CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =&gt;
    {
        // Provide the configSetter with the initial value
        configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));

        RoleEnvironment.Changed += (sender, arg) =&gt;
        {
            if (arg.Changes.OfType&lt;RoleEnvironmentConfigurationSettingChange&gt;()
                .Any((change) =&gt; (change.ConfigurationSettingName == configName)))
            {
                // The corresponding configuration setting has changed, propagate the value
                if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
                {
                    // In this case, the change to the storage account credentials in the
                    // service configuration is significant enough that the role needs to be
                    // recycled in order to use the latest settings. (for example, the 
                    // endpoint has changed)
                    RoleEnvironment.RequestRecycle();
                }
            }
        };
    });
    #endregion

    return base.OnStart();
}

//private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
//{
//    // If a configuration setting is changing
//    if (e.Changes.Any(change =&gt; change is RoleEnvironmentConfigurationSettingChange))
//    {
//        // Set e.Cancel to true to restart this role instance
//        e.Cancel = true;
//    }
//}
 
 
</pre>
<ul>
<li>
初期化処理
<br/>CreateBlob();やCreqteQueue();を行いストレージの設定を行う。
<br/>さらにqueue = GetQueue();でキューを取得する
</li>
</ul>
<pre class="prettyprint">
public override void Run()
{
    // This is a sample worker implementation. Replace with your logic.
    Trace.WriteLine(&quot;PhotList_WorkerRole entry point called&quot;, &quot;Information&quot;);
    CreateBlob();
    CreqteQueue();
    var queue = GetQueue();

    while (true)
    {
        Thread.Sleep(10000);
        Trace.WriteLine(&quot;Working&quot;, &quot;Information&quot;);

    }
}
 
 
</pre>
<ul>
<li>
メッセージ処理
<br/>queue = GetQueue();で取得したキューからメッセージを取得し処理をする
</li>
</ul>
<pre class="prettyprint">
    while (true)
    {
        Thread.Sleep(10000);
        Trace.WriteLine(&quot;Working&quot;, &quot;Information&quot;);

        var message = queue.GetMessage();
        if (message != null)
        {
            try
            {
                var name = message.AsString;
                System.Diagnostics.Trace.TraceInformation(string.Format(&quot;{0}&quot;, name));
                var container = blobStorage.GetContainerReference(&quot;photo&quot;);
                var imageBlob = container.GetBlobReference(name);
                var stream = new System.IO.MemoryStream();
                imageBlob.DownloadToStream(stream);
                var thumbnailStream = CreateThumbnail(stream);


                var thumbnailContainer = blobStorage.GetContainerReference(&quot;thumbnail&quot;);
                var thumbnailBlob = thumbnailContainer.GetBlobReference(name );
                thumbnailBlob.UploadFromStream(thumbnailStream);

            }
            catch
            {
            }
            finally
            {
                queue.DeleteMessage(message);
            }
        }
    }
 
 
</pre>
<p>
処理が終わったらqueue.DeleteMessage(message);を行い、キューからメッセージを削除する。
これを行わないと、キューからメッセージが削除されず、再起動したときなどは再度配信される。
</p>
<ul>
<li>
BLOB一覧の取得
<br/>サムネールが存在したら、サムネールのＵＲＬ、もし存在しなければ本来のイメージのＵＲＬを取得する
<br/>コードを書いてみた。
</li>
</ul>
<pre class="prettyprint">
private Uri GetUrl(CloudBlob blob)
{
    var container = blobStorage.GetContainerReference(@&quot;thumbnail&quot;);
    var filename = System.IO.Path.GetFileName(blob.Uri.AbsolutePath);
    var thumbnailBlob = container.GetBlobReference(filename);
    var isExist = container.ListBlobs().ToList().Find(item =&gt; { return (System.IO.Path.GetFileName(item.Uri.AbsolutePath) == filename); });
    if (isExist != null)
    {
        return thumbnailBlob.Uri;
    }
    return blob.Uri;
}
 
 
</pre>
<h2>はまった点</h2>
<p>
基本的に、はまるポイントは少なく、すんなりといった。
</p>
<p>
ちょっとあっけなかった。
</p>
<h2>さいごに</h2>
<p>
とりあえず、キューを用いてバッググラウンドでサムネール作成処理ができるようになった。
</p>
<p>
この後は、再度デプロイして、このAzure入門体験は終わりにしたい。
</p>
<h2>参考書籍</h2>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" border="0"></a>
]]>
    </content>
</entry>

<entry>
    <title>Windows Azure 参考情報LINK(2009/12/25)</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/windows-azure-link20091225.html" />
    <id>tag:www.m-tea.info,2009://1.53</id>

    <published>2009-12-25T03:16:13Z</published>
    <updated>2009-12-25T03:17:47Z</updated>

    <summary>いろいろAzure関連を調査するに当たりオンラインの情報を参考に進めてきた。  ...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>いろいろAzure関連を調査するに当たりオンラインの情報を参考に進めてきた。 </p>
<p>先人の方の情報に感謝しつつ、自分の備忘録、皆様への参考になればと思い、記載しておく。 </p>]]>
        <![CDATA[
<h2>Azure関連のブログ</h2>
<p>
以下のブログを参考にさせていただきました。
</p>
<ul>
<li>
 
<a href="http://blogs.itmedia.co.jp/isago/"
>Azureの鼓動</a>
</li>
<li>
 
<a href="http://kame-taro.spaces.live.com/"
>かめスペース</a>
</li>
<li>
 
<a href="http://d.hatena.ne.jp/odashinsuke/"
>お だ のスペース</a>
</li>
<li>
 
<a href="http://d.hatena.ne.jp/waritohutsu/"
>waりとnaはてな日記</a>
</li>
<li>
 
<a href="http://d.hatena.ne.jp/akiramei/"
>匣の向こう側 - あまりに.NETな</a>
</li>
</ul>
<p>
また以下の記事も同様に参考にさせていただいております。
</p>
<ul>
<li>
 
<a href="http://d.hatena.ne.jp/odashinsuke/20091129/1259463673"
>Azure Storage への接続方法が変わったので紹介します</a>
</li>
<li>
 
<a href="http://www.slideshare.net/VSUG/windows-azure-programming-2655035"
>Windows Azure Programming</a>
</li>
<li>
 
<a href="http://www.atmarkit.co.jp/fdotnet/dnfuture/winazurestorage_01/winazurestorage_01_01.html"
>初めてのWindows Azureテーブル・ストレージ開発</a>
</li>
</ul>
<h2>おわりに</h2>
<p>
自分の情報も有用になればとおもいますし、そうなるように頑張っていきます。
</p>
<h2>参考書籍</h2>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" border="0"></a>
]]>
    </content>
</entry>

<entry>
    <title>Windows Azure 体験4</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/windows-azure-4.html" />
    <id>tag:www.m-tea.info,2009://1.52</id>

    <published>2009-12-24T14:35:35Z</published>
    <updated>2009-12-24T14:40:59Z</updated>

    <summary>前回はBLOBについて書いてみた。今回はTABLEについて書いてみる。  前回同...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="Azure" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>前回はBLOBについて書いてみた。今回はTABLEについて書いてみる。 </p>
<p>前回同様書籍をベースにいろいろと挑戦してる。書籍を元に記載しているので、若干説明足らずである。その辺は、ご了承いただきたい。 </p>]]>
        <![CDATA[<h2>TABLE</h2>
<p>Azure Storage は次の3つがあるようである </p>
<ul>
<li>Table </li>
<li>Blob </li>
<li>Queue </li></ul>
<p>今回は「table」について挑戦してみた。 </p>
<h3>TABLEとは？</h3>
<p>表形式の一種で以下の3つで構成されている </p>
<ul>
<li>プロパティ <br />データベースでいうところのフィールドに相当 </li>
<li>エンティティ <br />プロパティの集合で、データベースでいうところのレコードに相当 </li>
<li>テーブル <br />エンティティの集合で、データベースでいうところのテーブルに相当 </li></ul>
<h3>それぞれのクラス</h3>
<ul>
<li>プロパティとエンティティ <br />エンティティは TableStorageEntity 継承でつくり、その中にプロパティが含まれる </li>
<li>コンテキスト <br />TableStorageDataServiceContextを継承して作り、主に「ストレージサービスとの接続(?)の管理」と「エンティティ集合の返却」を責務としてもつ。 </li>
<li>データソース <br />（絶対必要ではなさそうだが）コンテキストの保持や検索クエリの隠蔽を行い、Table利用者はこのクラスを用いてやり取りをする。 </li></ul>
<h3>実装</h3>
<ul>
<li>TableStorageEntity </li></ul><pre class="prettyprint">public class CommentItem : TableServiceEntity
{
    public string Message { get; set; }
    public string Name { get; set; }
    public string GuestName { get; set; }
    public CommentItem()
    {
        RowKey = string.Format("{0:10}_{1}",
            DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks,
            Guid.NewGuid());
    }
    public CommentItem( string name )
    {
        PartitionKey = name;
        RowKey = string.Format("{0:10}_{1}", 
            DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks, 
            Guid.NewGuid());
    }
}
 
 
</pre>
<ul>
<li>TableStorageDataServiceContext </li></ul><pre class="prettyprint">public class CommentItemContext : TableServiceContext
{
    public CommentItemContext(string baseAddress, StorageCredentials credentials)
        : base(baseAddress, credentials) { }
    public IQueryable&lt;CommentItem&gt; CommentItems
    {
        get { return this.CreateQuery&lt;CommentItem&gt;("CommentItems"); }
    }
}
 
 
</pre>
<ul>
<li>データソース </li></ul><pre class="prettyprint">public class Comments
{
    private CommentItemContext context;
    static Comments()
    {
        //TableClient作成
        var setting = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
        var cloudTableClient = setting.CreateCloudTableClient();
        cloudTableClient.CreateTableIfNotExist("CommentItems");
    }
    public Comments()
    {
        var setting = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
        this.context = new CommentItemContext(
            setting.TableEndpoint.AbsoluteUri,
            setting.Credentials);
        this.context.RetryPolicy = RetryPolicies.Retry(3,TimeSpan.FromSeconds(1));
    }
    public IEnumerable&lt;CommentItem&gt; Select(string name)
    {
        var query = from e in this.context.CommentItems
                    where e.PartitionKey == name
                    select e;
        return query;
    }
    public void Add(CommentItem item)
    {
        this.context.AddObject("CommentItems", item);
        this.context.SaveChanges();
    }
}
 
 
</pre>
<h2>はまった点</h2>
<h3>テーブルの作成</h3>
<p>テーブルの作成として以下のような例があった。 </p><pre class="prettyprint">CloudTableClient.CreateTablesFromModel(
    typeof(CommentItem),
    setting.TableEndpoint.AbsoluteUri,
     setting.Credentials);
 
 
</pre>
<p>実際、ハンズオンのソース等も参考にすると上記でよさそうであるが、なぜかこの方法だと、Selectなどで失敗するケースが出てきたので以下のコードを使った </p><pre class="prettyprint">//TableClient作成
var setting = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
var cloudTableClient = setting.CreateCloudTableClient();
cloudTableClient.CreateTableIfNotExist("CommentItems");
 
 
</pre>
<h3>引数なしのコンストラク(TableServiceEntity)</h3><pre class="prettyprint">public CommentItem()
{
    RowKey = string.Format("{0:10}_{1}",
        DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks,
        Guid.NewGuid());
}
public CommentItem( string name )
{
    PartitionKey = name;
    RowKey = string.Format("{0:10}_{1}", 
        DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks, 
        Guid.NewGuid());
}
 
 
</pre>
<p>最初、引数ありのコンストラクタしか用意していなかった。しかし、フレームワーク内で引数なしのコンストラクタも呼び出すようで、引数なしコンストラクタがない場合エラーが発生していた。 </p>
<p>最初エラーの原因が分からなかったが、よく見ると引数なしコンストラクタが必要という事で、こちらを追加して対処した。 </p>
<h3>フィールドに日本語が追加できない</h3>
<p>以下のコードでテーブルにエンティティを追加できるが、エンティティの中に日本語が含まれていると SaveChanges();で例外が発生した。 </p><pre class="prettyprint">public void Add(CommentItem item)
{
    this.context.AddObject("CommentItems", item);
    this.context.SaveChanges();
}
 
 
</pre>
<p>仕方がないので、利用者サイドでUTF-8+BASE64で保存するようにした。 </p>
<h2>利用者サイド</h2>
<h3>登録部分</h3><pre class="prettyprint">protected void SendButton_Click(object sender, EventArgs e)
{
    var name = Request.QueryString["name"];
    var commentItem = new CommentItem(name);
    commentItem.Name = name;
    commentItem.Message = Converter.ConvertToAsciiOnlyString( CommentTextBox.Text );
    commentItem.GuestName = Converter.ConvertToAsciiOnlyString(AutherTextBox.Text);

    var comments = new Comments();
    comments.Add(commentItem);
    Refresh();
}
 
 
</pre>
<p>登録部分では、CommentItem(TableServiceEntity)のインスタンスを生成し、そのインスタンスにプロパティを設定した。登録の為にデータソースであるCommentsのAddを用いて保存した。 </p>
<p>なお、この時CommentItemに日本語を保存するときには、UTF-8+Base64で変換して保存している。 </p>
<h3>取得部分</h3>
<p>また、取得部分で以下のようにした。 </p><pre class="prettyprint">private void Refresh()
{
    var name = Request.QueryString["name"];
    var comments = new Comments();
    CommentList.DataSource = comments.Select(name).ToList().Select(item=&gt;{
        item.GuestName = Converter.ConvertFromoAsciiOnlyString(item.GuestName);
        item.Message = Converter.ConvertFromoAsciiOnlyString(item.Message);
        return item;
    });
    CommentList.DataBind();
}
 
 
</pre>
<h2>設計ポイント</h2>
<p>TableServiceEntityのPartitionKeyとRowKeyが重要そうである。 DBMSの主キーであったりインデックスに相当する役割を持っているみたいである。 </p>
<ul>
<li>検索キー <br />検索キーとしてPartitionKeyを使う。この分散がしっかりできているとスケールアウトする </li>
<li>オーダーキー <br />検索した結果はRowKey順で取得できる。そのため、order by 相当がこのRowKeyに相当する <br />と思ってもよい。 </li></ul>
<p>この設計ポイントは、いろいろ考察が必要そうである。 </p>
<h2>さいごに</h2>
<p>これで、何とかテーブルに各画像のコメントが追加できるようになった。 </p>
<p>次回は、キューについて記載ができたらいいな... </p>
<h2>参考書籍</h2><a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img border="0" src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" /></a> ]]>
    </content>
</entry>

<entry>
    <title>2009年FITEA忘年会</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/2009fitea.html" />
    <id>tag:www.m-tea.info,2009://1.51</id>

    <published>2009-12-24T12:53:21Z</published>
    <updated>2009-12-24T12:57:38Z</updated>

    <summary>福井情報技術者協会[FITEA] の忘年会が12/22に行われた。  参加者の皆...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="その他" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p><a href="http://fitea.org/">福井情報技術者協会[FITEA]</a> の忘年会が12/22に行われた。 </p>
<p>参加者の皆さまありがとうございました。 </p>]]>
        <![CDATA[<h2>プレゼント交換会＋ＬＴ</h2>
<p>去年も行ったが、プレゼント交換会が行われた。また自己紹介＋来年の抱負というのが去年のやり方だったが、今回はＬＴも含まれた。 </p>
<p>ＬＴということで、いろいろと話が聞けて面白かった。 </p>
<p>お酒が少し入っていたので全てを覚えているわけではないが </p>
<ul>
<li>不動産の選び方ＦＡＱ </li>
<li>落語風ＩＴ小話（自分） </li>
<li>マッサージについて </li>
<li>制約条件理論について </li>
<li>Amazon EC2などのアマゾンのクラウドサービスについて </li></ul>
<p>等があった。すいません、忘れてた人がおりましたらごめんなさい。 </p>
<h2>落語風IT小話</h2>
<p>一応、話の元は「 <a href="http://ja.wikipedia.org/wiki/%E5%AF%BF%E9%99%90%E7%84%A1">寿限無</a> 」これをパロッテ、最近の流行り技術をダレツした小話風に仕上げる。 </p>
<ul>
<li>Azure <br />いわずとしれた Mirosoft のクラウドサービス Windows Azure </li>
<li>App Engine <br />いわずとしれた Google のクラウドサービス Google App Engine </li>
<li>クラウドサービス <br />スケールアウトを目指したWebサービス </li>
<li>再起 <br />再帰呼び出し。関数型言語で大好きなの </li>
<li>関数型 <br />関数がファーストクラスオブジェクトである関数型言語の一言 </li>
<li>メソッドチェーン <br />関数型言語、Ruby、最近ではC#でも使われている記述方式 </li>
<li>MapReduce <br />並列処理の処理概念の１つ </li>
<li>Chrome <br />Google が実現する高速、安全、最先端のテクノロジーとシンプルさで快適なブラウザ。 </li>
<li>Android <br />Google が提供する iPhone みたいなスマートフォン </li></ul>
<p>これをダレツしたプロジェクト名を作る。 </p>
<p>このプロジェクトが進み、なぜかウォーターフォール開発を行い、設計フェーズ完了時点のフェーズ移行判定会議で「AzureAzureApp Engineクラウドサービス再起再起の関数型メソッドチェーンMapReduceでChromeなAndroid」とみんなで連呼して、問題解決に向かう時点で「既に、既に実装フェーズのフェーズ移行判定会議になりました」というサゲを目指した。 </p>
<p>ちなみに、練習時間の不足（車の中で1時間程度）であったため、まともにできず自沈してしまった。 </p><a href="http://photozou.jp/photo/show/291813/30929303"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="ＬＴ用スケッチブック" src="http://art17.photozou.jp/pub/813/291813/photo/30929303.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30929303">ＬＴ用スケッチブック</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> <br /><a href="http://photozou.jp/photo/show/291813/30929315"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="ＬＴその１" src="http://art18.photozou.jp/pub/813/291813/photo/30929315.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30929315">ＬＴその１</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> <br /><a href="http://photozou.jp/photo/show/291813/30929333"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="ＬＴその２" src="http://art21.photozou.jp/pub/813/291813/photo/30929333.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30929333">ＬＴその２</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> <br /><a href="http://photozou.jp/photo/show/291813/30929352"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="ＬＴその３" src="http://art18.photozou.jp/pub/813/291813/photo/30929352.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30929352">ＬＴその３</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> <br /><a href="http://photozou.jp/photo/show/291813/30929367"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="ＬＴその４" src="http://art22.photozou.jp/pub/813/291813/photo/30929367.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30929367">ＬＴその４</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> <br /><a href="http://photozou.jp/photo/show/291813/30929383"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="ＬＴその５" src="http://art22.photozou.jp/pub/813/291813/photo/30929383.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30929383">ＬＴその５</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> <br />
<h3>頂いたプレゼント</h3>
<p><a href="http://photozou.jp/photo/show/291813/30930186"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="プレゼント交換" src="http://art20.photozou.jp/pub/813/291813/photo/30930186.jpg" width="239" height="179" /></a><br /><a href="http://photozou.jp/photo/show/291813/30930186">プレゼント交換</a> posted by <a href="http://photozou.jp/user/top/291813">(C)k1ha410</a> </p>
<p>ありがとうございました。</p>
<h2>おわりに</h2>
<p>みなさん、ありがとうございました。来年もよろしくお願いします。 </p>]]>
    </content>
</entry>

<entry>
    <title>ARM アセンブラで YUV422 -&gt; RGB 変換を(未完)</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/arm-yuv422---rgb.html" />
    <id>tag:www.m-tea.info,2009://1.50</id>

    <published>2009-12-21T14:17:50Z</published>
    <updated>2009-12-21T14:31:02Z</updated>

    <summary>今日は、ARM CPUで出来るだけ計算を沢山行い、 ARM CPU自身の機能をし...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="コンピュータ" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プログラム" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>今日は、ARM CPUで出来るだけ計算を沢山行い、 ARM CPU自身の機能をしゃぶりつくすことについて書いてみる。 </p>]]>
        <![CDATA[<h2>きっかけ</h2>
<p>twitterのつぶやきに、YUV422からRGB565への変換が遅いというのが、この記事を書くきっかけになった。 </p>
<p>元のコードは高級言語で書かれているようである。 </p>
<h3>チューニング案</h3>
<ul>
<li>コンパイラの最適化を借りる <br />この方法が順当である。ポータビリティも上がり非常に良い。 </li>
<li>カリカリのアセンブラチューニング <br />ふつうはしない。 </li></ul>
<p>今回は後者を行ってみる </p>
<h2>対象ターゲットはARM</h2>
<p>その前に ARM CPU についての詳細は wikipedia 等を参照してもらうとして主な特徴は </p>
<ul>
<li>32bit RISC CPU </li>
<li>16本の32bit汎用レジスタ </li>
<li>組込み向け/省電力向け用 </li></ul>
<p>となり、最近では携帯電話やポータブルゲーム機等にも採用されている。 </p>
<h3>ALU周り</h3>
<p>今回、計算処理について語りたい。計算処理ということでALU周りについて書いておく。 </p>
<p>ARMのALUは メインとなるALU 以外に、前段にパラレルシフタを配置している。 </p>
<p>&nbsp;</p>
<p>
<p><img class="mt-image-none" alt="20091221_ARM.png" src="http://www.m-tea.info/image/2009/20091221_ARM.png" width="464" height="563" /></p>
<p>&nbsp;</p>
<p>いきなりではあるが、以下のコードを書いたとする </p>
<p></p><pre class="prettyprint">ADD R0,R1,R2
ADD R3,R4,R5, LSL #2
 
 
</pre>
<ul>
<li>最初の命令は R1 と R2 の値を足して R0 に代入 <br />先ほどの図で示すと、Rn が R0 , Rm と R1 , R2 と Rp と対応する。 <br />（この時のパラレルシフタは無視してください） </li>
<li>次の命令は R5の値を左に#2ビットシフトして、R4 の値を足して R3 に代入 <br />先ほどの図で示すと、R5 が Rp と対応しており、# が 2 となる。さらにR4がRmと対応して <br />RnがR3と対応する。 </li></ul>
<p>
これを踏まえると、ある値がR1にありそれを5倍するとき以下の1命令で済む
</p>
<pre class="prettyprint">
ADD R1,R1,R1, LSL #2
 
 
</pre>
<p>
R1を左に2ビットシフトして、それをR1と足し、さらにそれを R1 に入れる
つまり R1 &lt;- R1 + (R1 &lt;&lt; 2) となる。
</p>
<h2>YUV422からRGBへの変換</h2>
<h3>変換式</h3>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
R = 1.000Y          + 1.402V
G = 1.000Y - 0.344U - 0.714V
B = 1.000Y + 1.772U
 
 
</pre>
<p>
以上の変換式が一般的な変換式のようである。
</p>
<h3>ARMへの対応と最適化</h3>
<p>
本来だと浮動小数点を用い計算を行うが、最適化の為に以下のように考えてみる。
</p>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
R = 1.000Y           + 1.5V
G = 1.000Y - 0.375U  - 0.75V
B = 1.000Y + 1.75U 
 
 
</pre>
<p>
変更点は
</p>
<ul>
<li>
1.402V を 1.5V へ
</li>
<li>
0.344U を 0.375U へ
</li>
<li>
0.714V を 0.75V へ
</li>
<li>
1.772U を  1.75U へ
</li>
</ul>
<p>
この変更を行い、最適化を行っている。
</p>
<p>
ちなみに
</p>
<ul>
<li>
1.5V = (Vx2 + V) / 2  = 3V/2
</li>
<li>
0.375U = (Ux2+U)/8    = 3U/8
</li>
<li>
0.75V  = (Vx4+Vx2)/8  = 6V/8
</li>
<li>
1.75U = (Ux4+Ux2)/8 +U = 6U/8 + U
</li>
</ul>
<p>
となり、基本的に２のべき乗と足し算、２のべき乗の割り算で出来るようにした。
なお、1.772U を  1.75U は乱暴のような気がする。57/32 = 1.78 という案もあるが、
この場合、57を作るのに(32+16+8+1)のように多項式が増える。
</p>
<h3>実装</h3>
<p>
まずは 1.5V を作ってみる
例えば、R6にVがあり、R0に1.5V を代入するとすると
</p>
<pre class="prettyprint">
ADD R1,R6,R6,LSL #1
MOV R0,R1,LSR #1
 
 
</pre>
<p>
という2命令になる。なおこの1命令は見かけ上1クロックで動くため、2クロックで変換できる。
</p>
<p>
もし R7 に Y が入っており、R8にRだとすると
</p>
<pre style="BORDER-BOTTOM: #00f 2px solid; BORDER-LEFT: #00f 2px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; BACKGROUND: #ffa; COLOR: #000; OVERFLOW: auto; BORDER-TOP: #00f 2px solid; BORDER-RIGHT: #00f 2px solid; PADDING-TOP: 2px">
R = 1.000Y           + 1.5V
 
 
</pre>
<p>
は
</p>
<pre class="prettyprint">
ADD R1,R6,R6,LSL #1
MOV R0,R1,LSR #1
ADD R8,R7,R0
 
 
</pre>
<p>
となる。
</p>
<p>
ここで１つ。
</p>
<pre class="prettyprint">
ADD R1,R6,R6,LSL #1
ADD R8,R7,R1,LSR #1
 
 
</pre>
<p>
とすると2命令で済む。
ちなみに、この命令削減は...640x400の画像だと256000命令削減できる。
</p>
<h3>続き</h3>
<p>
このような手法でやっていくと最適化されたものができる。
この続きは流石に実機がないとつらい。(SheevaPlug持ってるけど)
</p>
<h2>さいごに</h2>
<p>
アセンブラでARM CPU を触りこむ場合、上記の事を踏まえるとより
高速になるかもしれない。
</p>
<p>
ふつうは、コンパイラの最適化を期待してください。
</p>
<h2>参考文献</h2>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f1393741%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f11018022%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f7898%2f78983357.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f7898%2f78983357.jpg%3f_ex%3d80x80" border="0"></a>
]]>
    </content>
</entry>

<entry>
    <title>Google App Engine は PaaS ,  AzureもPaaS?</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/google-app-engine-paas-azurepaas.html" />
    <id>tag:www.m-tea.info,2009://1.49</id>

    <published>2009-12-20T05:02:37Z</published>
    <updated>2009-12-20T08:13:35Z</updated>

    <summary>クラウドを見つつサービス提供について考える事が多い。クラウドについては 昨日ちょ...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="コンピュータ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>クラウドを見つつサービス提供について考える事が多い。クラウドについては <a href="http://www.m-tea.info/2009/12/post-12.html">昨日ちょっと書いた</a> が、新たな発見をした。 </p>
<p>昨日 <a href="http://blog.cnu.jp/2009/12/19/gaej/">GAE/J開発前に知っておくべき事</a> を読んでハッとした事があったのでまとめておく。主に、スケールアウトの実現方法と課金について、少し考えさせられたので、記載しておく。 </p>]]>
        <![CDATA[<p>
いきなりであるが、制約が何のためか考えてみた。
</p>
<h2>Google App Engine の制約は何のため？</h2>
<p>
Google App Engine には様々な制約がある。
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6179860%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13272743%2f" target="_blank">Google App Engine for Java「実践」クラウドシステム構築</a>
では以下の種類分けをして記述していた
</p>
<ul>
<li>
Quota
<br/>CPU時間や帯域など。課金で増減できたり、課金しても増減できないものに分離れてる。
</li>
<li>
Limit
<br/>スケールできない固定的な値。
</li>
</ul>
<p>
これが以下の項目にそれぞれかかってきているようである。
</p>
<ul>
<li>
サービスAPIの制約
<br/>APIの挙動によって、Quotaがあったり、Limtがあったりする。
</li>
<li>
リクエスト/レスポンスに対する制約
<br/>リクエスト・レスポンス共に制約がある。例えば30秒以内に応答の必要があるなど
</li>
</ul>
<p>
つまり、普通のシステムに比べ、「時間的制約」「容量的制約」「呼び出せないＡＰＩの制約」が
厳しくある。
</p>
<h3>なんの為の制約？</h3>
<p>
何らかの理由があり制約があると考えている。いや「ただなんとなく」だと、何も言えなくなるが。
</p>
<p>
では何故制約が必要か？
</p>
<ul>
<li>
スケールアウトを阻害するから
<br/>大きな制約の理由はこれだと思う。スケールアウトできなくなるから！
</li>
<li>
ビジネスの側面の理由
<br/>クラウドサービスは、コンピュータリソースをサービスとして時間貸しすることにあるので、貸した以上対価が必要。
</li>
</ul>
<p>
このような事を考えてみた。
</p>
<h3>制約があってこその自由</h3>
<p>
以前
<a href="/2009/12/post-7.html"
>プリミティブスレッドを使わない並列処理に向けて</a>
で、制約があってこその自由等と叫んでみたが、
Google App Engine の制約は我々に自由を与えてくれるのか？
</p>
<h3>大きな誤解、制約から得られる自由</h3>
<p>
リクエストに対する応答を30秒にしなきゃいけない、全ての処理も30秒で終わらせなきゃいけないという制約が大きく、
さらに、一部のAPIに制約がある事が重要ポイントだと思っていた。
</p>
<p>
というのは、30秒で処理を終わらせ、しかもスレッドが使えないは非常に大きな制約であり、
この制約の対価がスケールアウトという自由かと思っていた。
</p>
<p>
この自由を得る為に制約に従わないといけないと。
</p>
<h3>Google App Engineはリアルタイムシステム？</h3>
<p>
さらっと、30秒で処理しなきゃいけないをさらっと書くが、オブジェクト指向の世界ではつらい。
この、「x秒で絶対処理を終わらせる」はいわゆるリアルタイムシステムであり、
リアルタイムがより強く求められる組込みの世界では、上記のような制約はざらにある。
</p>
<p>
しかし、オブジェクト指向の中でリアルタイムシステムを作る場合には、呼び出す処理のコストが
はっきりしている必要がある。でも、オブジェクト指向では振舞いを隠蔽するために処理コストという
時間制約がはっきりしてこない。ある時点での処理コストを調べたとしても、今後
そのコストで処理できるか悩むことになる。
</p>
<p>
リアルタイムシステムは、実現したい要求を早い段階で、処理時間が一定で終わる事を踏まえて設計していかないといけなくなる。
つまり、非機能要求の1つが、大きな設計のファクターになるのだと。
この制約が、Google App Engine の重要な制約だと思っていた。
</p>
<h3>新たに分かった制約</h3>
<p>
リアルタイムシステムで各処理時間のみに着目していたが、アプリケーション起動時間も
重要であるという事が分かった。
</p>
<h3>spin up/spin down</h3>
<p>
プラットフォームをサービスとして提供してくれる Google App Engineはスケールアウトの制御も
プラットフォームでサービスしてくれる。
リソースが必要となった際、不要になった際にspin up/spin downをして、負荷に合わせた
計算リソース提供を行ってくれる。不要になると計算リソースを削減する。
</p>
<h3>PaaSとIaaSの課金</h3>
<p>
プラットフォームをサービスとして提供するということは、スケールアウトの制御も
プラットフォームで面倒見るというのは当然である。
</p>
<p>
それに対比して インフラをサービスとして提供するIaaSは、スケールアウトの制御は
開発者に任せるようになっている。
</p>
<p>
この対比が、コスト面にも表れているように思えてきた。
IaaSは仮想マシンVMインスタンスの起動時間に対して課金するのに、PaaSは処理時間に
課金する。(お、SaaSは、月のユーザ数などで課金か?）
</p>
<h3>課金方法の考え方の差</h3>
<p>
つまり、PaaSの Google App Engine は、VMというリソースではなく、処理時間という
抽象的な課金方法であるために、その実現方法である VMの起動のような処理を、spin upとして
隠蔽している。
</p>
<p>
しかし、スタートアップ処理はコストがかかるために、設計制約として現れる。
もしかすると、Google App Engineの課金なしで利用できる背景には、VMなどと直接
マップしてないからかもしれない。
</p>
<h3>制約から得られるメリット</h3>
<p>
得られるメリットとして以下のように考えてみた。
</p>
<ul>
<li>
スケールアウトの可能性
</li>
<li>
PaaS利用料金の低価格化(または無料期間が存在する事)
</li>
</ul>
<p>
今回、新たになるほどと思ったのが、「無料期間が存在する事」である。
たぶん、無料期間を用意しても大丈夫な状況が作られているのであろ。
つまりコンピュータリソースを占有せず
柔軟に共有できるような仕掛けが用意されているのであろうと。
</p>
<p>
この仕掛けが、spin up/spin down時の制約を設けているのだろうと。
</p>
<h2>Windows Azure</h2>
<p>
Windows Azure は PaaSと分類されているにも関わらず、計算リソースの課金がVM単位である。
これは、Google App Engine とは異なる。
</p>
<p>
コスト的には、リクエストがあろうとなかろうとＶＭ単位のため割高のように感じるかもしれないが、Google App Engine のような
制約が(Google App Engineより)少ないため、設計が楽になるかもしれない。
</p>
<h3>Azureの競合はホスティング</h3>
<p>
そういえば、Future Technology Days で David Chappell 氏が「競合はホスティングサービス」と
と言っていたような気がする。
</p>
<p>
google app engine 等が競合しないという事では無くて、比較できるものでないという事なのかと思った。
</p>
<h2>おわりに</h2>
<p>
PaaSは、スケールアウトも抽象化しているとおもっていた。しかしPaaSの例 Google App Engine と Azure を比べてみると
スケールアウトの抽象化も様々だという事が分かり、この差は課金方法としても差が出ていると考えた。
</p>
<h2>参考書籍</h2>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6190929%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13279570%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8222%2f82223437.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8222%2f82223437.jpg%3f_ex%3d80x80" border="0"></a>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6179860%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13272743%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f7741%2f77413985.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f7741%2f77413985.jpg%3f_ex%3d80x80" border="0"></a>
<a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" border="0"></a>
]]>
    </content>
</entry>

<entry>
    <title>クラウド技術の基本部分</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/post-12.html" />
    <id>tag:www.m-tea.info,2009://1.48</id>

    <published>2009-12-19T14:57:20Z</published>
    <updated>2009-12-19T15:06:23Z</updated>

    <summary>最近クラウドについて調べている事が多い。  興味のあるクラウドというと  Ama...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="コンピュータ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>最近クラウドについて調べている事が多い。 </p>
<p>興味のあるクラウドというと </p>
<ul>
<li>Amazon EC2 </li>
<li>Google App Engine </li>
<li>Azure </li>
<li>SalesForce </li></ul>
<p>があり、とりあえず、出来る限り情報を集めてみたりしている。 </p>
<p>多くの場所で沢山情報が既にあるが、クラウドについて基本的な事を書いておく。 </p>]]>
        <![CDATA[<h2>集めた書籍</h2><a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6190929%2f&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13279570%2f" target="_blank"><img border="0" src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8222%2f82223437.jpg%3f_ex%3d128x128&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8222%2f82223437.jpg%3f_ex%3d80x80" /></a> <a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6179860%2f&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13272743%2f" target="_blank"><img border="0" src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f7741%2f77413985.jpg%3f_ex%3d128x128&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f7741%2f77413985.jpg%3f_ex%3d80x80" /></a> <a href="http://hb.afl.rakuten.co.jp/hgc/03b31a85.985e9ebd.03b31a86.ff7fde7d/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f6254591%2f&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f13445630%2f" target="_blank"><img border="0" src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d128x128&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f0486%2f04868252.jpg%3f_ex%3d80x80" /></a> 
<h2>クラウド</h2>
<p>既にご存知の方が多いと思うが、クラウドを調べてみると以下のようになっている。 </p>
<blockquote>
<p>クラウドコンピューティング（英：cloud computing）とは、ネットワーク、特にインターネットをベースとしたコンピュータの利用形態である。ユーザーはコンピュータ処理をネットワーク経由で、サービスとして利用する。 </p>
<p>Wikipedia<a href="http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">クラウドコンピューティング</a> より </p></blockquote>
<p>つまりネットワークの発達によって、コンピュータリソースをサービスとして利用できるようになる。コンピュータ利用形態の変革であると考えられる。 </p>
<h3>サービスのレイヤ</h3>
<p>いろいろな見方が出来るが以下のように分けられている例がある。 </p>
<p><span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><img class="mt-image-none" alt="20091220_cloud.png" src="http://www.m-tea.info/image/2009/20091220_cloud.png" width="1389" height="853" /></span></p>
<p>
なお、登場人物として </p>
<ul>
<li>エンドユーザ <br />興味がある問題を解決するためにコンピュータアプリケーションを道具として利用する人 </li>
<li>開発者 <br />エンドユーザ向けにコンピュータアプリケーションを提供する人 </li>
<li>コンピュータリソース提供者 <br />ハードウェア/ソフトウェアをクラウド上でサービスとして提供する人 </li></ul>
<p>とした時、「青色」がコンピュータリソース提供者。「オレンジ」が開発者。一番上のアプリケーションを利用する人が、エンドユーザとなる。 </p>
<p>この時、「開発者」に注目したい。 </p>
<h3>クラウドの利点</h3>
<ul>
<li>エンドユーザはコンピュータリソースを保有せず、利用料金を払い利用できる </li>
<li>必要となった時点で、コンピュータリソースを増加させたり、不要になれば減少させたりできる </li></ul>
<p>などがある。また、「スケールアウト」という言葉もあてはまり、アクセス数が必要となった時点でコンピュータリソースを追加出来る事が、クラウドの重要なポイントとなっている。 </p>
<h2>開発者の担当分野</h2>
<p>オレンジ色の担当となる開発者に着目すると </p>
<h3>IaaS/HaaS</h3>
<p>Amazon EC2 等は、OSの設定から全て開発者の担当となり、エンドユーザに提供するアプリケーションを組み立てていく。 </p>
<p>このとき「スケールアウト」も、開発者の担当となる。 </p>
<p>基本的に、ハードウェアリソースを必要に応じて手軽に増減できる専用レンタルサーバのように感じる事が出来る。 </p>
<p>開発者は全ての事を担当する必要があり、幅広い知識が必要となると感じる </p>
<h3>PaaS</h3>
<p>Google App Engine / Windows Azure / Force.com(エンタープライズ向けのクラウド・コンピューティング・プラットフォーム) 等はプラットフォームをサービスとして提供してくれる。開発者は、エンドユーザに提供するアプリケーションを上記プラットフォーム上に構築する。 </p>
<p>このとき「スケールアウト」に伴う多くはプラットフォームが面倒みてくれる事が多い。 </p>
<h3>SaaS</h3>
<p>SalesForce.com のような、アプリケーションをエンドユーザに提供するため、開発者は基本的に介在しない。 </p>
<h2>まとめ</h2>
<p>クラウドはスケールアウトすることと、コンピュータリソースをサービスとしてしまう点が興味深い。 </p>
<p>なぜこの記事を書いたかというと、別の記事を書きたかったので、基本として押さえておくために書いた。 </p>]]>
    </content>
</entry>

<entry>
    <title>IronRuby 1.0 RC1のリリース</title>
    <link rel="alternate" type="text/html" href="http://www.m-tea.info/2009/12/ironruby-r.html" />
    <id>tag:www.m-tea.info,2009://1.47</id>

    <published>2009-12-19T10:43:05Z</published>
    <updated>2009-12-19T10:47:12Z</updated>

    <summary>IronRuby RC1 が出ていた事は、以前の調査しているときにみていたのだが...</summary>
    <author>
        <name>k1ha410</name>
        
    </author>
    
        <category term="IronRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.m-tea.info/">
        <![CDATA[<p>IronRuby RC1 が出ていた事は、以前の調査しているときにみていたのだが、(まだ SocketのBUGは直ってないようだ) 最近 Jimmy Schementi氏のBLOGに <a href="http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-4-project.html">IronRuby @ RubyConf 2009 - Part 4: Project status</a> という記事が投稿されていた。 </p>
<p>簡単にまとめてみた </p>]]>
        <![CDATA[<h2>1.0に向けての目標</h2>
<h3>パフォーマンス</h3>
<p>
パフォーマンスを Matz氏のRuby MRI より高速にという目標を掲げている。
実行速度に関しては速度がでているようであるが、起動時間に関しては、
まだまだでこれからのようである。
</p>
<p>
また、MRI以外にも JRuby とのパフォーマンスの比較も行っているようである。
当初からJRubyとの比較を検討してたわけではないが、比較するようになったようである。
</p>
<h3>互換性</h3>
<p>
90%以上の互換性を目標としているらしい。実際には、RubySpecでかなり好成績をだしているみたいだ。
</p>
<p>
また、C#コードを介さず CLRが呼び出せることも目標として掲げているようである。
</p>
<h3>比較対象</h3>
<p>
基本的に比較対象が Matz氏のRuby MRI の 1.8.6 を比較対象としているから注意。
</p>
<h3>MRI 1.9対応について</h3>
<p>
次のメジャーリリースで対応とのこと。
非常に期待したい。
</p>
<h3>今後</h3>
<ul>
<li>
RC1はリリース済み
</li>
<li>
必要に応じてRC2とか出してく
</li>
<li>
バグ直したら、数週間でRC-finalをビルド
</li>
</ul>
<h2>1.0以降について</h2>
<ul>
<li>
2か月サイクル
</li>
<li>
Visual Studio統合
</li>
</ul>
<h2>さいごに</h2>
<p>
近々 IronRuby の 1.0 が出てきそうである。また Visual Stadio 統合も興味深い。
Express 等と言っておらず、本気でVisual Stadioを買いたくなる。
</p>
<p>
できたら、
<a href="http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=3122"
>このBUG</a>
直ってほしいが、まぁ Impact Medium だし、すぐには直らないかも。
</p>
]]>
    </content>
</entry>

</feed>
