ISUCON7でチームMSAが優勝しました!

先日行われたISUCON7。 カヤックエンジニアで構成されたチームとしては「MSA」と「fujiwara組」の2チームが本戦出場を果たし、 「MSA」が見事優勝しました!

ISUCONについては以下を参照ください。

isucon.net

tagomoris.hatenablog.com

チーム「MSA」のメンバーにコメントをもらいました。

mizuno-keita

「新卒から半年でKAYACに転職してきて2年、少しではありますが、自分の成長を実感することができました。 優勝できたことはもちろんうれしいですが、 Goは私がとても好きな言語であり、そのGoで力を発揮できたことも非常に嬉しいです。」

mizkei.hatenablog.com

suzuki-kyosuke

「私の力不足でインフラ側がかなり貧相になってしまったという反省があります。 この事実を受け止め、精進して行きたいと思います。 チームとして優勝できたことはとてもうれしいです。 mizkeiさん、ken39argさん、ありがとうございました!」

jetzou.com

araga-kensaku

「素直にとても嬉しいです! 普段やっている業務の延長にある大会であると思っているので、結果を出せば自信になるので出て良かったです!

つくばマラソンと本戦の日程がかぶっていたので、 今回も出たいけど出れないていで逃げ切ろうと思っていましたがうっかりエントリーに遅れてしまって... このままそおっとしておくつもりでしたが、普段から一緒に仕事をしている水野くんがメンバー募集していて、 見るとおいしいチームだったんで便乗させていただきました。

僕と水野くんは元々Lobiチームにいて、僕がゲームチームに異動してGoでサーバーサイドを開発することになった時に Goと言えば水野くんでしょうということで呼び寄せて一緒に開発しています。 今のチームではサーバーサイドのコードは4人いるメンバー全員がレビューするみたいなルールにしているので、 お互いが最近書いているコードは全部知っているような関係性でした。

鈴木くんについては昨年入社前にアルバイトもしていて、かなりできるやつということも知っていたし、 組長の元でインフラチームに所属しつつLobiチームで修行していたりもして、 新卒だけどインフラ丸投げしても、なんの心配もいらないなあという気持ちでした。

Lobiは古のシステムと最新のシステムが入り混じっているし、 基本はチャットサービスなんだけど玉石混交の様々なものが入っているのでLobiで揉まれた人は基本的に優秀なんです。

このチーム編成と問題の相性がバチッとハマったのが勝因で、 見つけた課題に対して誰がやるのが最短ルートかという判断が自然とわかるチームだったのでその辺無理せず各自の得意なことに終始できた感じです。

個人的に悔しいのは、予選でブレイクスルーを起こした一手が鈴木くんのcache-control2行で、本戦では水野くんの1000回ループ効率化の5行で、 後輩たちに少ない手数でチーム内MVPをかっさらわれてしまったのが心残りです。」

ken39arg.hatenablog.com


MSAの皆さん、おめでとうございます!

各チームがどのように戦ったのかはISUCON公式ブログに関連エントリまとめがありますので、そちらを参照ください。

isucon.net

ちなみに、今回の優勝でカヤックオフィスに並ぶトロフィーが4つになりました。

f:id:handlename:20171128135229j:plain

カヤックではISUCONに勝ちたいエンジニアも募集しています!

LobiのAndroidアプリ開発を Android Studio 3.0 に移行しました!

こんにちは!

ゲームコミュニティ事業部(Lobi)サービス基盤チームでアプリエンジニアをしているジェイソンです。

ついにAndroid Studio 3.0 正式版がリリースされましたね。 Android Studio 3.0 では、Kotlin の正式サポートをはじめとして様々な新機能や変更が含まれています。

というわけで、さっそくLobiのAndroidアプリ開発を、Android Studio 3.0 に移行しました。

ゲーム攻略チャットSNS、マルチ掲示板 Lobi(ロビー)

本記事では移行にあたって、Android Studio 3.0(Android Plugin for Gradle 3.0)対応のために、どういったことをしなければならないかをまとめました。 プロジェクトによって対応不要なものや、本記事に記載のない対応が必要になるかもしれませんが、参考にしていただければと思います!

Android Plugin for Gradle 3.0.0

まずは、Androd Plugin for Gradle 3.0.0 に更新しないと始まりませんよね。

top-level(root直下)の build.gradle ファイルに、以下を記載します。

dependencies {
    classpath 'com.android.tools.build:gradle:3.0.0'
}

buildToolsVersion 26.0.2

Android Plugin for Gradle 3.0.0 を使うためには、SDK Build Tools も更新しなければいけません。

モジュール単位の build.gradle ファイルに、以下を記載しましょう。

android {
    buildToolsVersion '26.0.2'
}

Gradle 4.1

Gradleも最新にする必要があります。

gradle-wrapper.properties ファイルに、以下を記載しましょう。

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

Flavor Dimensions

Android Studio 3.0 から、すべての Flavor に対して、Flavor Dimensions の設定が必須となりました。

未設定の場合、以下のようなメッセージとともにビルドエラーとなるので注意しましょう。

Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.

新しい dependency configuration

Android Studio 3.0 から、 compile は非推奨となり、代わりに implementationapi を使うことが推奨されています。

