Dive into Ofuton

お布団に飛び込もう

下書き供養 楽天ハッカソンに言ってきた話(2014.11.01/02)

久しぶりにブログ書くか〜〜〜という気持ちがSoftSkillsを読んで湧いてきたので、書こうとしたらいつだかの下書きが出てきた。

楽天ハッカソンではMatzさんの話があって、最近Mastodon関係でも話を聞くことがあった。
なんかタイミングもいいなと思ったので、だいたいそのままで公開。

以下本文

11/1, 2日にあった楽天ハッカソンに行ってきた。

ちょっと振り返る

準備

当日になって0からスタートはやべえよなってことで、本検索APIAndroidから使えるかどうか試すところまでやった。

初日

9:30〜21:00というスケジュールをみて、10分前くらいに着けばいいかと思って楽天カフェを目指してみたら、9:30開場10:00開始だったようで、少し暇を持て余すことになった。
前日アルバイト先でリリースしたアプリに不具合が見つかったようで対応してくれというメッセージが飛んできており道中原因調査していたという話はおいておこう。

開場に到着して、名札に名前を書いたんだけど、ちょうど前にいた集団がみんなローマ字で書いていたので私もそれに倣ってローマ字で書いた。さすがグローバル企業楽天主催のハッカソンだと思っていたら、実はその集団は留学生だっただけで、別に英語で書く意味はなかった。

プロとアマの話

最初にまつもとゆきひろさんのお話があった。
スポーツの世界ではほぼ間違いなくプロが勝つが、プログラムの世界は少し違っているということだった。
多くのお金と人と時間をかけたプロダクトが必ずしも良くなるわけではなく、少人数でささっと作ったものが広まるということがよくあるということ。
人が増えるほど、コミュニケーションコストがかかり、柔軟性がなくなり、開発が進まなくなる。
周りからの期待が大きいほど、冒険ができなくなる。
この辺りの話はイノベーションのジレンマという言葉に集約されるのだろうか?

いま世界中で使われているものは、世に出た当初は「おもちゃ」扱いされていたということ。
「おもちゃ」と言われたら勝ち。

批判してくれる人に感謝しつつ、開発し続けよう。

チームビルディング

当日はチームビルディングの時間があった。
まず、どんなアイデアがあるのか、どういう人と組みたいのかというのを一人ずつ発表していき、その後の時間で組みたい人と話し合いながらチームを組むというもの。チームが決まり次第一緒に昼食を食べながら、アイデアを更に煮詰めていくようだ。

一人で開発する気満々だったんだけど、周りがどんどんチームを組んでご飯に行くのをみて若干不安を覚える。

気づいたら、ハッカソンに誘ってくれた友人と、koboで何かしたいと言っていた人と、楽天で公開されている全API叩くと言っていた人と、私のアイデアで優勝ですって人の5人だけになっていた。

進行係の人に、とりあえず飯に行ってこい会場を追い出され、近くのパスタ屋に入ることにした。
気づいたら全APIを叩くと言っていた人が消えていた。他のチームに吸収されたようだ。

結局、優勝アイデアを持ってる人も別のチームになったため、残り物の3人でチームを組むことになった。
チームOTS、結成の瞬間である。

何をするか

koboを使って、簡単に書籍のリコメンドができたらいいなと思っていた。
私は、最近話題になっていた、顔写真をから年齢、性別、感情などがわかるReKognizeというサービスを使って、本をおすすめ出来ないかなということを考えていた。
お昼一緒に食べてる時に、座席の空席状況kobo使って分かるといいよねっていうアイデアが出てきたりもした。

今回チームの3人で得意なものが、私→Android、ほか2名→サーバー側だったのでうまいこと分担する必要があった。
座席状況は店内のkobo以外からも見れる必要があるのでサーバーが必須だとして、顔の写真を撮って本をおすすめするところは頑張ればAndroidですべて完結するのだ。それをすると、そう、俺が死ぬ。

なので、顔写真を撮ってReKognizeに投げるところはAndroidでやり、返ってきた情報を元にクエリを作って本をおすすめする部分はサーバー側でやることになった。

分担をまとめると、

私:Android(顔写真)
友人;サーバー(書籍リコメンド)
メンバー:サーバー(空席状況)

となって、作業量的にもちょうどいい感じっぽくなった。

開発タイム 1日目

