Macで実行可能なFileMakerコード管理 CodeManager

コマンドやスクリプトなど、コードを管理して実行もできる自作FileMaker書類 CodeManager.fmp12 の利用と仕組みについて。

コード管理と実行の CodeManager.fmp12 というファイルに関する話です。元々以下のようなポストがありました。

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

初心者で雑魚の筆者がターミナルのコマンドやAppleScriptのネタをあちらこちらにメモっていたがFileMakerで一カ所に集めた。コピペでの利用に飽き足らず、FileMaker内のボタン一発で実行できるようにした。という話。

ということでその続き、実際に作ったファイル CodeManager.fmp12 についてです。

ファイルはこちらです。
最近までリンクURLを間違ってました。すいません。修正済みです。


Download CodeManager_v3-2.zip

Mac専用です。あらかじめいくつかのサンプルレコードが入っています。
すでにダウンロードされた方は更新ファイルがあります。
2023-12-22 update

CodeManager 概要

このファイルの目的と機能は、コマンドやスクリプトなどコードをメモっておくことです。もう一つ、書いたコードを実行させます。

コードを実行する主な機能は CodeRunテーブル、CodeRunレイアウトが担当します。

CodeRunの他に、CommandReference というコマンドメモに特化したテーブルとレイアウトも追加しました。

CodeRun

CodeRunでは、メインとなるフィールドに、コードのメモやテンプレ的なものを書き留めます。それが実行できるコードなら、実行できます。

つまりこれは自分用のコマンドライン命令文の覚え書きメモであり、かつ、そのコードを実行させるランチャーでもあります。他のFM書類から使うことも容易で、このファイル、個人的にめちゃ使えます。

コードやメモを書く

CodeTemp と名付けたフィールドにコードやメモを書きます。実行できるコードをそのまま書くもよし、テンプレ的に書くもよしです。

テンプレとパラメータフィールド

テンプレ的に書くとは、パラメータの値がある場合、変数名で仮置きし、実際の値を別フィールドに書くやりかたです。

CodeTempフィールド
CodeTempフィールド

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

パラメータ用パス蘭
パラメータ用フィールド

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

CodeManager2 概要
コードと値を分離することで、使い回せる

仮置きする文言は、パスなら$POSIX1 と $POSIX2 の二個。それ以外は、テキストの $TEXT 4つ と数字の$NUM 4つを用意しています。これは決めたことなので当面は揺るぎません。ルールとなっております。

ルールにしてしまったので揺るぎませんが、内心は揺れています。というのも、テキストと数字を分ける必要はあまりなくて、パラメータ1、パラメータ2 で十分だからです。そうすると、大体経験上4つくらいあれば十分なので、現状は無駄にフィールドが多すぎるということになります。

パラメータの値は履歴テーブルに保存され、変数名ごとにポップアップから再入力することもできます。

 

このファイルを初めて作ったときは、そのパラメータの内容を判断できるように「NAME」「DATE」などと細かく名前を分けていました。今はその目的を別のフィールドが受け持っているのでやや雑なまま残っています。

完成コードを実行する

テンプレ用のフィールド(codeTemp)にコードを書くと、完成コードが所定のフィールド(codeFinal)に自動で作成されます。これを「実行」ボタンで実行します。

実行ボタンに割り当てた「実行するスクリプト」は、スクリプトステップ「AppleScriptを実行」をベースとしたスクリプトです。

結果を受け取る

実行してお仕舞いっていうコードならここまででOKですが、何かを取得するコードというものがあります。もしクリップボードに保存するコマンドが含まれるコードなら、「結果フィールド」に結果をペーストするところまで面倒見ます。

結果フィールド
「結果フィールドにペースト」まで面倒見る

利用する方法

レコードに依存せずにコードを実行することができます。現在表示中のレコードと無関係に、グローバルなID欄(GLB_codeID)に目的のIDを記入することで、そのIDのコードを実行できます。

このやり口は、他のファイルから呼び出して利用するにも都合が良いです。利用する方法は常に以下の手順です。

1「目的のID」を GLB_ID フィールドに入力

2 必要なパラメータを各パラメータフィールドに入力

3 スクリプト「CodeRun」を実行

以上が CodeRunの概要でした。

如何にして完成コードが自動作成されたか、実行スクリプトの具体的な内容、そういう細かい話は後ほど詳しくいきます。

