Spring Web Flux でServer Sent EventsのPush型APIをつくってみた

Spring Boot 2.0からWebFlux frameworkが導入された。Reactorが使えてReactive Programmingが可能になったのでPush型のAPIをつくってみた。 どんなAPIをつくるか コンテンツが更新されたら件数を教えてくるAPI Server Sent EventsのContent-typeをサポートす…

Android JetpackのNavigationを試して導入手順をまとめた

Google IO 2018で発表されたJetpackの新しいコンポーネントのNavigationをアプリに導入してみた。 developer.android.com TL;DR Toolbar、Bottom Navigation、onClickイベントに関わる画面遷移をNavigationに置き換えてみた。 試した結果、コード短縮をゲッ…

Android Support LibraryのChipを触ってみた

Android Support LibraryのChipの使い方をまとめていく。ChipはMaterial DesignにあるがSupport Libraryに組み込まれたのは28.0.0.Alpha 1からである。 material.io developer.android.com よってgradle settingを次のように更新する。 ext { compileSdkVers…

SwipeRefreshLayoutとRecycleViewをListViewに導入してみた

ブログエントリで試しているアプリにSwipeRefreshLayoutとRecycleViewをListViewに導入してみたのでまとめていく。 SwipeRefreshLayout SwipeRefreshLayoutはViewGroupの1つで引っ張って更新する機能を導入することができる。 まずはレイアウトからまとめて…

rx-preferencesをつかってSharedPreferencesの更新をSubscribeする

ブログエントリで試しているAndroidアプリにFluxアーキテクチャを導入をしたことでデータの流れがStreamになった。SharedPreferencesも rx-preferencesをつかえば更新状態をSubscribeできるので導入過程をまとめていく。 github.com お試し中のアプリはOpenW…

Dagger2 + uber/Autodispose + RxJava2でFluxアーキテクチャを導入してみた

ブログエントリで試しているAndroidアプリにFluxアーキテクチャを導入してみたのでまとめる。 Fluxアーキテクチャ Fluxアーキテクチャに関する情報は調べるとたくさん見つかるので概要までに留めておく。 github.com Fluxはアプリケーションデータを管理する…

Dagger2(android support module)をつかってFragmentにDIする

Dagger2(android support module)をつかってFragmentにDIする方法をまとめていく。 HasSupportFragmentInjectorを実装する MainActivityにHasSupportFragmentInjectorを継承させ必要な実装をします。 class MainActivity : AppCompatActivity(), HasSuppor…

Dagger2 (android support module)とretrofit2をつかってAPIレスポンスをListViewで表示する

掲題のとおりAndroidのListViewを表示してみる。 APIリクエストは retrofitを使い天気情報を取得できるOpenWeatherMapのAPIを利用する。 github.com DIにはDaggerを使い、2.11から有効なandroid support moduleを利用する。 github.com APIをリクエストするS…

minikube + helmでローカル環境を構築する

plasmaの動作確認のためにローカル環境を構築する機会がありminikube + helmで構築してみようと始めたのがエントリのモチベーション。 github.com plasmaはServer Push型のミドルウェアでFRESH!で使われている。ポーリング撲滅を掲げgRPC/SSEを用いて省コネ…

SpringBoot 2.0.0でRouterFunctionのエラーハンドリングをWebExceptionHandlerで行う

SpringBoot 2.0.0からサポートされるRouterFunctionのエラーハンドリングをまとめていきたい。 RouterFunctionは従来のアノテーションベースでAPIを作る形ではなくDSLベースでルーティングを定義していく。 @Configuration class TaskRoutes(private val tas…

モダンな負荷テストツールのk6を試してみた

負荷テストツールのk6を試す機会があったのでアウトプットしていく。 k6.io k6は負荷テストサービスを提供するloadimpact社が開発する負荷テストツールでツール自体はgoでテストケースはES6で書く。 レポート出力はInfluxDB+Grafanaまたはloadimpact Insight…

grpc-ecosystem/grpc-gatewayのセットアップ方法をまとめてみた

Server Side Kotlinのアウトプットにつかっているレポジトリにgrpc-gatewayを入れてみたので、セットアップ方法をまとめておく。 github.com grpc-gatewayはHTTP/1.1のAPIの提供する。定義したprotoにoptionを加えることでHTTP/1.1 APIのコードとgrpc-client…

CA.ktに登壇してServer Side Kotlinについて話してきた。

CA.kt #3で登壇しました。テーマは「FRESH!プロジェクト/Server Side Kotlin 活用事例」。スライドはこちら。 speakerdeck.com 約1年前にFRESH!チームにジョインしてKotlinに出会いServer Side Kotlinと向き合ってきた経験を話してきた。 Server Side Kotl…

grpc-javaのClientでHeaderをセットしてリクエストする方法をまとめる

gRPCのClientで認証ヘッダーなどリクエストHeaderに値をセットしてgRPC Serverへリクエストするにはどうすればよいか?今回のエントリではgrpc-javaのClientでHeaderをセットしてリクエストする方法をまとめていく。 これまでのエントリではgRPC Serverのほ…

grpc-javaのServerでTLSを有効にした場合はALPN対応しているか確認すべし

開発中のプロジェクトでTLSが有効なGo製 gRPC ServerにAndorid8.0(Oreo)からは接続ができて、Kotlin製(grpc-java) gRPC Serverには接続ができない状況に直面した。 原因はOpenSSLでTLSを有効にしていたがALPN対応ができていなかった。Android8.0(Oreo)では…

SpringBoot 2.0とapiDocを連携させてみた

SpringFrameworkでAPIドキュメントを準備する手段としてSpringFoxやSpring REST Docsなどが候補にあがる。 SpringFox by springfox Spring REST Docs 両者とも導入敷居が低くSpringFoxはコントローラクラスやレスポンスモデルにアノテーションをつけていきSp…

gRPC serverのmetadataをテストする方法をまとめる

gRPC ServerのレスポンスにはMetadataを含めることができる。gRPCのレスポンス・ステータス(io.grpc.Status.OKやio.grpc.Status.INVALID_ARGUMENT)やDescription(エラーメッセージ)に加え、例えば400系のエラーでも異なるエラー内容をクライアントに伝え…

jackson.datatypeをつかってiOSのレシートの日付文字列をデシアライズする

iOSアプリで購入したアイテムのレシート検証を実装する過程でレシートに含まれる日付文字列をdata classにデシアライズしてみた。 レシートに含まれる日付は次のような形となっている。 "expires_date": "2016-06-17 01:32:28 Etc/GMT" 見慣れないタイムゾー…

KotlinでConstructor Injectionが増えてきたからDelegateをつかってリファクタリングしてみた

今回のエントリはDelegateの使い方をまとめる。 次のようなConstructor Injectionに複数のサービスクラスが並んだTaskBackendServerクラスがある。 @GRpcService class TaskBackendServer(private val getTaskService: GetTaskService, private val findTask…

protobuf typeに値が入っているか確認するにはgoogle/protobuf/wrappers.protoをつかうとよい

今回のエントリも前回に続きprotobufの数あるtypeの中から1つの使い方まとめていきたい。今回は google/protobuf/wrappers.protoをまとめていく。 protobufのtypeのなかにはプリミティブなtypeとしてstringやuint32, uint64などが用意されている。プリミテ…

protobuf typeに日付型のcom.google.protobuf.Timestampをつかってみた

protobufのtypeに日付型をつかいたいケースがあったので com.google.protobuf.Timestampをつかってみた。 google/protobufを覗いてみると公式に載っているtypeの他にも使えそうなものがあるので定義に迷ったときは一読をおすすめする。 github.com ここから…

gRPC ServerのExceptionFilterの方法をまとめた(grpc-java)

前回のエントリでは認証処理やメトリクス計測、ログ出力などをインターセプターをつかい横断的に処理する方法をまとめた。 naruto-io.hatenablog.com 今回のエントリではgRPC Serverのトランザクション内で発生した例外処理を横断的にキャッチしてレスポンス…

grpc-javaのClient/ServerのテストをKotlinで書く - Client編

前回のエントリに続いて今回のエントリではgRPC Clientのテストの書き方をまとめていく。 naruto-io.hatenablog.com テスト対象のproto テスト対象のprotoは次のとおりSimple-RPCとする。 service TaskService { rpc GetTaskService (TaskInbound) returns (…

grpc-javaのClient/ServerのテストをKotlinで書く - Server編

grpc-javaで実装されたgRPC ClientとgRPC Serverのテストコードについてまとめていきたい。 ClientとServerのどちらも大枠は同じである。テストコードのなかでgRPC Serverを起動させる。そしてリクエスト内のトランザクションを必要に応じてモック化しながら…

Kotlin コルーチンでasync/awaitをつかってgRPC Serverをリクエストしてみた

Kotlin1.1からの新機能であるコルーチン(Coroutines)を試していきたい。Kotlin コルーチンをつかえば非同期処理を同期的なコードで書けるし、非同期処理をブロッキングすることもシンプルなコードで書ける。 今回はgRPC Serverへのリクエスト部分をコルーチ…

Kotlin + gRPCでio.grpc.Contextをつかってログ出力を横断処理してみた

アスペクト指向プログラミング(AOP)をgRPC Serverではどう扱うか考えていきたい。 横断的な関心事といえば認証やログ出力である。 gRPCクライアントのメタデータに認証トークンを添えてリクエストを行いgRPC Serverのinterceptorで横断的に認証を完了させ…

Kotlin + gRPCでdropwizard/metricsをつかってメトリクスを取得してみた

今回のエントリはKotlin + gRPC(FWはSpringBoot 2.0.0.M1)のアプリケーションでgRPCのリクエストタイムやエラー回数などのメトリクスを計測する方法をまとめていく。 dropwizard/metrics メトリクス計測のライブラリには dropwizard/metricsをつかってみた…

Kotlin + gradleでgRPCプロトコル定義ファイル(.proto)のvendoringにprotodepをつかってみた

gRPCのプロトコル定義ファイル(.proto)の管理を考えていきたい。gRPCを導入するプロジェクトであれば.protoファイルの運用方法は課題である。 プロトコル定義ファイル(.proto)の運用課題 gRPCはプロトコル定義ファイル(.proto)から生成したプログラム…

ALBのアクセスログからAPIのレスポンスタイムを監視する

サービスのAPIのレスポンスタイムを監視することは運用において大事なことである。APIのレスポンスタイムを計測してモニタリングする方法は多様に考えられるが、このエントリでは次の図のようにALBのアクセスログをfluentdが収集してモニタリングツールと連…

Spring5.0 + KotlinのRouterFunctionのテストはどうすればよいか? 試してみた

引き続きSpring5.0(Spring Boot 2.0) + KotlinのWebアプリケーションを試している。今回はRouterFunctionをつかってHTTPルーティングを定義したときにテストコードはどう書くのか?気になったのでまとめてみた。 Router Function Router FunctionはSpring5…