AppleScriptで複数のFTP差分同期を自動化(Transmit)

いろいろ調べたので忘れないように自分用の備忘録。いやーん、わたし、きれい? それは美貌。これは備忘録。

Webサイトの更新には普段は統合開発環境の「Coda2」を使ってる。でも、差分同期したいときは「Transmit」というFTPソフトを使ってる。Transmit は Mac 用の FTP ソフトとしては老舗の部類で、わたしはたぶん20年以上前から使ってると思う。

Transmit は、FTP ソフトの基本であるファイルのアップロード、ダウンロードだけでなく、ローカルフォルダとリモートフォルダの差分同期をする機能もある。この差分同期機能が結構便利。しかもローカルとリモートのセットを「お気に入り」に登録しておけば、さらに簡単になる。

  1. お気に入りから同期したい設定をダブルクリック
  2. ローカルとリモートに接続したら [同期] ボタンをクリック
  3. 同期設定(孤立ファイルの扱いや、ローカルとリモートの差分判断基準など)を確認して問題なければ [実行] ボタンをクリック
  4. 同期が実行される

これを繰り返していけばいい。

繰り返していけばいいんだけど、更新作業するサイトの数が多いと、ひとつの更新作業が終わったら次の更新作業・・・と全部更新作業が終わるまで Mac から離れられない。ひとつひとつの同期作業は1、2分で終わるんだが、これが10カ所のサイトを更新するとなると1、2分おきにポチポチポチポチっと更新実行ボタンをクリックしなきゃならない。間隔が短いからその間に別の仕事はできない。決まりきったボタンをポチポチポチポチ・・・・とてつもなく生産性の低い仕事だ。仕事とすら言えない。これはなんとかせねば。

Mac には AppleScript というプログラム言語が用意されていて、これを使うと Mac での単純作業的な操作を自動化できる。たとえば「特定のフォルダに画像ファイルを保存すると自動的に画像の縦横サイズを所定の大きさに変更して、あらかじめ決めてあるファイル名に変更して、所定のフォルダへ保存する」みたいな画像リサイズの自動化とか。まあいろいろできるのよ。

んで、Transmit はさすが老舗の Mac 専用 FTP ソフトだけあって、AppleScript でさまざまな操作を実行できるように作られている AppleScript 対応ソフトなのだ。

AppleScript で Mac の操作をプログラミングするのに Automator という便利なソフトが付属している。これは子ども用プログラミングソフトで有名な「スクラッチ」とよく似たソフトで、AppleScript の各種命令のブロックを画面で並べていくことで自動処理のプログラムができあがるというすぐれもの。

ということで Automator で Transmit の差分同期作業をポチポチっとプログラムして完成・・・・・・というのが6、7年前の話。なーんだ、昔からやってたんだ。ところがWebサイトの構成が大きくなってきて同期作業にちょっと時間がかかることがでてきた。実は Automator は(というか AppleScript は)、命令を出して2分間応答がないと問題が発生したと判断してプログラムが自動停止する仕様になってる。1年くらい前から差分同期に時間がかかってしまい Automator による自動処理ができないサイトがでてきた。ひとつならそのサイトの更新だけ手動でやってたんだけど、だんだん増えてきてね。これは何か考えないと、と思ったわけだ。

Automator は簡単プログラミング環境なので「2分間」というタイムアウト設定を変更できない(らしい)。しかしその裏で動いているプログラミング言語自体の AppleScript なら簡単プログラミング環境では作れない複雑な命令文だって書けるし、当然ながらタイムアウト設定を一時的に変更する命令だってある。

ということで今日は『Transmit による差分同期作業を簡単プログラミング環境の Automator で自動化していたけど、Automator のタイムアウト設定の問題で使えなくなったので、AppleScript で直接書きました。』という備忘録。

