ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Java19 レコードパターン 仮想スレッド

2022-09-25 18:06:47 | PG(Java)

2022/9/15にドラクエ10オフラインが発売されて忙しい最中の9/21にJava19が出たわけですよ^^;

一番話題をさらったのはBigDecimalにTWOという定数が加わったことのようですが(爆)

目新しい機能はプレビュー版ばかりですね。

  • switchパターンマッチング…ガードの記号が&&からwhenに変わった
  • レコードパターン…recordのパターンマッチが出来る。意外と高機能w
  • 仮想スレッド…Javaの軽量スレッド。使い方は既存のThreadとほとんど変わらないのがすごい。ExecutorServiceで軽量スレッドを使う方法は分かったけど、ForkJoinで使う方法が分からないorz
    • 地味にExecutorServiceがAutoCloseableを実装して、try文で使えるようになった
  • Structured Concurrency(インキュベーター)…構造化された並列性制御?仮想スレッドと関係あるらしい
  • Foreign Function & Memory API…インキュベーターからプレビューに変わった。なかなか正式にならない^^;

そんじゃパラディンに転職してくる。はぁー忙しい忙しい。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Java18 デフォルトのキャラセットがUTF-8になった

2022-03-23 19:27:00 | PG(Java)

Java18が出たので、例によって調査。

今回一番大きいのは、デフォルトのキャラセット(ファイルのエンコーディング)がUTF-8になったことでしょう。
今までは環境依存(WindowsならMS932)だったので。
ただ、主に影響を受けるのは旧来のInputStreamReaderやOutputStreamWriterを使ってファイルを読み書きするときであって、nio2(PathやFiles)は最初からデフォルトはUTF-8でファイルを読み書きするようになっているから、あまり関係ない(はず)だけど^^;

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Tsurugiの略称は何でしょう?

2021-12-24 07:54:26 | PG(RDBMS)

AsakusaFW & Tsurugi Advent Calendar 2021の24日目です。

長い名称は略されるのが世の常です。
例えばOracleはora(エラーコードがORA-XXXXX)、PostgreSQLならpg(PL/pgSQL等)ですね。

では、Tsurugiはどう略されるでしょう?
3文字略称ならやはりtrgですかね。
2文字略称なら? trかtgでしょうか。PostgreSQLがpgなので、tgが良い気がしますね。TsurugiはPostgreSQLの皮を被っていると言われていますしw

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AsakusaFWのprintデバッグはOperatorで

2021-12-23 19:32:37 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の23日目です。

AsakusaFWの実行基盤であるM3BPVanillaは単一ノード上で実行するので、(推奨される方法ではありませんが^^;)System.out.printlnで値をデバッグ出力することが出来ます。
ただし、実行時に出力できるようなprintlnを仕込めるのは、あくまでOperatorクラスのメソッドのみです。
実行途中に出力したくてFlowPartやJobFlowに仕込みたくかもしれませんが、それらのクラスはコンパイル(ビルド)時に実行されるものであり、バッチを実行したときに呼ばれるものではありません。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AsakusaFWでLocalDateTime(エポック版)

2021-12-21 21:06:33 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の21日目です。

アドベントカレンダー14日目で、AsakusaFWのDate・DateTimeとJava8の日付時刻API(java.time)のLocalDate・LocalDateTimeとを変換する方法について書きました。(地道にgetYear()やgetMonth()・getDay()などを使う方法)

しかし、AsakusaFWのDateは基準日からの経過日数(エポック日)、DateTimeは基準日からの経過秒数(エポック秒)で保持しており、個別にgetYear()・getMonth()・getDay()を呼び出すのは、中で変換(割り算)が行われるため、若干不利です。(一方、LocalDateやLocalDateTimeは個別のyear・month・day等で保持しています)
で、LocalDateやLocalDateTimeもエポック日やエポック秒に変換するメソッドを持っているので、それを使う方法も良さそうです。
ただし、AsakusaFWの基準日は西暦1年で、日付時刻APIの基準日は西暦1970年なので、その差は埋める必要があります。コード上のマジックナンバーになっちゃいますけど、それくらいは仕方ないですよね(笑)

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Asakusaバッチの処理がどこまで進んだかを確認する方法

