DroidKaigi2016に行ってきました

2016/2/24 2658hit

2/18-19の二日間、大岡山で行われたdroid kaigi2016に行ってきました。
結論から言うと 最高でした。

droid kaigiとは

Androidのエンジニアのための情報交換を行うイベントです。
他のイベントにもよくある登壇者がしゃべり大勢が聞く形式ですが話す内容が「Android関連」で「特異性のある」「技術的な話」に特化しているというのが特徴。

なので、この手のイベントにありがちな
「こういうサービスを作りました」とか、「ダウンロード数が何百万でした」とか、そういう話は少なく、ライブラリーの使い方や言語の紹介といった開発に特化した話になっていました。

まず、驚いたのが、そんなにジャンルを絞っても話すことが有るんだということ。

話す内容は秋ごろにCFPとして公開で公募が掛けられます。
実際にどのような内容が応募されたかはオープンにされています。
この内容を元に運営委員会が良さそうな内容をえらぶという方式。

普通のイベントでは登壇者が先に決まって、登壇内容はある程度登壇者に丸投げという形が多いのと対照的。
純粋に面白そうな「内容」で勝負されます。

飛行機とチケット

チケットはCompassで購入。
CFPにアイコンデザイン周りの話でも送り込もうかと思いましたがちょい業務が怪しかったので見送り。
来年はがんばろう。

会場は大岡山ということで、最初新幹線を取って行こうとしてたら、
大岡山という東京の駅だったそうで、急いでスターフライヤーで予約を取りました。
実は初めてのスターフライヤーです。 スターフライヤーは良いよという話は何度も聞いていたのですが、いろいろな事情があってなかなか乗ることが出来ずに居たのです。

当日の荷物

今回は2泊だったのでTHULE Paramount 29Lに全てを収めることにしました。
キャリーバッグを持って行くと収納力はダントツに上がりますが、旅行の機動性を考えるとやはりバックパックひとつで済むのは楽です。

最近色々物を買い足したので今回の旅行には、今後のイベント旅行で必要な荷物の過不足を調べる意図もあります。
持って行った荷物は次の通り
着替え 2日分。(下着のみ)
オームのプラグ収納式 マイクロタップ
SONY α7S(+予備バッテリーと充電器)
Apple Thunderbolt - ギガビットEthernetアダプタ
LANケーブル 50cm
micro USBケーブル2本(通信用と高速充電用)
USB-Cケーブル 1本
アップル Apple Mini DisplayPort-VGAアダプタ
Anker 24W 2ポート USB急速充電器
Anker Astro E1
Nexus5
Nexus6p
ANKER SoundBuds
SONY MDR-EX31BN/R
Moto360と充電台
MacBookPro Retina15インチと充電ケーブル
飛行機のチケット(紙)
Compassのチケット(紙)

使わなかったのは有線LANケーブルとVGA変換アダプター、SoundBuds、Nexus6p
コレに関しては有線LANケーブルはホテルによってはWi-Fiが飛んでいないこともあるので持っていて正解だし、VGA変換アダプタも何かのタイミングで突然プレゼンをする機会に恵まれた時に必要になったりするのでこれからも持って行こうと思います。

SoundBudsは電車や飛行機のようなノイズレベルが大きなところではノイズキャンセル性能が役に立たなかったです。
MDR-EX31BNのノイズキャンセル性能と大きな差がでました。

Nexus6pはNexus5のバッテリーが切れた時の予備用だったんですが、まだnano SIMを調達できていないためWi-Fiが飛んでいなかった会場では使用できませんでした。

逆に足りなかったのはUSBケーブルと有線イヤホン。
スマートフォンと充電器を充電するとmoto360とイヤホンが充電できない。
ポート自体はAnker 24W 2ポートとMacBookProRetinaの2ポート、(その気になればANKERのバッテリーを数珠つなぎしてもう1ポート)
あるのに2本しか刺せないなんて・・・(そして朝気づいたのですが枕元にmicroUSBの充電ケーブルがはえてたのに気づくという失態)
次回はUSBケーブルを2本足そうと思います。
E1は充電に5時間くらいかかるので1ポート完全に専有されるのも辛かったです。最近はもっと充電速度の早いモバイルバッテリーもあるのでそちらの導入も検討したいです。

