Subscribed unsubscribe Subscribe Subscribe

Islands in the byte stream

Technical notes by a software engineer

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) などのプレフィクスをつけよ、というものがあります。 Code Style for Contributors …

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) 最後…

近い将来AndroidのクラスライブラリがOpenJDKベースになるらしい

Google confirms next Android version will use Oracle's open-source OpenJDK for Java APIs | VentureBeat | Dev | by Emil Protalinski AOSPへのコミットへのRedditスレッドから発展し、12/29にVentureBeatがGoogleからコメントをもらいつつ記事にされた…

Rebuild.fm 120 に出ました&今年のまとめ

今年の総括エントリでも書こうかな、と思ったのですが、だいたい12月冒頭の #rebuildfm 120 で喋った気もします。 Rebuild: 120: Swiftonomics (gfx) Rebuild: Aftershow 120: Cooperative Single-Tasking (gfx) まあ被ってもいいやということで、今年の振り…

Robolectric-InstrumentationでテストをRobolectricとAndroid両方で走らせる

Table of contents: 概要 Robolectric Instrumentationを導入する testInstrumentationRunnerを設定する robolectric.propertiesを導入する src/test を src/androidTest にシンボリックリンクする テストをAndroid Instrumentation Testing API準拠にする F…

テストクラスをAndroid Instrumentation TestsとRobolectric Tests両方で走らせる

(追記: このハックはライブラリとして独立させました gfx/RobolectricInstrumentation · GitHub) Robolectricは便利ですが、Oracle JREとAndroid Runtimeの微妙な挙動の違い、特にAndroid Runtimeにバグの回避するようなコードのテストができないという問…

Android-Orma 進捗(v0.18.0時点)

gfx.hatenablog.com このエントリの続きです。あれから順調に開発は進み、だいたいやりたいことができるようになりました。 gfx/Android-Orma · GitHub 先日行われた 天下一「AndroidのORM」武道会(2015年版) - Qiita では好成績を残し、Realmにはかなわな…

AndroidライブラリでANTLR4によるパーサを生成&使用する

三行まとめ ANTLR4で生成したパーサはAndroidからも利用可能 ANTRL4によるパーサはJavaCCによるパーサと比べてずっと遅く、実機では10ms単位で時間を使うので注意 ANTLR4を組み込むにあたってのビルドスクリプトはAndroid-Orma/migration/build.gradleを参照…

Observableでリストを得るインターフェイスの設計の具体例を少々

RxJava Advent Calendar 2015の最終日です。軽めにいきます。 Observableでリストを得るインターフェイスを Observable<T> にすべきか Single<List<T>> にするべきか迷うことがあると思います。 結論からいえば、迷った時は Single<List<T>> だろうと思っています。 List<T> を得る</t></list<t></list<t></t>…

RxJavaのミニマム実装でScheduler周りを書いてみるゾ!

RxJava Advent Calendar 2015 の23日分です。 はい、さっそくですがRxInTheBoxにSchedulerを実装しました。 observeOn() と subscribeOn() が本家RxJava同様の振る舞いをします。 add subscribeOn() and observeOn() to RxInTheBox by gfx · Pull Request #2…

Android CI with Docker on Circle CIを高速化する

追記: 実際に運用するときはライセンス問題にご注意ください: 公開用DockerイメージにAndroid SDKを含めるのはライセンス違反という話 - Islands in the byte stream 私は個人プロジェクトでもそれなりの規模になるときは、プルリクエストベースで機能開発し…

RxJavaのsubscribeOn()とobserveOn()を使いこなしたい

RxJava Advent Calendar 2015 の 12月12日分です。 RxJavaのSchedulersは、RxJavaのコールバックの実行スレッドを制御するためのコンポーネントです。 恥ずかしながら、最近まで subscribeOn() と observeOn() の使い方を理解していませんでした。よって本稿…

Support Condition Query Helpers in Orma v0.9.0

