<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Stranger in Paradigm</title>
	<atom:link href="http://blog.showqase.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.showqase.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Thu, 24 Mar 2011 09:03:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iPhoneでラジオボタン</title>
		<link>http://blog.showqase.com/2011/03/24/iphone%e3%81%a7%e3%83%a9%e3%82%b8%e3%82%aa%e3%83%9c%e3%82%bf%e3%83%b3/</link>
		<comments>http://blog.showqase.com/2011/03/24/iphone%e3%81%a7%e3%83%a9%e3%82%b8%e3%82%aa%e3%83%9c%e3%82%bf%e3%83%b3/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 08:08:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UIKit]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/2011/03/24/iphone%e3%81%a7%e3%83%a9%e3%82%b8%e3%82%aa%e3%83%9c%e3%82%bf%e3%83%b3/</guid>
		<description><![CDATA[
			
				
			
		
iPhone/iPadのネイティブアプリでフォームっぽいUIを使いたくなることが多いのですが、UIKitにはなぜかラジオボタンがなくていっつも困るので簡単なラジオボタンを実装してみました。

サンプルのプロジェクトをgithubにあげときました。

Githubページ : t4ku / RadioButtonWithUIKit
Zipダウンロード : Download

RadioButtonViewController.m
グループIDとグループ内での番号を指定してラジオボックスのUIを初期化します。
RadioButton *rb1 = &#91;&#91;RadioButton alloc&#93; initWithGroupId:@&#34;first group&#34; index:0&#93;;
RadioButton *rb2 = &#91;&#91;RadioButton alloc&#93; initWithGroupId:@&#34;first group&#34; index:1&#93;;
RadioButton *rb3 = &#91;&#91;RadioButton alloc&#93; initWithGroupId:@&#34;first group&#34; index:2&#93;;

rb1.frame = CGRectMake&#40;10,30,22,22&#41;;
rb2.frame = CGRectMake&#40;10,60,22,22&#41;;
rb3.frame = CGRectMake&#40;10,90,22,22&#41;;

&#91;self.view addSubview:rb1&#93;;
&#91;self.view addSubview:rb2&#93;;
&#91;self.view addSubview:rb3&#93;;

// 選択値が変わったときに、delegateメソッドが呼ばれるようにする 
&#91;RadioButton addObserverForGroupId:@&#34;first group&#34; observer:self&#93;;
RadioButton.h
ラジオボタンの選択状態が変わったときに呼ばれるdelegateメソッドの宣言は下記。
@protocol RadioButtonDelegate &#60;NSObject&#62;
-&#40;void&#41;radioButtonSelectedAtIndex:&#40;NSUInteger&#41;index inGroup:&#40;NSString*&#41;groupId;
@end
RadioButtonViewController.m
実装例。単にグループIDとグループ内の何番目のラジオボタンが押されたかを表示
-&#40;void&#41;radioButtonSelectedAtIndex:&#40;NSUInteger&#41;index inGroup:&#40;NSString *&#41;groupId&#123;
&#160; &#160; NSLog&#40;@&#34;changed to %d in %@&#34;,index,groupId&#41;;
&#125;
実装してみて思ったのは、今回はRadioButtonというUIViewのサブクラスに全部いれこんだんですが、ホントはラジオボタン間のやりとりを別クラス(RadioButtonGroupとか)にしといたほうがよいかもとか、ラベルとかも一緒に(textViewとかプロパティつくって)管理したほうがよいかもとか。。。まあ、Quick&#038;Dirtyで行きましょう。
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F03%2F24%2Fiphone%25e3%2581%25a7%25e3%2583%25a9%25e3%2582%25b8%25e3%2582%25aa%25e3%2583%259c%25e3%2582%25bf%25e3%2583%25b3%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F03%2F24%2Fiphone%25e3%2581%25a7%25e3%2583%25a9%25e3%2582%25b8%25e3%2582%25aa%25e3%2583%259c%25e3%2582%25bf%25e3%2583%25b3%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>iPhone/iPadのネイティブアプリでフォームっぽいUIを使いたくなることが多いのですが、UIKitにはなぜかラジオボタンがなくていっつも困るので簡単なラジオボタンを実装してみました。<br />
<a href="http://blog.showqase.com/wp-content/uploads/2011/03/RadioButton.png"><img src="http://blog.showqase.com/wp-content/uploads/2011/03/RadioButton-159x300.png" alt="RadioButton" title="RadioButton" width="159" height="300" class="aligncenter size-medium wp-image-530" /></a></p>
<p>サンプルのプロジェクトをgithubにあげときました。</p>
<ul>
<li>Githubページ : <a href="https://github.com/t4ku/RadioButtonWithUIKit">t4ku / RadioButtonWithUIKit</a></li>
<li>Zipダウンロード : <a href="https://github.com/t4ku/RadioButtonWithUIKit/zipball/master">Download</a></li>
</ul>
<p><a href="">RadioButtonViewController.m</a><br />
グループIDとグループ内での番号を指定してラジオボックスのUIを初期化します。</p>
<div class="codecolorer-container objc twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">RadioButton <span style="color: #002200;">*</span>rb1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>RadioButton alloc<span style="color: #002200;">&#93;</span> initWithGroupId<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;first group&quot;</span> index<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;<br />
RadioButton <span style="color: #002200;">*</span>rb2 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>RadioButton alloc<span style="color: #002200;">&#93;</span> initWithGroupId<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;first group&quot;</span> index<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;<br />
RadioButton <span style="color: #002200;">*</span>rb3 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>RadioButton alloc<span style="color: #002200;">&#93;</span> initWithGroupId<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;first group&quot;</span> index<span style="color: #002200;">:</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#93;</span>;<br />
<br />
rb1.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">10</span>,<span style="color: #2400d9;">30</span>,<span style="color: #2400d9;">22</span>,<span style="color: #2400d9;">22</span><span style="color: #002200;">&#41;</span>;<br />
rb2.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">10</span>,<span style="color: #2400d9;">60</span>,<span style="color: #2400d9;">22</span>,<span style="color: #2400d9;">22</span><span style="color: #002200;">&#41;</span>;<br />
rb3.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">10</span>,<span style="color: #2400d9;">90</span>,<span style="color: #2400d9;">22</span>,<span style="color: #2400d9;">22</span><span style="color: #002200;">&#41;</span>;<br />
<br />
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>rb1<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>rb2<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>rb3<span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #11740a; font-style: italic;">// 選択値が変わったときに、delegateメソッドが呼ばれるようにする </span><br />
<span style="color: #002200;">&#91;</span>RadioButton addObserverForGroupId<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;first group&quot;</span> observer<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;</div></div>
<p><a href="https://github.com/t4ku/RadioButtonWithUIKit/blob/master/RadioButton/RadioButton.h">RadioButton.h</a><br />
ラジオボタンの選択状態が変わったときに呼ばれるdelegateメソッドの宣言は下記。</p>
<div class="codecolorer-container objc twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@protocol</span> RadioButtonDelegate &lt;NSObject&gt;<br />
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>radioButtonSelectedAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSUInteger<span style="color: #002200;">&#41;</span>index inGroup<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>groupId;<br />
<span style="color: #a61390;">@end</span></div></div>
<p><a href="">RadioButtonViewController.m</a><br />
実装例。単にグループIDとグループ内の何番目のラジオボタンが押されたかを表示</p>
<div class="codecolorer-container objc twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>radioButtonSelectedAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSUInteger<span style="color: #002200;">&#41;</span>index inGroup<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>groupId<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;changed to %d in %@&quot;</span>,index,groupId<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></div>
<p>実装してみて思ったのは、今回はRadioButtonというUIViewのサブクラスに全部いれこんだんですが、ホントはラジオボタン間のやりとりを別クラス(RadioButtonGroupとか)にしといたほうがよいかもとか、ラベルとかも一緒に(textViewとかプロパティつくって)管理したほうがよいかもとか。。。まあ、Quick&#038;Dirtyで行きましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2011/03/24/iphone%e3%81%a7%e3%83%a9%e3%82%b8%e3%82%aa%e3%83%9c%e3%82%bf%e3%83%b3/feed/</wfw:commentRss>
		<slash:comments>193</slash:comments>
		</item>
		<item>
		<title>クロージャーを使ったデータのキャッシュ</title>
		<link>http://blog.showqase.com/2011/02/19/%e3%82%af%e3%83%ad%e3%83%bc%e3%82%b8%e3%83%a3%e3%83%bc%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5/</link>
		<comments>http://blog.showqase.com/2011/02/19/%e3%82%af%e3%83%ad%e3%83%bc%e3%82%b8%e3%83%a3%e3%83%bc%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 15:27:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/2011/02/19/%e3%82%af%e3%83%ad%e3%83%bc%e3%82%b8%e3%83%a3%e3%83%bc%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5/</guid>
		<description><![CDATA[
			
				
			
		
「jQueryで新し要素を作って、ページに追加する。」よくあるパターンですが、そのたびにHTML文字列組み立ててたら、なんかパフォーマンスを犠牲にしているような気がしていたので、最近実装したAjaxのアプリでは下記のようにクロージャーでデータをキャッシュするようにした。
ここではhtmlTemplateに割り当てられているfunctionオブジェクトは、(function(){&#8230;.}())内部でreturnされているfunction。function(){}()というのは無名functionを生成するのと同時に実行するという意味で、大外の()はシンタックス的には不要なんですが、var hoge = function(){};のように単純に変数に関数を代入するのとは「なんか違うぞ」という事を示すコンベンションなんだとか。
return される関数はfunctionの外側の変数(htmlとか)を参照でき、呼出しの度にhtml(の文字列の配列)を初期化するわけではなく、初回に実行されたhtmlを使いまわせる。

]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F02%2F19%2F%25e3%2582%25af%25e3%2583%25ad%25e3%2583%25bc%25e3%2582%25b8%25e3%2583%25a3%25e3%2583%25bc%25e3%2582%2592%25e4%25bd%25bf%25e3%2581%25a3%25e3%2581%259f%25e3%2583%2587%25e3%2583%25bc%25e3%2582%25bf%25e3%2581%25ae%25e3%2582%25ad%25e3%2583%25a3%25e3%2583%2583%25e3%2582%25b7%25e3%2583%25a5%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F02%2F19%2F%25e3%2582%25af%25e3%2583%25ad%25e3%2583%25bc%25e3%2582%25b8%25e3%2583%25a3%25e3%2583%25bc%25e3%2582%2592%25e4%25bd%25bf%25e3%2581%25a3%25e3%2581%259f%25e3%2583%2587%25e3%2583%25bc%25e3%2582%25bf%25e3%2581%25ae%25e3%2582%25ad%25e3%2583%25a3%25e3%2583%2583%25e3%2582%25b7%25e3%2583%25a5%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>「jQueryで新し要素を作って、ページに追加する。」よくあるパターンですが、そのたびにHTML文字列組み立ててたら、なんかパフォーマンスを犠牲にしているような気がしていたので、最近実装したAjaxのアプリでは下記のようにクロージャーでデータをキャッシュするようにした。</p>
<p>ここではhtmlTemplateに割り当てられているfunctionオブジェクトは、(function(){&#8230;.}())内部でreturnされているfunction。function(){}()というのは無名functionを生成するのと同時に実行するという意味で、大外の()はシンタックス的には不要なんですが、var hoge = function(){};のように単純に変数に関数を代入するのとは「なんか違うぞ」という事を示すコンベンションなんだとか。</p>
<p>return される関数はfunctionの外側の変数(htmlとか)を参照でき、呼出しの度にhtml(の文字列の配列)を初期化するわけではなく、初回に実行されたhtmlを使いまわせる。</p>
<p><iframe style="width: 80%; height: 600px" src="http://jsfiddle.net/t4ku/HpqCg/11/embedded/"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2011/02/19/%e3%82%af%e3%83%ad%e3%83%bc%e3%82%b8%e3%83%a3%e3%83%bc%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gitignore集</title>
		<link>http://blog.showqase.com/2011/01/21/gitignore%e9%9b%86/</link>
		<comments>http://blog.showqase.com/2011/01/21/gitignore%e9%9b%86/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 06:04:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=511</guid>
		<description><![CDATA[
			
				
			
		
Android+Eclipse用のgit設定を探していたら、便利なサイトを見つけたのでメモ。
.gitignore
様々なタイプのプロジェクトに必要な.gitignoreを集めているサイト
github/gitignore &#8211; GitHub  A collection of useful .gitignore templates
gitignoreを集めたリポジトリ
とりあえずこれを使うことにしました。

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated GUI files
*R.java

]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F01%2F21%2Fgitignore%25e9%259b%2586%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F01%2F21%2Fgitignore%25e9%259b%2586%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Android+Eclipse用のgit設定を探していたら、便利なサイトを見つけたのでメモ。</p>
<p><a href="http://gitignore.com/">.gitignore</a><br />
様々なタイプのプロジェクトに必要な.gitignoreを集めているサイト</p>
<p><a href="https://github.com/github/gitignore">github/gitignore &#8211; GitHub  A collection of useful .gitignore templates</a><br />
gitignoreを集めたリポジトリ</p>
<p>とりあえず<a href="https://github.com/github/gitignore/blob/master/Android.gitignore">これ</a>を使うことにしました。</p>
<pre class="brush: plain">
# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated GUI files
*R.java
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2011/01/21/gitignore%e9%9b%86/feed/</wfw:commentRss>
		<slash:comments>66</slash:comments>
		</item>
		<item>
		<title>TextmateでちょっとしたObjective-Cのコードを実行する</title>
		<link>http://blog.showqase.com/2011/01/10/textmate%e3%81%a7%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%81%97%e3%81%9fobjective-c%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.showqase.com/2011/01/10/textmate%e3%81%a7%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%81%97%e3%81%9fobjective-c%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 08:03:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=498</guid>
		<description><![CDATA[
			
				
			
		
TextMateでコンパイル&#038;実行までできることに気づいたのでメモ。
test.mというファイル名でファイルを作成した後、&#8221;Select Bundle Item&#8221;ダイアログをひらいてみる(ショートカットは^⌘T)。Cのメイン関数を挿入するスニペットがあるので、
それを使うとだいたい出来上がり。


⌘Rでコンパイル&#038;実行できる。

ちなみに、上記の手順の場合、TextMateのバンドルはCのものを使っているみたいで、コンパイルは下記のようなオプションで実行されているみたいです。

gcc test.m -Wall -include stdio.h -framework Cocoa

]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F01%2F10%2Ftextmate%25e3%2581%25a7%25e3%2581%25a1%25e3%2582%2587%25e3%2581%25a3%25e3%2581%25a8%25e3%2581%2597%25e3%2581%259fobjective-c%25e3%2581%25ae%25e3%2582%25b3%25e3%2583%25bc%25e3%2583%2589%25e3%2582%2592%25e5%25ae%259f%25e8%25a1%258c%25e3%2581%2599%25e3%2582%258b%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F01%2F10%2Ftextmate%25e3%2581%25a7%25e3%2581%25a1%25e3%2582%2587%25e3%2581%25a3%25e3%2581%25a8%25e3%2581%2597%25e3%2581%259fobjective-c%25e3%2581%25ae%25e3%2582%25b3%25e3%2583%25bc%25e3%2583%2589%25e3%2582%2592%25e5%25ae%259f%25e8%25a1%258c%25e3%2581%2599%25e3%2582%258b%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>TextMateでコンパイル&#038;実行までできることに気づいたのでメモ。</p>
<p>test.mというファイル名でファイルを作成した後、&#8221;Select Bundle Item&#8221;ダイアログをひらいてみる(ショートカットは^⌘T)。Cのメイン関数を挿入するスニペットがあるので、<br />
それを使うとだいたい出来上がり。</p>
<p><a href="http://blog.showqase.com/wp-content/uploads/2011/01/textnte-objc-cmd.png"><img src="http://blog.showqase.com/wp-content/uploads/2011/01/textnte-objc-cmd.png" alt="textnte-objc-cmd" title="textnte-objc-cmd" width="350" height="258" class="alignnone size-full wp-image-505" /></a></p>
<p><a href="http://blog.showqase.com/wp-content/uploads/2011/01/textmate-objc.png"><img src="http://blog.showqase.com/wp-content/uploads/2011/01/textmate-objc.png" alt="textmate-objc" title="textmate-objc" width="586" height="456" class="alignnone size-full wp-image-502" /></a></p>
<p>⌘Rでコンパイル&#038;実行できる。</p>
<p><a href="http://blog.showqase.com/wp-content/uploads/2011/01/textmate-objc-run.png"><img src="http://blog.showqase.com/wp-content/uploads/2011/01/textmate-objc-run.png" alt="textmate-objc-run" title="textmate-objc-run" width="500" height="600" class="alignnone size-full wp-image-504" /></a></p>
<p>ちなみに、上記の手順の場合、TextMateのバンドルはCのものを使っているみたいで、コンパイルは下記のようなオプションで実行されているみたいです。</p>
<blockquote><p>
gcc test.m -Wall -include stdio.h -framework Cocoa
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2011/01/10/textmate%e3%81%a7%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%81%97%e3%81%9fobjective-c%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Objective-CでクラスメソッドをMockする</title>
		<link>http://blog.showqase.com/2011/01/09/objective-c%e3%81%a7%e3%82%af%e3%83%a9%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92mock%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.showqase.com/2011/01/09/objective-c%e3%81%a7%e3%82%af%e3%83%a9%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92mock%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 03:44:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[GTM]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[OCMock]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=486</guid>
		<description><![CDATA[
			
				
			
		
OCMockは素晴らしいライブラリだと思いますが、クラスメソッドにMock/Stub設定できなくて(※)困る時があります。
※OCMockの使用例(http://svn.mulle-kybernetik.com/OCMock/trunk/Source/OCMockObjectTests.m)にないのでおそらくOCMockでは無理、もしくはまだ機能として組み込んでないんだろうと思います。
ただ、Objective-Cはセレクタ(メソッドの名前のようなもの)とメソッドの実装のマッピングを、ランタイムAPIを使って実行時に変更できるので、これを使えばやりたい事はだいたい実現できます。(Method Swizzlingというらしいです)

メソッド交換すると、おそらく実行されるコンテキスト(ローカル/インスタンス変数、self etc)が変わると思うので、モックが実行されたかをチェックするフラグは、テストクラスのクラスメソッドにしてます。
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F01%2F09%2Fobjective-c%25e3%2581%25a7%25e3%2582%25af%25e3%2583%25a9%25e3%2582%25b9%25e3%2583%25a1%25e3%2582%25bd%25e3%2583%2583%25e3%2583%2589%25e3%2582%2592mock%25e3%2581%2599%25e3%2582%258b%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2011%2F01%2F09%2Fobjective-c%25e3%2581%25a7%25e3%2582%25af%25e3%2583%25a9%25e3%2582%25b9%25e3%2583%25a1%25e3%2582%25bd%25e3%2583%2583%25e3%2583%2589%25e3%2582%2592mock%25e3%2581%2599%25e3%2582%258b%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>OCMockは素晴らしいライブラリだと思いますが、クラスメソッドにMock/Stub設定できなくて(※)困る時があります。</p>
<p>※OCMockの使用例(<a href="http://svn.mulle-kybernetik.com/OCMock/trunk/Source/OCMockObjectTests.m">http://svn.mulle-kybernetik.com/OCMock/trunk/Source/OCMockObjectTests.m</a>)にないのでおそらくOCMockでは無理、もしくはまだ機能として組み込んでないんだろうと思います。</p>
<p>ただ、Objective-Cはセレクタ(メソッドの名前のようなもの)とメソッドの実装のマッピングを、ランタイムAPIを使って実行時に変更できるので、これを使えばやりたい事はだいたい実現できます。(Method Swizzlingというらしいです)</p>
<p><script src="https://gist.github.com/772337.js?file=mockOrStubClassMethodsObjc.m"></script></p>
<p>メソッド交換すると、おそらく実行されるコンテキスト(ローカル/インスタンス変数、self etc)が変わると思うので、モックが実行されたかをチェックするフラグは、テストクラスのクラスメソッドにしてます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2011/01/09/objective-c%e3%81%a7%e3%82%af%e3%83%a9%e3%82%b9%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%82%92mock%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MockとStubの違い</title>
		<link>http://blog.showqase.com/2010/10/30/mock%e3%81%a8stub%e3%81%ae%e9%81%95%e3%81%84/</link>
		<comments>http://blog.showqase.com/2010/10/30/mock%e3%81%a8stub%e3%81%ae%e9%81%95%e3%81%84/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 05:37:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[stub]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=471</guid>
		<description><![CDATA[
			
				
			
		
iPhone用のUnit Testライブラリを調べていて、MockとStubの違いがあやふやになってきたので、Railsに立ち返ろうと調べてみると分かりやすいエントリがあった。
RSpec の Mock と Stub が最初分からなかったけど、理解できたら すごい！ という気持ちになった
http://d.hatena.ne.jp/takihiro/20081023/1224762895
自分なりのまとめ
モック

オブジェクトの呼び出し方(使用方法)を検証する。テスト対象のコードが、ある外部クラスを正しく呼び出しているかどうかかを検証するために使用する。テスト対象のコードが使用している外部クラスにexpectation(RSpecでは.should_receive)を設定する。

スタブ

テスト対象のコードの中で外部クラスを参照する場合に、外部クラスが単純なデータを返すことを設定する。

]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F10%2F30%2Fmock%25e3%2581%25a8stub%25e3%2581%25ae%25e9%2581%2595%25e3%2581%2584%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F10%2F30%2Fmock%25e3%2581%25a8stub%25e3%2581%25ae%25e9%2581%2595%25e3%2581%2584%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>iPhone用のUnit Testライブラリを調べていて、MockとStubの違いがあやふやになってきたので、Railsに立ち返ろうと調べてみると分かりやすいエントリがあった。</p>
<p>RSpec の Mock と Stub が最初分からなかったけど、理解できたら すごい！ という気持ちになった<br />
<a href="http://d.hatena.ne.jp/takihiro/20081023/1224762895">http://d.hatena.ne.jp/takihiro/20081023/1224762895</a></p>
<p>自分なりのまとめ</p>
<p><strong>モック</strong></p>
<blockquote><p>
オブジェクトの呼び出し方(使用方法)を検証する。テスト対象のコードが、ある外部クラスを正しく呼び出しているかどうかかを検証するために使用する。テスト対象のコードが使用している外部クラスにexpectation(RSpecでは.should_receive)を設定する。
</p></blockquote>
<p><strong>スタブ</strong></p>
<blockquote><p>
テスト対象のコードの中で外部クラスを参照する場合に、外部クラスが単純なデータを返すことを設定する。
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2010/10/30/mock%e3%81%a8stub%e3%81%ae%e9%81%95%e3%81%84/feed/</wfw:commentRss>
		<slash:comments>98</slash:comments>
		</item>
		<item>
		<title>RackでHTTPリクエストを確認</title>
		<link>http://blog.showqase.com/2010/07/30/rack%e3%81%a7http%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%82%92%e7%a2%ba%e8%aa%8d/</link>
		<comments>http://blog.showqase.com/2010/07/30/rack%e3%81%a7http%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%82%92%e7%a2%ba%e8%aa%8d/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 06:39:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=399</guid>
		<description><![CDATA[
			
				
			
		
全然用途が違うとおもったのですが、iPhoneのUIWebViewやmobile Safariがどういうリクエストを投げているか確認するために、リクエストHeaderを表示する簡単なRackアプリを作ってみた。
 

PCのブラウザ(Firefox)でアクセスすると、こんな感じです。



GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_CHARSET: Shift_JIS,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING: gzip,deflate
HTTP_ACCEPT_LANGUAGE: ja,en-us;q=0.7,en;q=0.3
HTTP_CONNECTION: keep-alive
HTTP_HOST: localhost:9923
HTTP_KEEP_ALIVE: 115
HTTP_USER_AGENT: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
HTTP_VERSION: HTTP/1.1
PATH_INFO: /
QUERY_STRING:
REMOTE_ADDR: ::1
REMOTE_HOST: localhost
REQUEST_METHOD: GET
REQUEST_PATH: /
REQUEST_URI: http://localhost:9923/
SCRIPT_NAME:
SERVER_NAME: localhost
SERVER_PORT: 9923
SERVER_PROTOCOL: HTTP/1.1
SERVER_SOFTWARE: WEBrick/1.3.1 (Ruby/1.8.7/2009-06-12)
rack.errors: #
rack.input: #
rack.multiprocess: false
rack.multithread: true
rack.run_once: false
rack.url_scheme: http
rack.version: 11


下記は、シュミレータで試したときのスクリーンショット




GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_ENCODING: gzip, deflate
HTTP_ACCEPT_LANGUAGE: en-us
HTTP_CACHE_CONTROL: max-age=0
HTTP_CONNECTION: keep-alive
HTTP_HOST: localhost:9923
HTTP_USER_AGENT: Mozilla/5.0 (iPhone Simulator; U; CPU [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F07%2F30%2Frack%25e3%2581%25a7http%25e3%2583%25aa%25e3%2582%25af%25e3%2582%25a8%25e3%2582%25b9%25e3%2583%2588%25e3%2582%2592%25e7%25a2%25ba%25e8%25aa%258d%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F07%2F30%2Frack%25e3%2581%25a7http%25e3%2583%25aa%25e3%2582%25af%25e3%2582%25a8%25e3%2582%25b9%25e3%2583%2588%25e3%2582%2592%25e7%25a2%25ba%25e8%25aa%258d%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>全然用途が違うとおもったのですが、iPhoneのUIWebViewやmobile Safariがどういうリクエストを投げているか確認するために、リクエストHeaderを表示する簡単なRackアプリを作ってみた。</p>
<p><script src="http://gist.github.com/501834.js"> </script></p>
<p><br/><br />
PCのブラウザ(Firefox)でアクセスすると、こんな感じです。<br />
<br/></p>
<pre class="brush: plain">

GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_CHARSET: Shift_JIS,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING: gzip,deflate
HTTP_ACCEPT_LANGUAGE: ja,en-us;q=0.7,en;q=0.3
HTTP_CONNECTION: keep-alive
HTTP_HOST: localhost:9923
HTTP_KEEP_ALIVE: 115
HTTP_USER_AGENT: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
HTTP_VERSION: HTTP/1.1
PATH_INFO: /
QUERY_STRING:
REMOTE_ADDR: ::1
REMOTE_HOST: localhost
REQUEST_METHOD: GET
REQUEST_PATH: /
REQUEST_URI: http://localhost:9923/
SCRIPT_NAME:
SERVER_NAME: localhost
SERVER_PORT: 9923
SERVER_PROTOCOL: HTTP/1.1
SERVER_SOFTWARE: WEBrick/1.3.1 (Ruby/1.8.7/2009-06-12)
rack.errors: #
rack.input: #
rack.multiprocess: false
rack.multithread: true
rack.run_once: false
rack.url_scheme: http
rack.version: 11
</pre>
<p><br/><br />
下記は、シュミレータで試したときのスクリーンショット<br />
<br/><br />
<a href="http://blog.showqase.com/wp-content/uploads/2010/07/iphone_sim.png"><img src="http://blog.showqase.com/wp-content/uploads/2010/07/iphone_sim-161x300.png" alt="iphone_sim" title="iphone_sim" width="161" height="300" class="aligncenter size-medium wp-image-405" /></a></p>
<p><br/></p>
<pre class="brush: plain">
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_ENCODING: gzip, deflate
HTTP_ACCEPT_LANGUAGE: en-us
HTTP_CACHE_CONTROL: max-age=0
HTTP_CONNECTION: keep-alive
HTTP_HOST: localhost:9923
HTTP_USER_AGENT: Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 4_0_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A306 Safari/6531.22.7
HTTP_VERSION: HTTP/1.1
PATH_INFO: /
QUERY_STRING:
REMOTE_ADDR: ::1
REMOTE_HOST: localhost
REQUEST_METHOD: GET
REQUEST_PATH: /
REQUEST_URI: http://localhost:9923/
SCRIPT_NAME:
SERVER_NAME: localhost
SERVER_PORT: 9923
SERVER_PROTOCOL: HTTP/1.1
SERVER_SOFTWARE: WEBrick/1.3.1 (Ruby/1.8.7/2009-06-12)
rack.errors: #<IO:0x100183b88>
rack.input: #<StringIO:0x1017b6d38>
rack.multiprocess: false
rack.multithread: true
rack.run_once: false
rack.url_scheme: http
rack.version: 11 
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2010/07/30/rack%e3%81%a7http%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%82%92%e7%a2%ba%e8%aa%8d/feed/</wfw:commentRss>
		<slash:comments>151</slash:comments>
		</item>
		<item>
		<title>Nginx,Thin,Rails/Sinatraの設定</title>
		<link>http://blog.showqase.com/2010/06/05/nginxthinrailssinatra%e3%81%ae%e8%a8%ad%e5%ae%9a/</link>
		<comments>http://blog.showqase.com/2010/06/05/nginxthinrailssinatra%e3%81%ae%e8%a8%ad%e5%ae%9a/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 05:46:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=394</guid>
		<description><![CDATA[
			
				
			
		
RubyでRailsやEventMachineを使用したWebアプリケーションを書いていると、同じドメインでWebアプリケーションを組み合わせたいと思ってたので、メモ。
[server] apache + passengerを捨ててnginx + thinにしてみた
[server] nginxのinitスクリプト
Nginx, rails and thin
Capistrano + Nginx + Thin deployment on Linode
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F06%2F05%2Fnginxthinrailssinatra%25e3%2581%25ae%25e8%25a8%25ad%25e5%25ae%259a%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F06%2F05%2Fnginxthinrailssinatra%25e3%2581%25ae%25e8%25a8%25ad%25e5%25ae%259a%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>RubyでRailsやEventMachineを使用したWebアプリケーションを書いていると、同じドメインでWebアプリケーションを組み合わせたいと思ってたので、メモ。</p>
<p><a href="http://d.hatena.ne.jp/rudeboyjet/20100404/p1">[server] apache + passengerを捨ててnginx + thinにしてみた</a><br />
<a href="http://d.hatena.ne.jp/rudeboyjet/20100405/p1">[server] nginxのinitスクリプト</a><br />
<a href="http://articles.slicehost.com/2008/5/27/ubuntu-hardy-nginx-rails-and-thin">Nginx, rails and thin</a><br />
<a href="http://gautamrege.wordpress.com/2009/11/10/capistrano-nginx-thin-deployment-on-linode/">Capistrano + Nginx + Thin deployment on Linode</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2010/06/05/nginxthinrailssinatra%e3%81%ae%e8%a8%ad%e5%ae%9a/feed/</wfw:commentRss>
		<slash:comments>55</slash:comments>
		</item>
		<item>
		<title>EventMachineを触ってみた</title>
		<link>http://blog.showqase.com/2010/05/15/eventmachine%e3%82%92%e8%a7%a6%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/</link>
		<comments>http://blog.showqase.com/2010/05/15/eventmachine%e3%82%92%e8%a7%a6%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/#comments</comments>
		<pubDate>Sun, 16 May 2010 03:17:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[EventMachine]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=380</guid>
		<description><![CDATA[
			
				
			
		
機会があったので、以前から少し気になっていたEventMachineを触ってみました。EventMachineがどんなものかというのは下記のスライドに簡単にまとまっています。(いつもお世話になってるWebサービスで結構使用されてます)
EventMachine: scalable non-blocking i/o in ruby 	
Githubにあるeventmachineのtutorialにあるリンクをテキトーに見てみました。
まずは、一番簡単な例
An EventMachine Tutorial&#8221;

require "rubygems"
require "eventmachine"

# From "An EventMachine Tutorial"
# http://20bits.com/articles/an-eventmachine-tutorial/

# ハンドラー
module EchoServer
  # connectionからデータを受け取った時に呼び出されるメソッド
  def receive_data(data)
    # receive_dataを呼び出したconnectionにデータを返す
    # receive_dataしたらsend_dataする
    send_data(data)
  end
end

# イベントループ開始
# EventMachine::stop_event_loopを呼び出すまで止まらない
EventMachine::run do
  host = '0.0.0.0'
  port = 8080

  # 3番目の引数はHandlerで、コールバック用の関数でグローバル変数を汚染しないために
  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F05%2F15%2Feventmachine%25e3%2582%2592%25e8%25a7%25a6%25e3%2581%25a3%25e3%2581%25a6%25e3%2581%25bf%25e3%2581%259f%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F05%2F15%2Feventmachine%25e3%2582%2592%25e8%25a7%25a6%25e3%2581%25a3%25e3%2581%25a6%25e3%2581%25bf%25e3%2581%259f%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>機会があったので、以前から少し気になっていたEventMachineを触ってみました。EventMachineがどんなものかというのは下記のスライドに簡単にまとまっています。(いつもお世話になってるWebサービスで結構使用されてます)</p>
<p><a title="View EventMachine: scalable non-blocking i/o in ruby on Scribd" href="http://www.scribd.com/doc/28253878/EventMachine-scalable-non-blocking-i-o-in-ruby" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;">EventMachine: scalable non-blocking i/o in ruby</a> <object id="doc_846290292482129" name="doc_846290292482129" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" ><param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"><param name="wmode" value="opaque"><param name="bgcolor" value="#ffffff"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><param name="FlashVars" value="document_id=28253878&#038;access_key=key-1rb2iijpl7bew7i1f04i&#038;page=1&#038;viewMode=slideshow"><embed id="doc_846290292482129" name="doc_846290292482129" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=28253878&#038;access_key=key-1rb2iijpl7bew7i1f04i&#038;page=1&#038;viewMode=slideshow" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"></embed></object>	</p>
<p><a href="http://wiki.github.com/eventmachine/eventmachine/tutorials">Githubにあるeventmachineのtutorial</a>にあるリンクをテキトーに見てみました。</p>
<p>まずは、一番簡単な例<br />
<a href="http://20bits.com/articles/an-eventmachine-tutorial/">An EventMachine Tutorial&#8221;</a></p>
<pre class="brush: ruby;">
require "rubygems"
require "eventmachine"

# From "An EventMachine Tutorial"
# http://20bits.com/articles/an-eventmachine-tutorial/

# ハンドラー
module EchoServer
  # connectionからデータを受け取った時に呼び出されるメソッド
  def receive_data(data)
    # receive_dataを呼び出したconnectionにデータを返す
    # receive_dataしたらsend_dataする
    send_data(data)
  end
end

# イベントループ開始
# EventMachine::stop_event_loopを呼び出すまで止まらない
EventMachine::run do
  host = '0.0.0.0'
  port = 8080

  # 3番目の引数はHandlerで、コールバック用の関数でグローバル変数を汚染しないために
  # moduleを定義することが多い。
  EventMachine::start_server host,port,EchoServer
  puts "started EchoServer on #{host}:#{port}"
end
</pre>
<p>このスクリプトを実行させておいて、&#8221;telnet  0.0.0.0  8080&#8243;で繋げれば、入力したものがそのまま返されます。</p>
<p>おなじく、<a href="http://20bits.com/articles/an-eventmachine-tutorial/">An EventMachine Tutorial&#8221;</a><br />
にあるサーバーの例</p>
<pre class="brush: ruby">
require "rubygems"
require "eventmachine"

# From "An EventMachine Tutorial"
# http://20bits.com/articles/an-eventmachine-tutorial/

class Server < EventMachine::Connection
  attr_accessor :status,:options

  def receive_data
    puts "#{@status} -- #{data}"
    send_data("hello\n")
  end
end

EventMachine::run do
  # start_serverは3番目の引数に指定されたハンドラーを引数にyeildする
  EM::start_server host,port,Server do |conn|
    conn.options = {:my => 'options'}
    conn.status = :OK
  end
end
</pre>
<p>この例では、Serverクラスをハンドラーに指定しています。EventMachine::start_serverは任意のモジュールかクラスをハンドラーに指定することができます。モジュールを指定した場合もEventMachine::Connectionクラスにそのモジュールがインクルードされた後、接続したクライアントごとにインスタンス化されます。</p>
<p>そこらへんはEventMachineのソースを追いつつ、絵を描いてたのですが、自分でも微妙な絵になってしまった。。。<br />
とはいえ、一応さらしておきます。<br />
<a href="http://blog.showqase.com/wp-content/uploads/2010/05/Untitled.png"><img src="http://blog.showqase.com/wp-content/uploads/2010/05/Untitled.png" alt="EventMachine" title="EventMachine" width="600" height="500" class="alignleft size-full wp-image-390" /></a></p>
<p>今度もおなじく、<a href="http://20bits.com/articles/an-eventmachine-tutorial/">An EventMachine Tutorial&#8221;</a>ですが、httpクライアントの例</p>
<pre class="brush :ruby">
require "rubygems"
require "eventmachine"

# From "An EventMachine Tutorial"
# http://20bits.com/articles/an-eventmachine-tutorial/

module HttpHeaders
  # connectionがセットアップされた直後に呼び出される。
  # クライアントアプリならサーバーにつながった直後/サーバーアプリならクライアントが接続してきた直後
  def post_init
    send_data "GET /\r\n\r\n"
    @data = ""
  end

  def receive_data(data)
    @data << data
  end

  # クライアント/サーバー側のいずれかの接続が終了した時
  # このhttp_clientの場合は、サーバーがデータを送り終えたら呼び出される
  def unbind
    puts "server have sent data"
    if @data =~ /[\n][\r]*[\n]/m
      $`.each do |line|
        puts ">>> #{line}"
      end
    end

    # ループを終了させる
    EventMachine::stop_event_loop
  end
end

EventMachine::run do
  EventMachine::connect "google.com",80,HttpHeaders
end
</pre>
<p>ポイントとしては、</p>
<ul>
<li>接続の開始時にpost_init/終了時にunbindが実行される</li>
<li>TCPはストリームなので、receive_dataは何度も実行され、渡されるデータの単位は(改行区切りとか)意味のあるものではない</li>
<p>というところでしょうか。</p>
<p>今度は、<a href="http://everburning.com/news/playing-with-eventmachine/">Playing with EventMachine</a>にあるタイマーの設定例</p>
<pre class="brush: ruby">
require "rubygems"
require "eventmachine"

# Playing with EventMachine
# http://everburning.com/news/playing-with-eventmachine/

# EventMachineとEMは同じ
# runでイベントループが開始されるが、引数として渡されるブロックをその前に実行する
EventMachine::run do
  # 定期的に実行されるタイマーを設定
  EM.add_periodic_timer(1) { puts "Tick ..." }

  # 指定した秒数が経過した後に、1回実行されるタイマーを設定
  EM.add_timer(3) do
    puts "I waited 3 seconds"
    EM.stop_event_loop
  end
end

puts "All done"
</pre>
<p>一応試してみたコードはGithubにアップしてます。<a href="http://github.com/t4ku/em_snippet">em_snipett</a><br />
もうちょっとわかってきたら、アップデートします。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2010/05/15/eventmachine%e3%82%92%e8%a7%a6%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O3DがJavascriptライブラリに</title>
		<link>http://blog.showqase.com/2010/05/09/o3d%e3%81%8cjavascript%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%81%ab/</link>
		<comments>http://blog.showqase.com/2010/05/09/o3d%e3%81%8cjavascript%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%81%ab/#comments</comments>
		<pubDate>Sun, 09 May 2010 10:18:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[WebGL]]></category>

		<guid isPermaLink="false">http://blog.showqase.com/?p=374</guid>
		<description><![CDATA[
			
				
			
		
これはすごい、Webブラウザでネイティブに3Dが実現できる環境が近づいて来た。
Great win for WebGL and standards; O3D becomes JS library
Javascriptの高速化とWebGLの実装が進んできたことで、O3DもJavascriptでの実装に切り替えるとのこと。
1年ほど前にO3Dのデモを試したときは、かなりPCが熱くなっていたのでまだまだパフォーマンスの問題とか、3Dコンテンツ制作ツール(と3Dモデルの保存形式とか)の問題はありそうですが、大きな全身ですね。
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F05%2F09%2Fo3d%25e3%2581%258cjavascript%25e3%2583%25a9%25e3%2582%25a4%25e3%2583%2596%25e3%2583%25a9%25e3%2583%25aa%25e3%2581%25ab%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.showqase.com%2F2010%2F05%2F09%2Fo3d%25e3%2581%258cjavascript%25e3%2583%25a9%25e3%2582%25a4%25e3%2583%2596%25e3%2583%25a9%25e3%2583%25aa%25e3%2581%25ab%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>これはすごい、Webブラウザでネイティブに3Dが実現できる環境が近づいて来た。<br />
<a href="http://ajaxian.com/archives/great-win-for-webgl-and-standards-o3d-becomes-js-library">Great win for WebGL and standards; O3D becomes JS library</a></p>
<p>Javascriptの高速化とWebGLの実装が進んできたことで、O3DもJavascriptでの実装に切り替えるとのこと。<br />
1年ほど前にO3Dのデモを試したときは、かなりPCが熱くなっていたのでまだまだパフォーマンスの問題とか、3Dコンテンツ制作ツール(と3Dモデルの保存形式とか)の問題はありそうですが、大きな全身ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.showqase.com/2010/05/09/o3d%e3%81%8cjavascript%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%81%ab/feed/</wfw:commentRss>
		<slash:comments>98</slash:comments>
		</item>
	</channel>
</rss>

