Islands in the byte stream

Technical notes by a software engineer

PlantUML Web APIをSpark Framework + Kotlinなウェブアプリにしてみた

PlantUML を使うとき、 java -jar plantuml.jar だとほんの小さなダイアグラムの生成にも数秒かかってしまいます。ローカルではそれでいいかもしれませんが、ウェブアプリに組み込むのはちょっとイマイチですよね。 PlantUMLはJava製ツールなのでJavaのウェ…

TypeScript 2.0+NodeJSツールを開発するときのプロジェクト構成

npm dependenciesを更新してGitHub Compare Viewのリンク付きでPRするツールを定期実行する - Islands in the byte stream このci-npm-updateはTypeScript 2.0 (beta) で書いたので、TypeScript+NodeJSツールを開発するときのプロジェクト構成の一例としてざ…

npm dependenciesを更新してGitHub Compare Viewのリンク付きでPRするツールを定期実行する

タイトルに要素を詰め込みすぎましたが、要は CircleCIを使ってbundle updateを定期実行する - Qiita の npm update 版です。web appのJavaScriptライブラリ管理にnpmを使うとき、依存関係のアップデートを継続的に行うためのツールです。 https://github.co…

ExcelからtextareaにコピペするとHTMLのtableに変換するスニペット

ユースケース Excelから社内ブログやWikiに表をコピペしたい 実装 とりあえず paste イベントをうけて処理するのでそのようにする。今回はCodeMirrorで制御されているtextareaなので、CodeMirrorを使ってないない場合は適宜読み替えてください。 ClipboardDa…

公開用DockerイメージにAndroid SDKを含めるのはライセンス違反という話

Android Software Development Kit License Agreementにこういう項目があります。 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, yo…

Makefileを自己文書化するハックを注入するスクリプト: inject-make-help

Re: Makefileを自己文書化する make2help | おそらくはそれさえも平凡な日々 この主のコマンドのインストールを強制するのめんどうだし、自己文書化hackを注入&管理するコマンドのほうがうれしそう。 / “Makefileを自己文書化する `make2help` | おそらくは…

git branch の結果を時間順にソート: git branch --sort=-authordate

id:kazuho さんと「gitのbranchを消すべきか否か」という話をしていて、ぼくの「ローカルにせよリモートにせよbranchが増えすぎると目的のブランチを見つけられない」という意見に対して次のエントリを教えてもらったのでした。 git branch の結果を時間順に…

はてなブログでRust対応のアップデートをしてほしい!

お題「シンタックス・ハイライト機能で対応してほしい言語」 Rust のシンタックス・ハイライトは対応されているようですが、この日記を書いた時点だと、extern, match, where などがハイライトされていなくて、対応バージョンが古いような気がします。シンタ…

github.comのアカウントは仕事用と私用で分ける方がいいの?

一行まとめ:分ける理由・分けない理由両方あるのでどちらにすべきということはない 会社で github.com (not GHE) を採用するにあたって、アカウントについてガイドラインを制定すべきなのかどうか悩んでいます*1。とりあえず現状把握のためにアンケートを取…

Android Instant Apps FAQをざっと眺めた

Google I/O 2016で発表されたアプリをインストールしなくても使える "Android Instant Apps" ですが、技術が不明ということで様々な憶測を呼んでいます。 developer.android.com これについては、すでにFAQがあっていくつかの疑問には答えられていました。 h…

GlideのバックエンドをOkHttp3にしてカスタムインスタンスを与える

github.com GlideのバックエンドをOkHttp3にするには、 okhttp3-integration を使います。 dependencies { compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar' } これだけで、GlideのバックエンドHTTPクライアントがOkHttp3になります。 し…

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) などのプレフィクスをつけよ、というものがあります。 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 私は個人プロジェクトでもそれなりの規模になるときは、プルリクエストベースで機能開発し…