Hatena::ブログ(Diary)

shutdown -r now このページをアンテナに追加 RSSフィード Twitter

2013-01-31

「ものアプリハッカソン」というイベントに参加してきました

ものアプリハッカソン

1月の26日(土)、27日(日)の2日間にわたって「ものアプリハッカソン」というイベントに参加してきました。

プログラム系の「ハッカソン」はよくあるのですが、ハードウェア系のものづくりを含めた「ハッカソン」は世界的にみても珍しいらしい。

そしてその主催は、なんと自体対である大阪市であった。「ハッカソン」の当日まで、僕はこのイベントをなめていた。いや、なめきっていた。単に、ArudinoとAndroidを接続するサンプルプログラムをワークショップで手とり足取り教えてもらう感じなんでしょ。と簡単に考えていた。むしろ、そんなに丁寧に教えてもらっても、むしろウザいとさえ考えていた。そう、当時のイベントのタイムスケジュールを見るまでは。。

タイムスケジュールは、5分刻みでびっしり埋まっていた。9時開始で、1日目は、20時まで、細かくびっしり埋まっていた。

1日目は、参加者が10チームに分かれて、今回作成するプロダクトのコンセプトを考える。

コンセプトの考え方をワークショップ形式で、コンサルタントの方が教えてくれた。今回、教えてくれた「コンセプトの創り方」は、これまで教わってきたなかで一番マトモだった手法だった。一番マトモというより、実際やってみて、なるほどと思うことが沢山あった。何よりも面白かったのは、そのコンサルタントの人生だったが。

山口高弘さんという方で、元ムエタイ 親父さんが変わった人らしく、中学のときに義務教育もおわっていないのに修行のため、タイに送られムエタイをならっていたらしい。その経歴にノックアウトされ、他のことはいっさい頭に入らなかった。っていうかどうやって、コンサルタントという普通の道に戻ってこれたのですか?懇親会の時にそこら辺をじっくり聞けばよかった。。

コンセプトの創り方

で、「コンセプトの創り方」の手順は以下の手順で考えていく。

1.実在の一人のユーザを発見する。

これから作成するプロダクトを実際に必要としている人をみつける。というより、まず問題をかかえている実際の一人のユーザを見つけて、その問題を解決するプロダクトを作成するかんじ。決して、セグメントやターゲッティングのようなキーワードでユーザをみつけずに実在の一人を見つけるのがポイント。

2.ユーザの問題とその目的(ニーズ)を定義し、更にその目的に隠されている本当の目的(インサイト)を発掘する。

隠されている本当の目的(インサイト)を発掘するのが、ポイント。これが実に難しい。仕事がら、お客さんから、新サービスを考えて欲しいとか、新機能を考えて欲しいとか求められるけれど、斬新なサービスがまったく思いつかない。サービス系だけでなく、業務システムの要件定義とかでも、単にニーズレベルまでしか検討していなかった。ニーズとニーズがトレードオフになったり、制約条件になったりした際にうまく解決できていなかった。

3. バイアスブレイクする。

バイアスって何?って感じだったけど、バカがバレるのが恐ろしくて周りの人に聞けなかった。。っていうか時間が短かすぎて、そんな場合でなかった。その時のニュアンスでは常識かなと思っていたが、今調べてみると「偏り(かたより)」ということらしい。ふーん。

バイアスブレイクするために、切り口や前提条件を逆にして、プロダクトを考えてみるとよいらしい。VPSの前提条件は、持ち運べないだが、前提条件を逆にして持ち運べるにして、USBメモリになるみたいな。切り口と前提条件をマトリックスにして、最初に考えたプロダクトとそれぞれを逆にした3種類を満たす別のプロダクトを考えて最初のプロダクトと検討する。時間が足りなくて、さっぱり思いつかなかったが、チームの若い奴が逆のプロダクトを考えついた。すばらしい。大体、最初に思いつくプロダクトよりも、逆の切り口や前提条件で考えたプロダクトの方がよいものがでる確率が高いらしい。僕達のチームでもそうだった。

4. 複数の問題を1つの案で解決する

複数の問題を1個、1個つぶしていくのではなく、1つの案で一気に解決できる案を採用するらしい。この辺は力と時間が足りずに辿りつけなかったように思う。