CommandRefernce – コマンドメモ

メインのCodeRun以外にオマケのテーブルがあります。CommandRefernce は、ターミナルのコマンドとそのオプションメモに特化した別口の独立したデータベースです。

CommandReference 画面
CodeManager – CommandReference

コマンドをタイトルに、そのコマンドのオプションをポータルにメモっておくという「マイ簡易コマンドリファレンス」です。

図の例は exiftool で、-s や -g といったオプションをメモっています。中学生の単語ノートみたいなものですね。学んだオプションを書き記し、やがて身になります。初心者に最適。

テストコードも作れますが大した機能じゃないです。

そもそもこうしたメモがCodeManagerの始まりだったはずが、本末転倒して実行マシンに変貌したので、シンプルなメモとして別口で復活したんです。

CodeRun mini – 余所に持って行く

他の書類から CodeManager.fmp12 にアクセスして利用することに問題はありませんが、直接組み込んで使いたいこともあります。フィールドやスクリプトやレイアウトをコピペして他のファイルに持って行くんです。が、問題もあります。

テーブル、フィールド、計算式、スクリプト、カスタム関数、値一覧など相互に関連し依存するのでコピペの順番に応じて、必ずどこかに不整合が生まれます。計算式のどこかが「/* */」とコメントアウトされたり、スクリプトの中で「<見つからないフィールド>」などが発生しますね。これは避けられません。

CodeRun mini は、余計な便利機能を外したシンプルなレイアウトで、不整合の発生をなるべく最小に抑えます。

余所のファイルに組み込むときは以下の手順です。わずかに手間入りです。余所に組み込もうというのは、主に筆者だけが行ってること故、畳んでおきます。興味ある方はご覧ください。

CodeRun を他のFM書類に持って行く手順

1 CodeRun テーブルをコピペ
CodeRunテーブル

2 したらリレーションで「codeRun」と名付け、CodeRunテーブルオカレンスを複製し「codeRun_self」と名付け、codeRun::GLB_codeID と codeRun_self::codeID を繋げます。

3 カスタム関数と値一覧をコピペ

スクリプト「CodeRun」フォルダをコピペ。もし必要なら「全般」もコピペ

4 レイアウト CodeRun mini をコピペ。コピペ後は「CodeRun」という名前に変更しておくと尚よし。

codeRun レイアウトモード

5 各所のチェックと修正

必ずどこかが不整合で「 /* */ 」化しているので丹念に修正します。

  • フィールド設定内の計算式
  • スクリプト内のフィールド指定
  • カスタム関数「paramを置換」
  • レイアウト内の「隠す」やボタンのスクリプト引数

ここだけちょっと面倒ですがコピペの順番によってどうしてもエラー出ます。

エラーの対処・不手際の修正

後にファイルを確認したところ、不手際もあり、修正箇所がいくつもありました。2023/4/20 バージョンで修正された箇所もありますが、念のために記しておきます。

フィールド定義

データベース管理のフィールド定義で /* */ となっていそうなのは以下です。

CodeCalc – 計算式全体が多分コメントアウトされていますので 最初の /* と最後の  */ を削除します

CodeTempFormula – 計算式全体が多分コメントアウトされていますので 最初の /* と最後の  */ を削除します

スクリプト

・フォルダ「CodeRun」をコピペすると、その中の「CodeRun」スクリプトが多分「CodeRun 2」になってしまいます。「CodeRun」に変えてください🙇

・(2023/4/20 バージョンで修正済み)スクリプト「レコードを書き出す core」の44行目付近、使用するレイアウトが「CodeRunFields」になっていますが、その名前のレイアウトを作成するより、使用するレイアウトを「CodeRun」にして頂いたほうが処理が楽です。

・(2023/4/20 バージョンでコメント記入済み)スクリプト「CodeRun 検索用フィールドの検索」では、if の分岐、else if の後に commandReference に関するスクリプトが書かれています。不要ですので、else if 以下を削除するかコメントアウトしといてください 🙇

以上で CodeRun mini セットを他のファイルに組み込めます。

コピペしまくるのもめんどいので、アドオンとして保存して持って行けるかと期待してテストしてみたんですがエラーで出来ませんでした。

手順が面倒で、結局 codeManager.fmp12 そのものを参照して利用することのほうが多いのですが。

 


