コマンドやスクリプトなど、コードを管理して実行もできる自作FileMaker書類 CodeManager.fmp12 の利用と仕組みについて。
コード管理と実行の CodeManager.fmp12 というファイルに関する話です。元々以下のようなポストがありました。
初心者で雑魚の筆者がターミナルのコマンドやAppleScriptのネタをあちらこちらにメモっていたがFileMakerで一カ所に集めた。コピペでの利用に飽き足らず、FileMaker内のボタン一発で実行できるようにした。という話。
2 Macで実行可能なFileMakerコード管理 CodeManager v2(このページ)
その作ったファイルの具体的な説明。
ファイルはこちらです。
Mac専用です。
あらかじめいくつかのサンプルレコードが入っています。
はじめに、管理>セキュリティ の拡張アクセス権で、AppleEventのところにチェックがあるか確認。
このページ内の見出し
CodeManager 概要
このファイルの目的と機能は、コマンドやスクリプトなどコードをメモっておくことです。もう一つ、書いたコードを実行させます。
この主な機能を担当するのは CodeRunテーブル、CodeRunレイアウトです。
CodeRunの他に、CommandReference というコマンドメモに特化したテーブルとレイアウトも追加しました。
また、他のファイルメーカーファイルにCodeRunの組み込みたいときにコピペしやすい CodeRun mini なんかも追加しています。
CodeRun
メインの CodeRun です。メインのフィールドに、コードのメモやテンプレ的なものを書き留めます。それが実行できるコードなら、実行できます。
つまりこれは自分用のコマンドライン命令文の覚え書きであり、他のシステムと組み合わせることでコード実行アプリになるという二つの機能を併せ持つFM書類で、めちゃ使えます。

コードやメモを書く
CodeTemp と名付けたフィールドにコードやメモを書きます。実行出来るコードをそのまま書くもよし、テンプレ的に書くもよしです。
テンプレ的コードとパラメータフィールド
テンプレ的に書くとは、パラメータの値がある場合、パラメータ部分を変数名で仮置きし、実際の値を別フィールドに書くやりかたです。

例えば、パスが入る箇所にパスを書かず「$POSIX」と仮置きし、具体的なパスは別のフィールドに書きます。

都度、パス部分を書き換えることで汎用的に使えます。

仮置きする文言は、パスなら$POSIX1、何かの名前なら$NAME1など、10個くらい決まったものを用意しています。これは決めたことなので揺るぎません。ルールとなっております。

パラメータの値は履歴テーブルに保存され、変数名ごとにポップアップから再入力することもできます。
仮置きマイ変数は、実のところPOSIXだけが重要で他は単に履歴用の目安です。
完成コードを実行する
コードを書くと完成コードが所定のフィールドに自動で作成されます。これを「実行」ボタンで実行します。
実行ボタンに割り当てた「実行するスクリプト」は、スクリプトステップ「AppleScriptを実行」をベースとしたスクリプトです。
結果を受け取る
実行してお仕舞いっていうコードならここまででOKですが、何かを取得するコードというものがあります。もしクリップボードに保存するコマンドが含まれるコードなら、「結果フィールド」に結果をペーストするところまで面倒見ます。

利用する方法
レコードに依存せずにコードを実行することができます。現在表示中のレコードと無関係に、グローバルなID欄(GLB_codeID)に目的のIDを記入することで、そのIDのコードを実行できます。他のファイルから呼び出して利用するにも都合が良いです。
パラメータのフィールドもすべてグローバルフィールドなので、CodeRunに作ったデータを利用する方法は常に以下の手順です。
1「目的のID」を GLB_ID フィールドに入力
2 「必要なパラメータ」を各パラメータフィールドに入力
3 スクリプト「CodeRun」を実行
以上が CodeRunの概要でした。
如何にして完成コードが自動作成されたか、実行スクリプトの具体的な内容、そういう細かい話は後ほど詳しくいきます。
CommandRefernce – コマンドメモ
メインのCodeRun以外にオマケのテーブルがあります。CommandRefernce は、ターミナルのコマンドとそのオプションメモに特化した別口の独立したデータベースです。

