MAハッカソン信州2017に参加しました。

ようやくブログ記事にしていますが、2017/11/02(木)-03(金)に開催された「塩尻ハッカソン予選 #MA_2017 求むトガった作品!! – connpass」に参加しました。結果はMAハッカソン信州2017 – GDG信州にあります。

今回は、開閉を無線で簡単にチェックできるデバイスを使って「プチセコム」を実装するというチームに参加しました。プチセコム機能は「Kobayashi Yasuaki(@nanapapa2004)さん | Twitter」が結構進めていたので、サーバーへデータを蓄積するための部分を興味があったMilkcocoaを使って実装するところを担当しました。Milkcocoaのドキュメントは「Document | Milkcocoa」で公開されています。

「プチセコム」チームに参加する前にハッカソンで何を作るかのアイデアを考える時間がありました。アイデアを考えるのはトレーニング的な感じで、最近は発想力がなくなってきたなぁ、と思いながらやっていました。いや、前からあまりないのですけどね…

それで、そこでは「みんなのアラーム」というアイデアを考えました。アラームをみんなで共有できたら楽しいかなぁ、と思っていて、例えば、好きなアイドルが起床のアラームをセットしたら同じ時間に起きたいファンの人もいるかもしれないじゃないですか。漠然としたアイデアなのですが、そんな感じのものです。

個人的にはスキルアップを目的として参加しているので、自分のアイデアには拘らず、他の人のアイデアにのってみることにしました。IoTの時代なので開閉センサーとかのアイデアは面白そうだと考えて「プチセコム」のチームに参加してみました。

防犯についてはあまり知識がないので、開閉センサーの面白そうな利用方法とかを考えていて、Webインタフェースも何で作るのがいいだろうかなぁ、と想像していたのですが、設計して機能を実装というところまでやるには時間が少なすぎてできませんでした。一度家に帰ってからラズパイのセットアップとかをしていたのですが、microSDへddコマンドで書き込みを何枚かしたり、PCとのLAN直結時のネットワークの設定について整理したり、いろいろやっていたら時間が過ぎてしまいました…

2017/11/03は会場についたら、@nanapapa2004さんと打ち合わせをして分担を決め、自分はラズパイ側でinotifywaitコマンドでファイル更新があったらMilkcocoaへデータを送信するという処理を実装することにしました。このコマンドは「inotify-toolsでファイルやディレクトリを監視する – Qiita」などに解説がありますが、プログラミング言語で通知を受ける部分を実装しなくても、シェルスクリプトで簡単に通知を受けることができるので、今回のような短時間で他のエンジニアが作成したプログラムとイベント通知でデータ転送をしたいというときには便利です。そうでないと、どの言語で、どのライブラリで、どんなインタフェースで、といった細かいことを決めないといけないので。これだと、更新するファイルの名前と中身のデータだけ決めておけばいいだけです。

例えば、/home/pi/data/ディレクトリーにあるファイル更新をしたら、app01.pyを実行したいということなら、下記のプログラムを用意して、ラズパイ起動時に実行するだけです。

src_dir=/home/pi/data
while inotifywait -e CLOSE_WRITE ${src_dir}; do
  # イベント検知で実行したい処理
  /usr/bin/python3 /home/pi/app01.py
done

このプログラム自体の停止方法については別途考える必要が本当はありますが、とりあえず動作させるということなら、これで大丈夫です。

問題のapp01.pyの方にMilkcocoaのプログラムを実装するわけですが、最初、言語はPython3でいいと考えていたのですが、チュートリアルを探していたらnodeだとラズパイで動くというものらしいコードがGitHubの「raspberrypi-example/pi at master · milk-cocoa/raspberrypi-example · GitHub」にあったので、これを参考にすることにしました。

Milkcocoaのユーザー登録は一瞬で終わり、コードもnodeでpackage.jsonを使って環境を用意して動かすだけなので、すぐ終わると考えていたのですが、ここではまりました…。サンプルはsetInterval()でポーリングをして取得したデータをサーバーへ送信するという処理になっているのですが、ここではinotifywaitコマンドを使う都合上、1回サーバーへデータを送信したらプログラムのプロセスは終了して欲しいところです。ということで、「milkcocoa.dataStore(‘light’).push({v : v});」相当の処理だけを実行するコードを動かしてみたところ、setInterval()を使っていないのにもかかわらず、プロセスが終了しません…

アドバイザーの「勝純一/じぇーけーそふと@jksoft913」さんにアドバイスをうけて動いたコードのサンプルが下記になります。なかなか一人では思いつかないですね…

var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('xxxx.mlkcca.com');
var old = 0;
var v = 1;
var ds = milkcocoa.dataStore('app01_test_data');
ds.on('push', function() {
  console.log('pushされました!');
  process.exit(0);
});
ds.push({v:v});
console.log('done');

pushイベントを監視するfunctionをds.on()で登録してから、ds.push()すると無事終了処理が呼ばれました。これで、無事データをMilkcocoaへ送ることができました!

やはり短時間で、完成に近いところまで作るというのは難しいですね。今回、「Inonic3(Build Amazing Native Apps and Progressive Web Apps with Ionic Framework and Angular)」を使ってWeb画面を作成してみたかったのですが、環境を用意していなくて諦めました。やっぱり、短時間でやりきるというのは大変です。

個人的にはラズパイを使って、Milkcocoaも使って、楽しく時間を過ごせました。途中、@nanapapa2004さんにラズパイのバージョンを聞いて「新しいはず」と言われたので確認したら「Debian Stretchベース」ではなくて前のバージョンである「Debian Jessieベース」だと判明して「前日聞いておけば、わざわざ家で自分用のラズパイのOSを最新版にする必要がなかったなぁ」とちょっと後悔したり、ももくろの好きな音楽が流れて嬉しかったり、ハッカソンも佳境の頃にBABYMETALの音楽が流れて踊りつきのミュージックビデオを観たくなってしまったり、いろいろありました。

優勝はできませんでしたが、Milkcocoaを使ったことから、ウフル賞をいただけました。ちょっとしか使っていないのですが、賞をもらえて嬉しかったです! 記念にいただいた賞品のうちのボールペンを写真であげておきます。

「もう少し、日頃からいろいろと汎用性の高いコードを書いて、こういうときに使えるようにしておきたいなぁ」とも思いました。

最後に運営の皆様、関係者の皆様、良い機会をありがとうございました!

同じカテゴリの記事: General
同じカテゴリの記事: Linux