implemntationapi の違いについて簡単に説明すると、外部(モジュールの利用者)に対して、モジュールの依存関係を公開するかしないかで使い分けることになります。 たとえば、依存関係を外部に公開するのであれば api を、依存関係をモジュール内部でのみ使用し外部に公開しないのであれば implementation を使うということです。 同様に provided の代わりに compileOnlyを、 apk の代わりに runtimeOnly を使うことが推奨されています。

このあたりは公式ドキュメントをご覧になっていただくと、より理解が深まります。

Use the new dependency configurations - Migrate to Android Plugin for Gradle 3.0.0

Androidライブラリのビルドバリアント設定

今までは、アプリモジュールをデバッグビルドしていても、アプリモジュールはライブラリのリリースビルドを使用するのが標準でした。 もしライブラリをリリース以外のビルドタイプでビルドしたい場合、以下の二つの設定が必要です。

  1. ライブラリモジュールの build.gradlepublishNonDefault true を設定する
  2. アプリモジュールの依存関係で、以下のように追加する
dependencies {
    debugCompile project(path: ':library', configuration: 'debug')
    releaseCompile project(path: ':library', configuration: 'release')
}

Android Studio 3.0 では、モジュールの依存関係を implementation にしていると、アプリモジュールのビルドバリアントを引き継いでくれるようになりました。 なので、ライブラリをリリース以外のビルドタイプでビルドしたい場合、以下のように設定します。ちょっとだけ簡単になりましたね。

  1. ライブラリモジュールの build.gradlepublishNonDefault true を設定する
  2. アプリモジュールの依存関係で、以下のように追加する
dependencies {
    implementation project(path: ':library')
}

Android Asset Packaging Tool 2.0 (AAPT2) 対応

Android Studio 3.0 から、Android Asset Packaging Tool 2.0 (AAPT2) を使ったリソース処理がデフォルト動作となりました。

もしAAPT2を使いたくない場合は、 gradle.properties に以下を追記してください。

android.enableAapt2=false

AAPT2有効時に、Support Library がビルドエラー

AAPT2が有効の場合、Support Library でビルドエラーが発生することがあります。

C:\Users\hogehoge\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.0.2.aar\fee37bff362162d6a864b5b32c15cd0e\res\values\values.xml
Error:(387, 5) error: style attribute '@android:attr/windowEnterAnimation' not found.
Error:(387, 5) error: style attribute '@android:attr/windowExitAnimation' not found.
C:\Kayac\hogehoge\app\NakamapNewUI\app\build\intermediates\incremental\mergeDevelopDebugResources\merged.dir\values\values.xml
Error:(1804) style attribute '@android:attr/windowEnterAnimation' not found.
Error:(1805) style attribute '@android:attr/windowExitAnimation' not found.
Error:failed linking references.
Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
Error:Execution failed for task ':app:processDevelopDebugResources'.
> Failed to execute aapt

この場合、 @android:attr/windowEnterAnimation@android:attr/windowExitAnimation という属性が見つからないよ、というエラーのようです。

AAPT2が有効で、名前空間からリソースにアクセスしたいとき、リソース参照シンボル(@)を付与すると上記のようなエラーが発生してしまうようなので、以下のように name 属性から @ を削除することで問題が解消しました。

     <style name="Animations_Fading">
-        <item name="@android:windowEnterAnimation">@android:anim/fade_in</item>
-        <item name="@android:windowExitAnimation">@android:anim/fade_out</item>
+        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
+        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
     </style>

これについても、 公式ドキュメント にしっかりまとまっています。

android.useDeprecatedNdk はもう使えない

android.useDeprecatedNdk を使っていると、いよいよビルドが通らなくなってしまいました。

Error:FAILURE: Build completed with 2 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:compileDevelopDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.
  Consider using CMake or ndk-build integration. For more information, go to:
   https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
   To get started, you can use the sample ndk-build script the Android
   plugin generated for you at:
   C:\Kayac\project\app\hogehoge\app\build\intermediates\ndk\develop\debug\Android.mk
  Alternatively, you can use the experimental plugin:
   https://developer.android.com/r/tools/experimental-plugin.html
  To continue using the deprecated NDK compile for another 60 days, set
  android.deprecatedNdkCompileLease=1508989475208 in gradle.properties

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
==============================================================================

ただし60日間限定で、 gradle.propertiesandroid.deprecatedNdkCompileLease=1508989475208 と設定すると継続してビルドできるようです。

しかしこれはあくまで延命手段なので、抜本的な解決策を模索するのがよいでしょうね。

まとめ

本記事では、待ちに待った Android Studio 3.0 を気兼ねなく使えるよう、Android Studio 3.0(Android Plugin for Gradle 3.0)対応のために、どういったことをしなければならないかをまとめました。

Android Studio 3.0 は様々な新機能や変更が盛り込まれた、半年ぶりの大規模なアップデートでした。

本記事によって、より新しい環境にスムーズに移行できる一助ができれば幸いです!

カヤックではAndroid Studio 3.0 にアップデートしたい欲を抑えられないエンジニアを募集しています!

カヤックではKotlinに移行したくて仕方がないエンジニアも募集しています!