heihei blog

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

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月もお疲れ様でした!

Google I/O 2018で質問したこと・I/O 2018の振り返り

f:id:shaunkawano:20180521192251j:plain

※Google I/O 2018の発表内容についてはこのブログでは紹介していないので、発表内容について気になる方は他ブログ・Qiita記事だったり各地で開催されている報告会の資料などをぜひ参考にしてください。

本記事では、Google I/O 2018にて質問したこと(したかったこと)と回答、会場でGoogleの方と交流できる場所について共有をして、I/O期間中を振り返ってもっとこうすればよかったな、ということを振り返ります。

Google I/O 2018にて質問したこと(したかったこと)

現地に行く前に事前に社内のエンジニアの方々に何か質問しておくことはないか等聞いたり、誰でも編集可能なスプレッドシードをツイートを通して共有しておき社外の人からも質問を募ったりしました。 その結果なのか、10+の質問をもらうことができ、いくつかのものに関して回答を得ることができました。

docs.google.com

冒頭にも書きましたが、全部の質問はすることができませんでした。(残念に思ってしまった方、すみません。)

質問と回答

現地では回答を得れたものから適時Q. A.という形でツイートしていました。下記はその一覧です

(上記はKTXの発表前に質問しました)

こうやってみると思ったより質問できたこと少ないことに気づきますね...

個人的にはRealtime DBの不安定感に対する質問を投げかけた際の、社員さんの申し訳なさそうな顔が印象に残っていて、「がんばってください!」という応援の気持ちです。

I/OでGoogleの方と交流できる場所

Google I/Oではキーノートやセッションの他に、サンドボックスやオフィスアワーといったGoogleの方と交流するためのスペースが設けられています。

サンドボックス

サンドボックスには、Googleの製品や製品を用いた作品のデモ、実演などの他に、キーノート、セッションなどで発表された開発ツールなどの使い方の実演などを行なう専用スペースです。

Android & Pay、AR/VR、Web & Payments、Cloud, Firebase & Flutter、Android Things & Nestといった各セクションごとにドーム型のスペースが設営されており誰でも自由に出入りすることができます。中にはデモやツールの説明を行なうGoogleの方がいて、気軽に話しかけたりすることができます。

f:id:shaunkawano:20180521192442j:plain

f:id:shaunkawano:20180521192513j:plain

オフィスアワーとアプリレビュー

オフィスアワーでは、Googleの方に個別で質問をすることができます。オフィスアワー専用のスペースには、一定の時間ごとに各分野のGoogleの専門家の方がいて、その所定の時間に出向くことで、自分の興味のある分野のGoogleの専門家の方に質問することができます。

アプリレビューでは、自分のアプリをレビューしてもらい、具体的なアドバイスだったり改善点などを教えてもらうことができます。

f:id:shaunkawano:20180521192539j:plain

個人的にオススメの交流・質問場所

アプリレビューをお願いしたい場合には事前に予約をして所定の時間に所定の場所に出向く必要があるため、まずは予約をしておくことが大切のようです。(最終日に現地でアプリレビューを行きたかったが予約で埋まっていてできませんでした)

質問や交流をする場合には、個人的にはサンドボックスがオススメだと思います。オフィスアワーでももちろんできますが、オフィスアワーは本当に「質問をするためのスペース」なので、たくさんの参加者の方がいてGoogleの方に質問をしています。サンドボックスの場合は、デモや作品などの展示があるので、そういった物を介して交流することができるので話しかけやすいと感じました。もちろんサンドボックス内の展示の周りにもGoogleの方はいるので、質問したいけどGoogleの方がいない、ということはありませんでした。

振り返ってみて次はこうしたいと思うこと

期間中を振り返ってみて、もっとこうしておけばよかったということについて振り返ります。これは質問とか交流とかはあまり関係なく、次また当選したりするなどでI/Oに行く機会があれば、こうしたいなーフワフワと思っていることです

  • 初日のキーノート・ディベロッパーキーノートが終わったらcodelabに入り浸る

初日のキーノート・ディベロッパーキーノートが終わってすぐは、わりとcodelabが空いています。codelabスペースでは、用意されているPCや持参しているPC・ラップトップを用いてI/Oで発表された内容等を含めたcodelabを行なうことができます。今回codelabに参加して気付いたことは、codelabの説明内容がセッションの発表内容そのものとかなり重なっているということです。初日1つ2つのcodelabを終えてcodelabと同じトピックのセッションを聴講したところ、内容がかなり頭に入ってきやすかった印象です。codelabで内容を一通りコード上で触り終えているのでセッションは復習のような形として捉えるようなことができました。もちろんリアルタイムで聴講していない分、ホテルに戻ってセッション動画等を見直す必要はありますが、いきなり新しい内容の発表をセッションで学ぶよりは一度codelabを挟んでおいたほうが理解し易そうです。

  • もっと他国からの参加者と友達になる

言わずもがな。今回スウェーデン出身で同じホテルに宿泊していたステファンさんに声をかけてもらい、会場に一緒に向かう道中でお話したりして楽しかったので、次回はもっとこういう人を増やせたらなと欲張りになっています。

  • 日焼け止めをちゃんと塗る

うん、ちゃんと塗ろう(๑•̀ㅂ•́)و✧首元、耳とかの日焼けがあってヒリヒリした

  • 目薬を持参する

ところどころ目が(δ´ω`)カユかったので、持参したほうがよさそう

まとめ

今年のGoogle I/Oでは、出発前からできるだけ色々な方から質問をもらっておいて、頑張って質問して回答を得ようと考えていました。理由は明白で、質問や交流をするという行為に対する心理的ハードルを下げることができるからです。質問や交流をするのは何かと勇気が必要で、嫌な顔されないかな、とか変な質問じゃないかな、とか色んな理由をつけて避けたくなる傾向が自分はあるのですが、質問して欲しい内容をもらったからには、できるだけ質問しなきゃ、と自分を奮い立たせることができます。英語の練習になるのはもちろん、当たり前だけど自分が知らないことを知るきっかけにもなります。キーノートやセッションでは発表されないような内容のことであっても、とりあえず投げかけてみて、現状のステータスだったり、今後はこうするかも、といった方針だったりを教えてもらえることもあります。(もちろん教えてもらえないこともあります。)Win-Win-Winくらいのメリットがありそうだと思えると、できるだけたくさん質問しようという気になりました。

他の方にも、質問を受け付けて回答を持って帰っていらっしゃる方がいました。キーノートやセッションの内容は毎年モリモリでキャッチアップも大変ですが、公式の大きい発表以外にも、どんどん方針だったりグレーゾーンのようなところの情報を集め今後の流れを少しでも察知して、大きなアップデートに備えていきたいです。

最後に、一般参加枠で現地に行かせてくれた弊社に感謝して締めます。ありがとうございました。 🙏