Archive for the 'Transmit' Category

2013/09/02 Transmitの接続状態をチェック

Transmitで何がしかのサーバーに接続している状態をチェックするAppleScriptです。

TransmitでFTP/SFTPなどのサーバーに接続している状態を確認します。接続できていればtrueを、接続していない場合にはfalseを返します。

スクリプト名:Transmitの接続状態をチェック
set aRes to chkConnection("www.piyocast.com", "/piyocast.com/public_html/as") of me
–> true

–Transmitの接続状態をチェック
on chkConnection(chkAddress, chkPath)
  
  
tell application "Transmit"
    set suppress errors to true –エラー時にダイアログを表示しない(ほんとかな?)
    
    
try
      set dCount to count every document
      
if dCount = 0 then
        return false
      else
        tell document 1
          tell current tab
            set rList to every file browser whose remote is true
            
            
if rList = {} then return false
            
            
set remoteBrowser to contents of first item of rList
            
            
tell remoteBrowser
              set aInfo to properties
            end tell
            
            
set tmpADR to address of aInfo
            
set tmpPath to root path of aInfo
            
            
if {tmpADR, tmpPath} = {chkAddress, chkPath} then
              return true
            else
              return false
            end if
          end tell
        end tell
      end if
    on error
      return false
    end try
  end tell
  
end chkConnection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/06/20 Transmitでファイルリストをリフレッシュしてから取得

FTPソフトウェア「Transmit」で、オープン中のサーバー内のファイル/フォルダ名一覧画面の内容を、一度リフレッシュ(更新)してから一覧を取得するAppleScriptです。

FTPソフトウェアの多くで、ファイル/フォルダ名一覧を取得するときに、リフレッシュするAppleScript命令を持っています。なければ、出来損ないです。

スクリプト名:Transmitでファイルリストをリフレッシュしてから取得
tell application “Transmit”
  set dCount to count every document
  
  
if dCount = 0 then return {}
  
  
tell document 1
    tell current tab
      set rList to every file browser whose remote is true
      
set remoteBrowser to contents of first item of rList
      
      
tell remoteBrowser
        refresh
        
set bList to name of browser items
      end tell
      
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/06/19 Transmitのお気に入りから、サーバーのアドレスとディレクトリ情報を取得する

FTPクライアント「Transmit」の「お気に入り」(いわゆるブックマーク)の指定名称の項目から、サーバーのアドレスとディレクトリ情報を取得するAppleScriptです。

Mac OS X FTPクライアントの最高峰との呼び声も高い、FTPソフトウェア「Transmit」。他のFTPソフトウェアを使っていた自動処理システムで(WebDAVのサーバーにアクセスしていました)、信頼性と転送速度とAppleScript対応度からTransmitに切り替えてみたところ、これらすべての面で不満が解消されました。

そんな自動処理システムで、本番サーバーとテストサーバーの切り換えを、Transmitの「お気に入り」に登録した名称で切り替えて指定していたのですが、お気に入り項目の詳細データが必要になって……それをプログラム中に直接記述するのはスマートではないため、Transmitに問い合わせて値を取得することにしました。

そんな用途に使ったのが、このAppleScriptです。

trans2.png

trans1.png

Transmitのお気に入り項目を文字で指定して、実際にお気に入り項目にアクセスし、アドレスとパスの情報を取得します。

スクリプト名:Transmitのお気に入りから、サーバーのアドレスとディレクトリ情報を取得する
set aName to "www.piyocast.com"
set {anAddr, aPath} to getFavoriteInfoByName(aName) of me
–> {"www.piyocast.com", "/piyocast.com"}

–お気に入りから、サーバーのアドレスとディレクトリ情報を取得する
on getFavoriteInfoByName(aName)
  tell application "Transmit"
    try
      set tmpFav to favorite aName
      
set aInfo to properties of tmpFav
      
set anAdr to address of aInfo
      
set anPath to remote path of aInfo
      
return {anAdr, anPath}
    on error
      return {false, false}
      
    end try
  end tell
end getFavoriteInfoByName

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/11/19 Transmitで指定のファイルを指定のお気に入りサーバーにアップロード

FTP Software「Transmit」で、指定のお気に入り項目のサーバーに接続し、指定ファイルをアップロードして、Web上のURLをクリップボードに入れるAppleScriptです。

パスワード付きのPDFをFTP経由でサーバーにアップロードして、そのURLをメールに貼付けるような代わり映えのしない作業をしょっちゅうやっているので、ひととおり自動化してみたものです。

