<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>ゆめ技：ゆめみスタッフブログ</title>
      <link>http://yumewaza.yumemi.co.jp/</link>
      <description>携帯・モバイルの技術情報はもちろんその他色々な技を発信する株式会社ゆめみの社員によるブログです。</description>
      <language>ja</language>
      <copyright>Copyright 2012</copyright>
      <lastBuildDate>Mon, 16 Jan 2012 13:11:03 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>Objective-CのPropertyの解放忘れを見つけるスクリプト</title>
         <description>こんにちは、ちきん(@mokemokechicken)です。
最近は、iPhoneアプリの開発に携わっていまして、そこで「Objective-CのPropertyの解放忘れを見つけるスクリプト」を作ったのでご紹介します。

Objective-C で開発しているときに、一つ頭を悩ますのはメモリの解放周りです。
何に悩むかというと、以下の2パターンです。

(a) オブジェクトを解放し過ぎることによるアプリの異常終了
(b) オブジェクトを解放しないことによるメモリリーク

今回の話は(b)を発見する補助ツールのご紹介です。
何かのお役に立てば幸いです。
</description>
         <link>http://yumewaza.yumemi.co.jp/2012/01/objectivecproperty.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2012/01/objectivecproperty.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">iOS</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">iOS</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Objective-C</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Property</category>
        
         <pubDate>Mon, 16 Jan 2012 13:11:03 +0900</pubDate>
      </item>
            <item>
         <title>Git-Redmine: GitのコミットとRedmineを連携する。チケット駆動開発にも。</title>
         <description><![CDATA[おひさしぶりです。
kaoruです。

今回は、日常のGitの利用シーンでRedmineと連携できるGit-Redmineという小さなツールを作ってみたのでご紹介します。
（ツールは後ろのリンクからダウンロードできるので、ぜひお試しください。）

作業管理にRedmine、ソースコードの管理にGitを使っているプロジェクトは最近増えてきていると思います。

Redmineのチケットを見て作業内容を確認、該当するソースコードを修正、最後にGitでコミットしますよね。

Gitでコミットする時には、コミットメッセージというのを書きます。ここには、作業内容や変更点を簡単に記録します。

でも、Redmineを使って作業管理をしているプロジェクトでは、作業内容や変更点はRedmineのチケットの内容と基本的に同じですよね。

だからコミットメッセージを入力するとき、いままで、ウインドウを２つ並べて、Redmineからコミットメッセージの入力欄へのコピペを繰り返し・・・、チケットの番号を書き加えて・・・、とういうことをしていませんでしたか？

これだと、毎回、単純な作業にうんざりだし、コピペミスも怖い。

しかも、コミットメッセージが書くのが面倒で、ついつい２，３文字で済ませちゃった経験ありませんか？

<img alt="git-redmine-nailbook3.jpg" src="http://yumewaza.yumemi.co.jp/img/postfile/git-redmine-nailbook3.jpg" width="500" height="624" />


面倒くさいことはツールで解決！

Git-Redmineを使うと、こんな問題を解決できます。

コミット時に作業の流れでチケットを確認できるので、巷で流行りのチケット駆動開発にもぴったりです。


<h4>できること</h4>

コマンドラインから、Redmineに登録されているチケットを確認できます。
Gitコミット時に、Redmineのチケットのタイトルをコミットメッセージに利用できます。

このツールは、Redmineが用意しているREST APIを利用しています。また、ソースコードをカスタマイズしやすいようにPythonで書いています。


<h4>インストール方法</h4>

1. 本ツール(Git-Redmine)のソースファイルを取得します。

(例)
<pre>$ git clone git://github.com/coiled-coil/git-redmine.git</pre>


2. git-redmineというファイルを実行パスの通った場所にコピーします。

(例)
<pre>$ cd git-redmine
$ mkdir -p $HOME/bin
$ cp src/git-redmine $HOME/bin/</pre>

git-redmineファイルの１行目にpythonのパスが書かれています。
/usr/bin/python以外を利用する場合はパスを書き換えてください。
Python 2.6 以降が必要です。CentOS5では、/usr/bin/python26 などに書き換えてください。


3. RedmineのAPIキーを設定します

APIキーは、Redmineログイン後に、個人設定の中に表示されます。（下の赤線部分）

<img alt="git-redmine-apikey.png" src="http://yumewaza.yumemi.co.jp/img/postfile/git-redmine-apikey.png" width="500" height="502" />

もし、表示されない場合はREST API機能がオフになっている可能性がありますので、
管理者にお問い合わせください。また、古いRedmineでは利用できない可能性があります。


(例)
<pre>$ git config --global redmine.apiKey xxxxxxxxxxxxxxxxxxxxxxxxxxx</pre>


4. プロジェクトのGitレポジトリに、プロジェクトのRedmineのURLを設定します。

(例)
<pre>$ cd /repos/YOUR-PROJECT
$ git config redmine.projectUrl http://SAMPLE.COM/repos/YOUR-PROJECT</pre>


<h4>使い方</h4>

1. チケットの一覧を表示する。
<pre>$ git redmine</pre>

2. あるチケットの詳細を表示する。
<pre>$ git redmine 1234</pre>

3. あるチケットの情報を利用して、コミットを行う。
<pre>$ git redmine commit 1234</pre>

4. あるチケットの情報を利用して、コミットを行う。同時にチケットの達成率を90%に更新する。
<pre>$ git redmine commit 1234 --done-ratio=90</pre>

5. あるチケットの情報を利用して、コミットを行う。同時にチケットの達成率を100%、ステータスを解決済みに更新する。
<pre>$ git redmine commit 1234 --done-ratio=100 --status=3</pre>


<h4>ソースコード</h4>

こちらにソースコードを置いています。
<a href="https://github.com/coiled-coil/git-redmine" target="_blank">https://github.com/coiled-coil/git-redmine</a>]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/08/git-redmine-integration-using-rest-api-python.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/08/git-redmine-integration-using-rest-api-python.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Git</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">API</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Git</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Python</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Redmine</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">REST</category>
        
         <pubDate>Thu, 04 Aug 2011 09:59:38 +0900</pubDate>
      </item>
            <item>
         <title>完全公開！ソーシャルゲーム設計事例：後編</title>
         <description><![CDATA[<h1>はじめに</h1>
<p>
こんにちは。樽八です。<br />
この記事は、前記事「完全公開！ソーシャルゲーム設計事例：前編」の続きになります。
</p>
<p>
まだの方は是非合わせてお読みください。<br/>
○<a href="http://yumewaza.yumemi.co.jp/2011/07/social_game_develop01.html">完全公開！ソーシャルゲーム設計事例：プロローグ編</a><br/>
○<a href="http://yumewaza.yumemi.co.jp/2011/07/social_game_develop02.html">完全公開！ソーシャルゲーム設計事例：前編</a><br/>
</p>
前編では、弊社構築ソーシャルゲームにおける。コンテンツ生成Webサーバの構成とキャッシュまわりについて紹介いたしました。<br/>
いよいよ後編では、データベース構成とシステム全体の冗長化に関して記述させていただきます。<br/>
本丸であり、少々長くなりますがお付き合い下さい。<br/>
<br/>]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/07/social_game_develop03.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/07/social_game_develop03.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">MySQL</category>
                  <category domain="http://www.sixapart.com/ns/types#category">携帯/モバイル</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">ソーシャルゲーム</category>
        
         <pubDate>Wed, 27 Jul 2011 11:00:00 +0900</pubDate>
      </item>
            <item>
         <title>完全公開！ソーシャルゲーム設計事例：前編</title>
         <description><![CDATA[<h1>はじめに</h1>
<p>
こんにちは。樽八です。<br />
この記事は、前記事「<a href="http://yumewaza.yumemi.co.jp/2011/07/social_game_develop01.html">完全公開！ソーシャルゲーム設計事例：プロローグ編</a>」の続きになります。
</p>
<h3>おさらいとして、今回要求されたシステム要件(機能要件および非機能要件)</h3>
<ul>
<li>2000万PV/日のアクセスに耐えるシステムを作ること。</li>
<li>会員数の増減に合わせて速やかにシステム全体の構成を変更出来ること。</li>
<li>予期される障害発生に関しては、たとえスループットが落ちた状態状態であったとしても通常サービスの継続が可能であること。</li>
<li>特定の機器が障害によって復旧不可能な状態に陥っても、サービス継続に必要なデータが復旧可能であること。</li>
<li>負荷のピーク時においても、各ページの応答時間が5秒を超えないこと。</li>
<li>サービスを動かしながらの頻繁なアップデートおよびデータ更新が可能であること。</li>
</ul>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/07/social_game_develop02.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/07/social_game_develop02.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">MySQL</category>
                  <category domain="http://www.sixapart.com/ns/types#category">携帯/モバイル</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">ソーシャルゲーム</category>
        
         <pubDate>Tue, 26 Jul 2011 11:00:00 +0900</pubDate>
      </item>
            <item>
         <title>完全公開！ソーシャルゲーム設計事例：プロローグ</title>
         <description><![CDATA[<h1>はじめに</h1>
<p>
こんにちは。樽八です。
</p>
<p>
ちょうど1年ほど前になりますが、弊社にてGREEプラットフォームにおけるソーシャルアプリ携帯ゲーム「偉人伝心」のリリースを致しました。<br />
その時のシステムに対する機能要求および非機能要求に対してできたこと、できなかったことをエンジニア視点で列挙したいと思います。
</p>
<h1>システムに対する要求と、達成、未達成状況</h1>
<h2>ほぼ達成された要求項目(４項目)</h2>
<h3>2000万PV/日のアクセスに耐えるシステムを作ること。</h3>
<p>
&nbsp;&nbsp;&rarr;負荷試験時において、画像合成、Flash合成ページを含めて、webサーバ１０台時の構成において、1400リクエスト/秒(単純計算だと1億2000万PV/日)以上のスループットを達成。<br />
　（※残念なことに、これだけの負荷が実際に掛かることはありませんでした。）
</p>
<h3>会員数の増減に合わせて速やかにシステム全体の構成を変更出来ること。</h3>
<p>
&nbsp;&nbsp;&rarr;サーバの追加に応じてシステム全体のスループットを上げることのできる、スケールアウト可能な構成としました。<br />
&nbsp;&nbsp;&rarr;上記負荷試験時の数字もWebサーバの追加によりさらに引き上げることが出来る事を確認しました。<br />
</p>
<h3>予期される障害発生に関しては、たとえスループットが落ちた状態状態であったとしても通常サービスの継続が可能であること。</h3>
<p>
&nbsp;&nbsp;&rarr;全てのHW機器を冗長化して構築しました。
</p>
<h3>特定の機器が障害によって復旧不可能な状態に陥っても、サービス継続に必要なデータが復旧可能であること。</h3>
<p>
&nbsp;&nbsp;&rarr;上記、HW機器の冗長化に加えて、データの保有に関しても冗長化を行いました。
</p>]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/07/social_game_develop01.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/07/social_game_develop01.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">MySQL</category>
                  <category domain="http://www.sixapart.com/ns/types#category">携帯/モバイル</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">ソーシャルアプリ</category>
        
         <pubDate>Mon, 25 Jul 2011 10:44:07 +0900</pubDate>
      </item>
            <item>
         <title>Android NFCとNexusSで MifareClassic を読み書きする（後編）</title>
         <description><![CDATA[<p>
こんにちは、ちきんです。今回も引き続きMifareClassicの話です。<br/>
今回は、入手した真っさらな MifareClassic(Mifare Standard)のカードに NdefFormatable#format() をしたところ、
NDEF_DISCOVERED で intentが発生したり、Ndef の instanceが使えるようになりましたのでその辺りのお話と、<br/>
MifareClassicシリーズ最終回ということでMifareClassicに関するまとめをしてみたいと思います。
</p>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_3.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_3.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">android</category>
        
         <pubDate>Mon, 07 Mar 2011 14:51:10 +0900</pubDate>
      </item>
            <item>
         <title>Android NFCとNexusSで MifareClassic を読み書きする（中編）</title>
         <description><![CDATA[<p>
こんにちは、ちきんです。<br/>
<a href="http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_1.html">前回</a>に続き、 MifareClassicの話です。<br/>
今回は、 NdefFormatable を使って、 MifareClassic にデータを書き込めるか調査しました。<br/>
結果は、 (おそらく)検証に用いたカードの問題で「中途半端に書込みが成功」というものでした。きっとまっさらなカードなら成功したのではないかと思います。<br/>
色々興味深いこともいくつかわかったので、以下、その状況について説明していきます。<br/>
</p>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_2.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_2.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">android</category>
        
         <pubDate>Fri, 04 Mar 2011 15:51:41 +0900</pubDate>
      </item>
            <item>
         <title>Android NFCとNexusSで MifareClassic を読み書きする（前編）</title>
         <description><![CDATA[<p>
こんにちは、ちきんです。<br/>
<a href="http://yumewaza.yumemi.co.jp/2011/03/nexuss_nfc_gettechlist.html">前回のエントリ</a>で「MifareClassicにNdefFormatableで書きこむとどうなるのか？」という疑問がありましたので、調査を続けていきます。<br/>
今回は準備として MifareClassic カードに読み書きをしたり、データのバックアップやリストアを実装してみました。<br/>
しかし、その過程でいつものようにトラブルが発生し、 解決のためにMifareClassicの仕様を調べてみたところ、
MifareClassicは後戻りできない書込みもできてしまうことなども判明しましたので、その辺りを共有したいと思います。<br/>
<br/>
何せこのカードは私物の保育園の入館証なので、再起不能にしてしまったかと色々冷や汗物語はありましたが、
無駄に長くなるので、なるべく要点を記述していきたいと思います。<br/>
<br/>
</p>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_1.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/03/android_nfc_nexuss_mifare_classic_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">android</category>
        
         <pubDate>Tue, 01 Mar 2011 22:17:55 +0900</pubDate>
      </item>
            <item>
         <title>NexusSによるNFC調査： getTechList 編</title>
         <description><![CDATA[<p>
こんにちは、ちきん(mokemokechicken)です。<br/>
さて、私のNexusSでもやっとAPI10が利用可能になったので、現在色々調査中なのですが、
今回は、 getTechList() という「AndroidがNFC系カードをどのような種別として認識するか」という結果について簡単にメモしておきます。
</p>
<h2>getTechList()の結果</h2>
<p>
<a href="http://developer.android.com/reference/android/nfc/Tag.html#getTechList%28%29">android.nfc.Tag#getTechList()</a>は、
Android端末がNFC系カードを発見したIntentに含まれるTagインスタンスのメソッドで、
<pre>
Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String[] techList = tag.getTechList();
</pre>
などで取得できる値です。<br/>
この techList に入る値は、 android.nfc.tech の TagTechnology を ImplementしたClassの(fully-qualifiedな)名前になります。<br/>
</p>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/03/nexuss_nfc_gettechlist.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/03/nexuss_nfc_gettechlist.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">android</category>
        
         <pubDate>Tue, 01 Mar 2011 22:14:42 +0900</pubDate>
      </item>
            <item>
         <title>Android2.3.2(rooted)→2.3.3 への手動Update ＆ root化失敗による起動不能からの復旧メモ・・・</title>
         <description><![CDATA[<h1>はじめに</h1>
<p>
こんにちは、ちきん(mokemokechicken)です。<br/>
NexusS の2.3.3のOTAが始まりましたが、root化しているので、ちゃんと適用されるかわからないので、手動でやってみました。<br/>
2.3.3へのUpdateは無事上手くいったのですが、再度のRoot化で見事にハマりました。<br/>
私のようなAndroid初心者の方も多いと思われ、こういう失敗の共有もそれなりに有意義だと思ったので、その顛末を公開しておきたいと思います。<br/>
メモベースなので、乱文乱筆すみません。
</p>

<h1>UpdateとRoot化</h1>
<h2>NexusS 2.3.2(rooted) -> 2.3.3 への手動Update</h2>
<h3>Update前の環境</h3>
NexsusS＆Android2.3.2で

<ul>
<li>oem unlock</li>
<li>root化(boot.superboot.img という 2.3.2専用のimgを入れた。そしてこれが後々仇になる・・・)</li>
<li>ClockworkMod(=CWM) 3.0.0.5 導入済み</li>
</ul>
という状態でした。]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/02/android_nexuss_update_rooted_recovery.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/02/android_nexuss_update_rooted_recovery.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Android</category>
        
         <pubDate>Mon, 28 Feb 2011 11:51:58 +0900</pubDate>
      </item>
            <item>
         <title>VirtualBoxでVolume group &quot;VolGroup00&quot; not found というエラーが発生した場合の対処方法</title>
         <description><![CDATA[<p>
  こんにちは<br />
  kaoruです
</p>

<p>
  今回は、ちょっとしたTipsです。VirtualBoxでCentOSのイメージファイルをコピーした際などに発生することがある、Volume group "VolGroup00" not foundというエラーの対処方法についてご紹介します。
</p>

<p>
  あるひとつのエラーに対する対処方法ですが、VirtualBoxやvmwareなどの仮想環境を開発環境に利用することは一般的ですので、意外と同じ問題で困っている方がいらっしゃるのでは・・・と思います。

</p>
<p>
  私も英語サイトも含めて対処方法を検索してみましたが、同じエラーメッセージが出て質問されている方は何人かいらっしゃったものの、ずばり解決という回答を掲載しているWebサイトは発見できませんでしたので、この記事がご参考になればと思います。
</p>

<h4>エラーが発生するシチュエーション</h4>
<p>
  CentOSがインストールされたVirtualBoxのイメージファイルをクローニングした場合、ホスト間で移動した場合、vmwareのイメージファイルをVirtualBoxにコンバートした場合などに発生するようです。今回発生したCentOSのバージョンは5.4です。発生する原因については、下記の参考になるサイトにあるVirtualBoxのしくみの説明が参考になります。
</p>

<h4>解決方法</h4>

<h5>rescueモードで起動する</h5>
<p>
  CentOSのイメージファイル(ISOイメージファイル)をダウンロードします。
  VirtualBoxの仮想メディアマネージャーに登録します。
  仮想環境設定のストレージに割り当てをします。
  そのまま仮想環境を起動します。
  linux rescueと入力してrescueモードで起動すればOKです。
</p>

<h5>initrdを再作成</h5>
<p>
  以下のコマンドを実行してinitrdを再作成します。なお、<a href="http://www.atmarkit.co.jp/flinux/rensai/linuxtips/572scsion.html" target="_blank">@ITの記事</a>を参考にしています。***の部分は環境によって異なります。uname -rで得られる結果を利用してください。
</p>
<pre>
  chroot /mnt/sysimage
  depmod -a
  uname -r
  mv /boot/initrd-******.img /boot/initrd-******.img.org
  mkinitrd /boot/initrd-*****.img *******
</pre>

<h5>/boot/grub/grub.cfgを確認</h5>
<p>
  上記で作成した*.imgファイルがinitrdに指定されていることを確認します。
</p>

<h5>/etc/fstabを確認</h5>
<p>
  ディスクのマウント情報が正しいかどうか確認します。
</p>

<h5>仮想環境を再起動</h5>
<p>
  仮想環境設定のストレージに割り当てを解除してから、仮想環境を再起動すればOKです。
</p>

<h4>補足：VirtualBoxの仮想イメージファイルを変換・クローニングする方法</h4>
<p>
  VirtualBoxの仮想イメージファイルは単にコピーしてリネームしてもうまく動作しません。
  正しくは、VBoxManege clonehdコマンドを利用します。
</p>
<pre>
  VBoxManege clonehd old.vdi new.vdi
</pre>
<p>
  また、入力・出力はvmwareの仮想イメージファイル(*.vmdk)など、他のファイルの種類を指定することも出来ます。
</p>
<pre>
  VBoxManege clonehd old.vmdk new.vdi
</pre>

<h4>参考になるサイト</h4>
<ul>
    <li><a href="http://www.virtualbox.org/manual/ch08.html#vboxmanage-clonevdi" target="_blank">http://www.virtualbox.org/manual/ch08.html#vboxmanage-clonevdi</a></li>
    <p>VBoxManageコマンドのリファレンス</p>

    <li><a href="http://www.virtualbox.org/manual/ch05.html#cloningvdis" target="_blank">http://www.virtualbox.org/manual/ch05.html#cloningvdis</a></li>
    <p>VirtualBoxでディスクイメージをクローンする際の注意点</p>

    <li><a href="http://www.gnu.org/software/grub/" target="_blank">http://www.gnu.org/software/grub/</a></li>
    <p>GNU GRUBのリファレンス</p>

    <li><a href="http://www.atmarkit.co.jp/flinux/rensai/linuxtips/572scsion.html" target="_blank">http://www.atmarkit.co.jp/flinux/rensai/linuxtips/572scsion.html</a></li>
    <p>initrdの作成方法</p>

    <li><a href="http://www.atmarkit.co.jp/flinux/rensai/linuxtips/572scsion.html" target="_blank">http://www.atmarkit.co.jp/flinux/rensai/linuxtips/572scsion.html</a></li>
    <p>initrdの作成方法</p>
</ul>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/02/virtualbox_grub_fstab_volgroup00_not_found.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/02/virtualbox_grub_fstab_volgroup00_not_found.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Kernel</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">fstab</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">grub</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">initrd</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">linux rescue</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">mkinitrd</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">vbox</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">VirtualBox</category>
        
         <pubDate>Wed, 16 Feb 2011 16:26:54 +0900</pubDate>
      </item>
            <item>
         <title>AndroidのNFC機能でFeliCaの読み書きをする</title>
         <description><![CDATA[<p>
初めまして、ちきん(mokemokechicken)です。 今回は、NexusSを使って、FeliCaデータの読み書きをするAndroidアプリを作ったのでそのご紹介をします。
</p>
<p>
AndroidOSの2.3から NFC(Near Field Communication)用のAPIがサポートされるようになりました。 NFCの特徴については<a target="_blank" href="http://goo.gl/tiCIH">この@ITの記事</a>が参考になります。<br />
<br />
NFCの通信規格は、日本で普及しているFeliCaの通信規格を含んでいるので、大抵のNFCリーダー・ライターで物理的にはFeliCaにアクセスすることがでそうですが、 現在の標準NFC APIでは、NDEFデータ以外にアクセスはできません(IDmは取得できますが)。<br />
<br />
しかし、先人たちの努力によって遂に隠しClassを通して、FeliCaのコマンドを発行できるようになり、<a target="_blank" href="http://goo.gl/G9vAI">そのソースコードが公開</a>されました。<br />
<br />
ちょうどその時、kouさんがNexusSを調達されており、Android,NFC,FeliCaについて遊ぶ・・ぢゃなくて調査することになりました。
</p>
<p>
その結果、NexusSと隠しClassによって、FeliCaに対して以下の操作ができることがわかりました。
</p>
<ul>
<li>システムコード一覧の取得： システムコードは、アプリケーション毎に定義されたシステム領域です。</li>
<li>サービスコード一覧の取得： サービスコードは、システム領域内の「ファイル識別子」のようなもの？です。</li>
<li>サービスコード内のデータの読みこみ： 但し、非暗号化領域に限ります。</li>
<li>サービスコード内のデータの書きこみ： 但し、非暗号化＆書込み可能領域に限ります。</li>
</ul>
ただし、隠しClass(@hide)を用いての実装なので、NexusS以外のAndroid2.3端末や、今後のAndroidOSのVersionUP次第ではできなくなる可能性もありますので、一般サービスとしては使えないです。<br />
ですが、どのFeliCaカードがどういう領域を持っているか調べたり、書込み可能領域を編集できるのは、今後色々役に立ちそうなので、今回アプリを作ってみました。
<p>
&nbsp;
</p>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/02/androidnfcfelica.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/02/androidnfcfelica.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Android</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">NFC</category>
        
         <pubDate>Thu, 10 Feb 2011 11:02:22 +0900</pubDate>
      </item>
            <item>
         <title>Tweepon開発でGoogle App Engineに初挑戦</title>
         <description><![CDATA[<style>
.yumewaza_20110207 li {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}
</style>
<div class="yumewaza_20110207">
<p>
  少し、間が空いてしまいました。<br />
  kaoruです。
</p>

<img alt="iPhone-tweepon-dev-300px.jpg" src="/img/postfile/iPhone-tweepon-dev-300px.jpg" width="300" height="402" style="float:right;margin-left:1em;margin-bottom:1em;" />

<p>
  このところ、Twitter連携サービス「Tweepon」の開発に携わっています。<br />
</p>

<p>
  Tweeponはまだ生まれたばかりのサービスですが、無料でお店情報やお得なクーポンをGet！！できるサービスですので、是非ご利用ください。<br />
</p>

<p>
  Tweepon iPhoneアプリ<br />
  <a href="http://tweepon.jp/app_store" target="_blank"><img alt="app_dl.png" border="0" src="/img/postfile/app_dl.png" width="200" height="62" /></a><br />
  <a href="http://tweepon.jp/yumemi" target="_blank">http://yumemi.co.jp/tweepon/</a><br />
</p>

<p>
  Twitterもはじめました！<br />
  <a href="http://tweepon.jp/tweepon_appli" target="_blank">@tweepon_appli</a>
</p>

<p>
  この開発では、仕事では初めてGoogle App Engineを利用してみました。<br />
</p>

<p>
  今回は、Google App Engineでの開発をはじめるにあたって色々と調べたノウハウをご紹介します。<br />
  なお、開発言語はJavaとPythonが選べるのですが、今回はPythonを利用しました。<br />
</p>

<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  1. Google App EngineのサイトからSDKをダウンロードしてインストール
</h4>

<p>
  Google App Engineのサイトはぐぐるとすぐに出てきます。<br />
  後ほど紹介するのですが、慣れてくると英語版のサイトの方がお勧めです。<br />
  まずはSDKをダウンロードしてインストールしましょう<br />
</p>

<p>
  <a href="http://code.google.com/intl/ja/appengine/downloads.html" target="_blank">http://code.google.com/intl/ja/appengine/downloads.html</a>
</p>

<p>
  その後のGoogle App Engine設定はこちらに解説があります。
</p>

<p>
  <a href="http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html" target="_blank">http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html</a>
</p>


<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  2. Pythonをダウンロードしてインストール
</h4>

<p>
  Google App Engine SDKにはPythonはついてきませんので、自分でPythonをインストールする必要があります。<br />
  ここで注意しないといけないのは、今後変わるかもしれませんが、このブログの執筆段階ではPythonのバージョンが2.5でないといけない点です。
</p>

<p>
  Pythonのダウンロードページに行くと、一見2.7しかおいてありません。
</p>

<p>
  私はここで一旦あきらめて、Active Python (<a href="http://www.activestate.com/activepython/downloads" target="_blank">http://www.activestate.com/activepython/downloads</a>) を入れてみたのですが、なぜかエラーが出てGoogle App Engineの開発環境が起動できず。（これは私のやりかたが悪かったのかもしれません）
</p>

<p>
  結局こちらからwww.python.org版の2.5系をダウンロードしてインストールするとうまくいきました。
</p>

<p>
  <a href="http://www.python.org/download/releases/2.5/" target="_blank">http://www.python.org/download/releases/2.5/</a>
</p>

<p>
  気がついたら、2.5のありかを探すのに少し時間がかかってしまいました。
</p>

<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  3. Google App Engine Launcher に Python のありかを登録
</h4>

<p>
  Google App Engine Launcherを起動して、メニューの中の Edit &gt; Preferences... の中で、Pythonのパスの設定をします。<br />
  <code>例： C:\Python25\pythonw.exe</code>
</p>


<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  4. Eclipse + PyDev をインストール
</h4>

<p>
  1-3までの設定で、あとはテキストエディターがあれば一通りの開発が出来ます。
  しかし、本格的に開発をしたいならばデバッガーで変数の中を見たり、ステップ実行をしたりしたいところです。
</p>

<p>
  Eclipse用のPython開発環境であるPyDevは、Google App Engineに対応しているためデバッグ作業に非常に便利です。
  また、文法チェックやコード補完機能もあります。
</p>

<p>
  インストール方法はこちらに詳しく書いてあります。
</p>

<p>
  <a href="http://code.google.com/appengine/articles/eclipse.html" target="_blank">http://code.google.com/appengine/articles/eclipse.html</a>
</p>

<p>
  英語なので簡単に説明すると、
  <ol>
    <li>まずはEclipseをインストール</li>
    <li>ヘルプの中のInstall New Software...を選択</li>
    <li>Available Software Siteを選択</li>
    <li><code>http://pydev.sourceforge.net/updates/</code> を追加</li>
    <li>PyDevにチェックを入れてプラグインをインストール</li>
    <li>Window &gt; Preferences の中の PyDev &gt; Interpreter Python の中の Python Interpreters に Pythonのパスを追加</li>
  </ol>
</p>

<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  5. EclipseからGoogle App Engineのプロジェクトを作成
</h4>

<p>
  新規プロジェクトの作成ウィザードで PyDev &gt; PyDev Google App Engine Project を選択します。
  Nextを選んでいくとGoogle App Engineの場所を入力するように言われますので、インストールした場所を選択します。
</p>

<p>
  <code>例：C:\Program Files (x86)\Google\google_appengine</code>
</p>

<p>
  はじめは、Hello world プロジェクトなどを作ってみるとよいでしょう。
</p>

<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  6. デバッグ実行の方法
</h4>

<p>
  せっかくEclipse上で開発をするのですから、ステップ実行したりブレークポイントを使ったりしたいですよね！
</p>

<p>
  そこで、デバッグ実行の方法を説明します。
</p>

<ol>
    <li>メニューから Run &gt; Debug Configurations を選択</li>
    <li>PyDev Google App Runを選びます。</li>
    <li>ProjectにはGoogle App Engine用のプロジェクトを選択</li>
    <li>Main Module には、Google App Engine のdev_appserver.py を選択します。</li>
    例：${GOOGLE_APP_ENGINE}/dev_appserver.py
    <img alt="pyDev-debug-config.png" src="/img/postfile/pyDev-debug-config.png" width="344" height="289"   style="clear:both;margin-left:1em;margin-bottom:1em; margin-top:1em;" align="center" />

    <li>Argumentsにはdev_appserver.pyの起動オプションを書きます。</li>
    <p>
      こちらを参考にしてください。<br />
    </p>
    <p>
      <a href="http://code.google.com/intl/ja/appengine/docs/python/tools/devserver.html" target="_blank">http://code.google.com/intl/ja/appengine/docs/python/tools/devserver.html</a>
    </p>
    ここでは、
    <p>
      <code>${project_loc}/src</code>
    </p>
    と設定しました。
    <li>Applyを押して保存します。</li>
    <li>Debugボタンを押します。</li>
    <li>EclipseのConsoleに起動メッセージが出ればOKです。</li>
    <li>さっそくソースコードにブレークポイントを置いて、正しくデバッグできるかどうかみてみましょう。ブレークポイントはソースファイルの左の余白のところをダブルクリックすると置けます。</li>
    <li>Webブラウザから <code>http://localhost:8080/</code> にアクセスしてみてください。それからEclipseの画面を確認すると、ちゃんとブレークポイントが機能していますね。</li>
</ol>

<img alt="stop_on_break_point.jpg" src="/img/postfile/stop_on_break_point.jpg" width="400" height="172"  style="clear:both;margin-left:1em;margin-bottom:1em; margin-top:1em;" align="center" />

<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  7. Google App Engine 本番環境 (appspot.com)へのアップロード
</h4>

<p>
  開発が終了したら、Google App Engine 本番環境へアップロードします。<br />
  Google App Engine LauncherにあるDeploy機能を使うのが簡単です。
</p>


<!-- ///////////////////////////////////////////////////////////////////////////// -->
<h4>
  おわりに
</h4>

<p>
  いかがでしたでしょうか。<br />
  今回は、Google App Engineの開発環境の構築方法を中心にご紹介しました。
</p>

<p>
  Google App Engineを利用すると小規模なサイトなら無料で運営でき、開発環境も整っていて、とても簡単にサービスが作れます。
</p>

<p>
  是非、お試しください。
</p>
</div>
]]></description>
         <link>http://yumewaza.yumemi.co.jp/2011/02/tweepon-google-app-engine.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2011/02/tweepon-google-app-engine.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Google App Engine</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Google App Engine</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">PyDev</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Python</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">Tweepon</category>
        
         <pubDate>Tue, 08 Feb 2011 11:33:06 +0900</pubDate>
      </item>
            <item>
         <title>MySQL &quot;SHOW ENGINE INNODB STATUS&quot;の読み方　その2</title>
         <description><![CDATA[
kouです。


だいぶ間が空いてしまいましたが、<a href="http://yumewaza.yumemi.co.jp/2010/06/mysql_show_engine_innodb_statu.html" target="_blank">続き</a>を書いてみたいと思います。


<b>トランザクションセクション</b>

<pre>
14 ------------
15 TRANSACTIONS
16 ------------
17 Trx id counter 0 487637614
18 Purge done for trx's n:o < 0 487637607 undo n:o < 0 0
19 History list length 1
20 Total number of lock structs in row lock hash table 0
21 LIST OF TRANSACTIONS FOR EACH SESSION:
22 ---TRANSACTION 0 0, not started, process no 3424, OS thread id 1169332544
23 MySQL thread id 11166, query id 14476345 localhost root
24 SHOW ENGINE INNODB STATUS
25 ---TRANSACTION 0 487637613, ACTIVE 4799 sec, process no 3424, OS thread id 1089030464 starting index read, thread declared inside InnoDB 239
27 mysql tables in use 2, locked 0
28 MySQL thread id 10794, query id 14474613 172.16.xx.xx batch Sending data
29 SQL文（省略）
30 Trx read view will not see trx with id >= 0 487637614, sees < 0 487637614
</pre>


このセクションには現在実行中のトランザクションに関する情報が出力されます。



17行目の<i>Trx id counter</i>は現在のトランザクションIDカウンターの値を表します。これはトランザクション毎に発行されインクリメントされていきます。"0"と"487637607"と数値が二つありますが、上位32ビットと下位32ビットで区切られているためです。以下のその他の数値も同様です。


18行目の<i>Purge done for trx's n:0</i>はどこまでロールバックセグメントのパージ処理が終わったかを示しています。ここではトランザクションID "487637607"までのパージが終わっています。InnoDBは<a href="http://dev.mysql.com/doc/refman/5.1/ja/innodb-multi-versioning.html" target="_blank">マルチバージョニングデータベース</a>であるため古いバージョンのレコード情報を保持しています。レコード削除した場合でもストレージエンジン内ではすぐにレコードは物理削除されず、削除フラグが立った状態です。この削除フラグが立ったレコードは適切なタイミングでパージされます。ここでは"487637607"までパージされたことを示しています。

<i>undo n:o</i>はUNDOログのレコード数を示していて現在は"0"です。


19行目の<i>History list length</i>はロールバックセグメントでまだパージされていないヒストリ数です。


21行目からは個々のトランザクションの状態が表示されています。
この例ではトランザクションが二つです。22?24行目、25?30行目がそれぞれのトランザクションです。

22?24行目のトランザクションはこのコマンド（SHOW ENGINE INNODB STATUS）を発行している自身のトランザクションです。25?30行目が実際に発行されているSQLのトランザクションになります。


ここでは25?30行目のトランザクションをみていきます。


25行目の<i>TRANSACTION 0 487637613</i>は当トランザクションIDです。<i>ACTIVE 4799 sec</i>はこのトランザクションのステータスと生存時間です。"Active"となっていますので、現在処理中です。重たいクエリを発行していますので大変時間がかかっています。


<i>process no 3432</i>はOSのプロセス番号、<i>OS thread id 1089030464 starting index read</i>はOSのスレッドIDでインデックスデータを読み込んでいます。gdbなどでデバッグする際にこれらの情報が役に立ちます。

<i>thread declared inside InnoDB 239</i>はInnoDB内部でのスレッド割当状況です。


27行目の<i>mysql tables in use 2, locked 0</i>はこのトランザクションが利用しているテーブル数（"2"）と取得しているロックの数（"0"）を示します。


28行目の<i>MySQL thread id 10794, query id 14474613</i>はこのクエリ（"14474613"）がどのスレッド（"10794"）で実行されているかを表示しています。SHOW PROCESSLISTで表示される情報と同様です。


29行目は実際に実行されているSQL文を表示。


30行目の<i>Trx read view will not see trx with id >= 0 487637614</i>はこのトランザクション開始後に開始されたトランザクションIDです。また<i>sees < 0 487637614</i>はこのトランザクション開始前に終了していたトランザクションです。利用している<a href="http://dev.mysql.com/doc/refman/5.1/ja/innodb-transaction-isolation.html" target="_blank">トランザクション分離レベル</a>と前後のトランザクションの情報からこのトランザクション内でどのようなデータの見え方をしているかが推測できるため、トラブルシュート時に役立つことがあるかもしれません。





「その3」へ続く。





参考サイト/書籍：
<a href="http://www.mysqlperformanceblog.com/2006/07/17/show-innodb-status-walk-through/" target="_blank">MySQL Performance Blog - SHOW INNODB STATUS walk through</a>
<a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-monitors.html" target="_blank">MySQL 5.0 Reference Manual - 13.2.13.2. SHOW ENGINE INNODB STATUS and the InnoDB Monitors</a>
<a fred="" target="_blank">実践ハイパフォーマンスMySQL 第2版</a>


]]></description>
         <link>http://yumewaza.yumemi.co.jp/2010/11/mysql_show_engine_innodb_statu_1.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2010/11/mysql_show_engine_innodb_statu_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">MySQL</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">innodb</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">mysql</category>
        
         <pubDate>Tue, 30 Nov 2010 13:47:11 +0900</pubDate>
      </item>
            <item>
         <title>Android で LINQ を実現！</title>
         <description><![CDATA[<p>
<strong>はじめに</strong>
</p>
<p>
こんにちは。お久しぶりですね。hiroです。
</p>
<p>
昨今の、オブジェクト指向の考え方の普及に伴い、プログラマの誰もがオブジェクト指向言語を用いてソフトウェアを開発するようになりました。しかし同時にリレーショナルデータベースや、といった、オブジェクト指向では表されていないデータ構造へのアクセスが容易ではない事が課題として挙がっています。
</p>
<p>
この「Collection Context」ライブラリでは、これらの非オブジェクト指向なデータ構造を持つデータソースを、オブジェクト指向言語であるJava言語でいかに容易に扱うかをテーマに、コレクション操作が容易になるようなを提供しています。
</p>
<p>
<strong>1.JavaにLINQのエッセンスを</strong>
</p>
<p>
&nbsp;&nbsp;Microsoft社の.NET Frameworkでは、C# 3.0およびVisual Basic 9.0よりサポートされたLINQ式およびLINQ関連ライブラリのAPIセットによってコレクション操作を容易にしています。特にC#、VB言語においては、言語に統合されたクエリ式が記述できるように言語機能が拡張されています。これにより、メモリ上のオブジェクト、データベース上のオブジェクト、XMLなどがほぼ同一のクエリ記法によって操作が可能です。このように、.NET FrameworkはAPIが徐々にモダンに置き換わります。
</p>
<p>
&nbsp;&nbsp;一方、Javaにはこのような言語拡張はありません。コレクション関連のAPIも、Java Collection Frameworkがジェネリクスに対応したJ2SE 5.0以降、これといった拡張もありません。また、データベースアクセスはJDBCとして不動、XML操作はStAXがJava 6で加わりましたが、これらを横断して「データの集合」という概念で扱えるフレームワークやライブラリはありません。
</p>
<p>
&nbsp;&nbsp;最近、Javaには新しいプラットフォームが増えました。Androidです。Androidで採用されているJavaは、正確にはSun Microsystems社のJavaではありませんが、Java SEの主要なAPIをサポートし、さらにAndroidに特化したAPIを提供しています。このプラットフォーム上においても、コレクション操作に関するライブラリはかつてのJavaのままです。<br />
ということで、「JavaにLINQのエッセンスを」をテーマに、モダンなコレクション操作機能を提供するためのライブラリ、それが「Collection Context」です。
</p>
<p>
<strong>2..NET FrameworkのLINQとの違い</strong>
</p>
<p>
&nbsp;&nbsp;.NET FrameworkのLINQの実装は、LINQプロバイダと呼ばれるプロバイダによって機能が提供されるようになっています。メモリ上のオブジェクト用LINQプロバイダ、データベース向けLINQプロバイダ、XML向けLINQプロバイダといった調子です。Collection Contextもこの概念に則っています。
</p>
<p>
&nbsp;&nbsp;違いは、Javaにクエリ式を記述できる言語拡張が無いという点と、ラムダ式が無いという点です。LINQは専用の文法を使用しても、メソッドをコールしても利用できます。Collection Contextは、Java向けの専用の文法が無いため、メソッドをコールして使用します。
</p>
<p>
<strong>3.Collection Contextのライブラリセットとプラットフォーム</strong>
</p>
<p>
&nbsp;&nbsp;Collection Contextは単一のライブラリではありません。現在、以下の2種類にて分かれています。<br />
(1)Collection Contextのフレームワーク部分<br />
&nbsp;&nbsp;Collection Contextの名を表す根幹です。コレクション操作の文脈（処理の流れ）をAPIで提供します。<br />
また、XML文字列を簡単に操作するための、DOMに類似した（ただし、別のアプローチからの）モダンなXML関連APIを提供します。このAPIは各プラットフォームで用意されている標準のパーサを使用するように作られており、パーサ自体は含んでいません。
</p>
<p>
(2)プラットフォームのAPIによるリソースマネジメントの実装<br />
&nbsp;&nbsp;実際に、プラットフォームで扱えるリソースをマネジメントするためのAPIが準備されています。2010年10月現在、Androidプラットフォーム向けの実装が準備されており、このプラットフォーム上では以下のリソースがCollection Context上で扱えるようになります。
</p>
<ol>
<li>SQLiteデータベース</li>
<li>JSONオブジェクト</li>
<li>XML（org.xmlpull.v1パッケージに含まれるプル型パーサと、SAXパーサの両方）</li>
<li>メモリ上のオブジェクト</li>
</ol>
これにより、現在Collection Contextが稼働可能なプラットフォームはAndroid 1.6以降となります。サーバサイドJava開発に必要なライブラリの実装は今後の課題としています。
<p>
&nbsp;
</p>
<p>
※ダウンロードしてご利用いただけるjarファイルは、このAndroid 1.6以降でご利用頂けるもので、上記(1), (2)のすべてをワンパッケージにしています。
</p>
<p>
<strong>4.CollectionContext&lt;T&gt;クラスの基礎</strong>
</p>
<p>
&nbsp;&nbsp;まずはじめに、Collection Contextを用いたXML処理の例を以下に示します。これは、AndroidプラットフォームにおいてXMLデータをJavaのオブジェクトに変換しています。
</p>
<pre>
String uri = <span style="color:#009900;">&quot;http://www.example.com/example-resource&quot;</span>;
Iterable&lt;Person&gt; persons = XElement
    .from(uri, <span style="color:#000099;">new</span> XmlSaxParserWrapper(), <span style="color:#009900;">&quot;UTF-8&quot;</span>)
    .descendants(<span style="color:#009900;">&quot;person&quot;</span>)
    .where(<span style="color:#000099;">new</span> F1&lt;XElement, Boolean&gt;() { <span style="color:#000099;">public</span> Boolean f(XElement node) {
        <span style="color:#000099;">return</span> node.attribute(<span style="color:#009900;">&quot;person-id&quot;</span>).intValue() &gt; <span style="color:#009900;">10</span>;
     }})
    .select(<span style="color:#000099;">new</span> F1&lt;XElement, Person&gt;() { <span style="color:#000099;">public</span> Person f(XElement node) {
        Person person = <span style="color:#000099;">new</span> Person();
        person.setID(node.attribute(<span style="color:#009900;">&quot;id&quot;</span>).longValue());
        person.setName(node.element(<span style="color:#009900;">&quot;name&quot;</span>).stringValue());
        person.setAddress(node.element(<span style="color:#009900;">&quot;address&quot;</span>).stringValue());
        person.setBirthday(node.element(<span style="color:#009900;">&quot;birthday&quot;</span>).dateTimeValue(<span style="color:#009900;">&quot;yyyy-MM-dd&quot;</span>));
        <span style="color:#000099;">return</span> person;
    }});
</pre>
<p>
&nbsp;&nbsp;XElementクラスのstaticメソッドfrom()に、XMLのURIと、XMLパーサのインスタンス、XMLの文字コードを指定し、XMLをパースする方法を指定するところから記述が始まっています。次のdesendants()メソッドは、ルートタグの次の階層の「person」という名称のタグ情報をコレクション化するメソッドです。 そのコレクションにwhere()メソッドにてフィルタ条件を指定しています。少し見にくいかもしれませんが、関数を表すオブジェクトが匿名クラスとして実装されています。さらに、select()メソッドにて射影操作を指定しています。XElementのオブジェクトであるnodeをPersonクラスのオブジェクトに変換しています。select()メソッドが返すインスタンスはjava.lang.Iterable型を実装しています。従ってpersonsオブジェクトは拡張for文で逐次参照が可能です。
</p>
<p>
&nbsp;&nbsp;このように、Collection Contextフレームワークを用いると、ネットワーク処理とXMLパース処理における各種リソースのマネジメントが自動化されます。これによって、プログラマはデータの変換処理を容易に記述でき、この処理の前後のビジネスロジックの記述に専念できます。
</p>
<p>
&nbsp;&nbsp;上記where()メソッドやselect()メソッドはCollectionContext&lt;T&gt;クラスのメソッドです。CollectionContext&lt;T&gt;クラスは、Collection Contextフレームワークの中核をなすクラスで、配列やIterable&lt;S&gt;を実装するオブジェクトに対するフィルタ処理や射影処理等をメソッドチェーン方式で記述できる機能を提供します。
</p>
<p>
CollectionContext&lt;T&gt;クラスにもstaticなfrom()メソッドが用意されており、配列やIterable&lt;T&gt;を実装するオブジェクトをCollectionContext&lt;T&gt;オブジェクトに変換することができます。
</p>
<p>
CollectionContext&lt;T&gt;クラスで指定できる機能とメソッドは以下の通りです。
</p>
<p>
&nbsp;
</p>
<ol>
<li>from()：既存の配列やIterable&lt;T&gt;で表されるコレクションをCollectionContext&lt;T&gt;オブジェクトに変換する。</li>
<li>where()：フィルタを指定する。指定されたオブジェクトは遅延実行される。</li>
<li>select()：射影を指定する。このメソッドで返されるCollectionContextは、射影後のコレクションを表す。遅延実行される。</li>
<li>comparator()、orderByAsc()、orderByDesc()：ソート条件を指定する。遅延実行される。</li>
<li>foreach()：コレクションに上記フィルタ条件、ソート条件を適用しながら1件毎に、指定された処理ルーチンをコールする。メソッドが呼ばれた時点で即時実行される。</li>
<li>first()：コレクションにフィルタ条件、ソート条件を適用し、最初の1件を取得する。オーバーライドされたメソッドに、射影を行うことができるタイプもある。即時実行される。</li>
<li>appendTo()：既存のList&lt;T&gt;オブジェクトで表されるコレクションの末尾に、このCollectionContext&lt;T&gt;オブジェクトで表されるコレクションをコピーする。フィルタおよびソート条件が適用される。即時実行される。</li>
<li>toList()：内包するコレクションにフィルタおよびソート条件が適用され、List&lt;T&gt;オブジェクトを生成する。即時実行される。</li>
</ol>
<br />
&nbsp;&nbsp;つまり、CollectionContext&lt;T&gt;クラスのみを用いてコレクション操作を行う場合、from()メソッドの取りうるタイプの都合上、メモリ上のコレクションか、独自にIterable&lt;S&gt;を実装したクラスのオブジェクトを指定する必要があります。逆に、このインターフェイスに則ったクラスを作成することで、Collection Contextフレームワークがサポートしていないリソース経由でデータを取得し、コレクション操作を行うことも可能です。
<p>
&nbsp;
</p>
<p>
&nbsp;&nbsp;また、CollectionContext&lt;T&gt;クラスは、Iterable&lt;T&gt;インターフェイスを実装しています。従って、このクラスのオブジェクトは直接、拡張for文で使用できます。
</p>
<p>
<strong>5.CollectionContext&lt;T&gt;オブジェクトを生成できる各クラス</strong>
</p>
<p>
&nbsp;&nbsp;CollectionContext&lt;T&gt;オブジェクトを生成できるのは、自身のfrom()メソッドだけではありません。上記(1)の末尾でも述べられているように、Iterable&lt;S&gt;を実装したクラスのオブジェクトを生成できるクラスも以下のように提供されています。ただし、2010年10月現在、これらが稼働するのはAndroidプラットフォームの、バージョン1.6以上のみです。
</p>
<p>
(1)XML中のデータをコレクション化するXElementクラス<br />
サンプルコードは既出のとおりです。
</p>
<p>
(2)SQLiteデータベースの参照処理を生成するSQLiteContextBuilderクラス
</p>
<p>
&nbsp;&nbsp;Androidプラットフォームには、組込データベースとして、SQLiteが採用されており、プラットフォームの標準APIとしても実装されています。ただし、このAPIはJDBCではありません。独自に実装されたAPIとなっています。
</p>
<p>
Collection Contextフレームワークでは、SQLite関連クラスとして、DatabaseCursorIterableクラスと、SQLiteContextBuilderクラスが標準で提供されています。DatabaseCursorIterableはIterableを実装しているため、CollectionContext&lt;T&gt;クラスのfrom()メソッドで使用できます。しかし、通常はSQLiteContextBuilderを使用し、メソッドチェーンの記法を用いて「簡単に」データベースの参照コードを記述します。これにより、コードがより宣言型に近づき、バグも潜みにくくなります。
</p>
<pre>
CollectionContext&lt;Shop&gt; shops = SQLiteContextBuilder
        .newBuilder(<span style="color:#000099;">new</span> SQLiteOpenHelperImpl())
        .query(   <span style="color:#009900;">&quot;SELECT &quot;</span> +
            <span style="color:#009900;">&quot;  ID, &quot;</span> +
            <span style="color:#009900;">&quot;  SHOP_ID, &quot;</span> +
            <span style="color:#009900;">&quot;  NAME, &quot;</span> +
            <span style="color:#009900;">&quot;  LATITUDE, &quot;</span> +
            <span style="color:#009900;">&quot;  LONGITUDE, &quot;</span> +
            <span style="color:#009900;">&quot;  URL &quot;</span> +
            <span style="color:#009900;">&quot;FROM &quot;</span> +
            <span style="color:#009900;">&quot;  SHOP &quot;</span> +
            <span style="color:#009900;">&quot;WHERE &quot;</span> +
            <span style="color:#009900;">&quot;  ? &lt;= REGISTERED AND &quot;</span> +
            <span style="color:#009900;">&quot;  REGISTERED &lt; ? &quot;</span>
            registeredBegin, registeredEnd)
        .contextToRead()
        .select(<span style="color:#000099;">new</span> F1&lt;Cursor, Shop&gt;() { <span style="color:#000099;">public</span> Shop f(Cursor cursor) {
            Shop result = <span style="color:#000099;">new</span> Shop();
            
            result.id = cursor.getInt(<span style="color:#009900;">0</span>);
            result.shopID = cursor.getInt(<span style="color:#009900;">1</span>);
            result.name   = cursor.getString(<span style="color:#009900;">2</span>);
            result.latitude   = cursor.getDouble(<span style="color:#009900;">3</span>);
            result.longitude    = cursor.getDouble(<span style="color:#009900;">4</span>);
            result.url  = cursor.getString(<span style="color:#009900;">5</span>);
            
            <span style="color:#000099;">return</span> result;
         }});

</pre>
<p>
&nbsp;&nbsp;このコードでは、query()メソッドでSQL文とパラメータを指定しています。contextToRead()メソッドをコールすると、それ以降はCollectionContextクラスのメソッドとなります。select()メソッドを使い、CursorオブジェクトからShopオブジェクトへ射影しています。最終的に得られる値はCollectionContextオブジェクトです。
</p>
<p>
(3)JSON文字列を処理するorg.json.JSONObjectクラスをコレクションとみなすJSONObjectIterableクラス
</p>
<p>
&nbsp;&nbsp;最近は、Web上のAPIのデータ送受信の表現として、JSONを用いることも多くなってきました。Facebookは特に、全般的にJSONでデータをやり取りし、ソーシャルグラフを操作します。AndroidプラットフォームにもJSONを操作するAPIが用意されています。これをCollectionContext&lt;T&gt;オブジェクトに変換している例が以下の例です。
</p>
<pre>
String result = facebook.request(url, parameters, method);
    CollectionContext&lt;FacebookFriend&gt; friends = JSONObjectIterable
        .from(result, <span style="color:#009900;">&quot;data&quot;</span>)
        .select(<span style="color:#000099;">new</span> F1&lt;JSONObject, FacebookFriend&gt;() {
            <span style="color:#000099;">public</span> FacebookFriend f(JSONObject friend) {
            FacebookFriend result = <span style="color:#000099;">new</span> FacebookFriend();
            result.facebookID = friend.optString(<span style="color:#009900;">&quot;id&quot;</span>);
            result.name   = friend.optString(<span style="color:#009900;">&quot;name&quot;</span>);
            <span style="color:#000099;">return</span> result;
        }});
</pre>
<p>
&nbsp;&nbsp;「友達」を表すJSONObject &ldquo;friend&rdquo;を、FacebookFriendクラスのオブジェクトに変換しています。JSONObjectIterableクラスのfrom()メソッドは、JSON文字列をJSONObjectに変換する処理を行い、CollectionContextを生成します。そして、select()メソッドで射影を行い、得られるのはCollectionContextオブジェクトです。
</p>
<p>
(4)内部イテレータの表現を外部イテレータへ変換するOuterIterable&lt;T&gt;クラス
</p>
<p>
&nbsp;&nbsp;OuterIterable&lt;T&gt;クラスは特殊用途を想定しています。通常、CollectionContext&lt;T&gt;オブジェクトを生成するためには、from()メソッドにIterable&lt;T&gt;オブジェクトを渡すのですが、場合によってはIterable&lt;T&gt;を実装したクラスを作成しなければならない場合があります。この実装が外部イテレータの表現を強いられるため、扱うリソースによっては実装が容易でないケースもあります。
</p>
<p>
例えば、ストリームから文字列を行単位で入力し、その文字列を1行単位で参照できるIterableを実装すると、以下のようになります。
</p>
<pre>
<span style="color:#000099;">public</span> <span style="color:#000099;">class</span> OuterIterableImpl
        <span style="color:#000099;">implements</span> Iterable&lt;String&gt;, Iterator&lt;String&gt; {
        
        <span style="color:#000099;">private</span> <span style="color:#000099;">boolean</span> initialized = false;
        <span style="color:#000099;">private</span> String filePath = null;
        <span style="color:#000099;">private</span> BufferedReader reader = null;
        <span style="color:#000099;">private</span> String next = null;
        <span style="color:#000099;">public</span> OuterIterableImpl1(String filePath) {
            <span style="color:#000099;">this</span>.filePath = filePath;
        }
        
        @Override       
        <span style="color:#000099;">public</span> Iterator&lt;String&gt; iterator() {
            <span style="color:#000099;">return</span> <span style="color:#000099;">this</span>;
        }
        <span style="color:#000099;">private</span> <span style="color:#000099;">void</span> initialize() <span style="color:#000099;">throws</span> IOException {
            <span style="color:#000099;">this</span>.reader =
                <span style="color:#000099;">new</span> BufferedReader(<span style="color:#000099;">new</span> InputStreamReader(
                    <span style="color:#000099;">new</span> FileInputStream(<span style="color:#000099;">this</span>.filePath)));
        }
        <span style="color:#000099;">private</span> <span style="color:#000099;">void</span> dispose() {
            <span style="color:#000099;">try</span> {
                <span style="color:#000099;">this</span>.reader.close();
            }
            <span style="color:#000099;">catch</span> (IOException ex) {
                <span style="color:#990000;">// something to do</span>
            }
        }
        
        @Override
        <span style="color:#000099;">public</span> <span style="color:#000099;">boolean</span> hasNext() {
            <span style="color:#000099;">if</span> (!<span style="color:#000099;">this</span>.initialized) {
                <span style="color:#000099;">try</span> {
                    initialize();
                }
                <span style="color:#000099;">catch</span> (IOException ex) {
                    <span style="color:#000099;">return</span> false;
                }
            }
            <span style="color:#000099;">try</span> {
                String nextLine = <span style="color:#000099;">this</span>.reader.readLine();
                <span style="color:#000099;">if</span> (nextLine != null) {
                    <span style="color:#000099;">this</span>.next = nextLine;
                    <span style="color:#000099;">return</span> true;
                }
                <span style="color:#000099;">else</span> {
                    dispose();
                    <span style="color:#000099;">return</span> false;
                }
            }
            <span style="color:#000099;">catch</span> (IOException ex) {
                dispose();
                <span style="color:#000099;">return</span> false;
            }
        }
        
        @Override
        <span style="color:#000099;">public</span> String next() {
            <span style="color:#000099;">return</span> <span style="color:#000099;">this</span>.next;
        }
        
        @Override
        <span style="color:#000099;">public</span> <span style="color:#000099;">void</span> remove() {
            <span style="color:#000099;">throw</span> <span style="color:#000099;">new</span> UnsupportedOperationException();
        }
    }

</pre>
<p>
&nbsp;&nbsp;非常に長い上、ストリームというリソースを扱うライフサイクルがメソッド間で分離され、メンテナンスが容易でなくなります。一方、context.OuterIterable&lt;T&gt;を使用してIterableを実装すると以下のようになります。
</p>
<pre>
 <span style="color:#000099;">public</span> <span style="color:#000099;">class</span> OuterIterableImpl2 <span style="color:#000099;">extends</span> OuterIterable&lt;String&gt; {
        <span style="color:#000099;">private</span> String filePath = null;
        <span style="color:#000099;">public</span> OuterIterableImpl2(String filePath) {
            <span style="color:#000099;">this</span>.filePath = filePath;
        }
        
        @Override       
        <span style="color:#000099;">protected</span> <span style="color:#000099;">void</span> iterate() {
            BufferedReader reader = null;
            <span style="color:#000099;">try</span> {
                reader = <span style="color:#000099;">new</span> BufferedReader(
                    <span style="color:#000099;">new</span> InputStreamReader(
                    <span style="color:#000099;">new</span> FileInputStream(<span style="color:#000099;">this</span>.filePath)));
            }
            <span style="color:#000099;">catch</span> (IOException ex) {
                <span style="color:#000099;">return</span>;
            }
            <span style="color:#000099;">try</span> {
                String nextLine = reader.readLine();
                <span style="color:#000099;">while</span> (nextLine != null) {
                    yield(nextLine);
                }
            }
            <span style="color:#000099;">catch</span> (IOException ex) {
                <span style="color:#990000;">// something to do</span>
            }
            <span style="color:#000099;">finally</span> {
                <span style="color:#000099;">try</span> { reader.close(); } <span style="color:#000099;">catch</span> (IOException ex) { }
            }
        }
    }

        
</pre>
<p>
特徴はyield()メソッドにあります。このメソッドへ文字列を指定することで、このIterableオブジェクトは指定された順番で文字列を取り出すことができます。このOuterIterable&lt;T&gt;オブジェクトをCollectionContext&lt;T&gt;クラスのfrom()メソッドに指定することで、ストリームから得た文字列のコレクションにフィルタをかけたり射影したりできるようになります。
</p>
<p>
<strong>6.Collection Contextフレームワークのご利用にあたって</strong>
</p>
<p>
このCollection Contextフレームワークは、当社実験サイト「YUMEMI Labs」からダウンロードしてご利用頂けます。ただし、自己責任でご利用ください。当社はいかなる損害も補償できませんのであしからずご了承ください。
</p>
<p>
初期リリースはバイナリのみの配布とさせていただきます。オープンソース化は今後検討いたします。
</p>
<p>
開発用ドキュメントは、この「ゆめ技」の記事と、javadocです。ご意見・ご要望・ご質問のすべてにお答えできるかどうかは分かりませんが、皆さんのご意見・ご要望がこのフレームワークの成長を加速させる原動力であることは確かです。また、頂いたご質問を元に、ゆめ技の記事を書いていこうと考えています。どうぞよろしくお願いします。
</p>
■アプリケーション開発と実行に必要なライブラリファイルのダウンロード<a href="http://yumewaza.yumemi.co.jp/img/postfile/CollectionContextAndroid1.0.0.jar">CollectionContextAndroid1.0.0.jar</a>
<br />
■アプリケーションの開発時に参照するドキュメントファイルをダウンロード<a href="http://yumewaza.yumemi.co.jp/img/postfile/CollectionContextAndroid1.0.0_javadoc.zip">CollectionContextAndroid1.0.0_javadoc.zip</a>
</a>]]></description>
         <link>http://yumewaza.yumemi.co.jp/2010/10/android_linq.html</link>
         <guid>http://yumewaza.yumemi.co.jp/2010/10/android_linq.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Android</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">android</category>
        
         <pubDate>Wed, 20 Oct 2010 13:09:19 +0900</pubDate>
      </item>
      
   </channel>
</rss>