開発中はひたすらもくもくと開発していた。
カメラの部分については、ちょうどバイト先でカメラアプリを作っているのもあり、ハマりどころにはことごとくハマっていたおかげでかなりスムーズに実装できた。
21時までに、顔写真取得して、ReKognizeに投げて、結果のJSONを書籍リコメンド用サーバーに投げるところまでいって、会場をあとにした。
おやつが最高だった。

開発タイム @ごみばこアジト

友人のおうちに泊まり込みで更に開発。
残念ながらkoboを持ち出せなかったので、自分のAndroidスマホデバッグしつつ開発していた。
koboとは内部的に持っている画像の向きが違っているせいでReKognitionでなかなか顔を検出できなかったり、
koboだと動かなかったAndroidのFaceDetectionListenerがちゃんと動いたりしてわけがわからなかった。
謎のテンションだったので、基本的に思考が口からダダ漏れだった気がする。

んで、顔認識したらその位置に矩形を表示しようとしてたらティンときた。

「顔認識できれば目の位置に楽天カード合成すりゃ楽天カードマンいけるんじゃね?」

というわけで、矩形表示ができるようになったら、楽天カードマンの実装を始めた。

「あー、動かん」
「なにこれ、動かん」
「あー」
「あーーーー」
「動いたアアアアアアァアアァッ」
「なんかずれてる」
「ヨッシャ」
楽天カードマーーーンwwww」

僕の方はだいたいこういう感じ。
友人の方は、感情やら年齢やらを元にうまいことクエリを作っていい感じの検索結果になるよう頑張ってました。

手巻きタバコとお酒おいしかったです。ありがとうございました。

2日目

2日目は、発表があるので15:30頃に開発終了だったため、あまりコーディングに割ける時間がなかった。
発表に向けたスライドをちょいちょい作りつつ、サーバー側との通信部分を実装した。
あと、本日のおすすめコーヒーという機能を友人が作ったので、それをクライアント側で表示できるようにした。

最後の方で、座席のところに顔写真載せるようにしたら面白いんじゃないかというアイデアが出て、ぎりぎりまで開発していた。
座席表の写真を楽天カードマンにしてやりたかったが、残念ながらできなかった。マジで残念。

ちなみに2日目もおやつが最高だった。

発表

いよいよ発表。
Android端末上のアプリをプロジェクターに映すので、設備の都合上一番最初の発表になった。
結果としてこれは結構ラッキーだったのではないかなって思う。

持ち時間が5分と短いこともあり、スライドは何故作ったのかというモチベーションについて、各画面のスクショと簡単な説明、アプリの構成というシンプルなものにした。

デモの部分では、せっかくメンバーが作ってくれた機能の一部を忘れるというポカをやらかしてしまった。
指摘してくれてありがとうございました。ごめんなさい。
Chromeで表示してバックグラウンドに残しておいて準備はしていたんだけどやはり人間焦るといけない。

最後に40秒くらい時間が余ったので、楽天カードマンモードを見せることができた。

楽天カードマンが表示された瞬間、会場が最高に盛り上がった。
インカメラ&縦画面のプレビューに綺麗にカード重ねるため費やした一晩の苦労が報われた。
最高。

結果発表

何か一つだけでも賞を取れてたらいいなあと思っていたら、一番最初のAPI賞で呼ばれた。
やった!賞取ったぞ!という気持ちと、API賞止まりか、という気持ちが半分ずつくらいな感じでした。
それから少し後に、kobo賞の発表があった。
kobo賞は別チームで良さそうなアプリがあったので、受賞はそのチームだろうと思っていた。
そしたらなんと司会の人が自分たちのチーム名を呼ぶじゃあありませんか!
これにはビビった。まさか2つも賞を取るとは…!
そして副賞はkobo arc7 HD。Androidの入ってるハイスペックなkobo。中身はTegra3でメモリ1GBなので、初代Nexus7と同じくらい、なのかな。
タブレットは前から欲しかったのでとても嬉しかった。

その後いくつか部門賞の発表が続き、最後に優秀賞、最優秀賞の発表。
wktk

他部門受賞がありということに気付いてしまったので、結構期待しながらドラムロールを聞いていた。

ドコドコドコドコドコドコ

\ジャン/

呼ばれたァアッァッァッァアァアアアアアァ

優秀賞きましたわー。

感動しました。

そしてなにより驚きました。

まさか3つも賞をいただけるなんて思ってなかったですもん。


