<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja">
	<channel rdf:about="http://castor.s26.xrea.com/blog/index.rss">
		<title>棚からパルチャギ</title>
		<link>http://castor.s26.xrea.com/blog</link>
		<description>日々の雑記、ニュース拾いとか</description>
		<dc:creator>castor</dc:creator>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/iphone/iphone00006.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/iphone/iphone00005.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/blosxom/blosxom00015.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/murmur/murmur10082.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/iphone/iphone00004.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/iphone/iphone00003.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/iphone/iphone00002.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/iphone/iphone00001.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/tech00017.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/tech00016.html"/>
				<rdf:li rdf:resource="http://castor.s26.xrea.com/blog/tech/tech00015.html"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/iphone/iphone00006.html">
		<title>iPhone Developer's Cookbook の最新サンプルコード</title>
		<link>http://castor.s26.xrea.com/blog/tech/iphone/iphone00006.html</link>
		<description>更新するネタもないのでメモがてら。iPhone デベロッパーズ クックブックは良書なのですが、内容がSDK2.0時代のものなのでやっぱり微妙に古いわけで。SDK3.0以降は細々と仕様が変わっていたり、2.0用のプロフィルが削除されていたりでサンプルコードもそのまま通らないとかいろいろ困ります。最新SDKに対応した新版は原書が2009/12発売予定ということでもう少し先なんですが、3.0対応のコードは既にgithub上にあがっているので待ちきれない人はそこを参考にすると幸せになれるかもです。もう最新はSDK 3.1になってしまったけど、発売までに加筆されたりするのかなあ。erica's iphone-3.0-cookbook- at master - GitHub</description>
		<dc:subject>tech::iphone</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-09-28T01:21+09:00</dc:date>
		<content:encoded><![CDATA[

<p>
更新するネタもないのでメモがてら。
</p>

<p>
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797352418/ref=nosim/castors26xrea-22">iPhone デベロッパーズ クックブック</a>は良書なのですが、内容がSDK2.0時代のものなのでやっぱり微妙に古いわけで。
SDK3.0以降は細々と仕様が変わっていたり、2.0用のプロフィルが削除されていたりでサンプルコードもそのまま通らないとかいろいろ困ります。
</p>

<p>
最新SDKに対応した新版は原書が2009/12発売予定ということでもう少し先なんですが、
3.0対応のコードは既にgithub上にあがっているので待ちきれない人はそこを参考にすると幸せになれるかもです。
もう最新はSDK 3.1になってしまったけど、発売までに加筆されたりするのかなあ。
</p>

<p>
<a href="http://github.com/erica/iphone-3.0-cookbook-">erica's iphone-3.0-cookbook- at master - GitHub</a>
</p>
]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/iphone/iphone00005.html">
		<title>iPhone 3GSのSQLiteベンチマーク</title>
		<link>http://castor.s26.xrea.com/blog/tech/iphone/iphone00005.html</link>
		<description>4万件程度のデータをほどほど高速に扱いたいなあと思って、iPhoneのSQLiteがどの程度の性能出せるのか検証。ベンチマークの内容は公式の速度比較の項目とだいたい同じもの。5回試行した平均とってます。比較対象がないのも微妙なので、公式の数値と開発環境(MacBook Core2Duo 2.1GHz/4GB Memory)上のiPhoneシミュレータの数値も掲載。単位は秒。.benchmark-result th {  background-color: #333;  border-collapse: separate;  border-spacing: 4px;  padding: 2px 4px;}.benchmark-result td {  text-align: right;  border-bottom: 1px #333 solid;  padding: 2px 4px;}td.test-description {  text-align: left;}td.test-result-3gs {  color: #f44;}      テスト内容    公式    iPhone(Simulator)    iPhone(3GS)        Test 1: 1000 INSERTs    3.823    2.084    16.668        Test 2: 25000 INSERTs in a transaction    0.764    0.578    4.288      Test 3: 25000 INSERTs into an indexed table  1.778  0.887  6.181      Test 4: 100 SELECTs without an index  3.153  0.001  0.005      Test 5: 100 SELECTs on a string comparison  4.853  0.001  0.008      Test 6: INNER JOIN without an index  14.473  0.000  0.000      Test 7: Creating an index  0.552  1.312  2.186      Test 8: 5000 SELECTs with an index  1.872  0.016  0.238      Test 9: 1000 UPDATEs without an index  0.562  0.241  1.915      Test 10: 25000 UPDATEs with an index  1.883  0.936  6.859      Test 11: 25000 text UPDATEs with an index  1.386  0.803  5.712      Test 12: INSERTs from a SELECT  1.179  0.689  4.020      Test 13: INNER JOIN with index on one side  0.371  0.000  0.000      Test 14: INNER JOIN on text field with index on one side  0.383  0.000  0.000      Test 15: 100 SELECTs with subqueries. Subquery is using an index  7.877  0.000  0.005      Test 16: DELETE without an index  0.528  0.257  1.538      Test 17: DELETE with an index  0.866  0.959  5.446      Test 18: A big INSERT after a big DELETE  0.973  0.455  3.362      Test 19: A big DELETE followed by many small INSERTs  0.155  0.080  0.521      Test 20: DROP TABLE  0.138  0.031  0.171  更新系は多少遅いものの、SELECTする分にはシミュレータ並みの速度が出たりするのはフラッシュメモリの恩恵なのかなあ。もともとデータは事前に用意するつもりだったので全然実用的に使えそうな気がしてきた。データベースライブラリにfmdbを使っています。ソースコードはベタ書きで結果をNSLogで出力する恥ずかしいものなので、欲しい方はメールください。。。</description>
		<dc:subject>tech::iphone</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-14T19:22+09:00</dc:date>
		<content:encoded><![CDATA[
4万件程度のデータをほどほど高速に扱いたいなあと思って、iPhoneのSQLiteがどの程度の性能出せるのか検証。<br />
<br />
ベンチマークの内容は<a href="http://www.sqlite.org/cvstrac/wiki?p=SpeedComparison">公式の速度比較</a>の項目とだいたい同じもの。5回試行した平均とってます。
比較対象がないのも微妙なので、公式の数値と開発環境(MacBook Core2Duo 2.1GHz/4GB Memory)上のiPhoneシミュレータの数値も掲載。単位は秒。
<br />
<br />

<style>
.benchmark-result th {
  background-color: #333;
  border-collapse: separate;
  border-spacing: 4px;
  padding: 2px 4px;
}
.benchmark-result td {
  text-align: right;
  border-bottom: 1px #333 solid;
  padding: 2px 4px;
}
td.test-description {
  text-align: left;
}
td.test-result-3gs {
  color: #f44;
}
</style>
<table class="benchmark-result">
  <tr>
    <th>テスト内容</th>
    <th>公式</td>
    <th>iPhone<br />(Simulator)</th>
    <th>iPhone<br />(3GS)</th>
  </tr>
  <tr>
    <td class="test-description">Test 1: 1000 INSERTs</td>
    <td>3.823</td>
    <td>2.084</td>
    <td class="test-result-3gs">16.668</td>
  </tr>
  <tr>
    <td class="test-description">Test 2: 25000 INSERTs in a transaction</td>
    <td>0.764</td>
    <td>0.578</td>
    <td class="test-result-3gs">4.288</td>
  </tr>
  <tr>
  <td class="test-description">Test 3: 25000 INSERTs into an indexed table</td>
  <td>1.778</td>
  <td>0.887</td>
  <td class="test-result-3gs">6.181</td>
  </tr>
  <tr>
  <td class="test-description">Test 4: 100 SELECTs without an index</td>
  <td>3.153</td>
  <td>0.001</td>
  <td class="test-result-3gs">0.005</td>
  </tr>
  <tr>
  <td class="test-description">Test 5: 100 SELECTs on a string comparison</td>
  <td>4.853</td>
  <td>0.001</td>
  <td class="test-result-3gs">0.008</td>
  </tr>
  <tr>
  <td class="test-description">Test 6: INNER JOIN without an index</td>
  <td>14.473</td>
  <td>0.000</td>
  <td class="test-result-3gs">0.000</td>
  </tr>
  <tr>
  <td class="test-description">Test 7: Creating an index</td>
  <td>0.552</td>
  <td>1.312</td>
  <td class="test-result-3gs">2.186</td>
  </tr>
  <tr>
  <td class="test-description">Test 8: 5000 SELECTs with an index</td>
  <td>1.872</td>
  <td>0.016</td>
  <td class="test-result-3gs">0.238</td>
  </tr>
  <tr>
  <td class="test-description">Test 9: 1000 UPDATEs without an index</td>
  <td>0.562</td>
  <td>0.241</td>
  <td class="test-result-3gs">1.915</td>
  </tr>
  <tr>
  <td class="test-description">Test 10: 25000 UPDATEs with an index</td>
  <td>1.883</td>
  <td>0.936</td>
  <td class="test-result-3gs">6.859</td>
  </tr>
  <tr>
  <td class="test-description">Test 11: 25000 text UPDATEs with an index</td>
  <td>1.386</td>
  <td>0.803</td>
  <td class="test-result-3gs">5.712</td>
  </tr>
  <tr>
  <td class="test-description">Test 12: INSERTs from a SELECT</td>
  <td>1.179</td>
  <td>0.689</td>
  <td class="test-result-3gs">4.020</td>
  </tr>
  <tr>
  <td class="test-description">Test 13: INNER JOIN with index on one side</td>
  <td>0.371</td>
  <td>0.000</td>
  <td class="test-result-3gs">0.000</td>
  </tr>
  <tr>
  <td class="test-description">Test 14: INNER JOIN on text field with index on one side</td>
  <td>0.383</td>
  <td>0.000</td>
  <td class="test-result-3gs">0.000</td>
  </tr>
  <tr>
  <td class="test-description">Test 15: 100 SELECTs with subqueries. Subquery is using an index</td>
  <td>7.877</td>
  <td>0.000</td>
  <td class="test-result-3gs">0.005</td>
  </tr>
  <tr>
  <td class="test-description">Test 16: DELETE without an index</td>
  <td>0.528</td>
  <td>0.257</td>
  <td class="test-result-3gs">1.538</td>
  </tr>
  <tr>
  <td class="test-description">Test 17: DELETE with an index</td>
  <td>0.866</td>
  <td>0.959</td>
  <td class="test-result-3gs">5.446</td>
  </tr>
  <tr>
  <td class="test-description">Test 18: A big INSERT after a big DELETE</td>
  <td>0.973</td>
  <td>0.455</td>
  <td class="test-result-3gs">3.362</td>
  </tr>
  <tr>
  <td class="test-description">Test 19: A big DELETE followed by many small INSERTs</td>
  <td>0.155</td>
  <td>0.080</td>
  <td class="test-result-3gs">0.521</td>
  </tr>
  <tr>
  <td class="test-description">Test 20: DROP TABLE</td>
  <td>0.138</td>
  <td>0.031</td>
  <td class="test-result-3gs">0.171</td>
  </tr>
</table>


<br />
<br />
更新系は多少遅いものの、SELECTする分にはシミュレータ並みの速度が出たりするのはフラッシュメモリの恩恵なのかなあ。
もともとデータは事前に用意するつもりだったので全然実用的に使えそうな気がしてきた。<br />
<br />
データベースライブラリに<a href="http://flycode.googlecode.com/svn/trunk/fmdb/">fmdb</a>を使っています。
ソースコードはベタ書きで結果をNSLogで出力する恥ずかしいものなので、欲しい方はメールください。。。
]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/blosxom/blosxom00015.html">
		<title>awsxomのProduct Advertising API対応</title>
		<link>http://castor.s26.xrea.com/blog/blosxom/blosxom00015.html</link>
		<description>awsxom (Product Advertising API対応版) 2009/08/15以降、AmazonアソシエイトのAPIは署名認証が必要になったのでawsxomのProduct Advertising API対応版。本体のみ。ライセンス書いてなかったので勝手にやった。今は公開している。xreaにDigest::SHAが入っているのか分からなかったので、Digest::SHA::PurePerlをコピーして以下のような感じで使ってます。導入済みの人は特に弄る必要はないはず。    use lib "$blosxom::plugin_dir/lib";    use Digest::SHA::PurePerl qw(hmac_sha256_base64);</description>
		<dc:subject>blosxom</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-14T17:31+09:00</dc:date>
		<content:encoded><![CDATA[
<div class="newslink">
<a href="/products/archives/awsxom_paapi.txt">awsxom (Product Advertising API対応版) </a>
</div>

2009/08/15以降、AmazonアソシエイトのAPIは署名認証が必要になったので<a href="http://fukaz55.main.jp/projects/awsxom/">awsxom</a>のProduct Advertising API対応版。
本体のみ。
ライセンス書いてなかったので勝手にやった。今は公開している。
<br />
<br />

xreaにDigest::SHAが入っているのか分からなかったので、Digest::SHA::PurePerlをコピーして以下のような感じで使ってます。
導入済みの人は特に弄る必要はないはず。
<div class="quote">
<code class="wspre" style="white-space:normal">
    use lib "$blosxom::plugin_dir/lib";<br />
    use Digest::SHA::PurePerl qw(hmac_sha256_base64);<br />
</code>
</div>



]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/murmur/murmur10082.html">
		<title>雑記</title>
		<link>http://castor.s26.xrea.com/blog/murmur/murmur10082.html</link>
		<description>もともと買ったものとかしか書いてなかったから、そういうのがtwitterで事足りてしまうと見事に書くことがなくなってしまうなあ。なんかしよう。コミケ行き忘れた。1日目。</description>
		<dc:subject>murmur</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-14T17:29+09:00</dc:date>
		<content:encoded><![CDATA[
もともと買ったものとかしか書いてなかったから、そういうのがtwitterで事足りてしまうと見事に書くことがなくなってしまうなあ。<br />
<br />
なんかしよう。<br />
コミケ行き忘れた。1日目。<br />
]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/iphone/iphone00004.html">
		<title>教訓</title>
		<link>http://castor.s26.xrea.com/blog/tech/iphone/iphone00004.html</link>
		<description>ぐぐるよりも前に公式ドキュメント読みましょう。はい。まあ、iPhone Dev Centerの解説も微妙に古かったりでなんともだったりするのですが。</description>
		<dc:subject>tech::iphone</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-10T09:39+09:00</dc:date>
		<content:encoded><![CDATA[
ぐぐるよりも前に公式ドキュメント読みましょう。<br />
<br />
はい。<br />
<br />
<br />
まあ、iPhone Dev Centerの解説も微妙に古かったりでなんともだったりするのですが。
]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/iphone/iphone00003.html">
		<title>Code Signingに登録したProvisioning Profileが表示されないとか</title>
		<link>http://castor.s26.xrea.com/blog/tech/iphone/iphone00003.html</link>
		<description>Organizerにドラッグ&amp;ドロップするか、+ボタン押して追加で一見登録されたように見えるのに、Code Signingの項目では選択できないという罠。Profile用のディレクトリが存在しないと正常に登録されないのか、ダメな場合は自分でディレクトリ作成してコピーする必要があるみたい。$ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles$ cd ~/Library/MobileDevice/Provisioning\ Profiles$ mv ~/Downloads/Develop.mobileprovision .</description>
		<dc:subject>tech::iphone</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-10T09:38+09:00</dc:date>
		<content:encoded><![CDATA[
Organizerにドラッグ&ドロップするか、+ボタン押して追加で一見登録されたように見えるのに、Code Signingの項目では選択できないという罠。<br />
<br />
Profile用のディレクトリが存在しないと正常に登録されないのか、ダメな場合は自分でディレクトリ作成してコピーする必要があるみたい。


<div class="quote">
<code class="wspre">
$ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
$ cd ~/Library/MobileDevice/Provisioning\ Profiles
$ mv ~/Downloads/Develop.mobileprovision .

</code>
</div>]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/iphone/iphone00002.html">
		<title>iPhone OS 3.0.1にしたらXcodeが認識しないとか</title>
		<link>http://castor.s26.xrea.com/blog/tech/iphone/iphone00002.html</link>
		<description>このバージョンには対応していないので最新版のXcodeに更新してねと言われる。The version of iPhone OS on “iPhone” does not match any of the versions of iPhone OS supported for development with this copy of Xcode. Please restore the device to a version of the OS listed below. If necessary, the latest version of Xcode is available here.3.0用のデバイス定義が流用できるので、シンボリックリンクは自分で貼る必要があるみたい。こういうのバージョンアップで対応とかしないものなのかしら。$ cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport$ ln -s 3.0\ \(7A341\) 3.0.1</description>
		<dc:subject>tech::iphone</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-10T09:38+09:00</dc:date>
		<content:encoded><![CDATA[
このバージョンには対応していないので最新版のXcodeに更新してねと言われる。

<div class="quote">
<code class="wspre" style="white-space:normal">
The version of iPhone OS on “iPhone” does not match any of the versions of iPhone OS supported for development with this copy of Xcode. Please restore the device to a version of the OS listed below. If necessary, the latest version of Xcode is available here.

</code>
</div>

<br />
3.0用のデバイス定義が流用できるので、シンボリックリンクは自分で貼る必要があるみたい。
こういうのバージョンアップで対応とかしないものなのかしら。

<div class="quote">
<code class="wspre">
$ cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport
$ ln -s 3.0\ \(7A341\) 3.0.1

</code>
</div>]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/iphone/iphone00001.html">
		<title>iPhone開発メモ</title>
		<link>http://castor.s26.xrea.com/blog/tech/iphone/iphone00001.html</link>
		<description>はまったところくらいは書き残していこうと思うわけで。本は「iPhoneデベロッパーズクックブック」だけ買いました。通称エリカ本。良書。あとの情報はネットの情報で結構とかなるような気がしますね。むしろ情報多すぎてどれから手をつければいいのか分からない気がしますが。Objective-Cはサンプルコード書き写しながら覚える感じで。</description>
		<dc:subject>tech::iphone</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2009-08-10T09:38+09:00</dc:date>
		<content:encoded><![CDATA[
はまったところくらいは書き残していこうと思うわけで。<br />
<br />
本は「iPhoneデベロッパーズクックブック」だけ買いました。通称エリカ本。良書。
あとの情報はネットの情報で結構とかなるような気がしますね。
むしろ情報多すぎてどれから手をつければいいのか分からない気がしますが。
Objective-Cはサンプルコード書き写しながら覚える感じで。

]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/tech00017.html">
		<title>openpear/Net_Q4M</title>
		<link>http://castor.s26.xrea.com/blog/tech/tech00017.html</link>
		<description>Q4MのPHPインターフェースラッパを書いたのでopenpear.orgで公開してみました。基本的な使い方はこんな感じで。$queue = new Net_Q4M();$queue-&amp;gt;connect('mysql://user:pass@localhost:3306/database');$row = $queue->dequeue('my_queue');if (process_row($row)) {    $queue->end();} else {    $queue->abort();}$queue->disconnect();dequeue()を呼ぶとキューのレコード情報が返ります。内部的にはqueue_wait()を発行しているので、取得したキューの値はこの接続のみが扱えることになります(OWNERモード)。キューの値は配列で返るので適当に処理します(上のサンプルだとprocess_row()のところ)。処理に成功した場合はend()を呼ぶことでキューから値を削除します。逆に失敗した場合はabort()を呼ぶと値はキューに戻され、他の接続からも参照可能になります。取得したキューの値はend()が呼ばれるか次のdequeue()が呼ばれた時点で削除されます。また、end()もabort()も呼ばれないまま切断された場合は、取得した値はキューに戻ります。// キューへの接続$queue->connect('mysql://user:pass@localhost:3306/database');$queue->connect('mysqli://user:pass@localhost:3306/database');$queue->connect('pdo_mysql://user:pass@localhost:3306/database');接続にはPEAR::DBと同様の書式のDSNを指定します。phptypeにはmysql/mysqli/PDO(mysql)の3種類が指定可能です。// キューから値を取得$queue->dequeue('my_queue', 5);$queue->dequeue('my_queue', 'my_queue2', 'my_queue3', 10);dequeue()を発行してもキューに値がない場合、値がinsertされるまで一定時間待機します。このタイムアウト時間はdequeue()の最後の引数で指定します。デフォルトは10秒間待機します。また、Q4Mでは取得先のキューを優先度順に複数指定する事が可能です。この場合はdequeue()の引数に取得先のキュー(テーブル名)を優先度の高い順に指定します。キューを複数指定する場合、タイムアウト時間を省略することはできません。// キューに取得条件を指定$queue->dequeue('my_queue:id=1000');$queue->dequeue('my_queue:scoreキューに取得条件を付加する場合は、テーブル名の後ろに「:」で条件式を繋いで記述します。条件指定には様々な演算子が使用できるので詳しくはQ4Mのドキュメントを参照してください。// キューに値を追加$data = array(  'user_id' => 1000,  'message' => 'Hello!');$queue->enqueue('my_queue', $data);キューに値を追加するときはenqueue()を使用します。テーブルのカラムに対応したキーと値を保持する連想配列を引数に渡して実行します。// キューの状態を取得する$result = $queue->status();var_dump($result);status()を呼ぶとキューの状態を保持する配列が返ります。SHOW ENGINE QUEUE STATUS; の実行結果で得られる情報を連想配列化したもので、Queue::Q4M::Statusを見てなるほどなーと思って真似してしまいました。ということで、リポジトリは誰でも編集可能なはずなので適当に弄ってあげてください。</description>
		<dc:subject>tech</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2008-12-15T06:24+09:00</dc:date>
		<content:encoded><![CDATA[
<p>
<a href="http://q4m.31tools.com/">Q4M</a>のPHPインターフェースラッパを書いたので<a href="http://openpear.org/package/Net_Q4M">openpear.org</a>で公開してみました。
</p>

<p>
基本的な使い方はこんな感じで。

<div class="quote">
<code class="wspre">
$queue = new Net_Q4M();
$queue->connect('mysql://user:pass@localhost:3306/database');

$row = $queue->dequeue('my_queue');
if (process_row($row)) {
    $queue->end();
} else {
    $queue->abort();
}
$queue->disconnect();

</code>
</div>

dequeue()を呼ぶとキューのレコード情報が返ります。
内部的にはqueue_wait()を発行しているので、取得したキューの値はこの接続のみが扱えることになります(OWNERモード)。<br />
<br />
キューの値は配列で返るので適当に処理します(上のサンプルだとprocess_row()のところ)。
処理に成功した場合はend()を呼ぶことでキューから値を削除します。
逆に失敗した場合はabort()を呼ぶと値はキューに戻され、他の接続からも参照可能になります。<br />
<br />
取得したキューの値はend()が呼ばれるか次のdequeue()が呼ばれた時点で削除されます。
また、end()もabort()も呼ばれないまま切断された場合は、取得した値はキューに戻ります。
</p>

<p>
<div class="quote">
<code class="wspre">
// キューへの接続
$queue->connect('mysql://user:pass@localhost:3306/database');
$queue->connect('mysqli://user:pass@localhost:3306/database');
$queue->connect('pdo_mysql://user:pass@localhost:3306/database');

</code>
</div>

接続にはPEAR::DBと同様の書式のDSNを指定します。<br />
phptypeにはmysql/mysqli/PDO(mysql)の3種類が指定可能です。
</p>

<p>
<div class="quote">
<code class="wspre">
// キューから値を取得
$queue->dequeue('my_queue', 5);
$queue->dequeue('my_queue', 'my_queue2', 'my_queue3', 10);

</code>
</div>

dequeue()を発行してもキューに値がない場合、値がinsertされるまで一定時間待機します。
このタイムアウト時間はdequeue()の最後の引数で指定します。デフォルトは10秒間待機します。<br />
<br />
また、Q4Mでは取得先のキューを優先度順に複数指定する事が可能です。
この場合はdequeue()の引数に取得先のキュー(テーブル名)を優先度の高い順に指定します。
キューを複数指定する場合、タイムアウト時間を省略することはできません。
</p>

<p>
<div class="quote">
<code class="wspre">
// キューに取得条件を指定
$queue->dequeue('my_queue:id=1000');
$queue->dequeue('my_queue:score<30');

</code>
</div>

キューに取得条件を付加する場合は、テーブル名の後ろに「:」で条件式を繋いで記述します。
条件指定には様々な演算子が使用できるので詳しくはQ4Mのドキュメントを参照してください。
</p>

<p>
<div class="quote">
<code class="wspre">
// キューに値を追加
$data = array(
  'user_id' => 1000,
  'message' => 'Hello!'
);
$queue->enqueue('my_queue', $data);

</code>
</div>

キューに値を追加するときはenqueue()を使用します。<br />
テーブルのカラムに対応したキーと値を保持する連想配列を引数に渡して実行します。
</p>

<p>
<div class="quote">
<code class="wspre">
// キューの状態を取得する
$result = $queue->status();
var_dump($result);

</code>
</div>

status()を呼ぶとキューの状態を保持する配列が返ります。
SHOW ENGINE QUEUE STATUS; の実行結果で得られる情報を連想配列化したもので、<a href="http://search.cpan.org/~dmaki/Queue-Q4M/">Queue::Q4M::Status</a>を見てなるほどなーと思って真似してしまいました。
</p>

<p>
ということで、リポジトリは誰でも編集可能なはずなので適当に弄ってあげてください。
</p>




]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/tech00016.html">
		<title>MacBookにQ4Mをインストールしたメモ書きの補足</title>
		<link>http://castor.s26.xrea.com/blog/tech/tech00016.html</link>
		<description>make test について省略したので追記。というか長くなったので別エントリにしてみた。DBD::mysql入れるのが面倒だった。。。$ sudo cpancpan&amp;gt; install Data::Comparecpan> install DBD::mysqlDBD::mysqlのビルドは失敗するので、LeopardにMySQLとDBD::mysqlを入れる方法を参考にmakeしなおす。$ sudo ln -s /opt/local/lib/mysql5/bin/mysql_config /usr/local/bin/mysql_config$ sudo su -# cd /var/root/.cpan# cd build/DBD-mysql-XXXXXXXX# perl Makefile.PL \  --cflags=-I/opt/local/include/mysql5/mysql \  --libs="-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib -lssl -lcrypto"# make# make install自分の環境だけかもしれないけど、/opt/local/bin/perl と /usr/local/bin/perl がどちらも入っていて後者だと@INCが違うところを参照してしまうので、テストスクリプトのperlパスを修正する。$ cd /usr/local/src/q4m-0.8.3$ vi run_tests.pl- #!/usr/local/bin/perl+ #!/opt/local/bin/perlmake test する。$ DBI='dbi:mysql:database=test;host=localhost' \DBI_USER='username' \DBI_PASSWORD='password' \MYSQL_UNIX_PORT=/opt/local/var/run/mysql5/mysqld.sock \make test...Multireader benchmark result:  Number of messages: 6400  Number of readers:  32  Elapsed:            25.878 seconds  Throughput:         247.315 mess./sec....Multi-reader-writer benchmark result:  Number of messages: 6400  Number of readers:  32  Elapsed:            43.944 seconds  Throughput:         145.641 mess./sec....Multi-reader-writer benchmark result under semi-starvation:  Number of messages: 6400  Number of readers:  32  Elapsed:            96.602 seconds  Throughput:         66.251 mess./sec....All tests successful.Files=17, Tests=68921, 2240 wallclock secs (20.83 usr  2.26 sys + 150.25 cusr 22.16 csys = 195.50 CPU)Result: PASSちなみに、上のは--with-sync=fcntlの場合のベンチマーク(Cure2Duo 2.1GHz/Mem 4GB)。--with-sync=fsyncにした場合はこんな感じ↓...Multireader benchmark result:  Number of messages: 6400  Number of readers:  32  Elapsed:            1.725 seconds  Throughput:         3711.007 mess./sec....Multi-reader-writer benchmark result:  Number of messages: 6400  Number of readers:  32  Elapsed:            2.724 seconds  Throughput:         2349.228 mess./sec....Multi-reader-writer benchmark result under semi-starvation:  Number of messages: 6400  Number of readers:  32  Elapsed:            3.445 seconds  Throughput:         1857.784 mess./sec....All tests successful.Files=17, Tests=68921, 289 wallclock secs (17.33 usr  2.06 sys + 144.66 cusr 20.77 csys = 184.82 CPU)10倍以上速いよ！！この辺の話なのかな。試験環境なのでデータ飛んでも困らないし、当面はfsyncのままでいいような気がする。</description>
		<dc:subject>tech</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2008-12-14T23:47+09:00</dc:date>
		<content:encoded><![CDATA[
make test について省略したので追記。<br />
というか長くなったので別エントリにしてみた。DBD::mysql入れるのが面倒だった。。。

<div class="quote">
<code class="wspre">
$ sudo cpan
cpan> install Data::Compare
cpan> install DBD::mysql

</code>
</div>

DBD::mysqlのビルドは失敗するので、<a href="http://d.hatena.ne.jp/seagirl/20080207/1202385950" target="_blank">LeopardにMySQLとDBD::mysqlを入れる方法</a>を参考にmakeしなおす。

<div class="quote">
<code class="wspre">
$ sudo ln -s /opt/local/lib/mysql5/bin/mysql_config /usr/local/bin/mysql_config
$ sudo su -
# cd /var/root/.cpan
# cd build/DBD-mysql-XXXXXXXX
# perl Makefile.PL \
  --cflags=-I/opt/local/include/mysql5/mysql \
  --libs="-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib -lssl -lcrypto"
# make
# make install

</code>
</div>

自分の環境だけかもしれないけど、/opt/local/bin/perl と /usr/local/bin/perl がどちらも入っていて後者だと@INCが違うところを参照してしまうので、テストスクリプトのperlパスを修正する。

<div class="quote">
<code class="wspre">
$ cd /usr/local/src/q4m-0.8.3
$ vi run_tests.pl
- #!/usr/local/bin/perl
+ #!/opt/local/bin/perl

</code>
</div>

make test する。

<div class="quote">
<code class="wspre">
$ DBI='dbi:mysql:database=test;host=localhost' \
DBI_USER='username' \
DBI_PASSWORD='password' \
MYSQL_UNIX_PORT=/opt/local/var/run/mysql5/mysqld.sock \
make test

...
Multireader benchmark result:
  Number of messages: 6400
  Number of readers:  32
  Elapsed:            25.878 seconds
  Throughput:         247.315 mess./sec.
...
Multi-reader-writer benchmark result:
  Number of messages: 6400
  Number of readers:  32
  Elapsed:            43.944 seconds
  Throughput:         145.641 mess./sec.
...
Multi-reader-writer benchmark result under semi-starvation:
  Number of messages: 6400
  Number of readers:  32
  Elapsed:            96.602 seconds
  Throughput:         66.251 mess./sec.
...
All tests successful.
Files=17, Tests=68921, 2240 wallclock secs (20.83 usr  2.26 sys + 150.25 cusr 22.16 csys = 195.50 CPU)
Result: PASS

</code>
</div>

ちなみに、上のは--with-sync=fcntlの場合のベンチマーク(Cure2Duo 2.1GHz/Mem 4GB)。<br />
--with-sync=fsyncにした場合はこんな感じ↓

<div class="quote">
<code class="wspre">
...
Multireader benchmark result:
  Number of messages: 6400
  Number of readers:  32
  Elapsed:            1.725 seconds
  Throughput:         3711.007 mess./sec.
...
Multi-reader-writer benchmark result:
  Number of messages: 6400
  Number of readers:  32
  Elapsed:            2.724 seconds
  Throughput:         2349.228 mess./sec.
...
Multi-reader-writer benchmark result under semi-starvation:
  Number of messages: 6400
  Number of readers:  32
  Elapsed:            3.445 seconds
  Throughput:         1857.784 mess./sec.
...
All tests successful.
Files=17, Tests=68921, 289 wallclock secs (17.33 usr  2.06 sys + 144.66 cusr 20.77 csys = 184.82 CPU)

</code>
</div>

10倍以上速いよ！！
<a href="http://labs.cybozu.co.jp/blog/kazuho/archives/2008/01/hdd_sync.php" target="_blank">この辺の話</a>なのかな。<br />
試験環境なのでデータ飛んでも困らないし、当面はfsyncのままでいいような気がする。
]]></content:encoded>
	</item>
	<item rdf:about="http://castor.s26.xrea.com/blog/tech/tech00015.html">
		<title>MacBookにQ4Mをインストールした</title>
		<link>http://castor.s26.xrea.com/blog/tech/tech00015.html</link>
		<description>…ので、そのメモ書き。http://q4m.31tools.com/MySQL5.1をインストールする5.1系はまだdevelにしかないので、5.0系をインストールしている場合はdeactivateする。データベースの初期化とかパスワードの設定とか自動起動とかの諸々は割愛。$ sudo port deactivate mysql5$ sudo port install mysql5-devel +serverQ4Mをダウンロードしてビルドしてみる。$ cd /ur/local/src$ wget http://q4m.31tools.com/dist/q4m-0.8.3.tar.gz$ tar -zxf q4m-0.8.3.tar.gz$ cd q4m-0.8.3$ ./configure --prefix=/opt/local/lib/mysql5/mysql --includedir=/opt/local/include...checking for mysql source code... configure: error: "no mysql source provided"MySQL本体のソースが必要みたいなので用意する。MacPortsのソースはビルド完了後に削除されてしまうので、別途ダウンロードして展開しておく。$ cd /usr/local/src$ wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.30.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/$ tar -zxf mysql-5.1.30.tar.gz再挑戦。$ cd /usr/local/src/q4m-0.8.3$ ./configure --prefix=/opt/local/lib/mysql5/mysql \--with-mysql=/usr/local/src/mysql-5.1.30 \--includedir=/opt/local/include...checking for mysql source code... "/usr/local/src/mysql-5.1.30"failed to lacate mysql 5.1 installationPlease specify mysql 5.1 directory with --prefix option.ライブラリヘッダのパスが解決できないみたいので、prefixを変更してインストール後に調整することに。それだけだと微妙に通らないのでシンボリックリンクも使ってちょっと強引に回避する。$ cd /opt/local/include$ sudo ln -s mysql5/mysql mysql$$ cd /usr/local/src/q4m-0.8.3$ ./configure --prefix=/opt/local \--with-mysql=/usr/local/src/mysql-5.1.30 \--includedir=/opt/local/includeconfigureは通ったのでmake。こける。boostが必要とかヘッダフィルが読み込めないとかライブラリがどうとかいろいろ怒られるので頑張る。CPPFLAGSとかには mysql_config -libs の出力結果を参考に指定するといいらしい。 /opt/local/lib/mysql5/bin/mysql_config -libsboostをインストールしてビルド。--with-syncも追加した。$ sudo port install boost$$ CPPFLAGS="-I/opt/local/include/mysql5/mysql -I/usr/local/src/mysql-5.1.30/sql -I/opt/local/include" \LDFLAGS="-L/opt/local/lib  -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib/ -lssl -lcrypto" \./configure --prefix=/opt/local \--with-mysql=/usr/local/src/mysql-5.1.30 \--with-sync=fsync$$ make正常にビルド完了したら、MySQLにプラグインをインストールする。prefixを変更していたのでちょこっと調整してからインストールスクリプトを実行。$ sudo make install$$ cd /opt/local/lib/mysql5/mysql/plugin$ sudo ln -s /opt/local/lib/libqueue_engine.so libqueue_engine.so$ sudo ln -s /opt/local/lib/libqueue_engine.la libqueue_engine.la$ sudo ln -s /opt/local/lib/libqueue_engine.a  libqueue_engine.a$$ cd /usr/local/src/q4m-0.8.3$ mysql5 -u root -p mysql 動作確認してみる。$ mysql5 -u root -p mysqlmysql&amp;gt; SHOW ENGINE QUEUE STATUS;おしまい。</description>
		<dc:subject>tech</dc:subject>
		<dc:creator>castor</dc:creator>
		<dc:date>2008-12-14T23:14+09:00</dc:date>
		<content:encoded><![CDATA[
<p>
…ので、そのメモ書き。<br />
<a href="http://q4m.31tools.com/" target="_blank">http://q4m.31tools.com/</a>
</p>

<p>
MySQL5.1をインストールする<br />
5.1系はまだdevelにしかないので、5.0系をインストールしている場合はdeactivateする。
データベースの初期化とかパスワードの設定とか自動起動とかの諸々は割愛。

<div class="quote">
<code class="wspre">
$ sudo port deactivate mysql5
$ sudo port install mysql5-devel +server

</code>
</div>
</p>


<p>
Q4Mをダウンロードしてビルドしてみる。

<div class="quote">
<code class="wspre">
$ cd /ur/local/src
$ wget http://q4m.31tools.com/dist/q4m-0.8.3.tar.gz
$ tar -zxf q4m-0.8.3.tar.gz
$ cd q4m-0.8.3
$ ./configure --prefix=/opt/local/lib/mysql5/mysql --includedir=/opt/local/include
...
checking for mysql source code... configure: error: "no mysql source provided"
</code>
</div>
</p>


<p>
MySQL本体のソースが必要みたいなので用意する。<br />
MacPortsのソースはビルド完了後に削除されてしまうので、別途ダウンロードして展開しておく。

<div class="quote">
<code class="wspre">
$ cd /usr/local/src
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.30.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
$ tar -zxf mysql-5.1.30.tar.gz

</code>
</div>
</p>

<p>
再挑戦。
<div class="quote">
<code class="wspre">
$ cd /usr/local/src/q4m-0.8.3
$ ./configure --prefix=/opt/local/lib/mysql5/mysql \
--with-mysql=/usr/local/src/mysql-5.1.30 \
--includedir=/opt/local/include
...
checking for mysql source code... "/usr/local/src/mysql-5.1.30"
failed to lacate mysql 5.1 installation
Please specify mysql 5.1 directory with --prefix option.

</code>
</div>
</p>

<p>
ライブラリヘッダのパスが解決できないみたいので、prefixを変更してインストール後に調整することに。
それだけだと微妙に通らないのでシンボリックリンクも使ってちょっと強引に回避する。

<div class="quote">
<code class="wspre">
$ cd /opt/local/include
$ sudo ln -s mysql5/mysql mysql
$
$ cd /usr/local/src/q4m-0.8.3
$ ./configure --prefix=/opt/local \
--with-mysql=/usr/local/src/mysql-5.1.30 \
--includedir=/opt/local/include

</code>
</div>
</p>

<p>
configureは通ったのでmake。こける。<br />
boostが必要とかヘッダフィルが読み込めないとかライブラリがどうとかいろいろ怒られるので頑張る。
CPPFLAGSとかには mysql_config -libs の出力結果を参考に指定するといいらしい。

<div class="quote">
<code class="wspre">
 /opt/local/lib/mysql5/bin/mysql_config -libs

</code>
</div>

boostをインストールしてビルド。--with-syncも追加した。

<div class="quote">
<code class="wspre">
$ sudo port install boost
$
$ CPPFLAGS="-I/opt/local/include/mysql5/mysql -I/usr/local/src/mysql-5.1.30/sql -I/opt/local/include" \
LDFLAGS="-L/opt/local/lib  -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib/ -lssl -lcrypto" \
./configure --prefix=/opt/local \
--with-mysql=/usr/local/src/mysql-5.1.30 \
--with-sync=fsync
$
$ make

</code>
</div>
</p>


<p>
正常にビルド完了したら、MySQLにプラグインをインストールする。<br />
prefixを変更していたのでちょこっと調整してからインストールスクリプトを実行。

<div class="quote">
<code class="wspre">
$ sudo make install
$
$ cd /opt/local/lib/mysql5/mysql/plugin
$ sudo ln -s /opt/local/lib/libqueue_engine.so libqueue_engine.so
$ sudo ln -s /opt/local/lib/libqueue_engine.la libqueue_engine.la
$ sudo ln -s /opt/local/lib/libqueue_engine.a  libqueue_engine.a
$
$ cd /usr/local/src/q4m-0.8.3
$ mysql5 -u root -p mysql < support-files/install.sql

</code>
</div>
</p>

<p>
動作確認してみる。

<div class="quote">
<code class="wspre">
$ mysql5 -u root -p mysql
mysql> SHOW ENGINE QUEUE STATUS;

</code>
</div>

おしまい。

</p>

]]></content:encoded>
	</item>
</rdf:RDF>