AppleScriptは、かなり独特なプログラミング言語で、参考資料が少ない。ましてやTransmitへの命令文に至ってはほとんど情報がない。AppleScriptは登場した30年くらい前に面白半分にいろいろいじってた経験しかないので、古ーい記憶を頼りに、ネット上の数少ない情報とともに何とか書いたよ。放っておくと絶対忘れるので、ブログに書いておく。

Macに標準インストールされている「スクリプトエディタ」というソフトを起動して、下記のようにスクリプトを記述する。

tell application "Transmit"
 set myRules to (skip rules whose enabled is true)
 set myList to favorites whose name starts with "ABCD."
 repeat with myFave in myList
  tell current tab of (make new document at end)
   connect to myFave
   with timeout of 600 seconds
    synchronize local browser to remote browser using skip rules myRules with delete orphaned items and automatically determine time offset without follow symlinks
   end timeout
   close
  end tell
 end repeat
end tell
tell application "Transmit" to quit

1行目の tell application “Transmit” で Transmit を起動。2行目に activate って書くとTransmit の画面が最前面にくる(アクティブになる)けど、今回は裏で黙々と同期作業をしてくれてればいいので activate は書かない。

2行目は同期除外ルールを選択している。Transmit は条件に合致したファイルは同期対象から除外する「ルール」を作っておくことができる。ここでは Transmit のルールの設定画面であらかじめ使用可になっているルールだけ(skip rules whose enabled is true)を選び出して myRules に格納している。every skip rules で全部選んでもいいし設定済みルールの中のどれを使うかはいろいろ書ける。

3行目の favorites whose name starts with “ABCD.” で、Transmit に登録してあるお気に入りの中から名前が「ABCD.」で始まるお気に入りだけを選び出している。ここは every でお気に入り全部を選択してもいいし、is を使って特定の名前のお気に入りだけを選択してもいいし、end with とか does not start with とかいろいろ書ける。いずれにせよお気に入りの中から必要なものを myList に格納している。

4行目から12行目までが repeat 文で、3行目で作ったお気に入りリストからひとつずつ取り出して myList から取り出したお気に入りは myFave に格納され繰り返し処理をさせる。

5行目は作業ウインドウを新しく作り(make new document)、ウインドウを作ると作業タブがひとつできているので、それ(current tab)を操作対象とする。

6行目で、現在のお気に入り(myFave)の設定で接続を開始

7行目が今回の最大の目的であるタイムアウト設定。with timeout から9行目の end timeout までの処理については600秒(10分間)を待ち時間にしている。これで時間がかかる同期作業でもタイムアウトでエラーにならずにすむ。

8行目が Transmit への差分同期実行命令。local browser to remote browser で同期方向を指定。using skip rules で同期除外ルールを指定。with delete orphaned で同期先だけに存在するファイルは削除する設定(without にすれば削除しない設定)。with automatically determine time offset はローカルマシンとリモートマシンの時計のズレを自動調整する設定(without ならズレを指定できる)。without follow symlinks はシンボリックリンクを参照しない設定(with にすれば参照する)。

10行目で作業ウインドウを閉じる。

選択したお気に入りリスト全部の差分同期が終わったら最後14行目で Transmit を終了。

書き終わったらスクリプトを保存。保存形式で「スクリプト」を選ぶとスクリプトエディタで開いて実行するか、スクリプトメニューから選んで実行。「アプリケーション」形式で保存するとそれをダブルクリックするとスクリプトが実行される。

先生のお手本と演奏権料

ヤマハ音楽振興会など音楽教室が結成した「音楽教育を守る会」が、音楽教室での演奏について、JASRACに著作権使用料の徴収権がないことの確認を求めた訴訟で、2月28日東京地裁が請求を棄却した。

おいおいおいおいおいおい、マジかよ。

ピアノ教室の経営者としては、看過できん。

JASRACが楽器教室から演奏権料を徴収するって話を、会話形式にまとめると以下の通り。


JASRAC『楽器教室で先生が生徒にお手本を見せるのは「公衆に対して楽曲を聞かせることを目的とした演奏」なので演奏権料を払いなさい。』