という感じでプロダクトのコンセプトを作って、プロトタイプとして、それを説明する紙芝居を作って、発表した。10チーム中上位5位のプロダクトが一次予選通過ということになり、実際に次の日に製品を作ることになる。予選で落ちたチームは、上位のチームに編入されることになる。なんと僕達のチームは、1位で通過した。俄然盛り上がるチームメンバ。

これは徹夜で作業か?とも思ったが、体力が持たないので、役割分担だけ決めて、さっさと帰ってしまった。

なんとこの時に午後10時。当初のタイムスケジュールがタイトだったので、1時間程度押してしまったのだろう。。

初期メンバも優秀だったが、追加で入ったメンバも優秀だった。メカデザインに優れている人やArudino、電子回路に詳しい人が入り、鬼に金棒なメンバ構成になった。

さて実装

2日目に入り、作業が始まった。僕達のプロダクトは、冷蔵庫の中に入れる卵型のリモート監視カメラだ。

離れてくらす一人暮らしの娘と心配性の母親のコミュニケーションを手助けするプロダクトだ。コミュニケーションを手助けすると言っても、子供側は、親から干渉されるのを嫌いできるだけコミュニケーションコストを少なくしたい。母親は、コミュニケーションを沢山取り満足したい。相反するニーズを解決するために、冷蔵庫の中身をカメラで監視させて、料理のレシピを母親が考えて娘に伝え、娘はそれに対して、「いいね」を返すだけ。というプロダクトになった。

2日で作ったものが、これです。

f:id:forest1040:20130127183638j:image

f:id:forest1040:20130127183759j:image

卵型の模型のなかにAndroid携帯とサーボモータが入っています。サーボモータは、横の牛乳パックに入ったArudinoで管理します。Android携帯には、アプリが入っており、それが写真を取って、WebSocketを使ってNode.jsのサーバに送ります。ArudinoもWebSoketを使って、駆動させることができます。

1日でここまで実装できるもんなんですね。

Androidアプリ制作

僕は、Androidアプリを担当することになりました。卵の模型にいれるために、すこし前の携帯を使いました。そのためか、普通のカメラを取るAPIでは、エラーになり苦戦しました。時間が限られているため、エラー追求せずに他の動作するアプリの手法を採用することにしました。「WSCamera-for-Android」というオープンソースのアプリがあり、そのソースコードを流用させて頂いた。カメラのプレビューを表示しておき、そこから画像を頂く感じの実装だ。

WebSocketは、「Android-SocketIO」を流用しました。

ArudinoでもWebSocketが使いたいのだが、WebSocketのバージョンの問題等でなかなかつながらない。そもそも、Arudino Wifiシールドの性能が悪いのか、はたまた会場のルータの調子が悪いのか、いろいろな問題が複数かさなり開発は難航した。開発時間も6時間程度しかない。。そして、僕のアプリは、写真すら取れない。。午前中は、「無理だ。無理だ。無駄無駄無駄無駄、ムダ、むだ、むだ。無、無、ム、む、む。。」と瞑想していた。

午前中に写真が取れるようになったけれど、WebSocketと連携させるのに難航した。最近のWebSocketの動向を追いかけていなかったのが辛い。。しかし、このイベントはハッカソン。新しい技術を使わないと意味ないじゃんと思い頑張った。

しかし、他の皆さんは、すごかった。とにかく仕事が速い。自分も速い方だと思っていたけれど、まだまだだった。というか、Androidアプリが動かなくてお荷物状態だった。終了の2時間前ぐらいにやっと動作するようになったのだけれど、それまでは、針の筵の上だ作業している心境だった。

なんとか動作するようになってよかった。いろいろ微調整すればよかったのだけど、精神的に無理だった。画像の方向やWebSocketが切れた時のリトライや、いろいろ調整すべき所はあるのだけれど無理だった。

そして伝説へ

最終的に動作させることができて、勿論プレゼンではうまく動かなかったけれど、僕は満足していた。久しぶりに自分の限界を超えられた気がする。たった2日間一緒に作業しただけなのに、このメンバーとは、死線をくぐった戦友のような感覚だった。

