FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の16日目

# FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能
[参加したFileMakerワークショップの当日のメモと記憶を手繰って復習してみる](http://qiita.com/or2/items/3cd018e23543e8e24bf1)の続き

2つ目のテーマとしてFMC2Goスケジューラーにおいて、どうスケジュールの自動アップデート機能を実現しているのかを追いかけてみる

当日の発表資料が[すべてのプレイス > International Discussions > 日本語フォーラム > 製品やイベントの告知 > 文書 > 2015/12/09大阪開催 FileMakerワークショップでの資料共有](https://community.filemaker.com/docs/DOC-6653)の[sc自動アップ.pdf](https://community.filemaker.com/servlet/JiveServlet/download/6653-1-65750/sc%E8%87%AA%E5%8B%95%E3%82%A2%E3%83%83%E3%83%97.pdf)で既に共有されているのですが、自分で手を動かさないと身につかないので..

## 「OnOpen」というスクリプトは、なにをしている？
[FMC2Goスケジューラーにおけるレスポンシブ・デザイン](http://qiita.com/or2/items/bf7dbf81716cfebc4560)で追っかけていた「OnOpen」スクリプトを引き続き追っかけてみると

![151216-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/f68f4e5c-6b3a-4c67-dbfe-9a5d1f237f29.png)

なにやら「checkForUpdate」というドンピシャなスクリプトが呼ばれている

その前にあまり見かけない「OnTimer スクリプトをインストール」というスクリプトステップもあるようだ

OnTimer スクリプトをインストール
> 目的 
指定されたスクリプトを指定した間隔で実行します。アクティブなウインドウにタイマーをインストールします。指定された間隔が経過すると、次回そのアプリケーションはアイドルとなり、指定されたスクリプトが実行されます。
構文 
OnTimer スクリプトをインストール[「<スクリプト名>」; 引数:<オプションのスクリプト引数>; 間隔:<数字>]
オプション 
[指定...] をクリックして変数オプションを設定します。
> -[スクリプト指定] は、実行するスクリプトの名前です。
> -[間隔の秒数] はタイマーでスクリプトを実行するまでの秒数です。

120×60秒なので2時間毎に「checkForUpdate」スクリプトが呼ばれるようにスケジュールしているんですね

## 「checkForUpdate」というスクリプトは、なにをしている？
長めのスクリプトなので、いくつかのブロックに分割してみていくことにする

このスクリプトでは、いくつかのグローバルフィールド
- Utility::zgn_last_update：最後に更新成功したときのアップデート番号を保持
- Utility::zgn_update_latest：直近に行ったアップデート番号の確認結果を保持
- Utility::zgt_update_note：？
- Utility::zgt_update_check_url：アップデート番号を取得するurl
- Utility::zgt_update_path：更新用のファイルを取得するurl(固定部分)
- Utility::zgr_update_file：ダウンロードしてきた更新用のファイルを保持

を使っているようだ

### 最初のブロック[アップデート番号を取得する]
![151216-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/a8a9f8a4-11d9-40c6-74cf-260f422b2b28.png)

「Utility::zgn_last_update」に値が入っていなければ0を設定

「Utility::zgt_update_check_url」には
[http://fmdl.filemaker.com/kk/conference/2015/dc2g_update_vers.txt](http://fmdl.filemaker.com/kk/conference/2015/dc2g_update_vers.txt)
が設定されている

「URLから挿入」スクリプトステップを使って「Utility::zgn_last_update」にアップデート番号を取得する

URL から挿入
> 目的 
URL から内容をフィールドに入力します。
構文 
URL から挿入 [選択; ダイアログなし<テーブル::フィールド>; リソース URL]

正しくアップデート番号が取れたかのチェック

```
Let ( [	$last_err = Get( 最終エラー );
	// if there is an error, the file will contain text, not a number
	$text_length = Length(Filter(Lower(Utility::zgn_update_latest) ; "qwertyuiopasdfghjklzxcvbnm<>"))] ;
 	$last_err or $text_length)
```

ここでは

- 最終エラー が0でない
- 「Utility::zgn_update_latest」に"qwertyuiopasdfghjklzxcvbnm<>"のいずれか(=数字以外)が入る

となった時に正しくアップデート番号が取れなかったと判断している
→http://fmdl.filemaker.com/kk/conference/2015/dc2g_update_vers.txt は数字(アップデート番号)のみが書かれている前提となっている

アップデート番号が取れなかった時は

- 「Utility::zgn_update_latest」を「Utility::zgn_last_update」で上書き
→最後に更新成功したときのアップデート番号を設定する

- スクリプト引数に"Manual"が設定されている時は、起動時(もしくはOnTimerで呼ばれた)ではないのでカスタムダイアログでエラーを通知

を行ってスプリクトを終了する

### 次のブロック[アップデート版のファイルを取得する]
![151216-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/c4f8e0ed-0f47-7f32-0065-f57e686fcde8.png)

アップデート番号が取れた時は「Utility::zgn_update_latest」が「Utility::zgn_last_update」より大きい(＝新しいアップデートがある)か確認する

新しいアップデートが無かったとき、スクリプト引数に"Manual"が設定されていたらカスタムダイアログで通知する

ローカル変数「$update_path」：アップデート版のファイルの置き場所(url)

```
Let ( [

	$next_update =  GetAsNumber(Utility::zgn_update_latest);
	$update_note = Utility::zgt_update_note;
	$file_type = ".fmp12"

] ; 

	Utility::zgt_update_path & $next_update & $file_type

)
```

「Utility::zgr_update_file」にアップデート版のファイルを取り込む

ローカル変数「$got_update」：正しくファイルが取得できたか

```
Let ( [

	$last_err = Get( 最終エラー )

] ; 
	// if the file isn't a .fmp12 file
	PatternCount( Utility::zgr_update_file; $file_type ) and not PatternCount( Utility::zgr_update_file; ".html" )
)
```

### 次のブロック[エラーメッセージを生成する]
![151216-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/cbd958b4-9bc0-e6b1-f92f-d00d165153c9.png)

ローカル変数「$err_msg」：エラーメッセージ

```
Case(

	$last_err;
		"エラー #" & $last_err & "¶エラーのため更新情報をダウンロードできませんでした #" & $last_err & ": " & fnDefineErrorCode ( $last_err );

	IsEmpty( Utility::zgr_update_file );
		"ダウンロードに失敗しました¶最新の更新をダウンロードできませんでした。後ほどもう一度試してください。";

	""

)
```

「$err_msg」に値が入った(＝エラー)場合は
- カスタムダイアログでエラーメッセージを表示する
- 「Utility::zgn_update_latest」を「Utility::zgn_last_update」で上書き
→最後に更新成功したときのアップデート番号を設定する

とする

### 最後のブロック[次の処理への橋渡し]
![151216-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/9e5b8d01-76a7-5dd1-f089-e107f9a12a4c.png)

「$err_msg」に値が入らなかった(＝アップデート版のファイルを取得できた)場合は、取り込んだアップデートを反映させる「importUpdate( update_num )」スクリプトを実行する

### 実行前と実行後
このスクリプトで使われているグローバルフィールドが、実行前と実行後でこのように変化した

#### スクリプト実行前
![151216-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/63655994-a548-b0ca-333a-b13fd194db4a.png)

#### スクリプト実行後
![151216-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7e4756fb-55df-57a0-7c36-cf48d867be28.png)

とりあえず今日はここまで