エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

JJUG CCC 2023 Fall 参加レポート

経緯

いつも参加しているJJUGが開かれるので参加
今回は、現地開催のみだったので、足を運んだ

公式サイト

JJUG CCC 2023 Fall(現地開催のみ) - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper

参加したセッション

本当は、午前から参加する予定だったが、前日の夜にコーラ飲んだせいで、なかなか寝付けず、起きたら10時だったので、午前は諦めた

  • JDK 21 へようこそ
  • Gatlingによる負荷テスト入門
  • データ指向プログラミングの真実をお話しします
  • String Templateによる文字列補間

参加セッションメモ

★ありのところは、自分の感想

JDK 21 へようこそ

  • Loom/Amberがウエイト大きい
  • Loomの注目度が高め

jep 439 ZGC

  • 21以降だったら世代別を使え!!

    • オブジェクトは生存期間が短い物が多い
    • young領域を頻繁にコレクトすることで効率化している。
  • 生存確認(+前のサイクルの再マッピング処理)

  • マーキング
  • 移動

Minor Collection -> young領域が対象

GCの実装に世代別とシングルスペースの実装がある 時期は未定だが、シングルスペースのGCは削除される予定

JEP444 virtual thread

同期処理
非同期処理
Javaのスレッド
バーチャルスレッド
  • ランタイムによってスレッドを管理する
  • スタック領域を節約できる
  • スケジュールのアルゴリズムjavaに最適化されたものが使えるようになる
  • 利用すると10倍くらい省エネになる
  • ハード、開発者の両方からみてもやさしい。

project amber

複数のバージョンでリリースされているが、関連性がそれぞれ高め

おさらい
パターンマッチング
  • instanceofでキャストが不要になる
  • その場合、識別子の指定が必要になる
    • キャスト名をたまに間違えることがあるので積極的に使うべき
  • instanceof -> nullチェックもしてくれる
record class

ボイラーテンプレのコードが不要になる オブジェクト比較も問題ない

java21での追加内容

switchのパターンマッチング

  • caseに型を指定できるようになった
    • オブジェクトの指定が可能になった
  • caseの指定順序が重要になってしまった
    • オブジェクトの継承関係・実装関係が影響してくる
      • 例外の関係に近い問題が出てくる
    • コンバイルエラーになる
    • nullも利用できるようになった
    • 該当するケースがない場合、defaultにない/当てはまらない可能性がある場合、コンパイルエラーが出る
      • シールドをうまく活用する
  • when 節
    • 詳しい条件を指定できるようになった

★ 汎用的に使えるようになったが、型をうまく使えないと効率化させるのが難しくなった感じがする

jep432 シーケンスコレクション

コレクションに共通機能が追加された

★以前調べた内容をそのままだったので、下記参照

suzaku-tec.hatenadiary.jp

Gatlingによる負荷テスト入門

★ガトリング => 武田観柳??

メリット

  • 負荷試験、モニタリングもやる
  • 中間報告出せる
  • 実行終わるとレポート出せる

★gattling使ってみる

負荷テスト

負荷をかけたときの状態を知るためにする

負荷の観測
  • 見れるようにしておく
  • 構成図書いてあたりをつける
  • どこの何が見たいのか考える
  • まずはアウトプットする
  • 分からなくても、後で考察するときに使える
  • 設計課題が見つかる
  • 負荷になっているかの指標も必要
  • アクセスログだすなどのアクションにつながれば、負荷テストは成功

ApacheBench

  • 簡易的なら向いてる
  • 露払いくらいならできる

負荷テストの道具の条件

  • シナリオ組める
  • 負荷の調整できる

負荷テストに必要なこと

  • 本番の構成などの情報が必須
  • 負荷テストの定義決めておく

ガトリング

スレッドではなく、メッセージングベース

★環境作ろうと思ったが、面倒になった。。。
★とりあえず、ApatchBenchを動かしてみることまではやった。
★試した内容は、下記記事参照

suzaku-tec.hatenadiary.jp

データ指向プログラミングの真実をお話しします

Project Amber

  • データサイズが小さいものも使うようになった
  • 全部Javaで作らなくなった
  • オブジェクトではなくデータのやりとりが増えた