楽器教室『え?生徒って公衆なの?』

JASRAC『はい。入会したり退会したりと不特定の人が出たり入ったりしているので、生徒は不特定すなわち公衆です。』

楽器教室『でも、お手本ってのは楽曲を聴かせるのが目的じゃなくて、演奏の仕方を指導するのが目的なんだけど。』

JASRAC『いえ、我々が楽器教室に送り込んだ潜入調査員は、講師の模範演奏を聴いて「まるで演奏会の会場にいるような雰囲気を体感しました」と裁判で証言しています。先生のお手本は聴かせることを目的とした立派な演奏です。』


JASRACの主張をまとめると以上になる。楽器教室は、公衆に対して楽曲を聴かせることを目的とした演奏を行なっているのだから、それ相応の演奏権料を払いなさい、と。んでもって、東京地裁がこの言い分をマルっと認めちゃった。

おいおいおいおいおいおい、マジかよ。

演奏権が及ぶ範囲がどんどん広がってきて、とうとうお手本にまで演奏権が及ぶとは・・・・これってかなりアブナイ話だよ。これは演奏権が際限なく広がっていくきっかけになるよ。

アブナイ話:その1

たとえば、学校の吹奏楽部が、交通費にもならないわずかな謝礼で外部講師に来てもらってたとする。んで、その講師が練習中にお手本を見せたとする。金額や名目がなんであろうが講師は無報酬じゃないんで、これ、練習のたびに演奏権料の支払いが必要になるってことよ。

講師には「うちの部活には練習のたびに演奏権料を払う余裕なんてないので絶対にお手本は見せないでください」って念押ししないといけないとか、おかしいでしょ。

学校の部活じゃなくても市民楽団とか趣味のサークル活動でも、謝礼をもらった指導者が練習中にお手本をみせるだけでそのたびに演奏権料の支払いが必要になる。これってやりすぎだと思わない?

アブナイ話:その2

音楽教室での先生のお手本に演奏権が及ぶということは、学校の授業での先生のお手本にも演奏権が及ぶってことになる。

JASRACは、学校の授業は「非営利・無料・無報酬」の3条件が同時に成立しているので演奏権が及ばない、という見解を発表しているけど、これはおかしい。学校は非営利法人だから非営利なのはわかる。だが、生徒は学費を払ってるんだから無料じゃないし、先生は給料もらってるんだから無報酬じゃない。明らかに説明に無理がある。

これは要するに、学校の音楽の授業からも演奏権料を徴収するって話にすると世間の納得が得られないから、無茶苦茶な理由で「学校の授業は大丈夫ですよ〜」と言ってるだけ。楽器教室からの演奏権料徴収が軌道に乗ったら、次は部活やサークル活動、その次は音楽学校、最後は普通学校の音楽の授業まで少しずつ対象を広げていくよ、きっと。

急性毒性がどうしたって?

ときどき学生が「この化粧品には(経口)急性毒性が高い成分が配合されているから良くないんですよね」とか言ってきたりレポートにそんな感じのこと書いてくることがあってね。意味不明すぎて返事に困るというか、どこから説明したらいいんだろうって頭抱えちゃうんだわ。だって、よく考えてよ。『経口』の『急性』の毒性で、なんで肌への安全性がわかるの? ぜんぜん関係なくね?

1.経口だよ?急性だよ?

『経口』の『急性』の毒性で肌への刺激性がわかるなんて、よく考えなくたって変な話だと思うでしょ。ところが『毒性』っていう文字のインパクトが強すぎて、あっさりと意味不明なヨタ話を信じてる学生の多いこと多いこと。まあそれ以前に、肌への刺激って言っても嗜好性に依存する刺激や皮膚一次刺激や感作性とかいろいろあるのに「刺激」の一言でふんわりまとめちゃってる時点でこれも話にならないんだけどね。

