このタイトルが既にヒントかもしれませんが、ワクワクするような新しい機能が4D v18で告知されました!
この機能はクライアント/サーバーの動作に新しい可能性を開くものです。カレントのデータベースに限定するのではなく、永続的なネットワーク接続を必要とするのもなく、4D v18のアプリケーションは4D Server上に公開された、別の、リモートの、4Dデータベースからデータを入手できます!
この機能のおかげで多くのオプションが可能になりました。例えば、オフラインで動き、リモートデータにアクセス可能な時にだけローカルデータを同期するアプリケーションを構成することができます。あるいは、複数のサーバーにデータを公開し、必要に応じて切り替えることも考えられます。別のオプションとしては、異なるデータベース(例:ローカルデータ、インターナショナルデータ)上にデータモデルを分割しすることも可能です。別の場所にデータを配信して一つの4Dクライアント・コード(プロジェクト・メソッドとフォームオブジェクト)を通じてアクセスできるようにするのはいかがでしょう?これらすべてのシナリオは実現可能で、このブログでその方法を説明します。
4D v18を使えば、他の4Dクライアントに対して、RESTサーバーとして公開できます。これは、4Dクライアントが公開したデータと相互通信(作成、読み込み、更新、削除)できることを意味します。さらに良いことに:この通信はORDAコンセプトをベースにしているので、完全にオブジェクト指向なのです!
データベース中のウェブ設定は:
設定タブで、HTTPポートを設定します。(セキュリティーのため、プロダクションモードではHTTPSを使うことを確認します!)
RESTリソース・タブ上で、「RESTサーバーとして公開」オプションを選択します。
注意:Webサーバーを使ってRESTサーバーへアクセスするには、Webサーバー・ライセンスは必要ありません。接続には標準の4Dクライアント・ライセンスが使われます。
前述のように、あなたのデータベースはORDAコンセプト経由で接続可能になります:データベースはdatastoreオブジェクトを使って操作されます。従って、最初のステップは、アクセスしたいリモートデータベースに関連したdatastoreオブジェクトを得ることです。問題ありません!Open datastoreコマンドで正確なホスト名を呼び出せば動きます。
datastoreオブジェクトをローカルID “students”に関連付けます。これでORDAを使ってリモートデータベースと作業(クエリーの起動、エンティティのロード/更新など)が出るようになります。
C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT($dataClass)
//The database contains a Students data class
$dataClass;="Students"
$connectTo:=New object("hostname";"school.acme.com")
$schoolDS:=Open datastore($connectTo;"students") //local id of this remote datastore is "students"
//Start working with ORDA means
ALERT("They are "+String($schoolDS[$dataClass].all().length)+" students")
//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("lastname=:1";"Smith").first()
If ($s#Null)
ALERT("Student "+$s.lastname+" lives in "+$s.address.city)
End if
Open datastoreドキュメントをチェックして、安全な接続(TLS)でリモートデータベースにアクセスする方法を参照してください。
以下は、複数のリモートデータベースで動作させるのがいかに簡単かを説明した短い例です。二つのデータベースがあります:一つはフランス人の生徒が含まれていて、もう一つにはイギリス人の生徒が含まれています。
フランス人の生徒を見るか、イギリス人の生徒を見るか選択できます。
フォームメソッド:
Case of
:(FORM Event.code=On Load)
Form.frenchServer:="french.acme.com"
Form.englishServer:="english.acme.com"
End case
「フランス人の生徒を見る」ボタンの背後にあるオブジェクトメソッドです:
C_OBJECT($connectTo;$students)
$connectTo:=New object()
$connectTo.hostname:=Form.frenchServer
$students:=Open datastore($connectTo;"french") //datastore containing French students
Form.students:=$students.Students.all()
「イギリス人の生徒を見る」ボタンの背後にあるオブジェクトメソッドです:
C_OBJECT($connectTo;$students)
$connectTo:=New object()
$connectTo.hostname:=Form.englishServer
$students:=Open datastore($connectTo;"english") //datastore containing English students
Form.students:=$students.Students.all()
Open datastoreコマンドを最初に呼び出した時は、データストアオブジェクトはメモリーにロードされ、セッションはサーバーで開かれます。その後の呼び出しでは、このデータストアオブジェクトの参照を返すだけです。
公開したデータベースを安全に保つために、アクセスにフィルターをかけることができます。Open datastoreコマンドを別の面で見てみましょう。以下のようにユーザーとパスワードを渡すことができます。
C_OBJECT($connectTo;$myStudents)
ON ERR CALL("manageErrors")
$connectTo:=New object()
$connectTo.hostname:="students.acme.com"
$connectTo.user:="mary@4d.com"
$connectTo.password:=Form.password
//local id of this remote datastore is "students"
$myStudents:=Open datastore($connectTo;"students")
ON ERR CALL("")
</code>
4Dは二つの方法で権限のあるユーザーのアクセスを制限できます。
4Dユーザーグループを使ってアクセスを制限できます。データベースを公開した時に、Web設定ページのRESTリソース・タブでアクセスを許可するグループを選択します。
もしもOpen datastoreコマンドで与えられたユーザーが、選択されたグループに属している場合、アクセスは受け入れられますが、そうでない場合は承認エラーが生成されます。
また、新しいOn REST authenticationデータベース・メソッドを使って、公開したデータベースへの独自のアクセスコントロールをコード化することもできます。このメソッドは、Open datastoreコマンド中のユーザーの資格を受け取ります。もしユーザーがリモートデータベースでの作業を許されている場合はシンプルにTrueを返します。
下記はサンプルです:
C_TEXT($1;$name;$2;$password)
C_BOOLEAN($0;$result;$3;$digest)
C_OBJECT($user)
$name:=$1 // The user to provide in Open datastore command
$password:=$2 // The password to provide in Open datastore command
$digest:=$3 // True if password is hashed
$result:=False
//Search for the user in our Users dataclass
$user:=ds.Users.query("name=:1";$name).first()
If ($user#Null)
// Passwords are hashed in Users dataclass
If ($digest & ($user.password=$password))
$result:=True
End if
$0:=$result
注意:dsとdatastore.getInfo()コマンドは更新されて、新たに三つのメソッドが追加されました:datastore.startTransaction()、datastore.cancelTransaction()、datastore.validateTransaction()です。
では、HDI(例題)をダウンロードしてこの素晴らしい機能を学びましょう!
他の人とコラボレーションしながら作業するのは理想的な方法です。世界中のどこにいても、他の場所のチーム仲間と働くことができ、誰でもファイルやプロジェクトの最新バージョンを難なく見つけられます。全ファイルのバックアップを実行する代わりに、ロールバック元のリストア・ポイントを選択できるようにしながら、新しい機能をテストして、もしそれらが機能しなければロールバックする別の方法。そんな夢が現実になりつつあります。上記のシナリオは4D v18とプロジェクト・データベースによって可能となっています。
プロジェクト・データベースとはテキストベースのファイル中の4Dデータベースです。これらのファイルには、フォーム、メニュー、ユーザー設定と必要なリソース全てが含めた、データベース・ストラクチャからユーザーインターフェイスに至るまで、4Dデータベース・アプリケーションのソースコード全てが含まれます。
プロジェクト・データベースは4D Developerアプリケーションを使って作成、取り扱いをします。プロジェクト・ファイルはその後、最終的なアプリケーションの運用ファイルを構築するために使用されます。
このリストは表面的なものですが、これらの利点は全てプロジェクトデータベースのおかげです。
プロジェクト・データベースがもたらす全ての新しい機能と可能性は今後のブログで詳しく述べていきます。お楽しみに!
4D開発者として、グラフィカル・ユーザー・インターフェイス(GUI)を使わないアプリケーション、別名ヘッドレス・アプリケーション、を開発する必要に直面した経験をすでにお持ちでしょう。以前の4Dでは考えられませんでしたが・・・それも4D v18までです!このブログ記事では、新しく可能になった機能を使ってアプリケーションを”ヘッドレス”にする方法を説明します!
なぜヘッドレス・アプリケーションを作成するのでしょうか。今回はいくつかの使用例を挙げています。macOSでWindowsの動きをシミュレートする、あるいはサービス・マネージャーを使わずにWindowsのサービスの動きを実行するなどです。しかし、これら以上に、4Dでボットを開発するような新しい機会も開かれています。
4Dをヘッドレス・モードで起動するには、新しい”headless”パラメータとCLI(コマンド・ライン・インターフェイス)を使います。これは全てのアプリケーション・タイプで有効です:4D、4D Server、スタンドアロン、リモート、マージしたアプリケーション。下記の例では、現在のディレクトリが実行可能なディレクトリになります。
macOSサンプル(ターミナルがバンドルの”Contents/MacOS”フォルダーにある場合):
./4D\ Server --headless MyDatabase.4DLink
./"4D Server" --headless MyDatabase.4DLink
./4D --headless MyDatabase.4DLink
./MyBuiltRemoteApp --headless
Windowsサンプル:
"4D Server.exe" --headless MyDatabase.4DLink
4D.exe --headless MyDatabase.4DLink
MyBuiltRemoteApp.exe --headless
Get application infoコマンドによって返されたオブジェクトに新しい”ヘッドレス”属性を追加しました。それによってインターフェイスの有無によらず、実行モードに依存したコードを書くほうがとても簡単となりました。
注意: Windowsシステム上のサービスモードでアプリケーションが動いたとき、それは自動的にヘッドレス・アプリケーションとして実行されます。サービスを止めることで、4Dを正確な方法で終了します(例えば、macOSアクティビティ・モニターで”終了”アクションを使うように)。
おそらく疑問に思うことでしょう、「オーケー、それは嬉しい。が、ダイアログが表示されたとしたらどうなるのだろう?」と。ランタイム時に何が起こっているのかをずっと知らせるために、4Dは自動的に診断ログをヘッドレス・モードで起動します。このログは、かつて[{applicationName}.HDLS]タグを使って表示され、ログに取られた全てのユーザーインターフェイスをキャッチします。
一般的な動作では、4Dは何かを表示しようとするコマンドをキャッチして、コマンド名とコールチェーン一緒に警告イベントをログに取り、アクションをキャンセルします。稀に特別なケースもあります:
例えば、Windowsのサービスとして起動したサーバー上で実行されたALERTコマンドは、サーバーの実行を止めることはもはやできません。4Dは自動的にコマンドをキャッチし、ダイアグノスティック・ログ中に警告行を書き込みます。次のように:
11 2019-07-11 18:53:52 [myTestDatabase Server.HDLS] WARN – (Alert: Test alert label)[{“type”:”projectMethod”,”name”:”myTestAlert”,”line”:2,”database”:”myTestDatabase”}]
このシステムはヘッドレス・アプリケーションで何が起こっているかを見るために作られていて、(必要であれば)コードを改良するためでもあります。
新しいセレクター、Into system standard outputs
、をLOG EVENTコマンドに追加し、テキストをstdoutとstderr標準ストリームへ送ることができます。ご存知のように、LOG EVENTコマンドにはオプションの”importance”パラメータがあります。そのため、イベントの重要性によって、コマンドはテキストをInformation message
とWarning message
に対してstdoutストリームで、Error message
に対してstderrストリームで送ります。
stdoutへテキストを送る:
LOG EVENT(Info system standard outputs;"This is a text for stdout";Information message)
stderrへテキストを送る:
LOG EVENT(Info system standard outputs;"This is a text for stderr";Error message)
そしてまた、4Dとアプリケーションによって生成された情報を検索するために、stdoutとstderr標準ストリームに対してリダイレクションを使うこともできます。デフォルトでは、これらのストリームはシステムの設定によって、一般的にコンソールに直接向かい、稀にスクリーンに向かいます。例えば、以下のコマンドラインを使って、標準ストリームをファイルにリダイレクトできます。
macOS:
./4D --headless MyDatabase.4DLink 1>stdout.txt 2>stderr.txt
Windows:
4D --headless MyDatabase.4DLink 1>stdout.txt 2>stderr.txt
ストリームのリダイレクションの組み合わせのリマインダー:
注意:macOSシステムでopenコマンドを使って4Dパッケージを起動することはでき、ストリームは4Dアプリケーションではなくこのコマンドで生成されます!
これらの新しい利点によって、システムの必要な使用条件に適合し、またボットのような新しい機会を作成することもできます。これをあなたのソフトウェア工場の継続的な統合(CI)や継続的なテスト(CT)工程に組み込むかはあなた次第です。あなたのイマジネーションだけが唯一の制限なのです!
Idle connections timeout
は,DB4DおよびSQLサーバーに対するアクセス(デフォルトのTCPポート番号は19814
)のタイムアウトを設定するためのデータベースパラメーターです。新ネットワークレイヤーでは,アプリケーションサーバーのタイムアウトも同時に設定する役目を担っています。このパラメーターは,クライアント側だけで有効です。サーバー側でIdle connections timeout
を変更しても,動作には影響しません。これは仕様です。クライアント側で設定を変更しない限り,サーバー接続はデフォルト値の20
秒が経過した後,延期(一時停止)状態になります。
注記:データベース設定のクライアント/サーバー接続タイムアウト(データベースパラメーターの4D Server timeout
および4D Remote mode timeout
)でアプリケーションサーバーのタイムアウトを設定することができました。新ネットワークレイヤーでは,サーバー側のタイムアウトだけが設定できます。