JSUG勉強会 2020 その2 Spring Boot 1.x から 2.x への移行 に行ってきた #jsug

JSUG勉強会 2020 その2 Spring Boot 1.x から 2.x への移行 に行ってきました。簡単に所感をまとめます。

jsug.doorkeeper.jp

所感

普段あまり他社さんのバージョンアップの話を聴く機会は多くないかと思うので、なかなか興味深い内容でおもしろかったです。バージョンアップの流れとかハマりどころとかまとまった情報は重宝しそう。

細いけど、非推奨な機能を使ってるときに警告を出力する設定にしたり、小まめに PR してレビューコストを削減 (分散?) するのがわりとポイントかなと思ったり。

Micrometer の話は、去年の Spring Fest でも聴いたけど、とても便利そうだし使ってみたいです。なかなか使える機会がないけど...。(そもそも Boot アプリじゃない)

あとで読む。

以下、メモから抜粋。

決済サービスの Spring Boot のバージョンを2系に上げた話

www.slideshare.net

  • 2.x のリリースは 2018/03 なので 1.x を使ってる場合じゃない
  • 2.0.x は EOL 間近なので早めにアップデート
  • 2.0.x は Gradle 4+
  • バージョンアップ作業は半年くらい
  • まずは Gradle のバージョンをあげる
  • --warning-mode all が便利
    • Gradle 5 で非互換になる機能を出力してくれる
  • implementation
    • マルチジュール構成でハマった
    • モジュールが双方向に依存してるとつらい
  • プロジェクト直下の build.gradle でバージョン一元管理
  • hibernate-validator => javax.validation
  • spring-boot-starter-json
  • コネクションプールが Tomcat から HikariCP に
    • プロパティが url から jdbc-url に
  • HtmlEmail で null のときに Exception 投げるように
  • AWS X-RaySQL トレースで HikariCP が使えない
  • Flyway が2バージョンあがる (3.x ⇒ 5.x)
  • @ConfigurationProperties の prefix は必ずケバブケースで書く
  • Gradle と Lombok のバージョン相性問題
    • ClassCastException が起きる、などなど

Spring Boot 1.5 → 2.1 バージョンアップを経験して分かったハマりどころ

  • Migration Guide & Release Note でざっくり把握
  • 小さいリポジトリから着手
  • 変更点が多いのでモブレビューでコスト削減
    • 一気にPRすると大変なので小出しにする
  • maven-compiler-plugin の warning と非推奨ログを出力するように
  • Spring Data JPA
    • Query By Example のみに
    • PK による検索は *ById を使う
  • 2.1 から Bean の override はデフォルト禁止
    • allow-bean-definition-overriding で変更可
  • Mockito の any* や any(class) では null 禁止
    • isNull() か any() を使う
    • そもそも引数が nullable かどうか見直すこと
  • spring-boot-properties-migrator
    • 旧verの書き方のときに warning を出力してくれる
  • @SpringBootTest による結合テスト大事
  • バージョンアップをやり切ってから機能追加する

Metrics with Micrometer in Spring Boot 2

docs.google.com

  • 1.x でも /metrics は使える
    • 階層的なメトリクスしか対応してない
    • 時間計測は未対応
    • ネーミングの標準化は未対応
  • Micrometer
    • SLF4J のようなもの
    • 抽象化している
    • バックエンドに送るところは実装による
    • タグなどを使うことで多次元に分析できる
  • Spring とは別のプロジェクトで開発されている
  • 問題検知 & 分析
  • ログとは別にメトリクスを管理することでストレージを節約
  • 普段はインメモリでメトリクスを保持
    • いいタイミングでバックエンドに publish する
  • ネーミングルールなどのバックエンドによる違いは Micrometer が吸収してくれる
  • カスタムメトリクスを作るときはネーミングルールに気を付けること
  • 複数のバックエンドに publish することも可
  • publish する間隔はデフォルト1分
  • Controller で HTTP リクエストのメトリクスを取ると便利 (ステータスコードとか)
  • not boot アプリでも利用可
    • もちろん Auto Configuration ではない
  • 多次元の分析ができるバックエンドがおすすめ
    • Prometheus, Datadog など
  • jvm の shutdown-hook で publish する実装になっている

JSUG勉強会 2020 その1 Spring x Kotlin に行ってきた #jsug

JSUG勉強会 2020 その1 Spring x Kotlin に行ってきました。簡単に所感をまとめます。

jsug.doorkeeper.jp

所感