MDR-EX31BNは有線ではないのでせっかく飛行機にモニターがついていたのに使用できなかったのが盲点。(機内でイヤホンは貸してもらえます)
国際線で映画見られないのは残念なので国際線に乗るときは有線でノイズキャンセルが付いているMDR-NC33と普段用にSoundBudsを組み合わせのはありかも。

バッテリーについては結構ギリギリでした。
会場にwi-fiが飛んでいなかったので常時テザリングしていたところ

初日は飛行機でNexus5を満充電に出来たのですが、その後は電源なし状態。
セッションが終わった時点でモバイルバッテリーのe1が完全に電源が切れて、Nexus5のバッテリーが85%残っている状態。

翌日は最初のセッションでコンセントを確保できたのでMacBookProとNexus5を充電したのですがセッションが終わった時点でe1が25%の状態でした。

より辛かったのがMacBookProでセッション終わった時点で両日とも残量10%を切っていました。
MacBookProの電源が心もとないのは分かっていたのでバッテリーを節約するため液晶をかなり暗くして重たい処理を極力走らせないようにしたのにこの状態。今回は途中でガッツリ仕事をしないといけなかったのでMacBookProを持って行くほかありませんでしたが、重量的にも取り回し的にも辛いのでハイスペックなモバイル用のPCが欲しくなります。

ということで、荷物の課題としては
有線イヤホンを持って行く、USBケーブルを増やす、モバイルPCの導入を検討するという感じ。

α7sは大きさ的に少し持ち歩き辛かったです。
でも良い写真撮れたから持ち運びしやすい単焦点レンズと組み合わせようかしら。

移動

移動は朝一7:00の飛行機スターフライヤーです。
この飛行機は9時前に羽田空港に行くので東京のかなりの範囲で10時までに到着することが出来ます。
前泊しなくても良くなるので楽では有りますが、手荷物検査場を6:45に通過する必要が有るため早起き必須です。
7:00は空港がオープンになるタイミングということもあり朝一の飛行機ラッシュで手荷物検査場は混雑します。
並んでいる客は皆7:00の飛行機に乗ろうとしているので 優先的に先に抜けるみたいなことも期待できません。


6:30にオープンのラウンジに入ってパンをひとかじりコーヒーを一杯飲んで6:40に手荷物検査場にいったら、並んでいる最中にまもなく締め切りますっ て言われて結構焦りました。

搭乗口は第二ターミナルだったのですが、飛行機に乗り込むのは第1ターミナルで、機内案内を超えた先で第1ターミナルまで歩くという不思議な運用。
最近第二ターミナルから乗り込むことがかなり減りました。

スターフライヤーの移動は快適そのもの。
朝の飛行機は景色も最高。

夜明け前の空港を離陸すると

山の向こうから太陽が見えてきました。

その後も雲のベールを被った山々や

雪の山々などとても美しい景色を堪能できました。


スターフライヤーのコーヒーはタリーズのコーヒーで、実際に飛行機で普通に飲むコーヒーよりかなり美味しく感じましたしおまけでチョコレートがつく嬉しいサービスも。


充電用のUSB端子があるのも凄く嬉しい。
次回も特に金額に大きな差がでないかぎりスターフライヤーを使うと思います。

羽田からの移動は京急で品川、京浜東北線で大井町、東急大井町線で大岡山という流れ。
大岡山って東京の南のほうなのに、品川まで大きく回りこむのがちょっと嫌な感じ。
地図的に言うと京急鮫洲駅くらいで降りたいのですが快特が止まらないので品川まで回るほうが早かったです。
本当に時間を節約するならタクシーにするとかなり早くなるはずです。

会場は大岡山駅を出てすぐ真正面で迷う余地はありませんでした。
私が聞いたセッションは次の通り

基調講演

基調講演では沢山のライブラリーが紹介されました。
Androidアプリ開発では固定化されたお定まりの方法などが多くてコードが冗長になりがち。
ライブラリーを使うことで工数を大幅に削減できる可能性があります。
しかし、ライブラリーはデキが悪いと余計に時間を取られたり、開発の動向によっては継続して使い続けることが難しかったりと注意も必要です。
そこで、実際に使っているライブラリーや使ってみたけれどダメだったライブラリーの知見を共有していただきました。


