heihei blog

Write once, recall anytime. 自分のために書く 📝

2018年9月を振り返る

2018年も約75%が終わったようです┣¨━━━━(゚Д゚)━━━━ン!!!! 10/1(月)時点

さくさくと9月を振り返ります。

9月やったこと

DevFestTokyo 2018に参加した

https://potatotips.connpass.com/event/95391/

弊社の他エンジニアの方に勧めていただき、Androidのパネルディスカッションに参加させていただきました。Android Architecture Componentsの中で何を導入しているかといった話や、それらのハマりポイント、今後導入を検討しているライブラリなどについて、数社のエンジニアの方々と一緒に、話をさせていただきました。

今のAndroidアプリ開発において、Android Architecture Componentsもアツいですが、今後はandroid.supportパッケージの開発終了、そしてこれらのパッケージのリファクタリング版であるandroidxの1.0.0リリースに伴い、AndroidXへの移行が急務となってくると思われます。規模の多いアプリほどハマりどころが多そうです。

AndroidXへの移行って何?どうするの?という方は、まずこちらの移行に関する公式サイトの記事を読むことをお勧めいたします。

マッチング業界のネイティブエンジニアで集まって交流した

先月、potatotips #54に参加した際、Eureka, Inc.のエンジニアの方々とマッチング業界のエンジニアのtips共有会してみたらどうでしょう!とご提案させていただき、さっそくEureka, Inc.含め、複数のマッチング業界のエンジニアの方々と酒を交わしながらおしゃべりできる機会が得られました!また今回はお声がけできなかった会社の方々も、ぜひ11月に開催予定の勉強会にてお話等できればと思っています。(こちらの勉強会については11月半ば開催を予定しています。)

その他

  • 家族旅行にいってきた

初めて企画して旅行に行きました。波乱万丈感、否めなかったですが、着地楽しんでくれたようでよかった・・!またいきたい。

  • 「カメラを止めるな!」を観てきた

笑いました。もう一度観たい・・!

会社のことでいうと、旅立つメンバーや新しいメンバーが入ったりと変化が生まれそうな10月です。弊社としては新しい期となるため、改めて初心忘れず気を引き締めます。

雑ですが、9月はこのような感じでした。

9月もお疲れ様でしたヽ('∀')ノ

Layout XMLファイル内でData Bindingを用いてプレースホルダー付きStringリソースにアクセスする

公式リファレンスに記載されている通りですが、

<string name="self_introduction">My name is %1$s</string>

というstringリソースが定義されているとします。これをData Bindingを使ってLayout XML内部にて、たとえばTextViewtextフィールドにバインドしたい場合、

以前だと下記のような記述方法のみ有効だったような気がしたのですが、

android:text="@{String.format(@string/self_introduction, user.name)}"

改めて確認したところ、

android:text="@{@string/self_introduction(user.name)}"

と記述できます。

メモ程度に。

参考リンク

2018年8月を振り返る

2018年も約70%が終わったようです(´ε`;)ウーン…

今回は8月をさらりと振り返ります。

8月やったこと

potatotips#54に参加してきた

https://potatotips.connpass.com/event/95391/

uberが最近OSS化したmotif(読み:モチーフ)というDIライブラリについて発表してきました。Daggerの拡張性を削った代わりに、より簡潔にスコーピングのネストを表現することができるライブラリで、内部ではDI周りのコード生成はDaggerを使って行われます。

詳細はこちら

Mobile CI/CD Meetupに参加した

https://mobile-ci-cd.connpass.com/event/95864/

Bitriseにてビルドごとのキャッシュをどのように実装するかについて発表してきました。BitriseにはCache-pushとCache-pullというstepsが事前に用意されていて、こちらを利用すると簡単にキャッシング機能を利用することができます。また、このキャッシュ機能を用いてビルドさせていると、時折キャッシュではなくフルビルドを走らせたいという場合が時折あります。その場合にどのように工夫したかについて発表してきました。

詳細はこちら

Androidチームでペアプロを始めた

毎週水曜と金曜日に30分ずつ、お試しでやってみています。今のところ、いろいろな発見や学びがありとても良いと感じています。このへんはまたブログ等で共有できればと思います。

その他

  • タイに行ってきた

いつもの親友グループで行ってきました。

ナイトマーケット行ったり島いったりしました。

f:id:shaunkawano:20180910234355j:plain

そしてパッタイがおいしかったです!

f:id:shaunkawano:20180910234409j:plain

  • この他にも優秀なインターンの子とお仕事したり、KotlinFest行ったりといろいろありましたが、「Done is better than perfect」の精神で一旦投稿しきるところまで。

もっと小出しにしてブログ記事書いていきたい所存です。

そんなこんなですが、8月もお疲れ様でした!(`・ω・´)ゞ

2018年7月を振り返る

2018年も60%が終わったようです┗(^o^ )┓三ファアァアア ※8/8(水)時点

今回は7月を振り返ります。

7月やったこと

社員旅行に行った