2021-12-20 20:45:31 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の20日目です。

AsakusaFWでは、各処理を並列で実行するので、処理がどこまで進んでいるかというのを確認するのは難しいです。
しかし実行ログでFinishedと出ている処理(vertex)については、それが終了したことは分かります。

ログに出ているvertexの名前は概ねOperatorのメソッド名ですが、AsakusaFWは複数のメソッドを一塊の処理(vertex)としてまとめることがあるので、具体的なメソッドは別途確認してみないと分かりません。
Asakusa CLI(asakusaコマンド)にlist planというサブコマンドがあり、それでvertexに含まれるメソッドを確認できます。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AsakusaFW restructureで一致しなかったら

2021-12-19 20:46:32 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の19日目です。

データモデルのプロパティーが増えるデータモデルに変換するときはcore.extend、減るときはcore.project、増減するときはcore.restructureを使用します。
このcore.srestructureで、一致するプロパティーがひとつも無いときはどうなるかな?と気になったのですが、特にエラーが出るようなことはありませんでした^^;

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AsakusaFW Viewから1レコード取得する方法

2021-12-18 23:34:16 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の18日目です。

AsakusaFWにはViewというものがあって、少量データが対象ですが、ユーザー演算子でデータを自由に読むのに使えます。(GroupViewはキーあり、Viewはキー無しという位置づけ)
Viewは複数レコードを対象としていて、JavaのIterableを継承しているので、Iteratorパターンやfor文でループして扱うのが基本です。

for(Iterator i = view.iterator(); i.hasNext();;) {
  DataModel model = i.next();
  ~
}

for(DataModel model : view) {
  ~
}

一方、Viewは読み込み専用のグローバル変数のようなものを扱いたいときに便利で、そういう使い方をするときは、必ず1レコードだけ存在していると想定してよいでしょう。
そうすると、わざわざループで1レコード取得するのはちょっと冗長です。
ViewはIteratorを取得できるので、view.iterator().next();として1レコード取得したいところですが、AsakusaFWのViewはhasNext()を必ず呼ぶ想定になっているようで、例外が発生してしまいますorz
(この事象はけっこう昔に発見していて、もう直ってると思っていたのに、直っていなかったようですorz)
現状では、地道にループさせるしか方法が無いようです。(ループして1レコードだけ返すメソッドを用意しておけばいい話ではありますが^^;)

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

static importできないメソッド

2021-12-18 18:32:33 | PG(Java)

Java Advent Calendar 2021の17日目です。

Asakusa Frameworkという、Javaで分散処理して高速化するバッチアプリケーションを開発・実行するフレームワークがあります。

AsakusaFWでは、Operatorと呼ぶクラスをJavaでコーディングするのですが、このOperatorクラスは他クラスから継承してはいけないことになっています。(継承すると警告が出る)
個人的には、共通的に使われる便利メソッドを親クラスに定義しておいて、子クラスから呼び出すのが好きなんですが、オブジェクト指向原理主義者からは糾弾される行いみたいですねorz
親クラスに書いておけば、同名メソッドをオーバーライドして特別な場合だけ別処理にすることも出来て便利なんですけどねぇ。

そういうメソッドはstatic importしろということらしいです。
ところが、JavaではtoStringという名前のメソッドはstatic importできないらしいです!!
「String toString(Hoge hoge)」こそ、用意しておきたいメソッドだったのにぃ!

 

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AsakusaFWはLog4jを使っていないそうです

2021-12-17 22:36:00 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の17日目です。

なんでも、Log4j2に深刻な脆弱性(CVE-2021-44228)が見つかったとかで、問題になっています。
外部から渡された値をLog4j2でログ出力していると、任意のコードを実行される可能性があるのだそうです。

しかしAsakusaFWはLogbackを使っていてLog4jは使っていないそうなので、関係なさそうです。

AsakusaFWがビルドツールとして使っているGradleはLog4jを使っているらしいですが、ビルドツールだし、外部から渡された値をログ出力するシチュエーションは無い気がするので、問題無いと思われます。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする