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


<?xml-stylesheet href="http://d.hatena.ne.jp/lesamoureuses/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/lesamoureuses/rss">
<title>こんにちは！こんにちは！monmonといいます！</title>
<link>http://d.hatena.ne.jp/lesamoureuses/</link>
<description>こんにちは！こんにちは！monmonといいます！</description>

<dc:creator>lesamoureuses</dc:creator>
<dc:date>2013-06-05T15:54:23+09:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://d.hatena.ne.jp/lesamoureuses/20130317/1363498344"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/lesamoureuses/20130116/1358321670"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/lesamoureuses/20121217/1355720541"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/lesamoureuses/20121126/1353923298"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/lesamoureuses/20121107/1352250597"/>
</rdf:Seq>
</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/lesamoureuses/20130317/1363498344">
<title>[1password][mac]USBに1Password.agilekeychainを入れててパスワード解除ができなくなったときの対処法</title>
<link>http://d.hatena.ne.jp/lesamoureuses/20130317/1363498344</link>
<description> MacBook Airのディスク容量が少ないのでDropboxをUSBに入れてそこに1Passwordを入れているのですが、 USBを外して付け直したりすると1Passwordが上手く動かないことがあり困りました。 現象 正しいマスターパスワードを入れているのに解除できない コンソールにはこんな感じ</description>

