Kotlin MultiplatformサポートのGoogle Analyticsライブラリ「Measurer」をつくった

年始から個人的に大流行のKotlin Multiplatform。開発が楽しい。BFF Server触るエンジニアとネイティブエンジニアの距離感が非常に近くなる。「いや、チームとして当たり前でしょ」みたいなツッコミはあるだろうけど、新しい技術を軸にエンジニア達が「あー…

Prowの真骨頂であるTideでPRの自動マージを導入する。

前回のエントリ「ProwではじめるChatOps on GitHub。」からProwを完全理解した!と言ってはいけない。Prowの真骨頂はTideにあると思う。 Enable kustomize in kubectl by Liujingfang1 · Pull Request #70875 · kubernetes/kubernetes · GitHub 上記のProwが…

ProwではじめるChatOps on GitHub。

Kubernetesのtest-infraレポジトリにあるProwを試す。ProwはKubernates環境を基盤としたCIとCDのシステムである。 モチベーション Kubernatesを追っている人であれば次のようなコメントのやり取りをGitHub上で見かけたことがあるだろう。 Enable kustomize i…

Knative EventingのSourceにAWS SQSをつかいServiceを起動する

前回のエントリではKnativeの Buildの知見をまとめたが今回は Eventingをまとめる。試したところServerlessを体感できて、これぞKnativeの醍醐味ではという感想である。 モチベーション KnativeのEventingを導入する際にAWS環境ではどのようなAWSサービスを…

サーバサイドKotlinをはじめよう。Ktor Tips集をまとめた。

この記事はCyberAgent Developers Advent Calendar 2018の22日目の記事です。 Ktor KtorはKotlin純正のWebフレームワークです。APIはラムダ式を使った関数呼び出しでKotlin DSLによりルーティングを宣言的なコードで保守できます。KtorアプリケーションはTom…

Knative Buildのbuild templateにBazelをつかいビルドする

KnativeはKubernetesを基盤としたプラットフォームをビルド、デプロイを管理するためフレームワークを提供する。Serving、Build、そしてEventingの3つのコンポーネントで構成されている。これら3つが疎結合に連携する。 cloud.google.com Kubernetesを基盤…

BazelでビルドするマルチプロジェクトとCircleCIを連携する

今回のエントリではBazelでビルドしたマルチプロジェクトとCircleCIの連携をまとめていく。マルチプロジェクトとCIを連携する際の実運用の課題を洗い出して解決方法を考えた。 プロジェクト構成 CIと連携させるマルチプロジェクトは次のような構成である。 (…

BazelでDockerイメージのビルドとレジストリへのプッシュをする

前回までのエントリに引き続きBazelのビルドをまとめていく。 GoとKotlinのマルチプロジェクトをBazelでビルドする - 平日インプット週末アウトプットぶろぐ BazelでGoプロジェクトのビルド。Gazelleのgo_repositoryで外部ライブラリの依存とBazelのgo_test…

gRPCサーバを含むGoプロジェクトをBazelでビルドする

前回までのエントリに引き続きBazelのビルドをまとめていく。 blog.soushi.me blog.soushi.me 今回のエントリではgRPCサーバを含むGoプロジェクトをBazelでビルドする方法をまとめる。 Protocol BufferとgRPCサーバのInterfaceの生成をBazelで行う これまで…

BazelでGoプロジェクトのビルド。Gazelleのgo_repositoryで外部ライブラリの依存とBazelのgo_testでテスト。

BazelをつかったGoプロジェクトのビルドをまとめている。前回のエントリではバイナリのビルドとDockerイメージのビルドをまとめた。 blog.soushi.me 今回は外部ライブラリをGoプロジェクトに依存させる方法とテストの方法をまとめていく。 Gazelleのgo_repos…

GoとKotlinのマルチプロジェクトをBazelでビルドする

Googleが開発するビルドツールのBazelを試していく。 Bazel - a fast, scalable, multi-language and extensible build system" - Bazel モチベーション GoやKotlinでつくるマイクロサービス開発は1つのサービスに1つのレポジトリで行ってきた経緯がある。…

Spring FuをGraalVMで動かす。起動速度に驚いた。

Serverlessプラットフォームが注目される中、その潮流にJava勢も乗っかりたいので起動速度が速いと注目のGraalVMを試してみた。 モチベーション GraalVMのアプリケーション起動までを理解したい。 GraalVMでSpring Fuを動したい。 GraalVMでHTTP/1.1とgRPCの…

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" 見慣れないタイムゾー…