19r2では4D.Blob
オブジェクトが使用できるようになり,19r3ではORDAでBLOBフィールドが使用できるようになりました。この機会にクラシックコードをORDAで書き換えることを検討しているかもしれません。大量のBLOBフィールドをORDAで扱うのであれば,クライアント側キャッシュのサイズに気を配ると良いでしょう。
ローレベルのREST APIはデフォルトで100
件のエンティティを返しますが,クライアント/サーバー版のORDAリクエスト毎にフェッチされるエンティティは80
件に設定されています。すべての属性(フィールド)がリクエストされるわけではなく,必要に応じてリクエストされる属性やリレーション属性がコンテキストに追加されてゆきます。サーバから取得したエンティティは,30000
件/テーブル毎を限度として再利用されます。これがクライアント側ORDAキャッシュです。
entitySelection.refresh()@18r3のドキュメントに説明されているように,クライアント/サーバー版のORDAには30
秒間保持されるクライアント側キャッシュが存在します。これはサーバー側で10
分間保持されるローレベルのエンティティセットのキャッシュとは別のものです。また,ストラクチャ/プロジェクトのクライアント側キャッシュとも違います。
クライアント/サーバー版のORDAでBLOB属性にアクセスした場合,最高で30000
件/テーブル毎のBLOBがクライアント側にキャッシュされる可能性があります。プロセスのメモリ占有量が問題になるようであれば,setRemoteCacheSettings()@19r5でキャッシュされるエンティティ数を抑えたり,setRemoteContextInfo()@19r5でコンテキストの設定を調整することができます。
クラスターBツリーインデックスは,内部的にエンティティセレクションで管理されています。リレーション属性をプロジェクションするなどして,クラスターインデックスを使用した場合,クラスターインデックスが作成したエンティティセレクションは,クエリで作成した通常のエンティティセレクションが解放された後もキャッシュに残されますが,これはメモリーリークではありません。FLUSH CACHE(*)
でキャッシュからパージすることができます。
19r5では,Webエリアの仕様が変更され,ファイルURLのドラッグ&ドロップが自動的に処理されないようになりました。たとえばPDFファイルをWebエリアにドロップした場合,自動的にファイルが開かれるのではなく,代わりにOn Window Opening Deniedフォームイベントが発生します。ドロップされたURLパスを検証し,必要に応じてファイルを処理することができます。なお,WA OPEN URL
コマンドは,これまでどおりファイルURLを開くことができます。
Webサーバーのスケーラブルセッションを有効にした場合,下記のWebオプションは無視され,同時Webプロセス数の上限がなくなります。
Web inactive process timeout
Web max concurrent processes
Web inactive session timeout
Webサービス(SOAP)はセッション管理の対象外です。スケーラブルセッションの設定は,Webサービス(SOAP)に適用されず,「セッションなし」の最大同時Webプロセス数が適用されます。これは仕様です。
バイナリモードのクライアント/サーバーアプリケーションは,必要に応じてサーバーからメソッドのコードを受信し,ローカルキャッシュに保存するようになっています。このため,キャッシュされていないメソッドを実行しようとすると,サーバーとの通信が発生します。対照的に,プロジェクトモードでは,すべてのリソースを1回のリクエストで受信するため,メソッド実行時に通信が発生することはありません。これは仕様です。
Compile project
コマンドを使用すれば,デザインモードを操作することなく,自動的にカレントプロジェクトをコンパイルすることができます。たとえば,ソースコードをGitリポジトリにコミットするたびにクラウド上で自動的にプロジェクトがコンパイルされるよう,GitHub Actionをセットアップすることができます。GitHubは最新のmacOSおよびXcodeを提供しているので,Apple Siliconターゲットもサポートできます。
ブログ記事: https://blog.4d.com/how-to-automate-the-compilation/
ワークフローの例: https://github.com/4D-JP/librezept/blob/main/.github/workflows/compile.yml
パラメーターを渡すことにより,外部プロジェクトをコンパイルすることもできます。外部プロジェクトをコンパイルする場合,プラグインやコンポーネントはロードされないことに留意してください。コンパイル対象のプロジェクトがプラグインやコンポーネントに依存している場合,それらのモジュールはコマンドを実行するプロジェクトにロードされている必要があります。これは仕様です。
macOSとWindowsには,システム標準の圧縮ツールが用意されており,ファイルやフォルダーを右クリックして手軽にアーカイブすることができます。作成されるのは.zip
形式のファイルです。一方のプラットフォームで作成したアーカイブは,通常,他方のプラットフォームでも展開することができますが,プロジェクトをアーカイブする場合は注意が必要です。
.zip
形式のアーカイブには,UTF-8エンコーディングでファイルやフォルダーのUnicodeパスが書き込まれます。MacとWindowsでは,圧縮ツールが使用するUnicodeの正規化方式が違います。MacはNFC,WindowsはNFKDです。たとえば「ä」という文字をMacで圧縮した場合,C3 A4
にエンコードされ,Windowsで展開すると61 CC 88
にデコードされます。つまり,Macでは文字とアクセント記号(日本語の濁点・半濁点を含む)を合成した文字が優先的に使用されますが,Windowsでは文字とアクセント記号を分解した文字列が優先的に使用されるということです。
Windowsのファイルシステムは,NFCとNFKDのファイルパスを区別し,実質的に同名のファイルを作成することができるようになっています。4Dのプロジェクトモードは,メソッドやフォームをNFCパスからロードするため,NFKDにパスが変換されてしまった場合,フォームやメソッドがみつからないことになります。
MacからWindowsに.zip
形式でファイルを移動する場合,システム標準の圧縮ツールは使用しないでください。代わりに7-ZipやWinRARを使用することができます。
追記: ビルド278080
以降,v19をmacOS 10.14.6で起動できるようになりました。今後,Mojaveは互換対応(compatible)となります。仕様上は対応しているものの,開発部で毎回の検証はしていないということです。実機による検証は,Catalina, Bug Sur, Montereyの3世代が対象となります。Bug Sur以降はIntelとApple Siliconアーキテクチャが存在するので,現在5種類のMacがサポートされています。
v19の技術的な最低プラットフォームはmacOS 10.14.4です(v19.0リリース当時と同じ)。macOS 10.13.6でv19のビルド278080
以降を起動した場合,起動時にアプリケーションがプラットフォームに対応していないという警告が表示されます。以下のブログ記事は調整前の実情を反映しています。
Mac版のv19.2および19r4の対応システムバージョンは「macOS 10.15.7 (Catalina)」以降となります。初期のv19ロングタイムサポート(LTS)バージョンおよびフィーチャーリリースは,macOS 10.14 Mojaveにも対応していましたので,仕様が変更されたことになります。
19r3のシステム要件は10.15.6(リリース当時の最新版Catalina)でしたが,サポート外のMojaveでも起動することができました。19r4をMojaveで起動することはできません。
4Dは,OpenSSLライブラリを使用しています。セキュリティ対策のため,当該ライブラリは定期的にアップデートすることが求められています。v18.5, 19.1, 19r3のOpenSSLバージョンは,1.1.1l
でした。19.2, 19r4では,1.1.1n
にアップデートされました。このバージョンは,macOS 10.15.7以上でなければ動作しません。結果的に4Dの最低システムバージョンも引き上げられることになりました。
注記: OpenSSLのバージョンは,Get database parameter
のセレクター94
(OpenSSL version) で確認することができます。OpenSSLを使用するのは,Webサーバーだけではありませんが,WEB Get server info
もバージョン情報を返します。
OpenSSLのバージョンが使用できないシステムで初期のv19.2および19r4を起動しようとすると,アプリケーションがクラッシュするかもしれません。クラッシュログには,OpenSSLがロードできないためのクラッシュである,というメッセージが記録されます。
DYLD, [0x1] Library missing
dyld: launch, loading dependent libraries
Dyld Error Message:
Library not loaded: @executable_path/../Frameworks/libssl.1.1.dylib
Referenced from: /Volumes/VOLUME/*/4D.app/Contents/MacOS/4D
Reason: no suitable image found. Did find:
4D.app/Contents/MacOS/../Frameworks/libssl.1.1.dylib: cannot load 'libssl.1.1.dylib' (load command 0x80000034 is unknown)
4D/4D.app/Contents/MacOS/../Frameworks/libssl.1.1.dylib: stat() failed with errno=1
4D/4D.app/Contents/MacOS/../Frameworks/libssl.1.1.dylib: cannot load 'libssl.1.1.dylib' (load command 0x80000034 is unknown)
4D/4D.app/Contents/MacOS/../Frameworks/libssl.1.1.dylib: stat() failed with errno=1
v19.2 (277563) および19r4 (277561) 以降,最初にバージョンチェックが実行され,プラットフォームが対応していない場合には警告ダイアログが表示されるようになりました。