========

下書きはここで終わってた。
読み返しながら当時のことを思い出して懐かしくなった。
ハッカソンに出るにあたって目標を決めていたんだけど、それについて全く触れていなかったので書く。

動くものを作る

これはハッカソンに出るからには絶対の目標だった。
デモがない発表は嫌なので。
多少不具合があってもとにかく動かせという気持ちでコーディングしていた。

就活

就活用のネタが欲しいなというのがそれなりにあった。
学部の頃にも就活をしたが、そのときは胸を張って言える成果物が全然なかったので苦い思いをした。
入賞すれば自信になるだろうし、出来なくても参加して人脈が出来たらラッキー、と考えていた。
結果としては入賞、しかも二部門+優秀賞なので、とても自身になった。

懇親会でも、心なしか声をかけてくれる人が多かったような、そんな気がした。
とは言え結局、その場で会った人たちと就活で接点はなかった。
自分からメールする勇気がなかったし、懇親会でもあまり話せなかった。

ネタを仕込む

これはちょっと最初から目標にしていたか?と言われると微妙なところ(夜中作業中に思いついただけなので)
だけどなんとなく、真面目なだけの発表だとつまらないよな、という気持ちはあった。

ハッカソンはこの一回しか参加したことがない。
振り返っているとまた行ってみたくなってきた。

BitConverterでGetBytesするよりポインタ使ったほうがメモリに優しい

ykimisaki.hatenablog.jp

byte[]に何かを変換するとき、BitConverter.GetBytesを使わない方がパフォーマンス出る。

GetBytesの中身を見ると、(当然といえば当然だけど)内部で引数の型の大きさ分だけbyte配列をnewしているため、ポインタを使って適当に用意したバッファを使い回した方がメモリに優しい。

GetBytes - http://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs,9108fa2d0b37805b,references

[System.Security.SecuritySafeCritical]  // auto-generated
public unsafe static byte[] GetBytes(int value)
{
    Contract.Ensures(Contract.Result<byte[]>() != null);
    Contract.Ensures(Contract.Result<byte[]>().Length == 4);

    byte[] bytes = new byte[4];
    fixed(byte* b = bytes)
        *((int*)b) = value;
    return bytes;
}

GetBytesを呼んだ回数だけbyte配列もnewされるため、適当にバッファ用意してそこにbyte[]に変換したものをコピーするとよい。
一番上のリンクだと、byte[1024]のバッファに、int[100]をまとめて突っ込んでいた。要点はこんな感じ。

byte[] buf = byte[4];

unsafe{
    fixed(byte* b = &buf[0]) // bufの先頭アドレスのポインタを作成
        *((int*)b) = value;// ポインタに値を入れる(bufに入る)
}

追記

UnityのmonoとBitConverterが微妙にコードが違ったのでこっち(mono/BitConverter.cs at Mono2.12.x-Unity4.x · Unity-Technologies/mono · GitHub)見たほうがいいかも

Android版IL2CPPがなんか遅い

Unity5.2からIL2CPPがAndroidでも使えるようになったみたい。
tsubakit1.hateblo.jp

Unity5.4.0b17時点でも、

IL2CPP on Android is experimental and unsupported

と書いてあるので、まだ実験段階な模様。

ほーん、どれぐらい早くなるんやー?と思って、Mathf.Atan2や、Vector3.DotなどをNexus5xで5,000万回実行して見たら、Atan2は2割くらい早くなって、Dotは逆に2割ほど遅くなった。

生成されるcppファイル読めばわかるのかな…

銭湯に行ってみた

機会があって上司と一対一で飲んでいたら、

「銭湯いいよ」

というアドバイスを頂いた。
一人暮らしでずっとシャワーだったのと、会社の往復しか外出する機会がなくなりつつあったので、この一週間は気分転換に徒歩圏内の銭湯を歩きまわってみた。

宝来湯

宝来湯 : 渋谷区 東京銭湯マップ

靴箱の鍵と脱衣所のロッカーの鍵を交換する。瓶の牛乳がおいてある。

広尾湯

広尾湯 : 渋谷区 東京銭湯マップ

普通。土曜夜だったけど空いてた。瓶の牛乳はない。

アクアガーデン三越

アクアガーデン三越湯 : 港区 東京銭湯マップ

綺麗。日曜夜だったせいか混んでた。瓶の牛乳はない。


