Skip to content

v2.0.0

Latest

Choose a tag to compare

@yuka-oguri yuka-oguri released this 27 Oct 02:48

Halu v2.0.0 リリースノート

v2.0.0 は約 16 か月分の変更をまとめた大型リリースです。新規に Halu を導入する方は「概要」「動作環境」「新機能」を、v1.0 系を評価したことがある方は「v1.0 系との互換性」も読んでください。

概要

  • フロントエンド基盤の刷新: jQuery 3.7.1 と Bootstrap 5.3.0 に更新し、使われていなかった同梱ライブラリを撤去しました。テーマは Bootstrap 5 の CSS 変数を上書きする方式に変わりました。
  • 画面部品の新方式: 画面項目を halu-ds-id と halu-ds-field 属性で特定する方式、Svelte で作られた共通コンポーネント(ヘッダー・フッター・各種ダイアログ)、選択ダイアログの iframe 分離方式を導入しました。
  • サーバー側の堅牢化: ファイル配信・アップロード・ダウンロードの経路をアプリ配下に限定し、SQL 実行エラーや帳票生成の失敗が握りつぶされていた問題を解消しました。フックから安全に SQL 文字列を組み立てるための共通部品を追加しました。
  • 実行環境の明文化: Python 3.11、Starlette 1.6、PostgreSQL 16 を requirements.txt と本書で定義しました。AlmaLinux 9 向けの自動インストーラを同梱しています。
  • Sample アプリと設計文書の初版公開: 受注管理を題材にした Sample アプリケーション(18 画面・15 テーブル)と、要件定義書からテスト仕様書までの設計文書一式を、納品物の形式の見本として今回初めて公開します。
  • ライセンスと配布物の整備: MIT License を明記し、同梱サードパーティの一覧を追加しました。配布 zip は動作に必要なファイルだけを含める方式に改めました。

動作環境

項目 v2.0.0 備考
Python 3.11 v1.0.1 では動作環境を定義していませんでした。3.12 以降では現在動作しません(「既知の問題と制約」参照)
Python パッケージ requirements.txt のとおり(uvicorn 0.52.4、Starlette 1.6.0、SQLAlchemy 1.4.29、psycopg2 2.9.6、openpyxl、msgpack-rpc-python ほか) Starlette 1.x 対応のため起動処理を lifespan 方式に変更済み
PostgreSQL 16 系 自動インストーラは 16.9 をソースからビルドします。認証は scram-sha-256
LibreOffice 日本語フォントを含む版 PDF 帳票を使う場合に必須。requirements.txt では管理していません
Node.js 22 系 Svelte コンポーネントを再ビルドするときだけ必要
サーバー OS Windows 10 以降 / AlmaLinux 9(自動インストール対応)
ブラウザ jQuery 3.7.1 と Bootstrap 5.3.0 が動作するモダンブラウザ
タイムゾーン Asia/Tokyo を OS または環境変数で設定 未設定だと監査列とログの時刻が 9 時間ずれます

起動は 4 つのサーバー(Web・App・Print・Batch)を順に立ち上げます。Web サーバーは uvicorn halu:app、アプリ・帳票・バッチの各サーバーは python appserver.py などの Python スクリプトで起動します。手順と URL は README を参照してください。

v1.0 系との互換性

v1.0 系で作成したアプリケーションは、v2.0.0 のフレームワークではそのまま動作しません。主な非互換は次のとおりです。移行が必要になった場合は個別にご相談ください。

  • 全画面の index.html の書き換えが必要です(jQuery 3.7.1 と Bootstrap 5.3.0 への差し替え、テーマ CSS の構成変更、テーマ先読みスクリプトと Svelte コンポーネントの読込追加)。Bootstrap 4 の記法と jQuery プラグイン API は使えません。
  • メッセージ系ダイアログは Svelte コンポーネントになり、旧ダイアログの要素 ID に依存した CSS・JavaScript は無効です。選択画面のパターンミックスインはイベント名が Dialog サフィックス付きに変わりました。
  • アプリ配下にコピーするパターンミックスイン 9 本は、Sample の最新版へ差し替える必要があります。
  • テーマ設定の DB 値は halu-custom_{テーマ名} 形式に変換が必要です。
  • 静的配信・ダウンロード・アップロードの経路はアプリ配下の Html/・Json/・DownLoad/・UpLoad/ に限定されました。
  • SQL 実行エラー、フックのエラー、帳票生成の失敗が握りつぶされなくなったため、v1.0 系で潜在していたエラーが表面化します。
  • haluconf.py は DB 接続情報が環境変数優先の形になり、Linux の既定パスが変わりました。動作環境は Python 3.11・PostgreSQL 16 です。

