<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
	<channel>
<title>Takuro Memo</title><link>https://www.takuroyonezawa.info/index.html</link><description>Takuro Memo</description><dc:language>en</dc:language><language>en</language><dc:date>2015-06-21T16:11:34+02:00</dc:date><admin:generatorAgent rdf:resource="http://www.realmacsoftware.com/" />
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
<lastBuildDate>Fri, 21 Dec 2012 04:37:54 +0100</lastBuildDate><item><title>UITableView reloadData &#x306e;&#x7f60;</title><dc:subject>Note</dc:subject><dc:date>2015-06-21T16:11:34+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/aeda2f79266b77efe9354597e3a30b10-21.html#unique-entry-id-21</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/aeda2f79266b77efe9354597e3a30b10-21.html#unique-entry-id-21</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">iOS プログラミングで、UITableViewのセルを頻繁に更新したいときに、reloadDataを使うと罠にはまる。<br />というのも、古いセルに割り当てられたメモリが解放されず、どんどんメモリ使用量がたまっていく。<br />これはUIView関係のautoreleaseのタイミングのせいで、仕方ない。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/reload.jpg" width="456" height="288" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />UITableView reloadData many times cause memory leak and slow down application<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://stackoverflow.com/questions/4029603/uitableview-reloaddata-many-times-cause-memory-leak-and-slow-down-application" target="self" rel="external">http://stackoverflow.com/questions/4029603/uitableview-reloaddata-many-times-cause-memory-leak-and-slow-down-application</a></span><span style="font:12px HiraKakuProN-W3; "><br /><br />この現象。<br />ここでの答えは、 reloadRowsAtIndexPaths:withRowAnimation: を使え、ということだったが、確かにメモリ量はふえないが、例えばセンサデータのような高速に切り替わるデータを扱うときは、更新してる様子は見れたもんじゃない。<br /><br />正しいやり方は、reloadDataを使わず、セルの中の一部だけ（この場合はセンサデータを表示するUILabelだけ）更新してやる。<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://ios-practice.readthedocs.org/en/latest/docs/tableview/" target="self">ここ</a></span><span style="font:12px HiraKakuProN-W3; ">が参考になる。<br /><br /><br /></span><span style="font:11px Menlo-Regular; color:#007400;">//for cell updating</span><span style="font:11px Menlo-Regular; "><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)updateCell:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableViewCell</span><span style="font:11px Menlo-Regular; "> *)cell atIndexPath:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSIndexPath</span><span style="font:11px Menlo-Regular; "> *)indexPath {<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">// </span><span style="font:11px HiraKakuProN-W3; color:#007400;">セルの中身をアップデートの例。この場合は4のTagでとってこれるUILabelの値を変更できる</span><span style="font:11px HiraKakuProN-W3; ">。</span><span style="font:11px Menlo-Regular; "><br />    ((</span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; ">*)[cell </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewWithTag</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#1C00CF;">4</span><span style="font:11px Menlo-Regular; ">]).</span><span style="font:11px Menlo-Regular; color:#5C2699;">text</span><span style="font:11px Menlo-Regular; "> =[[</span><span style="font:11px Menlo-Regular; color:#3F6E74;">dataArray</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">objectAtIndex</span><span style="font:11px Menlo-Regular; ">:indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">row</span><span style="font:11px Menlo-Regular; ">] </span><span style="font:11px Menlo-Regular; color:#26474B;">value</span><span style="font:11px Menlo-Regular; ">];<br />}<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)updateVisibleCells {<br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">for</span><span style="font:11px Menlo-Regular; "> (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableViewCell</span><span style="font:11px Menlo-Regular; "> *cell </span><span style="font:11px Menlo-Regular; color:#AA0D91;">in</span><span style="font:11px Menlo-Regular; "> [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">tableView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">visibleCells</span><span style="font:11px Menlo-Regular; ">]){<br />        [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">updateCell</span><span style="font:11px Menlo-Regular; ">:cell </span><span style="font:11px Menlo-Regular; color:#26474B;">atIndexPath</span><span style="font:11px Menlo-Regular; ">:[</span><span style="font:11px Menlo-Regular; color:#3F6E74;">tableView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">indexPathForCell</span><span style="font:11px Menlo-Regular; ">:cell]];<br />    }<br />}</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />こういうメソッドを用意してやって、updateVisibleCellsを呼べば、見えてる場所のセルの中身だけ更新されるし、<br />きちんと一つだけの更新したい場合は、updateCellだけ呼べばOK。<br /></span>]]></content:encoded></item><item><title>&#x30cb;&#x30b3;&#x30cb;&#x30b3;&#x751f;&#x653e;&#x9001;&#x306e;&#x30b3;&#x30e1;&#x30f3;&#x30c8;&#x3092;Java&#x3067;&#x53d6;&#x5f97;</title><dc:subject>Note</dc:subject><dc:date>2015-04-16T20:08:37+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/bdc9643a4f06edb02bbc1dd306f52b00-20.html#unique-entry-id-20</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/bdc9643a4f06edb02bbc1dd306f52b00-20.html#unique-entry-id-20</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">昔ニコニコ生放送のコメントを取得してごにょごにょするプログラムをJavaで書いてた時は、NicoAPIWrapperというのを使わせてもらってたのですが、久しぶりに昔書いたプログラムを使おうと思っても、ニコニコ生放送のログイン仕様などが変わったせいか、動きませんでした。<br /><br />なんかないかなぁ、と探してみたのですがそのまま動くものがありませんでした。残念。<br />ブラウザのコンソールでニコ生側とブラウザとのやりとりを眺めてみると、どうやらログイン時のパラメータの渡し方などが違うようです。<br />これだけだったら簡単に直せそうなので、やってみましょう。<br /><br />元のコードとして、今回は、<br />ニコ★リブというプロジェクトの中の、Nico-Lib-Java-Hal というのを使ってみることにしました。（Nico-Lib-Java-Talisker@ZQNというのでも、改良すればいけました）<br /><br />ここからNico-Lib-Java-Halをダウンロード：<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://sourceforge.jp/projects/nicolib/scm/svn/tree/head/Java/" target="self">http://sourceforge.jp/projects/nicolib/scm/svn/tree/head/Java/</a></span><span style="font:12px HiraKakuProN-W3; "><br /><br />変更するのは、nicolib.api.Common.java だけで良さそうです。<br />loginメソッドの中のプログラムを、下記のように変えます。<br /><br /><pre><br /><br /></span><span style="font:11px Monaco; ">		</span><span style="font:11px Monaco; color:#3F7F5F;">// </span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;">オリジナル<br />			</span><span style="font:11px Monaco; color:#3F7F5F;">//String </span><span style="font:11px Monaco; color:#3F7F5F;"><u>param</u></span><span style="font:11px Monaco; color:#3F7F5F;"> = String.format("mail=%s&password=%s</span><span style="font:11px Monaco; color:#3F7F5F;"><u>&next_url</u></span><span style="font:11px Monaco; color:#3F7F5F;">=", mail,password);</span><span style="font:11px Monaco; "><br /><br />		</span><span style="font:11px Monaco; color:#3F7F5F;">// </span><span style="font:11px Monaco; color:#3F7F5F;"><u>takuro</u></span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;">が直した</span><span style="font:11px Monaco; "><br />		String </span><span style="font:11px Monaco; color:#6A3E3E;">param</span><span style="font:11px Monaco; "> = String.format(</span><span style="font:11px Monaco; color:#2A00FF;">"mail_tel=%s&password=%s&next_url="</span><span style="font:11px Monaco; ">, </span><span style="font:11px Monaco; color:#6A3E3E;">mail</span><span style="font:11px Monaco; ">,</span><span style="font:11px Monaco; color:#6A3E3E;">password</span><span style="font:11px Monaco; ">);<br /><br />		</span><span style="font:11px Monaco; color:#3F5FBF;">/**</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * </span><span style="font:11px HiraKakuProN-W3; color:#3F5FBF;">オリジナル</span><span style="font:11px Monaco; color:#3F5FBF;"> </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * HttpURLConnection </span><span style="font:11px Monaco; color:#3F5FBF;"><u>http</u></span><span style="font:11px Monaco; color:#3F5FBF;"> = null; </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * try {</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * </span><span style="font:11px Monaco; color:#3F5FBF;"><u>http</u></span><span style="font:11px Monaco; color:#3F5FBF;"> = Http.postConnection(LOGINPAGE_URL, </span><span style="font:11px Monaco; color:#3F5FBF;"><u>param</u></span><span style="font:11px Monaco; color:#3F5FBF;">, null); String</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * cookies = http.getHeaderField("Set</span><span style="font:11px Monaco; color:#7F7F9F;">-</span><span style="font:11px Monaco; color:#3F5FBF;">Cookie"); String userSession =</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * NicoText.getUserSession(cookies); if(userSession != null){</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 * Http.setUserSession(userSession); return true; }</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 **/</span><span style="font:11px Monaco; "><br /><br />		</span><span style="font:11px Monaco; color:#3F7F5F;">// </span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;">ここから</span><span style="font:11px Monaco; color:#3F7F5F;"><u>takuro</u></span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;">がなおした</span><span style="font:11px Monaco; "><br />		HttpsURLConnection </span><span style="font:11px Monaco; color:#6A3E3E;">http</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">;<br />		</span><span style="font:11px Monaco; color:#7F0055;">try</span><span style="font:11px Monaco; "> {<br /><br />			</span><span style="font:11px Monaco; color:#6A3E3E;">http</span><span style="font:11px Monaco; "> = (HttpsURLConnection) Http.postConnection(</span><span style="font:11px Monaco; color:#0000C0;">LOGINPAGE_URL</span><span style="font:11px Monaco; ">,<br />					</span><span style="font:11px Monaco; color:#6A3E3E;">param</span><span style="font:11px Monaco; ">, </span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">);<br /><br />			String </span><span style="font:11px Monaco; color:#6A3E3E;">userSession</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#2A00FF;">""</span><span style="font:11px Monaco; ">;<br /><br />			</span><span style="font:11px Monaco; "><u>Map</u></span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#6A3E3E;">headers</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#6A3E3E;">http</span><span style="font:11px Monaco; ">.getHeaderFields();<br />			</span><span style="font:11px Monaco; "><u>Iterator</u></span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#6A3E3E;">it</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#6A3E3E;">headers</span><span style="font:11px Monaco; ">.keySet().iterator();<br />			</span><span style="font:11px Monaco; color:#7F0055;">while</span><span style="font:11px Monaco; "> (</span><span style="font:11px Monaco; color:#6A3E3E;">it</span><span style="font:11px Monaco; ">.hasNext()) {<br />				String </span><span style="font:11px Monaco; color:#6A3E3E;">key</span><span style="font:11px Monaco; "> = (String) </span><span style="font:11px Monaco; color:#6A3E3E;">it</span><span style="font:11px Monaco; ">.next();<br />				System.</span><span style="font:11px Monaco; color:#0000C0;">out</span><span style="font:11px Monaco; ">.println(</span><span style="font:11px Monaco; color:#6A3E3E;">key</span><span style="font:11px Monaco; "> + </span><span style="font:11px Monaco; color:#2A00FF;">":"</span><span style="font:11px Monaco; "> + </span><span style="font:11px Monaco; color:#6A3E3E;">headers</span><span style="font:11px Monaco; ">.get(</span><span style="font:11px Monaco; color:#6A3E3E;">key</span><span style="font:11px Monaco; ">));<br />				</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; "> (</span><span style="font:11px Monaco; color:#6A3E3E;">key</span><span style="font:11px Monaco; "> != </span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; "> && </span><span style="font:11px Monaco; color:#6A3E3E;">key</span><span style="font:11px Monaco; ">.equals(</span><span style="font:11px Monaco; color:#2A00FF;">"Set-Cookie"</span><span style="font:11px Monaco; ">)) {<br />					</span><span style="font:11px Monaco; color:#6A3E3E;">userSession</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#6A3E3E;">headers</span><span style="font:11px Monaco; ">.get(</span><span style="font:11px Monaco; color:#6A3E3E;">key</span><span style="font:11px Monaco; ">).toString();<br />				}<br />			}<br />			</span><span style="font:11px Monaco; color:#6A3E3E;">userSession</span><span style="font:11px Monaco; "> = NicoText.getUserSession(</span><span style="font:11px Monaco; color:#6A3E3E;">userSession</span><span style="font:11px Monaco; ">);<br />			System.</span><span style="font:11px Monaco; color:#0000C0;">out</span><span style="font:11px Monaco; ">.println(</span><span style="font:11px Monaco; color:#2A00FF;">"</span><span style="font:11px HiraKakuProN-W3; color:#2A00FF;">ユーザセッションをゲットなう</span><span style="font:11px Monaco; color:#2A00FF;">"</span><span style="font:11px Monaco; "> + </span><span style="font:11px Monaco; color:#6A3E3E;">userSession</span><span style="font:11px Monaco; ">);<br /><br />			</span><span style="font:11px Monaco; color:#3F7F5F;">// </span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;">ここまで</span><span style="font:11px Monaco; color:#3F7F5F;"><u>takuro</u></span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;">がなおした。あとはそのまま・・<br /><br /></pre><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">たぶんこれで動くと思います。（私の環境では動きました）<br /></span><span style="font:11px HiraKakuProN-W3; color:#3F7F5F;"><br /><img src=http://www.ht.sfc.keio.ac.jp/~takuro/resources/b61c01e73fac0cd179e2c45297183f77.gif width=600><br /><br /></span>]]></content:encoded></item><item><title>IPSJ-One&#x306e;&#x8ffd;&#x8a18;&#xff08;&#x305d;&#x306e;&#xff11;&#xff09;</title><dc:subject>Note</dc:subject><dc:date>2015-03-18T16:39:28+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/eeb2d12b3b6bca9adcd7d0c92490e705-19.html#unique-entry-id-19</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/eeb2d12b3b6bca9adcd7d0c92490e705-19.html#unique-entry-id-19</guid><content:encoded><![CDATA[<a href="http://ipsj-one.org" target="self">IPSJ-One</a><span style="font:12px HiraKakuProN-W3; ">、分野横断的に最新の研究トピックが知れて、大変勉強になりました。アツい人たちといると、とっても心地よいです。運営の皆様、登壇者の皆様、ありがとうございました。<br />今回５分のプレゼンでしたが、そのスライド作成の過程で研究を振り返ってみると、色々当時の記憶が蘇ってきてたので、追記ということでメモしておきます。<br /><br /></span><h3>（１）センサ情報と映像をつなげるお話</h3><span style="font:12px HiraKakuProN-W3; ">まずはセンサ情報を今の映像配信サービスでどう流すか、というお話をしました。<br /><br />もともとの研究のきっかけは、熊本の方から、「熊本と東京をつないだ遠隔ライブをやりたいので、協力してくれないか」というお誘いからでした。昔ニコニコ生放送を使った映像配信支援の</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ht.sfc.keio.ac.jp/~takuro/ubicomp2012takuro.pdf" target="self">論文</a></span><span style="font:12px HiraKakuProN-W3; ">を書いてたことがあり、偶然その研究を知って、コンタクトしていただいたようです。もともとは上述した論文で作っていたシステムを使えないか、というお話だったのですが、せっかくやるなら何か新しいことをやりたいのだけど、それを許して頂けるなら、という我儘なお願いを聞いていただき、適宜相談の上お手伝いすることになりました。（新しいものが作れなかった場合は既に作っていたシステムを使う、というセーフティネットは一応用意）<br /><br />この時点で決まっていたのは、<br />・一ヶ月後に本番<br />・出演アーティストは、</span><span style="font:12px HiraKakuProN-W3; "><a href="http://gustavecoquiot.blogspot.jp" target="self">GUSTAVE COQUIOT</a></span><span style="font:12px HiraKakuProN-W3; "> と、</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.birdbysnow.com" target="self">Bird By Snow</a></span><span style="font:12px HiraKakuProN-W3; "> 。どちらも素晴らしいミュージシャンです！<br />・映像配信はUSTREAMで行う（安定した配信と高品質な音を流したい、という前提がありました）<br />ということでした。<br /><br />何をやるか、とりあえずアーティストの方と相談の機会を設けてもらいました。通常のライブと遠隔ライブの、<br />・アーティスト目線での違い（たとえば観客からのフィードバックが乏しい）<br />・観客目線での違い（たとえばカメラで切り取られた視点からしか見えない）<br />などから、雑談まで、色々とお話させていただきました（ちなみにこの場には何故か東大暦本研のS藤さんにも同席してもらっていましたw）。<br />あとは、隣の研究室のN村先生と休憩中の雑談で、坂本龍一さんの遠隔ピアノライブをお手伝いしてたときの話を伺いました。「当時は遠隔で演奏したピアノのMIDI情報をネットで送信して、リモートのピアノが動く、みたいなことを行ってた」みたいなお話を聞けました。<br />これらの相談から、<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">（演奏側ー＞観客側）<br /></span><span style="font:12px HiraKakuProN-W3; ">・アーティストの演奏してる全身のモーションデータをUSTREAMの映像と同期して届けて、<br />・そのモーションデータを視聴会場で再現し、観客がUSTREAMの映像に加え、自由な視点でアーティストの動きをみれるようにする<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">（観客側ー＞演奏側）<br /></span><span style="font:12px HiraKakuProN-W3; ">・観客が一番見たがっている視点を抽出し（再現したアーティストの全身モーションに対する観客の注目点の抽出）、アーティスト側に送信<br />・その情報から、カメラや照明をコントロールして盛り上がりなどをフィードバック<br /><br />というシステムを作ることにしました。一つチャレンジングなのが、「全身のモーションデータをUSTREAMの映像と同期して届ける」のをどうするか、という問題でした。今回は配信側と視聴側は１：１なのですが、通常は１：多なので、同期問題やスケーラビリティなどを考えると、別ストリームを用いて頑張って同期して届けるよりも、なんらかの形でUSTREAMの映像に付与できた方が今後のためにもよいのでは、ということになりました。<br /><br /></span><img class="imageStyle" alt="unknown" src="https:/www.takuroyonezawa.info/blog/files/unknownp.jpg" width="382" height="288" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />（当時のメモ）<br /><br />映像にデータを埋め込む方式はいくつか提案されてますが、調べたところシックリくる方法が我々の調査力だと見当たりませんでした。そこで、「センサデータストリームをそのまま動画のQRコードに変換して映像と合成すればいけるのでは」、というアイデアを考え、プロトタイプを作って色々試験してみたところ、無事30FPS程度で読めることがわかったため、そのアプローチを採用しました。常に30FPSで全てが読めるわけではないのですが、もともとセンサデータ自体欠損もあるし、３０枚のうち１、２枚が落ちても、センサデータを対象とする上では問題にならないだろう、と判断しました。<br /><br />ということで、モーションデータを既存映像配信サービス上で送ることができ、（観客側ー＞演奏側）のシステムもつくり、何とか（？）当日のライブを乗り切りました。<br /><br /></span><img class="imageStyle" alt="unknown" src="https:/www.takuroyonezawa.info/blog/files/haisin.jpg" width="288" height="384" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">（アーティストの映像配信側システム。カメラ４台+Kinect。カメラ切替やズームインソフトなども手作り。）<br /><br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/gustav.jpg" width="576" height="291" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">（２枚のスクリーン・プロジェクタを使い、USTREAMからの映像と、その映像から抽出したモーションデータから作ったCGをそれぞれ投影）<br /><br /></span><img class="imageStyle" alt="R0019937" src="https:/www.takuroyonezawa.info/blog/files/r0019937.jpg" width="384" height="288" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">（アーティストの方々と記念撮影）<br /><br />その後、モーションデータだけではなくて様々なセンサデータを対象にし、<br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">・センサデータフォーマット</span><span style="font:12px HiraKakuProN-W3; ">（今はバージョン３を実装中）</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br />・QRコードのサイズをおさえるためのセンサデータの圧縮</span><span style="font:12px HiraKakuProN-W3; ">（今はバージョン２を実装中）</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W3; ">などの課題に取り組みながら、少しずつ作ってきました。<br />データ再生側も、モーションデータの場合はCGだけじゃなくて実際にロボットを使ったりして、姿勢制御って難しいなぁなどと思いながら作ったり。リアルタイム記録 or 配信に関しては、センサデータと映像を同期させるために1/＊(FPS) 秒以内にセンサデータのフォーマット化、圧縮、QRコードへの変換、映像と合成、を行う必要がある。つまりハードリアルタイム性が要求され、そのあたりも面白いところです。<br /><br />そんなこんなで色々作りながらも、最終的には</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ht.sfc.keio.ac.jp/~tetujin/" target="self">tetujinさん</a></span><span style="font:12px HiraKakuProN-W3; ">の多大な努力の結果、</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.senbay.info" target="self">Senbayアプリ</a></span><span style="font:12px HiraKakuProN-W3; ">をリリースするに至りました。<br /><br />なお、私たちの方式は映像の一部を二次元コードのために用いるという、かなり割り切った方式になってます。これにはもとの映像の美しさを損なうなど、利点と欠点があるので、あらゆるケースで正しいアプローチにはなりえないと思います。<br />映像になんらかのデータを埋め込む方式は、MPEG7(*1) や電子透かし技術(*2, *3)、など色々あるので、その辺りの動向をうまく見ながら、実際のサービスとして使えそうな・動きそうなものを作っていければ、と思います。また、今回のは欠損が許されるセンサデータを対象とする、ということで、ライブラリなどの普及性などからQRコードを活用しましたが、漏れのない信頼性の高いデータ転送を独自の二次元コードで行う、という研究（*4）もありましたので、こちらもご興味のある方はご覧ください。<br /></span><span style="font:12px HiraKakuProN-W3; "><br />(*1) Mpeg-7. http://mpeg.chiariglione.org/standards/mpeg-7.<br />(*2) Potdar, V. M. et. al . A survey of digital image watermarking techniques. In Industrial Informatics, 2005. INDIN. 2005, pp.709&ndash;716.<br />(*3) Tianxing Li et. al. HiLight: Hiding Bits in Pixel Translucency Changes, Mobicom2014, pp. 383-386<br /></span><span style="font:12px HiraKakuProN-W3; ">(*4) VCode - Pervasive Data Transfer Using Video Barcode<br /><br /></span><span style="font:12px HiraKakuProN-W3; "><br />長くなったのでここでひとまずきります・・<br /><br /></span>]]></content:encoded></item><item><title>Mac OSX &#x3067;Java&#x30a2;&#x30d7;&#x30ea;&#x3092;&#x30a2;&#x30d7;&#x30ea;&#x30b1;&#x30fc;&#x30b7;&#x30e7;&#x30f3;(.app)&#x5316;</title><dc:subject>Note</dc:subject><dc:date>2015-01-28T08:24:35+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/4bf92372f089ad1b1e0a3fe4c1052fd2-18.html#unique-entry-id-18</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/4bf92372f089ad1b1e0a3fe4c1052fd2-18.html#unique-entry-id-18</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">いつのまにかOSXが提供するJar Bundlerがなくなってたので、YosemiteとかでJavaアプリを.app化する方法。<br />(1)起動可能なjarファイルの作成、と(2) AppMakerによるapp化 の２ステップで簡単にできます。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">(1) 起動可能なjarファイルの作成</span><span style="font:12px HiraKakuProN-W3; "><br />Eclipseプロジェクトから、Export -> JavaのRunnable JAR file を選択。<br />Launch configuration からメインプログラムを選択して、Export destinationを適当に決める。<br />Library handlingには、Package required libraries into generated JAR が僕の環境だと一番しっくりきました。<br />これで、必要なライブラリなどもexportするjarファイルに含まれます。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/jar.jpg" width="396" height="385" /><br /><br /><span style="font:12px HiraKakuProN-W3; ">あと、</span>app<span style="font:12px HiraKakuProN-W3; ">化するときにアイコンに使いたいicnsファイルをネットから探しておきましょう。</span><br /><br /><strong>(2) AppMaker</strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">による</span><strong>app</strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">化</span><br /><span style="font:12px HiraKakuProN-W3; ">ここから</span>AppMaker<span style="font:12px HiraKakuProN-W3; ">をありがたくダウンロードさせていただく。</span><br /><a href="http://sourceforge.net/projects/jarappmaker/" target="self">http://sourceforge.net/projects/jarappmaker/</a><br /><br /><span style="font:12px HiraKakuProN-W3; ">あとは、</span>AppMaker<span style="font:12px HiraKakuProN-W3; ">を起動して、</span>(1)<span style="font:12px HiraKakuProN-W3; ">で作成した</span>jar<span style="font:12px HiraKakuProN-W3; ">ファイルと、アイコンを指定して、起動に必要なJavaのバージョンを指定して、Startボタンを押せば、できます。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/appmaker.jpg" width="270" height="180" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">簡単！！</span><br /><br /><br />]]></content:encoded></item><item><title>OSX Yosemite&#x3067;QTJava&#x3092;&#x52d5;&#x304b;&#x3059;</title><dc:subject>Note</dc:subject><dc:date>2014-11-25T09:27:29+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/ad403624ce6585bc61b85d96de0d08b6-17.html#unique-entry-id-17</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/ad403624ce6585bc61b85d96de0d08b6-17.html#unique-entry-id-17</guid><content:encoded><![CDATA[<span style="font:11px HiraKakuProN-W3; ">過去のデモが</span><span style="font:11px Monaco; ">Processing1.0</span><span style="font:11px HiraKakuProN-W3; ">系でQTJavaで動いてるので、それをそのままYosemiteで動かしたい場合のメモ。<br /><br /></span><span style="font:11px HiraKakuProN-W3; "><a href="http://www.compadre.org/osp/bulletinboard/TDetails.cfm?FID=57&TID=3331&ViewType=2" target="self" rel="external">http://www.compadre.org/osp/bulletinboard/TDetails.cfm?FID=57&TID=3331&ViewType=2</a></span><span style="font:11px HiraKakuProN-W3; "><br /><br />ここを参考に、まずQTJava.zip と l</span><span style="font:12px Verdana, sans-serif; ">ibQTJNative.jnilib </span><span style="font:12px HiraKakuProN-W3; ">をどこからかゲットしてきて、</span><span style="font:12px Verdana, sans-serif; "><br />/System/Library/Java/Extensions<br /></span><span style="font:12px HiraKakuProN-W3; ">ここに置く。</span><span style="font:12px Verdana, sans-serif; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">そのあと、Tracker をダウンロードしてきて、入れる。<br /></span><span style="font:12px Verdana, sans-serif; "><br /></span><span style="font:12px Verdana, sans-serif; "><a href="http://www.cabrillo.edu/~dbrown/tracker/installers/Tracker-4.87-osx-installer.zip" target="self">http://www.cabrillo.edu/~dbrown/tracker/installers/Tracker-4.87-osx-installer.zip</a></span><span style="font:12px Verdana, sans-serif; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">あとは動きます。<br />32bitモードでJavaプログラム起動しないと動かないかも？<br />実行時のVMオプションに -d32<br /></span>]]></content:encoded></item><item><title>nao&#x306e;&#x8155;&#x3092;Java&#x3067;&#x52d5;&#x304b;&#x3059;&#x30b5;&#x30f3;&#x30d7;&#x30eb;</title><dc:subject>Note</dc:subject><dc:date>2014-08-06T12:14:43+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/63dc65cafcc9949631195a009d2077c2-16.html#unique-entry-id-16</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/63dc65cafcc9949631195a009d2077c2-16.html#unique-entry-id-16</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; "><a href="https://community.aldebaran.com/doc/1-14/dev/python/examples/motion/whole_body.html#python-example-motion-wholebody" target="self" rel="external">Pythonで腕を動かすコード</a></span><span style="font:12px HiraKakuProN-W3; ">を参考に、Java版を作ってみました。<br />Naoの腕が動くコードです。<br /><br /></span><span style="font:11px Monaco; "><hr><br /><pre><br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> java.util.ArrayList;<br /><br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> com.aldebaran.proxy.*;<br /><br /></span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">class</span><span style="font:11px Monaco; "> Test {<br />	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> String </span><span style="font:11px Monaco; color:#0000C0;">NAOQI_IP</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#2A00FF;">"127.0.0.1"</span><span style="font:11px Monaco; ">;<br />	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#0000C0;">NAOQI_PORT</span><span style="font:11px Monaco; "> = 9559;<br /><br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> main(String[] args){<br />		Test </span><span style="font:11px Monaco; "><u>test</u></span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Test();<br />		<br />	}<br />	<br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> Test(){<br />		<br />		doArmControl(</span><span style="font:11px Monaco; color:#2A00FF;">"LArm"</span><span style="font:11px Monaco; ">);<br />	<br />	}<br />	<br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> stiffnessOn(ALMotionProxy proxy){<br />		Variant pNames = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Variant(</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> String[]{</span><span style="font:11px Monaco; color:#2A00FF;">"Body"</span><span style="font:11px Monaco; ">});<br />		Variant pStiffnessLists = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Variant(</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; ">[]{1.0f});<br />		Variant pTimeLists = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Variant(</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; ">[]{1.0f});<br />		proxy.stiffnessInterpolation(pNames, pStiffnessLists, pTimeLists);<br />	}<br />	<br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> doArmControl(String effectorName){<br />		ALMotionProxy motionProxy = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ALMotionProxy(</span><span style="font:11px Monaco; color:#0000C0;">NAOQI_IP</span><span style="font:11px Monaco; ">,</span><span style="font:11px Monaco; color:#0000C0;">NAOQI_PORT</span><span style="font:11px Monaco; ">);<br />		ALRobotPostureProxy postureProxy = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ALRobotPostureProxy(</span><span style="font:11px Monaco; color:#0000C0;">NAOQI_IP</span><span style="font:11px Monaco; ">,</span><span style="font:11px Monaco; color:#0000C0;">NAOQI_PORT</span><span style="font:11px Monaco; ">);<br />		<br />		</span><span style="font:11px Monaco; color:#3F7F5F;">//Set NAO in </span><span style="font:11px Monaco; color:#3F7F5F;"><u>stifness</u></span><span style="font:11px Monaco; color:#3F7F5F;"> On</span><span style="font:11px Monaco; "><br />		stiffnessOn(motionProxy);<br />		<br />		</span><span style="font:11px Monaco; color:#3F7F5F;">//Send NAO to Pose </span><span style="font:11px Monaco; color:#3F7F5F;"><u>Init</u></span><span style="font:11px Monaco; "><br />		postureProxy.goToPosture(</span><span style="font:11px Monaco; color:#2A00FF;">"StandInit"</span><span style="font:11px Monaco; ">, 0.5f);<br />		</span><span style="font:11px Monaco; color:#7F0055;">boolean</span><span style="font:11px Monaco; "> isEnabled = </span><span style="font:11px Monaco; color:#7F0055;">false</span><span style="font:11px Monaco; ">;<br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; "><u>space</u></span><span style="font:11px Monaco; "> = 2; </span><span style="font:11px Monaco; color:#3F7F5F;">//motion.FRAME_ROBOT in </span><span style="font:11px Monaco; color:#3F7F5F;"><u>python</u></span><span style="font:11px Monaco; color:#3F7F5F;"> </span><span style="font:11px Monaco; color:#3F7F5F;"><u>sdk</u></span><span style="font:11px Monaco; color:#3F7F5F;"> is 2.</span><span style="font:11px Monaco; color:#3F7F5F;"><u>Seesee</u></span><span style="font:11px Monaco; color:#3F7F5F;"> </span><span style="font:11px Monaco; color:#3F7F5F;"><u>pynaoqi</u></span><span style="font:11px Monaco; color:#3F7F5F;">-</span><span style="font:11px Monaco; color:#3F7F5F;"><u>sdk</u></span><span style="font:11px Monaco; color:#3F7F5F;">/motion.py</span><span style="font:11px Monaco; "><br />		</span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; ">[] effectorInit = motionProxy.getPosition(effectorName,2,isEnabled); <br />		<br />		</span><span style="font:11px Monaco; color:#3F7F5F;">//Active LArm Tracking</span><span style="font:11px Monaco; "><br />		isEnabled = </span><span style="font:11px Monaco; color:#7F0055;">true</span><span style="font:11px Monaco; ">;<br />		motionProxy.wbEnableEffectorControl(effectorName, isEnabled);<br />		<br />		</span><span style="font:11px Monaco; color:#3F5FBF;">/**</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">			#Example showing how to set position target for LArm</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		    # The 3 coordinates are absolute LArm position in NAO_SPACE</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		    # Position in meter in x, y and z axis.</span><span style="font:11px Monaco; "><br /><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		    # X Axis LArm Position feasible movement = [ +0.00, +0.12] meter</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		    # Y Axis LArm Position feasible movement = [ </span><span style="font:11px Monaco; color:#7F7F9F;">-</span><span style="font:11px Monaco; color:#3F5FBF;">0.05, +0.10] meter</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		    # Y Axis RArm Position feasible movement = [ </span><span style="font:11px Monaco; color:#7F7F9F;">-</span><span style="font:11px Monaco; color:#3F5FBF;">0.10, +0.05] meter</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		    # Z Axis LArm Position feasible movement = [ </span><span style="font:11px Monaco; color:#7F7F9F;">-</span><span style="font:11px Monaco; color:#3F5FBF;">0.10, +0.10] meter</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		**/</span><span style="font:11px Monaco; "><br />		<br />		</span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; "> coef = 1.0f;<br />		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; ">(effectorName.equals(</span><span style="font:11px Monaco; color:#2A00FF;">"LArm"</span><span style="font:11px Monaco; ">)){<br />			coef = 1.0f;<br />		}</span><span style="font:11px Monaco; color:#7F0055;">else</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; ">(effectorName.equals(</span><span style="font:11px Monaco; color:#2A00FF;">"RArm"</span><span style="font:11px Monaco; ">)){<br />			coef = -1.0f;<br />		}<br />		<br />		</span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; ">[][] targetCoordinateList = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; ">[][]{<br />				{0.12f,0.00f*coef,0.00f},<br />				{0.12f,0.00f*coef,-0.10f},<br />				{0.12f,0.05f*coef,-0.10f},<br />				{0.12f,0.05f*coef,0.10f},<br />				{0.12f,-0.10f*coef,0.10f},<br />				{0.12f,0.10f*coef,-0.10f},<br />				{0.12f,0.00f*coef,-0.10f},<br />				{0.12f,0.00f*coef,0.00f},<br />				{0.00f,0.00f*coef,0.00f}<br />		};<br />		<br />		</span><span style="font:11px Monaco; color:#3F5FBF;">/**</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 # wbSetEffectorControl is a non blocking function</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 # time.sleep allow head go to his target</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 # The recommended minimum period between two </span><span style="font:11px Monaco; color:#3F5FBF;"><u>successives</u></span><span style="font:11px Monaco; color:#3F5FBF;"> set commands is</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		 # 0.2 s.</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">		**/</span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#7F0055;">		for</span><span style="font:11px Monaco; ">(</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> i=0;i<targetCoordinateList.</span><span style="font:11px Monaco; color:#0000C0;">length</span><span style="font:11px Monaco; ">;i++){<br />			Variant targetCoordinate = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Variant(</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">float</span><span style="font:11px Monaco; ">[]{targetCoordinateList[i][0]+effectorInit[0],<br />				targetCoordinateList[i][1]+effectorInit[1],targetCoordinateList[i][2]+effectorInit[2]});<br />			motionProxy.wbSetEffectorControl(effectorName, targetCoordinate);<br />			System.</span><span style="font:11px Monaco; color:#0000C0;">out</span><span style="font:11px Monaco; ">.println(</span><span style="font:11px Monaco; color:#2A00FF;">"target"</span><span style="font:11px Monaco; ">+i+</span><span style="font:11px Monaco; color:#2A00FF;">": X:"</span><span style="font:11px Monaco; ">+(targetCoordinateList[i][0]+effectorInit[0])+</span><span style="font:11px Monaco; color:#2A00FF;">" Y:"<br />				</span><span style="font:11px Monaco; ">+(targetCoordinateList[i][1]+effectorInit[1]) +</span><span style="font:11px Monaco; color:#2A00FF;">" Z:"</span><span style="font:11px Monaco; ">+(targetCoordinateList[i][2]+effectorInit[2]));<br />			</span><span style="font:11px Monaco; color:#7F0055;">try</span><span style="font:11px Monaco; "> {<br />				Thread.sleep(1000); </span><span style="font:11px Monaco; color:#3F7F5F;">//original is 4 </span><span style="font:11px Monaco; color:#3F7F5F;"><u>sec</u></span><span style="font:11px Monaco; color:#3F7F5F;"> but it's too slow</span><span style="font:11px Monaco; "><br />			} </span><span style="font:11px Monaco; color:#7F0055;">catch</span><span style="font:11px Monaco; "> (InterruptedException e) {<br />				e.printStackTrace();<br />			}<br />		}		<br />		<br /></span><span style="font:11px Monaco; color:#3F7F5F;">		//</span><span style="font:11px Monaco; color:#3F7F5F;"><u>Deactiate</u></span><span style="font:11px Monaco; color:#3F7F5F;"> Head Tracking</span><span style="font:11px Monaco; "><br />		isEnabled = </span><span style="font:11px Monaco; color:#7F0055;">false</span><span style="font:11px Monaco; ">;<br />		motionProxy.wbEnableEffectorControl(effectorName,isEnabled);<br /><br />	}<br />	<br />}<br /></pre><br /><hr></span>]]></content:encoded></item><item><title>nao&#x30ed;&#x30dc;&#x30c3;&#x30c8;/Mac/Java &#x899a;&#x66f8;</title><dc:subject>Note</dc:subject><dc:date>2014-08-05T19:32:36+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/e5bf6aa3484c961a5156843d18dae360-15.html#unique-entry-id-15</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/e5bf6aa3484c961a5156843d18dae360-15.html#unique-entry-id-15</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">naoの覚書です。とりあえず、Java＆Macな人は、Choregraphe、jnaoqui-sdk、webotsを入れると、本体がなくてもプログラミングしていけそうです。<br />今現在研究室にあるnaoはversion1.14.5なので、それを想定して色々とツールをインストール。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">1)コミュニティに登録<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="https://community.aldebaran.com/">https://community.aldebaran.com/</a></span><span style="font:12px HiraKakuProN-W3; "><br />で、アカウントを作りましょう。作って、ログインしたら、SOFTWARES->older software versionから、<br />・choregraphe-suite-1.14.5-mac64.dmg<br />・jnaoqi-1.14.5-mac64.tar.gz<br />・webots-for-nao-7.4.0.dmg<br />をダウンロード、アプリはインストール。<br />とりあえず、90日間の評価版として登録。<br />webotsを使うためには、別にアカウントを作る必要がある。<br />webotsを起動すると登録して、とダイアログが出てくるので、それに従って登録。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">2) Javaの設定<br /></span><span style="font:12px HiraKakuProN-W3; ">Eclipseの新規プロジェクトを作ったら、Projects->Properties->Java Build Path->Librariesで、<br />jnaoqi-1.14.5-mac64.tar.gzを解凍してできる<br />jnaoqi-1.14.5-mac64/lib/jnaoqi-1.14.5.jar を追加。<br />また、そのnative library locationに、libjnaoqi.jnilib（jarと同じくjnaoqi-1.14.5-mac64/lib/にある）のあるディレクトリを追加。<br />サンプルプログラムは、jnaoqi-1.14.5-mac64/doc/examples の中にある、<br />Memory.java, Move.java, MoveHead.java, SayHello.java, ShowImage.java<br />がある。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">3) プログラムを実行し、動きを確認<br /></span><span style="font:12px HiraKakuProN-W3; ">webotsを起動して、IPアドレスとポートがコンソールに出るので、チェック。<br />JavaのサンプルプログラムのIPとポートの設定部分を書き換える。僕の場合は<br /></span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> String </span><span style="font:11px Monaco; color:#0000C0;">NAOQI_IP</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#2A00FF;">"127.0.0.1"</span><span style="font:11px Monaco; ">;<br /></span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#0000C0;">NAOQI_PORT</span><span style="font:11px Monaco; "> = 9559;</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">このペアで動きました。<br /><br /><br />後は幸せになれる。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic333.jpg" width="582" height="498" />]]></content:encoded></item><item><title>&#x500b;&#x4eba;&#x7684;&#x306a;&#x5c06;&#x68cb;&#x30a2;&#x30d7;&#x30ea;&#x74b0;&#x5883; for iOS/iPhone/iPad</title><dc:subject>Note</dc:subject><dc:date>2013-10-29T17:05:32+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/45e5b6e138be15b33caff2394faa40ac-14.html#unique-entry-id-14</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/45e5b6e138be15b33caff2394faa40ac-14.html#unique-entry-id-14</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">現時点での個人的な将棋環境 for iOSをメモ。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">注意：将棋倶楽部24アプリは入っておりません。</span><span style="font:12px HiraKakuProN-W3; ">入れたいんだけど、登録に携帯キャリアメアドが必要で、<br />私は携帯キャリアメアドを持っていないため、登録できず。。がくっ。<br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><h1>【観戦】</h1><span style="font:12px HiraKakuProN-W3; "><br />（使用頻度：時間があればほぼ毎日）<br /></span><h2><a href="https://itunes.apple.com/jp/app/ri-ben-jiang-qi-lian-mengraibu/id389456852?mt=8" target="self">将棋連盟LIVE</a></h2><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic.jpg" width="192" height="189" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">月額350円（価格改定で400円に値上がり？）で毎日プロの対戦（主に毎日２，３局）がリアルタイムに観戦できる。解説つき。タイトル戦などはほぼ必ず中継されるので、</span><span style="font:12px HiraKakuProN-W3; "><a href="https://itunes.apple.com/jp/app/puffin-web-browser/id406239138" target="self">Puffin</a></span><span style="font:12px HiraKakuProN-W3; ">などでFlash環境を用意しなくても大丈夫。</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.meijinsen.jp" target="self">名人戦棋譜速報</a></span><span style="font:12px HiraKakuProN-W3; ">だと１日見ようと思った時に100円かかるので、それを考えるとお手頃価格。最近インストールしたんだけど、もっと前から使っておけばよかったーー。<br /><br /></span><h2><a href="https://itunes.apple.com/JP/app/id399725729?mt=8" target="self">将棋世界</a></h2><img class="imageStyle" alt="Pasted Graphic 2" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-2.jpg" width="196" height="190" /><span style="font:12px HiraKakuProN-W3; "><br />月刊「将棋世界」の電子書籍版。iPad版しかないかも？600円で１冊買えます。ほぼ全ての</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">棋譜がアニメーションで再現可能</span><span style="font:12px HiraKakuProN-W3; ">なので、頭の中で棋譜再現をしなくてもすむ優れもの。ネットの将棋の中継ではわからなかった、詳細な解説や対戦棋士の感想、人間模様まで、</span><span style="font:12px HiraKakuProN-W3; "><u>将棋の深さに浸れる一品</u></span><span style="font:12px HiraKakuProN-W3; ">。1巻を隅々まで理解しようと思うと、読むのに1週間は楽しめると思います。エッセイや棋士の昔話も楽しいです。<br /><br /></span><h2><a href="http://shogiwars.heroz.jp" target="self">将棋ウォーズ</a></h2><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-1.jpg" width="192" height="192" /><span style="font:12px HiraKakuProN-W3; "><br />下の対戦にも出てくるけど、アマチュア同士も（私に比べたら）かなりレベルが高いので、暇な時観戦してるだけで楽しい。というか、皆さん強すぎです。観戦だけならいくらでも無料。<br /><br /><br /><br /></span><h1>【オンライン対戦】</h1><span style="font:12px HiraKakuProN-W3; "><br />（使用頻度:時間があればほぼ毎日）<br /></span><h2><a href="http://shogiwars.heroz.jp" target="self">将棋ウォーズ</a></h2><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-3.jpg" width="192" height="192" /><span style="font:12px HiraKakuProN-W3; "><br />おそらく将棋倶楽部24についでポピュラーな将棋対戦アプリだと思います。将棋倶楽部24が硬派だとすると、こちらは軟派？派手なエフェクトとか色々あって楽しい。</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.konami.jp/am/shogi/2/" target="self">天下一将棋会</a></span><span style="font:12px HiraKakuProN-W3; ">にノリは似てる。対戦相手の得意な戦形なども見えるため、駆け引きも楽しめる（もちろん戦形情報なしでドキドキしながら指すのも楽しいです）。10分切れ負けか、3分切れ負けの対戦が選べて、時間が切れると負け。なので、こちらが優勢でも時間がなくなって負ける（もしくは劣勢でも勝つ）、といった逆転も多々あります。切れ負けなので、対戦時間の最大時間が予測できる。なので、電車で30分間移動する、といった時などには、「一局やったら着くな」と計算してできます。<br /><br />対戦相手のマッチングが素晴らしく、対戦開始を選ぶと、５秒以内くらいに対戦相手がアサインされます。相手の強さも「人間/コンピュータ」「自分より強い/普通/弱い」と設定で選べるため、初心者にも優しいと思います。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">対局は1日3局まで無料。</span><span style="font:12px HiraKakuProN-W3; ">30日400円で指し放題です。私は健康のために1日3局に留めているため、無料の範囲で楽しませて頂いております。<br /><br />(参考グラフィック) 指してていきなり「カニガコーイ！」とか言われると、吹いてしまう。<br /></span><img class="imageStyle" alt="Pasted Graphic 6" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-6.jpg" width="275" height="393" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><h2><a href="https://itunes.apple.com/jp/app/i-jiang-qisaron-full-version/id331687507" target="self">i将棋サロン</a></h2><img class="imageStyle" alt="Pasted Graphic 3" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-3-2.jpg" width="189" height="186" /><span style="font:12px HiraKakuProN-W3; "><br />こちらは、</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">500円で買い切り型の将棋対戦ソフト</span><span style="font:12px HiraKakuProN-W3; ">。 あまりユーザ数は多くないですが、数十秒で対戦相手がみつかって、対戦できます。また、相手とチャットができますので、十局に一局くらいは、感想戦みたいな感じでお話することもあります。私は将棋ウォーズの無料範囲で飽き足らない日に、こちらのソフトで対戦してます。50人に1人くらい、時々マナーの悪い人がいますが、そういう人に出会っても心を広く持ちましょう。ちなみに女性っぽいハンドルネームを用いると、対戦してくれる人が増える気がしますが、気のせいでしょう。<br /><br /></span><h1>【対コンピュータ戦など】</h1><span style="font:12px HiraKakuProN-W3; ">（使用頻度:週1くらい）<br /></span><h2><a href="https://itunes.apple.com/jp/app/shi-mu-jiang-qi/id301163765?mt=8" target="self">柿木将棋</a></h2><img class="imageStyle" alt="Pasted Graphic 4" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-4.jpg" width="197" height="188" /><span style="font:12px HiraKakuProN-W3; "><br />コンピュータ対戦が楽しめます。500円。コンピュータのレベルはレベル１から７まで選べた気がします。普通に７は強いです。オフラインの人対人にも使えます（オフライン対戦を目的とするなら、</span><span style="font:12px HiraKakuProN-W3; "><a href="https://itunes.apple.com/jp/app/jiang-qi-pan/id301306496" target="self">将棋盤</a></span><span style="font:12px HiraKakuProN-W3; ">でいいですが）。<br /><br /><br /></span><h2><a href="https://itunes.apple.com/jp/app/jie-jiang-qi/id398463868" target="self">詰将棋</a></h2><img class="imageStyle" alt="Pasted Graphic 5" src="https:/www.takuroyonezawa.info/blog/files/spasted-graphic-5.jpg" width="193" height="193" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">詰将棋の練習アプリです。400円。問題の質・量とも結構な量です。３手詰でも十分練習になります！<br /><br /><br />コンピュータ対戦のアプリや学習用のアプリは、他にも色々といいものが増えていってると思います。とりあえず以上が私のルーチンアプリというだけです。<br /><br /><br /></span><h2>【おまけ（英語の勉強＋将棋）】</h2><span style="font:12px HiraKakuProN-W3; "><br />英語の勉強をしながら将棋が学べる、Hideuchiさんの将棋ビデオチャンネルです。<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.youtube.com/user/HIDETCHI" target="self">http://www.youtube.com/user/HIDETCHI</a></span><span style="font:12px HiraKakuProN-W3; "><br /><br />特におすすめなのは、</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.youtube.com/view_play_list?annotation_id=annotation_785175&feature=iv&p=B3D925021814AD0A&src_vid=WZugDQ0vfL8" target="self">Famous Shogi Games</a></span><span style="font:12px HiraKakuProN-W3; ">シリーズ。プロの有名な対戦（例えば伝説の</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.youtube.com/watch?v=s5JF89Ayzyg&list=SPB3D925021814AD0A&index=5" target="self">羽生の5二銀</a></span><span style="font:12px HiraKakuProN-W3; ">など）をわかりやすく解説してくれてます。わかりやすい英語なので、ちゃんと理解できます。定石を学ぶにはShogi Openings、など色々とコンテンツが充実しています。<br />このビデオのおかげで、外国人と話すとき、なぜか将棋の説明だけはスラスラとできます。（することほとんどないけど。。）<br /><br />参考：5二銀<br /></span><code><iframe width="420" height="315" src="//www.youtube.com/embed/bNTOt9HBjOQ" frameborder="0" allowfullscreen></iframe></code>]]></content:encoded></item><item><title>Collection View&#x306e;&#x4f7f;&#x3044;&#x65b9;&#xff08;iOS/XCode/Storyboard/UICollectionView&#xff09;</title><dc:subject>Note</dc:subject><dc:date>2013-08-28T07:36:36+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/82d0e4da1259d447d88c4041be09e6ca-13.html#unique-entry-id-13</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/82d0e4da1259d447d88c4041be09e6ca-13.html#unique-entry-id-13</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">iOS6から追加されたUICollectionViewの使い方、UICollectionViewCell カスタムセルの作り方のメモ。基本的には</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ht.sfc.keio.ac.jp/~takuro/blog/files/b10be8fa20b3a55e8b762ec832d33063-5.html" target="self" rel="external">UITableViewと同じ感じ</a></span><span style="font:12px HiraKakuProN-W3; ">でつくれます。<br />(1) プロジェクト新規作成して、UIViewController上にCollection Viewを置きます。<br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv0.jpg" width="582" height="242" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />後のために、Collection Viewのバックグラウンドをここでは白にしておきます。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 7" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv7.jpg" width="370" height="73" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />(2) 左のCollection ViewからCollection View Cell を選ぶと、その部分が青で四角く表示されるので、その四角を大きくしたり、適当にラベルとか貼り付けます。<br /></span><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv1.jpg" width="402" height="200" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />(3) 別のカスタムセルを追加してみます。つまり、２つの異なるセルを選べるようにしてみます。右のコンポーネントからCollection View Cellをドラッグして追加。その上に、(2)同様に色々はりつけていきます。<br /></span><img class="imageStyle" alt="Pasted Graphic 2" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv2.jpg" width="413" height="230" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />(4) (2) と (3) で作ったセルに、Identifierを設定します。例えば(2)のセルにはcell1, (3)のセルにはcell2 など。<br /></span><img class="imageStyle" alt="Pasted Graphic 3" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv3.jpg" width="387" height="129" /><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">セルの中の各要素に後でアクセスするために、各ViewにTagを設定します。下図ではUIImageに2のTagを設定してます。<b>Tagの番号は1からつけてください。</b>なお、異なるセル内にある部品だったら、Tag番号はかぶっていてもいいです。<br />このあたりは、UICollectionViewCellのサブクラスをつくってその中で参照をもたせてやって、プログラムからアクセスするみたいなやり方でもいいです。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 6" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv6.jpg" width="371" height="115" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />(5) Collection Viewをソースコードに紐付け。Collection ViewでCtrl押しながらうにょ〜と.hに登録<br /></span><img class="imageStyle" alt="Pasted Graphic 5" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv5.jpg" width="482" height="139" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />(6) 後はコードを書くだけ。<br />[ViewController.h]<br /></span><span style="font:11px Menlo-Regular; color:#643820;"><pre><br />#import </span><span style="font:11px Menlo-Regular; color:#C41A16;"><UIKit/UIKit.h></span><span style="font:11px Menlo-Regular; color:#643820;"><br /></span><span style="font:11px Menlo-Regular; "><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@interface</span><span style="font:11px Menlo-Regular; "> ViewController : </span><span style="font:11px Menlo-Regular; color:#5C2699;">UIViewController</span><span style="font:11px Menlo-Regular; "> <</span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionViewDataSource</span><span style="font:11px Menlo-Regular; ">, </span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionViewDelegate</span><span style="font:11px Menlo-Regular; ">><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@property</span><span style="font:11px Menlo-Regular; "> (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">weak</span><span style="font:11px Menlo-Regular; ">, </span><span style="font:11px Menlo-Regular; color:#AA0D91;">nonatomic</span><span style="font:11px Menlo-Regular; ">) </span><span style="font:11px Menlo-Regular; color:#AA0D91;">IBOutlet</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionView</span><span style="font:11px Menlo-Regular; "> *myCollectionView;<br /><br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@end</span><span style="font:11px Menlo-Regular; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><hr><br /><br />[ViewController.m]<br /><pre><br /></span><span style="font:11px Menlo-Regular; color:#643820;">#import </span><span style="font:11px Menlo-Regular; color:#C41A16;">"ViewController.h"</span><span style="font:11px Menlo-Regular; color:#643820;"><br /></span><span style="font:11px Menlo-Regular; "><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@interface</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#3F6E74;">ViewController</span><span style="font:11px Menlo-Regular; "> ()<br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@end</span><span style="font:11px Menlo-Regular; "><br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@implementation</span><span style="font:11px Menlo-Regular; "> ViewController<br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@synthesize</span><span style="font:11px Menlo-Regular; "> myCollectionView;<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)viewDidLoad<br />{<br />    [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">super</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewDidLoad</span><span style="font:11px Menlo-Regular; ">];<br />	</span><span style="font:11px Menlo-Regular; color:#007400;">// Do any additional setup after loading the view, typically from a nib.</span><span style="font:11px Menlo-Regular; "><br /><br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myCollectionView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">setDataSource</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; ">];<br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myCollectionView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">setDelegate</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; ">];<br />}<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)didReceiveMemoryWarning<br />{<br />    [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">super</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">didReceiveMemoryWarning</span><span style="font:11px Menlo-Regular; ">];<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">// Dispose of any resources that can be recreated.</span><span style="font:11px Menlo-Regular; "><br />}<br /><br /></span><span style="font:11px Menlo-Regular; color:#643820;">#pragma mark -collection view delegate<br /></span><span style="font:11px Menlo-Regular; "><br />- (</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSInteger</span><span style="font:11px Menlo-Regular; ">)numberOfSectionsInCollectionView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionView</span><span style="font:11px Menlo-Regular; "> *)collectionView<br />{<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">とりあえずセクションは</span><span style="font:11px Menlo-Regular; color:#007400;">2</span><span style="font:11px HiraKakuProN-W3; color:#007400;">つ</span><span style="font:11px Menlo-Regular; "><br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#1C00CF;">2</span><span style="font:11px Menlo-Regular; ">;<br />}<br /><br />-(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSInteger</span><span style="font:11px Menlo-Regular; ">)collectionView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionView</span><span style="font:11px Menlo-Regular; "> *)collectionView numberOfItemsInSection:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSInteger</span><span style="font:11px Menlo-Regular; ">)section{<br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; ">(section==</span><span style="font:11px Menlo-Regular; color:#1C00CF;">0</span><span style="font:11px Menlo-Regular; ">){</span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">セクション</span><span style="font:11px Menlo-Regular; color:#007400;">0</span><span style="font:11px HiraKakuProN-W3; color:#007400;">には５個</span><span style="font:11px Menlo-Regular; "><br />        </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#1C00CF;">5</span><span style="font:11px Menlo-Regular; ">;<br />    }</span><span style="font:11px Menlo-Regular; color:#AA0D91;">else</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; ">(section==</span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">){ </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">セクション</span><span style="font:11px Menlo-Regular; color:#007400;">1</span><span style="font:11px HiraKakuProN-W3; color:#007400;">には</span><span style="font:11px Menlo-Regular; color:#007400;">7</span><span style="font:11px HiraKakuProN-W3; color:#007400;">個</span><span style="font:11px Menlo-Regular; "><br />        </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#1C00CF;">7</span><span style="font:11px Menlo-Regular; ">;<br />    }</span><span style="font:11px Menlo-Regular; color:#AA0D91;">else</span><span style="font:11px Menlo-Regular; ">{<br />        </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#1C00CF;">0</span><span style="font:11px Menlo-Regular; ">;<br />    }<br />}<br /><br /><br /></span><span style="font:11px Menlo-Regular; color:#007400;">//Method to create cell at index path</span><span style="font:11px Menlo-Regular; "><br />-(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionViewCell</span><span style="font:11px Menlo-Regular; "> *)collectionView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionView</span><span style="font:11px Menlo-Regular; "> *)collectionView cellForItemAtIndexPath:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSIndexPath</span><span style="font:11px Menlo-Regular; "> *)indexPath{<br />    <br />    </span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionViewCell</span><span style="font:11px Menlo-Regular; "> *cell;<br />    <br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; ">(indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">section</span><span style="font:11px Menlo-Regular; ">==</span><span style="font:11px Menlo-Regular; color:#1C00CF;">0</span><span style="font:11px Menlo-Regular; ">){</span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">セクション</span><span style="font:11px Menlo-Regular; color:#007400;">0</span><span style="font:11px HiraKakuProN-W3; color:#007400;">のセル</span><span style="font:11px Menlo-Regular; "><br /><br />        cell = [collectionView </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">dequeueReusableCellWithReuseIdentifier</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"cell1"</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">forIndexPath</span><span style="font:11px Menlo-Regular; ">:indexPath];<br />        cell.</span><span style="font:11px Menlo-Regular; color:#5C2699;">backgroundColor</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#5C2699;">UIColor</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">greenColor</span><span style="font:11px Menlo-Regular; ">];<br />        <br />        </span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; "> *label = (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; "> *)[cell </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewWithTag</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">];<br />        label.</span><span style="font:11px Menlo-Regular; color:#5C2699;">text</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSString</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">stringWithFormat</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"</span><span style="font:11px HiraKakuProN-W3; color:#C41A16;">ラベル</span><span style="font:11px Menlo-Regular; color:#C41A16;">%d-%d"</span><span style="font:11px Menlo-Regular; ">,indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">section</span><span style="font:11px Menlo-Regular; ">,indexPath.row];<br />        <br />        </span><span style="font:11px Menlo-Regular; color:#5C2699;">UIImageView</span><span style="font:11px Menlo-Regular; "> *image = (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UIImageView</span><span style="font:11px Menlo-Regular; "> *)[cell </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewWithTag</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#1C00CF;">2</span><span style="font:11px Menlo-Regular; ">];<br />        image.</span><span style="font:11px Menlo-Regular; color:#5C2699;">backgroundColor</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#5C2699;">UIColor</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">redColor</span><span style="font:11px Menlo-Regular; ">];<br />        <br />    }</span><span style="font:11px Menlo-Regular; color:#AA0D91;">else</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; ">(indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">section</span><span style="font:11px Menlo-Regular; ">==</span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">){</span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">セクション</span><span style="font:11px Menlo-Regular; color:#007400;">1</span><span style="font:11px HiraKakuProN-W3; color:#007400;">のセル</span><span style="font:11px Menlo-Regular; "><br />        cell = [collectionView </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">dequeueReusableCellWithReuseIdentifier</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"cell2"</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">forIndexPath</span><span style="font:11px Menlo-Regular; ">:indexPath];<br />        cell.</span><span style="font:11px Menlo-Regular; color:#5C2699;">backgroundColor</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#5C2699;">UIColor</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">yellowColor</span><span style="font:11px Menlo-Regular; ">];<br />        <br />        </span><span style="font:11px Menlo-Regular; color:#5C2699;">UIButton</span><span style="font:11px Menlo-Regular; "> *button = (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UIButton</span><span style="font:11px Menlo-Regular; "> *)[cell </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewWithTag</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">];<br />        button.</span><span style="font:11px Menlo-Regular; color:#5C2699;">titleLabel</span><span style="font:11px Menlo-Regular; ">.</span><span style="font:11px Menlo-Regular; color:#5C2699;">text</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSString</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">stringWithFormat</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"%d-%d"</span><span style="font:11px Menlo-Regular; ">,indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">section</span><span style="font:11px Menlo-Regular; ">,indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">row</span><span style="font:11px Menlo-Regular; ">];<br />        <br />        </span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; "> *label = (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; "> *)[cell </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewWithTag</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#1C00CF;">2</span><span style="font:11px Menlo-Regular; ">];<br />        label.</span><span style="font:11px Menlo-Regular; color:#5C2699;">text</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSString</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">stringWithFormat</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"</span><span style="font:11px HiraKakuProN-W3; color:#C41A16;">ラベル</span><span style="font:11px Menlo-Regular; color:#C41A16;">%d-%d"</span><span style="font:11px Menlo-Regular; ">,indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">section</span><span style="font:11px Menlo-Regular; ">,indexPath.row];<br />    }<br />    <br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> cell;<br />}<br /><br /><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)collectionView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UICollectionView</span><span style="font:11px Menlo-Regular; "> *)collectionView didSelectItemAtIndexPath:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSIndexPath</span><span style="font:11px Menlo-Regular; "> *)indexPath<br />{<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">クリックされたらよばれる</span><span style="font:11px Menlo-Regular; "><br />    </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">NSLog</span><span style="font:11px Menlo-Regular; ">(</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"Clicked %d-%d"</span><span style="font:11px Menlo-Regular; ">,indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">section</span><span style="font:11px Menlo-Regular; ">,indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">row</span><span style="font:11px Menlo-Regular; ">);<br />}<br /><br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@end</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><hr><br /><br />こんな感じ。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 9" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv9.jpg" width="258" height="502" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />セルをクリックすると、ログが出ます。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 8" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-cv8.jpg" width="655" height="147" />]]></content:encoded></item><item><title>&#x96fb;&#x738b;&#x6226;&#x30bf;&#x30c3;&#x30b0;&#x30de;&#x30c3;&#x30c1;&#x30fb;&#x4eba;&#x3068;&#x30b3;&#x30f3;&#x30d4;&#x30e5;&#x30fc;&#x30bf;&#x306e;&#x5171;&#x540c;&#x5275;&#x9020;&#x4f5c;&#x696d;&#x306b;&#x6c42;&#x3081;&#x3089;&#x308c;&#x308b;&#x3082;&#x306e;&#x3068;&#x306f;</title><dc:subject>Note</dc:subject><dc:date>2013-08-23T07:16:37+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/4669b9734f379fe5d1d8c40cd7665ee5-12.html#unique-entry-id-12</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/4669b9734f379fe5d1d8c40cd7665ee5-12.html#unique-entry-id-12</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">電王戦2.1 タッグマッチが発表されました。8/31に１日をかけて、プロ棋士５名がそれぞれ第２回電王戦で戦ったコンピュータ将棋ソフトとタッグを組み、トーナメントを戦います。<br /><br />サイト：</span><span style="font:12px HiraKakuProN-W3; "><a href="http://ex.nicovideo.jp/denou/tag/" target="self">電王戦タッグマッチ</a></span><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-dennousen.jpg" width="576" height="204" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />とっても楽しみです。以下、当たり前のことですが、感じたことを言語化します。<br /><br />（１）人（感覚）とコンピュータ（計算）がお互いの長所を高め合って、人の能力を押し上げるか？<br />それとも、<br />（２）人の思考を邪魔してしまい（邪念や迷いを生ませてしまい）、プロ棋士の普段の力より下げてしまうか？<br />など、興味深い結果がみられそうです。<br />トーナメントが終わった後の、各棋士の感想が気になります。<br /><br />なお、チェスや囲碁では、コンピュータを使って戦った場合、人の能力はあがった結果がでているそうです。（参考文献どこかな）<br />将棋の場合、将棋倶楽部24ではレートが200くらいあがる、というコメントもありました。<br />（</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.nicovideo.jp/watch/1377050061" target="self">電王戦タッグマッチPV</a></span><span style="font:12px HiraKakuProN-W3; ">より）<br /><br /><h1>人間とコンピュータの協調形態のレベル</h1><br /><br />オートメーションのレベル、手動（人間）と自動（コンピュータ）の協調形態のレベルに関しては、Sheridan & Verplanck（1978）<br /></span><span style="font:15px Times-Roman; ">Raja Parasuraman</span><span style="font:12px HiraKakuProN-W3; ">ら（2000）による10段階のレベルおよびそれを拡張したモデルの概念等で、議論されています。<br /><br /></span><img class="imageStyle" alt="page2image30160" src="https:/www.takuroyonezawa.info/blog/files/page2image30160.png" width="508" height="265" /><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; "><font size=&ldquo;1&rdquo;><br /></span><span style="font:13px Times, Georgia, Courier, serif; color:#000000;">Sheridan, T.B., & Verplank, W. (1978). </span><span style="font:13px Times-Roman; color:#000000;">Human and Computer Control of Undersea Teleoperators</span><span style="font:13px Times, Georgia, Courier, serif; color:#000000;">. Cambridge, MA: Man-Machine Systems Laboratory, Department of Mechanical Engineering, MIT. </span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">R.Parasuraman, T.B.Sheridan, and C.D.Wickens. &ldquo;A model for types and levels of human interaction with automation.&rdquo;, IEEE Transactions on Systems Man and Cybernetics Part A Systems and Humans, 30(3):286&ndash;297, 2000.</font><br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px Times-Roman; "><br /></span><span style="font:12px HiraKakuProN-W3; ">反対にして日本語化してみると、<br /></span><span style="font:12px Times-Roman; "><br /></span><span style="font:12px HiraKakuProN-W3; ">1: コンピュータは何も支援しない。人間が全部判断して実行する。<br />2: コンピュータは自らが判断した全ての選択肢を人に与える、<br />3:  その選択肢を狭めて、いくつか人に与える<br />4: 一つの代替案を示す<br />5: 人が許可すれば、それを実行する<br />6: 実行する前に、人にそれを禁止する許可を与える<br />7: 自動的に実行するが、その後それを人間に伝える<br />8: もし人に聞かれたら、答える<br />9: もし人に聞かれて、コンピュータが答えようと決めたら答える<br />10: 全部コンピュータが自動で行う。人を無視する。<br /><br />みたいな感じでしょうか。電王戦やコンピュータ将棋選手権で戦う将棋ソフトは、将棋ソフト自体が戦うので、レベル７〜ですね。<br />今回は、あくまで棋士はコンピュータを参考情報として使う、ということで、レベル2もしくはレベル3の協調形態が想定されます。<br /><br /><h1>協調形態レベル7〜の将棋ソフトの強さと、レベル2 or レベル3における強さの指標の違い</h1><br />今回の電王戦タッグマッチでは、協調形態レベル2 or 3 でコンピュータが使われることとなります。<br />最終の判断基準は、人間。<br />ということは、電王戦タッグマッチで求められる将棋ソフトとは、<b>「純粋な将棋能力」＋「選択肢の意味・意図を人間に理解させる能力」</b>が重要だと考えられます。<br />プロ棋士が将棋を指す時は、大局観、を重視している場合が多いと聞きます。<br /><br /><hr><i>大局観：囲碁や将棋、チェスなどに置いて、部分的なせめぎ合いにとらわれずに、全体の形の良し悪しを見極め、自分が今どの程度有利不利にあるのか、堅く安全策をとるか、勝負に出るかなどの判断を行う能力のこと。<br />大局観に優れると、駒がぶつかっていない場所から意表を突く攻めを行うなど、長期的かつ全体的な視野のもと手を進めることが可能となる。反対に大局観が備わっていなければ、盤上の一部での駒のぶつかり合いや、短期的な駒の損得しか考えられなくなる。多分に直感的なもので、コンピュータでは再現が難しいとされる。（</span><span style="font:12px HiraKakuProN-W3; "><a href="http://ja.wikipedia.org/wiki/大局観" target="self">Wikipedia</a></span><span style="font:12px HiraKakuProN-W3; ">）</i><br /><hr><br /><br />人間は「線」で局面をとらえ、指してを決定する場合が多い。一方、コンピュータはその局面局面を点として捉え、判断をする場合が多い（はず？）。<br /><br />あくまで人間が指し手を最終的に決定するのであれば、コンピュータ将棋ソフトは指し手の候補を示すだけでなく、その指し手の意味・意図を棋士に伝達し、理解してもらう必要があります。<br />単に「この手がいいと思うよ」だけじゃなくて、「なぜその手がいいのか」を棋士にわかりやすく理解してもらえないと、その手は採用されない、または採用されるまでにプロ棋士の思考を要するため時間がかかる恐れがあります。<br />終盤の詰み筋であれば、コンピュータの指し手は無条件に採用できますが、中盤の大局観が重要とされる場面では、プロ棋士はコンピュータの指し手の意図を理解するフェーズが必要となるでしょう。<br />よって、協調形態レベル２・３に求められるコンピュータの能力とは、「純粋な将棋能力」＋「選択肢の意味・意図を人間に理解させる能力」だと推測されます。<br />すなわち、コンピュータ将棋選手権で強いコンピュータが、そのまま今回の電王戦タッグマッチで強いコンピュータとなるとは限らないと思います。<br />そして、人間に理解させる能力は、「純粋な将棋能力」＝計算能力 とは別次元の能力です。<br />少し異なりますが、説得型コンピューティング（Persuasive Computing）という分野もあるようです。そこでは、人間の心理を理解することや、わかりやすいユーザインタフェースなど、別の技術が求められるのだと思います。<br /><br />阿部光瑠四段は、「全部コンピュータに任せてもいいかもしれない」とおっしゃってました。もしかすると、そうしたほうがいい結果が出る場合もあるかもしれません。<br />選択肢を提示されると、迷います。迷いは正常な思考能力を狂わせ焦りにつながり、結果として悪手につながるかもしれません。<br /><br />一方で、プロ棋士は異次元の能力をもってるので、単純に手を提示されただけで、瞬時にその意図や流れを把握できるのかもしれません。<br /><br />コンピュータと人間、コンピュータとプロ棋士と協調するためにはどういう技術・課題を克服する必要があるのか？<br />そもそも、プロ棋士にはそんなもの必要ないのか？<br />それを発見するという意味でも、今回の電王戦タッグマッチは要注目じゃないでしょうかっ<br /><br />以上、ふと思ったことのメモでした。</span>]]></content:encoded></item><item><title>Processing&#x30a2;&#x30d7;&#x30ec;&#x30c3;&#x30c8;&#xff08;PApplet&#xff09;&#x3092;Java&#x30d7;&#x30ed;&#x30b0;&#x30e9;&#x30e0;&#x304b;&#x3089;&#x8d77;&#x52d5;</title><dc:subject>Note</dc:subject><dc:date>2013-07-16T17:26:33+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/85751be3189874635754683a116f802e-11.html#unique-entry-id-11</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/85751be3189874635754683a116f802e-11.html#unique-entry-id-11</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">ProcessingのPAppletプログラムをJavaプログラムから起動する場合のメモ。<br />例えば、TestPAppletというプログラムをJavaで書いたとして（</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ht.sfc.keio.ac.jp/~takuro/blog/files/b4fe5f2bebfb88a7990439dcb6910b63-9.html" target="self" rel="external">参考</a></span><span style="font:12px HiraKakuProN-W3; ">）、<br />これを別のプログラムから起動する場合、<br /><br /><pre><br /></span><span style="font:11px Monaco; ">		TestApplet testPApplet = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; "><u>TestPApplet</u></span><span style="font:11px Monaco; ">();<br />		testPApplet.init();</span><span style="font:12px HiraKakuProN-W3; "><br /></pre><br /><br />つまり、init()で初期化できる。<br />JFrameに貼ればおしまい。<br /><br /><pre><br /></span><span style="font:11px Monaco; ">		JFrame frame = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> JFrame(</span><span style="font:11px Monaco; color:#2A00FF;">&ldquo;Test"</span><span style="font:11px Monaco; ">);		<br />		frame.setSize(640,480); //</span><span style="font:11px HiraKakuProN-W3; ">サイズは適当。上で作ったインスタンスからゲットするのもいいと思います。</span><span style="font:11px Monaco; "><br />		frame.add(</span><span style="font:11px Monaco; color:#0000C0;">testPApplet</span><span style="font:11px Monaco; ">);<br />		frame.setVisible(</span><span style="font:11px Monaco; color:#7F0055;">true</span><span style="font:11px Monaco; ">);</span><span style="font:12px HiraKakuProN-W3; "><br /></pre><br /><br /></span>]]></content:encoded></item><item><title>Java&#x3067;OpenCV&#x3067;Web&#x30ab;&#x30e1;&#x30e9;&#x306e;&#x30ad;&#x30e3;&#x30d7;&#x30c1;&#x30e3;(Mac)</title><dc:subject>Note</dc:subject><dc:date>2013-07-13T15:32:17+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/2acd4a51f9e2b63d4f9ab4aa3f1ce785-10.html#unique-entry-id-10</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/2acd4a51f9e2b63d4f9ab4aa3f1ce785-10.html#unique-entry-id-10</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">JavaでOpenCVでWebカメラキャプチャのコードです。<br />ほぼここの</span><span style="font:12px HiraKakuProN-W3; "><a href="http://cell0907.blogspot.jp/2013/06/creating-windows-and-capturing-webcam.html" target="self">記事</a></span><span style="font:12px HiraKakuProN-W3; ">通りだけど、そのままだとMacでは動かなかったため（カメラ起動までが遅いので、カメラなしと怒られて終了します）、改造しました。<br />後は、元々のカメラサイズだと重くてリアルタイムにキャプチャできなかったから、MatをBufferedImageに変換するのを軽くするために、Matのサイズを小さくしてから処理してます。<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://cell0907.blogspot.jp/2013/06/creating-windows-and-capturing-webcam.html" target="self">http://cell0907.blogspot.jp/2013/06/creating-windows-and-capturing-webcam.html</a></span><span style="font:12px HiraKakuProN-W3; "><br />Thank you for sample code !<br /></span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; ">VideoCapture capture =</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> VideoCapture(0);</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; ">の引数を変えてやると、複数台カメラつないだ場合も、別のカメラでキャプチャできます。<br /><br />同時に複数カメラからもキャプチャできます。<br /></span><span style="font:11px Monaco; ">VideoCapture capture1 =</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> VideoCapture(0);<br />VideoCapture capture2 =</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> VideoCapture(1);</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />引数の数字がどのWEBカメラに割り当てられるかは、WEBカメラをつないだ順番によります。<br />ココらへんはまだ微妙。gstreamerを使う場合は、カメラ名に加え、キャプチャサイズやfpsも指定して接続できるんだけど、<br />OpenCVが使ってるカメラキャプチャにはそういう方法があるのでしょうか。<br /><br /><br /></span><span style="font:11px Monaco; color:#3F7F5F;"><pre></span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> java.awt.*;  <br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> java.awt.image.BufferedImage;  <br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> javax.swing.*;  <br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> org.opencv.core.Core;<br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> org.opencv.core.Mat;  <br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> org.opencv.core.Size;<br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> org.opencv.highgui.VideoCapture;  <br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> org.opencv.imgproc.Imgproc;<br /><br /></span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">class</span><span style="font:11px Monaco; "> Panel </span><span style="font:11px Monaco; color:#7F0055;">extends</span><span style="font:11px Monaco; "> JPanel{  <br />	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">final</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">long</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#0000C0;">serialVersionUID</span><span style="font:11px Monaco; "> = 1L;  <br />	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> BufferedImage </span><span style="font:11px Monaco; color:#0000C0;">image</span><span style="font:11px Monaco; ">;  <br />	</span><span style="font:11px Monaco; color:#3F7F5F;">// Create a constructor method  </span><span style="font:11px Monaco; "><br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> Panel(){  <br />		</span><span style="font:11px Monaco; color:#7F0055;">super</span><span style="font:11px Monaco; ">();  <br />	}  <br />	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> BufferedImage getimage(){  <br />		</span><span style="font:11px Monaco; color:#7F0055;">return</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#0000C0;">image</span><span style="font:11px Monaco; ">;  <br />	}  <br />	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> setimage(BufferedImage newimage){  <br />		</span><span style="font:11px Monaco; color:#0000C0;">image</span><span style="font:11px Monaco; ">=newimage;  <br />		</span><span style="font:11px Monaco; color:#7F0055;">return</span><span style="font:11px Monaco; ">;  <br />	}  <br />	</span><span style="font:11px Monaco; color:#3F5FBF;">/**  </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">	 * Converts/writes a Mat into a BufferedImage.  </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">	 *  </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">	 * </span><span style="font:11px Monaco; color:#7F9FBF;">@param</span><span style="font:11px Monaco; color:#3F5FBF;"> matrix Mat of type CV_8UC3 or CV_8UC1  </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">	 * </span><span style="font:11px Monaco; color:#7F9FBF;">@return</span><span style="font:11px Monaco; color:#3F5FBF;"> BufferedImage of type TYPE_3BYTE_BGR or TYPE_BYTE_GRAY  </span><span style="font:11px Monaco; "><br /></span><span style="font:11px Monaco; color:#3F5FBF;">	 */</span><span style="font:11px Monaco; ">  <br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> BufferedImage matToBufferedImage(Mat matrix) {  <br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> cols = matrix.cols();  <br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> rows = matrix.rows();  <br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> elemSize = (</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; ">)matrix.elemSize();  <br />		</span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">[] data = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">[cols * rows * elemSize];  <br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> type;  <br />		matrix.get(0, 0, data);  <br />		</span><span style="font:11px Monaco; color:#7F0055;">switch</span><span style="font:11px Monaco; "> (matrix.channels()) {  <br />		</span><span style="font:11px Monaco; color:#7F0055;">case</span><span style="font:11px Monaco; "> 1:  <br />			type = BufferedImage.</span><span style="font:11px Monaco; color:#0000C0;">TYPE_BYTE_GRAY</span><span style="font:11px Monaco; ">;  <br />			</span><span style="font:11px Monaco; color:#7F0055;">break</span><span style="font:11px Monaco; ">;  <br />		</span><span style="font:11px Monaco; color:#7F0055;">case</span><span style="font:11px Monaco; "> 3:  <br />			type = BufferedImage.</span><span style="font:11px Monaco; color:#0000C0;">TYPE_3BYTE_BGR</span><span style="font:11px Monaco; ">;  <br />			</span><span style="font:11px Monaco; color:#3F7F5F;">// </span><span style="font:11px Monaco; color:#3F7F5F;"><u>bgr</u></span><span style="font:11px Monaco; color:#3F7F5F;"> to </span><span style="font:11px Monaco; color:#3F7F5F;"><u>rgb</u></span><span style="font:11px Monaco; color:#3F7F5F;">  </span><span style="font:11px Monaco; "><br />			</span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; "> b;  <br />			</span><span style="font:11px Monaco; color:#7F0055;">for</span><span style="font:11px Monaco; ">(</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> i=0; i<data.</span><span style="font:11px Monaco; color:#0000C0;">length</span><span style="font:11px Monaco; ">; i=i+3) {  <br />				b = data[i];  <br />				data[i] = data[i+2];  <br />				data[i+2] = b;  <br />			}  <br />			</span><span style="font:11px Monaco; color:#7F0055;">break</span><span style="font:11px Monaco; ">;  <br />		</span><span style="font:11px Monaco; color:#7F0055;">default</span><span style="font:11px Monaco; ">:  <br />			</span><span style="font:11px Monaco; color:#7F0055;">return</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">;  <br />		}  <br />		BufferedImage image2 = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> BufferedImage(cols, rows, type);  <br />		image2.getRaster().setDataElements(0, 0, cols, rows, data);  <br />		</span><span style="font:11px Monaco; color:#7F0055;">return</span><span style="font:11px Monaco; "> image2;  <br />	}  <br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> paintComponent(Graphics g){  <br />		BufferedImage temp=getimage();<br />		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; ">(temp!=</span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">){<br />			g.drawImage(temp,10,10,temp.getWidth(),temp.getHeight(), </span><span style="font:11px Monaco; color:#7F0055;">this</span><span style="font:11px Monaco; ">);  <br />		}<br />	} <br />	<br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">static</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> main(String arg[]){  <br />		</span><span style="font:11px Monaco; color:#3F7F5F;">// Load the native library.  </span><span style="font:11px Monaco; "><br />		System.loadLibrary(Core.</span><span style="font:11px Monaco; color:#0000C0;">NATIVE_LIBRARY_NAME</span><span style="font:11px Monaco; ">);<br />		JFrame frame = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> JFrame(</span><span style="font:11px Monaco; color:#2A00FF;">"BasicPanel"</span><span style="font:11px Monaco; ">);  <br />		frame.setDefaultCloseOperation(JFrame.</span><span style="font:11px Monaco; color:#0000C0;">EXIT_ON_CLOSE</span><span style="font:11px Monaco; ">);  <br />		frame.setSize(400,400);  <br />		Panel panel = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Panel();  <br />		frame.setContentPane(panel);       <br />		frame.setVisible(</span><span style="font:11px Monaco; color:#7F0055;">true</span><span style="font:11px Monaco; ">);       <br />		Mat webcam_image=</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Mat();  <br />		BufferedImage temp;  <br />		VideoCapture capture =</span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> VideoCapture(0);  <br /><br />		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; ">( capture.isOpened())  <br />		{  <br />			</span><span style="font:11px Monaco; color:#7F0055;">while</span><span style="font:11px Monaco; ">( </span><span style="font:11px Monaco; color:#7F0055;">true</span><span style="font:11px Monaco; "> )  <br />			{  <br /><br />				capture.read(webcam_image);  <br />				</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; ">( !webcam_image.empty() )  <br />				{  <br />					Imgproc.resize(webcam_image, webcam_image, </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Size(webcam_image.size().</span><span style="font:11px Monaco; color:#0000C0;">width</span><span style="font:11px Monaco; ">*0.3,webcam_image.size().</span><span style="font:11px Monaco; color:#0000C0;">height</span><span style="font:11px Monaco; ">*0.3));<br />					frame.setSize(webcam_image.width()+40,webcam_image.height()+60);  <br />					temp=matToBufferedImage(webcam_image);  <br />					panel.setimage(temp);  <br />					panel.repaint();  <br />				}  <br />				</span><span style="font:11px Monaco; color:#7F0055;">else</span><span style="font:11px Monaco; ">  <br />				{  <br />					System.</span><span style="font:11px Monaco; color:#0000C0;">out</span><span style="font:11px Monaco; ">.println(</span><span style="font:11px Monaco; color:#2A00FF;">" --(!) No captured frame -- "</span><span style="font:11px Monaco; ">);  <br />				}  <br />			}  <br />		}  <br />		</span><span style="font:11px Monaco; color:#7F0055;">return</span><span style="font:11px Monaco; ">;  <br />	}  <br />}  <br /></pre></span><span style="font:12px HiraKakuProN-W3; "><br /><br /><br /><br /><br /><br /></span>]]></content:encoded></item><item><title>Eclipse&#x3067;Processing&#x3092;&#x6a2a;&#x7740;&#x306b;&#x4f7f;&#x3046;&#x8a2d;&#x5b9a;&#xff08;Mac&#xff09;</title><dc:subject>Note</dc:subject><dc:date>2013-07-09T08:48:41+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/b4fe5f2bebfb88a7990439dcb6910b63-9.html#unique-entry-id-9</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/b4fe5f2bebfb88a7990439dcb6910b63-9.html#unique-entry-id-9</guid><content:encoded><![CDATA[Eclipse<span style="font:12px HiraKakuProN-W3; ">を使って、</span>Processing<span style="font:12px HiraKakuProN-W3; ">をコーディングしたい。</span><br /><span style="font:12px HiraKakuProN-W3; ">むしろ、</span>Java<span style="font:12px HiraKakuProN-W3; ">プログラムの1要素としてProcessingを利用したい場合があります。Javaの無限のライブラリも使えますので。<br />例えば、Processingでwebカメラの映像をキャプチャさせて、それをJavaでゴニョゴニョしたいとき。<br /><br />もちろん、ProcessingのライブラリをEclipseにインポートするのですが、<br />横着なやり方を紹介します。<br /><br /></span><h3>(1) Processing.app内のライブラリをどっかにごっそりコピー</h3><span style="font:12px HiraKakuProN-W3; "><pre>%cp -r /Applications/Processing.app/Contents  /Users/ユーザ名/Desktop/</pre><br />もしくは、Finderを使って、Processing.appの中身（パッケージの中身）をどっかにコピー<br /><br />例ではデスクトップにコピーしてますが、どこでもいいです。<br />なぜコピーするかというと、以下のeclipseの外部ライブラリ追加のところで直接Processing.app内のリソースへアクセスができなかったからです。<br />だから、横着にコピーしました。<br /><br /></span><h3>(2) Eclipseから新規プロジェクト作成し、メニューのProject -> Properties でProcessingライブラリへBuild Pathを設定。</h3><span style="font:12px HiraKakuProN-W3; ">Add External JARs（外部ライブラリの追加）から、さっきコピーした中身にあるProcessingのライブラリを追加。<br /><br />Processingの基本ライブラリは<br />コピーしたディレクトリの中の<br /><br /><pre>Contents/Resources/Java/core/library</pre><br /><br />内に、カメラから映像キャプチャなどのライブラリは、<br /><br /><pre>Contents/Resources/Java/modes/java/libraries/</pre><br /><br />以下、例えばvideo関係は<br /><br /><pre>Contents/Resources/Java/modes/java/libraries/video/library</pre><br /><br />内にあります。<br />こんな感じ。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/pro_settei.jpg" width="960" height="431" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><h3>(3) 後はコードを書くだけ。</h3><span style="font:12px HiraKakuProN-W3; ">例えば、ProcessingサンプルのWEBカメラから画像をキャプチャして表示するプログラムは、こんな感じです。<br /><br /><pre><br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> processing.video.*;<br /></span><span style="font:11px Monaco; color:#7F0055;">import</span><span style="font:11px Monaco; "> processing.core.*;<br /><br /></span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">class</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; "><u>VideoCapTest</u></span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">extends</span><span style="font:11px Monaco; "> PApplet{<br /><br />	Capture </span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; ">;<br /><br /><br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> setup() {<br />		size(640, 480, </span><span style="font:11px Monaco; color:#0000C0;">P2D</span><span style="font:11px Monaco; ">);<br /><br />		String[] cameras = Capture.list();<br /><br />		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; "> (cameras.</span><span style="font:11px Monaco; color:#0000C0;">length</span><span style="font:11px Monaco; "> == 0) {<br />			println(</span><span style="font:11px Monaco; color:#2A00FF;">"There are no cameras available for capture."</span><span style="font:11px Monaco; ">);<br />			exit();<br />		} </span><span style="font:11px Monaco; color:#7F0055;">else</span><span style="font:11px Monaco; "> {<br />			println(</span><span style="font:11px Monaco; color:#2A00FF;">"Available cameras:"</span><span style="font:11px Monaco; ">);<br />			</span><span style="font:11px Monaco; color:#7F0055;">for</span><span style="font:11px Monaco; "> (</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> i = 0; i < cameras.</span><span style="font:11px Monaco; color:#0000C0;">length</span><span style="font:11px Monaco; ">; i++) {<br />				println(cameras[i]);<br />			}<br /><br />			</span><span style="font:11px Monaco; color:#3F7F5F;">// The camera can be initialized directly using an element</span><span style="font:11px Monaco; "><br />			</span><span style="font:11px Monaco; color:#3F7F5F;">// from the array returned by list():</span><span style="font:11px Monaco; "><br />			</span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Capture(</span><span style="font:11px Monaco; color:#7F0055;">this</span><span style="font:11px Monaco; ">, cameras[0]);<br />			</span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; ">.start();     <br />		}      <br />	}<br /><br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> draw() {<br />		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; "> (</span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; ">.available() == </span><span style="font:11px Monaco; color:#7F0055;">true</span><span style="font:11px Monaco; ">) {<br />			</span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; ">.read();<br />		}<br />		image(</span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; ">, 0, 0);<br />		</span><span style="font:11px Monaco; color:#3F7F5F;">// The following does the same, and is faster when just drawing the image</span><span style="font:11px Monaco; "><br />		</span><span style="font:11px Monaco; color:#3F7F5F;">// without any additional resizing, transformations, or tint.</span><span style="font:11px Monaco; "><br />		</span><span style="font:11px Monaco; color:#3F7F5F;">//set(0, 0, </span><span style="font:11px Monaco; color:#3F7F5F;"><u>cam</u></span><span style="font:11px Monaco; color:#3F7F5F;">);</span><span style="font:11px Monaco; "><br />	}<br /><br /><br />}<br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">おまけ</span><span style="font:12px HiraKakuProN-W3; "><br />Processingからカメラでキャプチャした画像を、BufferedImageへ変換の例。<br /></span><span style="font:11px Monaco; "><br /><pre><br />BufferedImage buf = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> BufferedImage(320,240, 1);<br />buf.getGraphics().drawImage(</span><span style="font:11px Monaco; color:#0000C0;">cam</span><span style="font:11px Monaco; ">.getImage(),0,0,</span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">);</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><br /></span>]]></content:encoded></item><item><title>Java&#x3067;OpenCV&#x306e;&#x30a4;&#x30f3;&#x30b9;&#x30c8;&#x30fc;&#x30eb;&#x30fb;eclipse&#x306e;&#x8a2d;&#x5b9a;&#x306a;&#x3069;&#xff08;Mac OSX&#xff09;</title><dc:subject>Note</dc:subject><dc:date>2013-05-14T07:32:26+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/9a750dbb61e7e93522e7d214b285f25e-8.html#unique-entry-id-8</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/9a750dbb61e7e93522e7d214b285f25e-8.html#unique-entry-id-8</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">メモ。<br />基本的にOpenCVの </span><span style="font:12px HiraKakuProN-W3; "><a href="http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html" target="self">Introduction to Java Development</a></span><span style="font:12px HiraKakuProN-W3; "> の内容です。<br /><br /></span><h2>・ダウンロード</h2><span style="font:12px HiraKakuProN-W3; "><a href="http://sourceforge.net/projects/opencvlibrary/files/" target="self">Sourceforge</a></span><span style="font:12px HiraKakuProN-W3; ">から</span><span style="font:12px HiraKakuProN-W3; "><a href="http://sourceforge.net/projects/opencvlibrary/files/latest/download?source=files" target="self">ダウンロード</a></span><span style="font:12px HiraKakuProN-W3; ">できます。<br />もしくは、Gitコマンドでダウンロード。<br /></span><span style="font:13px Courier, mono; color:#262626;">%git clone git://github.com/Itseez/opencv.git<br />%cd opencv<br />%git checkout<br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><h2>・インストール</h2><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">[事前準備]<br /></span><span style="font:12px HiraKakuProN-W3; ">cmakeを入れましょう。僕は</span><span style="font:12px HiraKakuProN-W3; "><a href="http://mxcl.github.io/homebrew/" target="self">homebrew</a></span><span style="font:12px HiraKakuProN-W3; ">でいれました。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />Sourceforgeからダウンロードした場合、解凍してできたopencvディレクトリに移動。<br />ビルド用のディレクトリを作ります。<br /></span><span style="font:13px Courier, mono; color:#262626;">%mkdir build<br />%cd build<br /></span><span style="font:12px HiraKakuProN-W3; "><br />Sourceforgeからダウンロードした場合、解凍してできたopencvディレクトリに移動。<br />Makefileを作って、コンパイルする。<br /></span><span style="font:13px Courier, mono; color:#262626;">%cmake -DBUILD_SHARED_LIBS</span><span style="font:13px Courier, mono; color:#535353;">=</span><span style="font:13px Courier, mono; color:#262626;">OFF ..<br />%make -j8</span><span style="font:12px HiraKakuProN-W3; "><br /><br />これで、opencv/build以下にopencv一式がコンパイルされました。<br /><br /><br /></span><h2>・eclipseの設定</h2><span style="font:12px HiraKakuProN-W3; ">新しいプロジェクトを作成するとする（例に習って、HelloCVとする）。<br />これにbuild pathを通す。Librariesの設定から、Add Libraryを選択。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib.png" width="800" height="555" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">User Libraryを選択。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib2" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib2.png" width="525" height="335" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib3" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib3.png" width="525" height="335" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib4" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib4.png" width="660" height="489" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W3; ">下の名前はopencv-2.4.4だけど、バージョン違ってたらそれに合わせましょう。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib5" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib5.png" width="294" height="209" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W3; ">次に、JNIライブラリの設定。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib6" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib6.png" width="660" height="489" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W3; ">Jarファイルには、</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">opencv-245.jar</span><span style="font:12px HiraKakuProN-W3; ">（245はバージョンによります）</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "> </span><span style="font:12px HiraKakuProN-W3; ">(場所はopencv/build/bin/の中) （245はバージョンによります）を指定。<br />次に、JNIライブラリの場所を指定。</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><strong><img class="imageStyle" alt="eclipse_user_lib7" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib7.png" width="660" height="489" /></strong><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><span style="font:12px HiraKakuProN-W3; ">ここは、libopencv_java245.dylib	（245はバージョンによります）（場所はopencv/build/lib の中）を指定。<br />で、この設定したユーザライブラリをプロジェクトのライブラリに指定します。<br /><br /></span><img class="imageStyle" alt="eclipse_user_lib8" src="https:/www.takuroyonezawa.info/blog/files/eclipse_user_lib8.png" width="525" height="342" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />試しに、次のプログラムを作ってコンパイル・実行してみましょう。<br /><br /><pre><br /></span><p style="text-align:justify;"><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Core</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.CvType</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Mat</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">public</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">class</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">Main</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">public</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">static</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#7C1304;">void</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#08196B;">main</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">String</span><span style="font:13px Courier, mono; color:#535353;">[]</span><span style="font:13px Courier, mono; color:#262626;"> args</span><span style="font:13px Courier, mono; color:#535353;">)</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />        System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">loadLibrary</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">Core</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">NATIVE_LIBRARY_NAME</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br />        Mat m  </span><span style="font:13px Courier, mono; color:#535353;">=</span><span style="font:13px Courier, mono; color:#262626;"> Mat</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">eye</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#1D6F3F;">3</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#1D6F3F;">3</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> CvType</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">CV_8UC1</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br />        System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">out</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">println</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#325B8E;">"m = "</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">+</span><span style="font:13px Courier, mono; color:#262626;"> m</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">dump</span><span style="font:13px Courier, mono; color:#535353;">());</span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier, mono; color:#535353;">}</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; color:#535353;">}<br /></pre></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span></p><p><img class="imageStyle" alt="eclipse_run" src="https:/www.takuroyonezawa.info/blog/files/eclipse_run.png" width="802" height="605" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br />こうなればオッケー。<br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /></span><h2>・顔認識のサンプルプログラム</h2><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">最後に、顔認識のプログラムを動かしてみましょう。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">[事前準備]</span><span style="font:12px HiraKakuProN-W3; "><br />opencv/data ディレクトリをeclipseプロジェクトにコピー。<br />このdataディレクトリには顔認識に必要な学習ファイルが存在していて、プログラムで使います。<br /><br /></span><img class="imageStyle" alt="lena" src="https:/www.takuroyonezawa.info/blog/files/lena.png" width="512" height="512" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />この画像をlena.png という名前でダウンロードして、同じくeclipseプロジェクトの適当な場所にコピー（例: YOUR_PROJECT/resources/とか作って、その中とか）。<br />次のプログラムを作成。<br /><hr><br /><pre><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Core</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Mat</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.MatOfRect</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Point</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Rect</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.core.Scalar</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.highgui.Highgui</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">import</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">org.opencv.objdetect.CascadeClassifier</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br /><br /></span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>//</em></span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// Detects faces in an image, draws boxes around them, and writes the results</em></span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// to "faceDetection.png".</em></span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>//</em></span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">class</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">DetectFaceDemo</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />  </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">public</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#7C1304;">void</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#08196B;">run</span><span style="font:13px Courier, mono; color:#535353;">()</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />    System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">out</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">println</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#325B8E;">"\nRunning DetectFaceDemo"</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br /><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// Create a face detector from the cascade file in the resources</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// directory.</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    CascadeClassifier faceDetector </span><span style="font:13px Courier, mono; color:#535353;">=</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">new</span><span style="font:13px Courier, mono; color:#262626;"> CascadeClassifier</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">&ldquo;data/lbpcascades/lbpcascade_frontalface.xml&rdquo;</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br />    Mat image </span><span style="font:13px Courier, mono; color:#535353;">=</span><span style="font:13px Courier, mono; color:#262626;"> Highgui</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">imread</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#325B8E;">&ldquo;resources/lena.png"</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br /><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// Detect faces in the image.</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// MatOfRect is a special container class for Rect.</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    MatOfRect faceDetections </span><span style="font:13px Courier, mono; color:#535353;">=</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">new</span><span style="font:13px Courier, mono; color:#262626;"> MatOfRect</span><span style="font:13px Courier, mono; color:#535353;">();</span><span style="font:13px Courier, mono; color:#262626;"><br />    faceDetector</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">detectMultiScale</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">image</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> faceDetections</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br /><br />    System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">out</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">println</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">String</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">format</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#325B8E;">"Detected %s faces"</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> faceDetections</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">toArray</span><span style="font:13px Courier, mono; color:#535353;">().</span><span style="font:13px Courier, mono; color:#325B8E;">length</span><span style="font:13px Courier, mono; color:#535353;">));</span><span style="font:13px Courier, mono; color:#262626;"><br /><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// Draw a bounding box around each face.</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">for</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">Rect rect </span><span style="font:13px Courier, mono; color:#535353;">:</span><span style="font:13px Courier, mono; color:#262626;"> faceDetections</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">toArray</span><span style="font:13px Courier, mono; color:#535353;">())</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />        Core</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">rectangle</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">image</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">new</span><span style="font:13px Courier, mono; color:#262626;"> Point</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">rect</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">x</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> rect</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">y</span><span style="font:13px Courier, mono; color:#535353;">),</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">new</span><span style="font:13px Courier, mono; color:#262626;"> Point</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">rect</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">x</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">+</span><span style="font:13px Courier, mono; color:#262626;"> rect</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">width</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> rect</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">y</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">+</span><span style="font:13px Courier, mono; color:#262626;"> rect</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">height</span><span style="font:13px Courier, mono; color:#535353;">),</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">new</span><span style="font:13px Courier, mono; color:#262626;"> Scalar</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#1D6F3F;">0</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#1D6F3F;">255</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#1D6F3F;">0</span><span style="font:13px Courier, mono; color:#535353;">));</span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier, mono; color:#535353;">}</span><span style="font:13px Courier, mono; color:#262626;"><br /><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// Save the visualized detection.</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    String filename </span><span style="font:13px Courier, mono; color:#535353;">=</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#325B8E;">"faceDetection.png"</span><span style="font:13px Courier, mono; color:#535353;">;</span><span style="font:13px Courier, mono; color:#262626;"><br />    System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">out</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">println</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">String</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">format</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#325B8E;">"Writing %s"</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> filename</span><span style="font:13px Courier, mono; color:#535353;">));</span><span style="font:13px Courier, mono; color:#262626;"><br />    Highgui</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">imwrite</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">filename</span><span style="font:13px Courier, mono; color:#535353;">,</span><span style="font:13px Courier, mono; color:#262626;"> image</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br />  </span><span style="font:13px Courier, mono; color:#535353;">}</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; color:#535353;">}</span><span style="font:13px Courier, mono; color:#262626;"><br /><br /></span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">public</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">class</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#1370A6;font-weight:bold; ">HelloOpenCV</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />  </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">public</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">static</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#7C1304;">void</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#08196B;">main</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">String</span><span style="font:13px Courier, mono; color:#535353;">[]</span><span style="font:13px Courier, mono; color:#262626;"> args</span><span style="font:13px Courier, mono; color:#535353;">)</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#535353;">{</span><span style="font:13px Courier, mono; color:#262626;"><br />    System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">out</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">println</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#325B8E;">"Hello, OpenCV"</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br /><br />    </span><span style="font:13px Courier-Oblique; color:#336D7D;"><em>// Load the native library.</em></span><span style="font:13px Courier, mono; color:#262626;"><br />    System</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">loadLibrary</span><span style="font:13px Courier, mono; color:#535353;">(</span><span style="font:13px Courier, mono; color:#262626;">Core</span><span style="font:13px Courier, mono; color:#535353;">.</span><span style="font:13px Courier, mono; color:#325B8E;">NATIVE_LIBRARY_NAME</span><span style="font:13px Courier, mono; color:#535353;">);</span><span style="font:13px Courier, mono; color:#262626;"><br />    </span><span style="font:13px Courier, mono; font-weight:bold; color:#0D5F18;font-weight:bold; ">new</span><span style="font:13px Courier, mono; color:#262626;"> </span><span style="font:13px Courier, mono; color:#08196B;">DetectFaceDemo</span><span style="font:13px Courier, mono; color:#535353;">().</span><span style="font:13px Courier, mono; color:#325B8E;">run</span><span style="font:13px Courier, mono; color:#535353;">();</span><span style="font:13px Courier, mono; color:#262626;"><br />  </span><span style="font:13px Courier, mono; color:#535353;">}</span><span style="font:13px Courier, mono; color:#262626;"><br /></span><span style="font:13px Courier, mono; color:#535353;">}</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><hr><br /><br />実行したら、次のファイルが生成されているはずです。<br /><br /></span><img class="imageStyle" alt="faceDetection" src="https:/www.takuroyonezawa.info/blog/files/facedetection.png" width="512" height="512" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><h3>・おまけ</h3><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">BufferedImage から Mat オブジェクトへの変換。<br />imgという名前でBufferedImageのオブジェクトが作成されている場合：<br /><br /></span><span style="font:11px Monaco; color:#0000C0;">Pixels pixels</span><span style="font:11px Monaco; "> = ((DataBufferByte)img.getRaster().getDataBuffer()).getData();</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:11px Monaco; color:#0000C0;">Mat mat</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Mat(img.getHeight(),img.getWidth(),CvType.</span><span style="font:11px Monaco; color:#0000C0;">CV_8UC3</span><span style="font:11px Monaco; ">);<br /></span><span style="font:11px Monaco; color:#0000C0;">mat</span><span style="font:11px Monaco; ">.put(0, 0, </span><span style="font:11px Monaco; color:#0000C0;">pixels</span><span style="font:11px Monaco; ">);</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />これでmatに画像データがコピーされた行列ができます。<br />ちなみに</span><span style="font:11px Monaco; ">img.getRaster().getDataBuffer() </span><span style="font:11px HiraKakuProN-W3; ">の返り値が</span><span style="font:12px HiraKakuProN-W3; ">DataBufferIntで、<br />エラー: </span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte</span><span style="font:12px HiraKakuProN-W3; "><br />が発生した場合（BufferedImageのタイプによります。</span><span style="font:12px HiraKakuProN-W3; "><a href="http://docs.oracle.com/javase/jp/1.5.0/guide/2d/spec/j2d-image.html" target="self">この辺</a></span><span style="font:12px HiraKakuProN-W3; ">や</span><span style="font:12px HiraKakuProN-W3; "><a href="http://stackoverflow.com/questions/12662415/java-awt-image-databufferint-cannot-be-cast-to-java-awt-image-databufferbyte" target="self">この辺</a></span><span style="font:12px HiraKakuProN-W3; ">を参考に。）、<br /><br /><pre><br /></span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">[] getImageBytesForBufferedImageOfDataTypeSize1(BufferedImage image) {<br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; ">[] pixels = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; ">[image.getWidth()*image.getHeight()];<br />		</span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">[] bytes = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">[image.getWidth()*image.getHeight()*3];<br />		DataBufferInt buffer = (DataBufferInt)(image.getRaster().getDataBuffer());<br />		<br />		</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> j =0;<br />		</span><span style="font:11px Monaco; color:#7F0055;">for</span><span style="font:11px Monaco; ">(</span><span style="font:11px Monaco; color:#7F0055;">int</span><span style="font:11px Monaco; "> i = 0; i < image.getWidth()*image.getHeight(); i++){<br />			pixels[i] = buffer.getElem(i);<br />			<br />			bytes[j] =   (</span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">)(0xFF & ((pixel[i] & 0x000000FF) >> 0)); </span><span style="font:11px Monaco; color:#3F7F5F;">//r</span><span style="font:11px Monaco; "><br />			bytes[j+1] = (</span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">)(0xFF & ((pixel[i] & 0x0000FF00) >> 8)); </span><span style="font:11px Monaco; color:#3F7F5F;">//g</span><span style="font:11px Monaco; "><br />			bytes[j+2] = (</span><span style="font:11px Monaco; color:#7F0055;">byte</span><span style="font:11px Monaco; ">)(0xFF & ((pixel[i] & 0x00FF0000) >> 16)); </span><span style="font:11px Monaco; color:#3F7F5F;">//b</span><span style="font:11px Monaco; "><br />			j+=3;<br />		}<br />		</span><span style="font:11px Monaco; color:#7F0055;">return</span><span style="font:11px Monaco; "> bytes;<br />}</span><span style="font:12px HiraKakuProN-W3; "><br /></pre><br /><br />といった感じで強引にbytes[]に直す。<br /></span><span style="font:11px Monaco; color:#0000C0;"><br />pixels</span><span style="font:11px Monaco; "> = getImageBytesForBufferedImageOfDataTypeSize1(img);</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:11px Monaco; color:#0000C0;">Mat mat</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> Mat(img.getHeight(),img.getWidth(),CvType.</span><span style="font:11px Monaco; color:#0000C0;">CV_8UC3</span><span style="font:11px Monaco; ">);<br /></span><span style="font:11px Monaco; color:#0000C0;">mat</span><span style="font:11px Monaco; ">.put(0, 0, </span><span style="font:11px Monaco; color:#0000C0;">pixels</span><span style="font:11px Monaco; ">);</span><span style="font:12px HiraKakuProN-W3; "><br /><br />で、Matオブジェクトが生成できます。<br /><br /><br /></span><h2>・おまけその２</h2><span style="font:12px HiraKakuProN-W3; "><br />ということで、AR.Droneと組み合わせて簡易的な顔認識・追従ができます。<br /><br /></span><iframe width="560" height="315" src="http://www.youtube.com/embed/5NF8wn8KxUo" frameborder="0" allowfullscreen></iframe></p>]]></content:encoded></item><item><title>Xuggle&#x30c0;&#x30a6;&#x30f3;&#x30ed;&#x30fc;&#x30c9;&#x26;&#x30a4;&#x30f3;&#x30b9;&#x30c8;&#x30fc;&#x30eb;</title><dc:subject>Note</dc:subject><dc:date>2013-05-08T09:46:07+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/9bb151a25bd067167d62e524e9ded31e-7.html#unique-entry-id-7</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/9bb151a25bd067167d62e524e9ded31e-7.html#unique-entry-id-7</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">メモ。<br />Xuggleをダウンロードしてインストール、</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.xuggle.com/downloads" target="self">ここ</a></span><span style="font:12px HiraKakuProN-W3; ">で書かれているやり方で推奨されてるのはMavenかIvyを利用してやる方法。<br />実は密かにpre-compileバージョンも提供されている。</span><span style="font:12px HiraKakuProN-W3; "><a href="http://xuggle.googlecode.com/svn/trunk/repo/share/java/xuggle/xuggle-xuggler/" target="self">ここ</a></span><span style="font:12px HiraKakuProN-W3; ">。</span>]]></content:encoded></item><item><title>AR.Drone&#x3092;&#x7121;&#x7dda;&#x30eb;&#x30fc;&#x30bf;&#x306b;&#x3064;&#x306a;&#x3044;&#x3067;Java(Processing&#x7528;&#x30e9;&#x30a4;&#x30d6;&#x30e9;&#x30ea;ARDroneForP5)&#x3067;&#x5236;&#x5fa1;</title><dc:subject>Note</dc:subject><dc:date>2013-05-08T07:49:27+02:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/8afcef06f92f68a877a7e5ce7ffa5689-6.html#unique-entry-id-6</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/8afcef06f92f68a877a7e5ce7ffa5689-6.html#unique-entry-id-6</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">メモ。AR Droneをすでにある無線ルータにつないでProcessingで制御。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/quad.jpg" width="225" height="224" /><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/ruta-.jpg" width="259" height="194" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:18px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">（１）AR.Droneを無線ルータにつなぐ<br /></span><span style="font:12px HiraKakuProN-W3; ">初期設定だとAR.Droneが提供するアクセスポイントにPC/iPhone/iPadがつなぎにいき、制御する。<br />これが嫌なので、AR Droneを無線ルータにつなぎたい。<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ailab.t.u-tokyo.ac.jp/~aoki/ardrone/index.php?AR.Drone%20%A4%F2%CC%B5%C0%FELAN%A5%EB%A1%BC%A5%BF%A1%BC%A4%CA%A4%C9%A4%CE%A5%A2%A5%AF%A5%BB%A5%B9%A5%DD%A5%A4%A5%F3%A5%C8%A4%CB%A4%C4%A4%CA%A4%B0" target="self">ここ</a></span><span style="font:12px HiraKakuProN-W3; ">をそのまま参考にする。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">1. telnet でつなぐ<br /></span><span style="font:12px HiraKakuProN-W3; ">まずはAR Droneが提供するアクセスポイントにつなぎ、コンピュータからtelnetする。<br />%telnet 192.168.1.1<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">2. WiFiの設定スクリプトを書く</span><span style="font:12px HiraKakuProN-W3; "><br />例えば環境にある無線ルータのessidが</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">hogehoge</span><span style="font:12px HiraKakuProN-W3; ">, AR Droneに設定したいIPが</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">hoge.hoge.hoge.hoge</span><span style="font:12px HiraKakuProN-W3; ">, ネットマスクが</span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">255.255.254.0</span><span style="font:12px HiraKakuProN-W3; "> の場合<br />どこかにmywifi.sh みたいなファイルを生成して中身をこう書く。<br /><pre><br />gpio 63 -d ho 1<br />killall udhcpd<br />ifconfig ath0 down<br />iwconfig ath0 essid &ldquo;hogehoge&rdquo;  <br />iwconfig ath0 mode managed<br />iwconfig ath0 key off<br />iwconfig ath0 essid &ldquo;hogehoge&rdquo;<br />ifconfig ath0 hoge.hoge.hoge.hoge netmask 255.255.254.0 up<br />ifconfig ath0<br />iwconfig ath0<br />iwlist   ath0 encryption<br />gpio 63 -d ho 0<br /></pre><br /><br />上記リンクそのまま。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">3. とりあえずテスト<br /></span><span style="font:12px HiraKakuProN-W3; ">%chmod 755 mywifi.sh<br />%./mywifi.sh<br /><br />これでtelnetがきれるので、コンピュータを同じ無線ルータにつなぎ、設定したIPにつなげれるかテスト。<br />%telnet hoge.hoge.hoge.hoge<br /><br />つながったら、OK<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">4. AR DroneのWiFi設定ファイルに書き込む<br /></span><span style="font:12px HiraKakuProN-W3; ">/bin/wifi_setup.sh の一番最後に、<br />/スクリプトを保存したディレクトリ/mywifi.sh <br />と書く。そうすると、AR Droneの初期設定が終わったあと、強引にその初期設定を無視して新しくWiFIにつながるようになる。<br /><br /></span><span style="font:17px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">（２）Java(Processing用ライブラリARDroneForP5)でWiFIにつながったAR Droneを制御<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://kougaku-navi.net/ARDroneForP5/" target="self">ここ</a></span><span style="font:12px HiraKakuProN-W3; ">にProcessing用AR Drone制御ライブラリが提供されているので、有り難くダウンロードさせていただく。<br />eclipseに読み込むと、後々の開発が楽。<br />とりあえず、サンプルの examples/ARDroneTest.java を動かしたい。<br />普通に考えるとARDroneTest.java内の、<br /></span><span style="font:11px Monaco; "><pre><br /></span><span style="font:11px Monaco; ">	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">void</span><span style="font:11px Monaco; "> initialize() {<br />		</span><span style="font:11px Monaco; color:#0000C0;">ardrone</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ARDrone(</span><span style="font:11px Monaco; color:#2A00FF;">&ldquo;192.168.1.1&rdquo;</span><span style="font:11px Monaco; ">);<br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /></span><span style="font:12px HiraKakuProN-W3; ">ここの部分を設定したIPに書き換えると動きそうだが、<br /></span><span style="font:11px Monaco; ">		</span><span style="font:11px Monaco; color:#0000C0;">ardrone</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ARDrone(</span><span style="font:11px Monaco; color:#2A00FF;">&ldquo;hoge.hoge.hoge.hoge&rdquo;</span><span style="font:11px Monaco; ">);</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />しかし動かない。Why ?<br />ardrone.connect(); 部分でこけてるっぽい。<br /><br />よってライブラリを変更必要があるので、ARDroneForP5.jar は使わないようにする。<br />で、ライブラリのソースファイルを変更する。<br /><br />ソースを見ると、ardrone.connect()は内部でARDroneInfo呼び出してそこの中の</span><span style="font:12px .AppleSystemUIFont; color:#850004;">connectToDroneThroughFtp</span><span style="font:12px .AppleSystemUIFont; color:#262626;">() </span><span style="font:12px HiraKakuProN-W3; color:#262626;">で</span><span style="font:12px .AppleSystemUIFont; color:#262626;">Drone</span><span style="font:12px HiraKakuProN-W3; color:#262626;">に接続しにいっている。</span><span style="font:12px .AppleSystemUIFont; color:#262626;"><br /></span><span style="font:12px HiraKakuProN-W3; color:#262626;">ただし、その中で指定されている</span><span style="font:12px .AppleSystemUIFont; color:#262626;">IP</span><span style="font:12px HiraKakuProN-W3; color:#262626;">が</span><span style="font:12px .AppleSystemUIFont; color:#262626;"><br /></span><span style="font:12px .AppleSystemUIFont; color:#262626;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	client.</span><span style="font:12px .AppleSystemUIFont; color:#0E6E6D;">connect</span><span style="font:12px .AppleSystemUIFont; color:#262626;">(ARDroneConstants.</span><span style="font:12px .AppleSystemUIFont; color:#0E6E6D;">IP_ADDRESS</span><span style="font:12px .AppleSystemUIFont; color:#262626;">, ARDroneConstants.</span><span style="font:12px .AppleSystemUIFont; color:#0E6E6D;">FTP_PORT</span><span style="font:12px .AppleSystemUIFont; color:#262626;">);<br /></span><span style="font:12px HiraKakuProN-W3; ">となっていて、ARDroneConstants.IP_ADDRESS が決め打ちの&rdquo;192.168.1.1&rdquo; を参照しているため、examples/ARDroneTest.javaで</span><span style="font:11px Monaco; ">		</span><span style="font:11px Monaco; color:#0000C0;">ardrone</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ARDrone(</span><span style="font:11px Monaco; color:#2A00FF;">&ldquo;hoge.hoge.hoge.hoge&rdquo;</span><span style="font:11px Monaco; ">);<br /></span><span style="font:12px HiraKakuProN-W3; ">として指定してやったIPアドレスが反映されていない。<br /><br />ARDroneInfo.java のコンストラクタを変えてやる<br /><pre><br /></span><span style="font:12px .AppleSystemUIFont; color:#262626;">public </span><span style="font:12px .AppleSystemUIFont; color:#850004;">ARDroneInfo</span><span style="font:12px .AppleSystemUIFont; color:#262626;">() {<br />		connectToDroneThroughFtp();<br />}</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><br />を、<br /><pre><br /></span><span style="font:11px Monaco; ">	</span><span style="font:11px Monaco; color:#7F0055;">private</span><span style="font:11px Monaco; "> </span><span style="font:11px Monaco; color:#7F0055;">final</span><span style="font:11px Monaco; "> InetAddress </span><span style="font:11px Monaco; color:#0000C0;">addr</span><span style="font:11px Monaco; ">;<br /><br />	</span><span style="font:11px Monaco; color:#7F0055;">public</span><span style="font:11px Monaco; "> ARDroneInfo(</span><span style="font:11px Monaco; color:#7F0055;">final</span><span style="font:11px Monaco; "> InetAddress addr) {<br />		</span><span style="font:11px Monaco; color:#7F0055;">this</span><span style="font:11px Monaco; ">.</span><span style="font:11px Monaco; color:#0000C0;">addr</span><span style="font:11px Monaco; "> = addr;<br />		connectToDroneThroughFtp();<br />	}</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><br />としてやり、同じプログラム内の<br /></span><span style="font:12px .AppleSystemUIFont; color:#262626;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	client.</span><span style="font:12px .AppleSystemUIFont; color:#0E6E6D;">connect</span><span style="font:12px .AppleSystemUIFont; color:#262626;">(ARDroneConstants.</span><span style="font:12px .AppleSystemUIFont; color:#0E6E6D;">IP_ADDRESS</span><span style="font:12px .AppleSystemUIFont; color:#262626;">, ARDroneConstants.</span><span style="font:12px .AppleSystemUIFont; color:#0E6E6D;">FTP_PORT</span><span style="font:12px .AppleSystemUIFont; color:#262626;">);<br /></span><span style="font:12px HiraKakuProN-W3; ">これを、<br /></span><span style="font:11px Monaco; ">        	client.connect(</span><span style="font:11px Monaco; color:#7F0055;">this</span><span style="font:11px Monaco; ">.</span><span style="font:11px Monaco; color:#0000C0;">addr</span><span style="font:11px Monaco; ">, ARDroneConstants.</span><span style="font:11px Monaco; color:#0000C0;">FTP_PORT</span><span style="font:11px Monaco; ">);<br /></span><span style="font:12px HiraKakuProN-W3; ">これに変えてやる。<br />ARDroneInfoはARDrone.javaからしか参照されてなさそうなので、他に影響はなくて、大丈夫だと思います。<br /><br />で、ARDroneInfoを呼び出す元の、com.shigeodayo.ardrone.ARDrone.java内の<br /><pre><br /></span><span style="font:11px Monaco; ">		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; "> (</span><span style="font:11px Monaco; color:#0000C0;">ardroneVersion</span><span style="font:11px Monaco; "> == </span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">)<br />			</span><span style="font:11px Monaco; color:#0000C0;">ardroneVersion</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ARDroneInfo().getDroneVersion();			<br /></pre><br /></span><span style="font:12px HiraKakuProN-W3; ">この部分を<br /><pre><br /></span><span style="font:11px Monaco; ">		</span><span style="font:11px Monaco; color:#7F0055;">if</span><span style="font:11px Monaco; "> (</span><span style="font:11px Monaco; color:#0000C0;">ardroneVersion</span><span style="font:11px Monaco; "> == </span><span style="font:11px Monaco; color:#7F0055;">null</span><span style="font:11px Monaco; ">)<br />			</span><span style="font:11px Monaco; color:#0000C0;">ardroneVersion</span><span style="font:11px Monaco; "> = </span><span style="font:11px Monaco; color:#7F0055;">new</span><span style="font:11px Monaco; "> ARDroneInfo(</span><span style="font:11px Monaco; color:#0000C0;">inetaddr</span><span style="font:11px Monaco; ">).getDroneVersion();			<br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /></span><span style="font:12px HiraKakuProN-W3; "><br />これに変えてやる。そうすると、無線ルータにつながったARDroneにきちんとつながりました。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">おまけ：</span><span style="font:12px HiraKakuProN-W3; ">自分でソースを直すのがめんどい人は、<br />com.shigeodayo.ardrone.utils.ARDroneInfo.java を</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ht.sfc.keio.ac.jp/~takuro/resources/ARDrone.java" target="self">これ</a></span><span style="font:12px HiraKakuProN-W3; ">に<br />com.shigeodayo.ardrone.ARDrone.javaを</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.ht.sfc.keio.ac.jp/~takuro/resources/ARDroneInfo.java" target="self">これ</a></span><span style="font:12px HiraKakuProN-W3; ">に<br /><br />置き換えると、すぐに動きます。<br />tomotakaさん、ありがとうございました。<br /></span>]]></content:encoded></item><item><title>iOS Xcode&#x306e;Storyboard&#x3067;Table View&#x306e;&#x30ab;&#x30b9;&#x30bf;&#x30e0;&#x30bb;&#x30eb;</title><dc:subject>Note</dc:subject><dc:date>2013-02-22T21:21:52+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/b10be8fa20b3a55e8b762ec832d33063-5.html#unique-entry-id-5</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/b10be8fa20b3a55e8b762ec832d33063-5.html#unique-entry-id-5</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">iOSプログラミング、1日取り組んでみて、ようやくビギナーからアマチュアになった気がします。<br /><br />StoryboardでTable Viewのカスタムセルを作って、表示させるやり方。<br />メモ。<br /><br /></span><span style="font:12px HiraKakuProN-W3; ">(1) プロジェクト新規作成して、UIViewController上にTable Viewを、その上にTable View Cellを追加。UITableViewControllerを使う場合はここは省略できます。<br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic222.jpg" width="404" height="299" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><hr><br /><br />(2) セル上に好きな部品を配置。後でこのセルを呼び出すために、Table View CellのIdentifierを設定します（下図ではhelloCell）。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-111.jpg" width="446" height="176" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />セルの中の各要素に後でアクセスするために、各</span>View<span style="font:12px HiraKakuProN-W3; ">にTagを設定。下図ではLabelに&rdquo;1&rdquo;のTagを設定してます。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 2" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-2.jpg" width="433" height="154" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />もう一個セルを追加してみる。セルの追加は、Table View Cellをドラッグ&ドロップ。2つ目のセルにもIdentifierを設定。部品を適当に配置。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 3" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-3.jpg" width="434" height="165" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><br /><hr><br /><br />(3) Table Viewをソースコードに紐付け。Table ViewでCtrl押しながらうにょ〜と.h に登録。<br /><br /></span><img class="imageStyle" alt="Pasted Graphic 4" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-4.jpg" width="515" height="318" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><hr><br /><br />(4) 後はコードを書くだけ。<br /><br />[ViewController.h]<br /><br /></span><span style="font:11px Menlo-Regular; color:#643820;">#import </span><span style="font:11px Menlo-Regular; color:#C41A16;"><UIKit/UIKit.h></span><span style="font:11px Menlo-Regular; color:#643820;"><br /></span><span style="font:11px Menlo-Regular; "><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@interface</span><span style="font:11px Menlo-Regular; "> ViewController : </span><span style="font:11px Menlo-Regular; color:#5C2699;">UIViewController</span><span style="font:11px Menlo-Regular; "><</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableViewDataSource</span><span style="font:11px Menlo-Regular; ">,</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableViewDelegate</span><span style="font:11px Menlo-Regular; ">>{<br /> <br />}<br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@property</span><span style="font:11px Menlo-Regular; "> (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">weak</span><span style="font:11px Menlo-Regular; ">, </span><span style="font:11px Menlo-Regular; color:#AA0D91;">nonatomic</span><span style="font:11px Menlo-Regular; ">) </span><span style="font:11px Menlo-Regular; color:#AA0D91;">IBOutlet</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableView</span><span style="font:11px Menlo-Regular; "> *myTableView;<br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@end</span><span style="font:11px Menlo-Regular; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /><hr><br /><br />[ViewController.m]<br /><br /><pre><br /></span><span style="font:11px Menlo-Regular; color:#643820;">#import </span><span style="font:11px Menlo-Regular; color:#C41A16;">"ViewController.h"</span><span style="font:11px Menlo-Regular; color:#643820;"><br /></span><span style="font:11px Menlo-Regular; "><br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@implementation</span><span style="font:11px Menlo-Regular; "> ViewController<br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@synthesize</span><span style="font:11px Menlo-Regular; "> myTableView;<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)viewDidLoad<br />{<br />    [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">super</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewDidLoad</span><span style="font:11px Menlo-Regular; ">];<br />	</span><span style="font:11px Menlo-Regular; color:#007400;">// Do any additional setup after loading the view, typically from a nib.</span><span style="font:11px Menlo-Regular; "><br />    <br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myTableView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">setDataSource</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; ">];<br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myTableView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">setDelegate</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; ">];<br />}<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)didReceiveMemoryWarning<br />{<br />    [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">super</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">didReceiveMemoryWarning</span><span style="font:11px Menlo-Regular; ">];<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">// Dispose of any resources that can be recreated.</span><span style="font:11px Menlo-Regular; "><br />}<br /><br /><br /></span><span style="font:11px Menlo-Regular; color:#643820;">#pragma mark - Table view data source<br /></span><span style="font:11px Menlo-Regular; "><br />- (</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSInteger</span><span style="font:11px Menlo-Regular; ">)numberOfSectionsInTableView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableView</span><span style="font:11px Menlo-Regular; "> *)tableView<br />{<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">// Return the number of sections.</span><span style="font:11px Menlo-Regular; "><br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">; </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">とりあえずセクションは</span><span style="font:11px Menlo-Regular; color:#007400;">1</span><span style="font:11px HiraKakuProN-W3; color:#007400;">個</span><span style="font:11px Menlo-Regular; "><br />}<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSInteger</span><span style="font:11px Menlo-Regular; ">)tableView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableView</span><span style="font:11px Menlo-Regular; "> *)tableView numberOfRowsInSection:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSInteger</span><span style="font:11px Menlo-Regular; ">)section<br />{<br />    </span><span style="font:11px Menlo-Regular; color:#007400;">// Return the number of rows in the section.</span><span style="font:11px Menlo-Regular; "><br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#1C00CF;">2</span><span style="font:11px Menlo-Regular; ">; </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">とりあえず</span><span style="font:11px Menlo-Regular; color:#007400;">2</span><span style="font:11px HiraKakuProN-W3; color:#007400;">行だけ表示する</span><span style="font:11px Menlo-Regular; "><br />}<br /><br />- (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableViewCell</span><span style="font:11px Menlo-Regular; "> *)tableView:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">UITableView</span><span style="font:11px Menlo-Regular; "> *)tableView cellForRowAtIndexPath:(</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSIndexPath</span><span style="font:11px Menlo-Regular; "> *)indexPath<br />{<br /><br />    UITableViewCell *cell;<br />    <br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; ">(indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">row</span><span style="font:11px Menlo-Regular; ">==</span><span style="font:11px Menlo-Regular; color:#1C00CF;">0</span><span style="font:11px Menlo-Regular; ">){ </span><span style="font:11px Menlo-Regular; color:#007400;">//0</span><span style="font:11px HiraKakuProN-W3; color:#007400;">行目のセル</span><span style="font:11px Menlo-Regular; "><br />        </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">カスタムセルを選ぶ</span><span style="font:11px Menlo-Regular; "><br />        cell =  [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myTableView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">dequeueReusableCellWithIdentifier</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"helloCell"</span><span style="font:11px Menlo-Regular; ">];<br />        <br />        </span><span style="font:11px Menlo-Regular; color:#007400;">//</span><span style="font:11px HiraKakuProN-W3; color:#007400;">各要素にはタグでアクセスする</span><span style="font:11px Menlo-Regular; "><br />        </span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; "> *idLabel = (</span><span style="font:11px Menlo-Regular; color:#5C2699;">UILabel</span><span style="font:11px Menlo-Regular; ">*)[cell </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">viewWithTag</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">];<br />        idLabel.</span><span style="font:11px Menlo-Regular; color:#5C2699;">text</span><span style="font:11px Menlo-Regular; "> = </span><span style="font:11px Menlo-Regular; color:#C41A16;">@"Bye"</span><span style="font:11px Menlo-Regular; ">;<br />        <br />    }</span><span style="font:11px Menlo-Regular; color:#AA0D91;">else</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; ">(indexPath.</span><span style="font:11px Menlo-Regular; color:#5C2699;">row</span><span style="font:11px Menlo-Regular; ">==</span><span style="font:11px Menlo-Regular; color:#1C00CF;">1</span><span style="font:11px Menlo-Regular; ">){</span><span style="font:11px Menlo-Regular; color:#007400;">//1</span><span style="font:11px HiraKakuProN-W3; color:#007400;">行目のセル</span><span style="font:11px Menlo-Regular; "><br />        cell =  [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myTableView</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">dequeueReusableCellWithIdentifier</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"switchCell"</span><span style="font:11px Menlo-Regular; ">];<br />    }<br /><br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">return</span><span style="font:11px Menlo-Regular; "> cell;<br />}<br /><br /></span><span style="font:11px Menlo-Regular; color:#AA0D91;">@end<br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><br /><br />実行するとこんな感じ。<br /></span><img class="imageStyle" alt="iOS Simulator Screen shot 2013.02.22 15.36.46" src="https:/www.takuroyonezawa.info/blog/files/ios-simulator-screen-shot-2013.02.22-15.36.46.png" width="192" height="288" /><span style="font:12px HiraKakuProN-W3; "><br /><br /></span>]]></content:encoded></item><item><title>iPhone(iOS) + XMPP</title><dc:subject>Note</dc:subject><dc:date>2013-02-19T08:01:53+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/602a012759a8599e04fdf93baf860582-4.html#unique-entry-id-4</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/602a012759a8599e04fdf93baf860582-4.html#unique-entry-id-4</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">iPhoneのXMPPに関する情報がJavaに比べて少ないので、メモ。色々ライブラリはあると思うが、RobbieHansonの </span><span style="font:12px HiraKakuProN-W3; "><a href="https://github.com/robbiehanson/XMPPFramework" target="self" rel="external">XMPPFramework for OSX/iOS</a></span><span style="font:12px HiraKakuProN-W3; ">に関して。<br /><br /></span><h3>(1) Xcodeへの設定</h3><span style="font:12px HiraKakuProN-W3; ">基本的には上記サイトの</span><span style="font:12px HiraKakuProN-W3; "><a href="https://github.com/robbiehanson/XMPPFramework/wiki/GettingStarted_iOS" target="self">GettingStarted_iOS</a></span><span style="font:12px HiraKakuProN-W3; ">を見ながらやれば問題はない。しかし</span><span style="font:12px HiraKakuProN-W3; "><a href="http://mobile.tutsplus.com/tutorials/iphone/building-a-jabber-client-for-ios-interface-setup/" target="self">こっちの方</a></span><span style="font:12px HiraKakuProN-W3; ">が、スクリーンショットとか豊富で安心かも。ただし、情報が古いため、XMPPFramework-master/Authenticationも加えるのを忘れないように。<br />Build Phase->Link Binary with Libraries のframeworkの追加や、KissXMLを使うためのlibxml関係のリンクフラグなどの設定が少し面倒かな。。<br />自分の環境では、こんな感じ。<br /></span><img class="imageStyle" alt="Pasted Graphic" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic.jpg" width="611" height="241" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><img class="imageStyle" alt="Pasted Graphic 1" src="https:/www.takuroyonezawa.info/blog/files/pasted-graphic-1.jpg" width="621" height="209" /><span style="font:12px HiraKakuProN-W3; "><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">最後に.hファイル、XMPPFramework-master/Sample_XMPPFramework.hを、XMPPFramework.hっていう名前にして、自分が使うライブラリに応じて中身を書き換えてやってXcodeに置いとけば、#importが後々楽になる。<br /><br /></span><h3>(2) とりあえず接続</h3><span style="font:12px HiraKakuProN-W3; ">サンプルコードを見ればわかりますが、念のためメモ。<br />XMPPStreamインスタンスを作るー＞JIDの設定ー＞Delegateの登録ー＞コネクトー＞コネクトできたらパスワードで認証（Delegateメソッド内で行う）<br />という感じで処理が進む。<br /><br />例えばこんなコード。setupStreamを適当な場所で呼んでやり、ほっといたらすぐにxmppStreamDidConnectが呼ばれます。:<br /></span><span style="font:11px Menlo-Regular; "><pre><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)setupXMPPStream{<br />    </span><span style="font:11px Menlo-Regular; color:#643820;">DDLogVerbose</span><span style="font:11px Menlo-Regular; ">(</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"%@: %@"</span><span style="font:11px Menlo-Regular; ">, [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">class</span><span style="font:11px Menlo-Regular; ">], </span><span style="font:11px Menlo-Regular; color:#26474B;">THIS_METHOD</span><span style="font:11px Menlo-Regular; ">);<br /><br />    </span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppStream</span><span style="font:11px Menlo-Regular; "> = [[</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPStream</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">alloc</span><span style="font:11px Menlo-Regular; ">] </span><span style="font:11px Menlo-Regular; color:#26474B;">init</span><span style="font:11px Menlo-Regular; ">]; //XMPPStream</span><span style="font:11px HiraKakuProN-W3; ">インスタンスを作る</span><span style="font:11px Menlo-Regular; "><br />    </span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppStream</span><span style="font:11px Menlo-Regular; ">.</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myJID</span><span style="font:11px Menlo-Regular; "> = [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPJID</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">jidWithString</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#3F6E74;">myJID</span><span style="font:11px Menlo-Regular; ">]; //JID</span><span style="font:11px HiraKakuProN-W3; ">の設定(hoge@hogehoge.comみたいなのがJID)</span><span style="font:11px Menlo-Regular; "><br /><br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppStream</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">addDelegate</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">delegateQueue</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#643820;">dispatch_get_main_queue</span><span style="font:11px Menlo-Regular; ">()]; //Delegate</span><span style="font:11px HiraKakuProN-W3; ">の登録</span><span style="font:11px Menlo-Regular; "><br /><br />    </span><span style="font:11px Menlo-Regular; color:#5C2699;">NSError</span><span style="font:11px Menlo-Regular; "> *error = </span><span style="font:11px Menlo-Regular; color:#AA0D91;">nil</span><span style="font:11px Menlo-Regular; ">;<br /><br />    </span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; "> (![</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppStream</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">connect</span><span style="font:11px Menlo-Regular; ">:&error]) //</span><span style="font:11px HiraKakuProN-W3; ">コネクト</span><span style="font:11px Menlo-Regular; "><br />    {<br />        </span><span style="font:11px Menlo-Regular; color:#643820;">DDLogError</span><span style="font:11px Menlo-Regular; ">(</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"%@: Error connecting: %@"</span><span style="font:11px Menlo-Regular; ">, [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">class</span><span style="font:11px Menlo-Regular; ">], error);<br />    }<br />    <br />}<br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:11px Menlo-Regular; ">- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)xmppStreamDidConnect:(</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPStream</span><span style="font:11px Menlo-Regular; "> *)sender<br />{<br />	</span><span style="font:11px Menlo-Regular; color:#5C2699;">NSError</span><span style="font:11px Menlo-Regular; "> *error = </span><span style="font:11px Menlo-Regular; color:#AA0D91;">nil</span><span style="font:11px Menlo-Regular; ">;<br />	<br />	</span><span style="font:11px Menlo-Regular; color:#AA0D91;">if</span><span style="font:11px Menlo-Regular; "> (![</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppStream</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">authenticateWithPassword</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#3F6E74;">_pass</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">error</span><span style="font:11px Menlo-Regular; ">:&error])<br />	{<br />		</span><span style="font:11px Menlo-Regular; color:#643820;">DDLogError</span><span style="font:11px Menlo-Regular; ">(</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"%@: Error authenticating: %@"</span><span style="font:11px Menlo-Regular; ">, [</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">class</span><span style="font:11px Menlo-Regular; ">], error);<br />	}<br />    <br />}</span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "></pre><br /><br /></span><h3>(3) XEP-0060 PubSubについて</h3><span style="font:12px HiraKakuProN-W3; "><br />RobbieHansonのXMPPFrameworkにももちろんPubSubのExtensionは入っている。が、JavaのSmackに比べて少しAPIが少なく感じるのと、日本語英語含めてほとんどサンプルやチュートリアルが見当たらないので、メモ。<br /><br />XMPPStreamインスタンスを作った時みたいに、pubsub用のインスタンスも作る。<br /><pre><br /></span><span style="font:11px Menlo-Regular; ">    </span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppPubSub</span><span style="font:11px Menlo-Regular; "> = [[</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPPubSub</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">alloc</span><span style="font:11px Menlo-Regular; ">] </span><span style="font:11px Menlo-Regular; color:#26474B;">initWithServiceJID</span><span style="font:11px Menlo-Regular; ">:[</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPJID</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">jidWithString</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#C41A16;">@"pubsub.hoge.com&rdquo;</span><span style="font:11px Menlo-Regular; ">]];<br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppPubSub</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">activate</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppStream</span><span style="font:11px Menlo-Regular; ">];<br />    [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppPubSub</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">addDelegate</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">self</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">delegateQueue</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#643820;">dispatch_get_main_queue</span><span style="font:11px Menlo-Regular; ">()];//Delegate</span><span style="font:11px HiraKakuProN-W3; ">の登録</span><span style="font:11px Menlo-Regular; "><br /></pre><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">後は、XMPPPubSubのメソッドを見ながら色々と試してみると良い[xmppPubSub createNode/deleteNode/subscribeToNode/unsubscribeToNodeなど..]。ちなみにPubSubノード一覧は、</span><span style="font:11px Menlo-Regular; "> [</span><span style="font:11px Menlo-Regular; color:#3F6E74;">xmppPubSub</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#26474B;">discoverItemsForNode</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">nil</span><span style="font:11px Menlo-Regular; ">];</span><span style="font:12px HiraKakuProN-W3; ">でゲットできました。何かIQを送った場合、その結果は下記のDelegateメソッドでゲットできる。<br /></span><span style="font:11px Menlo-Regular; "><br /><pre><br />- (</span><span style="font:11px Menlo-Regular; color:#AA0D91;">void</span><span style="font:11px Menlo-Regular; ">)xmppPubSub:(</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPPubSub</span><span style="font:11px Menlo-Regular; "> *)sender didReceiveResult:(</span><span style="font:11px Menlo-Regular; color:#3F6E74;">XMPPIQ</span><span style="font:11px Menlo-Regular; "> *)iq{<br />    <br /></span><span style="font:11px HiraKakuProN-W3; ">  // ここに処理を書けば</span><span style="font-size:11px; ">OK</span><span style="font:11px HiraKakuProN-W3; ">。とりあえずメッセージの中身を確認したい場合は、NSLog(@&ldquo;%@&ldquo;,[iq XMLString]); なんかで見ればよい。普通のXMLなので、</span><span style="font:11px Menlo-Regular; "><br /> </span><span style="font:11px HiraKakuProN-W3; ">//</span><span style="font:11px Menlo-Regular; ">  </span><span style="font:11px Menlo-Regular; color:#3F6E74;">DDXMLElement</span><span style="font:11px Menlo-Regular; "> *element = [[</span><span style="font:11px Menlo-Regular; color:#3F6E74;">DDXMLElement</span><span style="font:11px Menlo-Regular; "> </span><span style="font:11px Menlo-Regular; color:#2E0D6E;">alloc</span><span style="font:11px Menlo-Regular; ">] </span><span style="font:11px Menlo-Regular; color:#26474B;">initWithXMLString</span><span style="font:11px Menlo-Regular; ">:[iq </span><span style="font:11px Menlo-Regular; color:#26474B;">XMLString</span><span style="font:11px Menlo-Regular; ">] </span><span style="font:11px Menlo-Regular; color:#26474B;">error</span><span style="font:11px Menlo-Regular; ">:</span><span style="font:11px Menlo-Regular; color:#AA0D91;">nil</span><span style="font:11px Menlo-Regular; ">];<br /> </span><span style="font:11px HiraKakuProN-W3; ">//</span><span style="font:11px Menlo-Regular; ">  NSArray* </span><span style="font:11px Menlo-Regular; color:#3F6E74;">allNodes</span><span style="font:11px Menlo-Regular; "> = [element </span><span style="font:11px Menlo-Regular; color:#26474B;">nodesForXPath</span><span style="font:11px Menlo-Regular; ">:&hellip;.. <br /> </span><span style="font:11px HiraKakuProN-W3; ">// こんな感じで書いて行けば、、</span><span style="font:11px Menlo-Regular; ">XPath</span><span style="font:11px HiraKakuProN-W3; ">でXMLノードにアクセスできる。</span><span style="font:11px Menlo-Regular; "><br /><br />}</span><span style="font:12px HiraKakuProN-W3; "><br /></pre><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">しかしiOSプログラミングとObjective-Cは普段使わないとすぐ忘れちゃう(T^T)<br />毎回ほぼ0からのスタートだから、大変。「はじめてのiOS」みたいなチュートリアルを何回見て何回忘れたことか・・<br />Interface Builderじゃなくて、storyboardってやつになったのね。もっと積極的かつ継続的に触って、忘れないようにしたいです。<br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span>]]></content:encoded></item><item><title>Geo-SELECT memo(MySQL)</title><dc:subject>Note</dc:subject><dc:date>2013-02-13T17:35:14+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/fffb11adfbf1d207638b3e7d969b0f63-3.html#unique-entry-id-3</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/fffb11adfbf1d207638b3e7d969b0f63-3.html#unique-entry-id-3</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">緯度経度から範囲指定でSELECTするメモ。たぶんまた使うと思うので。<br /><br />（準備）<br />適当なデータベースに、テーブルを作成:<br />create table testdb( name text not null, latlng geometry, primary key(name(128)));<br />とりあえずシンプルなテーブルを用意。ここではnameをプライマリーキーに、latlngという要素はgeometry型。<br /><br />適当にデータを突っ込む:<br />insert into testdb(name,latlng) VALUES ('testname1&rsquo;,GeomFromText('POINT(139.777 35.713)'));<br />insert into testdb(name,latlng) VALUES ('testname2&rsquo;,GeomFromText('POINT(-79.945039 40.444663)'));<br /><br />（ゲット）<br />SELECT name, Y(latlng) as lat, X(latlng) as lng from testdb where MBRContains(GeomFromText('LINESTRING(最大経度 最大経度, 最小経度 最小緯度)'),latlng);<br /><br />これで最大緯度経度、最小緯度経度を対角とする四角形の範囲に存在するデータをとってくる。<br /><br />最大緯度・経度は、こんな感じで求めた。<br /><br />float minLat,maxLat,minLon,maxLon;<br />float lat = 中心の緯度の値;<br />float lon = 中心の経度の値;<br />float dist = 円でいう半径の値;<br /><br />float earthLen = (float) ((float)6356752*Math.cos(lon/(180*Math.PI))*(2*Math.PI));<br />float meterPerSec=earthLen/(360*60*60);<br /><br />minLat = lat - (dist/30.8184*0.00027778f);<br />maxLat = lat + (dist/30.8184*0.00027778f);<br />minLon = lon - (dist/meterPerSec*0.00027778f);<br />maxLon = lon + (dist/meterPerSec*0.00027778f);<br /><br />このmin/maxLat, min/maxLonを上のSelect分の最大/最小緯度経度に当てはめたらオッケっぽい。<br /><br />参考：<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://d.hatena.ne.jp/ilo/20090212/1234448136" target="self">MySQLで指定した緯度経度から半径nメートル内検索っぽいのを実現するSQL</a></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://blog.epitaph-t.com/?p=172" target="self">データベース内の緯度・経度を利用して半径500m以内を検索する方法</a></span><span style="font:12px HiraKakuProN-W3; "><br /></span>]]></content:encoded></item><item><title>Net10+ iPhone</title><dc:subject>Note</dc:subject><dc:date>2013-01-02T00:17:08+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/dfdcf7af86acebe8727cc5557086623f-2.html#unique-entry-id-2</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/dfdcf7af86acebe8727cc5557086623f-2.html#unique-entry-id-2</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">2013年1月現在の米国での話。Unlocked iPhoneでプリペイド。１週間くらいの滞在だったらT-mobileの１日単位のプランで最低限いい。<br />ただ、数ヶ月の滞在だとT-mobileのMonthlyプランでは、Edgeしか使えないからやっぱり不便。<br /><br />他の選択肢としてNet10や Straight Talkというサービスがあるらしく、今回はNet10を使ってみました。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">(1) なぜNet10にしたか<br /></span><span style="font:12px HiraKakuProN-W3; ">Net10、Straight Talk 両方、公式WEBに行けば購入できるのだけど、なぜか自分のクレジットカードだと支払いができなかった（日本発行クレジットカードのため？）。よって、SIMを店舗で手に入れる必要があり、近くのBest BuyでNet10のSIMが販売されてることを知り、そうしました。<br />（Straight TalkのSIMはもしかしたらWalmart で売ってるかもしれません）<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">(2) 購入するもの<br /></span><span style="font:12px HiraKakuProN-W3; ">１．Net10のSIMセット（$15くらい）<br />Micro SIM (GSM/AT&T), SIM (GSM/AT&T), SIM(CDMA/T-mobile) の３つのセットになってます。<br />ケータイ2台持ちの人だと、これは嬉しいかも。<br /></span><img class="imageStyle" alt="N10NET10SIM.PNG" src="https:/www.takuroyonezawa.info/blog/files/n10net10sim.png.jpg" width="163" height="163" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br />2. Airtime カード<br />SIMをActivateするには、Airtimeカード、いわゆるプリペイドカードが必要です。僕は1ヶ月電話/WEB使い放題で$50のカードを購入しました。<br /></span><img class="imageStyle" alt="0061696001581_500X500" src="https:/www.takuroyonezawa.info/blog/files/0061696001581_500x500.jpg" width="150" height="150" /><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W3; "><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">(3) アクティベーション</span><span style="font:12px HiraKakuProN-W3; "><br />SIMを使えるようにするため、まずはNet10の</span><span style="font:12px HiraKakuProN-W3; "><a href="http://www.net10wireless.com/" target="self">WEB</a></span><span style="font:12px HiraKakuProN-W3; ">に行って、SIMのアクティベーションをする必要があります。<br />Activateメニューから、SIMセットとAirtimeカードに記載されているPINナンバーなどを入れて、完了。<br />SIMをiPhoneに入れ、iPhoneを起動すると、無事AT&Tの電波を掴みます。（僕のはHOMEって表示されるけど。。）<br />この時点で、電話は使えるようになってます。<br /><br /></span><span style="font:12px HiraKakuProN-W6; font-weight:bold; font-weight:bold; ">(4) APN設定</span><span style="font:12px HiraKakuProN-W3; "><br />モバイルデータ通信を行うために、APNの設定を行う必要があります。<br />APN設定に必要な情報は(3)の手続きの中で表示されるけど（APN: </span><span style="font:12px &#39;Lucida Grande&#39;, LucidaGrande, Verdana, sans-serif; color:#262626;">wap.tracfone</span><span style="font:12px HiraKakuProN-W3; ">）、肝心のiPhone内にAPN設定画面が出てくれません（AT&TのSIMはそうらしいです）。<br />そこで、APN設定をプロファイルとして登録してやります。<br />Net10の提供するプロファイルをゲットするために、iPhoneで</span><span style="font:12px &#39;Lucida Grande&#39;, LucidaGrande, Verdana, sans-serif; color:#425AB8;"><a href="http://iapnupdate.net10.com/">http://iapnupdate.net10.com</a></span><span style="font:12px HiraKakuProN-W3; ">にアクセスして、プロファイルをインストール。</span><span style="font:12px &#39;Lucida Grande&#39;, LucidaGrande, Verdana, sans-serif; color:#425AB8;"><br /><br /></span><span style="font:12px HiraKakuProN-W3; ">これで幸せになれました。<br /><br /><br />＊後日談<br />Refillしようと思ってRefillカードをそこらへんのスーパーで買って、WEBからやろうとしたんですが、エラーでRefillできない。<br />電話（自動音声案内）だと、問題なく追加できました。</span>]]></content:encoded></item><item><title>JAXB&#x3068;SimpleXML</title><dc:subject>Note</dc:subject><dc:date>2012-12-25T23:12:48+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/c7b5e1767589a142fd9afe67d00d6383-1.html#unique-entry-id-1</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/c7b5e1767589a142fd9afe67d00d6383-1.html#unique-entry-id-1</guid><content:encoded><![CDATA[<span style="font:12px HiraKakuProN-W3; ">XMLとJavaの架け橋として、Java 6.0からJAXBが正式に追加された。XMLからJavaオブジェクトを作成したり、Java ObjectからXMLを生成したりとJAXBはわりと便利で、私も2008年ごろにXMLベースのイベント記述言語と実行ランタイムを実装するのに使ってました。<br /><br />今回androidでXMLを触る機会があったのでJAXBを久しぶりに試してみようかな、と思ったのですが、Androidではサポートしてないため、代替案として</span><span style="font:12px HiraKakuProN-W3; "><a href="http://simple.sourceforge.net" target="self">SimpleXML</a></span><span style="font:12px HiraKakuProN-W3; ">を触ってみました。サンプルが充実してるので、簡単です。SimleXMLではxsdからJavaクラスを生成みたいな機能はないみたいなので、ずぼらな私はまずJAXBでxsdからJavaクラスを生成させ、それをSimpleXMLにあうように変更しました。かなり簡単で、例えばあるクラス内にStringの変数があったとしたら<br /><pre><br />（JAXB）<br />@XmlAttribute(required = true)<br /> protected String id;<br /><br />(SimpleXML)<br />@Attribute (required=true) <br />protected String id;<br /></pre><br /><br />ってな感じ。required=trueは、その要素を必ず持つ必要があるようにスキーマが定義されていれば、JAXBと同じように生成します。<br />また、子要素が複数あらわれるようなタグに関して、JAXBではListを使った変数が生成されますが、それも、<br /><br /><pre><br />(JAXB)<br />protected List<Test> testValues;<br /><br />(SimpleXML)<br />@ElementList (inline=true,required=false) <br />protected List<Test> testValues;<br /></pre><br /><br />ってな感じです。このinline=true というのが、あるとなしだとSimpleXMLがJavaオブジェクトから生成するXMLがかなり変わって、<br />inline=false の場合、<br /><br /><pre><br />&lt;data><br />   &lt;test class="java.util.ArrayList"><br />      &lt;test id=&ldquo;hoge&rdquo; value=&ldquo;hoge&rdquo;/><br />      &lt;test id=&ldquo;&rdquo;hoge2 value=&ldquo;&rdquo;hoge2/><br />   &lt;/test><br />&lt;/data><br /></pre><br /><br />このように、<pre>&lt;test class="java.util.ArrayList&rdquo;>&lt;/test></pre> とくっついてきちゃいます。<br />inline=trueにすると、<br /><br /><pre><br />&lt;data><br />      &lt;test id=&ldquo;hoge&rdquo; value=&ldquo;hoge&rdquo;/><br />      &lt;test id=&ldquo;&rdquo;hoge2 value=&ldquo;&rdquo;hoge2/><br />&lt;/data><br /></pre><br /><br />と、（私が）意図したとおりのスキーマに従ったXMLが生成されます。<br />SimpleXMLでJavaオブジェクトからXMLを生成する（JAXBでいうmarshaller）のは、例えばDataクラスが定義されてるとして、<br /><br /><pre><br />public String dataToXml(Data data){<br />		StringWriter writer= new StringWriter();<br />		Serializer serializer = new Persister();<br />		try {<br />			serializer.write(data, writer);<br />		} catch (Exception e) {<br />			e.printStackTrace();<br />		}<br />		return writer.toString();<br />}<br /></pre><br /><br />みたいな感じで、簡単。<br />JAXBでXMLから生成したJavaクラスからSimpleXML用のJavaクラスに変更Scriptもわりと簡単に書けそうなので、あってもよさそう。<br /></span>]]></content:encoded></item><item><title>Android + XMPP</title><dc:subject>Note</dc:subject><dc:date>2012-12-21T04:38:05+01:00</dc:date><link>https://www.takuroyonezawa.info/blog/files/d76d39597eb0925dffa6dddbf2a31fe6-0.html#unique-entry-id-0</link><guid isPermaLink="true">https://www.takuroyonezawa.info/blog/files/d76d39597eb0925dffa6dddbf2a31fe6-0.html#unique-entry-id-0</guid><content:encoded><![CDATA[XMPP for Android <span style="font:12px HiraKakuProN-W3; ">について。<br /></span>XMPP for Java<span style="font:12px HiraKakuProN-W3; ">には</span>smack<span style="font:12px HiraKakuProN-W3; ">があり、</span>Android<span style="font:12px HiraKakuProN-W3; ">には</span>smack<span style="font:12px HiraKakuProN-W3; ">にパッチをあてた</span><a href="https://code.google.com/p/asmack" target="self">asmack</a><span style="font:12px HiraKakuProN-W3; ">があるようだけど、</span>asmack<span style="font:12px HiraKakuProN-W3; ">のメンテナンス状態はよくないみたい。</span><br /><span style="font:12px HiraKakuProN-W3; ">普通にそこのを使って</span>smack<span style="font:12px HiraKakuProN-W3; ">ぽくプログラムを書いてくと、色んなエラーが出る感じ。</span><br /><span style="font:12px HiraKakuProN-W3; ">ググったところ、</span>asmack<span style="font:12px HiraKakuProN-W3; ">の派生がいくつかでてるみたい。<br /></span><span style="font:12px HiraKakuProN-W3; "><a href="http://beem-project.com/projects/beem" target="self">Beem</a></span><span style="font:12px HiraKakuProN-W3; ">内部で使ってるasmackとか、</span><span style="font:12px HiraKakuProN-W3; "><a href="https://github.com/Flowdalic/asmack" target="self">ここ</a></span><span style="font:12px HiraKakuProN-W3; ">には</span>asmack<span style="font:12px HiraKakuProN-W3; ">の派生の</span>build environment<span style="font:12px HiraKakuProN-W3; ">があって、元々のasmackよりはよさげ。<br />けど、PubSubManagerクラスのgetNodeメソッドなんかを使うあたりで、"java.lang.ClassCastException: org.jivesoftware.smack.util.PacketParserUtils&hellip;" というエラーなどがでて詰んでいる人がググったら見受けられる。<br /><br />きちんと動かすには、</span>XMPPConnection<span style="font:12px HiraKakuProN-W3; ">を使う前に、</span><br /><br /><pre>org.jivesoftware.smackx.ConfigureProviderManager.configureProviderManager();</pre><br /><br /><span style="font:12px HiraKakuProN-W3; ">を呼んだり、</span>KeyStore jks implementation not found <span style="font:12px HiraKakuProN-W3; ">なので、</span>bks<span style="font:12px HiraKakuProN-W3; ">に設定したり、</span><br /><span style="font:12px HiraKakuProN-W3; "><br />例：</span><br /><pre>config.setTruststoreType("BKS"); <br /><br />config.setTruststorePath("/system/etc/security/cacerts.bks&rdquo;);</pre><br /><br /><span style="font:12px HiraKakuProN-W3; ">同じく</span>Provider<span style="font:12px HiraKakuProN-W3; ">を明示したり、<br /><br />例：<br /><br /><pre>ProviderManager pm = ProviderManager.getInstance();<br />pm.addIQProvider("pubsub","http://jabber.org/protocol/pubsub", new org.jivesoftware.smackx.pubsub.provider.PubSubProvider());<br />&hellip;</pre><br /></span><br /><span style="font:12px HiraKakuProN-W3; ">などと、色々と</span>smack<span style="font:12px HiraKakuProN-W3; ">にはない手続きを踏ます必要がある。更に、Subscribeされたデータを読むと、データがあるはずなのにnullってなっちゃったりする。これはXmlPullParserがうまくパースしてくれてないみたいなので、</span><span style="font:12px HiraKakuProN-W3; "><a href="http://code.google.com/p/asmack/issues/detail?id=24" target="self">強引に直す</a></span><span style="font:12px HiraKakuProN-W3; ">。例えば、org.jivesoftware.smackx.pubsub.provider.ItemProvider.java の中を、<br /><br /><pre><br /></span><span style="font:12px HiraKakuProN-W3; ">				if (parser.getEventType() == XmlPullParser.START_TAG) {<br />						payloadText.append("<").append(parser.getName());<br />						int n = parser.getAttributeCount();<br />						for (int i = 0; i < n; i++) {<br />							payloadText.append(" ").append(<br />									parser.getAttributeName(i)).append("=\"")<br />									.append(parser.getAttributeValue(i))<br />									.append("\"");<br />						}<br />						if (parser.isEmptyElementTag()) {<br />							payloadText.append("/>");<br />							degenerated = true;<br />						} else<br />							payloadText.append(">");<br />					} else if (parser.getEventType() == XmlPullParser.END_TAG) {<br />						if (degenerated)<br />							degenerated = false;<br />						else<br />							payloadText.append("</").append(parser.getName()).append(">");<br />					} else if (parser.getEventType() == XmlPullParser.TEXT) {<br />						payloadText.append(parser.getText());<br />					}<br /><br />					tag = parser.next();<br />				} <br /></span><span style="font:12px HiraKakuProN-W3; "></pre></span><br /><br /><span style="font:12px HiraKakuProN-W3; ">こういう感じの処理を追加。ライブラリのソースをいじるのは気が引けるけど、仕方ない。。</span>]]></content:encoded></item></channel>
</rss>