FileMakerメディア管理 実作編 Ver.3 日付の情報

コマンドツールを便利に使う余計な仕組み

本来、必要なコードを必要に応じて実行させるスクリプトを書けばいいだけです。ですがその必要なコードを試行錯誤で取っ替え引っ替えやっていたので、いちいち書くのが面倒で、何らかの仕組みが必要でした。

ここでは、コードをゲットするための便利で余計な機能を追加したのでそのお話です。

コードのテンプレートをメモるテーブル

FileMakerを使ってコードのメモ&実行のマイコードリファレンス兼発射装置データベースを作ったという話をしたことがあります。

Macで実行もできるFileMakerコード管理

Macで実行もできるFileMakerコード管理 その2

コードをメモっておき、それを実行させる仕組みを組み込めば、日付ゲットに限らず今後あらゆるコマンドラインの命令を実行させるときに同じ仕組みを使い回せて便利ではなかろうか、と、Ver.3の内部に専用テーブルを設けて、コードのテンプレデータベースを作ることにしました。

テンプレートと整形

仕組みは単純です。まずCodeTempという専用のテーブルをひとつこしらえました。このテーブルにコードなりスクリプトなりのテンプレートを書いて保存しておきます。そんで、タイトルも付けましょう。

CodeTempに保存するテンプレートは実践的なテンプレです。コードのオプションも事細かに指定した「そのまま使える奴」です。ただし変数があります。多くの場合ファイルパスあるいはフォルダパスでしょう。MacだとPOSIXです。パスが来るべきところに、例えば $POSIX というような明確な代理文字を入れておきます。

コードを使うべき場所からコードテンプレを呼び出して、$POSIX をレコードごとのパスに置き換えてコードを完成させ実行します。

CodeTemp テーブル

もう少し詳しく説明します。

CodeTempテーブルには、テンプレートとタイトルのフィールドがあります。メモ的にコードを溜めていけるカード型コードデータベースのテーブルです。

簡易コード管理

CodeTempを使用する際にもうひとつ必要なテーブルがあります。グローバルなフィールドを多く収めたシステムテーブルです。Systemテーブルはすでにありますね。

Systemテーブルに仮のフィールドみたいな何でもいい仮の入れ物を用意します。もう一つ、GetCodeと名付けた計算フィールドも作りました。こちらには CodeTemp::CodeTemplate これを仕込みます。リレーションが成立したらCodeTempのCodeTemplateをそっくり転記するだけという計算です。

Systemテーブルとリレーション

codeTempテーブルとSystemテーブルをリレーションします。codeのTitle仮のフィールドを繋げましょう。

これで何が起きるかというと、グローバルフィールドでどこからでも使える「仮のフィールド」にCodeTempと合致するタイトルを入力すれば、たちどころにグローバルフィールド「GetCode」にCodeTempのコードが転記されます。このコードを整形して、どんなレイアウトからも自在に実行させるスクリプトを作れるという案配です。

Systemのグローバルフィールドを介したのには理由があります。こうしておかないと、コードを使う可能性があるすべてのテーブルオカレンスにCodeTempをリレーションしなければならないからです。テーブルオカレンス命名の件ひとつとっても、それが極めて面倒で使えないシステムになるのか想像つきますでしょうか。グローバルで済ませるのが最良です。

コードをゲットする実際のスクリプト

スクリプトの流れはこうですね。

  1. 仮のフィールドにCodeのタイトルを入れる
  2. GetCodeを整形して実行する
  3. 結果がクリップボードに入るのでフィールドにペースト
  4. フィールドから必要なデータを取り出して利用する

流れはシンプルですがスクリプトはちょっとだけややこしくなっております。

1 仮のフィールドにCodeのタイトルを入れる

スクリプトステップ「フィールドを設定」で仮のフィールドにタイトルを入れるとリレーションによってコードがGetCodeフィールドに転記されます。転記されるのにタイムラグがあるようなら、確定をいれるか僅かな一時停止を挟みます。

2 GetCodeを整形して実行する

GetCodeの変数$POSIXをレコードのPOSIXに置換します。