新機能

  • 選択画面のダイアログ表示: appspec の選択画面設定に dialogid と dialogstyle を足すと、画面遷移ではなくモーダルで選択画面を開けます。
  • 選択ダイアログの iframe 分離方式: さらに dialogtype: "iframe" を指定すると、ダイアログ画面を独立した document として表示します。呼び出し元画面は再ロードされず、閉じたときにキー操作の設定と戻り値の受け取りが自動で行われます。新規実装ではこの方式を標準とします。
  • Svelte コンポーネント機構: <div componentID="Header" props-Title="..."> のようなカスタムタグで、ヘッダー・フッター・ロゴ・ログイン情報などの共通部品を配置できます。フレームワーク共通部品とアプリ独自部品の 2 つのエントリポイントに分かれています。
  • halu-ds-id/halu-ds-field 属性: 画面項目を id・name・class の三重指定なしで特定できます。appspec では firstFocusItem に ["field", "項目名"] 形式、selectorEvent に属性セレクタが使えます。従来の指定方法も引き続き動作します。
  • テーマの追加: dark と navy を同梱しました。テーマは Bootstrap 5 の CSS 変数を上書きする 1 ファイルで定義でき、追加も容易です。
  • SQL リテラルのエスケープ部品: フックで検索条件などを SQL 文字列に埋め込むときは commons.sqlescape.escapeSqlLiteral() を使います。全角クォート変換を経由した SQL インジェクションを防ぎます。
  • Linux 自動インストーラ: 対話形式で環境ファイルを作り、Python 3.11・PostgreSQL 16・LibreOffice の導入から Sample DB のリストアまでを行います。
  • ライセンス表記: LICENSE(MIT License)と THIRD_PARTY_NOTICES.md(同梱サードパーティの一覧)を追加しました。
  • 配布物の整備: 配布 zip には動作に必要なファイルだけを含めます(requirements.txt と Sample の入出力フォルダを含み、開発用ファイルと起動用シェルは含みません)。

改善と挙動の変更

後方互換はありますが、動きが変わる点です。

  • 同じセレクタとイベント名の組み合わせで eventInfo を複数登録すると、後から登録した 1 本だけが有効になります(ダイアログを 2 回以上開いたときのイベント二重発火を防ぐため)。
  • halu-ds-field と name の両方が付いていて値が違う場合は halu-ds-field が優先されます。
  • 選択肢の表示処理で、セレクタ名が一致しなくてもデータセット名が一致すれば処理されます。
  • テーマ CSS の追加読込は、同じテーマが既に読み込まれていれば何もしません。テーマ CSS を修正したときは halu-custom_default.css の ?var= を更新してください。
  • 帳票テンプレートは「横 1 ページに収める」設定を既定とし、明細行で文字の縮小(shrinkToFit)を使わない規約にしました。Linux 環境で PDF 出力を確認してください。
  • 複数ページ帳票の改ページ計算で、テンプレート設定値を数値として扱うようになりました(設定ファイル側は文字列表記のままで構いません)。
  • 応答に message が含まれない場合は通信エラーとして扱い、読み込み表示が残らなくなりました。
  • 一覧の再描画時に、前回選択した行のハイライトが残らなくなりました。
  • sql.json の自由記述 SQL には "crud": {"テーブル名": "CRUD文字列"} を併記する規約を追加しました。動作には影響せず、仕様書の自動生成で使います。
  • ソース内の修正コメントは「日付+Issue 番号+理由」の書式に統一し、個人名を含めないようにしました。

