<?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>BPS株式会社 開発ブログ Beyond Perspective Solutions LTD. &#187; ネットワーク</title>
	<atom:link href="http://www.bpsinc.jp/blog/archives/category/network/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bpsinc.jp/blog</link>
	<description>BPS株式会社（Beyond Perspective Solutions）のプログラマによる技術・開発などに関してのブログです</description>
	<lastBuildDate>Wed, 20 Jul 2011 08:14:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>XAMPPでRailsのProxy</title>
		<link>http://www.bpsinc.jp/blog/archives/1580</link>
		<comments>http://www.bpsinc.jp/blog/archives/1580#comments</comments>
		<pubDate>Mon, 24 May 2010 00:39:43 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[バグ]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1580</guid>
		<description><![CDATA[Railsで開発する際は、素直にRadRailsのボタンでサーバを起動してしまうのが楽で良いです。
例：http://localhost:3000
しかし、ポート番号ではなく好きな名前でアクセスしたいこともあります。
ま [...]]]></description>
			<content:encoded><![CDATA[<p>Railsで開発する際は、素直にRadRailsのボタンでサーバを起動してしまうのが楽で良いです。<br />
例：http://localhost:3000</p>
<p>しかし、ポート番号ではなく好きな名前でアクセスしたいこともあります。<br />
また、Rails 2.3には、prefix（ドメイン直下以外にアプリを配置）にバグがあるため、それをローカルで試したいこともあるかもしれません。</p>
<p>XAMPPだけで普段はサーバ作業に触れない人には馴染みが薄いかもしれませんが、Apacheなので、たんなるProxyならかんたんです。<br />
例：http://localhost/myapp</p>
<pre class="brush:xml">
&#60;VirtualHost *:80&#62;
	ProxyRequests Off
	&#60;Proxy *&#62;
		Order deny,allow
		Allow from all
	&#60;/Proxy&#62;
	ProxyPass /myapp http://localhost:3000
	ProxyPassReverse /myapp http://localhost:3000
&#60;/VirtualHost&#62;
</pre>
<p>なお、肝心のPrefixバグの対策は、システムチームの伊藤がブログを書いていますのでご覧下さい。<br />
<a href="http://www.bpsinc.jp/blog/archives/1579">http://www.bpsinc.jp/blog/archives/1579</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1580/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitterウィジェットで日本語検索対応</title>
		<link>http://www.bpsinc.jp/blog/archives/1567</link>
		<comments>http://www.bpsinc.jp/blog/archives/1567#comments</comments>
		<pubDate>Fri, 21 May 2010 00:20:57 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[文字コード]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1567</guid>
		<description><![CDATA[TwitterをWebページに埋め込むのに、簡単なのは公式ウィジェットを使うことです。
これを使えば、特定のキーワードにマッチするつぶやきをリアルタイムで取得できます。
http://twitter.com/goodie [...]]]></description>
			<content:encoded><![CDATA[<p>TwitterをWebページに埋め込むのに、簡単なのは公式ウィジェットを使うことです。</p>
<p>これを使えば、特定のキーワードにマッチするつぶやきをリアルタイムで取得できます。<br />
<a href="http://twitter.com/goodies/widget_search">http://twitter.com/goodies/widget_search</a></p>
<p>ところが、ここのプレビュー画面だと日本語検索に対応していますが、出力されたコードを設置すると、日本語キーワードを使った場合にエラーが出てしまいます。</p>
<blockquote><p>
例：「子育て」で検索した際のエラー<br />
syntax error<br />
http://search.twitter.com/search.json?q=-RT%20%u5B50%u80B2%u3066&#038;callback=TWTR.Widget.receiveCallback_1&#038;rpp=30&#038;clientsource=TWITTERINC_WIDGET<br />
Line 1
</p></blockquote>
<p>見て分かるとおり、URLエンコードの形式が変になっていますね。</p>
<p>この場合、読み込むwidget.jsをプレビュー画面と同じものに切り替えてあげれば動きました。</p>
<pre class="brush:html">
&#60;!-- これなら日本語OK --&#62;
&#60;script src="http://twitter.com/javascripts/widgets/widget.js"&#62;&#60;/script&#62; 

&#60;!-- このコードが生成されるが、これは日本語不可 --&#62;
&#60;script src="http://widgets.twimg.com/j/2/widget.js"&#62;&#60;/script&#62;
</pre>
<p>非公式なので、変わるかもしれませんが・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1567/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>URL.openConnection()でFileNotFoundException</title>
		<link>http://www.bpsinc.jp/blog/archives/1564</link>
		<comments>http://www.bpsinc.jp/blog/archives/1564#comments</comments>
		<pubDate>Thu, 20 May 2010 01:14:09 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1564</guid>
		<description><![CDATA[Androidで、URLを指定してInputStreamを受け取りたいとき、

URL url = new URL("http://example.com");
InputStream is = url.openConn [...]]]></description>
			<content:encoded><![CDATA[<p>Androidで、URLを指定してInputStreamを受け取りたいとき、</p>
<pre class="brush:java">
URL url = new URL("http://example.com");
InputStream is = url.openConnection().getInputStream();
</pre>
<p>とできますが、なぜかAndroid 2.1では動き、1.6ではFileNotFoundExceptionが発生しました。</p>
<p>原因究明したいところですが、とりあえずHttpClientに置き換えれば動きます・・・</p>
<pre class="brush:java">
HttpClient client = new DefaultHttpClient();
HttpGet method = new HttpGet(URI.create("http://example.com"));
HttpResponse response = client.execute(method);
InputStream is = response.getEntity().getContent();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1564/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DNSのサフィックス設定</title>
		<link>http://www.bpsinc.jp/blog/archives/1155</link>
		<comments>http://www.bpsinc.jp/blog/archives/1155#comments</comments>
		<pubDate>Fri, 26 Feb 2010 00:04:57 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[ActiveDirectory]]></category>
		<category><![CDATA[DNS]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1155</guid>
		<description><![CDATA[ActiveDirectoryを使う環境では、DNSサーバがSRVレコードをサポートしている必要があります。
（通常のDNSだとDomainControllerを検索する際にエラーになってしまいます）
BINDなどのDN [...]]]></description>
			<content:encoded><![CDATA[<p>ActiveDirectoryを使う環境では、DNSサーバがSRVレコードをサポートしている必要があります。<br />
（通常のDNSだとDomainControllerを検索する際にエラーになってしまいます）</p>
<p>BINDなどのDNSサーバで設定することも可能ですが、かなり面倒なので、Windows ServerをプライマリDNSにしてしまうのが手っ取り早いですね。</p>
<p>ところが、Windows ServerをプライマリDNSにしているActiveDirectory環境で、LANから公開サーバを検索しようとしたら、少しだけ困ったことになりました。<br />
公開サーバ（WAN/LANの2つのIPを持つ）の名前をwwwとすると、</p>
<p>DNSサーバ：192.168.1.50<br />
公開サーバ：192.168.1.10 , 203.143.124.180</p>
<p><strong>期待する結果</strong></p>
<blockquote><p>
C:&gt; nslookup www.bpsinc.jp<br />
サーバー:  UnKnown<br />
Address:  192.168.1.50</p>
<p>名前:    www.bpsinc.jp<br />
Address:  192.168.1.10
</p></blockquote>
<p><strong>残念な結果</strong></p>
<blockquote><p>
C:&gt; nslookup www.bpsinc.jp<br />
サーバー:  UnKnown<br />
Address:  192.168.1.50</p>
<p>名前:    www.bpsinc.jp.bpsinc.jp<br />
Address:  203.143.124.180
</p></blockquote>
<p>このように、bpsinc.jpのサフィックスが無駄にくっついてしまいます。</p>
<p>これは、ネットワーク設定→TCP/IP(IPv4)設定→詳細設定→DNS　で、以下のようにDNSサフィックスを手動設定すれば直ります。<br />
<div id="attachment_1158" class="wp-caption aligncenter" style="width: 489px"><a href="http://www.bpsinc.jp/blog/wp-content/uploads/2010/02/dns2.png"><img src="http://www.bpsinc.jp/blog/wp-content/uploads/2010/02/dns2.png" alt="ローカルでここを変更してもOK" title="dns2" width="479" height="460" class="size-full wp-image-1158" /></a><p class="wp-caption-text">ローカルでここを変更してもOK</p></div></p>
<p>グループポリシーで一括設定するには、コンピュータの構成→ポリシー→管理用テンプレート→ネットワーク→DNSクライアント→DNSサフィックス検索一覧　で設定すればOKです。<br />
<div id="attachment_1157" class="wp-caption aligncenter" style="width: 610px"><a href="http://www.bpsinc.jp/blog/wp-content/uploads/2010/02/dns1.png"><img src="http://www.bpsinc.jp/blog/wp-content/uploads/2010/02/dns1.png" alt="グループポリシーでDNSサフィックス設定" title="dns1" width="600" height="392" class="size-full wp-image-1157" /></a><p class="wp-caption-text">グループポリシーでDNSサフィックス設定</p></div></p>
<p>もちろん、www.bpsinc.jp. のように最後にピリオドをつければ何もしなくてもOKなのですが、<br />
WindowsのFQDN判定はあまり賢くないということでしょうか？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1155/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#でUDPパケットをひたすら送り続ける</title>
		<link>http://www.bpsinc.jp/blog/archives/1068</link>
		<comments>http://www.bpsinc.jp/blog/archives/1068#comments</comments>
		<pubDate>Tue, 02 Feb 2010 03:41:40 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1068</guid>
		<description><![CDATA[先日のiPhone UDP受信テストの際に使った、WindowsからUDPパケットを送りつけるプログラムを載せてみます。
一切の遠慮無く、1秒に20枚のペースで、デスクトップに置いてあるimg0.png～img9.png [...]]]></description>
			<content:encoded><![CDATA[<p>先日のiPhone UDP受信テストの際に使った、WindowsからUDPパケットを送りつけるプログラムを載せてみます。<br />
一切の遠慮無く、1秒に20枚のペースで、デスクトップに置いてあるimg0.png～img9.pngの画像ファイルを一方的に送りつけます。</p>
<pre class="brush:csharp">
///一定時間ごとにUDPで画像を一方的に送りつける
private void SendData()
{
    //ローカルポート番号2222にバインドする
    System.Net.Sockets.UdpClient udp = new System.Net.Sockets.UdpClient(2222);

    int count = 0; //何番目の画像を送信するかのカウンタ

    Timer timer = new Timer();
    timer.Tick += new EventHandler((s, e) =&#62;
    {
	    if (++count &#62; 9)
	    {
	        count = 0;
	    }

	    //デスクトップのimg0.png～img9.pngを送る
	    string filename = @"C:\Users\baba\desktop\img\" + count + ".png";
	    using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
	    {
	        byte&#91;&#93; sendBytes = new byte&#91;fs.Length&#93;;
	        fs.Read(sendBytes, 0, sendBytes.Length);
	        //宛先IPとポート番号を指定する
	        udp.Send(sendBytes, sendBytes.Length, "192.168.100.50", 5555);
	    }
    });
    timer.Interval = 50;
    timer.Start();
}
</pre>
<p>.NETは簡単にこういったコードが書けて便利ですね。<br />
何の工夫も最適化も無いですが、50枚/秒くらいなら全然問題にならない程度の速度は出ていました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1068/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone用　超手抜きUDPサーバ</title>
		<link>http://www.bpsinc.jp/blog/archives/1051</link>
		<comments>http://www.bpsinc.jp/blog/archives/1051#comments</comments>
		<pubDate>Sat, 30 Jan 2010 01:17:34 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[UDP]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1051</guid>
		<description><![CDATA[先日のiPhone性能検証で作ったソースの一部として、超手抜きUDPサーバのコードを載せておきます。
CFSocketが思ったよりも使いにくいので、BSDソケットほとんど生です・・・

/**
 * 手抜きUDPサーバ
 [...]]]></description>
			<content:encoded><![CDATA[<p>先日のiPhone性能検証で作ったソースの一部として、超手抜きUDPサーバのコードを載せておきます。<br />
CFSocketが思ったよりも使いにくいので、BSDソケットほとんど生です・・・</p>
<pre class="brush:cpp">
/**
 * 手抜きUDPサーバ
 */
#import &#60;netinet/in.h&#62;
#import &#60;Foundation/Foundation.h&#62;

@interface MyUdpConnection : NSObject {
	id delegate;
}
- (id)initWithDelegate:(id)_delegate; //receiveData:(NSData*)data を実装すること
- (void)bind;
- (void)bindThread;
@end

/**
 * 手抜きUDPサーバ実装部
 */
@implementation MyUdpConnection

// 初期化
- (id)initWithDelegate:(id)_delegate {
	delegate = _delegate;
	return self;
}

// 受信開始
- (void)bind {
	NSThread *th = &#91;&#91;NSThread alloc&#93;initWithTarget:self selector:@selector(bindThread) object:nil&#93;;
	&#91;th start&#93;;
}

// 受信用スレッド
- (void)bindThread {
	NSAutoreleasePool *pool = &#91;&#91;NSAutoreleasePool alloc&#93;init&#93;;

	struct sockaddr_in addr;
	memset(&#038;addr, 0, sizeof(addr));
	addr.sin_port = htons(5555); //適当なポートで待機
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);

	int sock = socket(AF_INET, SOCK_DGRAM, 0);
	bind(sock, (struct sockaddr *)&#038;addr, sizeof(addr));

	char buf&#91;100000&#93;; //100KBまで対応
	while (1) {
		//ここでデータを受信するまでブロックされる
		int size = recv(sock, buf, sizeof(buf), 0);

		//NSDataに変換し、delegateに通知
		NSData *data = &#91;NSData dataWithBytes:buf length:size&#93;;
		&#91;delegate performSelectorOnMainThread:@selector(receiveData:) withObject:data waitUntilDone:YES&#93;;
	}

	&#91;pool drain&#93;;
}
@end
</pre>
<p>これを使うと、たとえばViewControllerなどで</p>
<blockquote><p>
- (void)receiveData:(NSData *)data;
</p></blockquote>
<p>を実装しておいて、</p>
<blockquote><p>
MyUdpConnection *udp = [[MyUdpConnection alloc]initWithDelegate:self];<br />
[udp bind];
</p></blockquote>
<p>のようにすれば、データを受信したときにreceiveData:が呼ばれます。</p>
<p>エラー処理や再送処理はおろか、ポート番号すらべた書きのものですが、重要でないデータを受け取る分には、ちょっと改良すれば使い物になりそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1051/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoneのNSURLConnection性能限界テスト</title>
		<link>http://www.bpsinc.jp/blog/archives/1044</link>
		<comments>http://www.bpsinc.jp/blog/archives/1044#comments</comments>
		<pubDate>Fri, 29 Jan 2010 00:59:41 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[UDP]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1044</guid>
		<description><![CDATA[iPhoneやiPod Touchは、ネットワークの性能がそれほど高くないため、NSURLConnectionでたくさんコネクションを張ったりすると目に見えて遅延します。
以下のような実験をやってみました。
iPhone [...]]]></description>
			<content:encoded><![CDATA[<p>iPhoneやiPod Touchは、ネットワークの性能がそれほど高くないため、NSURLConnectionでたくさんコネクションを張ったりすると目に見えて遅延します。<br />
以下のような実験をやってみました。</p>
<p>iPhone SDKで、以下の2種類のテストアプリを作りました。<br />
なお、機材の都合上iPhoneではなくiPod Touchを使っています。</p>
<p><strong>【A】</strong><br />
タイマーで0.05秒ごとにHTTPリクエストを送信し、レスポンスとして受け取った画像を表示する。<br />
サーバでは、リクエストを受け取るたびに0～9の数字画像を順番に返す。</p>
<p><strong>【B】</strong><br />
UDPで接続を待ち、画像データを受け取ったら表示する。<br />
サーバでは、iPhoneに向かって0.05秒ごとに0～9の数字画像を順番にUDPで送信する。</p>
<p>サーバは、十分に高性能なマシンを、有線LANで接続しました。<br />
MacBook ProやiPod Touch実機は、同じ無線LAN (IEEE802.11g) を使っています。</p>
<p><strong>【結果】</strong><br />
<a href='http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/http_simulator.wmv'>Aのアプリ（MacBook Pro上のシミュレータ）</a><br />
<a href='http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/http_device.wmv'>Aのアプリ（iPod Touch 実機）</a><br />
<a href='http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/udp_device.wmv'>Bのアプリ（iPod Touch実機）</a></p>
<p>このように、HTTPを使う場合、シミュレータではスムーズに動くものの、実機ではかなりカクカクです。<br />
実機でも、HTTPを使わずにUDPにしてしまえば、十分スムーズになることが分かります。</p>
<p>今回使った画像は各2KB程度のPNG画像ですが、50KB程度のJPG画像を使っても結果はほとんど変わらなかったため、帯域よりもコネクションの数が大きなウェイトを占めているようです。</p>
<p>どの程度性能が出るか大まかに分かれば良かったので、原因などの細かい検証は今回は行いません。<br />
使ったソースコードなどは後日このブログに載せておこうかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1044/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/http_simulator.wmv" length="528679" type="video/x-ms-wmv" />
<enclosure url="http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/http_device.wmv" length="423079" type="video/x-ms-wmv" />
<enclosure url="http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/udp_device.wmv" length="426279" type="video/x-ms-wmv" />
		</item>
		<item>
		<title>iPhoneでXMLRPC</title>
		<link>http://www.bpsinc.jp/blog/archives/954</link>
		<comments>http://www.bpsinc.jp/blog/archives/954#comments</comments>
		<pubDate>Wed, 13 Jan 2010 22:30:55 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[XML_RPC]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=954</guid>
		<description><![CDATA[iPhoneでXML_RPCを使おうとすると、地味に苦労します。
XMLParserはあるので、自力でやっても良いのですが、出来ればライブラリが欲しいですよね。
eczarny xmlrpcがiPhone対応ということで [...]]]></description>
			<content:encoded><![CDATA[<p>iPhoneでXML_RPCを使おうとすると、地味に苦労します。</p>
<p>XMLParserはあるので、自力でやっても良いのですが、出来ればライブラリが欲しいですよね。</p>
<p><a href="http://github.com/eczarny/xmlrpc">eczarny xmlrpc</a>がiPhone対応ということですが、私の環境ではターゲットをiPhone OSにするとビルドエラーが出ました。<br />
MacOSをターゲットにすると正常にビルドできます。NSXMLDocumentなどを内部で利用しており、これがiPhone非対応なのが原因みたいです。2.0～2.2.1まで全滅でした。</p>
<p>ということで他を当たったところ、<a href="http://wpdocs.sourceforge.jp/%E6%8A%95%E7%A8%BF%E3%83%84%E3%83%BC%E3%83%AB/WordPress_for_iPhone">WordPress for iPhone</a>の内部で使われているものが良さそうでした。<br />
これもeczarmy xmlrpcをベースに作られているようですが（未確認）、iPhoneでもちゃんと動きます。</p>
<p>ということで、以下からソースコードをダウンロードします。ライセンスはGNU GPLでした。<br />
<a href="http://iphone.trac.wordpress.org/browser">http://iphone.trac.wordpress.org/browser</a>（trunkを開いて、下の方にあるZip Archiveをクリック）</p>
<p>色々入っていますが、Classes/XMLRPCフォルダ丸ごとと、Classes以下でファイル名に「+」が含まれるものを全部コピーして、プロジェクトにインポートすればOKです。</p>
<div id="attachment_955" class="wp-caption aligncenter" style="width: 126px"><a href="http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/xcode.png"><img src="http://www.bpsinc.jp/blog/wp-content/uploads/2010/01/xcode-116x300.png" alt="このようにインポートします" title="xcode" width="116" height="300" class="size-medium wp-image-955" /></a><p class="wp-caption-text">このようにインポートします</p></div>
<p>使い方は、以下のようにやります。</p>
<pre class="brush:cpp">
#import "XMLRPCRequest"
#import "XMLRPCResponse"
#import "XMLRPCConnection"

- (void)test {
	//requestを生成
	NSURL *url = &#91;NSURL URLWithString:@"http://www.bpsinc.jp"&#93;;
	XMLRPCRequest *request = &#91;&#91;XMLRPCRequest alloc&#93;initWithHost:url&#93;;
	&#91;request setMethod:@"Test.version" withObjects:&#91;NSArray array&#93;&#93;; //引数を指定するときはarrayの部分にデータを入れる

	NSLog(@"%@", &#91;request source&#93;); //XMLRPCのリクエストソースが見られます

	//通信
	XMLRPCResponse *response = &#91;XMLRPCConnection sendSynchronousXMLRPCRequest: request&#93;;

	NSLog(@"%@", &#91;response source&#93;); //XMLRPCのレスポンスソースが見られます
	NSLog(@"%@", &#91;response object&#93;); //objectメソッドは、戻り値の型になります。サーバ側で明示的に型を指定しましょう
}
</pre>
<p>ソースコードは短く読みやすいので、簡単に使いこなせると思います。<br />
非同期通信は、以下の2つを実装すれば、XMLRPCConnectionのinitWithRequestで実行できます。</p>
<pre class="brush:cpp">
- (void)connection:(XMLRPCConnection *)connection
  didReceiveResponse:(XMLRPCResponse *)response forMethod:(NSString *)method;
- (void)connection:(XMLRPCConnection *)connection
  didFailWithError:(NSError *)error forMethod:(NSString *)method;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/954/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PEAR::XML_RPC2で簡単サーバ</title>
		<link>http://www.bpsinc.jp/blog/archives/950</link>
		<comments>http://www.bpsinc.jp/blog/archives/950#comments</comments>
		<pubDate>Wed, 13 Jan 2010 11:07:54 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[XML_RPC]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=950</guid>
		<description><![CDATA[XML_RPCのクライアントを開発するとき、ダミーでサーバが必要になります。
手っ取り早いダミーとして、PHPのPEAR::XML_RPC2が便利です。以前クライアント側は紹介しましたが、今回はサーバの超基本的な使い方。 [...]]]></description>
			<content:encoded><![CDATA[<p>XML_RPCのクライアントを開発するとき、ダミーでサーバが必要になります。<br />
手っ取り早いダミーとして、PHPのPEAR::XML_RPC2が便利です。以前クライアント側は紹介しましたが、今回はサーバの超基本的な使い方。</p>
<p><strong>ダウンロード</strong><br />
<a href="http://pear.php.net/package/XML_RPC2">http://pear.php.net/package/XML_RPC2</a>からダウンロードできます。</p>
<p><strong>使い方</strong><br />
適当な場所に設置したら、以下のようにincludeして、各アクションに対応する関数を定義します。<br />
そして、XML_RPC_Serverでアクション名と実行するアクションの対応を配列で渡せばOKです。</p>
<pre class="brush:php">
require_once("XML/RPC.php");
require_once("XML/RPC/Server.php");
$GLOBALS&#91;'XML_RPC_defencoding'&#93; = "UTF-8";

function  version($params) {
	return new XML_RPC_Response(new XML_RPC_Value('1.0', 'string'));
}

function average($params) {
	$v1 = $params-&#62;getParam(0)-&#62;scalarval();
	$v2 = $params-&#62;getParam(1)-&#62;scalarval();
	return new XML_RPC_Response(new XML_RPC_Value($v1 + $v2, 'int'));
}

new XML_RPC_Server(array(
	"Test.version" =&#62; array("function" =&#62; "version"),
	"Test.average" =&#62; array("function" =&#62; "average"),
));
</pre>
<p>とってもかんたん。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/950/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSURLRequestでsetHTTPBodyするとtimeoutIntervalが上書きされる</title>
		<link>http://www.bpsinc.jp/blog/archives/962</link>
		<comments>http://www.bpsinc.jp/blog/archives/962#comments</comments>
		<pubDate>Wed, 13 Jan 2010 00:17:39 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=962</guid>
		<description><![CDATA[先日に引き続き、timeoutIntervalが無視される件について。
POSTする際は、NSMutableURLRequestを用いて、setHttpBodyでPOSTデータを入れます。
しかし、これを行うとtimeo [...]]]></description>
			<content:encoded><![CDATA[<p>先日に引き続き、timeoutIntervalが無視される件について。</p>
<p>POSTする際は、NSMutableURLRequestを用いて、setHttpBodyでPOSTデータを入れます。<br />
しかし、これを行うとtimeoutIntervalが強制的に240秒に設定されてしまいます。<br />
<strong>さらに酷いことに、その後setTimeoutIntervalを行っても無視されます。</strong></p>
<p>以下検証コード↓</p>
<pre class="brush:cpp">
NSURL *url = &#91;NSURL URLWithString:@"http://www.bpsinc.jp"&#93;;
NSMutableURLRequest *req = &#91;NSMutableURLRequest requestWithURL:url&#93;;
NSLog(@"%g", &#91;req timeoutInterval&#93;); //60

&#91;req setHTTPBody:&#91;NSData data&#93;&#93;;
NSLog(@"%g", &#91;req timeoutInterval&#93;); //240

&#91;req setTimeoutInterval:10.0&#93;;
NSLog(@"%g", &#91;req timeoutInterval&#93;); //240
</pre>
<p>これはCocoaのバグでしょうか？</p>
<p>あまりに酷すぎるので、何か基本的な間違いを犯していると信じたいところです。<br />
どなたか情報をお持ちなら教えて下さい！</p>
<p><strong>1月14日追記</strong><br />
詳しい方から、「仕様です」との情報を頂きました。<br />
非同期通信を使って、タイムアウトは自分で処理する必要があるそうです・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/962/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