<content:encoded><![CDATA[
<div class="section">
<p>MacBook Airのディスク容量が少ないのでDropboxをUSBに入れてそこに1Passwordを入れているのですが、</p>
<p>USBを外して付け直したりすると1Passwordが上手く動かないことがあり困りました。</p>
<h4> 現象</h4>

<ul>
<li>正しいマスターパスワードを入れているのに解除できない

<ul>
<li>コンソールにはこんな感じのエラーが出る</li>
</ul>
</li>
</ul>
<blockquote>
<p>13/03/17 14:11:47.436 1Password Helper: 暗号化キーファイルは存在しますが 'file://localhost/Users/monmon/Dropbox/1Password/1Password.agilekeychain/data/default/1password.keys' からは読み込めません</p>
</blockquote>

<ul>
<li>1passwordのhelper（メニューに出てるやつ）が起動したり終了したりを繰り返す</li>
</ul>
<h4> 対処法</h4>
<p>権限の問題だと思うんですがググったりしても同じような例が出なかったので、</p>
<p>1Passwordを終了させた後に</p>
<pre class="syntax-highlight">
<span class="synStatement">mv</span> /Users/monmon/Library/Containers/com.agilebits.onepassword-osx-helper ~/tmp/. 
</pre>

<p>みたいにしてonepasswordの情報をよけて起動し直しました。</p>
<p>そうすると「初めてお使いですか？」「使ったことありますか？」のあの起動画面が出てくるので、「使ったことある」を選んで進めればよしと。</p>
</div>
]]></content:encoded>
<dc:creator>lesamoureuses</dc:creator>
<dc:date>2013-03-17T14:32:24+09:00</dc:date>
<dc:subject>1password</dc:subject>
<dc:subject>mac</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/lesamoureuses/20130116/1358321670">
<title>[ruby][php][perl]Rubyはハッシュに数値と文字列のkeyが持てるんですね</title>
<link>http://d.hatena.ne.jp/lesamoureuses/20130116/1358321670</link>
<description> Rubyで書かれたコードにbugがあって調べることになり、初めて知りました。 Ruby % ruby -e ’h = {1 =&#62; true, &#34;1&#34; =&#62; false}; p h’ {1=&#62;true, &#34;1&#34;=&#62;false} Perl % perl -MData::Dumper -e ’$h = {1 =&#62; true, &#34;1&#34; =&#62; false};</description>

<content:encoded><![CDATA[
<div class="section">
<p>Rubyで書かれたコードにbugがあって調べることになり、初めて知りました。</p>
<h4> Ruby</h4>
<pre class="syntax-highlight">
% ruby <span class="synSpecial">-e</span> <span class="synStatement">'</span><span class="synConstant">h = {1 =&#62; true, &#34;1&#34; =&#62; false}; p h</span><span class="synStatement">'</span>
<span class="synSpecial">{</span><span class="synIdentifier">1</span>=<span class="synStatement">&#62;true</span>, <span class="synStatement">&#34;</span><span class="synConstant">1</span><span class="synStatement">&#34;=&#62;false</span><span class="synSpecial">}</span>
</pre>

<h4> Perl</h4>
<pre class="syntax-highlight">
% perl <span class="synSpecial">-MData</span>::Dumper <span class="synSpecial">-e</span> <span class="synStatement">'</span><span class="synConstant">$h = {1 =&#62; true, &#34;1&#34; =&#62; false}; warn Dumper $h</span><span class="synStatement">'</span>
<span class="synPreProc">$VAR1</span> <span class="synStatement">=</span> <span class="synSpecial">{</span>
          <span class="synStatement">'</span><span class="synConstant">1</span><span class="synStatement">'</span> <span class="synStatement">=&#62;</span> <span class="synStatement">'</span><span class="synConstant">false</span><span class="synStatement">'</span>
        <span class="synSpecial">}</span><span class="synStatement">;</span>
</pre>

<h4> PHP</h4>
<pre class="syntax-highlight">
% php <span class="synSpecial">-r</span> <span class="synStatement">'</span><span class="synConstant">$h = array(1 =&#62; true, &#34;1&#34; =&#62; false); var_dump($h);</span><span class="synStatement">'</span>
array<span class="synStatement">(</span><span class="synConstant">1</span><span class="synStatement">)</span> <span class="synSpecial">{</span>
  <span class="synStatement">[</span><span class="synConstant">1</span><span class="synStatement">]=&#62;</span>
  bool<span class="synStatement">(false)</span>
<span class="synSpecial">}</span>
</pre>

<h4> 追記</h4>
<div class="twitter-detail twitter-detail-left">
  <div class="twitter-detail-user">
    <a class="twitter-user-screen-name" href="http://twitter.com/bash0C7">
      <img src="http://a0.twimg.com/profile_images/1855035264/2012photo_normal.jpg" alt="bash0C7" height="48" width="48">
    </a>
  </div>
  <div class="twitter-detail-tweet">
    <p class="twitter-detail-text">
      @<a class="twitter-user-screen-name" href="http://twitter.com/lesamoureuses" target="_top">lesamoureuses</a> @<a class="twitter-user-screen-name" href="http://twitter.com/chisei" target="_top">chisei</a> :-)
メンション消してしもたので リファレンスへのポインタを再度かいときます
<a class="twitter-tweet-url" href="http://t.co/DfL3MAnN" target="_top"><span>URL</span></a>
の要約部分"キーには任意の種類のオブジェクトを用いることができますが〜"の下りでした。
    </p>
    <p class="twitter-detail-info">
      <a href="http://twitter.com/bash0C7/status/300275232059572225" class="twitter-detail-info-permalink"><span class="twitter-detail-info-date">2013-02-10</span> <span class="twitter-detail-info-time">01:09:28</span></a> <span class="twitter-detail-info-source">via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow">Twitter for Mac</a></span> to @<a href="http://twitter.com/lesamoureuses/status/300274478104055808"  class="twitter-user-screen-name">lesamoureuses</a>
    </p>
  </div>
</div>

<p>ということで、</p>

<ul>
<li> Object#hash ハッシュの格納に用いられるハッシュ値の計算</li>
<li> Object#eql? キーの同一性判定</li>
</ul>
<p>の2つを定義すれば何でもkeyになるよという話。</p>
<p>ハッシュの特性を考えれば確かにそうですよねそうですよね。</p>
</div>
]]></content:encoded>
<dc:creator>lesamoureuses</dc:creator>
<dc:date>2013-01-16T16:34:30+09:00</dc:date>
<dc:subject>ruby</dc:subject>
<dc:subject>php</dc:subject>
<dc:subject>perl</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/lesamoureuses/20121217/1355720541">
<title>[perl][vgadvent2012]Perlとバーコードリーダーで本棚整理をするよ！ #vgadvent2012</title>
<link>http://d.hatena.ne.jp/lesamoureuses/20121217/1355720541</link>
<description> こんにちはこんにちは、VOYAGE GROUPエンジニアblog Advent Calendar 17日めを担当するmonmonといいます！ どんなネタにしようか土曜日まで迷ったあげく、せっかくの会社のAdvent Calendarなので会社に関係する話にしました！ どんな話をするの？ 会社の1FにOASISという図書</description>

<content:encoded><![CDATA[
<div class="section">
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217100419" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217100419.jpg" alt="f:id:lesamoureuses:20121217100419j:image" title="f:id:lesamoureuses:20121217100419j:image" class="hatena-fotolife"></a></p>
<br>

<p>こんにちはこんにちは、<a href="http://tech.voyagegroup.com/archives/6776528.html" target="_blank">VOYAGE GROUPエンジニアblog Advent Calendar</a> 17日めを担当するmonmonといいます！</p>
<p>どんなネタにしようか土曜日まで迷ったあげく、せっかくの会社のAdvent Calendarなので会社に関係する話にしました！</p>
<br>

<h4> どんな話をするの？</h4>
<br>

<p>会社の1FにOASISという図書室がありまして、その本の整理をしたいなぁと思いました（あくまで今回のネタ用なので実際はやらないです）。</p>
<p>なので、今回はその話をしようと思います。</p>
<p>ちなみに上の展開写真がOASISね。</p>
<br>

<h4> 何でこの話にしたの？</h4>
<br>

<p>理由は3つありまして、</p>

<ul>
<li> 前職の先輩からバーコードリーダーをもらったが使う機会なくて物置に眠らせてた</li>
<li> Perlのジョブキューシステムである<a href="https://metacpan.org/module/Qudo" target="_blank">Qudo</a>を使ってみたかった</li>
<li> うちの会社の<a href="https://twitter.com/TonnyXu/" target="_blank">@TonnyXu</a>が<a href="http://dev.totodotnet.net/post/14115190858/sqlite-ios" target="_blank">昔SQLiteのFTS（全文検索）について話してくれた</a>ことを思い出した</li>
</ul>
<p>という感じです。</p>
<br>

<p>仕事でもそうだけど、何かを作り出すときにこういう部品をつなぎ合わせることで形になっていくってのは楽しいものですね。</p>
<p>あぁ！そういえばジョブズも「役に立つ可能性があるとは思わなかった点と点が、10年後に繋がって素晴らしいものができた」みたいな良い話をしてましたね！それだ！</p>
<br>

<h4> 処理の流れ</h4>
<br>

<p>さぁ！ということで処理の流れだ！最終的に以下のような感じになったよ！</p>

<ol>
<li> バーコードリーダーでバーコードを読み取り、ISBN13をqueueに入れる</li>
<li> queueからISBN13を取り出し<a href="https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html" target="_blank">Amazon Product Advertising API</a>で検索</li>
<li> あればさらに<a href="http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html" target="_blank">Y!の日本語形態素解析API</a>で形態素解析</li>
<li> それらをSQLiteに突っ込む</li>
<li> あとは全文検索でうまー</li>
</ol>
<p>これをひとつずつ見ていこう！</p>
<br>

<h4> バーコードリーダーでバーコードを読み取る</h4>
<br>

<p>バーコードリーダーはこれです。</p>
<p>USBで繋ぐと「ぴっ！」って鳴って、バーコードを読み込むと上の部分が緑に光り、ISBNを入力してくれます。便利！</p>
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217120854" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217120854.jpg" alt="f:id:lesamoureuses:20121217120854j:image" title="f:id:lesamoureuses:20121217120854j:image" class="hatena-fotolife"></a></p>
<br>

<h4> ジョブキューを使う</h4>
<br>

<p>ということで次。</p>
<p>ISBNを読み込んだ後、その検索結果を待たずに次のISBNを読み込みたいためジョブキューを使います。</p>
<p>で、<a href="http://yapcasia.org/2012/talk/show/2c531ede-c1ac-11e1-860d-28556aeab6a4" target="_blank">今年のYAPC::AsiaでもQudoの話があった</a>し、なのでQudoを使ってみようかなと調べたんですが、</p>
<p>調べているうちに<a href="http://gihyo.jp/dev/serial/01/perl-hackers-hub/001002" target="_blank">この辺の記事</a>で今回の用途ならJonkでいいかもと思い変更しました。</p>
<br>

<p>Jonkの使い方は</p>
<p><a href="https://metacpan.org/module/Jonk" target="_blank">https://metacpan.org/module/Jonk</a></p>
<p>と</p>
<p><a href="https://metacpan.org/module/Jonk::Cookbook::Basic" target="_blank">https://metacpan.org/module/Jonk::Cookbook::Basic</a></p>
<p>に書いてあり、これをまるっとコピーしてきたらサクッと動くくらい楽で、ほぼそのままコピペです。ありがたいありがたい。</p>
<p><a href="http://perl-users.jp/articles/advent-calendar/2010/hacker/2" target="_blank">2年前のPerl Advent Calendar</a>でも取り上げられているのでもっと難しいことやるときはこっちも参考にしようかなと思ってました（が、時間なくてここまでいかず）。</p>
<br>

<p>具体的なコードはこんな感じ。while 1で無限ループ作ってひたすらISBNをキューに突っ込むだけです。</p>
<pre class="syntax-highlight">
<span class="synPreProc">#!perl</span>
<span class="synComment"># script/jonk-client.pl</span>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>FindBin;
<span class="synStatement">use </span>DBI;
<span class="synStatement">use </span>Jonk::Client;

<span class="synStatement">use lib</span> <span class="synConstant">&#34;</span><span class="synIdentifier">$FindBin::Bin</span><span class="synConstant">/../lib&#34;</span>;
<span class="synStatement">use </span>MyApp;

<span class="synStatement">my</span> <span class="synIdentifier">$setting</span> = MyApp-&#62;<span class="synStatement">new</span>(<span class="synConstant">appdir </span>=&#62; <span class="synConstant">&#34;</span><span class="synIdentifier">$FindBin::Bin</span><span class="synConstant">/../&#34;</span>)-&#62;setting;

<span class="synStatement">my</span> <span class="synIdentifier">$dbh</span> = DBI-&#62;<span class="synStatement">connect</span>(<span class="synConstant">&#34;dbi:SQLite:</span><span class="synIdentifier">$setting</span><span class="synConstant">-&#62;{jonk}-&#62;{db}&#34;</span>,<span class="synConstant">''</span>,<span class="synConstant">''</span>);
<span class="synStatement">my</span> <span class="synIdentifier">$jonk</span> = Jonk::Client-&#62;<span class="synStatement">new</span>(<span class="synIdentifier">$dbh</span>);

<span class="synStatement">while</span> (<span class="synConstant">1</span>) {
    <span class="synStatement">print</span> <span class="synConstant">'input ISBN: '</span>;
    <span class="synStatement">next</span> <span class="synStatement">if</span> <span class="synIdentifier">&#60;STDIN&#62;</span> !~ <span class="synStatement">m/</span><span class="synSpecial">(\d+)</span><span class="synStatement">/xms</span>;

    <span class="synStatement">my</span> <span class="synIdentifier">$isbn</span> = <span class="synIdentifier">$1</span>;
    <span class="synStatement">my</span> <span class="synIdentifier">$job_id</span> = <span class="synIdentifier">$jonk</span>-&#62;enqueue(<span class="synConstant">'Book'</span>, <span class="synIdentifier">$isbn</span>);
    <span class="synStatement">print</span> <span class="synConstant">&#34;enqueued job_id: </span><span class="synIdentifier">$job_id</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>;
}
</pre>

<br>

<p>で、取り出して仕事する方はこんな感じ。実際のロジックはMyApp::Worker::Bookにあるので、そっちを呼び出しているだけですね。</p>
<pre class="syntax-highlight">
<span class="synPreProc">#!perl</span>
<span class="synComment"># script/jonk-worker.pl</span>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>FindBin;
<span class="synStatement">use </span>DBI;
<span class="synStatement">use </span>Jonk::Worker;

<span class="synStatement">use lib</span> <span class="synConstant">&#34;</span><span class="synIdentifier">$FindBin::Bin</span><span class="synConstant">/../lib&#34;</span>;
<span class="synStatement">use </span>MyApp;
<span class="synStatement">use </span>MyApp::Worker::Book;

<span class="synStatement">my</span> <span class="synIdentifier">$setting</span> = MyApp-&#62;<span class="synStatement">new</span>(<span class="synConstant">appdir </span>=&#62; <span class="synConstant">&#34;</span><span class="synIdentifier">$FindBin::Bin</span><span class="synConstant">/../&#34;</span>)-&#62;setting;

<span class="synStatement">my</span> <span class="synIdentifier">$dbh</span> = DBI-&#62;<span class="synStatement">connect</span>(<span class="synConstant">&#34;dbi:SQLite:</span><span class="synIdentifier">$setting</span><span class="synConstant">-&#62;{jonk}-&#62;{db}&#34;</span>,<span class="synConstant">''</span>,<span class="synConstant">''</span>);
<span class="synStatement">my</span> <span class="synIdentifier">$jonk</span> = Jonk::Worker-&#62;<span class="synStatement">new</span>(<span class="synIdentifier">$dbh</span> =&#62; {<span class="synConstant">functions </span>=&#62; [<span class="synConstant">qw/Book/</span>]});
<span class="synStatement">my</span> <span class="synIdentifier">$worker</span> = MyApp::Worker::Book-&#62;<span class="synStatement">new</span>(
    <span class="synConstant">appdir </span>=&#62; <span class="synConstant">&#34;</span><span class="synIdentifier">$FindBin::Bin</span><span class="synConstant">/../&#34;</span>,
    <span class="synConstant">setting </span>=&#62; <span class="synIdentifier">$setting</span>,
);

<span class="synStatement">while</span> (<span class="synConstant">1</span>) {
    <span class="synStatement">if</span> (<span class="synStatement">my</span> <span class="synIdentifier">$job</span> = <span class="synIdentifier">$jonk</span>-&#62;dequeue) {
        <span class="synStatement">warn</span> <span class="synConstant">&#34;work job: </span><span class="synIdentifier">$job</span><span class="synConstant">-&#62;{arg}</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>;
        <span class="synIdentifier">$worker</span>-&#62;work(<span class="synIdentifier">$job</span>);
    } <span class="synStatement">else</span> {
        <span class="synStatement">sleep</span>(<span class="synConstant">3</span>); <span class="synComment"># wait for 3 sec.</span>
    }
}
</pre>

<br>

<p>ここで呼び出されたWorkerが</p>

<ul>
<li> Amazon Product Advertising APIを使う</li>
<li> 形態素解析APIを使う</li>
<li> DBに保存する</li>
</ul>
<p>の3つの処理を行います</p>
<br>

<h4> Amazon Product Advertising APIを使う</h4>
<br>

<p>これは超簡単。Amazonのサイトで自分のkeyとsecret、それにassociate_tagの3つを取得した後、</p>
<p>CPANにある<a href="https://metacpan.org/module/URI::Amazon::APA" target="_blank">URI::Amazon::APA</a>を使えば良いです。</p>
<p><a href="http://blog.livedoor.jp/dankogai/archives/51211577.html" target="_blank">弾さんのブログに使い方の記事</a>もあるのでハマる所はないですね。</p>
<p>唯一のハマりどころは日本のURLである「<a href="http://ecs.amazonaws.jp/onca/xml" target="_blank">http://ecs.amazonaws.jp/onca/xml</a>」の方を使うということかしら。</p>
<br>

<p>コピペするだけで本の検索ができちゃうなんて素敵ですね！</p>
<br>

<h4> 形態素解析APIを使う</h4>
<br>

<p>さて、つづいて形態素解析です。</p>
<p>これは何で必要になったかと言うと、FTSを使うものの、タイトルなどを一綴りのまま入れてしまうとヒットしないパターンがあるのでそれをどうにかしたかったから。</p>
<p>以下のブログも参考にしました。</p>
<p><a href="http://blog.mwsoft.jp/article/34911345.html" target="_blank">http://blog.mwsoft.jp/article/34911345.html</a></p>
<br>

<p>なので、「MeCabを入れて…」と考えたんですが、「今回そんなにガッツリやる必要ないのでもっと楽なのがいいなぁ」と方向修正。</p>
<p>結果、<a href="http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html" target="_blank">Y!の日本語形態素解析API</a>です。</p>
<p>で、「これもCPANにあるんじゃないかなぁ」と思ったらやっぱりあったよ！</p>
<p><a href="https://metacpan.org/module/WebService::YahooJapan::WebMA" target="_blank">https://metacpan.org/module/WebService::YahooJapan::WebMA</a></p>
<br>

<p>ただしURLが古いので以下のように変更して使います。</p>
<pre class="syntax-highlight">
<span class="synIdentifier">$WebService::YahooJapan::WebMA::APIBase</span> = <span class="synConstant">'http://jlp.yahooapis.jp/MAService/V1/parse'</span>;
</pre>

<br>

<p>具体的なコードはこんな感じ。ほぼSYNOPSISのままですが、word_listの要素が1つの場合に配列になっていなかったのでそこだけ対応しました。</p>
<pre class="syntax-highlight">
    <span class="synStatement">my</span> <span class="synIdentifier">$api</span> = WebService::YahooJapan::WebMA-&#62;<span class="synStatement">new</span>(
        <span class="synConstant">appid </span>=&#62; <span class="synIdentifier">$self</span>-&#62;appid,
    );
     
    <span class="synStatement">my</span> <span class="synIdentifier">$res</span> = <span class="synIdentifier">$api</span>-&#62;parse(
        <span class="synConstant">sentence </span>=&#62; <span class="synIdentifier">$sentence</span>,
        <span class="synConstant">ress </span>=&#62; <span class="synConstant">'ma'</span>,
        <span class="synConstant">response </span>=&#62; <span class="synConstant">'surface,reading,base form'</span>
    ) <span class="synStatement">or</span> <span class="synStatement">croak</span> <span class="synIdentifier">$api</span>-&#62;error;
    <span class="synStatement">my</span> <span class="synIdentifier">@word_list</span> = (<span class="synStatement">ref</span> <span class="synIdentifier">$res</span>-&#62;{ma_result}-&#62;{word_list} <span class="synStatement">eq</span> <span class="synConstant">'ARRAY'</span>)
        ? @{<span class="synIdentifier">$res</span>-&#62;{ma_result}-&#62;{word_list}}
        : (<span class="synIdentifier">$res</span>-&#62;{ma_result}-&#62;{word_list});
     
    <span class="synIdentifier">$self</span>-&#62;_to_string(<span class="synIdentifier">$self</span>-&#62;_flatten(<span class="synIdentifier">@word_list</span>));
</pre>

<p>コレを使って、「タイトル」「作者」「出版社」の3つを形態素解析し、それらをspase区切りの文字にしてDBに突っ込むようにしてます。</p>
<br>

<p>具体例をあげると<a href="http://www.amazon.co.jp/dp/486267108X" target="_blank">Perl CPANモジュールガイド</a>の場合には、</p>
<p>「Perl CPAN もじゅーる モジュール ガイド がいど つみた 冨田 尚樹 なおき わーくす こーぽれーしょん ワークス コーポレーション」のような文字列がDBに突っ込まれるわけです。</p>
<br>

<p>ふむ！すごいですね！これで「perl」でも「cpan」でも「モジュール」でも「冨田」でも検索にかかるようになりました！それだけじゃなく「もじゅーる」みたいな読みでもかかるようになりました！そして、なんと「つみた」でもかかります！すごい！</p>
<br>

<h4> SQLite FTSを使う</h4>
<br>

<p>さてさて、最後にDBについて。</p>
<p>今回の本データをためるDBですが、今まで話に出て来た通り<a href="http://www.sqlite.org/fts3.html" target="_blank">SQLiteのFTS4</a>を使いました</p>
<p>（ファイルだから開発も楽だしね！）</p>
<br>

<p>FTSの使い方は簡単で、いつものcreate tableの文を以下のようにするだけです。</p>
<pre class="syntax-highlight">
<span class="synStatement">CREATE</span> VIRTUAL <span class="synSpecial">TABLE</span> book <span class="synSpecial">USING</span> fts4(
    isbn,
    asin,
    title,
    author,
    manufacturer,
    words
);
</pre>

<p>「CREATE VIRTUAL TABLE」になっているところと、「USING fts4」になっているところが違う所で、他は特に変わりません。</p>
<p>ただ、UNIQUE INDEX利かななくなっちゃうため、アプリ側でユニーク確認をするようにしました。</p>
<p>（もしかしたら何かやり方あるのかもだけど調べきれず。Stack Overflowにはtriggerとかでどうにかする例があったけどそこまでの話ではなかったので深く見てないです）</p>
<br>

<p>SQLの発行方法は「match」というキーワードを使うだけ。</p>
<p>また、<a href="http://www.sqlite.org/fts3.html#section_1_4" target="_blank">SQLite FTS3 and FTS4 Extensions</a>にあるように「where table名 match 'hogehoge'」というようにテーブル名を指定すればカラムをまたいで探してくれます。</p>
<br>

<p>具体的なqueryは以下のような感じ。</p>
<pre class="syntax-highlight">
<span class="synStatement">SELECT</span> * <span class="synSpecial">FROM</span> book <span class="synSpecial">WHERE</span> book MATCH <span class="synConstant">'perl cpan'</span>;
</pre>

<p>これで全てのカラムでperlとcpanに引っかかるデータを取り出せます。</p>
<br>

<h4> DEMO的なやつ</h4>
<br>

<p>以上でできあがった仕組みがこちらです。</p>
<p><a href="https://github.com/monmon/vgadvent2012-app" target="_blank">https://github.com/monmon/vgadvent2012-app</a></p>
<br>

<p>それでは、写真で使っている様子を見て行きます。</p>
<br>

<p>1. まずjonk-client.plを起動するとISBNの入力待ちになります。</p>
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217112055" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217112055.png" alt="f:id:lesamoureuses:20121217112055p:image" title="f:id:lesamoureuses:20121217112055p:image" class="hatena-fotolife"></a></p>
<p>2. あとはひたすらバーコードリーダーでISBNを読みまくります。入力するとすぐに「早く次のISBNくれよぉ！」状態になるのでひたすら入れまくります。</p>
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217132729" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217132729.png" alt="f:id:lesamoureuses:20121217132729p:image" title="f:id:lesamoureuses:20121217132729p:image" class="hatena-fotolife"></a></p>
<p>3. で、一方違うターミナルでjson-worker.plを起動させておけば、以下のようにキューに入ったISBNを取り出し、一連の処理を始めます。</p>
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217112056" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217112056.png" alt="f:id:lesamoureuses:20121217112056p:image" title="f:id:lesamoureuses:20121217112056p:image" class="hatena-fotolife"></a></p>
<p>4. 結果、SQLiteに本データがたまるので、あとは全文検索で検索してうまーです。</p>
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217112057" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217112057.png" alt="f:id:lesamoureuses:20121217112057p:image" title="f:id:lesamoureuses:20121217112057p:image" class="hatena-fotolife"></a></p>
<p>5. 「タイトル」と「作者」の両方にあるような「単語」も検索できて便利ですね！！！！</p>
<p><a href="http://f.hatena.ne.jp/lesamoureuses/20121217112058" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/l/lesamoureuses/20121217/20121217112058.png" alt="f:id:lesamoureuses:20121217112058p:image" title="f:id:lesamoureuses:20121217112058p:image" class="hatena-fotolife"></a></p>
<br>

<h4> まとめ</h4>
<br>

<p>初めは「iPhoneでガンガンscanして<a href="http://booklog.jp/" target="_blank">ブクログ</a>に突っ込んで終わり」みたいなネタを考えたんですが、いざバーコードリーダーでやってみるとISBN読み込んでqueueに突っ込むだけだからよりガンガンscanできて楽しかったです。</p>
<p>（ちょうど大そうじの季節だったし、このネタにして良かった！）</p>
<p>まぁエラー処理とか全然考えてないし、既に「原作」と「漫画」のように2人の作者がいる場合にはauthorカラムに「ARRAY(0x7f8f6ac2fe30)」のように突っ込まれちゃうbugが判明したけど気にしません。</p>
<p>作ってみないとわからないことあるしね！リーン何ちゃらだ！</p>
<br>

<p>ということで、「コピペばっかりでも簡単にここまで作れるよ、でもコピペばっかりだと全然考慮が足りないから仕事ではちゃんと理解して物を作っていこう」という話でした！</p>
<p>明日は誕生日が終わったばかりの<a href="https://twitter.com/tadasy/" target="_blank">@tadasy</a>さんです！今からでも間に合うのでみんなmention飛ばして祝ってみてください！</p>
</div>
]]></content:encoded>
<dc:creator>lesamoureuses</dc:creator>
<dc:date>2012-12-17T14:02:21+09:00</dc:date>
<dc:subject>perl</dc:subject>
<dc:subject>vgadvent2012</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/lesamoureuses/20121126/1353923298">
<title>[R]Rである母集団のdata.frameから除きたい集団data.frameがあって、その結果が欲しいとき</title>
<link>http://d.hatena.ne.jp/lesamoureuses/20121126/1353923298</link>
<description> 母集団がこんな感じで population &#60;- data.frame(id=c(1, 2, 3), data=c(’a’, ’b’, ’c’)) id data 1 1 a 2 2 b 3 3 c 除きたいのがこんな感じのとき except &#60;- data.frame(id=c(2), data=c(’b’)) id data 1 2 b で、こんな感じで!とinを使えばいいです population[!</description>

<content:encoded><![CDATA[
<div class="section">
<h4> 母集団がこんな感じで</h4>
<pre class="syntax-highlight">
population <span class="synStatement">&#60;-</span> <span class="synType">data.frame</span><span class="synSpecial">(</span>id=c<span class="synSpecial">(</span><span class="synConstant">1</span><span class="synSpecial">,</span> <span class="synConstant">2</span><span class="synSpecial">,</span> <span class="synConstant">3</span><span class="synSpecial">),</span> data=c<span class="synSpecial">(</span><span class="synConstant">'a'</span><span class="synSpecial">,</span> <span class="synConstant">'b'</span><span class="synSpecial">,</span> <span class="synConstant">'c'</span><span class="synSpecial">))</span>

  id data
<span class="synConstant">1</span>  <span class="synConstant">1</span>    a
<span class="synConstant">2</span>  <span class="synConstant">2</span>    b
<span class="synConstant">3</span>  <span class="synConstant">3</span>    c
</pre>

<h4> 除きたいのがこんな感じのとき</h4>
<pre class="syntax-highlight">
except <span class="synStatement">&#60;-</span> <span class="synType">data.frame</span><span class="synSpecial">(</span>id=c<span class="synSpecial">(</span><span class="synConstant">2</span><span class="synSpecial">),</span> data=c<span class="synSpecial">(</span><span class="synConstant">'b'</span><span class="synSpecial">))</span>

  id data
<span class="synConstant">1</span>  <span class="synConstant">2</span>    b
</pre>

<h4> で、こんな感じで!とinを使えばいいです</h4>
<pre class="syntax-highlight">
population<span class="synSpecial">[</span>!<span class="synSpecial">(</span>population$id %<span class="synStatement">in</span>% except$id<span class="synSpecial">),,</span>drop=<span class="synConstant">FALSE</span><span class="synSpecial">]</span>

  id data
<span class="synConstant">1</span>  <span class="synConstant">1</span>    a
<span class="synConstant">3</span>  <span class="synConstant">3</span>    c
</pre>

<p>覚えておいた方がいいのは「drop=FALSE」の部分で、これがないと1列（ベクトル）の時に結果の次元が落ちてしまう（idってのが欲しいのに1 3が返ってくる）</p>
<pre class="syntax-highlight">
&#62; population <span class="synStatement">&#60;-</span> <span class="synType">data.frame</span><span class="synSpecial">(</span>id=c<span class="synSpecial">(</span><span class="synConstant">1</span><span class="synSpecial">,</span> <span class="synConstant">2</span><span class="synSpecial">,</span> <span class="synConstant">3</span><span class="synSpecial">))</span>
&#62; except <span class="synStatement">&#60;-</span> <span class="synType">data.frame</span><span class="synSpecial">(</span>id=c<span class="synSpecial">(</span><span class="synConstant">2</span><span class="synSpecial">))</span>
&#62; population<span class="synSpecial">[</span>!<span class="synSpecial">(</span>population$id %<span class="synStatement">in</span>% except$id<span class="synSpecial">),]</span>
<span class="synSpecial">[</span><span class="synConstant">1</span><span class="synSpecial">]</span> <span class="synConstant">1</span> <span class="synConstant">3</span>
</pre>

<p>1つめのカンマの前で「どういう行を出すか」、2つめのカラムの前で「どういう列を出すか」（今回の場合は何もないので全て）、その後にoptionだと思えば良い</p>
</div>
]]></content:encoded>
<dc:creator>lesamoureuses</dc:creator>
<dc:date>2012-11-26T18:48:18+09:00</dc:date>
<dc:subject>R</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/lesamoureuses/20121107/1352250597">
<title>[ruby]Rubyで2つの日付を元にからその間の月を全部出す</title>
<link>http://d.hatena.ne.jp/lesamoureuses/20121107/1352250597</link>
<description> パッとググった感じこんなんでよさそう #!ruby require ’date’ (Date.parse(&#34;2010-08-01&#34;)..Date.parse(&#34;2012-11-07&#34;)).each{|i| next if i.strftime(’%d’) != ’01’ puts i.strftime(’%Y%m’) } 参考：rubyなら日付を連続１０日分の日付作るのがアツ−！と言</description>

<content:encoded><![CDATA[
<div class="section">
<p>パッとググった感じこんなんでよさそう</p>
<pre class="syntax-highlight">
<span class="synPreProc">#!ruby</span>
<span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">date</span><span class="synSpecial">'</span>

(<span class="synIdentifier">Date</span>.parse(<span class="synSpecial">&#34;</span><span class="synConstant">2010-08-01</span><span class="synSpecial">&#34;</span>)..<span class="synIdentifier">Date</span>.parse(<span class="synSpecial">&#34;</span><span class="synConstant">2012-11-07</span><span class="synSpecial">&#34;</span>)).each{|<span class="synIdentifier">i</span>|
    <span class="synStatement">next</span> <span class="synStatement">if</span> i.strftime(<span class="synSpecial">'</span><span class="synConstant">%d</span><span class="synSpecial">'</span>) != <span class="synSpecial">'</span><span class="synConstant">01</span><span class="synSpecial">'</span>
    puts i.strftime(<span class="synSpecial">'</span><span class="synConstant">%Y%m</span><span class="synSpecial">'</span>)
}
</pre>

<p>参考：<a href="http://d.hatena.ne.jp/takuya_1st/20110216/1297832665" target="_blank">rubyなら日付を連続１０日分の日付作るのがアツ−！と言う間です - それマグで！</a></p>
<h4> 追記</h4>
<p>何かeachの中でnextっておかしいね。returnの方がいいんだろうか</p>
</div>
]]></content:encoded>
<dc:creator>lesamoureuses</dc:creator>
<dc:date>2012-11-07T10:09:57+09:00</dc:date>
<dc:subject>ruby</dc:subject>
</item>
</rdf:RDF>