さて、肌に塗っていいのか悪いのかを経口急性毒性で議論することがどれだけ意味不明なことなのかをいくつかの事例からみてみよう。

その前に、確認。経口急性毒性とは「一気にどれだけ食ったら危ないか」という値。さらには経口急性毒性の中でも単回経口投与による半数致死量、つまり「一気にどれだけ食ったら半数以上が死ぬか」という値を指している場合が多い。経口と吸入と経皮を区別してないとか、単回と慢性が混ざってるとか、半数致死量と健康影響量が混ざってるとか、そういう混在データを使って話してる例もあるが、そんなのはこの先の話を読むまでもない。論理的思考力のカケラもない人によるヨタ話どころか単なる妄想話。

さて用語の意味を説明されたら気づく人も多いだろう。そうです。どんだけ一気喰いしたら死ぬのかって話が、どうして皮膚刺激と関係するんだ?関係あると考える方がおかしいでしょ。

2.一気喰いと塗布って何の関係あるの?

たとえば下記のようなデータを示して、経口急性毒性と皮膚刺激性の関係をまことしやかに論じたブログがある。

メチルパラベン:8000mg/kg
エタノール:7000mg/kg
イソプロピルメチルフェノール:6280mg/kg
トリクロサン:3700mg/kg
エチルパラベン:3000mg/kg
フェノキシエタノール:2900mg/kg
サリチル酸:1100mg/kg

トリクロサンは急性毒性が高いから、皮膚刺激も高いので良くないとかなんとかかんとか・・・・・・・・・。はぁ?

3.急性毒性が高くても皮膚刺激性が高いとは限らない

じゃあなにか?経口急性毒性が1900mg/kgの「食塩」は皮膚に塗ったらすげー危険なのか?

公益財団法人日本中毒情報センターの情報も適時更新されているけど最近だと食塩の急性毒性は750〜3000mg/kgというデータになってる。間を取って1900mg/kgとすると、ヨタ話に当てはめたらサリチル酸並みに皮膚刺激が強いということになる。食塩って肌に塗ったら良くないの?入浴剤とかバスソルトとかすごい量の食塩が入ってるけどあれ危険なの?塩アメなめたらくちびるが荒れるの?ポカリスエット飲んだら口の中がただれちゃうの?海水浴すると皮膚炎で死ぬの?んなわけないじゃん。

だいたいさ、「急性」だよ「急性」。一気喰いしたらどうなるの?って話だよ。食塩は一気喰いだと少量で死んでしまうほど危険だけど、でも適度に摂取しないとそれはそれで死ぬでしょ。同じ食べるという行為でみたって急性毒性が高いかどうかと食べていいかどうかは無関係なのに、それが塗っていいかどうかになんてどう考えたって関係ないでしょう。

4.急性毒性が低くても皮膚刺激性が低いとは限らない

くだんのブログじゃメチルパラベンは急性毒性が低いから皮膚刺激も少ない安心な防腐剤とかなんとかかんとか・・・・・・・へぇー、じゃあなにか?トロロって一気喰いしてもそうそう死ぬことはないから経口急性毒性はかなーり低いよな。つまりヤマイモ(トロロ)は皮膚に塗っても安心なのか?へー、おれは痒くなるからやだなあ。メチパラが安心な防腐剤だってのに異論はないけどその理由が急性毒性が低いからでは、あまりにトンチンカンで泣けてくる。

このように「急性毒性が高い=塗ったら危ない」説や「急性毒性が低い=塗っても大丈夫」説を否定する事例はいくらでもある。なぜなら「どんだけ一気喰いしたら死ぬか」ということと「ちまちま皮膚に塗ってもいいか」ということは本質的に無関係なのだから、そもそも両者になにか関係があると思うほうがどうかしてる。

5.急性毒性は誤飲誤食時の安全対応に必要な参考値