フィールド設定 [ System::GetCode; Substitute ( System::GetCode ; "$POSIX" ; MediaDB::filePOSIX ) ]

「AppleScriptを実行」でGetCodeを実行させます。実行する間の時間を考慮して僅かな時間一時停止を挟みます。

3 結果がクリップボードに入るのでフィールドにペースト

結果を仮のフィールドにペーストします。

これにかかる時間も特定できないので、ループを使って待ちます。つまりこうします。

  1. 仮のフィールドには現在、Codeのタイトルが入っていますのでこれを変数$仮のフィールドに保存します。
  2. ループを回し、Exit Loop if (system:: 仮のフィールド ≠ $仮のフィールド ) をセットして、スクリプト一時停止[間隔: 0.5]を挟みつつ「貼り付け[system::仮のフィールド]を実行させ続けます。

仮のフィールドは$仮のフィールドと同じですね。ペーストされるとイコールではなくなりますからループを終えます。

ペースト待ちのループ処理は、ビデオサムネイルの撮影でも使いました。処理待ちが計れないときによく利用します。

汎用的なゲットコードからペーストまでの流れは以上です。最後はペーストしたデータの利用です。これは使う時々の目的に準じます。

4 フィールドから必要なデータを取り出して利用する

日付ゲットのコードですが、単品の場合はAppleScriptのget を利用しました。これで返ってくる日付の書式が、多分OSの設定に応じたものになっています。私の場合なら 2021年7月30日 月曜日 みたいな形です。このままでは使い物にならないので整形します。

整形の計算式はカスタム関数「AS時間書式を整形」として保存しています。

Let ( [
 ts0 = ASDate ;
 ts = Substitute ( ts0 ; [ " 月曜日" ; "" ] ; [ " 火曜日" ; "" ] ; [ " 水曜日" ; "" ] ; [ " 木曜日" ; "" ] ; [ " 金曜日" ; "" ] ; [ " 土曜日" ; "" ] ; [ " 日曜日" ; "" ] ) ;
 ts1 = Substitute ( ts ; [ "年" ; "/" ] ; [ "月" ; "/" ] ; [ "日" ; "" ] ) ;
 ts2 = GetAsTimestamp ( ts1 ) 
] ; ts2 )

細かく修正しつつ最後はタイムスタンプの形式にて出力しています。こんな感じなんですけど、これは返ってくる書式が環境によって異なるかもしれないので、各々が工夫をしなければならないでしょう。

整形できたので、ファイル作成日、ファイル変更日のフィールドにそれぞれ転記します。これにて完了。

ちなみに、コマンド stat を使った日付ゲットではUNIXタイムスタンプでゲットしています。変に整形された書式より扱いが楽です。

UNIXタイムスタンプをFileMakerのタイムスタンプに変換する計算式はこうです。UNIXとFileMakerでは時間の起点が違うのだそうで、こういう計算式になるんですって。

unix_timestamp + Timestamp ( Date ( 1 ; 1 ; 1970 ) ; Time ( 0 ; 0 ; 0 ) ) + 60*60*9

 

以上、CodeTempからコードを持ってきて整形して実行して結果をペーストして整形して振り分けるという流れでした。

このように、コードを呼び出して実行させる簡単便利な機能をメディア管理DBの内部に構築できました。

この仕組みはとても便利で、最初に書いたとおり今後あらゆるAppleScriptやターミナルコマンドの使用時に使い回せます。System::仮のフィールドにコードのタイトルをいれてテンプレをゲット、整形して実行。これだけです。
V3ではオマケとして「Finderで表示」ボタンなんかも簡単に用意できました。

Penguin icon

日付ゲットのコードは取得した、それを実行しやすい仕組みも手に入れた、次は日付ゲットによってメディアの読み込みがどう構築されたかです。

FileMaker Pro

Download FM_MediaDB_Ver3_5.zip

作って育てる実作編 Ver.3 ご自由に

 

FMでメディア管理 実作編 Ver.3 日付の情報
次のページ: 挿入・インポート