データ指向プログラミングから

  • コードとデータの分離
  • 汎用データ構造でデータを表現する ⇨ 型を使わない??
  • データはイミュータブル
  • データ表現からデータスキーマを切り離す
データとは何か?
  • データと情報と知識の違い
  • データ:観測、収集した物
  • 情報:データに解釈を加えたもの
  • 知識:情報をもとに判断したもの

データと情報

構造の違いではない

区別する方法
  • 構造を変える
  • 名前を変える
解釈の実装をどこでするか?

関数ないで、データを解釈しながら使う

メリット
  • 解釈の自由度が高い
デメリット
  • 解釈が関数ごとに違う場合がある
  • 解釈にはコードを読む必要がある

cloujerが元になっている。colujerではspecで解釈違いを防いでいる

Amberでは、型で解釈させる

  • 仕様を変える時に影響範囲が分からなくなる可能性あり

★個人的な解釈
★DBにあるもの-> データ
SQLで抽出したら->情報:オブジェクトにどうマッピングしているか
★ 命名が重要になってくる:名前=情報になる

要件をどうやってモデリングして実装するかが重要

複雑さ

  • 本質的
    • 単一責任原則に違反している
    • コンポーネント数が多い
    • 問題を分割しても、複雑さは変わらない -> 銀の弾丸はないと言われる所以
  • 偶有的
    • 極論的になくせるもの

複雑を理解する

  • データの解釈、振る舞いを分割する
  • 分割したものを分割統治する
  • 分割したら終わりではない

モデルの概念が明確になっていること
そのためには、分割が重要

例外とか不正値があると、分離ができないように感じるが、どう対処するべき?
いくつか派閥あり。型でやるなら前段階で判断して後続処理を行うようになるのがベターだと思う

String Templateによる文字列補間

jep459

変数を含んだ文字列結合のパターン - StringBUilder - String.format or Formatter - MessageFOrmat

内部での動き

  • +演算子
    • 現在だと、invokeDynamicで結合している
  • String.format ⇨ java.util.Formatterを利用している
  • MessageFormat
    • 順序を帰ることができる

どの形式も、煩雑になったり、変数との対応づけが分かりにくい

簡単に書けて、間違いを起こしにくい方法が欲しい

テンプレートを使った文字列保管が必要になった。でもテンプレートエンジンを使うほどでもない。もっと手軽で汎用的なものが欲しい ↓
StringTemplate登場

String Templates

文字列に変数・式を埋め込み、文字列補完を行う言語使用

StringTemplate.STR
  • 文字列を生成する最も基本的なテンプレートプロセッサ
  • static importせずとも使える
  • テンプレート引数に複数行かけるが、おすすめはしない
  • nullが入ってくると、nullの文字列が設定される
StringTemplate.FMT
  • Formatter形式の記述でテンプレートが書ける
  • %を設定したい場合は、エスケープが必要
  • ロケールを指定する場合は、FormatProcessorを利用する
StringTemplate.RAW

未処理のStringTemplate

StringTemplateの動作
  1. 要素を分割
  2. 文字列と値を別々にまとめる
  3. StringTemplate.ofが実行
  4. Processor.processがコールされる

文字列補完の危険性とカスタムテンプレート

Custom Template Processor
  • 特定用途向け json/sql/エラーメッセージなど
  • 文字列以外を返すことも可能

文字列保管の危険性

埋め込みをした結果、不適切な状態になる

安易に使うのは、危険。
対処するには、カスタムテンプレートで対応する

型による制限やバリデーションで対処する

感想

なんで寝坊してしまったんだ。。。

StringTemplateは、あまり興味を持てなかったが、使い方次第では化けそうだなと感じた。

gatling試そうとしたんだけど、ドキュメント読んで環境準備するのが辛い。。。
ApacheBencheは簡単だったのに。。。
なにか、前提知識が足りてない気がする。

バーチャルスレッドは、やはり有能そうだな。
どこかでキャッチアップしたいと思いつつ、なぁなぁになってしまっている。
どうにかしたいと思うが、試せるかどうかは別の話。

足りないものや興味が出たものがいくつかあったので、収穫はあったかなと思う。
問題は、それを突き詰めて調査したり、ものにできるかどうかだな。。。
今、メンタル的にポジティブになれないのと、そこまで活力がでないので、厳しい気がする。
そう言っても、このイベントに出てくるだけの気力は、あった。