OpenDolphin

2025年11月 9日 (日)

OpenDolphin: Java 25 / WildFly 38 への移行

これまで java 21、wildfly 34 で運用していたが、java 25、wildfly 38 への移行に挑戦した

wildfly 38 の準備

wildfly の github から branch 38.x を選択,"Download Zip" して解凍する。作業時点ではこれで 38.0.1.Final がダウンロードされた。

mac で wildfly 38 のビルド

brew をアップデートして mvn と ant を最新にしておく。

$ brew update ; brew upgrade

wildfly の build

[INFO] WildFly Preview: Distribution                                      [jar]
[INFO]
[INFO] ---------------------< org.wildfly:wildfly-parent >---------------------
[INFO] Building WildFly: Parent Aggregator 38.0.1.Final-SNAPSHOT        [1/210]
[INFO]   from pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
Downloading from jboss-public-repository-group: https://repository.jboss.org/nexus/content/groups/public/org/apache/maven/plugins/maven-enforcer-plugin/3.6.1/maven-enforcer-plugin-3.6.1.pom
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/3.6.1/maven-enforcer-plugin-3.6.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/3.6.1/maven-enforcer-plugin-3.6.1.pom (8.2 kB at 144 kB/s)
 :
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  26:05 min
[INFO] Finished at: 2025-10-30T08:00:12+09:00
[INFO] ------------------------------------------------------------------------

これで wildfly-38.0.1.Final-SNAPSHOT ができる。WildFly 34.0.1 と同じく,full distributable build が欲しい場合は,build/target ではなく,dist/target の方を使う必要がある。

wildfly 38.0.1 のセットアップ

  • ./standalone.sh -b 0.0.0.0 で立ち上げて,./add-user.sh で管理ユーザ登録
  • JDBC の登録(ドライバは postgresql-42.7.8.jar),data-source の作成,パスワード登録。
    $ ./jboss-cli.sh --connect
    [standalone@localhost:9990 /] module add --name=org.postgres --resources=~/Downloads/postgresql-42.7.8.jar --dependencies=javax.api,javax.transaction.api
    [standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver)
    [standalone@localhost:9990 /] data-source add --jndi-name=java:jboss/datasources/DolphinDS --name=DolphinDS --connection-url=jdbc:postgresql://localhost/dolphin --driver-name=postgres --user-name=dolphin
    [standalone@localhost:9990 /] /subsystem=datasources/data-source=DolphinDS:write-attribute(name=password, value=dolphin)
    [standalone@localhost:9990 /] quit
    

ライブラリのアップデート

WildFly 38 に合わせて、ライブラリをアップデートする。マイナーバージョンアップのみ。

  • Hibernate 6.6.31.Final
  • Hibernate Search 7.2.4.Final
  • Resteasy 6.2.14.Final
  • Jackson 2.18.4
  • Postgresql 42.7.8