Master of Canvas

キャンバスについての話です。
全体的にキャンバスの基礎的な話が多かったですが、Interpolatorの設計方法についての紹介が興味深かったです。
私の場合直接Javaに書いて実機で確認という感じが多いのですが、Grapherのような外部ツールを使うことで可視化したデザインが可能というのが気づきでした。


そこからランチタイムに入るのですが、おにぎり弁当は量も味もちょうどよくて弁当の質にこだわったことをよく感じました。
全国のAndroidアプリエンジニアの人たちと話しながら食事ができるのも嬉しいところ。

史上最速のAndroid

随分と強気なタイトルだなぁと思ったらその名に恥じず、インタープリタやアセンブラまで解析してARTがどんなコードを書いているか、なぜ同じような処理で実行時間に大きな差がでるのか、ベンチマークとARTの実装、コンパイルされたコードを元に追跡するという興味深い内容でした。
具体的にどんなことが紹介されていたかというと
for文を繰り返した場合にARTでは処理速度が大幅に遅くなってしまう理由と、ARTの設計思考とか
64bitでもdoubleよりfloatのほうが早い理由とかです。

実際にここまで作りこむと保守性も悪化するので使いドコロが難しいですが知識として面白かったです。

Dagger2とRealmを利用したモダンな開発

Dagger2やRealmはライブラリーの中でも割りと強力で受ける恩恵は大きいが技術縛りも大きく受ける項目。
いくつか案件で使おうと思っていたことがあったのですが、リスクが大きく結局使わずじまいになっていました。
どちらも、ある程度できる範囲が見えてきて、使いドコロがわかった気がします。


明日、敗訴しないためのセキュアコーディング

SQLインジェクションで訴えられたあれを引き合いにちゃんとセキュリティについて意識しましょうねという話。
やらないといけないと分かっていてもやっていない例多いですね。
特にKeyStoreについてはみんなもっと大事に保管して欲しいです。外注するときもリリース用の署名は発注元で行って出来るだけ最小の人がKeyStoreファイルにアクセスできるようにして欲しいです。


そのまま飲み会に突入。

近くの居酒屋でAndroidエンジニア同士で飲みました。
初めての人もたくさん、I/Oなどで会った人もたくさん。結局5時間近く開発話をしながらビールを飲み続けるという楽しい時間を過ごせました。
あ、でも何話したかいまいち覚えていない・・・

ホテルは馬込にあるホテルステイシード。
会場近くにホテルがあまりなく、出来るだけ近いところを選んだのですが、価格の割に部屋も綺麗で遅いけれどwi-fiも飛んでいて良いホテルでした。

二日目の基調講演は

SupportLibraryについて

バグの報告はスクリーンショット 可能なら動画で!というのが凄く強調されていました。
開発側の裏話みたいなのが聞けて楽しかったです。

Annotation Processing in Android

最近ライブラリーを使うことが増えて自然とAnnotationを使うことも増えたのですが、用意されたAnnotationを使うだけじゃなく自分で作ろうという話。
Annotationを使うことでコードをシンプルにしつつ実行速度に影響を与えないので上手く活用していきたいです。


Advanced Kotlin for Android

AndroidってJavaの構文が古くて最近はRxAndroidのようなJava8っぽくかける気がするライブラリーとか出てきてもやもやしていたんですが、Kotlinという言語ベースでモダンな文法を取り入れてきた環境が出てきて注目しています。
Kotlinは1.0も出たことですし、まずはプライベートなプロジェクトで探りつつ導入していこうと思っています。

この時Nullsafeの議論がTwitterで発生して面白かったです。
私、Null Safeって濫用すると危ないと思っているのですが、Kotlinの場合はデフォルトがNull Safeなんですよね、
Null Safeが愛されている理由ってNull Pointer Exceptionを避けたいということだと思うけれど、問題はNullPointerExceptionで落ちることではなく、Nullが来てはいけない変数にNullが来ている状態にあるのだから、異常な状態を検出して落ちるのは幸せなことだと思っています。
結局TwitterではNullPointerExceptionが好きなら「!!」を付けたら良いみたいなちょっと言いたいことが伝わらない状態になってしまったので、直接あって話しましょうということに。