様々な分野の人と一緒に作業して、ひとつのプロダクトを作るという、すごい貴重な体験ができた。

このイベントに参加できて、すごくうれしい。一生の宝物だ。

2013-01-18

ARToolKit on Ubuntu 12.10 64bit

今更ながら、ARToolKitで遊んでみようと思い環境構築。

Ubuntu 12.10の64bit版にインストールしてみた。ARToolKitは、2.72.1を使用。

Old: Ver.1 - 3: ARToolKitをLinux(Ubuntu)上のUSBカメラで動かそうlentinjoseph/Artoolkit-on-Ubuntu-12.04 ? GitHubに詳しい手順が載っているのだが、32bit版の手順だった。

64bit版の場合、「./Configure」の2番目の質問にnoと答えて、64bitを主張したら、以下のエラーになってビルドに失敗した。

/usr/src/linux-headers-3.2.0-36-generic/include/linux/types.h:13:2: 警告: #warning "Attempt to use kernel headers from user space, see http://kernelnewbies.org/KernelHeaders" [-Wcpp]
cc -o ../../bin/videoTest videoTest.o  -L/usr/X11R6/lib -L../../lib -lARgsub -lARvideo -lAR -lglut -lGLU -lGL -lXi -lXmu -lX11 -lm -ljpeg
../../lib/libARvideo.a(video.o): In function `ar2VideoGetImage':
video.c:(.text+0x1b26): undefined reference to `ccvt_yuyv_rgb24'
collect2: ld はステータス 1 で終了しました

エラー内容でググってみたら、どんぴしゃの回答があったこれです。

patchファイルもこのページのpatchファイルだけでOKなので、これだけあててビルド。

ライブラリが足りない場合は以下をインストール。

$ sudo apt-get install freeglut3-dev libglew1.5-dev
$ sudo apt-get install libxmu-dev libxi-dev
$ sudo apt-get install libjpeg-dev

ビルド手順

$ tar xvfz ARToolKit-2.72.1.tgz
$ patch -p0 -d . < artk-yuv422-v4l2-2.72.1.20090801.patch
$ cd ARToolKit
$./Configure

# 質問には、最初だけ3と答えて後は、全部 n

$ make

# USBカメラをさして、起動

$ cd bin
$ ./simpleLite

ARToolKit/patterns にマーカのpdfが入っているので、カメラにpattHiro.pdfを写すと虹色キューブが表示される。

2012-12-21

MPLABXをv1.51にバージョンアップ

新しい環境「Ubuntu 12.10」を構築したので、そこにMPLABXのv1.51をインストールしてみた。

v1.51は、JDK6が入っていなくても大丈夫になっている。JDK7しか入れていないのに大丈夫だった。

それで気をよくしていたのだが、日本語が文字化け。。

ということで、JAVA_HOMEのjre/lib/fontsにfallbackを作って、フォントのシンボリックリンクを作る

というよくある作業をやってみたのだが、文字化けが治らない。。

おかしいと思い、いろいろ調べてみた。MPLABXは、Netbeansベースである。すると驚愕の事実が。。

MPLABXのインストールディレクトリ配下の設定ファイル、例えば、 /opt/microchip/mplabx/mplab_ide/etc

にmplab_ide.confという設定ファイルがある。

ここを除くとなんと

jdkhome="/opt/microchip/mplabx/sys/java/jre1.6.0_33/"

と書いてある。実は、MPLABXをインストールすると、もれなくjre1.6がインストールされるようだ。インストール時にそんなオプションあったっけなぁ。。

ここを変更するか、この環境に日本語フォントの設定をしないと文字化けが治らない。

なんじゃそれ!

ちなみに、mplab_ide.confのdefault_optionsに以下を設定してやるとメニューが見やすくなる。

-J-Dawt.useSystemAAFontSettings=lcd --laf Metal

参照情報

UbuntuにNetBeans IDE 7.2をインストールする手順 - Rails 雑感 - Ruby on Rails with OIAX

2012-11-24

MAPLABXに移行中

MAPLABからMAPLABXに移行してみた。