いくつか Kotlin 特有の事情はあるものの、Spring で普通に Kotlin が使えるようです。特に大きなメリットとしては Coroutine あたりだろうか。逆に言うとそれ以外は Java でも同じように書けるのかなって。となると、Java から移行するモチベーションってなんだろうか、というのが正直なところ。

ただ、Kotlin 自体、書いてて楽しそうな言語だし、新しくアプリを作るなら Spring x Kotlin は全然ありだなと思います。もちろん部分的な導入でもイケそう。

ここ数年、Spring 界隈は Kotlin 推しな雰囲気を感じるし、Kotlin が重要な位置付けにいるのは間違いないです。要チェック。

以下、メモから抜粋。

Kotlin で Spring 完全理解ガイド

  • Spring Initializr は Kotlin サポート済み
  • Gradle を使う場合は build.gradle.kts が生成される
    • Kotline スクリプトで書かれている
    • Gradle は Kotlin サポート済み
  • Kotlin のクラスはデフォルトで継承不可 (open 修飾子が必要)
    • @Service などのクラスは Spring によってサブクラスが生成される
    • allopen プラグイン
    • 任意のアノテーションが付いたクラスを open クラスとして扱う
  • バリデーション
    • Kotlin のプロパティは Java のフィールドとアクセサを組み合わせたようなもの
    • @NotNull などがフィールドにかからない
    • @field 指定 + Nullable 指定
  • Kotlin にはプリミティブ型はない
    • バイトコード上は int になる
    • Int? にするとラッパークラスになる (Nullable)
  • フィールドインジェクションしたい場合は lateinit + var を使う
  • Kotlin 向け DSL
    • Bean Definition DSL
    • Router DSL
  • ktlint
  • WebFlux + Coroutine
    • Reactor 対応の公式ライブラリがある
    • Coroutine で Mono/Flux を表現
  • Ktor
  • JUnit 5
    • @Nested した場合は inner 修飾子を付ける
    • inner を付けない場合は static クラスとして扱われる
  • AssertJ / assertk
  • モックライブラリは MockK がよさそう
    • モック生成は高コストなので使い回す (clearMocks 関数でリセット)
    • Coroutine は coEvery を使う
    • static メソッドのモック可
  • DBアクセスには JdbcTemplate を使っている
    • 他には Exposed など
  • Kotlin を使うことで特にビルド時間が遅くなることはない

Spring x Kotlin のいちばんのメリットは Coroutine なのかな #jsug Kotlin 触ったことないけど、それほど障壁はなく使えそう

Spring 5.2 における Kotlin サポート

www.slideshare.net

  • Spring の中でも Kotlin のサポートは増えている
  • Spring 5.2 から公式ドキュメントのコードスニペットに Kotlin 追加
  • Router Functions
    • WebFlux.fn / WebMvc.fn
  • Kotlin 向け DSL が提供されている
    • 引数: ServerRequest / 戻り値: ServerResponse
    • WebFlux では Mono の ServerResponse を返す
  • MockMvc DSL
  • @ConfigurationProperties
    • 複数プロパティへのバインディング
    • Relaxed Binding
    • Boot 2.1 までは lateint var で宣言する必要があった
  • 2.2.0 から @ConstructorBinding でコンストラクタを通して値を設定できる
    • Boot 2.2.1 からは scan の指定が必要
      • @ConfigurationPropertiesScan or @EnableAutoConfiguration
  • Coroutine
    • 軽量なスレッドのようなもの
    • 1スレッド上で複数の Coroutine が動く
    • async/await スタイルで記述可能
    • スコープによって Coroutine 同士の依存関係が管理しやすい
  • WebFlux の Coroutine サポート
    • 戻り値に Deferred / Flow が利用可能
    • Suspending Function
  • Coroutine Router Function DSL
  • Reactor ではなく Coroutine の型が利用できる
    • Kotlin の拡張関数によってサポートされている
  • Java と Kotlin は共存可能 (あまりおすすめしない)
    • テストコードだけ Kotlin とかはありかも
  • なるべく blocking なコードは呼ばない方がよい
    • スレッドに依存するコード/ライブラリを使うときは要注意

(参考) Kotlin Fest 2019 の登壇資料

www.slideshare.net

Bsize の AI みまもりサービス GPS BoT

通学や習い事で子供がひとりで行動する機会が増えたため、子供の見守りサービスとして Bsize が提供している『AI みまもりサービス GPS BoT』を購入しました。

www.bsize.com

端末は Bsize の公式サイトで会員登録して購入しました。Amazon でも購入可。

GPS BoT お子様の現在地や行動履歴を教えてくれるAIみまもりサービス - Amazon.co.jp

