Islands in the byte stream

Technical notes by a software engineer

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

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より少し高速で文…

Android DataBinding導入の第一歩: ButterKnife+ViewHolderパターンを置き換える

仕事で関わっているアプリのmasterブランチに Android Data Binding が導入されたのを見届けたので、自分でもちょっと使ってみました*1。 DataBidingのメリットや導入にあたってのハマりどころは以下のsys1yagiさんのエントリから: Android Data Binding Li…

CompositeSubscriptionは再利用できない #RxJava

CompositeSubscriptionは複数のSubscriptionをまとめてunsubscribeするためのクラスです。 これは、Grokking RxJava, Part 4: Reactive Android でも触れられているように一度 unsubscribe() すると再利用できません。つまり、Androidのコンポーネントのよう…