風呂あがりは牛乳が一番ってことで宝来湯がベスト()

Xperiaの保護フィルム貼り替えようと思ったら飛散防止フィルムを剥がしていた

愛用しているXperiaZ1なのですが,最近どうもタッチパネルの反応が悪く,保護フィルム貼り替えたらちょっとはましになるかなーと思って貼り替えようとした時の話.

このツイートをしてすぐ,Amazonでポチりました.

nuglas ラウンドエッジ加工 日本産強化ガラス SONY Xperia Z1用 液晶保護フィルム

そして翌日(今日)届いていたのがこちら

最初,iPhone用のを買ってしまったのかと見直しました.本気でiPhone用買っちまったと思いました. 冷静にパッケージを見なおしたら,左下にfor Xperiaってシールが貼ってあるのに気づき胸をなでおろした次第.

GooglePlayに,AppStoreとスクショから完全に同じアプリが並んでるのと似たような心境になった.

保護シートを貼るにはまず前貼ってたシートを剥がさなきゃいけないので剥がしにかかったのですが,若干トラブル.

爪ではどう頑張ってもダメだったので道具を使ってみたけどなかなか剥がれず,結局小さいマイナスドライバーをスキマにねじ込んでようやく剥がせそうな雰囲気になった. この時点で,もしかしてこれ剥がしちゃヤバイタイプのやつかなという疑念が頭の端っこに生まれましたが,タッチパネルの反応が悪いのはこいつのせいだと決めてかかっていたのでとどめを刺してやった.

結果

あれ,前貼ってたやつが癒着しちゃってロゴごとくっついちゃったのか…?と思いつつ,明らかに手応えが保護シートを剥がすときのそれじゃなかったので,やっちまった〜〜〜って感じ.

まあ,届いた保護シートが隙間なく綺麗にはれたのでよしとする.

どうしてこうなったか

Xperia買ったのが今年の2月半ばとかで,すぐにケースも合わせて買ったんだけど,ケースってだいたいフィルムもついてるからそれを貼ったもんだと思い込んでいた. 今思い返すと,すでに貼ってあるし二重にはらなくていいかなっていう風に考えたような気がしなくもない.

結論

保護シート貼り替えるときは気をつけよう!!!!

オープンソースカンファレンス行きたかった

行くからにはなにかネタを持って行こうと思って,Xperia Z1にmikutter突っ込んでたら夜遅くなって,今までの寝不足と重なって死んでしまった.

次の東京開催は行く.と思う. OSPN - We Are Open!!

RaspberryPiハッカソンに行ってきた

おとといRaspberryPiハッカソンなるものがあったので行ってきました.

成果

3行でまとめると,

  • カメラモジュール
  • OpenCV
  • 顔が写ったら保存

以上です.

ハッカソンで使ったRaspberryPi B+とカメラモジュールv1.3とOS入りmicroSDカードもらいました.
やったね

購入した周辺機器

自宅でRaspberryPiをいじるにはいろいろ足りてなかったので帰り際および翌日に購入したブツたちです.

モニタ

価格.com - LGエレクトロニクス 23MP75HM-P [23インチ] 価格比較

ヨドバシのモニタコーナーに言ったら店員さんがプッシュしてたので購入.
あとで調べてみたら24インチモデルがもうちょい安く売ってて悲しくなった.
HDMIケーブルとD-Subケーブルが1本ずつ付いてたのもよい.

無線LANドングル

Amazon.co.jp: BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM: パソコン・周辺機器

実家暮らしでルーターが親の部屋に入ってるてて有線接続が出来ないので無線LAN用に購入.ちゃんと動きました.(Raspbian 2014-09-09)
レビューにも書かれてますが,かなり発熱するので長時間使うとどうなるかわかりません.

無線キーボード&マウス

Amazon.co.jp: LOGICOOL ワイヤレスコンボ mk270: パソコン・周辺機器

アダプタ一つでマウスとキーボード両方いけるやつです.普通に使えました.

1時間も作業したらsshで接続できるしリモートデスクトップもできるようになったからもはや全部用済みになってしまった 自宅の無線LAN環境ではリモートデスクトップだとかなり遅延がでかいのでGUI使うなら直接モニタに繋いだ方がいい感じだ.母艦とブリッジ接続させたら無線LANルータ介さないからもう少し早くなるのかな…

おまけ

意外とキーボードって自宅に転がってたりしないんだね!!