Infinito Nirone 7

Androidとか自転車とか

CircleCI 2.0 で GCR に置いた private な Docker イメージを使ってビルドする

今日は Wercker がビルドキューを無限に積んでビルドしてくれなくなってしまったので、急遽 CircleCI 2.0 を試すことにしました。 メモリが足りずに OOM Killer にデーモンが殺されたり、desugar 中になにかが失敗しているようですが、とりあえず一番大事な…

DroidKaigi 2018 やっていきed

「やっていき」だと未来の話だけど、やっていきが完了した話はどうやって言うのがいいか分からなかったので、edをつけてみました。 はい。DroidKaigi 2018 が無事に終わりました。自分の参加歴はスピーカーとしては 2 回目・スタッフとしては 4 回目(フル参…

DroidKaigi 2018 Day 2 Room 5 で"詳解 Android Auto"という発表をします

droidkaigi.jp 気がついたら仕様の総ページ数が 200 を超えていて、超大作でお送りいたします。 Android Auto という取っ掛かりではありますが、幅広く応用の効く話を中心に据えていて、というか Android Auto の実体がほぼそういう潰しの効くフレームワーク…

ProductFlavor ごとに apply from で読み込む外部 Gradle ファイルを切り替える

flavor1 と flavor2 という 2 つの productFlavor があり、flavor ごとに名前が同じで値の異なる変数を使いたいとき、flavor1 向けの変数を定義した flavor1.gradleと flavor2 向けの変数を定義した flavor2.gradleを用意したとして、どのように apply from …

BuildType と ProductFlavor のマトリクスで BuildConfigField や ManifestPlaceholders を生成したい

BuildConfigField は、BuildConfig という自動生成されるクラスに定義する定数をビルドスクリプトから制御する仕組みです。 そしてもうひとつ、ManifestPlaceholders は AndroidManifest のプレースホルダーに放り込む値をビルドスクリプトから制御する仕組…

あけましておめでとうございます

今年も例によって浅草寺へおみくじを引きに行ってきました。 何一ついいこと書いてないのに凶じゃないのかよ!!

2017年振り返り

はやりのビッグウェーブ*1に乗って2017年を振り返りたいと思います。 ちなみに、1月のツイートを遡るだけでも随分な数になったし、何を思ってそれを言ったのかよく覚えていないものもたくさんあってちょっと後悔しています。 1月 Android でうるう秒見てみよ…

RxEither を RxJava2 に対応してみた

もともとのモチベーションとして、Java で Either を扱いたくて色々探していました。 そのなかで RxJava との運用もカバーしてくれている RxEither を見つけたのですが、あいにく RxJava 1.x で止まっていたので RxJava 2.x に対応させてみることにしました…

C93 Android モダンプログラミングに RTL 対応の章を書きました

明日から C93 が始まりますね。TechBooster から Android モダンプログラミングという新刊が出ますが、そのなかにある RTL 対応の章を担当しました。 techbooster.github.io この章を見れば RTL 対応に必要なことが大体網羅できるはずです。よくあるレイアウ…

諸君、私はAndroidが好きだ

諸君、私は戦争が好きだ: wids.net 作ってみました。 諸君、私はAndroidが好きだ 諸君、私はAndroidが好きだ 諸君、私はAndroidが大好きだ クラッシュが好きだ ANRが好きだ 機種依存問題が好きだ 激安端末が好きだ 売れないタブレットが好きだ アメリカで 日…

Canon EOS 6D MarkII を持って散歩した

前まで使っていた EOS Kiss X3 が天寿を全うしまして、新しいのほしいなと思っていたときに神楽坂つむりさんのブログ記事を読んでフルサイズよさそうだな?と思っていたところ、フルサイズはいいぞという声をTwitterでも頂いたので、自転車もあることだしあ…

SparseArray から要素を取り出したときに ClassCastException が発生するパターン

SparseArray は Android のフレームワークにあるコレクションの一種で、Integer を key にした HashMap よりもメモリ効率がよいとされるコレクションです。 SparseArray には 2 通りの値を取り出すメソッドがあります。一つはSparseArray#get(int)もう一つは…

例外をネストしたクラスとして定義するときは必ず static なネストしたクラスにする

いい具合にトラブってしまったのでメモです。 クラスの定義にはいくつかの種類がありますが、あるクラスの内部にネストした(入れ子になった)クラスを定義することができます。このとき、修飾子として static をつけたネストしたクラスと、それがないネスト…

RxJava1 から RxJava2 へ移行する時に nullable な値とうまくつきあう

次のような RxJava1 のコードを RxJava2 に移行することを考えます。 import rx.Observable; // RxJava1 private Value nullableValue; public Observable<Value> observeValue() { return Observable.fromEmitter(emitter -> emitter.onNext(nullableValue)) .filt</value>…

自転車でめぐる SHIROBAKO の聖地

この記事は SHIROBAKO Advent Calendar 2017 の 17 日目の記事です。 adventar.org SHIROBAKO には木佐さんという自転車が趣味のアニメーターさんがいます。えくそだすっ!のときには、落合がカナンの人と話をしているところを目撃したり、8 カット上げたこ…

甘い口溶けのスタウトビールを飲みました

この記事はBeer Advent Calendar 2017の9日目の記事です。 adventar.org きっかけ なにがきっかけでチョコレートビールの存在を知ったのかは忘れてしまいましたが、その後たまたま見かけたアニメでも取り上げられていて、なるほどこれは良さそうと思いアドベ…

potatotips #45 で発表してきた

potatotips #45 にて WebView と題して発表してきました。 speakerdeck.com 概要 ChromeCustomTabs の登場で使い所が限られてきている WebView ですが、法的情報(プライバシーポリシーや規約など)の簡素な静的 HTML を表示するために手軽に使えるため、意外…

RTL かどうかを判定する

RTL(Right To Left; アラビア語などの右から左へテキスト等をレイアウトする必要のある環境)対応にはいくつかのステップがあります。 単にレイアウトの属性を RTL に対応したもの(gravity や margin、padding や RelativeLayout の各種属性を Left/Right で…

StateListDrawable の子にあたる Drawable の背景色を Animator で変えてみる

概要 Android Framework に数ある Drawable のなかでも、View の状態に応じて使う Drawable を切り替えることのできる StateListDrawable は多くの人が使っていると思います。ListView のアイテムの背景、ボタンの背景などインタラクションをする View に対…

懐かしいゲームがリメイクされていたのでテンションあがって遊んでみた

懐かしいゲームというのはこれのことです。 store.steampowered.com 内容は、60年代の米国とソ連が宇宙からきた未知の資源を巡って太陽系の惑星やら衛星でドンパチするという完全に硬派でシブいSFゲームですが、発売当時(98年)のPCでもモリモリ動く3Dのファ…

RecyclerView の item に focus が当たったことを検知する

やりたいこと 旧来の AdapterView (ListView や GridView など)でいうところの OnItemSelectedListener と同じように、RecyclerView がもつアイテムにフォーカスが当たったときにその情報をコールバックする方法です。 方法 RecyclerView には OnChildAttach…

ツールド東北

ツールド東北に同僚と参加してきました。 出場するのは日曜日の南三陸コース。前日に民泊のお家に到着して、そこから受付をしに自転車を組み立てました。 石巻の会場にはSubaru XV が!上には Bianchi の自転車が乗っかっていて、よさそう(小並感)と思いま…

嬬恋キャベツヒルクライムに参加してきた

今年からサイクリングイベントに参加し始めてはや3回目の大会となりました、群馬県嬬恋村の万座ハイウェイを自転車専用に貸し切って開催された嬬恋キャベツヒルクライムに参加してきました。 cabe-hill.net 距離は約20kmで1000mの標高差を登ります。平均勾配…

NuAns NEO Reloaded 使用感

Nexus5X から次の端末を探しているときに NuAns NEO Reloaded がリリースされたのを機に乗り換えて、2ヶ月ほどが経ったので使用感を書き残しておこうと思います。 概ね Vanilla Android なので、Nexus シリーズのリファレンス機に慣れていれば特に違和感なく…

SMS が相手に届いたかどうか判定する

SMS や MMS と言ったメッセージのやりとりの仕組みには、Delivery Report という機能があります。SMS をおくると、キャリアが Delivery Report を送り主に返します。この Delivery Report を見ることで、SMS が相手に届いたかどうかが分かります*1。 SMS や …

RxJava 1.x -> 2.x: Observable.OnSubscribe<T> から ObservableOnSubscribe<T> へ移行する

RxJava 1.x には Observable の static なインナークラスとして Observable.OnSubscribe がいました。Javadoc にあるとおり、Observable を subscribe したときに呼ばれるメソッドを定義するためのフックになるクラスです。 RxJava 2.x ではインナークラスで…

ビーナスライン

最近は毎日30度超えの真夏日で、自宅から日帰りで行って帰ってこれる場所では暑すぎて熱中症待ったなしだと思ったので、電車輪行の練習も兼ねて長野県茅野市から松本市に至るビーナスラインを走ってきました。 電車での移動距離もそこそこあるので、特急に乗…

<merge> タグをつかったレイアウトのプレビューを期待通りに表示する

Issue Fragment を使わず View をベースにしてレイアウトを組むと、Fragment と同じような役割をもった CustomView を作ってレイアウトを組みます。 このとき CustomView は何かしらの ViewGroup を継承することになりますが、そのレイアウトファイルのルー…

Kotlin でかいた interface を Retrofit に食わせたときのエラーに対処する

TL; DR Kotlin & @Body · Issue #1805 · square/retrofit · GitHub 問題 Retrofit で REST API のクライアント実装を生成する時、Kotlin で書いた interface を渡すとき、メソッドにジェネリクスを使った引数がいるとまれに次のようなエラーメッセージを吐き…

Robolectric 3.4 RC3 で dependencies の ArtifactId が変わります

Robolectric にはいくつかのサブプロジェクトがあり、それぞれに dependencies を追加する必要があります。Robolectric ではサブプロジェクト名が ArtifactId になっています。 そして 3.4 RC3 から ArtifactId が変更になったものがあります。主には、robol…