TransmitのScriptingの下調べも進んできたので、アップロードを行うものを試してみました。uploadコマンドがファイルのパス情報としてaliasではなくPOSIX pathを要求することはTransmitのAppleScript用語辞書に載っていたのですが、少々ハマりました。

普通、日本語環境でAppleScriptを書いているユーザーであれば、パス情報をaliasからPOSIX pathにしたときには、「quoted form of〜」でクオート処理をしてアプリケーションにパス情報を渡すのが「普通」ですが、Transmitにはquoted form ofでクオート処理したPOSIXパス情報を渡すとuploadコマンド実行時にエラーになりました。

ただ、これが問題になるかといえば別にそういう話ではなく、クオート処理をしないでPOSIX pathを渡せばよいだけのようです。Transmit自体、スペース付きのファイル名や日本語ファイル名を許容しているので、GUI側からそのようなファイル名のファイルをアップロード/ダウンロードしてもエラーになりませんでした。

AppleScriptの慣習に不慣れな会社の製品、という理解をするべきなのか、FTPソフトウェアという特殊なジャンルであるがゆえに起こった問題なのでしょうか。少なくとも、クオート処理を行ったPOSIXパスでエラーになるのは、AdobeのAcrobat DistillerとTransmitだけです(自分が知るかぎりでは)。

スクリプト名:指定のファイルを指定のお気に入りサーバーにアップロード
set aFile to choose file “FTPサーバー「ドキュメントアップロード先」にアップロードする書類を選択”

tell application “Finder”
  set aName to name of aFile
end tell

–set aPosixPath to quoted form of POSIX path of aFile–POSIX apthにquoted formの指定を行うと、upload時にTransmitがエラーを起こす
set aPosixPath to POSIX path of aFile
–【注意】 Transmitに与えるPOSIX pathには、Quote処理を行ってはいけない!!!!

tell application “Transmit”
  
  
set myFave to favorite “ドキュメントアップロード先”
  
  
set newDoc to (make new document at end)
  
  
tell newDoc
    tell current tab
      connect to myFave
      
      
try
        tell remote browser
          set uRes to (upload item at path aPosixPath with resume mode overwrite) –同名のファイルが存在した場合には上書きする指定
        end tell
      on error erMes
        –エラー発生時の対処
        
display dialog erMes buttons {“OK”} default button 1 with icon 1
        
close
        
return
      end try
      
    end tell
    
    
close
    
  end tell
  
end tell

set aURL to “http://www.piyocast.com/docs/” & aName

set the clipboard to aURL

display dialog “アップロードを実行し、URLをクリップボードに入れました”

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/11/10 FTPソフトウェア「Transmit」の基礎的なスクリプティング(3)

FTPソフトウェア「Transmit」のAppleScriptの基礎的なオブジェクトにアクセスして、どのような構造になっているのか、常識的な振る舞いをしてくれるのかを確認してきました。

その結果、他に類を見ない不思議な振る舞いを行ったり、独特の構造を持つことがよく分ってきました。まあ、「そういうもんだ」と納得しておくしかないでしょう。

ようやくここで、TransmitのAppleScript用語辞書を開いてながめてみましょう。TransmitのアプリケーションのアイコンをAppleScriptエディタのアイコンにドラッグ&ドロップすると用語辞書の内容を確認できます。

trans5.png

「Standard Suite」には最低限のオブジェクトや命令が並んでいるだけなので、「Transmit Suite」を調べていくことになります。

指定のサーバーへのアクセスは、すでに登録しておいた「お気に入り」(favorite)を指定することもできるし、サーバー情報とアカウント情報を指定して行うこともできるとあります。

サーバー上のディレクトリ移動や新規フォルダ作成、フォルダやファイルのリネーム、削除などひととおり常識的なコマンドがあることが分ります。注目に値するのは、refreshコマンド。FTPなどのサーバーには複数の人間やプログラムがアクセスしていることもあり、最新の状態を取得するためのrefreshコマンドが用意されていることは重要です。

もし仮にrefreshコマンドが存在しない場合でも、一度親ディレクトリに移動して元のディレクトリに戻ってくるなどの操作を行えば、同じ効果が期待できます(内容ごとキャッシュしてしまっている場合にはダメですが……昔のFetchはそうなっていました)。

ひととおりコマンドやオブジェクトの所在を確認できたので、Panic SoftwareのWebサイトからサンプルAppleScriptをダウンロードして見てみましょう

