susunshunのお粗末な記録

お粗末に丁寧に生きる

ハッカソンデビュー

先日、社内のハッカソンイベントに参加してきました!

ハッカソン自体、初参加なのでいろいろ学ぶべきところは多かったです。。。

ハッカソンって何さ?

端的に表現すると、
”ハック”  × ”マラソン” = ”ハッカソン”
です

短期間(今回は2日)でサービスの考案、開発、プレゼンまでを行って、アイデアと技術を競い合うというイベントです

r25.yahoo.co.jp

今回つくったもの

今回は「未来(2017〜2020年)」がテーマです。
うちのグループでは以下のようなサービスを作りました。

  • ICタグで冷蔵庫の在庫管理
  • Webから在庫情報を閲覧可能
  • 賞味期限が近い食材を使ったレシピを推薦

わいが担当したのは

です。

リーダーから読み込んだ商品情報をAPIに送信、APIで在庫更新という感じですね。

ICタグで在庫管理 〜ICタグリーダー

理想は有効範囲が広いRFIDリーダーを使いたかったのですが、開発期間が短いこともあり今回はNFCで妥協することにしました。(最大の妥協)
NFCリーダーは最近のandroidならばどの端末にも組み込まれているので、androidアプリとして実装しています。

あくまでもプロトタイプなので、色々な理想を忘却して最大限実装を簡略化しています

  1. 商品タグのIDを読み込む
  2. 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をチームで使用しました。

jp.techcrunch.com


結構優れもので、同じソースを複数人で改修していても他の人の追記部分がリアルタイムで反映されるため手軽に共同開発するには向いていると思います!

ただ今回は失敗でした。。。というのも

  • 備え付けのLAN環境が激遅で他人の改修が自分の編集画面に反映されるのに遅延が多発、結果コーディングしたはずの箇所が消えるということが何回も起きました
  • LAN激遅につき、コーディングしてる最中に何回も画面が読み込み中になり作業が止まる
  • 挙句の果てに実装して保存、サーバを起動しても追記内容がサーバに反映されていない

等々、今回の設備環境には向いてなかったみたいです。

やはりgitを入れとくべきでしたと反省。

完成

朝04:30までプレゼンの準備、フロントの作成等黙々と作業をした結果、こんなのができました。
(デザインのクオリティが予想してたよりも遥かに高い!Webアプリ担当の方おつかれさまでした)

f:id:susunshun:20150719183854p:plain

終えてみての感想

システムの完成度は重要じゃない

サービスのコンセプト、魅力的なプレゼンが極めて重要だと感じました。極端な話、実装はモック程度でよい気がします。今回うちのチームは実装に大半の時間を費やしたのでここをプレゼンのブラッシュアップにあてればよかったですね。

テーマはやはり”社会課題の解決”×”IOT”がウケる

社会課題はもちろん重要なテーマです。
ただテンプレすぎてツマらないということで敢えて避けたのですが、賞を貰っていたチームは高齢化社会インバウンド需要など軒並み最近よく聞くテーマでしたね。。。
そういう大きなテーマの方が気持ちも乗りやすいので次に参加する際には手を出してみようと思います。

色々ありましたが楽しい!

うちのチームは残念ながら受賞ならず。。。でしたがビジネスを一から考えてサービスまで実装しちゃう、という経験はSIerではなかなかありませんので純粋に楽しかったですね。
スマートウォッチやキネクトを使ったグループもいましたが、そういう新しいことに手を出せるのも大きな魅力だと思います。

次こそは(来年?)受賞したい!