はじめに
システム開発担当の「ほうがん」です。
話題の「翔んで埼玉 〜琵琶湖より愛をこめて〜」観てきました。滋賀県ネタが満載で地元映画館では方々から笑い声が聞こえていました。映画の中では「琵琶湖の水止めたろか」が滋賀県人の京都、大阪などに対する口上ネタで使用されていました。
滋賀県をあまりご存じない方もいらっしゃると思いますので少し補足説明します。日本最大の湖の琵琶湖って流入する川は何本もあるものの、流れ出る川は瀬田川って川1本だけです。(※厳密には宇治発電所取水口と琵琶湖疎水と呼ばれる小型船が通れる人工水道が琵琶湖から京都まで通じています)ですので、実際にこの川をせき止めたら関西圏のかなりの地域で水の供給が出来なくなり大きな影響が出ます。2023/1/13現在、琵琶湖の水位が通常より78cm下がっていまして(水位1cm分は68億リットル!!)、このままでは冗談ではなく水量を絞らざるを得ない状況になっています。関西圏での時間を区切っての断水なんてこともありえるかもです。
最近見始めてくださった方もいらっしゃるかもしれませんので、ハンドルネームで使用しています「ほうがん」について説明しておきます。こちらはSF作家の「James Patrick Hogan」さんから拝借しております。で、久々に「ホーガン」さん小説ネタです。今回取り上げますのが「未来からのホットライン」
そのあらすじです。
“スコットランドの寒村の古城で暮らすノーベル賞物理学者が開発したのは、60秒過去の自分へ、6文字までのメッセージを送るプログラムだった。孫たちとともに実験を続けるうち、彼らは届いたメッセージを60秒経っても送信しないという選択をしたが、何も起こらなかった。だがメッセージは手元にある。では送信者は誰?”
あれ、どこかで見たような設定だと思われるかもしれませんが、おそらくはこちらが元ネタです。
さて、FileMakerネタに戻ります。今回紹介いたしますのが、手元のPCやiOS機器ではなくサーバー側に処理をやってもらう「サーバーサイドスクリプト」のご紹介です。
※USでは「server side scripts(サーバーサイドスクリプト)」と呼ばれていますので、この名称を使用します。
「未来からのホットライン」では過去に対してメッセージを送りますが、こちらはクライアントから、FileMaker ServerやFileMaker Cloudに対して「サーバー側でこの仕事やってくださいね」って感じで処理依頼を行います。
サーバーサイドスクリプトのメリット、デメリット
サーバー側にスクリプト処理を任せることで多くの場合クライアント側で同じスクリプトを実行する場合よりも高速な処理が可能です。
高速化する要因としては、
一般的にサーバー側の機器はクライアント機より高性能であることが多いので同じ処理でも短時間で終了させられる
サーバーとクライアント間のネットワークトラフィックが最小に抑えられる
時間の掛かる処理をサーバー側にまかせてクライアント側ではそのまま別の処理を行える
など
また、PCでは出来るもののFileMaker GOでは使用できない処理(例えばプラグイン使用)をサーバー側で行ってFileMaker GOで結果を受け取るなども出来ますのでFileMaker GOで対応可能な処理の幅が拡がります。
デメリットとしては、依頼した仕事がサーバー側で正常に行われているかどうかが見えにくいので、スクリプトの作成とデバッグがクライアント側のスクリプトを作成する場合よりも難しいです。
ですが、処理速度を稼ぎたい場合、「サーバーサイドスクリプト」を使用する価値は十分あります。
サーバーサイドスクリプト用のスクリプトステップは2つ
「サーバーサイドスクリプト」の使用はFileMakerファイルがFileMaker ServerかFileMaker Cloudで共有されていることが前提です。
クライアント側からサーバー上でスクリプトを実行させるステップは以下の2つ用意されています。
サーバー上のスクリプト実行[指定;一覧から; <サーバー上で実行するスクリプト>; 引数: ; 終了するまで待つ: オン ]
コールバックを使用してサーバー上のスクリプト実行
1. サーバー上のスクリプト実行[指定;一覧から; <サーバー上で実行するスクリプト>; 引数: ; 終了するまで待つ: オン ]
はバージョン13以降で使用できます。サーバー側で実行したいスクリプトを選択、引数で必要な情報を渡してサーバー側で指定したスクリプトを実行する事が出来ます。オプションとして、スクリプトの実行終了を待つか待たないかが設定可能です。
・終了するまで待つが「オン」の場合、「サーバー上でスクリプト実行」が終了するまで、クライアント側での操作は出来ません。
・終了するまで待つが「オフ」の場合、「サーバー上でスクリプト実行」が終了する、終了しないに関係なく、クライアント側では他の操作を行うことが出来ます。
この「終了するまで待つ」のオンオフの選択は、処理が終わってからでないと先に進むべきではない場合と、その必要がない場合など処理内容を考慮して設定を行います。
このサーバー上でスクリプト実行後に依頼を掛けたクライアント側にGet(スクリプトの結果)で元のスクリプトに値を返すことも出来ます。
2. コールバックを使用してサーバー上のスクリプト実行
は最新バージョンFileMaker2023から新しく追加されました。
このスクリプトはサーバー上で実行したいスクリプトにスクリプトと引数で情報を渡してサーバー上でスクリプトを実行する部分までは同じですが、サーバー上で指定したスクリプトが終了した後にクライアント側で実行するスクリプトを指定して引数で値を渡すことが出来ます。
「サーバー上のスクリプト実行」の「終了するまで待つ」の「オン」オプションの設定に比べて良いとこどりでより使いやすいスクリプトステップになっていると個人的には思います。
注意事項
上記の2つのサーバーサイドスクリプトステップを使うにあたっての注意事項。
サーバー側で実行するスクリプトには使用出来るスクリプトステップと使用できないスクリプトステップがあります。スクリプトワークスペースの右上部「互換性」タブで「サーバー」を選択して使用可能なステップのみ使用します。
サーバー側で実行するスクリプトは手元のクライアント側の情報を持たないため、どのレイアウトでどのレコードに対してどういった処理を行うかという情報を引数で渡してあげる必要があります。
クライアント側でのコールバックスクリプトもサーバー側の処理情報を持たないため、どのレイアウトでどのレコード―に対してどういった行うかという情報を引数で渡す必要があります。
サーバーサイドスクリプトを実行する際には毎回ファイルを初めて開く際などに設定している「OnFirstWindowOpen」やウインドウに移動した際の「OnWindowOpen」などのスクリプトトリガが実行されます。ここに「互換性」の無いスクリプトステップ(例;ウインドウの調整、ウインドウの固定スクリプとステップなど)があるとスクリプトエラーが発生します。無効なスクリプトは無視されて実行されるので処理自体は終了しますが、エラーログが毎回書き込まれることになります。サーバーサイドスクリプトを実行する際にはこれらのスクリプトトリガを回避する工夫が必要です。
私の場合、「OnFirstWindowOpen」のスクリプトなどに
If [PatternCount ( Get ( アプリケーションバージョン ) ; "Server" )]
#サーバー上で実行されているので、このスクリプトは先に進ませない
現在のスクリプト終了[テキスト結果:]
End If
#通常のクライアントでの処理
でサーバー上で実行されているかの判定を入れて実行判断させています。
さいごに
「サーバーサイドスクリプト」はスクリプト作成やデバッグに手間がかかるものの、クライアントで時間の掛かるスクリプトのかわりにサーバーサイドスクリプトを使用すると処理を高速化できることが多いです。
また、FileMaker GOでもサーバーサイドスクリプトを使用する事で行えることが拡がります。ぜひ有効活用してみてください。