「Transmit 4 AppleScript Examples」というフォルダの中に、「Basic Connection and File Transfer」「Recursive File Listing」「Connect To Favorite and Synchronize With Rules」の3本のAppleScriptが含まれていました。

まずは、「Basic Connection and File Transfer」の内容を確認。

スクリプト名:Basic Connection and File Transfer
– Basic Connection and File Transfer (Requires Transmit version 4.0 or newer)
– 2010 Panic Inc.

– Demonstrates a simple connection, directory change, download, and upload

tell application “Transmit”
  – Prevent interactive alerts from popping up during script execution
  
set SuppressAppleScriptAlerts to true
  
  
– Create a new window (and thus a single tab) for the script
  
tell current tab of (make new document at end)
    
    
connect to address “ftp.panic.com”
    
    
– The following tell block could alternatively be replaced with a single line:
    
– change location of local viewer to path “~/Desktop”
    
tell local browser
      change location to path “~/Desktop”
    end tell
    
    
tell remote browser
      – In Transmit 4, a tab can have two remote or two local viewers. So, although we’ve already set our local viewer to the
      
– Desktop, we still have to specify a path when downloading. Otherwise, the file will go to the Downloads folder.
      
download item at path “/welcome.msg” to “~/Desktop” with resume mode overwrite
      
      
change location to path “/audion/museum”
      
      
– The script will always fail here, since you can’t upload to ftp.panic.com
      
upload item at path “~/Desktop/welcome.msg” to “/audion/museum”
    end tell
    
    
– disconnect
    
close remote browser
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

いきなり、属性値の名前を間違えるという大ボケをかましていますが(正しくは、ここは「SuppressAppleScriptAlerts」ではなく「suppress errors」ですね)、ひととおりの動作を確認することができます。

TransmitでFTPサーバーなどに新規接続する際には、documentを新規作成して、そのdocumentへの参照(内のcurrent tab)に向けてconnectコマンドを実行すると接続するだけ。

必要最低限の箇所のみ抽出してみるとこんな感じです。お気に入りに登録してある「ドキュメントアップロード先」に接続するやり方です。

スクリプト名:登録ずみの指定登録先に接続する
tell application “Transmit”
  set myFave to favorite “ドキュメントアップロード先”
  
  
set newDoc to (make new document at end)
  
  
tell newDoc
    tell tab 1 –current tabでも可
      connect to myFave
    end tell
  end tell
  
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/11/10 FTPソフトウェア「Transmit」の基礎的なスクリプティング(2)(documentの謎)

FTPソフトウェア「Transmit」はよく出来たソフトウェアですが、AppleScript的に見るとさまざまな「謎」と「苦悩」に満ちている存在です。

その最大の謎である「documentへのアクセス」について試してみましょう。

前の記事では、「document 1」などと数字(ID)でアクセスしていました。このIDがドキュメント(GUI側から見たウィンドウ)の生成順で振られていないことが問題、という指摘をしていました。

でも、documentに対してIDでアクセスできなくても、名称で指定すればよいはずです。

ftp3.png

このような「www.piyocast.com」というタイトルのついたTransmitのウィンドウが表示されている場合、これを「document “www.piyocast.com”」でアクセスできると普通は考えます。

trans1.png

ためしてみると……

trans2.png

なんと、エラーになってしまいます!

ためしに、window “www.piyocast.com”としてアクセスすることは……

trans3.png

できるようです。

このwindowの属性にdocumentが存在していることが分ります。その内容を読むと……

{zoomable:true, closeable:true, zoomed:false, class:window, index:1, visible:true, name:”www.piyocast.com”, miniaturizable:true, id:1619, miniaturized:false, resizable:true, bounds:{1258, 172, 2058, 672}, document:document “名称未設定” of application “Transmit”}

「document “名称未設定”」という名前であることが分ります。ちなみに、複数のウィンドウをオープンすると、それぞれのWindowのdocument名は「名称未設定 1」「名称未設定 2」などとカウントアップされていきます。

こんなアプリケーションは見たことがありません(ーー;;;;

このあたりの「謎」な挙動は、AppleScriptの処理系の側の問題ではなく、アプリケーション側の実装によるものです。

tarans4.png

2012/11/10 FTPソフトウェア「Transmit」の基礎的なスクリプティング(1)

未知のアプリケーションのScriptingを行うにも、いきなりプログラムを書くのは無理です。AppleScriptの場合、

 (1)アプリケーションを実際につかいこなす
 (2)アプリケーションとAppleScriptで「対話」してみる
 (3)実際にプログラムを組んでみる

という段階を経由しないと、まずAppleScriptのプログラムを書くのは無理です。

他の言語のプログラマがつまづくのは(1)と(2)のステップを経由しないでいきなり(3)をやろうとするためです。実際にアプリケーションの挙動や機能を理解しないで組めるようになるわけがありません。

初心者がAppleScriptを組めるようにならないのは、(1)からいきなり(3)をやろうとするためです。あと、初心者は最初から大きなものを作ろうとしすぎる傾向があるので、最低限の小さなものをまず確実に動作させることを心がけるべきです。

というわけで、AppleScriptとアプリケーション(ここではTransmit)の間で「対話」を行い、AppleScriptからは対象のアプリがどのように見えるのかを確認する作業が必要になります。かんたんな内容ですが、たいへんに重要な作業です。

スクリプト名:TransmitがSystem Eventsからどう見えるかチェック
tell application “System Events”
  tell process “Transmit”
    properties
    
    
–> {enabled:missing value, unix id:2327, file:alias “Macintosh HD:Applications:Transmit.app:”, creator type:”TrAn”, subrole:missing value, entire contents:{}, selected:missing value, application file:alias “Cherry:Applications:Transmit.app:”, orientation:missing value, role:”AXApplication”, accepts high level events:true, file type:”APPL”, value:missing value, position:missing value, id:1778098, displayed name:”Transmit”, name:”Transmit”, class:application process, background only:false, frontmost:false, size:missing value, visible:true, Classic:false, role description:”アプリケーション”, maximum value:missing value, architecture:”x86_64″, partition space used:0, short name:”Transmit”, focused:missing value, minimum value:missing value, help:missing value, title:”Transmit”, accepts remote events:false, description:”アプリケーション”, total partition size:0, accessibility description:missing value, has scripting terminology:true, bundle identifier:”com.panic.Transmit”}
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

まずは、かるくご挨拶。MacのGUI上ではDock上に起動アプリケーションを確認し、コマンドラインからではpsコマンドで起動中のプロセスの内容を確認するがごとく、AppleScriptではSystem Events経由でプロセスの状態を取得します。bundle IDやらの必要な情報をここで確認しておきます。

スクリプト名:アプリのプロパティを取得
tell application “Transmit”
  properties
  
–> {name:”Transmit”, frontmost:false, class:application, suppress errors:false, version:”4.2″}
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

Transmitのアプリケーション自体のプロパティを取得してみます。この階層にselection(選択中のオブジェクト)を示す属性が存在していないことを確認し、「suppress errors」(AppleScript実行中のエラーダイアログ表示抑止)という大事な属性が存在していることが確認できます。

スクリプト名:Windowの情報を取得
tell application “Transmit”
  set dCount to count every window
  
tell window 1
    properties
    
–> {zoomable:true, closeable:true, zoomed:false, class:window, index:1, visible:true, name:”名称未設定”, miniaturizable:true, id:485, miniaturized:false, resizable:true, bounds:{32, 22, 1114, 836}, document:document “名称未設定” of application “Transmit”}
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

アプリケーションは多くの場合にウィンドウを伴っているため、とくに複数のウィンドウを表示できる場合に、本当に枚数をカウントできるのかといった挙動を確認しておくことが重要です(出来の悪いソフトだと、目に見えないウィンドウの枚数までカウントできたりして困ります)。

スクリプト名:ドキュメントの情報を取得
tell application “Transmit”
  set dCount to count every document
  
tell document 1
    properties
    
–> {file:missing value, modified:false, name:”名称未設定”, class:document, current tab:tab 1 of document “名称未設定” of application “Transmit”}
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

documentのオブジェクトからプロパティを取得してみました。Windowには存在していなかったcurrent tabという属性を確認できます。また、documentの内容にアクセスする場合にはその下のtabというオブジェクトを経由しないとアクセスする必要があることも分りました。

ちなみに、ここでドキュメント(Window)を複数ひらいてdocument 1のプロパティを取得してみたところ……ドキュメントの生成順に番号を振っているわけではなく、前面から順にdocument 1…document 2とIDを振っていることが分ります。かなり問題のある実装です。

スクリプト名:ドキュメント内のcurrent tabの情報を取得
tell application “Transmit”
  set dCount to count every document
  
tell document 1
    tell current tab
      properties
      
–> {left browser:missing value, remote browser:missing value, name:”Transmit”, local browser:missing value, right browser:missing value, class:tab}
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

document内のcurrent tabにアクセスしてプロパティを取得してみました。この中はlocal browserとremote browserに分割可能で、左側のブラウザと右側のブラウザのそれぞれどちらがremote/localかを検出できるようにしているようです。

ftp2.png

スクリプト名:Left BrowserとRight BrowserのどちらがRemoteでどちらがLocalかを判定
tell application “Transmit”
  tell document 1 –最前面のWindowがDocument 1
    tell current tab
      set leftB to left browser
      
set rightB to right browser
      
      
properties
      
–> {left browser:file browser 1 of tab 1 of document “名称未設定” of application “Transmit”, remote browser:file browser 2 of tab 1 of document “名称未設定” of application “Transmit”, name:”ドキュメントアップロード先”, local browser:file browser 1 of tab 1 of document “名称未設定” of application “Transmit”, right browser:file browser 2 of tab 1 of document “名称未設定” of application “Transmit”, class:tab}
      
      
set lBclass to class of leftB
      
–> file browser
      
properties of leftB
      
–> {address:missing value, root path:”/Volumes/Macintosh HD/ユーザ/maro”, favorite:favorite 3 of application “Transmit”, show hidden:false, username:missing value, remote:false, class:file browser}
      
      
set rBclass to class of rightB
      
–> file browser
      
properties of rightB
      
–> {address:”XXXXX.xsrv.jp”, root path:”/XXXXX.xsrv.jp/public_html/docs”, favorite:favorite 3 of application “Transmit”, show hidden:false, username:”curuser@XXXXX.xsrv.jp”, remote:true, class:file browser}
      
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

実際にFTPサーバーにアクセスした状態のWindowを用意し、document 1のcurrent tab内のleft browserとright browserのプロパティを取ってみました。

プロパティを取ってみると、remote属性がtrueのfile browserがremote browserということだと分ります。左右のfile browserのどちらもlocal browserに設定するのは無意味ですが、両方ともremote browserに設定することは可能であり、2つのサーバー間で指定ディレクトリのシンクロが行えるようです。

まだプログラムはほとんど組んでいない状態ですが、AppleScriptではこのようなアプリケーションとの「対話」が非常に重要です。

2012/11/10 AppleScript対応FTPソフトの旬は「Transmit」

Mac用のFTPソフトウェアといえば、Mac OS 9の時代には長らく「Fetch」が不動の座を占めていました。

Mac OS X時代に入ってからはこれといって定番らしいソフトがなく、Fetchを使い続けてはいたものの、乗り換えの必要を感じるようになって……やがてフリーの「Cyberduck」が広く使われるようになってきました。

ところが、Cyberduckがマルチプラットフォーム対応をはじめたころから状況が悪化。AppleScriptへの対応がなくなるわ、サーバーへのアクセスが遅くなるわ、サーバーにアップロードしたファイルが壊れるわで、フリーであること以外何もいい点が見つからなくなってしまいました。

ftp_trend.png

そんな中、さまざまなFTPソフトウェアを吟味し自分用のFTPソフトウェアに決めたのが「Transmit」。AppleScriptから見てあまり機能豊富とはいえませんが、Amazon S3への接続など「現代的なFTPソフトウェア」に求められる機能が存在している点に安心感をおぼえます。

AppleScriptからFTPを行うだけであれば、shell commandを呼び出したほうがよく、sftpによる接続を要求されないような用途にはこれで対処していました。sftpで接続する場合にはCyberduckをコントロールして使っていましたが、前述のとおり途中のバージョンからScriptableでなくなってしまったため「乗り換え」が必要になってきたわけです。

Transmitは、FTP/SFTP/S3のサーバーをFinder上にマウントしたり、ファイルブラウザの使い勝手、ファイルの転送速度などをセールスポイントにしていますし、GUI側から使った場合の安定性については信頼していいレベルだと思います。

ただ……AppleScript側からコントロールした場合の機能が貧弱。とりあえずFTP経由のアップロード/ダウンロードなどが行えるので「及第点」ではあるものの、随所に「こなれていない」印象を受けます。GUIから使える機能の多くがAppleScript側から呼び出せないので、AppleScriptからコントロールしているかぎりは大昔のFetchと大差ない印象です(Cyberduckもその程度だったのでTransmitだけがダメというわけではありません)。たとえば、せっかくサーバーをFinderにマウントする機能があるのに、AppleScriptからこの機能は呼び出せません。

Panic SoftwareのWebサイトからTransmitをコントロールするサンプルAppleScriptが配布されていますが、この内容にはかなり疑問をおぼえます(内容が間違っていたり、サンプルの割には平易な書き方をしていなかったり)。