MAPLABをさわってから、MAPLABXをさわると、いろいろなオプションや設定の意味が少しはわかるようになっていた。まだ、謎オプションは沢山あるが、きっとそのうちわかるようになるだろう。。

MAPLABXのバージョンは、1.30だった。現在、1.41で私も1.41にアップデートしているが、1.30のときの手順をメモしておく。

  • 1.30の場合、JDK7を使用しているとJDKを入れろと怒られる。素直にJDK6を入れる。
  • JDK7で、MAPLABXを起動すると、Pickit3を認識しないことが多々ある。素直にJDK6をJAVA_HOMEに設定して、JDK6のjreから起動するようにする。
  • 文字化け対策 Javaのアプリではよくある文字化け対策が必要。
1.フォントを格納するフォルダを作成
# sudo mkdir -p $JAVA_HOME/jre/lib/fonts/fallback

2.フォントをコピー
# sudo cp /usr/share/fonts/truetype/takako/* $JAVA_HOME/jre/lib/fonts/fallback/

フォントは、IPAフォントなどtakakoフォントではなくてもよい

※1.41にバージョンアップすると「ー」のフォントだけ、文字化け。よくある問題のような気もするが、とりあえず放置している。そのうち調べよう。。

MAPLABXからMAPLABのプロジェクトを開くためには、メニューから「File→Import→MAPLAB v8 Project」を選択して、プロジェクトを指定する。

なぜか、UART関係がビルドエラーになる。

「v2012-08-22」で、STACK_USE_UARTを有効にする(TCPIPConfig.hで、「#define STACK_USE_UART」を定義する)と「include/TCPIP Stack/」の下のuart.hをインクルードしようとするが、「v2012-08-22」にはそんなものはない。「v2010-10-19」にはある!なんじゃそりゃー。これは、MAPLABXには関係ない問題だなぁ。

後で調べよう。。

ということで不完全ではあるが、MAPLABXに移行はできた。

しかし、使用するライブラリによってはMAPLABXではビルドに失敗する場合がある。

mplabc18のlibが参照できていないのかなぁ。。


(12月21日追記)

ライブラリを「v2012-10-15」に上げるとuart.hがない問題はなくなっていた。。

2012-11-22

KBC-P18LAN2のサンプルコードのライブラリをバージョンアップ

「KBC-P18LAN2」のサンプルコードのライブラリを「v2010-10-19」から「v2012-08-22」にバージョンアップしてみた。

その時の備忘録。

Microchip社のライブラリは、ヘッダファイルとコンパイルオプションを駆使して

いろいろなPICといろいろな使用方法に対応できるようになっている。

TCPIPのライブラリだけでも、IP/UDP, DHCP, DNS等々、使うモジュールを設定できるようになている。

しかし、テキトウに設定してしまうと、ヘッダファイルのインクルード地獄に落ちてしまう。

「v2010-10-19」から「v2012-08-22」にバージョンアップする場合、以下にあげる2つ問題があった。

The extended CPU mode対策

ビルド時に以下のエラーがでる場合は、コンフィギュレーションビットの設定ができていないため。

"The extended CPU mode configuration bit is enabled, but the program that 
was loaded was not build using extended cpu instructions" 

ソースコードで設定するため、以下のようにする。

#define THIS_IS_STACK_APPLICATION
を#include "TCPIP Stack/TCPIP.h"の前に宣言する。

「Invalid MAX_UDP_SOCKETS value specified 」対策

TCPIPConfig.hから以下をコメントアウトする

※サンプルの場合は、「TCPIPConfig ENC28J60 ETH97J60.h」

#include "TCPIP Stack/TCPIP.h"


しかし、いろいろやっかいだった。ビルドエラーの内容と対策が一致していない。ライブラリのヴァージョンが違うだけでいろいろと変わってくる。

原因をつきとめて、そのために必要な設定(#defineや#ifdef等)を通すためには、なにを定義しておかないといけないかを調査しないといけないため、煩雑だ。

最初に何もしないTCPIPライブラリをリンクするプログラムを作って、だんだんリンクするモジュールを増やしてひとつひとつ、潰していった。

こういう作業は非生産的で、いらいらするが、やっているうちに楽しくなってくるから自分はこの仕事に向いているのだろう。。