CodeRun フィールドとプロセス

ここでは仕組みの解説などを行っていきます。まずはフィールドを紹介して、次に工程に沿って詳細を説明します。

CodeRun フィールド

フィールドを説明するとある程度の仕組みも説明できると思います。

基本のフィールド

  • codeID … 自動シリアルNo。このIDを元に動作します
  • CodeTitle … タイトルはあったほうが判りやすい
  • CodeTemp … メモやコードを書くメインのテキストフィールド

CodeTemp がメインのテキストフィールドです。CodeTempの内容がメモの場合は、タイトルに「メモ」か「memo」を含めてください(この原始的な方法でカテゴライズします)

計算結果フィールド

CodeTempの内容を自動的に変換する計算フィールドです。段階を追った後に、最終の codeFinal が作成されます。この codeFinal を「AppleScriptを実行」ステップを使って実行します。

  • CodeCalc … テンプレの変数部分をパラメータの値で置換するだけの計算式フィールド
  • CodeTempDoScript … テンプレを「do shell script」を使った形式に変換する計算フィールド
  • CodeTempFormula … テンプレまたは CodeTempDoscript を、計算式で利用できるテキストに変換する計算フィールド
  • CodeFinal … 最終的に使用する計算フィールド。テンプレまたは CodeTempDoscript いずれかを選択し、変数部分をパラメータの値で置換して仕上げる

「テンプレまたは CodeTempDoscript」とはどういうことかといいますと、テンプレフィールドにはメモを含めて多用な内容が書かれます。その中で実行出来るコードは、生の AppleScript のスクリプトか、またはターミナルで使えるUNIXのスクリプトかいずれかです。

生の AppleScript なら、変数を実際の値に置き換えるだけで実行できます。UNIXのコマンドなら、do shell script を使った特殊な形に一度変換してから、変数を値で置き換えます。

codeRun 入力フィールドと計算結果フィールドの視覚的解説

変換用テンプレート(グローバル)

Do Shell Script を使った変換するとき、変換用のテンプレートを利用します。グローバルフィールドに、あらかじめテンプレートを記入済みです。

  • Template_DoScript … ターミナルを使った do script のテンプレート。未使用。
  • Template_DoShellScript … do shell script のテンプレート。採用。

以前はターミナルを用いた do script のテンプレートを利用していました。今は使ってないですが参考用にテンプレート内容を残しています。

Template "do shell script"

テンプレートはこの簡単な一行です。

do shell script "$COMMAND"

パラメータフィールド(グローバル)

CodeTemp にパラメータの値が含まれるコードを書くとき、値をマイ変数で仮置きしておいて、実際の値を別のパラメータフィールドに書きます。

マイ変数とパラメータフィールドはガッツリ1対1で定められています。

  • param_POSIX1 … $POSIX1を置き換える
  • param_POSIX2 … $POSIX2を置き換える
  • param_TEXT1 … $TEXT1を置き換える
  • param_TEXT2 … $TEXT2を置き換える
  • param_TEXT3 … $TEXT3を置き換える
  • param_TEXT4 … $TEXT4を置き換える
  • param_NUM1 … $NUM1を置き換える
  • param_NUM2 … $NUM2を置き換える
  • param_NUM3 … $NUM3を置き換える
  • param_NUM4 … $NUM4を置き換える
  • param_OPTION … $OPTIONを置き換える

先にも書いたとおり、ほんというとTEXT1とかNUM1とか、やや無意味に多すぎます。わざわざ消すのも面倒なので残してありますが(今のところ)

OPTION は少し特別で、コマンドのオプションを変数にしておくような使い方に向いています。ですが実際には細かいオプション違いをパラメータとしてではなくレコードとして作成したほうが利用には便利だったりします。

変数と対を成すparam_XX フィールドの配置
変数と対を成すparam_XX フィールドの配置

これらパラメータフィールドはすべてグローバルフィールドです。

実行用リレーションのためのグローバルなフィールド

CodeRun を「コード実行マシン」として使うための、いくつかのグローバルなフィールドがあります。表示中のレコードと無関係に目的のコードを特定するための仕掛けです。

  • GLB_codeID … 目的のcodeIDを入れる入れ物
  • GLB_GetFinal … GLB_IDに従って完成形コードを転記する入れ物
  • GLB_結果フィールド … 何らかの結果を得るコードでは基本クリップボードに格納します。その結果をペーストして置いておく入れ物