ポチってから数日で発送されました。

開封

f:id:knt_mr:20200121132611j:plain

サイズ感はこんな感じ。これに別売りのシリコンカバーを付けてストラップでぶら下げています。

GPS BoT シリコンケース (ラズベリー) - Amazon.co.jp

スマホGPS BoT アプリをインストールして端末とペアリングするだけですぐに使えます。初めて充電した日が利用開始日となり課金が開始されるようです。

通知

アプリから「通知スポット」が設定できます。例えば、小学校を登録した場合、GPS BoT が小学校の近辺に来るとアプリに通知されます。ただし、GPS などの位置情報を使っているため、多少の誤差はあります。

「AI みまもりサービス」というだけあって行動パターンを学習しているようですが、しばらく使ってるうちに通知スポットの精度などは向上するんだろうか。まぁ、正確な情報を求めるよりは、なんとなく「今このあたりにいるよ」くらいの感覚で使う感じになるかと思います。

また、バッテリー残量が少なくなるとアプリに通知されます。今は「頻度優先」に設定していますが、週1程度で充電すればよさそうな感じです。

1週間ほど使ってみた感じでは特に不満はありませんが、しばらく使ってみて様子を見てみようと思います。

Apache Commons Email でメール本文に画像を埋め込む

Apache Commons Email でメール本文に画像を埋め込む方法。備忘録。

HtmlEmail email = new HtmlEmail();
// ... (略)
File file = Paths.get("duke.jpg").toFile();
String cid = email.embed(file);
email.setMsg("本文1<br><img src=\"cid:" + cid + "\"><br>本文2");
email.send(); //=> 本文1<br><img src="cid:yektmylwmn"><br>本文2

img タグの src に指定する cid (Content-ID) は、HtmlEmail.embed の戻り値 (ランダムな値) を使うか、第2引数に任意の値を指定する。

2019年のふりかえりと2020年に向けて

年末年始は帰省先で過ごしております。

2018年のふりかえりと2019年のこと - kntmr-blog

2019年はあっという間に過ぎた感じ。前半は仕事が忙しくなかなか大変で、後半は仕事が落ち着いたので個人的に某活動をやっていましたがなかなか成果は実らず。まぁご縁がなかったというのもあるけれど、そもそも自分のスキルや経験がいろいろと不足していることを改めて痛感...。

2018年夏頃から始めたスタディサプリ ENGLISH の進捗はこんな感じ。基本的に通勤時間を使ってコツコツやっています。日常英会話の Lv.3 はひと通り終わって、今は Lv.4 を 1/3 くらい。帰省先にいるので今週はやってないけど。

f:id:knt_mr:20191231152315j:plain

2020年は、個人的に興味/関心があることを調べたり勉強したりということをもっと意欲的に&習慣的にやっていきたい。ただ、これらがあまり直接業務に関係しないところが悩ましい...。

  • GraphQL
  • Vue.js + TypeScript
  • OCJP Gold SE 11
  • AWS 認定資格
  • 英語/TOEIC

なんとなく、ここ数年同じようなことばかりやってるような気がするので、もう少し目線を変えた方がいいのかなと思っている今日この頃です。

Windows 向けキーボード周りの設定

備忘録。Windows マシンをセットアップする際に最初にやるキーボード周りの設定。

CapsLock を Ctrl に

レジストリエディタから HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > Keyboard Layout を開いてバイナリ値を追加。

f:id:knt_mr:20191227133023p:plain

IME ON/OFF

Mac のキーボードと同様に、スペースキーの隣に IME の ON/OFF を配置する。

  1. IME のプロパティ
  2. 詳細設定
  3. 全般タブ > 編集操作 > 変更
  4. 無変換 ⇒ IME-オフ / 変換 ⇒ IME-オン

Spring Fest 2019 に行ってきた #jsug

Spring Fest 2019 に行ってきました。簡単に所感をまとめます。

springfest2019.springframework.jp

所感

3回目の参加。朝イチで仕事の打ち合わせが入ってしまい基調講演は聴けず。

GraalVM や RSocket, Quarkus, コンテナ/クラウドなど、個人的に気になるキーワードが並んでたのですが、このあたりは普段の JSUG 勉強会でもテーマになりそうかなと思って、今回はあえてそれ以外のテーマを中心にピックアップしてみました。とはいえ、コンテナ関連の話は聴いておけばよかったかな...。

個人的には Micrometer や Spring Cloud Contract + Pact あたりのセッションがよかったです。

以下、メモから抜粋。

Spring Boot爆速開発超絶技巧

  • キーマップはデフォルトがおすすめ (ペアプロが捗る)
  • 入力ソースはUSキーボードで
    • 日本語IMEの半角英数モードだとショートカットが衝突する
  • タッチバー無効化 (Fnキーの方が高機能)
  • 検索/ファイルオープン系
  • ナビゲーション系
  • ポップアップでは絞り込みを使う
  • 指定クラスの指定行にジャンプ
  • Tab/Enterの補完の違い
    • Tabで補完すると以前の記述を置換できる
  • ステートメントを完結 (その行をフォーマットしてセミコロンを付けてくれる)
  • Live Template
  • Postfix completion
  • ブレークポイントを条件指定で止める/標準出力
  • Spring Dashboard + Services
  • Docker コンテナないのファイルが見れる
  • Actuator のエンドポイントから HTTP リクエス
  • Git でコミット時にフォーマットしたり壊れたコードを検出したり
  • プルリクを作成したり確認したりコメント追加/確認したり
  • おすすめプラグイン
    • Key Promoter X
    • Presentation Assistant
    • Rainbow Bracket

普段は Eclipse ユーザーなのですが、IDE をこんな感じに使って生産性向上できるという視点で参考になりました。IntelliJ IDEA ならではの機能もあるかと思いますが、Eclipse でも同じようなことができるか試してみようかな。Postfix completion は便利そう。あと、Eclipse では View で表示されるものが IntelliJ IDEA ではポップアップで表示されたりしてていい。ブレークポイントを条件指定で止めたり、標準出力に処理結果を出力したりというのはよくやります。

ローコード開発プラットフォームと、ドメイン駆動設計と、Springの関係

yoshinorinie.hatenablog.com

  • 会社を横断して設計のノウハウを共有できないか (業界ごととか)
  • Wagby のデモ
  • ローコード開発 == 少ないコードで実装を進める
    • ノーコードを含む
    • 非エンジニアがツールで実装を手掛ける
  • Java 側の設計情報と実装コードを一致させる
  • 影響分析と自動更新
    • Excel 設計書とソースコードでは影響分析に時間がかかる
    • Excel 設計書からプログラムを自動生成するのは無理
  • ビジネスプロセスプログラミング
  • 自由度が高すぎると自動生成ができない

DDDとローコード開発の共通点は設計情報と実装コードの乖離をなくして変更容易性を向上すること。そこにローコード開発というか Wagby の自動更新を組み合わせることで常に変更可能な基盤を作ることがポイントっぽいです。

徹底解剖Spring MVCアーキテクチャー -DispatcherServletの中身を覗いてきました-

www.slideshare.net

  • HandlerMethodArgumentResolver インタフェース
    • 引数になりえるクラスがそれぞれ実装している
  • 引数に指定可能な型はあらかじめ設定してある (戻り値の型も同様)
    • RequestMappingHandlerAdapter#getDefaultArgumentResolvers
    • RequestMappingHandlerAdapter#getDefaultReturnValueHandlers
  • 戻り値が void の場合はリクエストURLが論理View名となる
  • DispatcherServlet#doDispatch

Spring でコードリーディングする際のポイントとして参考になる内容でした。次回は Spring Boot アプリの起動処理のセッションを期待。

実践 Spring Boot Actuator + Micrometer ⇒ 無茶振りMicrometerの話

docs.google.com

  • Micrometer 自体は Spring に依存しているわけではない
    • いろいろなバックエンドに対応
  • 運用やデバッグで役立つエンドポイント
  • Application metrics
    • アプリケーションだけが知っているメトリクス
  • Tag / dimension / label
  • レスポンスタイムやメモリ使用量のメトリクスをもとにアラートをあげる
  • Gauge
    • Up/Downする値を計測する
  • Counter
    • カウントアップする値を計測する
    • 基本的にクリアしない (バックエンドに送信するときにクリアするのもあり)
    • 値がオーバーフローしなければ問題ない
  • Timer
    • ストップウォッチ
    • 時間計測して max / average したり?
  • Distribution Summary
  • JVM など主要なメトリクスはデフォルトで収集してくれる
  • Actuator を depend に追加しておけば Controller のエンドポイントごとに処理時間を計測してくれる
  • デフォルトはインメモリ
  • バックエンドに送信する場合は必要なものを depend に追加する
    • Auto Configuration がなければ Bean を登録する
  • 複数のバックエンドに送信可
  • AWS Cloud Watch は対応済み、Zabbix は未対応
  • MeterRegistry からカスタムメトリクスを登録できる