移行に必要な書き換え

  • websocket のタイムアウト抑止
    standalone.xml
    <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" read-timeout="0" write-timeout="0"/>
    

    dolphin server に java 25 をインストール

    $ sudo apt install openjdk-25-jdk-headless
    $ sudo update-alternatives --config java
    alternative java (/usr/bin/java を提供) には 3 個の選択肢があります。
    
      選択肢    パス                                       優先度  状態
    ------------------------------------------------------------
    * 0            /usr/lib/jvm/java-25-openjdk-amd64/bin/java   2511      自動モード
      1            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      手動モード
      2            /usr/lib/jvm/java-21-openjdk-amd64/bin/java   2111      手動モード
      3            /usr/lib/jvm/java-25-openjdk-amd64/bin/java   2511      手動モード
    

    Opensearch インストール

    • ダウンロードサイトから tarball を取ってくる
      $ tar xvzf opensearch-3.3.2-linux-arm64.tar.gz
      $ ln -s opensearch-3.3.2 opensearch
      
    • 初期インストールのプラグインは全部消す
      $ cd opensearch
      $ rm -rf plugins/*
      
    • プラグインインストール
      $ ./bin/opensearch-plugin install analysis-kuromoji
      $ ./bin/opensearch-plugin install analysis-icu
      
    • config/opensearch.yml を設定して起動してみる
      $ vi ./config/opensearch.yml
      cluster.name: opensearch_dolphin
      path.data: /home/dolphin/opensearch/var/lib/opensearch
      path.log: /home/dolphin/opensearch/var/log/opensearch
      
    • opensearch-2.x のインデックスは使えないので、インデックス更新が必要
      2025-11-05 17:10:41,090 INFO  [org.hibernate.search.mapper.pojo.massindexing.impl.PojoMassIndexingLoggingMonitor] (Hibernate Search - Mass indexing - DocumentModel - Entity loading - 3) HSEARCH000031: Mass indexing progress: 100.00%. Mass indexing speed: 259.932800 documents/second since last message, 52.218971 documents/second since start.
      2025-11-05 17:10:43,153 INFO  [org.hibernate.search.mapper.pojo.massindexing.impl.PojoMassIndexingLoggingMonitor] (default task-3) HSEARCH000028: Mass indexing complete. Indexed 246619 entities.
      

    wildfly 起動

    17:29:22,773 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly 38.0.1.Final-SNAPSHOT (WildFly Core 30.0.0.Final) started in 4690ms - Started 628 of 817 services (336 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml - Minimum feature stability level: community
    

    WildFly アップデート記録
    • 2008年 JBossAS 4.0.5
    • 2009年 JBossAS 4.2.3
    • 2010年 JBossAS 5.1.0
    • 2013年 JBossAS 7.1.4
    • 2015年 WildFly 8.2.1
    • 2017年 WildFly 10.2.0
    • 2019年 WildFly 18.0.1
    • 2021年 WildFly 25.0.2
    • 2023年 WildFly 27.0.2
    • 2024年 WildFly 34.0.1
    • 2025年 WildFly 38.0.1
  • 2025年2月 3日 (月)

    運用17年目のまとめ

    昨年まとめるのをわすれてて、2年ぶりの運用まとめ。この2年では、サーバの kvm 移行、サーバの CPU アップグレード、iMac メモリリーク対策、weborca 運用開始、opendolphin java 21 + wildfly 34 への移行、swift で IME 切換サーバ作成、selenium でオルコン作成など、けっこうイベントがあった。

    • データベースの PatientModel の件数
      dolphin=# select count(*) from d_patient;
       count
      -------
       42871
      (1 row)
      
    • データベースの ModuleModel の件数
      dolphin=# select count(*) from d_module;
        count
      ---------
       1762382
      (1 row)
      
    • dolphin サーバの df は、used が 28G で、順調に増えている
      Filesystem      Size  Used Avail Use% Mounted on
      tmpfs           392M  1.2M  390M   1% /run
      /dev/vda2        50G   28G   20G  58% /
      tmpfs           2.0G  812K  2.0G   1% /dev/shm
      tmpfs           5.0M     0  5.0M   0% /run/lock
      tmpfs           392M  4.0K  392M   1% /run/user/1001
      
    • orca サーバの df は、used が 13G で、weborca 移行で大幅に減った
      Filesystem                 Size  Used Avail Use% Mounted on
      tmpfs                      794M  1.4M  793M   1% /run
      /dev/vda2                   50G   13G   34G  28% /
      tmpfs                      3.9G   28K  3.9G   1% /dev/shm
      tmpfs                      5.0M     0  5.0M   0% /run/lock
      tmpfs                      794M  4.0K  794M   1% /run/user/1001
      
    • データベースの dump ファイルのサイズ
      dolphin_db.dump.gpg 3,234,098,553
      orca_db.dump.gpg 378,054,095
      
    • スタンプ数
      $ grep -c stampInfo stamp.xml 
      2241
      

    2024年12月 2日 (月)

    IME on/off の切換 - その2

    im-select のおかげで、IME on/off の切換ができるようになったのであるが、process builder で /usr/local/bin/im-select を実行するという方法での対応であった。つまり、切換が発生するたびに、コマンドをディスクから読みこんで、メモリに展開して、実行して、終了するというのを繰り返すわけで、あまり効率がよいとは言えない方法であった。

    もっとよい方法はないかと考えていた時、ふと、im-select を改造して IME 切換サーバとして常駐させて、そこに切換メッセージを送ることで、IME を切り替えさせればよいのではないかと思いついた。そうすれば、いちいちディスクから読みこんで、メモリに展開して云々というプロセスを全部省略できる。

    im-select は Objective-C で書かれていたが、どうせならナウい Swift で書こうと思って、Swift で、レベルの低い常駐プログラム TISServer (TextInputSources Server) を書いた。これは、標準入力を待機して、J が来たら日本語、K が来たらカタカナ、R が来たら英字に切り替えるという、いかにもシロウトくさいプログラムだ。これを OpenDolphin から process builder で立ち上げて、IME 切換をさせてみた。

    im-select を呼び出す方法だと、呼び出しに 10 msec くらいかかっていたものが、TISServer 法だと、標準出力に出力するだけなので、かかる時間は検出限界以下となった。

    2024年11月28日 (木)

    OrcaController オルコン

    weborca になる前の orca は、monsiaj というオープンソースのクライアントがあって、ショートカット組み込んだり自由にできた。weborca になって、クライアントは chrome ブラウザになったので、ショートカットが使えなくなってしまった。何かいい方法はないかと調べていたところ、selenium というツールを使うと、java で chrome を、自由自在に操作できることがわかった。

    これを使って、opendolphin から weborca を弄ぶ、OrcaController (オルコン) を作ってみた。dolphin 側でキー入力をうけつけて、ショートカットキーならマクロを流し、それ以外のキーはそのまま weborca に流すしくみ。もちろん、dolphin 側でキーリスンしているので、chrome をクリックして、フォーカスを渡してしまうと機能しない。

    Orcon1 Orcon2_20241127073201

    さらに、高難度のコントロール方法として、ステルスモードというのも作ってみた。ステルスモードにすると、オルコンのタブにマークが付く。この状態は、dolphin で受けるキーと weborca に送るキーを、裏で密かに分離する。表では dolphin の操作ができて、裏では orcon で設定しているショートカットなどを weborca に通して、患者番号を送ったりもできる。しかし、例えば enter は dolphin が取ってしまうので、代わりに alt + enter で enter を送るようにしていたり、難しいことになってしまっているので、多分プログラムした本人以外は操作できない。

    Orcon3

    あと、dolphin に依存しない、スタンドアロンバージョンも作ってみた。weborca 単独で使うときに、マクロを使うことができる。

    2024年11月 8日 (金)

    OpenDolphin: java 21 / wildfly 34 への移行

    これまで java 17、wildfly 27 で運用していたが、java 21、wildfly 34 へ移行した

    wildfly 34 の準備

    wildfly の github から branch 34.x を選択,"Download Zip" して解凍する。作業時点ではこれで 34.0.1.Final がダウンロードされた。

    mac で wildfly 34 のビルド

    brew をアップデートして mvn と ant を最新にしておく。

    $ brew update ; brew upgrade
    

    wildfly の build

    $ mvn install
    [INFO] Scanning for projects...
    Downloading from jboss-public-repository-group: https://repository.jboss.org/nexus/content/groups/public/org/wildfly/core/wildfly-core-parent/26.0.1.Final/wildfly-core-parent-26.0.1.Final.pom
    Downloaded from jboss-public-repository-group: https://repository.jboss.org/nexus/content/groups/public/org/wildfly/core/wildfly-core-parent/26.0.1.Final/wildfly-core-parent-26.0.1.Final.pom (123 kB at 73 kB/s)
    Downloading from jboss-public-repository-group: https://repository.jboss.org/nexus/content/groups/public/org/jboss/jboss-parent/40/jboss-parent-40.pom
    Downloaded from jboss-public-repository-group: https://repository.jboss.org/nexus/content/groups/public/org/jboss/jboss-parent/40/jboss-parent-40.pom (76 kB at 106 kB/s)
    Downloading from jboss-public-repository-group: https://repository.jboss.org/nexus/content/groups/public/io/netty/netty-bom/4.1.112.Final/netty-bom-4.1.112.Final.pom
    Downloading from central: https://repo.maven.apache.org/maven2/io/netty/netty-bom/4.1.112.Final/netty-bom-4.1.1
     :
     :
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  20:59 min
    [INFO] Finished at: 2024-10-25T14:19:47+09:00
    [INFO] ------------------------------------------------------------------------
    

    これで wildfly-34.0.1.Final-SNAPSHOT ができる。WildFly 27.0.2 と同じく,full distributable build が欲しい場合は,build/target ではなく,dist/target の方を使う必要がある。

    wildfly 34.0.1 のセットアップ

    • ./standalone.sh -b 0.0.0.0 で立ち上げて,./add-user.sh で管理ユーザ登録
    • JDBC の登録(ドライバは postgresql-42.7.4.jar),data-source の作成,パスワード登録。
      $ ./jboss-cli.sh --connect
      [standalone@localhost:9990 /] module add --name=org.postgres --resources=~/Downloads/postgresql-42.7.4.jar --dependencies=javax.api,javax.transaction.api
      [standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver)
      [standalone@localhost:9990 /] data-source add --jndi-name=java:jboss/datasouces/DolphinDS --name=DolphinDS --connection-url=jdbc:postgresql://localhost/dolphin --driver-name=postgres --user-name=dolphin
      [standalone@localhost:9990 /] /subsystem=datasources/data-source=DolphinDS:write-attribute(name=password, value=dolphin)
      [standalone@localhost:9990 /] quit
      

    ライブラリのアップデート

    WildFly 34 に合わせて、ライブラリをアップデートする。

    • Hibernate 6.6.1.Final
    • Hibernate Search 7.2.1.Final
    • Resteasy 6.2.10.Final
    • Jackson 2.17.0
    • Postgresql 42.7.4

    移行に必要な書き換え

    前回やらかしたので、今回はマイグレーションガイド読んだが、Hibernate 6 のままなので、多分、罠はないようだった。

    • SearchPredicateFactory#bool(Consumer) が非推奨になり、f.bool().with(〜) か、.where ((f, root) -> ) に書き換え推奨されていたので、書き換えた。where ( (f, root) -> ) の方が、一体わかりやすい。

    • websocket が 90秒でタイムアウトするようになった(wildfly 28 かららしい)。standalone.xml の該当箇所に read-timeout="0" write-timeout="0" を挿入すると、タイムアウトしなくなる。
      <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" read-timeout="0" write-timeout="0"/>
      
    • クライアントで使っていた javax.mail は、provided scope の場合は jakarta.mail-api、実体が欲しい場合は angus.mail を使うように変わっていた

    Opensearch は最新版の 2.17.1 に移行

    • ubuntu で java 21 をインストール
      $ sudo apt install openjdk-21-jdk-headless
      $ sudo update-alternatives --config java
      alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。
      
        選択肢    パス                                       優先度  状態
      ------------------------------------------------------------
      * 0            /usr/lib/jvm/java-21-openjdk-amd64/bin/java   2111      自動モード
        1            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      手動モード
        2            /usr/lib/jvm/java-21-openjdk-amd64/bin/java   2111      手動モード
      
    • レポジトリがないので、直接ダウンロードサイトから tarball を取ってくる
      $ tar xvzf opensearch-2.17.1-linux-x64.tar.gz
      $ ln -s opensearch-2.17.1 opensearch
      
    • 初期インストールのプラグインは全部消す
      $ cd opensearch
      $ rm -rf plugins/*
      
    • プラグインインストール
      $ ./bin/opensearch-plugin install analysis-kuromoji
      $ ./bin/opensearch-plugin install analysis-icu
      
    • config/opensearch.yml を設定して起動してみる
      $ vi ./config/opensearch.yml
      cluster.name: opensearch_dolphin
      path.data: /home/dolphin/opensearch/var/lib/opensearch
      path.log: /home/dolphin/opensearch/var/log/opensearch
      $ ./bin/opensearch
      WARNING: A terminally deprecated method in java.lang.System has been called
      WARNING: System::setSecurityManager has been called by org.opensearch.bootstrap.OpenSearch (file:/home/dolphin/opensearch-2.17.1/lib/opensearch-2.17.1.jar)
       :
      
    • インデックスは、前バージョンから var/lib/opensearch/nodes をコピーしてそのまま使える

    wildfly 起動

    8:20:55,954 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly 34.0.1.Final-SNAPSHOT (WildFly Core 26.0.1.Final) 
    started in 71423ms - Started 640 of 824 services (328 services are lazy, passive or on-demand) - Server configuration file in use:
    standalone.xml - Minimum feature stability level: community
    

    その他

    • java 21 になって、メモリリーク?はなくなった。
    • 今回、依存性管理を pom.xml から gradle + kotlin に移行した。苦手の xml から開放されてよかった。
    • パッケージは jpackage から conveyor に変更した。conveyor の方が少し速くて、しかも mac で windows 用の msix が作れる。ちなみに、windows で msix するには、オレオレ証明書のインストールが必要。
      Msix   Certification
    • あと、conveyor でバージョン番号が通りやすいように、OpenDolphin-1.3.0 はプロジェクト名として settings.gradle.kts に固定して、バージョン番号は、21.0 を gradle.properties に設定して、これをインクリメントしていくことにした。
      About

    WildFly アップデート記録
    • 2008年 JBossAS 4.0.5
    • 2009年 JBossAS 4.2.3
    • 2010年 JBossAS 5.1.0
    • 2013年 JBossAS 7.1.4
    • 2015年 WildFly 8.2.1
    • 2017年 WildFly 10.2.0
    • 2019年 WildFly 18.0.1
    • 2021年 WildFly 25.0.2
    • 2023年 WildFly 27.0.2
    • 2024年 WildFly 34.0.1

    2024年9月 3日 (火)

    IME on/off の切り替え

    入力フィールドに応じて、ime が on/off される機能を mac で実現するのは結構大変で、これまで色々苦労してきた。ここしばらくは、ATOK の入力モードを、使っていないファンクションキーで切り替えられるように設定して、OpenDolphin からそのキーを robot で出力することで対応していた。

    最近、weborca への移行準備を進めていて、mac クライアントを試していたところ、なんと、当たり前のようにフィールドごとに「ひらがな・カタカナ・英数」の切換ができていた。ただ、monsiaj と違って、weborca クライアントはソースが公開されていないので、実際どうやっているかは謎である。

    しかし、できるらしいことは分かったので、色々 web 検索してみたところ、im-select なるものを見つけた。内部の方法が weborca と同じなのかどうかは不明だが、OpenDolphin からこれを呼び出して試してみたところ、ime の切換ができるようになった。

    2024年9月 1日 (日)

    促音拗音の検索

    マイナンバーカードになってから、「ショウジ」さんが「シヨウジ」さんで読み込まれている場合はどうしたらよいかと、事務から相談を受けた。拗音促音は、結構適当に登録されているようだ。マイナンバーカードが「シヨウジ」さんになっているのであれば、それを勝手に「ショウジ」さんに変えるわけにもいかないので、そのまま登録してもらうことにした。

    そうすると問題になるのが、OpenDolphin での検索である。「ショウジ ショウタ」さんを検索したとき、「シヨウジ シヨウタ」さんも、「ショウジ シヨウタ」さんも、「シヨウジ ショウタ」さんもヒットするようにしなければならない。つまり、促音拗音があった場合、それぞれ大きい場合、小さい場合の全ての組合せを数え上げて検索する必要がある。どうしようか考えていた時、ふと、ChatGPT に相談したらいいのではと思いついた。

    相談してみたところ、全ての場合の総数を計算して、総数まで2進数でインクリメントしながら、ビットのありなしで全ての場合を数え上げる java プログラムを教えてくれた。それを元に、プログラムしてうまくいった (swapSmallKana) 。ChatGPT 恐るべし。

    2023年2月 4日 (土)

    Java 17 への移行(7) - OpenDolphin client の対応

    • Java 8 では JavaFX が同梱されていたが、Java 17 では openjfx を maven で導入する必要がある
    • JavaFX8 の com.sun.javafx パッケージが全て javafx パッケージに統一されていた。
    • com.apple.eawt パッケージが使えなくなったが、これは大分前に open.dolphin.ui.desktop パッケージにまとめてあったので、java.awt.desktop に切り替えて対応できた。
    • com.apple.laf を extends できなくなったので、使わなくてもいいようにコードを書き直した。
    • トラックパッドを触っている状態を検出するのに jnilib を使っていた。この機会に jni を使わなくても動作するように、コードを工夫して書き直した。
    • monsiaj-pns と同じく、pom.xml でアプリを作れるようにした。monsiaj、opendolphin それぞれのアプリ内部で専用の jre が走っている状態で、贅沢な時代になったものだと思う。
    • apple.awt.brushMetalLookapple.awt.transparentTitleBar として復活していた。とてもうれしい。さらに、apple.awt.fullWindowContentapple.awt.windowTitleVisible なるプロパティもできて、java 1.8 では作れなかった素敵なタイトルバーが作れるようになってた。
    Login Stampbox

    Java 17 への完全移行が完了し、これで来るべき apple silicon 時代にも対応できるようになったと思う。


    WildFly アップデート記録

    • 2008年 JBossAS 4.0.5
    • 2009年 JBossAS 4.2.3
    • 2010年 JBossAS 5.1.0
    • 2013年 JBossAS 7.1.4
    • 2015年 WildFly 8.2.1
    • 2017年 WildFly 10.2.0
    • 2019年 WildFly 18.0.1
    • 2021年 WildFly 25.0.2
    • 2023年 WildFly 27.0.2

    2023年2月 3日 (金)

    Java 17 への移行(6) - Hibernate 6 でやらかす

    Hibernate 6 でデフォルトのプライマリキー採番方法が変更になって、hibernate_sequence からではなく、テーブル名_seq から採番するようになった。これまでの採番方式を維持するためには、persistent.xml に以下のように記載しなくてはならない。

    <property name="hibernate.id.db_structure_naming_strategy" value="single" />
    

    今回、これに気付かずに運用開始してやらかしてしまった。Hibernate 5 の時はテスト段階で警告が出てくれたので、hibernate.model.generator_name_as_sequence_name=false をセットして事なきを得たが、今回は警告も出ないし、テストでエラーも出なかったので、完全に油断していた。

    木曜日から運用開始して、金曜日まで問題なし。そして土曜日、診療開始してしばらくしてからエラーが出るようになった。

    2023-01-28 09:04:22,093 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-80) SQL Error: 0, SQLState: 23505
    2023-01-28 09:04:22,093 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-80) ERROR: duplicate key value violates unique constraint "d_module_pkey"
      詳細: Key (id)=(1070) already exists.
    

    土曜日は患者さん多く、すぐに対応するのは不可能。全身から血の気が引いたが、何回か再送すると動くので、頑張って運用を続けた。再送2−3回で送らさったのが多かったが、最高10回再送でやっと通ったのもあった。そして、幸運にも何とか外来終了することができて、最後のカルテが保存できた時は、本当にほっとして力が抜けた。

    トラブルの原因となったプライマリーキーの件は、土曜外来終了後に web 検索して判明した。多分、プライマリーキーの若い番号は ModuleModel には割当たってなかったので、最初の1000番くらいは空きがあったのだろう。それを食い尽くして、何とか隙間にねじ込むしかなくなったのが土曜日だったのだと思われる。次回はちゃんとマイグレーションマニュアル読もうと誓った週末であった。

    ちなみに、Hibernate 6 の新しいデフォルトの採番は、テーブルごとにインクリメントしていくので、効率的に採番できてよい方法だと思う。当院のように hibernate_sequence を single で使ってしまっていると、bigint なので最大 9,223,372,036,854,775,807 までしか使えない。当院の hibernate_sequence は 15年で既に 2,725,392 に達しており、このままのペースで行くと 50,763,552,748,661年後には使い果たしてしまうことになる。

    2023年2月 2日 (木)

    Java 17 への移行(5) - OpenDolphin server の対応

    OpenSearch 関連設定

    • kuromoji を使用する JapaneseAnalysisConfigurer.java を作成する
      public class JapaneseAnalysisConfigurer implements ElasticsearchAnalysisConfigurer {
          @Override
          public void configure(ElasticsearchAnalysisConfigurationContext context) {
              context.analyzer("japanese").custom()
                  .tokenizer("kuromoji_tokenizer")
                  .charFilters("icu_normalizer", "kuromoji_iteration_mark")
                  .tokenFilters("kuromoji_baseform", "kuromoji_part_of_speech", "ja_stop", "kuromoji_number", "kuromoji_stemmer");
          }
      }
      
    • ModuleModelBridge.java の代替手段
      masuda 先生の ModuleModelBridge.java をずっと使わせてもらっていたのであるが、アップデートで byte[] が byte と判定されるようになってしまい、動かなくなってしまった。そこで、シロウト丸出しな代替案として、fullText なる String フィールドをでっち上げて、setBeanBytes をフックして文字列を書き込ませて、それをインデックスさせるという手を使った。
      @Transient
      @FullTextField(analyzer = "japanese")  // hibernate search
      private String fullText;
      
      public void setBeanBytes(byte[] beanBytes) {
        this.beanBytes = beanBytes;
        // FullTextField を Index させるためのでっちあげ
        if (Objects.nonNull(beanBytes)) { setFullText(beanBytesToString(beanBytes)); }
      }
      
    • persistence.xml に JapaneseAnalysisConfigurer を認識させる
      <property name="hibernate.search.backend.type" value="elasticsearch"/>
      <property name="hibernate.search.backend.hosts" value="localhost:9200"/>
      <property name="hibernate.search.backend.protocol" value="http"/>
      <property name="hibernate.search.backend.analysis.configurer" value="class:open.dolphin.JapaneseAnalysisConfigurer" />
      

    検索方法の種類

    • 新しい hibernate search では、検索方法も詳しく選べるようになっていて、通常の検索では phrase() サーチを採用し、simpleQueryString() サーチ、regexp() サーチもオプションできるようにプログラムした。

      List hits = searchSession.search(DocumentModel.class)
        .where(f -> f.bool(b -> {
          b.must(switch (spec.getType()) {
            case QUERY -> f.simpleQueryString().field("modules.fullText").matching(searchText);
            case REGEXP -> f.regexp().field("modules.fullText").matching(searchText);
            default -> f.phrase().field("modules.fullText").matching(searchText);
          });
          :
      

    MassIndexer 関連

    • MassIndexer でインデックス条件を指定できるようになったので、STATUS_FINAL の DocumentModel だけインデックスするようにした。インデックス件数が 313,845件から 203,149件に減った。というか、今までは MassIndexer した分は、更新元の古いカルテも全部インデックスされてたということになる。

      MassIndexer massIndexer = searchSession.massIndexer();
      massIndexer.type(DocumentModel.class).reindexOnly("e.status = :status").param("status", IInfoModel.STATUS_FINAL);
      

      なお、ここの e.status ... の前のハードコードされてる sql が jpa compliance に反しているらしく exception を吐く。persistent.xml で hibernate.jpa.compliance.query = false の設定が必要。

    MassIndexer のインデックススピードを比較してみたところ、現在使用中の i9-9900 の dolphin サーバで 14.5 doc/sec だったのに対して、こないだ購入した m1 max の mac studio では 41.3 doc/sec だった。例えば OpenSearch を強いマシンで動かして、それを dolphin サーバから利用するようにすると、インデックススピードの改善が期待できる。しないけど。

    OpenDolphin サーバ起動

    OpenSearch が立ち上がってから WildFly を立ち上げる必要がある。お前が使っているのは Elasticsearch じゃないぞと怒られるが気にしない。

    • OpenSearch が立ち上がった時のメッセージ

      [INFO ][o.o.c.m.MetadataCreateIndexService] [dolphin.local] [document-000001] creating index, cause [api], templates [], shards [1]/[1]
      
    • WildFly に怒られるところ

      WARN  [org.hibernate.search.backend.elasticsearch.dialect.impl.ElasticsearchDialectFactory] (MSC service thread 1-7) HSEARCH400085: Unknown Elast icsearch version running on the cluster: 'opensearch:2.4.1'. Hibernate Search may not work correctly. Consider updating to a newer version of Hibernate Search, if any.
      

    ターミナルでの OpenSearch 動作確認

    • インデックス一覧
      $ curl 'http://localhost:9200/_aliases?pretty'
      {
        "document-000001" : {
          "aliases" : {
            "document-read" : {
              "is_write_index" : false
            },
            "document-write" : {
              "is_write_index" : true
            }
          }
        }
      }
      
    • アナライザの動作確認
      $ curl -X POST 'localhost:9200/document-000001/_analyze?pretty' -H "Content-type: application/json" -d '{"analyzer": "kuromoji", "text": "カルテ記載のテスト"}'
      {
        "tokens" : [
          {
            "token" : "カルテ",
            "start_offset" : 0,
            "end_offset" : 3,
            "type" : "word",
            "position" : 0
          },
          {
            "token" : "記載",
            "start_offset" : 3,
            "end_offset" : 5,
            "type" : "word",
            "position" : 1
          },
          {
            "token" : "テスト",
            "start_offset" : 6,
            "end_offset" : 9,
            "type" : "word",
            "position" : 3
          }
        ]
      }
      
    • 取得データ確認
      $ curl 'http://localhost:9200/document-000001/_search?pretty'
      
    • インデックス削除
      $ curl -X DELETE 'http://localhost:9200/document-000001?pretty'
      {
        "acknowledged" : true
      }
      

    その他の WildFly 27 関連修正

    • javaee が jakartaee になっており、大量の javax を jakarta に書き換える必要があった。
    • RestEasy がバージョン 6 になって、RestEasyClient の作り方が変わった。
    • Hibernate Search 6 では、FullTextEntityManger ではなく、SearchSession で操作するようになった。
    • jackson はバージョン 2.13.4 になっており、jackson-databind が jackson.databind となる微妙な変化もあった。

    より以前の記事一覧