2016-01-01から1年間の記事一覧

JRubyをライブラリとして使う(Android編)

三行まとめ JRuby 1.7.24 (Ruby 1.9.3相当) はAndroidから普通に使える JRuby 9.1.0.0 (Ruby 2.3相当) はOracle JDK固有のクラスを使っていてAndroidでは使えない JRuby on Androidに興味のある開発チームはいるようなので、しばらくすると使えるようにはな…

Kotlin Coroutines の様子を眺める

先日、JetBrainsのブログでKotlinにコルーチンが導入されるという発表がありました。 以下のリポジトリで先行事例の調査や仕様の検討が行われています。 https://github.com/Kotlin/kotlin-coroutines 先行事例の調査は以下のissueです。 https://github.com…

ViewPagerを使った読書画面の基本的な実装

電子書籍関係者で勉強会をやったので資料を公開します*1。 speakerdeck.com 追記: Fragmentの状態の復帰はFragment#onViewStateRestred(Bundle)) でできるのではという指摘をいただきました。試したところ想定通り動いたのでコードの方は修正済みです。 デモ…

Android N preview-2 でJava8 Streamが実装された!

Android N preview-2 がきましたね。 Android N Developer Preview 2, out today! | Android Developers Blog AOSPにはまだtagがきていませんが、masterブランチをみるとStream APIが実装されています。 追記: android-n-preview-2 tagがきてました android-…

Google Maps Android APIでsetMyLocation()を正しく設定する

AndroidアプリでGoogle Mapをライブラリとして使うGoogle Maps Android APIというのがGoogle Play servicesにあるのですが、こいつの setMyLocation() まわりがここ1年でずいぶん変わりました。 Android 6.0 / Google Play services 8.4.0現在、これを正しく…

Hugoの @DebugLog アノテーションが @TargetApi を無効化するようにみえる件

Hugo便利ですね!ただtraceするだけのログを吐いたりメソッドの実行時間を測定するためにコードを書かなくてよくなるのでだいぶ使い勝手がいいデバッグ用ライブラリだと思います。 さて、Hugoを併用しているプロジェクトで@TargetApi をつけているのにlintが…

Android Orma v2.4.0でtype adapterを一つのクラスに集約できるようにした

Orma v2.4.0をリリースしました。差分は大きいですが、アノテーションプロセッサのリファクタがほとんどです。 Ormaのtype adapterは static type adapters というやつで、コンパイル時にtype adapterの検索と呼び出しの埋め込みを行うので動的に処理するも…

Gsonの処理を爆速にするStaticGsonをリリースした

コード生成でGsonをMoshiより高速化する - Islands in the byte stream の続きです。 GitHub - gfx/StaticGson: Static Gson binding library with annotation processing 三行まとめ StaticGsonはannotation processingでコード生成してGsonを高速化する拡…

I/O MultiplexingでAndroidのための効率のよい画像ローダをつくる検証

モバイルアプリのスレッドプールサイズの最適化(画像読み込み編) - クックパッド開発者ブログ これに対する「I/O多重化すればスレッド数とか気にしなくていいんじゃないの」という意見を聞いて、それもそうだなと思ったので検証してみました。 前提知識 IO…

「Android NでJava8がサポートされた」とはどういうことか

追記: StreamやOptionalはpreview-2で実装されたようです。 gfx.hatenablog.com Android N previewが公開されましたね!このバージョンではJava8のサポートがあると発表されています。また、標準クラスライブラリがOpenJDKベースの実装になったことで、Java8…

コード生成でGsonをMoshiより高速化する

高速化しました。ざっくり実装しただけなのでリリースはしていません それなりに有効そうなのでjcenterにリリースしました。*1。 https://github.com/gfx/StaticGson ベンチマークについて まずスコアをみていただきましょう。dynamic gsonがGoogle Gson v2.…

JSON-P / JSON-BのAndroid Backportがほしい

いまはJSON処理用ライブラリが乱立していて、しかもそれぞれインターフェイスが違うので選ぶのが難しい。JSON-Object mappingはJSON-BがあるのでこれがAndroidにもbackportされればいいのにと思っている。 The Java Community Process(SM) Program - JSRs: J…

Orma v2の新機能と今後の展望

Ormaの v2.1をリリースしました。Ormaはセマンティックバージョニングを採用しているので、"v2"は単に"v1"と互換性のない変更を行った、というだけの意味です。とはいえ機能もいくつか追加しているので紹介します。 なお Orma入門はv2.1の内容にアップデート…

RxJavaのリソース管理: イベント放出の際にisUnsubscribed()をチェックすべきだった!

いままでずっと勘違いしてましたが、チェックすべきなんですね。 きっかけはこれ: RxJavaのイベントリソースの解放とisUnsubscribed()の関係について - Togetterまとめ これは Observable.create(OnSubscribe) で onNext() や onComplete() でイベントを放出…

android.support.v4.util.PoolsでStringBuilderをプールしても意味なし

Pools | Android Developers これがちょっと気になっていて、たとえば new StringBuilder() を数多く実行するケースでもしかしたら速くなるのでは?と思って試してみました。 10万回のStringBuilderを生成して文字列連結などをしています。 StringBuilderPoo…

Ormaのユニットテストをどう書くか、あるいはMockitoは諸刃の剣という話

