電子カルテ

当院では,2008年の開業以来,電子カルテとしてオープンソースの OpenDolphin 1.3.0(デジタルグローブ社)を使用させていただいています。素晴らしいソフトをオープンソースで公開されているデジタルグローブ社には,とても感謝しています。

どんなに優れた電子カルテも,実際に運用するには個々の医院に合わせたカスタマイズが必要だと思います。その場合,オープンソースなら,自院のためだけに自由にカスタマイズすることができます。このブログでは,OpenDolphin を当院で運用するにあたって,色々カスタマイズした内容を中心に公開しています。


  • カスタマイズしたソースは公開しています
  • デジタルグローブ社はライフサイエンスコンピューティング(株)と合併し,
    現在同社のオープンドルフィンラボとなっています
  • 本家オープンドルフィンラボの OpenDolphin は既に ver. 2.x になっています

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年10月14日 (火)

    マイナタッチにおける保険証OCR不具合発生

    突然、マイナタッチの OCR ができなくなってしまった事件の、トラブルシューシング記録。

    1. 概要

    事務内で保険証OCR専用に使用しているマイナタッチにおいて、「今朝から保険証が読み取れない」という報告があった。調査の結果、OCR処理時に通信不良が発生している可能性が高いことが判明した。本件の経過および対応内容を以下にまとめる。

    2. 事象の詳細

    対象端末では、保険証を挿入すると「券面を読み取っています」という表示のまま処理が停止し、長時間経過後に「ALM2001 USB接続エラー」が発生した。なお、OCR操作前の段階ではマイナタッチ自体は正常に動作しており、通常のマイナンバーカード読み取りは問題なかった。したがって、OCR処理時に限定して通信エラーが発生している状態と考えられた。

    Almex

    3. 切り分けおよび対応経過

    • メイン端末での動作確認
      メイン端末(apx-medical)につながっているマイナタッチでは、OCRは正常に動作した。
    • 事務PCでの再試験
      メイン端末のマイナタッチを事務内PC(liva z3)に接続すると、再びOCRが停止。予備のマイナタッチに交換しても同様の不具合を再現。
      → 事務内PC側の環境に起因する可能性が浮上。
    • PC交換
      事務PC(liva z3)を予備の liva に交換したところ、当初は数件正常に読み取りできたが、その後同じ症状が再発。
      → 再現性があり、恒常的な通信不良の疑い。
    • ケーブル交換
      USBケーブルを交換したところ、同様に一時的に改善したが、再び停止。
      → ケーブル単体が原因ではないと判断。
    • 新規PC導入による検証
      姑息対応はあきらめて、新規PC(N100)を調達し、オン資をインストールしたところ、問題なくOCRが動作。
      → ハードウェアまたは通信制御の相性要因の可能性が高い。

    4. 追加検証

    後日、liva z3 および予備 liva を用いて再度検証を実施。いずれの端末でもUSB接続エラーが再現した。調査の結果、マイナタッチとPC間はCOMポートを介したシリアル通信で動作しており、この通信設定に起因する可能性が考えられた。

    Web上の情報を参考に、シリアル通信の bm設定値 をデフォルトの「16」から「1」に変更したところ、エラーが解消し正常にOCRを読み取ることができた。設定を元に戻して(bm=16)再試験してみたが、正常に動作しエラーは再現しなかった。

    5. 考察

    原因はシリアル通信まわりの不安定動作である可能性が高い。設定変更により通信ポートが再初期化され、一時的に安定化した可能性がある。 PC(特にLivaシリーズ)とマイナタッチ間のUSBシリアルドライバの相性、または一時的なポート不整合が疑われる。

    6. 現状および今後の対応

    現在、新規導入PC(N100)上では問題なくOCRが稼働中。 旧 Liva 端末については、シリアル通信環境の不安定要因を引き続き調査予定。 必要に応じて、bm設定変更の恒久化などを検討する。

    7. まとめ

    本件は、マイナタッチのハードウェア故障ではなく、特定PC環境におけるシリアル通信エラーが主因と推定される。設定変更による一時的な改善を確認したが、根本原因の特定には引き続き検証が必要である。

    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
      

    2025年1月31日 (金)

    オン資PCインストール忘備録

    使用機器

    Maxtang NX-N100

    • CPU: Intel(R) N100 800MHz, RAM 8GB
    • Windows 10 IoT Enterprise LTSC 21H2

    通常ネットワークでの作業

    1. OqsComApp アカウントの作成
      家族とその他のユーザー>その他のユーザーをこのPCに追加>このユーザーのサインイン情報がありません>Microsoft アカウントを持たないユーザーを追加する
    2. PCに名前を付ける:システム詳細情報>このPCの名前を変更
    3. 自動ログイン設定
      netplwiz で「ユーザーがこのコンピューターを使うには、ユーザー名とパスワードの入力が必要」が出なかった。
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device\DevicePasswordLessBuildVersion2 から、0 に変更
    4. 不要なアプリを全て削除
    5. IPv4 固定:ネットワークとインターネット>イーサネット>アダプターのオプションを変更する
    6. スリープしないようにする:システム>電源とスリープ
    7. リモートデスクトップの使用:システム>リモートデスクトップ
    8. リモートデスクトップでアクセスしたときに、キーボードが ASCII 配列になってしまうのを直す HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411\Layout FileKBDJPN.DLL から kbd106.dll に変更
    9. リモートデスクトップで mac のかな/英数キーを有効にする
      いろいろいじっているうちに、うまく切り替わるようになったが、何が有効だったのか不明
    10. 背景画像の設定:個人設定>背景
    11. Edge のタブページをできるだけ空白に
      設定>スタート・・・>新しいタブページ>起動時 about:blank を開く
    12. .NET Framework4.8 のインストール:既にインストールされていた
    13. パスワード保存の設定
      Microsoft Edge 管理用テンプレートを適用する
      1. 管理用テンプレートをダウンロードしてインストール
        Microsoft Edge Enterprise ランディング ページのWindows 64-bit のポリシーの分かりにくいリンクをクリック、ダウンロードファイルをダブルクリック、出てきた zip を展開、MicrosoftEdgePolicyTemplates フォルダが展開される
      2. 展開されたフォルダの windows\admx を開く
      3. msedge.admxc:\Windows\PolicyDefinitions にコピー
      4. en-USja-JP に、対応するフォルダの msedge.adml をコピー
    14. UltraVNC のインストール
      インストール後、デバイスマネージャ>操作>レガシーハードウェアの追加>一覧から選択>ディスプレイアダプタ>uvnc bvba

    オン資ネットワークでの作業

    05_01_医療機関等向けセットアップ手順書(医療情報閲覧用端末編)

    1. DNS 設定
      IPv4: 空欄、IPv6: 2404:1a8:f583:d00::53:1, 2404:1a8:f583:d00::53:2
    2. https://www.lineauth.mnw に接続
      「接続がプライベートではありません」の警告>無理矢理接続で、回線認証済みが表示
    3. MPKIクライアントのインストール
      https://cert.obn.managedpki.ne.jp/p/s からダウンロード、「Microsoft Defender SmartScreen は CybertrustManagerPKIClient.msi をスキャンすることができませんでした」というメッセージが出るが、保存>実行する。タイムアウト待ちでダウンロード、実行に時間がかかる。このファイルは、オン資サイトにもあった (CybertrustManagedPKIClient.zip)。
    4. ブラウザ設定ツール (InternetPropertySetting.zip):解凍して管理者として実行
    5. プロキシサーバの設定
      設定>ネットワークとインターネット>プロキシ>手動プロキシセットアップ
      設定後、シェルを管理者として実行
      PS C:\Users\OqsComApp> netsh winhttp import proxy source=ie
      PS C:\Users\OqsComApp> netsh winhttp show proxy
      
    6. 時刻の設定
      設定>時刻と言語>別のタイムゾーンの時計を追加>インターネット時刻>設定の変更
      サーバ: ntp.base.oqs-pdl.org
    7. 認証局の電子証明書をインストールする
      証明書右クリック>PFXのインストール>現在のユーザー>次へ>パスワード入力、チェックボックスは全ての拡張プロパティを含めるのみ>自動的に証明書ストアを選択>警告ダイアログこの証明書をインストールしますか:はい
      Edge>設定>プライバシー>証明書の管理 証明書が表示される
    8. グループポリシーの編集 (gpedit.msc)
      管理用テンプレート>Microsoft Edge - 既定の設定(ユーザーはオーバーライドできます)>パスワードマネージャーと保護>該当の設定を有効にする
    9. レジストリ HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\PasswordManagerEnabled の値を、0 から 1 に変更。
      その後、edge://policy で、PasswordManagerEnabled が false から true に変わっていることを確認。

    01_01_医療機関等向けセットアップ手順書(資格確認端末)

    1. 顔認証ライブラリのインストール
      • OQSFaceApp_v4.0.3.zip を解凍して、OqsInstall.exe を実行する。インストール終了後、再起動ダイアログが出る。
      • Edge の設定で、拡張機能を選択
      • 左下の「開発者モード」を有効化する
      • c:\Program FIles\OQS-Auth\ext\delegate.crx を Edge にドロップ
        「目視確認用アプリケーションを Microsoft Edge に追加しますか」>追加
        同様に、nopinauth.crxpinauth.crx を追加する
      • 開発者モードを無効化する
    2. OQSComApp_v4.0.1.zip. を解凍して、OqsInstall.exe を実行する。
    3. OQSDistroApp_v2.1.0.zip. を解凍して、contents\setup\OQSDistroApp.msi を実行
      QqsInstall.exe ではインストールできない)
      デスクトップに「オンライン資格確認接続確認ツール」「オンライン資格確認配信アプリケーション」ができる。接続確認ツールを実行してしばらく待つと、設定していないサービス以外は OK の結果が出る。配信アプリケーションを起動すると、配信サーバへの接続確認、配信実績の確認などができる。
    4. 配信アプリケーションタスクの登録:OQSDistroApp\tools
      タスク スケジューラ>タスクスケジューラライブラリ>タスクのインポート>C:\Program Files\OQS\OQSDistroApp\tools\OQS_exec_distroappstart.xml>ユーザーまたはグループの変更>OqsComApp>パスワード入力>再起動
      同フォルダの OQS_exec_distroappstop_periodic.xml については、マニュアルに記載なし
    5. オンライン資格確認配信アプリケーション管理ツールで配信実績の確認
      [Information]
      Status=サーバー接続待ち [再開予定時刻:2025/01/25 12:58:24]
      MedicalInstitutionCode=0110123456
      TerminalID=oqs-terminal
      TerminalModel=ALN50
      TerminalOS=Microsoft Windows 10 IoT Enterprise LTSC
      UserAccount=User\OqsComApp
      
    6. 連携アプリアカウント設定:管理者カウント(マスターではない)でログインして作成
      このアカウントは、req を監視して、データが入ったら認証するために使うアカウント。オン資PCに設定する。
      資格情報マネージャー>Windows 資格情報>汎用資格情報の追加>資格情報の入力
      • アドレス:OQS_LOGIN_KEY、ユーザー名:R0ORCA4、パスワード
      • アドレス:OQS_MEDICAL_INSTITUTION_CODE、ユーザ名:OQS_Admin、パスワード:10桁医療機関コード
    7. 連携アプリケーションの定期起動の設定:OQSComApp\tools
      • 消し忘れファイル機能定期実行用タスク (OQS_exec_comappdelfile_periodic
      • 消し忘れファイル機能PC起動時実行用タスク(OQS_exec_comappdelfile_running
      • 連携アプリ定期実行用タスク (OQS_exec_comappstart
      タスク スケジューラー>タスクスケジューラライブラリ>タスクのインポート>C:\Program Files\OQS\OQSComApp\tools\OQS_exec_comappdelfile_periodic >ユーザー又はグループの変更>選択するオブジェクト OqsComApp>パスワード入力
      残り2ファイルも同様にインポートする
    8. 顔認証アカウントの作成:認証機器(マイナタッチ/HI-CARA)に設定する F0xxxxx という ID
      新しい認証機器を買ったら設定する。設定データは PC に保存される。
    9. マイナタッチのセットアップ
      HI-CARA の前にインストール。後だと、インストーラが止まってしまった。
      RDP だと、ホストの USB が認識されなくて、インストールできないので注意。
      • Setup_mynaconsole_1.1.1.exe を実行。デスクトップや、ダウンロードフォルダから起動する。
      • USB を接続して、マイナタッチの電源を入れる。本体から出ている USB はカードリーダで、本体のスイッチが入っていなくても認識される。
      • カードリーダ管理>接続デバイスで初期化>受付3、F0xxxxxx>保存>再起動
        ここの F0xxxxxx は、PC に保存される。新しい ALMEX をつないでも、DEVICE ID は変わらない。
      • 動作環境設定>うさぎ病院>保存>再起動
      • カードリーダ管理>アカウント設定>パスワード入力>初期設定>接続開始>しばし待つ>本体アップデート開始
      • アップデート終わって30秒待つと初期画面表示
    10. HI-CARA セットアップ:FaceAuthenticatorAppSetup.zip を展開、実行
    11. フォルダの共有設定 (C:\OQS\almex, face, req, res)
      プロパティ>共有>OqsComApp ユーザーで共有有効化

    2025年1月20日 (月)

    サーバマシンのアップグレード

    当院のサーバは、一昨年、i5-12400 マシンにアップグレードして、全く問題なく動いているにもかかわらず、当院には明らかに無駄な、オーバースペックな、新しいマシンを組んでしまった。理由はただ一つ、CPU の名前 - Intel(R) Core(TM) Ultra 7 265K - だけである。ウルトラセブン・サーバ、進め銀河の果てまでも。

    • os は ubuntu 22.04 をインストール。マザーボードが新しすぎて、内蔵 ether がつながらず、詰んだかと思ったが、HWE Kernel でインストールしたところ、内蔵 wifi がつながるようになり、wifi 接続で何とかインストールできた。
    • 調べてみると、問題の内蔵 ether は、RTL8125 というチップで、r8169 のドライバがロードされており、機能していないようであった
      [    1.176922] r8169 0000:84:00.0: error -ENODEV: unknown chip XID 688, contact r8169 maintainers (see MAINTAINERS file)
      
    • r8125 のドライバは、ppa (https://github.com/awesometic/realtek-r8125-dkms) でインストールできた。
      $ sudo apt install realtek-r8125-dkms
      
      さらに、もともとの r8169 ドライバを black list に入れて、読まれないようにする
      $ sudo vi /etc/modprobe.d/blacklist-r8169.conf
      # To use r8125 driver explicitly
      blacklist r8169
      $ sudo update-initramfs -u
      $ sudo reboot
      
      今回使用した最新マザーボードは、secure boot がデフォルトで enabled になっており、サードパーティーの ppa のインストールでは、Machine Owner Key (MOK) が必要になった。インストール時にパスワード入力、再起動時に画面に従って、Enroll MOK → パスワード入力する。これで r8125 で内蔵 ether が使えるようになった。
      $ lspci -k
      84:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 0c)
          DeviceName: RTL8125 2.5GbE Controller
          Subsystem: ASUSTeK Computer Inc. RTL8125 2.5GbE Controller
          Kernel driver in use: r8125
          Kernel modules: r8169, r8125
      
    • インストール時に自動作成された、wifi アクセス用の 50-cloud-init.yaml は、cloud-init が働いていると、消去しても復活してしまう。cloud-init をアンインストールしてから削除する。
      $ sudo apt purge cloud-init -y
      $ sudo rm -rf /etc/cloud
      $ sudo rm -rf /var/lib/cloud/
      
    • kvm 環境を、以前の i5-12400 マシンと同様にインストールして再起動したところ、起動時に以下のエラーが出た
      error: Secure Boot forbids loading module from 
      (hdo, gpt2)/boot/grub/xB6_64-efi/serial.mod.
      error: terminal 'serial' isn't found. 
      error: terminal 'serial' isn't found.
      
      serial.mod が secure boot ではじかれている。serial って何だろうと思って見てみたら、xen 時代の grub 設定だった。削除した。

    レセプト処理速度(件/sec)

    CPU データチェック レセプト作成
    i9-9900K@3.6G 22.4 19.4
    i5-12400F@2.5GHz 32.3 25.7
    Core Ultra 7 265K 39.7 36.4

    当院の歴代サーバは、Pentium 4 → Core 2 Duo → Core i と進化してきたが、ウルトラセブンの力で、さらに強くなった。top コマンドでは、CPU が 20個見える。

    Fig_20250117133301

    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年11月 7日 (木)

    WebORCA オンプレ版に移行

    weborca 構築の忘備録

    weborca をインストールする kvm 仮想マシンの準備

    • 作ってあるテンプレートマシン template2204 から新しいマシンを作成
      $ sudo virsh define virt-config/template2204.xml
      $ sudo virsh domrename template2204 weborca
      $ sudp cp template2204.qcow2 weborca.qcow2
      $ sudo virsh edit weborca
      
    • 容量を 50G に拡張
      $ sudo qemu-img info weborca.qcow2
      image: weborca.qcow2
      file format: qcow2
      virtual size: 20 GiB (21474836480 bytes)
       :
      
      $ sudo qemu-img resize -f qcow2 /vm/weborca.qcow2 +30G
      Image resized.
      
      $ sudo virsh start weborca
      $ sudo virsh console weborca
      $ sudo parted /dev/vda
      GNU Parted 3.4
      /dev/vda を使用
      GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
      (parted) p
      警告: /dev/vda で利用可能な領域の一部が利用されていません。GPT を修正して全ての 領域を利用可能にするか(62914560
      ブロック増えます)、このままで続行することができますが、どうしますか?
      修正/Fix/無視(I)/Ignore? Fix
      モデル: Virtio Block Device (virtblk)
       :
      番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
       1    1049kB  2097kB  1049kB                          bios_grub
       2    2097kB  21.5GB  21.5GB  ext4
      (parted) resizepart 2
      警告: パーティション /dev/vda2 は使用中です。それでも実行しますか?
      はい(Y)/Yes/いいえ(N)/No? Y
      終了?  [21.5GB]? 100%
      (parted) p
      モデル: Virtio Block Device (virtblk)
      ディスク /dev/vda: 53.7GB
       :
      番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
       1    1049kB  2097kB  1049kB                          bios_grub
       2    2097kB  53.7GB  53.7GB  ext4
      (parted) quit
      通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。
      
    • ホスト名変更
      $ sudo hostnamectl set-hostname weborca
      
    • ip 固定
      $ sudo vi 01-static.yml
      $ sudo netplan apply
      
    • orca ユーザー作成
      $ sudo useradd orca
      
    • 最新までアップデート
      $ sudo apt update ; sudo apt upgrade -y
      
    • user-dirs.dirs の作成
      $ cat .config/user-dirs.dirs
      XDG_DESKTOP_DIR="$HOME"
      XDG_DOCUMENTS_DIR="$HOME"
      
    • cups のインストール
      $ sudo apt install cups
      $ sudo usermod -aG lpadmin orca
      
    • cupsd.conf の設定
      # Only listen for connections from the local machine.
      #Listen localhost:631
      #Listen /run/cups/cups.sock
      Listen weborca:631
      
      # Restrict access to the server...
      <Location />
        Order allow,deny
        Allow from 192.168.1./24
      </Location>
      
      # Restrict access to the admin pages...
      <Location /admin>
        Order allow,deny
        Allow from 192.168.1./24
      </Location>
      
      # Restrict access to configuration files...
      <Location /admin/conf>
        AuthType Default
        Require user @SYSTEM
        Order allow,deny
        Allow from 192.168.1./24
      </Location>
      
      $ sudo systemctl restart cups.service
      
    • Brother プリンタドライバインストール
      $ sudo apt-get install lib32stdc++6
      $ sudo mkdir /var/spool/lpd
      $ sudo chown lp:lp /var/spool/lpd
      $ sudo mkdir -p /usr/lib/cups/filter
      $ sudo dpkg -i --force-all ./LPRファイル
      $ sudo dpkg -i --force-all ./CUPS 用ファイル
      $ dpkg -l | grep Brother
      
    • web で http://weborca:631 にアクセス
      cupsd.conf で設定したアドレス範囲のプリンタを探して、cups が自動的にプリンタを検出している。implicitclass:// となっているプリンタは、ドライバがないので設定できない。新しいプリンターを socket:// で作る
    • 処方箋用 HL-L5100DN デフォルトオプション: A5, Thin Paper, Resolution 300dpi とする

    weborca インストール

    • インストール手順書に従ってインストール。ただし、プリンタはサーバで設定してあるので、クライアントでは設定不要。
    • データベース移行は、orca でデータベースをダンプ、weborca の /opt/jma/weborca/app/bin/onpre_db_import.sh で読み込む。このスクリプトは、weborca のダンプでも使える。
    • オン資インストール
    • orca api のアドレスが変わったけど、OpenDolphin は、大分前に、どちらでも対応できるようにプログラムしてあった。移行終了して、安定運用が確認できてから、さらに weborca 専用に書き換えた。

    2024年9月 5日 (木)

    メモリリーク?

    iMac の表示が乱れる

    2023年11月から、最新の iMac M3 を診療で使用し始めたのだが、OpenDolphin を使い続けるうちに、ウインドウ内容が表示されなくなる現象が発生した。フレームは表示されるのだが、中身が表示されない。OpenDolphin を再起動すると直るが、しばらく使っていると再発する。その前に使っていた intel iMac では、見たことない現象であった。

    Bug3

    さらに、この現象が起こっている際には、Safari の表示も乱れていることに気付いた。また、メモリ使用量も爆増していたが、それにしてはメモリプレッシャーは低いままで、矛盾している?ように思われた。

    Bug2_20240905135701  Bug4

    メモリ使用量の爆増はメモリリークの可能性がある。しかし、java の中にいる OpenDolphin が、Safari にまで影響を及ぼす可能性は考えにくいので、おそらくネイティブ側の問題かもしれないと考えて、OpenDolphin を時々再起動することで対応していた。その後、OS のアップデートが何回かあったが、この現象は解消されなかった。

    Window#getOwnerlessWindows()

    自前で何とかできないか検討するために、メモリ関連の数値をモニタしてみた。-Xmx は設定していなかったので、iMac のヒープはデフォルト値で、十分余裕がある状態であった。さらに調べていくうちに、Window#getOwnerlessWindows() というメソッドを見つけた。OwnerlessWindows というのは一体、ガベージコレクション (GC) される運命の Window ?なのかもしれない。試しにこの Window の数をモニタしてみたところ、数値がどんどん増えていって、値が 200を越えたくらいで、画面表示が乱れることがわかった。

    Window 関連のリファクタリング

    内部の方で OwnerlessWindows の GC がうまく行っていない可能性を考えて、Window 関連のコードをリファクタリングしてみた。GC にひっかかりやすくなるかと思って、使い終わったら、リスナの除去、dispose、null を代入というのを徹底した。どこが効いたのかよく分からないが、OnwerlessWindows の増加を大幅に減少させることができて、1日再起動しなくても診療終了できるようになった。

    Graph

    «IME on/off の切り替え