初めて社員旅行に行きました。沖縄!琉球ガラス体験をしたり、歴史を感じたりと、とにかく楽しかったです。

「レビュー」という作業について社内で発表した

タップルでは週に一度、朝会にて技術者がチーム全体に技術やエンジニアリングなどの話を共有する会を定例として入れています。(「マジテックトーク」という名前の会です) 今回この会にて発表させてもらえる機会があったので、「プルリクエストに対するレビュー」というエンジニアの大事なシゴトについて共有しました。

資料はこちら

みんなレビューやっているとおもうけど、引き続きやってこうな!

技術書典#5にて本を出すことが決まった

前回はカップリングユニオンという組織のAndroidエンジニア数名で執筆させていただいたのですが、 今回は他部署のiOSとAndroidエンジニア合計6人で書くことが決定しました。

がんばります!(自分が前回担当した内容は、Okioの概要や内部実装の話だったのですが、今回も多分特定のライブラリについての内容を執筆しようと考えています。)

ズサーッε=ε=ε=c⌒っ゚Д゚)っ

技術書典

業務ではレイヤーごとのモジュール化が一段落し、Feature Moduleごとに分けていっている段階です。こちらも一段落したらどこかでアウトプットしたい。

その他

  • 映画「セラヴィ!」を二回観た

http://cestlavie-movie.jp/cestlavie-movie.jp

めちゃくちゃ笑い、感動できる映画です。こちらは映画館の雰囲気とかによっても笑いが大きかったりしたところが印象的でした。二回目のほうが面白かったw

さっくりですが、以上です!

7月もお疲れ様でした!(`・ω・´)ゞ

2018年6月を振り返る

2018年も約54%が終わったようです...━━━━━━(´Д`|||)━━━━━━!!!! ※7/11(水)時点

6月を振り返ります。

6月やったこと

Kyash Meetup #1 iOS & Androidに参加した

アプリ開発の現場の話やiOS、Androidアプリの設計や、どのようなフロー(手順)で機能実装をしているか、という話をLTで聞くことができました。「席替え頻繁にやっている」、「KPTに対するKPTやったりしてる」に関してはいいな!弊社でも真似したい、と個人的に思いました。そしてLTだけではなく懇親会でもじゃんじゃんKyashメンバーに質問できたりして、中のことがより知ることができて楽しかった。

余談

リアルカードもらいましたლ(´ڡ`ლ)

PotatotipsにてBitriseについて発表した

もともとCircle CI 2.0を使っていたのですが、Bitriseに移行してFastlaneも導入して自動化したことについて発表してきました。

OperandoOSさんのご指摘どおり、多分お金積んでresource_class設定することでも解決できたけど、勢いで移行した感が強いです。他社ではCircle CIの並列タスク実行を利用することでCIの時間を10分短縮したという事例もあるらしいので引き続きどういうCIツールが一番使い勝手良いのか等はチェックしていきたいですね。

主に発表内容は下記です:

  • git tagのプッシュ検知ができなかったのをどう解決したか
  • bitrise file-downloader機能の使い方
  • 作ったfastlaneのactionのサンプル

本当はもっといろいろなことやりたくて仕込んでいる最中でもあります。

資料はこちら:

speakerdeck.com

Shibuya.apkに参加した

兎にも角にもGoogle荒木さんの発表が面白かった。どのようにバックポートAPIを作っているか、という話。

その他

社内では、

  • ペアプロ
  • モブプロ

を試したりとかしてます。うまく仕組み化したいけどどうするのが良いかまだ模索中感ありますが、考えるより先にやるほうが良さそう。

あとはアプリの画像等のリソースファイルのみを持つモジュールを作成して少しずつモジュール化を進めています。引き続きここらへんは粛々とやっていく。

以上になります。6月もお疲れ様でした!

Parcelizeを利用してみた所感と注意点

※2018/06/14(木) 時点での所感と注意点を記載しています。何かアップデートがあれば随時追記していければと思います。

Parcelizeとは、Kotlinが提供するAndroid開発のためのコンパイラー拡張機能です。Parcelableを実装したクラスに対して@Parcelizeアノテーションを付与することで、Parcelable実装に必要なコードを自動生成してくれます。

詳細は下記を御覧ください:

github.com

今担当しているプロダクトでは、以前からParcelableに関するライブラリとしてParcelerを利用しているのですが、Parcelizeに関して最近Androidバージョン4.3の端末でインストールできない不具合が直った旨のツイートを見つけ、ちょうど機能改修のタイミングでもあったので導入に踏み切りました。

所感

Android Studioで利用していますが、今のところ不具合なく動いているようです。"Show Kotlin Bytecode"によってどのようなコードが生成されるのかもひと目で確認できます。

注意点

lint実行時にエラー

現状@Parcelizeを付与しているクラスに対してlintを実行すると、エラーが出てしまうという問題があります。

"This class implements Parcelable but does not provide a CREATOR field" 

(AS上でも似たような文言のWarningが出てしまう不具合があったようですが、そちらはすでに修正されています。)

このlintエラーの一時対応策は二種類ありそうです。一つは、エラーを完全無視する方法です。

android {
  lintOptions {
    abortOnError false
  }
}

これは、他のlintのエラー等含めてまるっと無視する設定なので、イケてなさそうな気がします。

もう一つの方法として、対象のクラスのみに対して@SuppressLintアノテーションを付与する方法があります。

Issue Tracker上のコメントにて紹介されていました。

https://youtrack.jetbrains.com/issue/KT-19300#comment=27-2853193

例としてはこのような形です:

@SuppressLint("ParcelCreator")
@Parcelize
class MyParcelable(val data: Int): Parcelable

できればこのアノテーションすら付与したくないところではありますが、一時対応策としてはこれが一番しっくりきました。

もし、何かもっと良い方法等ご存知の方いたら教えていただけると幸いです。m(__)m


※06/14(木)追記

lintOptions {
  ignore "ParcelCreator"
}

という設定でParcelCreatorに関するlintエラーを無視する、という設定もできるようです!@stsn_jpさんありがとうございますm(__)m


View Bindingも有効になってしまう

Parcelizeを利用するにあたり、Kotlin Android Extensionsを有効にする必要がありますが、現状これを有効にすると自動的にView Bindingのほうも有効になります。Data Binding等を利用しているプロジェクトでは、View Bindingは無効にしたいというニーズがありそうです。こちらは今後Parcelizeのみ有効化、等の設定ができようになると最高そうだと感じています。


※06/18(月)追記

androidExtensions {
  experimental = true
  features = ["parcelize"]
}

という設定でParcelizeのみの有効化が可能なようです。@stsn_jpさんありがとうございます!


まとめ

  • Parcelize今のところよさそう。自分のプロジェクトでは現状利用しているParcelerを置き換える流れに持っていく予定。
  • 現状の問題点としては"PacelCreator"Lintエラーが出てしまう点とView Bindingも有効になってしまうのでそこだけ注意が必要そう。
    • ※06/18(月)追記: Parcelizeのみ有効にする方法は上記に記載
    • Lintエラーに関しては、個別に@SuppressLint("ParcelCreator")するのが良さそう。

以上です。

2018年5月を振り返る

2018年も約43%が終わったようです...(; ・`д・´)汗 ※6/5(火)時点