ここまで言えばたいていの人は急性毒性で塗布安全性を語ることがいかに無意味なことなのかわかってもらえるんだけど、それでも「化粧品原料の安全データシートに急性毒性値が掲載されてるんだから安全性の指標なんでしょ?」とか駄々こねる学生もいる。おまえ、SDSにそんなこと書いてあるってすげえ知識があるのに、どうしてこれがわかんないんだ?

経口急性毒性は、一気喰いしたときの健康被害を推定する値だということは何度も言った通り。つまり、そういうこと。誤飲しても死ぬことはないのか、希釈や洗浄が必要なのかなど「誤飲時の対応を考えるための指標」。そういう用途の安全性情報。ちまちま塗ってもいいかどうかを考えるための指標じゃない。

6.信じちゃうのはなぜ?

この手のヨタ話のミソは、最初に急性毒性値一覧表という「事実」を見せるところ。知識が少ない人は、最初に事実に基づいた話から始められると途中から根拠薄弱なヨタ話に切り替わっても気づくことができない。だって知識がないんだからしょうがない。

本来ならメチルパラベン、エチルパラベン、エタノール、フェノキシエタノールなど各種化合物を皮膚刺激の強い順に並べて、その順番と急性毒性の高低とをまずは比較して、そこに関係があるかどうかを論じないといけない。ところがここを意図的にすっ飛ばして、皮膚刺激性と急性毒性が一致しているという結論ありきで表を突然出してくる。論ずべき事項を論ずるまでもない事実であるかのように誤認させているのがミソ。

話の冒頭から「急性毒性と皮膚刺激がこのように関係しているんです」って根拠もない断言をすると違和感を覚える人が多いけど、最初に急性毒性値という論ずるまでもない事実を並べると、知識がなかったり論証慣れしてない人はその後に提示される情報もすべて論ずるまでもない事実であると思ってしまう。

どっかの誰かが「小さなウソならばれるが、大きなウソならばれない」って言ってたよ。食塩やトロロみたいにわかりやすい反例があるにも関わらず「愚民どもよく聞け、急性毒性が高い成分は危険な化粧品成分だ!」って断言しちゃえば信じちゃう人は信じちゃうんだよな。

これは、足し算と掛け算の答えが同じになる事実を並べて「愚民どもよく聞け、足し算すれば掛け算の答えは出せるのだ!」ってヨタ話と同レベル。

2+2=4ですね。2×2=4ですね。
足し算も掛け算も答えは同じ。
1+2+3=6ですね。1×2×3=6ですね。
足し算も掛け算も答えは同じ。
1+1+1+2+5=10ですね。1×1×1×2×5=10ですね。
やっぱり足し算も掛け算も答えは同じです。
実はあまり知られてませんが、掛け算は足し算でできちゃうんです。
だから3×3=6なんですよ。

最初に事実を出して途中から根拠のないヨタ話に切り替わってる。足し算と掛け算の知識がある人は最後の2行が事実ではないことにすぐ気づく。しかし掛け算の知識が少ない小学2年生だとコロッと信じちゃう可能性大。

単回経口急性毒性(半数致死量)という皮膚塗布時の安全性と無関係な情報を使って自分の商売に都合のいい方向へ消費者を誘導する手法はかつて流行った危険物商法のテンプレート。でもこの急性毒性ネタは20年ほど前に絶頂期を迎え、その後は一定の割合で信じてしまう人を生み出しつつも、合成界面活性剤、合成ポリマー、発がんリスク、シリコーン、カチオンなど次々と現れる類似の新ネタを前に徐々に新鮮味を失って近年はあまりお目にかかることもなくなった。

7.学生よ、論理的思考を強化してくれ

ところが最近またぞろこの成分は急性毒性が高いから危ない成分だとかなんとかかんとかうんぬんかんぬん・・・とかいうヨタ話が復権してきたみたい。理系の大学生ですらコロッと信じちゃってるんだから根の深い問題だわ。ファッション業界も一周回ってまたコレか?!みたいなのがあるみたいだし。化粧品の危険商法ネタも一周回ってまたって繰り返すのか。