不具合の修正

  • 複数ページの帳票で、2 ページ目以降が出力できないことがありました。
  • 帳票の生成に失敗しても画面にエラーが表示されず、読み込み表示が消えないままになっていました。
  • ヘッダーからログアウトしても、ログオフのアクセスログが記録されていませんでした。
  • テーマを設定していても、画面表示のたびに既定の配色が約 1 秒間表示されていました。
  • SQL の実行エラーが握りつぶされ、失敗した更新が確定していました。エラーが起きてもバッチや帳票が起動していました。
  • 静的ファイルの配信、ダウンロード、アップロードの各経路で、アプリ配下の外にあるファイルへアクセスできました(「セキュリティ」参照)。
  • 検索条件フックの SQL 組み立てで、特定の入力により SQL インジェクションが成立していました(「セキュリティ」参照)。

Sample アプリケーション(初版公開)

Sample は Halu の実装リファレンスであると同時に、Halu で開発したシステムの納品物(設計文書一式)の形式の見本です。v2.0.0 で初めて設計文書を含めて公開するため、本節では変更点ではなく構成を紹介します。

  • 題材: 受注管理。顧客・商品のマスタ管理、受注ヘッダと受注明細の照会・登録、受注 CSV の取込とエラー確認、受注一覧の PDF 帳票、バッチ処理の管理、ユーザとテーマの設定で構成します。
  • 画面(18): ログイン、メニュー(一般ユーザ用・管理者用)、ユーザ一覧・ユーザ詳細、顧客一覧登録、商品一覧登録、受注一覧・受注明細一覧、受注データアップロード・取込エラー一覧、バッチ一覧・バッチ分割一覧、システム用テーマ設定・個人用テーマ設定、顧客選択ダイアログ・商品選択ダイアログ、エラー(404)。Halu の標準画面タイプ(一覧、単票、一覧登録、アップロード、選択ダイアログ、メニュー)を一通り含みます。
  • 帳票とバッチ: 受注一覧表(ヘッダー/ヘッダー+明細)を Excel テンプレートから PDF で出力します。CSV 取込は起動画面からバッチとして実行し、結果をバッチ一覧と取込エラー一覧で確認します。
  • データベース: 15 テーブル(ユーザ、顧客、商品、受注ヘッダ、受注明細、受注CSV、受注CSVエラー、テーマ、ログ情報、バッチ系)。デモデータ入りのバックアップ sample.backup を同梱し、自動インストーラがリストアします。パスワードは SHA256 ハッシュで保存し、照会結果には含めません。
  • 設計文書(Sample/docs/): 要件定義書、データモデル設計書(ER 図・テーブル定義)、基本設計書(共通仕様と画面別)、テスト仕様書(画面・帳票・バッチ)、リバース仕様書(機能一覧・CRUD 表・テーブル定義書の機械生成)。設計文書は AI が作成し人間が承認する開発プロセスで作られており、その形式の実例として公開します。
  • テーマ: default・dark・navy の 3 種を同梱します。
  • 作業用ツール(Sample/Workshop/): 画面フォルダを複製して名前を付け替えるスクリプトを同梱します。新しい画面を Sample の画面から起こすときに使います。

セキュリティ

次の問題を修正しました。v1.0 系を利用中の場合は更新を推奨します。

  • ファイル配信・ダウンロード・アップロードの各経路で、アプリ配下の外にあるファイルの取得や書き込みができました。パスを実体解決して基準ディレクトリ配下に限定し、外れた要求は 404 または 400 で拒否します。
  • フックが検索条件を SQL 文字列に埋め込む処理で SQL インジェクションが成立していました。Sample を修正し、共通のエスケープ部品を同梱しました。自アプリのフックにも同じ部品を適用してください。
  • jQuery 3.4.1 と Starlette 0.46 系の既知の脆弱性を、バージョン更新で解消しました。
  • Sample はパスワードを SHA256 ハッシュで保存し、照会結果に含めません。