代打セッションだったけど、個人的にいちばん興味深い内容でした。今、レガシーなシステムの保守をしていて、アプリケーションログをいい感じに集計するツールを作ろうかと思ってたけど、Micrometer でメトリクスを集計する仕組みを作ってもいいのかなと思いました。導入できそうかちょっと調べてみようかと。

Enterprise Angular Development

  • 画面デザインしてアプリケーションを作る
    • jQuery で実装されたデザインは Angular に移植しにくい
  • 構造をデザインしてアプリケーションを作る
  • Atomic Design
  • Angular Library
  • UI のコンポーネント構成を yaml で定義

もう少し Spring に絡めた内容を期待してましたが、割とフロント寄りの内容でした。JS フレームワークと Spring の組み合わせるときの事例紹介とか聴きたい。

JSP/JSF から Spring Web + Thymeleaf への移行

www.slideshare.net

  • 汎用テンプレートエンジン
  • Thymeleaf はソースコードがきれい
  • Standard dialect + Thymeleaf-Spring パッケージ
  • HTML5 対応済み
  • Spring との高い親和性
  • サーバー起動しなくてもブラウザでレンダリング可能
  • デフォルトの挙動がセキュア☆
  • カスタムタグの開発のしやすさ
  • 時代はクライアントサイドレンダリング?SPA?
  • カスタムダイアレクトによる共通化/再利用
    • (中級者向け) AbstractAttributeTagProcessor / AbstractElementTagProcessor
    • (上級者向け) AbstractElementModelProcessor
  • attoparser
    • HTML パーサー
  • unbescape
    • エスケープライブラリ

Thymeleaf はソースコードがきれいとのこと。パーサーやエスケープのライブラリもおすすめとのことなので、コードリーディングしてるか。

Springアプリケーションのテスト道具 使いどころ、使わないどころ

  • モックのパワフルさが設計を歪める
  • Boot 2.2 から JUnit 5 がデフォルトに
    • vintage は外して JUnit 4 のコードと混在しないようにする
  • CI のビルド/テスト、デプロイ、e2e テスト では Docker を使う
  • レイヤードアーキテクチャではテストは包含関係になりえる
    • どの単位でテストするか
    • できることとすることを区別する
  • 権限のテストは Controller でやる
  • テストしたいことの近くでテストすることが原則
  • 近いところでテストするためにモックがある
  • 使わないどころの判断
    • できる/できない、向き/不向き
    • 不向きなものを無理やり使わない
  • 評価軸☆
    • 作成、保守、実行、評価
  • MockRestServiceServer
  • モックを使うことで何がテストできて何がテストできなくなるか

「モックのパワフルさが設計を歪める」「どのようなテストでも何かしらをモックしている」などのメッセージはなるほどという感じ。普段、気が付かない観点だったり、分かってはいるけどできてないことだったり、評価軸のあたりは参考になりました。

Spring with React for Enterprise Application

  • 要件定義/設計はイベントストーミングで
    • データだけで業務が回っているわけではない
    • モデル化するべき業務プロセスの開始点を探る (Domain Event)
    • (Domain Event) 何が起こったか、起こる条件、与える影響
  • Bounded Context で Deployment unit がわかる
  • モデリングして作ろうとしているものを共有する
  • 一貫性のあるUI、変更に強いUI
    • styled components
    • Storybook
    • Atomic Design
  • サービス/モジュール分割
    • Bounded Context で分割する
    • 各サービスは Boot アプリケーション
    • 各サービスがどのように連携するか (Query or Pub/Sub)
  • Spring のエコシステムは何を使うか
    • 作る機能の特徴によって何を使うか
    • Spring Data REST, Spring MVC, Spring Cloud Stream, ...
  • TDD
  • Integration Test
    • 連携するサービスがたくさんあると大変
    • 起動が遅い
    • モックは信用できない
  • Contract Testing
    • Pact
    • Contract = Pact file
    • Consumer 側でモックを使ってテスト
      • リクエストとレスポンスの期待値を Contract として出力する
    • Broker に Contract ファイルを渡す (モック?)
    • Spring Cloud Contract が Pact から Contract を取得してテストする?
    • モックの信頼性向上

このセッションもとても面白かったです。Spring エコシステムに何を使うか、Spring Cloud Contract + Pact の組み合わせ、などいろいろ興味深い話が聴けました。Spring Fest 2018 でもセッションがあったっぽい。要復習。

blog.tagbangers.co.jp

その他

あとで読む。

www.slideshare.net

www.slideshare.net

docs.google.com