gfx/Android-Orma · GitHub condition query helpersってのは次のコードの titleEq() みたいなやつです。モデルに定義した @Column(indexed = true) なカラムについて、*Eq() *NotEq() *In(), *NotIn() などのヘルパーメソッド(中身は where() を呼び出すだ…

Robolectric 3.0でandroid.util.Logの出力を確認する方法

テストケースクラスで以下の用に設定すると、 android.util.Log の結果がAndroid Studioのテストログに出力される。 static { System.setProperty("robolectric.logging", "stdout"); } テスト実行の際のVM optionsに -Drobolectric.logging=stdout を与えて…

Androidでライブラリモジュールからアプリケーションのdebuggableフラグを参照する

特定のモジュールの BuldConfig.DEBUG はそのモジュールの開発中でしか使えません。しかし、ライブラリやメインのアプリケーションではないモジュールからこの値を参照したいこともあります。 そんなときは、ApplicationInfoからdebug flagを取得することが…

Android SQLite用にスキーマの差分DDLを生成するモジュールを書いた

前回のエントリの続きです。 gfx.hatenablog.com SQL::Translator::Diffを真似て、Android用マイグレーションモジュールを書いてみました。Orma projectの一部です。 gfx/Android-Orma · GitHub (v0.2.0 として利用可能) 実装は SchemaDiffMigration.java …

モバイルアプリのデータベースマイグレーションを考える

モバイルアプリのデータベースのマイグレーションをORMで実装するにはどうしたらいいか考えている。 Perl界隈だと SQL::Translator::Diff というモジュールが知られていて、たとえば以下のようにDDLの「差分」をとることができる。 $ cpanm SQL::Translator:…

AndroidのORMに求めること、あるいはOrmaを開発した話

Android用ORMライブラリを書き始めました。 github.com 開発の動機 AndroidのORM事情は2014年の天下一「AndroidのORM」武道会 - Qiita あたりをどうぞ。ただ2015年11月現在だとDBFlow 2.xが爆速になっており、GreenDAOに匹敵するレベルになっていそうです。…

ISUCON5に†空中庭園†で出場して5位でした

isucon.net gfx、ryotarai 、eagletmtでした*1。 ryotarai/isucon5 · GitHub 役割的にはぼくはアプリケーションのチューニングで、expeditor をいれたりPgからRedisへの移行を手伝ったり細かいチューニングを行ったりしてました。あとは序盤はプロファイラを…

Stetho 1.2.0でJavaScript consoleからアプリにアクセスできるようになった

Stethoも1.2.0となり、さまざまな便利機能が使えるようになっています*1。 1.2.0の大きな新機能として、Chrome Developer ToolsのConsoleからアプリの内部状態を操作できるようになりました。まず、以下のようにstetho-js-rhinoが必要です。 debugCompile 'c…

SwipeRefreshLayout+RecyclerViewでローディング画面を出すのに苦労した話

Android support libraryのSwipeRefreshLayoutは直下のviewがscrollableでないといけないようで、下記のような構造だとスクロールアップのイベントを常にSwipeRefreshLayoutが奪ってしまい、RecyclerViewをスクロールアップできなくなってしまいました。 <SwipeRefreshLayout> <RelativeLayout> <RecyclerView/> <ProgressBar/></progressbar/></recyclerview/></relativelayout></swiperefreshlayout>…

Nexus Playerを使ってみてAndroid TVに思うこと

Android TVを使ってみたくてNexus Playerを買いました。まず注意点として、 起動したらすぐにAndroid OSのアップデート をしたほうがいいです。デフォルトで入っているAndroid v5.0だとNetflixで日本語を表示できませんが、OSアップデートで直ります。 さてA…

okhttpのドキュメント

okhttpのドキュメントはあまりないのだけど、wikiのrecipe集がそこそこ揃っている。 Recipes · square/okhttp Wiki · GitHub 実際に動くコードははsamples moduleにあるのでcloneするとIDEで見ることができる。 square/okhttp/samples/com.squareup.okhttp.r…

Gson.fromJson()でList<T>を返すユーティリティをどうやって定義するか

google/gson GsonでList<T>をデシリアライズするのがけっこう面倒くさくて、以下のようにしなければいけません*1。 Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); List<Integer> ints2 = gson.fromJson(json, collectionType); ところが、 List<T> を意味する Type </t></integer></collection<integer></t>…

AndroidオールスターズでAndroidのWeb Api Clientについて発表しました

Androidオールスターズ - 2015/08/08(土) - dots. [ドッツ] スレッドプールについて補足します。これはアプリ全体で1つのfixed thread poolを使うべきというわけではなく、用途ごとにスレッドプールは用意するのがいいでしょう。ただし、そのスレッドプー…

Added AndroidSubscriptions to RxT4A v0.10.0

RxT4A v0.10.0をリリースしました。旧RxAndroidにあったAndroidSubscriptionsを追加しています。 オリジナル実装: RxAndroid/AndroidSubscriptions RxT4A実装: RxT4A/AndroidSubscriptions ほとんど同じですが、RxT4Aのほうが低レベルAPIを使っているので軽…

RxT4Aの紹介 #potatotips 19

https://github.com/gfx/RxT4A これは何 RxAndroidのフォーク RxBindingの機能は実装しない 動機 RxAndroidの先行きが不透明 社内で作ってるRxJava用ユーティリティを公開したい(未着手) RxJavaのベストプラクティスやバッドくラクティスを example/ に提…

AndroidのThreadPoolExecutorに関する覚書

ThreadPoolExecutor を調べていて、 Thread インスタンスの最大数はどんなものだろうと思ったので確認したところ、端末によって異なりますが1000個〜10000個程度でした。これを超えるとOutOfMemoryErrorが発生したり、最悪の場合いきなりクラッシュしたりし…

Puree v3またはorg.json.JSONObjectのかわりにGsonのJsonObjectを使う話

三行まとめ puree-androidを全面的に com.google.gson.JsonObject を使うように書き換えてv3にした JsonObjectはJSONObjectとほぼ同様に使うことが出来るがチェック例外がないのでほとんどの用途で使いやすい JsonObjectの構築はJSONObjectより少し高速で文…