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

<channel>
	<title>infoalive labs &#187; o2</title>
	<atom:link href="http://labs.infoalive.com/author/o2/feed" rel="self" type="application/rss+xml" />
	<link>http://labs.infoalive.com</link>
	<description>プロダクトの紹介とTipsのまとめサイト</description>
	<lastBuildDate>Fri, 04 Nov 2011 10:15:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>CheerCatsをリリース</title>
		<link>http://labs.infoalive.com/uncategorized/370</link>
		<comments>http://labs.infoalive.com/uncategorized/370#comments</comments>
		<pubDate>Fri, 04 Nov 2011 10:15:41 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=370</guid>
		<description><![CDATA[2011/10/28 にCheerCatsをiTunesストアにリリースしました。ネコの写真専門の写真共有アプリです。無料です。 今回はCheerDogsのコードをXcode4環境に移行してから作成しました。 目新しい機 [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Funcategorized%2F370"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Funcategorized%2F370&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div id="attachment_371" class="wp-caption alignnone" style="width: 160px"><a href="http://labs.infoalive.com/wp-content/uploads/2011/11/cheerpet4cats.jpg"><img src="http://labs.infoalive.com/wp-content/uploads/2011/11/cheerpet4cats-150x150.jpg" alt="cheerpetcats" title="cheerpetcats" width="150" height="150" class="size-thumbnail wp-image-371" /></a><p class="wp-caption-text">cheerpetcats</p></div><br />
2011/10/28 にCheerCatsをiTunesストアにリリースしました。ネコの写真専門の写真共有アプリです。無料です。<br />
今回はCheerDogsのコードをXcode4環境に移行してから作成しました。<br />
目新しい機能は特になく、作業はアイコンを変えただけです。</p>
<p>書くこともあまりないので技術のお話を書きます。<br />
CheerCatsのサーバー構成は以下になります。</p>
<p>- サーバー： CentOS<br />
- WEB：Apache2<br />
- DB： MongoDB<br />
- プログラム：PHP</p>
<p>目新しいものですと、MongoDBでしょうか。<br />
MongoDBのプロダクトは社内で３件目になります。<br />
MongoDBはパフォーマンスに優れたデーターベースで、複数のリクエストを高速に処理できます。<br />
MySQL 5.1 だと、複数のリクエストがあると極端な速度低下が発生しますが、MongoDBはかなり安定した動作をします。<br />
MySQL 5.5 から複数リクエストに強くなったそうなので時間があるときに評価したいものです。</p>
<g:plusone href="http://labs.infoalive.com/uncategorized/370"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/uncategorized/370/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoneアプリのリリース</title>
		<link>http://labs.infoalive.com/ios/332</link>
		<comments>http://labs.infoalive.com/ios/332#comments</comments>
		<pubDate>Thu, 16 Jun 2011 09:23:34 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod Toush]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=332</guid>
		<description><![CDATA[本日 「CheerPet for Dogs」をApp Storeにリリースしました。 今年の4月初めに、「自社開発でiPhoneアプリを作れないか？」と発言があり、白羽の矢が当たった私が開発することになりました。 最初は [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Fios%2F332"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Fios%2F332&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://dogs.cheerpet.com/about"><img src="http://labs.infoalive.com/wp-content/uploads/2011/06/be9aa0a8f85ba65167c81e74ae521122.png" alt="" title="CheerDogs" width="114" height="114" class="alignnone size-full wp-image-333" /></a><br />
本日 「CheerPet for Dogs」をApp Storeにリリースしました。<br />
今年の4月初めに、「自社開発でiPhoneアプリを作れないか？」と発言があり、白羽の矢が当たった私が開発することになりました。</p>
<p>最初はどのように進めるかが全く決まっておらず、先ずはプロトタイプを4月中旬に作成。<br />
プロトタイプが出来たことから、4月末には開発者２名の社内プロジェクトとして5月末リリースを目標に発足したのですが、<br />
結果としては、6/6にiTunes Connectに申請となり、本日6/16にリリースの運びとなりました。</p>
<p>開発の間にはGWもあり、開発日数は意外に短かったと思います。<br />
思えば色々とありました。(&#8216; &#8211; &#8216; ) . o O </p>
<p>エピソード１：2年前にiPhoneアプリを作ろうと社内プレゼンをしたけど、受け入れてもらえなかった。<br />
エピソード２：iPhoneを持っていないので開発者に任命となったので自前でiPod Touchを買ってきた。<br />
エピソード３：社内プロジェクトに昇格させる為に必死に家でコードを書いた。<br />
エピソード４：4月に書いたプロトタイプが気に入らない。会社の就業時間内に書きなおすことは出来そうにないので、GWを利用し基礎構造を評価しなおし書き直した。</p>
<p>と、紹介するとSEってやばい仕事じゃね？ってエピソードですね。</p>
<p>そんなこんなですが、弊社でもiPhoneアプリ開発実績なるものが誕生となりました。<br />
クライアントの皆様iPhoneアプリ発注くださいね！</p>
<p>それでは、SEのみなさん身体だけは気をつけて ( &#8216;д&#8217; )ノ</p>
<g:plusone href="http://labs.infoalive.com/ios/332"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/ios/332/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ストリートビューの[x]が押しにくい</title>
		<link>http://labs.infoalive.com/tips/301</link>
		<comments>http://labs.infoalive.com/tips/301#comments</comments>
		<pubDate>Wed, 09 Feb 2011 08:26:26 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=301</guid>
		<description><![CDATA[iPad用の地図ページを作成していて思ったのですが、ストリートビューモードが使いにくいです。 [x](閉じる)が反応しない。。 仕方ないので地図の外にリンクを作りました。 &#60;script type="text/ja [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F301"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F301&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>iPad用の地図ページを作成していて思ったのですが、ストリートビューモードが使いにくいです。<br />
[x](閉じる)が反応しない。。<br />
仕方ないので地図の外にリンクを作りました。</p>
<p><code>&lt;script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"&gt;&lt;/script&gt;</code></p>
<p>&lt;script&gt;<br />
var LatLng = new google.maps.LatLng(35.3353548, 134.1196615);<br />
var map = new google.maps.Map(document.getElementById(&#8216;gmaps&#8217;), {<br />
zoom: 10,<br />
center: LatLng,<br />
});<br />
var panorama = map.getStreetView();<br />
google.maps.event.addListener(panorama, &#8220;visible_changed&#8221;, function () {<br />
if (panorama.getVisible()){<br />
$(&#8216;#StreetView&#8217;).show();<br />
} else {<br />
$(&#8216;#StreetView&#8217;).hide();<br />
}<br />
});</p>
<p>function StreetViewClose(){<br />
var panorama = map.getStreetView();<br />
panorama.setVisible();<br />
}<br />
&lt;/script&gt;<br />
&lt;div id=&#8221;StreetView&#8221;&gt;&lt;font size=+2&gt;&lt;a href=&#8221;javascript:StreetViewClose()&#8221;&gt;地図に戻る&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</p>
<g:plusone href="http://labs.infoalive.com/tips/301"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/301/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mbedについて語りました。</title>
		<link>http://labs.infoalive.com/tips/279</link>
		<comments>http://labs.infoalive.com/tips/279#comments</comments>
		<pubDate>Mon, 13 Dec 2010 08:04:32 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[プレゼン]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=279</guid>
		<description><![CDATA[マイコンを語る View more presentations from otmb. ○ツインモーターはんだづけ完了、動作テスト ○wiiリモコンとmbedをBluetoothで接続し、ツインモーターを制御]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F279"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F279&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div style="width:425px" id="__ss_6138622"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/otmb/ss-6138622" title="マイコンを語る">マイコンを語る</a></strong><object id="__sse6138622" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-101213014841-phpapp02&#038;stripped_title=ss-6138622&#038;userName=otmb" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6138622" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-101213014841-phpapp02&#038;stripped_title=ss-6138622&#038;userName=otmb" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/otmb">otmb</a>.</div>
</div>
<p>○ツインモーターはんだづけ完了、動作テスト<br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/S2rj54YU_cc?fs=1&amp;hl=ja_JP"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/S2rj54YU_cc?fs=1&amp;hl=ja_JP" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>○wiiリモコンとmbedをBluetoothで接続し、ツインモーターを制御<br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/Lxlb-mBv3dU?fs=1&amp;hl=ja_JP"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Lxlb-mBv3dU?fs=1&amp;hl=ja_JP" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<g:plusone href="http://labs.infoalive.com/tips/279"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/279/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB勉強会</title>
		<link>http://labs.infoalive.com/presentation/276</link>
		<comments>http://labs.infoalive.com/presentation/276#comments</comments>
		<pubDate>Mon, 13 Dec 2010 07:50:42 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[プレゼン]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=276</guid>
		<description><![CDATA[○MongoDBとMySQLの同時接続時のパフォーマンスを評価しました。 MongoDB速度評価(PDF形式) ○社内向けにMongoDB勉強会をしました。 Mongo db勉強会 View more presentat [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Fpresentation%2F276"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Fpresentation%2F276&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>○MongoDBとMySQLの同時接続時のパフォーマンスを評価しました。<br />
<a href="http://labs.infoalive.com/wp-content/uploads/2010/12/MongoDB速度評価.pdf">MongoDB速度評価</a>(PDF形式)</p>
<p>○社内向けにMongoDB勉強会をしました。</p>
<div id="__ss_6138606" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Mongo db勉強会" href="http://www.slideshare.net/otmb/mongo-db-6138606">Mongo db勉強会</a></strong><object id="__sse6138606" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-101213014739-phpapp01&amp;stripped_title=mongo-db-6138606&amp;userName=otmb" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-101213014739-phpapp01&amp;stripped_title=mongo-db-6138606&amp;userName=otmb" name="__sse6138606" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/otmb">otmb</a>.</div>
</div>
<p>社内向けにMongoDB勉強会をしました。<br />
社内フレームワークDeco上での実装について。</p>
<g:plusone href="http://labs.infoalive.com/presentation/276"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/presentation/276/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ぐるなび位置情報をMongoDBに保存</title>
		<link>http://labs.infoalive.com/mongodb/212</link>
		<comments>http://labs.infoalive.com/mongodb/212#comments</comments>
		<pubDate>Tue, 02 Nov 2010 13:07:12 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=212</guid>
		<description><![CDATA[久しぶりに会社のブログを書きます。 １年ぶりになるでしょうか。。 最近はMongoDBに興味があって触っています。 MongoDBの紹介兼ねてインストールと、簡単なプログラムを書きました。 MongoDBはトランザクショ [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Fmongodb%2F212"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Fmongodb%2F212&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>久しぶりに会社のブログを書きます。<br />
１年ぶりになるでしょうか。。</p>
<p>最近はMongoDBに興味があって触っています。<br />
MongoDBの紹介兼ねてインストールと、簡単なプログラムを書きました。</p>
<p>MongoDBはトランザクション、テーブルjoin、auto incrementを使えませんが、高速でスケーラビリティな点が注目されているDBです。<br />
MongoDBはJSON形式でデータを扱い、JavaScriptの記述でデータを操作します。</p>
<p>では早速インストール。<br />
ubuntu 10.10だと以下でインストール出来ます。</p>
<blockquote><p><code>// 参考： http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages<br />
$ sudo apt-add-repository 'deb http://downloads.mongodb.org/distros/ubuntu 10.10 10gen'<br />
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10<br />
$ sudo aptitude install mongodb-stable<br />
<br />
$ mongo --version<br />
MongoDB shell version: 1.6.4<br />
<br />
// 自動起動設定<br />
$ runlevel<br />
N 2<br />
$ sudo sysv-rc-conf</code></p></blockquote>
<p>
早速位置情報からやってみます。<br />
位置情報はMongoDBのv1.3.3から対応しています。<br />
次の操作は、DBに位置情報を登録し、位置情報として扱うようにIndexを貼り、データの取得を実行します。</p>
<blockquote><p><code>$ mongo<br />
&gt; db.map.insert( { loc: {lat:35.705969 , lng: 139.74884} } );<br />
&gt; db.map.ensureIndex( { loc : "2d" } )<br />
&gt; db.map.find( { loc : { $near : [35.705969,139.74884] } } ).limit(20)</code></p></blockquote>
<p>
次に、PHPでぐるなびの位置情報を収集して、MongoDBに格納する処理。<br />
先にPHPにmongodbのライブラリを導入。</p>
<blockquote><p><code>$ sudo pecl install mongo<br />
$ sudo vi /etc/php5/conf.d/mongodb.ini<br />
extention=mongo.so<br />
</code></p></blockquote>
<p>Services_Gnaviのライブラリは http://lab.totoro.ws/gnavi/ のサイトからダウンロードしました。<br />
- gnavi.php</p>
<blockquote><p><code>&lt;?php<br />
require('Services/Gnavi.php');<br />
<br />
// -- 設定 --<br />
$access_key = 'ぐるなびアクセスキー';<br />
$rows = 999;<br />
$mongo = new Mongo("localhost:27017");<br />
$db = $mongo->selectDB( "MyDB" );<br />
$col = $db->selectCollection( "gnavi" );<br />
// -- 設定 --<br />
<br />
$gnavi = new Services_Gnavi($access_key);<br />
<br />
$gnavi->searchSubcategory();<br />
$cate = $gnavi->getResult();<br />
$_cate = $cate['category_s'];<br />
<br />
foreach(range(1,47) as $num){<br />
  $pref = sprintf("PREF%02d",$num);<br />
  $opt = array('pref'=> $pref, 'hit_per_page' => $rows,'offset_page' => 1, 'coordinates_mode' => 2);<br />
  print $pref . "\n";<br />
  foreach($_cate as $r){<br />
    $opt['category_s'] = $r['category_s_code'];<br />
    $res = getGnavi($gnavi,$opt);<br />
    print " " . $opt['category_s'];<br />
    if ($res['total_hit_count'] == 1) $res['rest'] = array($res['rest']);<br />
    save($col,$res['rest']);<br />
  }<br />
  print "\n";<br />
}<br />
print "End\n";<br />
<br />
function save($col,$res){<br />
  if (!$res) return;<br />
  $fmt = 'name,name_kana,address,tel,pr,code,category';<br />
  $fmt = split(',',$fmt);<br />
  foreach($res as $row){<br />
    $doc = array();<br />
    foreach($fmt as $key){<br />
      $doc[$key] =  $row[$key];<br />
    }<br />
    // 位置情報<br />
    $doc['loc'] = array('lat' => (double)$row['latitude'],'lng'=> (double)$row['longitude']);<br />
    $col->insert( $doc );<br />
  }<br />
}<br />
<br />
function getGnavi($gnavi,$opt){<br />
  $gnavi->searchRestaurant($opt);<br />
  return $gnavi->getResult();<br />
}<br />
</code></p></blockquote>
<p>以上でぐるなびの情報がMongoDBに格納できました。<br />
<br />
次に、実際にPHPから取得します。<br />
位置情報のパラメーターは以下になります。<br />
$near 現在地から近い位置情報を検索<br />
$box 長方形の範囲内の位置情報を検索<br />
$center 中心から半径の距離に含まれる位置情報を検索</p>
<p>- maps.php</p>
<blockquote><p><code>&lt;?php<br />
$mongo = new Mongo("localhost:27017");<br />
$db = $mongo-&gt;selectDB( "MyDB" );<br />
$col = $db-&gt;selectCollection( "gnavi" );<br />
//$query['loc']['$near'] = array(35.705969,139.74884); // 東京<br />
//$query['loc']['$near'] = array(43.068887774169625, 141.3720703125); // 北海道<br />
$query['loc']['$near'] = array(35.47856499535729, 134.241943359375); // 鳥取<br />
$cursor = $col->find($query)->limit(20);<br />
<br />
while( $cursor-&gt;hasNext() ) {<br />
  var_dump( $cursor-&gt;getNext() );<br />
}</code></p></blockquote>
<p>
とても簡単な記述で、位置情報の取得が出来ました。<br />
コードが簡潔に書けると嬉しくなります。</p>
<p>以上です。</p>
<p>○後日談<br />
ぐるなびの小業態は複数選択可能なパラメータだったので店舗情報が重複していた。<br />
MongoDBには重複した情報をINDEX設定時に削除出来るので、以下の作法で解消。</p>
<blockquote><p><code><br />
> db.gnavi.count();<br />
122726<br />
> db.gnavi.dropIndexes();<br />
> db.gnavi.ensureIndex( {  name: 1 , address: 1 }  , { unique: true, dropDups: true } );<br />
> db.gnavi.count();<br />
58448<br />
> db.gnavi.dropIndexes();<br />
> db.gnavi.ensureIndex( { loc: "2d" } );<br />
</code></p></blockquote>
<g:plusone href="http://labs.infoalive.com/mongodb/212"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/mongodb/212/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QステアをArduinoから操作</title>
		<link>http://labs.infoalive.com/tips/155</link>
		<comments>http://labs.infoalive.com/tips/155#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:57:45 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Q STEER]]></category>
		<category><![CDATA[Qステア]]></category>
		<category><![CDATA[タカラトミー]]></category>
		<category><![CDATA[チョロQ]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[赤外線LED]]></category>
		<category><![CDATA[赤外線リモコン受信モジュール]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=155</guid>
		<description><![CDATA[今回は、タカラトミーのQ STEERをArduinoから操作するハックになります。 先週末、日本橋にある共立電子産業株式会社 3階のセンサー売り場にて赤外線のパーツ類を購入しました。 そんなわけで日曜大工エンジニアです。 [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F155"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F155&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>今回は、タカラトミーの<a href="http://www.takaratomy.co.jp/products/qsteer/" target="_blank">Q STEER</a>をArduinoから操作するハックになります。</p>
<p>先週末、日本橋にある<a href="http://www.kyohritsu.com/" target="_blank">共立電子産業株式会社</a> 3階のセンサー売り場にて赤外線のパーツ類を購入しました。</p>
<p>そんなわけで日曜大工エンジニアです。</p>
<p>○赤外線LED<br />
東芝製 TLN115A(大)　60円<br />
東芝製 TLN119(小)　80円</p>
<p>○赤外線リモコン受信モジュール<br />
EVERLIGHT製 IRM-3638N3　210円</p>
<table border="0">
<tbody>
<tr>
<td align="center" valign="top"><a href="http://labs.infoalive.com/wp-content/uploads/2009/11/398.jpg"><img class="alignnone size-thumbnail wp-image-152" title="赤外線LED" src="http://labs.infoalive.com/wp-content/uploads/2009/11/398-150x150.jpg" alt="赤外線LED" width="150" height="150" /></a></td>
<td align="center" valign="top"><a href="http://labs.infoalive.com/wp-content/uploads/2009/11/399.jpg"><img class="alignnone size-thumbnail wp-image-153" title="赤外線リモコン受信モジュール" src="http://labs.infoalive.com/wp-content/uploads/2009/11/399-150x150.jpg" alt="赤外線リモコン受信モジュール" width="150" height="150" /></a><br />
左からOUTPUT、GND、vcc(2.5-5.5V)</td>
<td align="center" valign="top"><a href="http://labs.infoalive.com/wp-content/uploads/2009/11/400.jpg"><img class="alignnone size-thumbnail wp-image-154" title="赤外線受信用回路" src="http://labs.infoalive.com/wp-content/uploads/2009/11/400-150x150.jpg" alt="赤外線受信用回路" width="150" height="150" /></a><br />
赤外線受信用回路</td>
</tr>
</tbody>
</table>
<p>赤外線解析用コードは、Arduinoのサイトから<a href="http://www.arduino.cc/playground/Code/InfraredReceivers">Infrared receiver modules</a>のコードを利用して解析しました。</p>
<p>○キャプチャ値<br />
データーの０と１が点灯、消灯の間隔。<br />
点灯時は常に点灯しているのではなく、ON、OFFを繰り返します。<br />
この繰り返しの間隔次第で変調信号として機能してます。<br />
今回は38khzの変調信号での利用となります。</p>
<p>&#8212;- ここから<br />
0    0<br />
1796    0<br />
1796    1<br />
2168    1<br />
2168    0<br />
2648    0<br />
2648    1<br />
3016    1<br />
&#8230;. 略<br />
157372    0<br />
158284    0<br />
158284    1<br />
&#8212;- ここまで<br />
<a href="http://abetuyo.net/blog/2007/05/q_1.html" target="_blank">Qステア赤外線解析のサイト</a>に書かれているのとほぼ同じ値が返ってきてます。</p>
<p>他には、1回の操作で２回同じ信号が送信されており、2回目の信号を送る間隔はch毎に異なっています。<br />
Ach 間隔 7516<br />
Bch 間隔 21860<br />
Cch 間隔 36212<br />
Dch 間隔 50568</p>
<p>チャネル毎に操作する場合は必要と考えれます。</p>
<p>○Ach の前進用サンプルコード<br />
キャプチャした値の点灯間隔をサンプルコードに設定<br />
<code><br />
#define LED 13<br />
unsigned long us = micros();</code></p>
<p>void setup(){</p>
<p style="padding-left: 30px;">pinMode(LED , OUTPUT);</p>
<p>}</p>
<p>void loop(){</p>
<p style="padding-left: 30px;">digitalWrite(LED, LOW);</p>
<p style="padding-left: 30px;">delay(1000);</p>
<p style="padding-left: 30px;">int testdata[] = {1796 ,372 ,480 ,368 ,480 ,368 ,480 ,368 ,480 ,372 ,480 ,364 ,912 ,7516 ,1744 ,396 ,480 ,372 ,476 ,368 ,484 ,364 ,484 ,364 ,484 ,368 ,912 ,93576 ,1792 ,372 ,452 ,400 ,480 ,368 ,476 ,368 ,480 ,372 ,480 ,368 ,908 ,7512 ,1772 ,368 ,480 ,372 ,476 ,368 ,480 ,368 ,484 ,364 ,484 ,368 ,908 ,15680 ,1800 ,368 ,456 ,392 ,480 ,368 ,912 };</p>
<p style="padding-left: 30px;">for (int cnt = 0; cnt &lt; 500; cnt++) {</p>
<p style="padding-left: 60px;">unsigned long len = testdata[cnt];</p>
<p style="padding-left: 60px;">if (len == 0) break;</p>
<p style="padding-left: 60px;">unsigned long us = micros();</p>
<p style="padding-left: 60px;">do {</p>
<p style="padding-left: 90px;">digitalWrite(LED, 1 &#8211; (cnt&amp;1)); // iが偶数なら赤外線ON、奇数なら0のOFFのまま</p>
<p style="padding-left: 90px;">delayMicroseconds(8);  // キャリア周波数38kHzでON/OFFするよう時間調整</p>
<p style="padding-left: 90px;">digitalWrite(LED, 0);</p>
<p style="padding-left: 90px;">delayMicroseconds(7);</p>
<p style="padding-left: 60px;">} while (long(us + len &#8211; micros()) &gt; 0);</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>以上が今回のハックの内容となります。</p>
<p>前回と違い非常に安価にラジコンが製作出来ます。</p>
<p>また、赤外線は様々な用途での利用が考えれます。</p>
<p>今後も発想次第で色々作れそうです。</p>
<g:plusone href="http://labs.infoalive.com/tips/155"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/155/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>その後のラジコン</title>
		<link>http://labs.infoalive.com/tips/139</link>
		<comments>http://labs.infoalive.com/tips/139#comments</comments>
		<pubDate>Fri, 30 Oct 2009 08:20:22 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[XBee]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=139</guid>
		<description><![CDATA[すっかりブログを書くのを忘れてました。 本日返信がついたので思い出した次第です。 あれから、ラジコンはサーバーに繋いだXBeeを介し、flashやjava applet から操作が可能となりました。 構成図はこんな感じで [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F139"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F139&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>すっかりブログを書くのを忘れてました。</p>
<p>本日返信がついたので思い出した次第です。</p>
<p>あれから、ラジコンはサーバーに繋いだXBeeを介し、flashやjava applet から操作が可能となりました。</p>
<p>構成図はこんな感じです。先日社内のプレゼンで使った資料の流用になります。</p>
<p><img class="alignnone size-full wp-image-141" title="ハード構成図" src="http://labs.infoalive.com/wp-content/uploads/2009/10/arduino1.PNG" alt="ハード構成図" width="535" height="401" /></p>
<p><img class="alignnone size-full wp-image-142" title="ネットワーク構成図" src="http://labs.infoalive.com/wp-content/uploads/2009/10/arduino2.PNG" alt="ネットワーク構成図" width="532" height="399" /></p>
<p>Flashから操作できる＝Wiiのブラウザからも操作が出来る！。。はずです。</p>
<p>カメラを搭載していないので遠隔から操作は出来ません。今後の課題ですね。</p>
<p>Linuxを搭載するように考えてましたが、消費電力が大きいのと、組み込みLinuxは高価なこともあり、搭載は諦めました。</p>
<p>今後は社内のサービスに何らかの形で技術提供できればと考えております。</p>
<g:plusone href="http://labs.infoalive.com/tips/139"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/139/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>会社で走らせました</title>
		<link>http://labs.infoalive.com/tips/127</link>
		<comments>http://labs.infoalive.com/tips/127#comments</comments>
		<pubDate>Mon, 28 Sep 2009 06:47:47 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[TB6612FNG]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[wrj4P5]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=127</guid>
		<description><![CDATA[今日は会社にラジコンを持ち込みました。 人生において会社のデスクにラジコン置く機会は幾つあるだろう。。 今回はLinux抜きでXBeeで通信するalpha版です。 beta版ではネットワークを通じサーバーを通じて操作。  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F127"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F127&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>今日は会社にラジコンを持ち込みました。</p>
<p>人生において会社のデスクにラジコン置く機会は幾つあるだろう。。</p>
<p>今回はLinux抜きでXBeeで通信するalpha版です。</p>
<p>beta版ではネットワークを通じサーバーを通じて操作。</p>
<p>正式版ではお茶の間のWiiから操作を目指します(いつになることか</p>
<p>Linux版は現在調整中です。走行するには解決しないといけない問題が幾つかあります。</p>
<p>操縦はWiiリモコンのBlueToothをMacのBlueToothに繋いでます。</p>
<p>MacからラジコンへはXBeeでシリアル通信をしてます。</p>
<p>ラジコンの実装としては、Arduinoにラジコンのバッテリーを繋ぎ、5Vを制御用、VINをモーター用に電源を回しました。</p>
<p>今回、モータードライバー(TB6612FNG)を使い前進後進を可能にしました。</p>
<p>TB6612FNGはネットに解説ページが無くて配線に悩みましたが、解れば非常に扱いやすい子です。</p>
<p>では、会社で撮った動画をどうぞ！！※撮影禁止区域は映っていないはず。。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/amT7dliMJvQ&amp;hl=ja&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/amT7dliMJvQ&amp;hl=ja&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>趣味で作ったラジコンを会社に持ち込んだりする、こんな私のいるソリューション部ですが、現在人材募集中です。たぶん10月いっぱい。</p>
<p>注) ラジコンは作りません</p>
<p>我こそはと思う方はお問い合わせください。なお、WEB開発経験のある経験者でお願いします。</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 51px; width: 1px; height: 1px;">TB6612FNGり</div>
<g:plusone href="http://labs.infoalive.com/tips/127"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/127/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ネットワークラジコンをコントロール</title>
		<link>http://labs.infoalive.com/tips/109</link>
		<comments>http://labs.infoalive.com/tips/109#comments</comments>
		<pubDate>Tue, 15 Sep 2009 04:14:57 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[avetanabt]]></category>
		<category><![CDATA[bluecove]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[RS-232]]></category>
		<category><![CDATA[serproxy]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[WiiRemoteJ]]></category>
		<category><![CDATA[wrj4P5]]></category>
		<category><![CDATA[ラジアン]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[組み込み系]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=109</guid>
		<description><![CDATA[昨晩Macからネットワークを経由し、ラジコン(組み込みLinuxに繋がったArduino)を操作できました。 ネットワークからArduinoを操作するのに、「Serial Proxy」を使いました。 「Serial Pr [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F109"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F109&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>昨晩Macからネットワークを経由し、ラジコン(組み込みLinuxに繋がったArduino)を操作できました。</p>
<p>ネットワークからArduinoを操作するのに、「Serial Proxy」を使いました。</p>
<p>「Serial Proxy」を使うことで、ストリームからシリアルの制御が可能となります。</p>
<p>Linuxへのインストールは簡単</p>
<ol>
<li>Arduino公式サイトのダウンロードページの一番下にある「Serial Proxy」のソース版をダウンロード<a href="http://www.arduino.cc/en/Main/Software" target="_blank">http://www.arduino.cc/en/Main/Software</a></li>
<li>make</li>
<li>serproxy.cfgを設定。comm_baud=9600、serial_device1=/dev/ttyUSB0に設定</li>
<li>./serproxy を実行</li>
</ol>
<p>あとはProcessingのコードをストリーム用に修正。</p>
<p>以下は実際に利用したWiiハンドルからネットワーク越しにラジコンを操作するコードです。</p>
<p># ハンドル周りに角度変更後の値から±5～10度の遊びを加えると操作しやすくなります（たぶん</p>
<p><code><br />
import lll.wrj4P5.*;<br />
import lll.Loc.*;<br />
import processing.net.*;</code></p>
<p>float i = 0.0;<br />
float angle = 0.0;<br />
int kakudo = 0;<br />
int old_kakudo = 0;</p>
<p>Wrj4P5 wii;<br />
LinkedList p = new LinkedList();<br />
Client client;</p>
<p>void setup() {</p>
<p style="padding-left: 30px;">size(300,300,P3D);</p>
<p style="padding-left: 30px;">wii=new Wrj4P5(this).connect();</p>
<p style="padding-left: 30px;">client = new Client(this, &#8220;10.0.2.2&#8243;, 5331);</p>
<p style="padding-left: 30px;">smooth();</p>
<p style="padding-left: 30px;">rectMode(CENTER);</p>
<p>}</p>
<p>void draw() {</p>
<p style="padding-left: 30px;">if (wii.isConnecting()) return;</p>
<p style="padding-left: 30px;">stroke(32);</p>
<p style="padding-left: 30px;">fill(255);</p>
<p style="padding-left: 30px;">ellipse(width/2, height/2, width/1.6, width/1.6);</p>
<p style="padding-left: 30px;">translate(width/2,height/2);</p>
<p style="padding-left: 30px;">rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );</p>
<p style="padding-left: 30px;">fill(0);</p>
<p style="padding-left: 30px;">rect(0,0,width/2,height/7);</p>
<p style="padding-left: 30px;">angle = atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) * 180 / PI;</p>
<p style="padding-left: 30px;">if (angle &gt; 0) {</p>
<p style="padding-left: 60px;">kakudo = int(angle) -90;</p>
<p style="padding-left: 60px;">kakudo = 180 &#8211; kakudo;</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (angle &lt; 0) {</p>
<p style="padding-left: 60px;">kakudo = int(angle) * -1 -90;</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">kakudo = int(kakudo * 0.1) * 10;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 65 &amp;&amp; kakudo &lt;= 115) kakudo = 90;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 115 &amp;&amp; kakudo &lt;= 135) kakudo = 115;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 135) kakudo = 135;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 45 &amp;&amp; kakudo &lt;= 65) kakudo = 65;</p>
<p style="padding-left: 30px;">if (kakudo &lt;= 45) kakudo = 45;</p>
<p style="padding-left: 30px;">if (old_kakudo != kakudo){</p>
<p style="padding-left: 60px;">old_kakudo = kakudo;</p>
<p style="padding-left: 60px;">client.write(str(kakudo) + &#8220;s\n&#8221;);</p>
<p style="padding-left: 60px;">println(client.read());</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>void buttonPressed(RimokonEvent evt,int rid){</p>
<p style="padding-left: 30px;">if (evt.wasPressed(evt.TWO)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;255w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (evt.wasPressed(evt.ONE)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;150w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p>}<br />
void buttonReleased(RimokonEvent evt,int rid){</p>
<p style="padding-left: 30px;">if (evt.wasReleased(evt.TWO)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;0w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (evt.wasReleased(evt.ONE)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;0w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>以上です。</p>
<p>「Serial Proxy」を使うとFlashなどからもArduinoの操作が可能となります。何が出来るか想像するだけでご飯が３杯は食べれます。もっと？</p>
<p>Arduinoを始めてからここまで２週間かかりました。Amazonの商品発送が9/1なので間違いないです。</p>
<p>平日は仕事しながら家で開発してましたので結構疲れました。</p>
<p>次回はラジコンを操作している動画のアップを予定してます。 # Serial Proxyとの通信に不具合があるので調整中です。</p>
<p>おまけ：Processing 1.0.7 を利用することでMacの64bitでもwiiリモコンを操作できました。</p>
<g:plusone href="http://labs.infoalive.com/tips/109"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/109/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