短い答え OrmaはRobolectric上でほぼ完全に動作するので、 OrmaDatabase.builder(context).name(null).build() でオンメモリDBを作ってそれを使うDAOをテストすればよい。 長い答え Orma を使ったユニットテストは、Ormaを使うコードが正しいかどうかをテス…

Android Support Libraryをビルドする

DroidKaigi 2016 お疲れ様でした。私は今回もスタッフとして参加して、両日ともRoom Aの司会などを努めました。 2日目の基調講演は余裕があったので聞いていて、いろいろ知見があってよかったと思います。そのときのメモとあとでarakiさんと話したときのメモ…

GitHubのマイルストーンを個人プロジェクトで設定してみたがイマイチだった

三行まとめ ライブラリのセマンティックバージョニングは使う側にとって分かりやすいので採用したい GitHubのマイルストーンは「互換性を失うバグフィクス」に弱いので、セマンティックバージョニングを採用しているライブラリには不向き モバイルアプリはセ…

Android ORMでオブジェクトの埋め込みはどのように実装するか

Table of Contents: 概要 実例 GreenDAO DBFlow ActiveAndroid Ormaでの実装 概要 大抵のORMは特定の型をシリアライズしてカラムに埋め込む機能があります。この機能を type adapterと呼ぶことにします。このtype adapterについて、既存のORMの実装とOrmaで…

Android Orma入門

2015年の11月から開発を続けているAndroid用O/R Mapper Ormaですが、このほどv1.0.0をリリースしたので入門記事を書きました*1。 UPDATE: この記事の対象はv4.1.0です。最新版はリポジトリでご確認ください。 関連エントリ: ActiveAndroidからOrmaに移行する…

Android Javaでフィールドにmプレフィクスをつけるのはやめよう

Android Javaでは昔からAOSPのcoding style guidelineに則ったスタイルがとられることが多いようです。そのなかで、private fieldに "m" (member) や "s" (static member) などのプレフィクスをつけよ、というものがあります。 AOSP Java Code Style for Con…

PerlのRegexp::TrieをRubyに移植した

GitHub - gfx/ruby-regexp_trie: Optimized Regexp builder with Trie (a Ruby port of Perl's Regexp::Trie) # Gemfile gem 'regexp_trie' これははてなキーワードやWikipediaのリンクのように、ある程度の量のテキストに対して大量のキーワードをマッチさ…

Retrofit 1.9.0からRetrofit 2.0.0-beta3に移行した記録

Retrofit 1.9.0 を使っていたコードをRetrofit 2.0.0-beta3に書き換えてみたら思いのほか変更が多くて大変でした。 全体的に、Retrofit自体がOkHttpのみに依存するようになったことで、OkHttpと重複する機能が削られるなどインターフェイス全域にわたる大き…

Android LibraryはconsumerProguardFilesでProGuardの設定をAARに同梱できる

まあタイトル通りなんですが、このことは意外と知られていないようです。 apply plugin: 'com.android.library' android { defaultConfig { consumerProguardFiles 'proguard-rules.pro' } } というのも、Android Gradle Pluginのユーザーガイドには載ってい…

RobolectricでAndroidManifest.xmlにアクセスできない問題

調べた結果、どうもAndroid Studio 1.5.xでJVMテストを起動する場合のカレントディレクトリと、コマンドラインからJVMテストを起動する場合のカレントディレクトリが違うのが原因であるようでした。 この対応は難しいので、Robolectric-Instrumentationでは …

ActiveAndroidからOrmaに移行するための4つのステップ

だいたいOrmaでAcitiveAndroid (AA) を置き換える準備が整ったので、手順を書いておきます。 Table of Contents Table of Contents Step 1 - インストール Step 2 - スキーマ定義 Step 3 - 初期化 Step 4 - CRUD操作 その他注意点 Step 1 - インストール bui…

Annotation Processor開発にJava8は使っていいのか

AndroidでJava8は使えるのか? - Islands in the byte stream は実行環境の話で、 Androidアプリ開発にJava8は使えない という話でした。今回は開発環境の話です。 短い答え Annotation Processor*1はAndroidアプリのコードには含まれないのでJava8で開発し…

Elasticsearch+Railsでフィールドがどうanalyzeされるかをドキュメントごとに見る

環境: Elasticsearch 1.7.3, elasticsearch-rails 0.1.8 ドキュメントごとにフィールドがどうanalyzeされて格納するかを管理画面に表示したいのだけど、そういう便利APIはないみたい。 そこでmappingの設定を読んで一つ一つ _analyze するユーティリティを定…

Orma v0.22.0でKotlinに対応した

環境: Kotlin 1.0.0-beta-4584, Orma v0.22.0, JDK 1.8.0_66 Kotlin*1自体はJava Annotation Processingにも対応しているので、JavaからKotlinのコードを呼べるようにするだけでよかった。 Ormaは生成したコードからモデルであるクラスを参照するので、Java…

AndroidでJava8は使えるのか?

まず「Java8」というとき、それがどういう意味なのか考えないといけません。 「Java8」のコンポーネントには主に次の三種類があると思います。 lambdaを代表としたJava8の構文 streamやoptionalなどのJava8の標準ライブラリ 最新のJVMの仕様(特にGC) 最後…