それでは5月を振り返ります。

5月やったこと

Google I/O 2018に参加した

参加してきました。

Google I/O 2018についての振り返りや、いくつかのセッション動画を観た際の英語メモなどに関しては下記を御覧ください。

blog.shaunkawano.com

本業の振り返り

Google I/O 2018参加以外では、振り返ると、

  • モジュール化作業を始めた
  • Bitrise×fastlaneを使った自動化

あたりを今月はわりと集中・意識していました。

モジュール化作業を始めた

今回のGoogle I/OにてaabやDynamic Features、Instant Apps最大アプリサイズの10MB化などがあり、モジュール化の波がAndroid界隈で一気に加速したのではと考えています。自分の所属するチームでは、個人的には@kgmyshinさんのこちらのDroidKaigi 2018での発表内容も参考にしつつ、まずはレイヤーごとにモジュール分けを行い、その後各レイヤーのクラス群からそれぞれ意味あるまとまりごとのモジュールに分けたらどうだろうかなと考えていたのですが、チーム内の数名で話し始めた程度ではありますが、commonとappに分けたあとはもう意味あるまとまりで分け始めるのもありなのでは、という話をしていたりします。つまりまだふわふわっとしているわけですね。社内・社外問わず、既存プロダクトに対してモジュール化を進めている皆さん、ここらへんどうやって進めていますか?

Bitrise×fastlaneを使った自動化

Bitrise × Fastlaneが思いの外いろいろと設定できてよさそうなので、もっと活用していきます。

最近これらのツールを使って、

たとえばtagを切ったタイミングで、

  1. 署名付きAPKを生成
  2. Changelogを生成
  3. GitHub Releasesに新しいDraft Releaseを作成
  4. descriptionにChangelogを入力
  5. assetsとして署名付きAPKをアップロード
  6. SlackにDraft Releaseでけたよ通知

させたりしています。今までは独自のスクリプトだったりを使ったりしていたのですが、たとえばChangelog生成、やGitHubのRelease作成、APKをGithubのReleaseにアップロードする等はfastlaneが用意してくれているactionで、Bitriseの機能のみで実現できました。(「そんなのもうやってるよ」という声が聞こえてきそうですがスルー)

自動化周りで困ったこと、詰まったことやそれらを自分なりにどう解決したかについては6月のpotatotips@FOLIOにて発表予定です。

その他

  • 個人アプリにアップデートリクエストが来た

ここはマイペースにやっていくしかない。

バロンドール受賞した!というニュースをSNSかどこかで見て、見てみようと思った感じです。「あ、こういうのいいなぁ(´ェ`)」と思うシーンや、鳥肌が立つほどジーンとくるシーンなど、いろいろな波のある映画でした。安藤サクラさんの演技が特に印象的でした。

以上になります。5月もお疲れ様でした!