v21では,プロセス名が$記号から始まる場合,ローカルプロセスと呼ばれる特殊な振る舞いをする仕組みが廃止されました。これは仕様の変更です。
v12以前のバージョンでは,ローカルおよびグローバルプロセスの間に明確な区別がありました。
ローカルプロセスは、データアクセスを必要としない処理の場合にだけ使用することをお勧めします。例えば、イベント処理メソッドを実行、またはフローティングウィンドウ等のインタフェース要素を制御するためにローカルプロセスを使用します。
名前によってプロセスがローカルであることを指定します。ローカルプロセス名は、先頭にドル記号 ($) を付ける必要があります。
グローバルプロセスには,クライアント側のカレントレコード・命名セレクション・セット・トランザクションをサーバー側のトリガプロセス(「サーバー上で実行」メソッドを実行するプロセス)と同期する仕組みがあります。また,データベースにアクセスすることができます。
4D Server: データアクセスを行わない処理に対し、クライアント側でローカルプロセスを使用すると、サーバの負荷が軽減されます。
当時のドキュメントで言及されているように,プロセスからレコードにアクセスする必要がない場合,グローバルプロセスの代わりにローカルプロセスを起動することで,ネットワーク通信とサーバーリソースの最適化を図ることができました。
ローカルプロセスは,直接データベースにアクセスすることができません。そこでアプリケーションプロセス(プロセス番号1)のデータベースコンテキストを「借りて」サーバーと通信する仕組みが用意されていました。便利な仕組みではありますが,危険なことでもありました。
警告: ローカルプロセスでデータアクセスを行った場合、メインプロセスでアクセスすることになり、そのプロセス内で実行される処理との間でコンフリクトが起きるおそれがあります。
ドキュメントの警告を無視し,アプリケーションプロセスとローカルプロセスの両方からデータベースにアクセスすると,サーバーがクラッシュする恐れがあります。こうした問題を避けるため,v21ではプロセス名が$記号から始まるローカルプロセスの概念そのものが廃止されました。
v13以降,グローバルプロセスは,クライアント側で起動し,初回のレコードアクセスでデータベースコンテキストが作成されるように改良されています。つまり,ローカルプロセスからグローバルプロセスに「昇格」します。言い換えるなら,データベースにアクセスしない限り,グローバルプロセスは従来のローカルプロセスと何も変わりません。誤ってアプリケーションプロセスとローカルプロセスの両方からデータベースにアクセスするリスクを抱えることなく,安全にネットワーク通信とサーバーリソースの最適化を図ることができます。
4Dのフィールドタイプ「UUID」は,GUIとランゲージにおいて文字列のように扱われますが,内部的には128ビット整数であり,データベースエンジンの検索も文字列ではなく整数値に対して実行されます。キャッシュに格納されるのも32文字の16進数(64バイト)ではなく,128ビットの整数(16バイト)です。
UUIDプライマリーキーのインデックス検索は最適化されており,まず,前半の64ビット値に対して検索が実行され,複数のレコードがヒットした場合には,後半の64ビット値に対して絞り込み検索が実行されます。UUIDの特性により,ほとんど場合,前半の検索だけで1件のレコードが特定されるため,UUIDプライマリーキーの検索速度は,実質的に64ビット整数型のプライマリーキーと遜色ありません。
v19r6以降,プロジェクトモードのチーム開発ができるようになりました。開発モードが有効にされている場合,クライアントはネットワークファイル共有システムを介してサーバー側のプロジェクトにアクセスすることになります。
開発モードのクライアントは,常にローカルのプロジェクトフォルダーを最新に保つため,更新されたファイルを特定し,必要に応じてリロードするようになっています。通常,この処理は瞬時に完了します。しかし,サーバーがWindowsの場合,macOSのSMBクライアントで開発モードのパフォーマンスが著しく低下することが観察されています。同じサーバーに接続しているWindowsのSMBクライアントでは問題ありません。パフォーマンスの低下は,メソッド数が300,000程度のプロジェクトで顕著です。
調査により,macOSのAPIから間違った情報が返されるため,大量のリロードが頻繁に発生していることがわかりました。問題を回避するため,macOSでプロジェクトモードのチーム開発をする場合,SMBではなく,NFSのファイル共有を使用することが勧められています。
4Dアプリケーションは,必要時にライセンス情報を更新するため,ライセンスサーバー(autoregistration.4d.com)にアクセスします。また,4Dサーバーアプリケーションは,統計情報を収集するため,週に1回,テレメトリサーバー(dcollector.4d.com)にアクセスします。統計情報の送信は任意ですが,ライセンス情報の更新がブロックされていると支障が生じることがあります。
運用中にライセンス情報を更新することにより,クライアント同時接続数などの追加ライセンスを有効化することができます。また,サブスクリプションであれば,新しいフィーチャーリリース(Rバージョン)が利用できるようになります。有効期限が設けられているライセンスの場合,有効期限の10日前から起動時にライセンスが延長されていないかどうかをチェックします。ライセンス画面の「更新」ボタンをクリックすることにより,あるいはRefresh licenseコマンドを実行することにより,任意のタイミングでライセンスサーバーをチェックすることができます。後者は,ヘッドレスモードで運用している場合,特に有用です。
上記のメカニズムにより,ライセンスサーバーにアクセスができるネットワーク設定であれば,サブスクリプション更新時にライセンスを再入力する必要はありません。
印刷コマンドでPDFまたはXPS形式のドキュメントを出力した場合,プリンターのように印刷ができない領域というものは存在しないため,SET PRINTABLE MARGINに-1(プリンターのマージン)や0(用紙マージン)の指定は無視されます。PDFまたはXPS形式のドキュメントがプリントプレビューとおなじようなレイアウトになることを望むのであれば,用紙およびプリンターを設定した後,GET PRINTABLE MARGINで理論マージンを取得し,SET PRINTABLE MARGINで出力に反映させる必要があります。