コマンドをタイトルに、そのコマンドのオプションをポータルにメモっておくという「マイ簡易コマンドリファレンス」です。
図の例は exiftool で、-s や -g といったオプションをメモっています。中学生の単語ノートみたいなものですね。学んだオプションを書き記し、やがて身になります。初心者に最適。
テストコードも作れますが大した機能じゃないです。
そもそもこうしたメモがCodeManagerの始まりだったはずが、本末転倒して実行マシンに変貌したので、シンプルなメモとして別口で復活したんです。
CodeRun mini – 余所に持って行く
CodeRunの仕組みそのものを他のファイルメーカー書類に組み込んで使うことが増えました。フィールドやスクリプトやレイアウトをコピペして他のファイルに持って行くんです。が、問題がありました。
相互に関連し依存するフィールドやスクリプトが多すぎて、仕組みをインポートするのがとても厄介だと気づいたんです。それもあってファイルを全面的に作り直しました。
CodeRun mini は、余計な便利機能を外したシンプルなレイアウトで、コピペで他に持って行きやすい作りになってます。
余所のファイルに組み込むときは以下の手順です。わずかに手間入りです。余所に組み込もうというのは、主に筆者だけが行ってること故、畳んでおきます。興味ある方はご覧ください。
2 ペしたらリレーションでCodeRunテーブルオカレンスを複製、このように設定します。フィールド定義で利用しているので名前もこの通りにしないと不都合出ます。

フィールド定義の GLB_ の一部の計算式を修正します。計算のベースを self にしておく必要があります。
ここだけちょっと面倒ですがテーブルコピペのあとリレーションを設定するのでしょうがないんです。

あとは、
3 CodeRun mini レイアウトをコピペ
4 値一覧から4つをコピペ
5 スクリプトのCodeRunフォルダをコピペ
6 カスタム関数「paramを置換」をコピペ。
7 忘れずに変換テンプレートの内容もコピペします。

これで CodeRun mini セットを他のファイルに組み込めます。
コピペしまくるのもめんどいので、アドオンとして保存して持って行けるかと期待してテストしてみたんですがエラーで出来ませんでした。
余所に組み込むために、今後さらに単純化を進めたいななんて思っています。余所ではタグとかいらんしね。
CodeRun フィールドとプロセス
ここでは仕組みの解説などを行っていきます。まずはフィールドをさらっと紹介して、次に工程に沿って詳細を説明します。
CodeRun フィールド
フィールドを説明するとある程度の仕組みも説明できると思います。