分類のフィールド

レコードを分類するフィールドがいくつかあります。分類しておくことでフィルタして探しやすくなります。それだけではなく、分類に応じて計算式フィールドを決定しますからとても重要です。

  • category … 自動カテゴリー付けを行う(CodeFinalの条件に使用する)。手動による上書きに対処するため、Category_overwrite というフィールドも用意
  • tags … タグ付けしておくと後々フィルターするときに便利。入力・表示用の tagsDisp フィールドとセット。
  • commands … 使用したコマンドをタグのように付けておくのも便利。入力・表示用のcommandDisp とセット。

categoryは、自動分類です。想定している主なカテゴリー項目は以下です。

  • memoタイトル に「メモ」か「memo」があれば、それはメモだから何もしない
  • DoScriptCodeTemp に「do script 」の文字列を発見すれば、DoScriptカテゴリーをセット。CodeCalc(パラメータを置換しただけの完成形) が CodeFinal に転記される
  • AppleScript AppleScript独特の文字列を発見すればAppleScriptとカテゴリーセット。CodeCalc(パラメータを置換しただけの素直な完成形) が CodeFinal に転記される
  • CommandUNIXコマンド独自の文字列を発見するか、上記に当てはまらない場合に Command カテゴリーをセット。CodeDoScript(do shell script を使用した AppleScript ) が CodeFinal に転記される

この分類の値によって、codeFinal の計算が決定されます。DoScript と AppleScript なら codeFinal へ直行、Command なら、途中に do shell script の変換を挟んでから codeFinal に送られます。

さっきの図ですが、CodeTemp から最初の分岐を決定するのが category の役割になります。

プロセス

CodeRun コードを実行する工程

すでにフィールドの説明で大方済んでいますが、おさらいを兼ねつつ工程をベースにしての解説を加えます。

CodeFinal のプロセス

メインの CodeTemp に書かれた内容に応じてカテゴリーが決まります。最初にカテゴリーに基づいて分岐します。

実行できる内容なら、完成形コードが CodeFinal フィールドに作られます。

道中にいるのが CodeDoScript ですが、これは カテゴリーが command(UNIXのスクリプト) なら do shell script の形に整形します。

コードの中に変数があれば、最後に実際の値と置換しています。

 

CodeDoScript では、変換するためのテンプレートを用いて変換の計算を行っています。

変換テンプレート
変換テンプレート

上段はターミナルを呼び出して作業させるやりかた、下段はターミナルをすっ飛ばすやりかたです。下段の、DoShellScript のテンプレートを現在採用しています。

コードを実行するプロセス

さてコードをメモったり記入したりというのは、これは「レコードの編集」という作業です。せっせと入力して自分メモを溜めていくことも目的の一つ、そしてこのファイルには編集が済んだものを「実行する」という別の目的があります。

編集済みのコードを実行するとき、表示中のレコードに捕らわれません。どのレコードを表示中であっても関係なく狙ったレコードを実行できる仕組みです。そのためのちょっとした仕掛けがあります。

「CodeRun_self」という名の複製テーブルオカレンスを用意して、IDと GLB_ID のリレーションをしています。

GLB_codeID に目的の codeID をぶっ込めば、そのIDの最終実行コード(codeFinal)が GLB_GetFinal に転記・表示されます。 それを実行します。

GLB_codeID に入力
実行用の入力欄

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

工程の流れ 概念図
GLB_codeID 入力により、GLB_GetFinal に CodeFinalが転記される

グローバルな GLB_codeID とパラメータの値を入力指定するだけというかんたん操作でコードの実行ができます。

これは、他のFileMaker書類からアクセスして使用するときにも効果を発揮します。スクリプトで「目的のIDを検索してアクティブにして・・」とか面倒な手順もいりません。

 


ファイルはこちらです。


Download CodeManager_v3.zip

Mac専用です。あらかじめいくつかのサンプルレコードが入っています。
すでにダウンロードされた方は更新ファイルがあります。
2023-05-12 update

 


次はコマンドラインを do shell script に変換する計算式の詳細です。が、一旦ポストを分けます。

 

続きはこちらから

使い方・マニュアルはこちら

CodeManager 使い方

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください