ハッカソンデビュー
先日、社内のハッカソンイベントに参加してきました!
ハッカソン自体、初参加なのでいろいろ学ぶべきところは多かったです。。。
ハッカソンって何さ?
端的に表現すると、
”ハック” × ”マラソン” = ”ハッカソン”
です
短期間(今回は2日)でサービスの考案、開発、プレゼンまでを行って、アイデアと技術を競い合うというイベントです
今回つくったもの
今回は「未来(2017〜2020年)」がテーマです。
うちのグループでは以下のようなサービスを作りました。
- ICタグで冷蔵庫の在庫管理
- Webから在庫情報を閲覧可能
- 賞味期限が近い食材を使ったレシピを推薦
わいが担当したのは
です。
ICタグで在庫管理 〜ICタグリーダー
理想は有効範囲が広いRFIDリーダーを使いたかったのですが、開発期間が短いこともあり今回はNFCで妥協することにしました。(最大の妥協)
NFCリーダーは最近のandroidならばどの端末にも組み込まれているので、androidアプリとして実装しています。
あくまでもプロトタイプなので、色々な理想を忘却して最大限実装を簡略化しています
- 商品タグのIDを読み込む
- http://XXX.com/api/【商品タグID】にリクエスト送信、API側で商品タグIDを抽出、在庫更新
ソースはこんな感じ
public class MainActivity extends Activity { //APIのURL private static final String sURL = "http://hackson-10-112187.nitrousapp.com/api/v1/stocks"; StringBuilder sb = new StringBuilder(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView text = (TextView)findViewById(R.id.tag_id); //EXTRA_ID出力領域 TextView text_tag = (TextView)findViewById(R.id.tag_tag); //EXTRA_TAG出力領域 // インテントの取得 Intent intent = getIntent(); String action = intent.getAction(); if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { // NFCからID情報取得 byte[] ids = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); for (int i=0; i<ids.length; i++) { sb.append(String.format("%02x", ids[i] & 0xff)); } text.setText(sb.toString()); // NFCからTAG情報取得 Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); String techStr = ""; for (String tech : tag.getTechList()) { techStr = techStr + tech + "\n"; } if (techStr.equals("")) { techStr = "no techList."; } //TechListを表示 text_tag.setText(techStr); } //GETリクエスト new Thread(new Runnable() { @Override public void run() { try { HttpClient httpClient = new DefaultHttpClient(); //APIにリクエスト送信 HttpGet httpGet = new HttpGet("http://XXXX.com/api/" + sb.toString()); HttpResponse httpResponse = httpClient.execute(httpGet); String str = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); } catch(Exception ex) { } } }).start(); } }
ICタグで在庫管理 〜API
APIは以前Grapeで作成したものを持ち込んでちょろっと改修しようと思ってたのですが、デモ環境で動かず5時間の苦戦のうえ泣く泣くあきらめました。。。
結局Railsで作成したWebアプリのコントローラーでリクエストを受けることにし、30分くらいで作成。
APIなのでコントローラーからは独立させたかったのですが。。。
所詮プロトタイプなのでそういうこだわりは捨てて手っ取り早く実装しちゃうのが吉ですね
開発・デモ環境について
gitを準備する時間も惜しいということで今回はnitrous.ioというオンラインのIDEをチームで使用しました。
結構優れもので、同じソースを複数人で改修していても他の人の追記部分がリアルタイムで反映されるため手軽に共同開発するには向いていると思います!
ただ今回は失敗でした。。。というのも
- 備え付けのLAN環境が激遅で他人の改修が自分の編集画面に反映されるのに遅延が多発、結果コーディングしたはずの箇所が消えるということが何回も起きました
- LAN激遅につき、コーディングしてる最中に何回も画面が読み込み中になり作業が止まる
- 挙句の果てに実装して保存、サーバを起動しても追記内容がサーバに反映されていない
等々、今回の設備環境には向いてなかったみたいです。
やはりgitを入れとくべきでしたと反省。
完成
朝04:30までプレゼンの準備、フロントの作成等黙々と作業をした結果、こんなのができました。
(デザインのクオリティが予想してたよりも遥かに高い!Webアプリ担当の方おつかれさまでした)
終えてみての感想
システムの完成度は重要じゃない
サービスのコンセプト、魅力的なプレゼンが極めて重要だと感じました。極端な話、実装はモック程度でよい気がします。今回うちのチームは実装に大半の時間を費やしたのでここをプレゼンのブラッシュアップにあてればよかったですね。