基本のフィールド
- codeID … 自動シリアルNo。このIDを元に動作します。
- CodeTitle … タイトルはあったほうが判りやすい
- CodeTemp … メモやコードを書くメインのテキストフィールド
CodeTempがメインのテキストフィールドです。CodeTempの内容がメモの場合は、タイトルに「メモ」か「memo」を含めてください(この原始的な方法でカテゴライズします)
実行コードを生成する計算式フィールド
CodeTempの内容を実行できる形に変換する計算フィールドです。二つの計算フィールドがあり、どちらかが採用され三つ目のフィールドに転記されます。
- CodeCalc … 仮置きの変数をパラメータの値で置換するだけの計算式フィールド
- CodeDoScript … 変換テンプレートを使って do shell script 変換を行う計算式のフィールド
- CodeFinal … 上記二つのいずれかを採用して転記、最終使用するフィールド
変換用テンプレート(グローバル)
Do Shell Script を使った変換するとき、変換用のテンプレートを利用します。グローバルフィールドに、あらかじめテンプレートを記入済みです。
- Template_DoScript … ターミナルを使った do script のテンプレート。未使用。
- Template_DoShellScript … do shell script のテンプレート。採用。
以前はターミナルを用いた do script のテンプレートを利用していました。今は使ってないですが参考用にテンプレート内容を残しています。
パラメータフィールド(グローバル)
CodeTemp にパラメータの値が含まれるコードを書くとき、値をマイ変数で仮置きしておいて、実際の値を別途パラメータフィールドに書きます。こうすることでコードがテンプレ的なものとなり使い回せます。
マイ変数とパラメータフィールドはガッツリ1対1で定められています。
- param_POSIX1 … $POSIX1を置き換える
- param_POSIX2 … $POSIX2を置き換える
- param_NAME1 … $NAME1を置き換える
- param_NAME2 … $NAME2を置き換える
- param_TIMESTAMP1 … $TIMESTAMP1を置き換える
- param_TIMESTAMP2 … $TIMESTAMP2を置き換える
- param_TIME1 … $TIME1を置き換える
- param_TIME2 … $TIME2を置き換える
- param_EMAIL … $EMAILを置き換える
- param_URL … $URLを置き換える
- param_CREATOR … $CREATORを置き換える
- param_COPYRIGHT … $COPYRIGHTを置き換える
これらパラメータフィールドはすべてグローバルフィールドです。余所から入力することも容易いです。
実行用リレーションとグローバルなフィールド
CodeRun を「コード実行マシン」として使うため、いくつかのグローバルなフィールドがあります。表示中のレコードと無関係に目的のコードを特定するための仕掛けです。
- GLB_codeID … 目的のcodeIDを入れる入れ物
- GLB_GetFinal … GLB_IDに従って完成形コードを転記する入れ物
- GLB_結果フィールド … 何らかの結果を得るコードでは基本クリップボードに格納します。その結果をペーストして置いておく入れ物
分類のフィールド
レコードを分類するフィールドがいくつかあります。分類しておくことでフィルタして探しやすくなります。それだけではなく、分類に応じて計算式を変更したりしますから割と重要です。
- category … 自動カテゴリー付けを行う(CodeFinalの条件に使用する)。手動による上書きに対処するため、Category_overwrite というフィールドも用意
- tags … タグ付けしておくと後々フィルターするときに便利。入力・表示用の tagsDisp フィールドとセット。
- commands … 使用したコマンドをタグのように付けておくのも便利。入力・表示用のcommandDisp とセット。
categoryは、CodeTempまたはCodeTitleの内容に応じて自動で分類します。想定しているカテゴリー項目は以下です。
- memo … タイトル に「メモ」か「memo」があれば、それはメモだから何もしない
- DoScript … CodeTemp に「do script 」の文字列を発見すれば、DoScriptカテゴリーをセット。CodeCalc(パラメータを置換しただけの完成形) が CodeFinal に転記される
- AppleScript … AppleScript独特の文字列を発見すればAppleScriptとカテゴリーセット。CodeCalc(パラメータを置換しただけの素直な完成形) が CodeFinal に転記される
- Command … UNIXコマンド独自の文字列を発見するか、上記に当てはまらない場合に Command カテゴリーをセット。CodeDoScript(do shell script を使用した AppleScript ) が CodeFinal に転記される
- HTML … javascriptやPHP関連のメモなどありますので個人的にカテゴリーに含めていますが、何もしないという意味で memo と同じなのでオマケ的に
タグなど分類のフィールドを取り扱うことについて、別ポストで詳細の説明があります。
ということでフィールドをいくつか説明しました。
CodeRun コードを実行する工程
すでにフィールドの説明で大方済んでいますが、おさらいを兼ねつつ工程をベースにしての解説を加えます。
CodeFinal のプロセス
メインの CodeTemp に書かれた内容に応じて、実行できる完成形コードがフィールドに作られ、それを実行するという工程になります。
完成形コードのフィールドは二つあります。CodeCalc と CodeDoScript です。
単純に変数を値で置き換える計算式のフィールドが CodeCalc 、do shell script に変換する計算フィールドが CodeDoScript です。

どちらかふさわしいほうが CodeFinal に転記されます。
ふさわしいかどうかはカテゴリー(書かれたコードの中身)で判断します。元々AppleScriptの書式で書かれていれば変数を値に置き換えるだけの CodeCalc で良いわけです。UNIXのコマンドラインが書かれていれば変換が必要なので CodeDoScript の出番です。
CodeDoScript では、変換するためのテンプレートを用いて変換の計算を行っています。

下段の、DoShellScript のテンプレートを現在採用しています。上段はターミナルを呼び出して作業させるやりかた、下段はターミナルをすっ飛ばすやりかたです。
コードを実行するプロセス
さてコードをメモったり記入したりというのは、これは「レコードの編集」という作業です。せっせと入力して自分メモを溜めていくことも目的の一つ、そしてこのファイルには編集が済んだものを「実行する」という別の目的があります。
編集済みのコードを実行するとき、表示中のレコードに捕らわれません。どのレコードを表示中であっても関係なく狙ったレコードを実行できる仕組みです。そのためのちょっとした仕掛けがあります。
「CodeRun_self」という名の複製テーブルオカレンスを用意して、IDと GLB_ID のリレーションをしています。

GLB_codeID はグローバルなIDの入れ物です。ここに目的の codeID をぶっ込めば、そのIDの最終実行コード(codeFinal)が GLB_GetFinal に転記・表示されます。 それを実行します。


コードを実行させることに、表示中のレコードが関与しません。

グローバルな GLB_codeID とパラメータの値を入力指定するだけというかんたん操作でコードの実行ができます。
これは、他のFileMaker書類からアクセスして使用するときにも効果を発揮します。スクリプトで「目的のIDを検索してアクティブにして・・」とか面倒な手順もいりません。
ファイルをダウンロードできます。
次はコマンドラインを do shell script に変換する計算式の詳細です。が、一旦ポストを分けます。
つづく…
続きはこちらから