私の懸念点はNull Safeにすることでコーディング時にミスに気づける反面、Null Safeを避けるために意味のない初期値などが設定された場合、運用で問題が発生するまで気づけない可能性があるという点。

同様の処理はJavaのローカル変数にも存在していて、ローカル変数は明示的に初期化されていないと、あとの処理に記載すると、たとえ実行時に呼び出されることが無いと分かっていても、コンパイルエラーが発生します。
例えばこういうプログラムは通らないです。

public void hoge(boolean b) {
String foo;
boolean bar = true;
if (b) {
foo = "foo";
}
//中略
if (b) {
Log.w("bar", foo);
}

}


そこで、概ねこんなロジックを見つけます。
Javaはnullの設定も初期化とみなすためコンパイルエラーにはなりません。
すごく嫌いな書き方なんですが、とても良く見つけます。
まぁ、問題なく動きます。

public void hoge(boolean b) {
String foo = null;
boolean bar = true;
if (b) {
foo = "foo";
}
if (b) {
Log.w("bar", foo);
}
}

ここで途中の部分が変わってしまった場合を考えます。

public void hoge(boolean b) {
String foo = null;
boolean bar = true;
if (b) {
foo = "foo";
}
b = true;
if (b) {
Log.w("bar", foo);
}
}

このメソッドは引数にfalseが入るとNullPointerExceptionで落ちます。変数fooがnullだからです。
つまり、String fooにnullをセットするのはせっかくのJavaが持っている初期化されていない変数を使わせないというチェックロジックを安易に解除しているに過ぎないわけですが、しかしよく見かけるコードです。

これで報われているのは変数fooはまだ使用出来ない状態であることを、実行時とはいえシステムがチェックできて例外を発行しコードに問題が有ることがわかるというところです。

ではもしfooがNull Safeだったらどうなるか・・・ 多分fooにnullセットしていた人はこうすると思うんです。

public void hoge(boolean b) {
String foo = "";
boolean bar = true;
if (b) {
foo = "foo";
}
b = true;
if (b) {
Log.w("bar", foo);
}
}

この場合、プログラムは予期せぬ結果になるだけでなんのエラーも例外も出さず粛々と動き続けます。

でお互いかおを向きあわせて話すと初期化されていない時に””とか-1ぶっこむみたいな悪いことする人は居ないという前提に立てばNull Safeは便利という結論に至りました。
悪い人が居なくて完璧だったらそもそもNullPointerExceptionも発生しないわけですが、これはどこまで人を信用するかということになって結論はありません。
Nullableはあまり信用していないか、完璧に信用しているか、Null Safeはちょっと信用している場合によさそう。
たとえば自分の書いたコードで自分が使う場合、変数に嘘データぶっ込んだりしないよって自身が持てるならNull Safeにすることでうっかりミスを防ぐことが出来ます。
こういう話を顔を突き合わせて話せるのもオフラインイベントの魅力です。


Fireside Chat

「通知オフ」にされない為に。ネイティブアプリの最適な通知について。の代役として入ったセッションです。
DroidKaigiアプリを作る過程の裏話が聞けました。
コミットコメントを英語にすることでコミュニケーションが逆に円滑になった(気をつけて書くから)みたいなおもしろネタが続々。
もう一度見直したいのでYouTubeにアップされるのを期待です。

アフターパーティー

その後は公式なアフターパーティーに参加しました。
さきほどのNull Safeな話をしたり、久しぶりの人や初めての人といろいろトークしたりとかなり楽しい時間を過ごすことが出来ました。
しかし、全体的に九州のエンジニアが少ない気がしてそれは残念だったところ。
セッションのスライドは多くが公開されるし、YouTubeで動画も公開される予定とはいえ、やっぱり人と出会って直接話せるのはイベントに参加する最大のメリットだと思います。

前:Anker のカナル型ヘッドセットSoundBuds Sportレビュー 次:即訳 GoogleI/O 2016の公式サイトが公開されました。

関連キーワード

[Android][写真][Java][旅行][モバイル][IT][イベント]

コメントを投稿する

名前URI
コメント