既知の制約: Halu のサーバー側 API には、現時点で認証・認可のガードがありません。ログイン状態はブラウザ側で保持しており、サーバーはそれを検証しません。信頼できるネットワーク内での利用、またはリバースプロキシ側で認証をかける構成を前提としてください。サーバー側のセッション機構は今後のバージョンで検討します。

削除された同梱ライブラリと使用非推奨の資産

次のライブラリは削除されました。参照している画面は <script>・<link> を外し、機能を再実装するか廃止してください。

削除したもの 代替
jQuery 3.4.1、Bootstrap 4.4.1、Bootstrap 4 世代のテーマ CSS 一式 jQuery 3.7.1、Bootstrap 5.3.0、halu-custom_*.css
jQuery UI 1.8.23 と ui-lightness テーマ jQuery UI 1.12.1(同梱を継続)
ACE エディタ、jqPlot、flot、jCanvas、jQuery SVG、math.js、underscore、less 無し
bootstrap-datetimepicker、magicsuggest、jquery-multiple-select、dropkick、treeview 無し(日付入力は <input type="date"> を推奨)
tablefix、fixedTableHeader、scrolltable、scrollup、portamento、scrollableTools、jdragdrop 無し
jquery.upload(旧アップローダ) dm-uploader(同梱を継続)
device.js、pgwbrowser、base64、bootstrapFormValidation、datepicker-ja、PIE.htc 無し
LaTeX 帳票の実験データ(pdf/ 配下) 無し。帳票は openpyxl と LibreOffice で生成
検索条件クリアの typename: "multipleselect" ライブラリ削除により動作しません。別方式へ移行してください

同梱していますが使用を推奨しない資産: uilayout・print・halutabbedpanel・haluwebsocket の各 JavaScript、サーバー側の Rmenu 系ルート・WebSocket スタブ・HaluLogin スタブ・mail.py・templateclass.py・IPA フォント。次のバージョン以降で退役を予定しています。

既知の問題と制約

次のバージョンで修正を予定している不具合です。

  • 一覧登録パターンで、実行後の表の再描画時に明細 2 行目の入力値が別の行の値で上書きされることがあります(Chromium 系ブラウザ)。
  • 入力欄からフォーカスを外したときの金額などの書式化(format 指定)が効きません。
  • 実行応答を画面に反映している途中で導出(derive)処理が動くため、行数が減る実行では明細をまたぐ集計値が誤ることがあります。
  • バッチ起動時のパラメータに数値を渡すとエラーになります。Sample ではバッチ分割一覧の再処理が起動できません。
  • バッチサーバーが停止していても、画面には「バッチ処理を起動しました。」と表示されます。
  • バッチの連鎖起動(次のバッチを続けて起動する設定)は、引数の不一致により動作しません。
  • 同じ名前の帳票 PDF を続けて出力すると、変換が終わる前に前回の PDF が返ることがあります。
  • Sample の顧客一覧登録・商品一覧登録では、監査列の登録ユーザ/更新ユーザにユーザ名称が記録されます(他の画面はユーザID)。

現時点の制約です。

  • ダウンロード API の削除パラメータは未実装で、DownLoad 配下の生成物は自動では消えません。定期的に削除してください。
  • 帳票処理の一部で、対象 0 件のときの例外処理が不十分な箇所が残っています。
  • 画面名(モード付きタイトル)に半角スペースを含めることはできません。
  • 自動インストーラは Halu 本体のサービス登録(systemd)と Web サーバーのポート設定を行いません。インストール後に手動で設定してください。
  • ログレベルの既定値は DEBUG です。本番環境では haluconf.py で変更してください。
  • requirements.txt の pandas と bcrypt は現在のコードでは使用していません。次のバージョンで取り除く予定です。
  • サーバー間通信に使用している msgpack-rpc-python は上流の保守が停止しており、Python 3.12 以降では読み込みに失敗します。Python 3.11 での動作は確認済みです。代替方式を検討しています。

ライセンス

Halu は MIT License で提供します(Copyright (c) 2025-2026 TILLS & Co.)。同梱するサードパーティのライセンスは THIRD_PARTY_NOTICES.md を参照してください。