Archive for 12月, 2010

2010/12/30 Mac添付の赤外線リモコンのon,off_v2

Mac添付の赤外線リモコンのon/offを行うAppleScriptです。

スクリプト名:Mac添付の赤外線リモコンのon,off_v2
try
  set currentValue to (((do shell script "defaults read /Library/Preferences/com.apple.driver.AppleIRController DeviceEnabled") as integer) + 1)
  
set status to item currentValue of {"disabled", "enabled"}
  
set button to (display dialog "Set remote control infrared. Right now it is " & status & "." buttons {"Cancel", item currentValue of {"Enable", "Disable"}} default button 2)
  
do shell script "defaults write /Library/Preferences/com.apple.driver.AppleIRController " & quote & "DeviceEnabled" & quote & " -bool " & item currentValue of {"yes", "no"} with administrator privileges
end try

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

2010/12/29 指定フォルダ容量をMB単位で返す_v2

Finder上で選択したフォルダの容量をMB単位で返すAppleScriptです。

容量が大きい場合に結果が指数表示になってしまっていたため、duコマンドのパラメータを変更してみました。

また、Mac OS X 10.6からはディスク容量を1024ではなく1000で繰り上がるように計算するようになったので、本サブルーチン(=duコマンド)の結果とFinderの結果は異なります。

概算のために用意したので自分としてはこれで大丈夫ですが、気になる方はduコマンドからバイト単位で結果を取得して計算するとよいでしょう。

スクリプト名:指定フォルダ容量をMB単位で返す_v2
tell application “Finder”
  set aSel to selection –as alias list–10.4.11で効かなかった。びっくりした
  
if aSel = {} then
    display dialog “Finder上で何も選択されていません。” buttons {“OK”} default button 1 with icon 1
    
return
  end if
  
  
set aaSel to first item of aSel
  
set aaSel to aaSel as alias
  
end tell

set aMBsize to getFolderSizeByMB(aaSel) of me

–指定フォルダのalias以下の容量をMBで返す
on getFolderSizeByMB(aFolAlias)
  set aDir to (POSIX path of aFolAlias)
  
set aDir to quoted form of aDir
  
  
try
    –set aRes to do shell script “du -k -d 0 ” & aDir
    
set aRes to do shell script “du -m -d 0 “ & aDir
  on error
    return
  end try
  
  
set aList to words of aRes
  
set aSize to (first item of aList)
  
  
return aSize
  
end getFolderSizeByMB

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

2010/12/29 指定フォルダ容量をMB単位で返す

指定フォルダの容量を求めるAppleScriptです。

単純にシェルのduコマンドを呼び出しているだけで、しかも指定するのはフォルダでなくてもよいのですが、フォルダ内の容量取得を目的として作成したものです。

Finder上で何らかのフォルダを選択した状態で本AppleScriptを実行してください。

ファイルサーバー上の指定フォルダを処理する際に、一定容量以上のサイズのフォルダの場合には「大きすぎる」とメッセージを出して処理を行わないようにすることを検討。その判断のために本サブルーチンを作成しました。

微妙に、duコマンドの「Kバイト」(1024で桁上がり)とMac OS X 10.6上のKバイト(1000で桁上がり)の間に差があって、Finder上の結果と異なる数字になるようですが、概算で取得できればよいのでこんなものだと思っています。

スクリプト名:指定フォルダ容量をMB単位で返す
tell application “Finder”
  set aSel to selection –as alias list–10.4.11で効かなかった。びっくりした
  
if aSel = {} then
    display dialog “Finder上で何も選択されていません。” buttons {“OK”} default button 1 with icon 1
    
return
  end if
  
  
set aaSel to first item of aSel
  
set aaSel to aaSel as alias
  
end tell

set aMBsize to getFolderSizeByMB(aaSel) of me

–指定フォルダのalias以下の容量をMBで返す
on getFolderSizeByMB(aFolAlias)
  set aDir to (POSIX path of aFolAlias)
  
set aDir to quoted form of aDir
  
  
try
    set aRes to do shell script “du -k -d 0 “ & aDir
  on error
    return
  end try
  
  
set aList to words of aRes
  
set aSize to (first item of aList) as number
  
  
set mSize to aSize / 1024
  
return mSize
  
end getFolderSizeByMB

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

2010/12/15 Terminal.appで指定コマンドを実行する

Terminal.appでコマンドを指定するAppleScriptです。コマンドの文字列を渡すとTerminal.app上で実行します。

ふつう、shell commandを実行する場合にはAppleScriptのdo shell scriptコマンドを使うのが常ですが、どーーーーーーーしても仕方のない場合に、Terminal.appをコントロールすることが、100%ないとも言い切れません。ただ、実際に使っている例を見ても「ああ、do shell scriptを知らなかったんだな〜」というものばかりで、必然性が感じられたケースは皆無でした。

Terminal.appのAppleScript用語辞書を調べると、do scriptコマンドがあり、パラメータとしてWindowを指定する必要があります。返り値はとくにありません。Terminal.appのウィンドウから結果を取り出すなど、別のAppleScriptを併用するなどしてみてください。

しかし、Windowがすべてクローズされた状態であれば、新規にWindowをオープンしなくてはなりませんが、make new windowなどの記述を行ってもwindowは新規作成されません。

USのAppleScript Users MLの過去ログを調べてみたところ、非常に微妙な記述によって新規Windowの作成指定が行えることが判明。あまりに微妙なので、プログラムを見ただけでは(コメントがないと)何を意図しているのか分からないほどです。

いまのところ、お世話になったことのない本プログラムですが、どこかで役立ったらコメント欄で教えてください。

スクリプト名:Terminal.appで指定コマンドを実行する
set aCMD to “ls -la”
doComInTerminalWindow(aCMD) of me

on doComInTerminalWindow(aCMD)
  tell application “Terminal”
    set wCount to count (every window whose visible is true)
    
    
– By wayne melrose
    
– Re: New window in Terminal.app
    
    
if wCount = 0 then
      –ウィンドウが1枚も表示されていない場合
      
do script aCMD
    else
      –すでにウィンドウが表示されている場合
      
do script aCMD in front window
    end if
  end tell
end doComInTerminalWindow

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

2010/12/14 入れ子のリストから、指定アイテムの値が連続して同じ値で続くブロックを検出する

入れ子になっているリストから、要素中の指定アイテムの値が連続して同じ値で続くブロックを検出するAppleScriptです。

{{”ぴよぴよ”, 123}, {”ぴよぴよ”, 125}, {”ぴよぴよ”, 127}, {”ぴよりん”, 200}, {”ぴよきち”, 210}, {”ぴよこ”, 230}, {”ぴよこ”, 231}}

のようなリストがあったときに、各要素の第1項目が連続している箇所の始点アイテムと終点アイテムをペアにして返します。

膨大なデータのソーティングを行ったときに作ったもので、項目が重複している場合には別項目をキーにして重複部分のみ再ソートして返すようにしていました。

プログラム中でグローバル宣言を行っているのは、もともとの記述からa reference toによる変数への間接アクセスを行うようにしたためで、これをやるのとやらないのとではデータ数が増えたときのスピードがケタ違いです。

スクリプト名:入れ子のリストから、指定アイテムの値が連続して同じ値で続くブロックを検出する
global subA01List, subA01List_r

set aDataList to {{"ぴよぴよ", 123}, {"ぴよぴよ", 125}, {"ぴよぴよ", 127}, {"ぴよりん", 200}, {"ぴよきち", 210}, {"ぴよこ", 230}, {"ぴよこ", 231}}
set rList to detectSuccessBlock(aDataList, 1) of me
–> {{1, 3}, {6, 7}}

–アイテムitemNoの値が連続して同じ値で続くブロックを検出する
–aDataListには、{item1,item2}の形式でデータが入っている。値の検出を行うのはitem1の部分のみ
on detectSuccessBlock(aDataList, itemNo)
  
  
copy aDataList to subA01List
  
  
set aFlag to ""
  
set blockListSub to {} – ブロック分割のすべてを記録しておく変数
  
set blockListSub_r to a reference to blockListSub
  
  
set blockItem to {} –小ブロックの記録変数
  
set sFlag to false
  
  
set prevItem to item itemNo of first item of subA01List
  
set subA01List to rest of subA01List
  
set iCount to 1
  
  
set subA01List_r to a reference to subA01List
  
  
repeat with i in subA01List_r
    set curItem to contents of item itemNo of i
    
    
if (prevItem as string) = (curItem as string) then
      if sFlag = false then
        –これまではブロック中にはいなかった。新たに値が連続するブロックを検出した
        
set blockItem to {iCount}
        
      else
        –連続したブロック中にいる。継続して同じ値が続いている
      end if
      
      
set sFlag to true
      
    else
      if sFlag = false then
        –これまでも連続ブロック中にはいなかった
      else
        –直前まで連続ブロックの中をスキャンしていた
        
–連続ブロックの末尾を見つけた
        
set the end of blockItem to iCount
        
set the end of blockListSub to blockItem
        
        
set blockItem to {} –ブロック保持用リストをクリア(ブロック末尾を検出したため)
      end if
      
      
set sFlag to false
    end if
    
    
set prevItem to curItem
    
set iCount to iCount + 1
  end repeat
  
  
–連続ブロックが継続したままになっていた場合の処理
  
–末尾に存在していた連続ブロックを検出する
  
if sFlag = true and blockItem is not equal to {} then
    set the end of blockItem to iCount
    
set the end of blockListSub to blockItem
  end if
  
  
return blockListSub
end detectSuccessBlock

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

2010/12/06 Finder上で選択中のフォルダをdiskimageに(パスワード指定つき)

Finderで選択中のフォルダをdiskimageファイル(ディスクイメージ)にするAppleScriptです。diskimageファイルには任意のパスワードを指定できます。

スクリプト名:Finder上で選択中のフォルダをdiskimageに(パスワード指定つき)
property aPassword : "piyopiyo"

tell application "Finder"
  set aSel to selection as alias list
  
if aSel = {} then
    display dialog "Finder上で何も選択されていません。" buttons {"OK"} default button 1 with icon 1
    
return
  end if
  
  
set aaSel to first item of aSel
  
set fRes to detectFolder(aaSel) of me
  
  
if fRes = false then
    display dialog "Finder上でフォルダが選択されていません。" buttons {"OK"} default button 1 with icon 1
    
return
  end if
end tell

tell application "Finder"
  set fn to name of aaSel
end tell

set aDir to (POSIX path of aaSel)
set aDir to quoted form of aDir

set fp2 to do shell script "dirname " & aDir
set fp2 to fp2 & "/"

set aCMD to "printf ‘" & aPassword & "’ | hdiutil create -encryption -srcfolder " & aDir & " " & (quoted form of (fp2 & fn & ".dmg"))
set fp3 to do shell script aCMD

–aliasがFolderかどうか判定
on detectFolder(aSelFol)
  set aInfo to info for aSelFol as alias
  
tell application "Finder"
    try
      set aFol to kind of aInfo
    on error
      return false
    end try
  end tell
  
  
return (aFol = "フォルダ")
end detectFolder

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

2010/12/05 Finder上で選択中のフォルダ内のすべてのファイルの作成日、変更日をcurrent dateに変更

Finder上で選択中のフォルダ内のすべてのファイル/フォルダの作成日、変更日を現在時刻に変更するAppleScriptです。

実行のためには、Xcode Toolsのインストールが必要です。

Script Menuに入れて、サンプルのXcodeプロジェクトの作成日/修正日の日付をまとめて変更するために作ったものです。

スクリプト名:Finder上で選択中のフォルダ内のすべてのファイルの作成日、変更日をcurrent dateに変更
set aCurDate to current date
set aDateStr to makeMMDDYYYYhhmmssStr(aCurDate) of me

tell application "Finder"
  set aSel to selection as alias list
  
if aSel = {} then
    display dialog "何も選択されていません" buttons {"OK"} default button 1 with icon 1
    
return
  end if
  
set aSelFol to first item of aSel
  
  
set fRes to detectFolder(aSelFol) of me
  
  
if fRes of me = false then
    display dialog "フォルダが選択されていません" buttons {"OK"} default button 1 with icon 1
    
return
  end if
  
  
tell folder aSelFol
    set aList to entire contents as alias list
  end tell
  
end tell

repeat with i in aList
  set aFres to detectFolder(i) of me
  
–if aFres = false then
  
changeCreationDate(i, aDateStr) of me
  
–end if
end repeat

–作成日と修正日を変更する
on changeCreationDate(aFile, aDateStr)
  set bP to POSIX path of aFile
  
  
try
    do shell script "/usr/bin/SetFile -d " & quoted form of aDateStr & " " & quoted form of bP –作成日
    
do shell script "/usr/bin/SetFile -m " & quoted form of aDateStr & " " & quoted form of bP –修正日
  end try
  
end changeCreationDate

–aliasがFolderかどうか判定
on detectFolder(aSelFol)
  set aInfo to info for aSelFol as alias
  
tell application "Finder"
    try
      set aFol to kind of aInfo
    on error
      return false
    end try
  end tell
  
  
return (aFol = "フォルダ")
end detectFolder

–DateオブジェクトからMM/DD/YYYY hh:mm:ssの形式の文字列を返す
on makeMMDDYYYYhhmmssStr(aDate)
  –Dateオブジェクトから各要素を取り出す
  
set yStr to (year of aDate) as string
  
set mStr to (month of aDate as number) as string
  
set dStr to (day of aDate) as string
  
set hhStr to (hours of aDate) as string
  
set mmStr to (minutes of aDate) as string
  
set ssStr to (seconds of aDate) as string
  
  
–桁数を合わせる
  
set y2Str to retZeroPaddingText(yStr, 4) of me
  
set m2Str to retZeroPaddingText(mStr, 2) of me
  
set d2Str to retZeroPaddingText(dStr, 2) of me
  
set hh2Str to retZeroPaddingText(hhStr, 2) of me
  
set mm2Str to retZeroPaddingText(mmStr, 2) of me
  
set ss2Str to retZeroPaddingText(ssStr, 2) of me
  
  
return (m2Str & "/" & d2Str & "/" & y2Str & " " & hh2Str & ":" & mm2Str & ":" & ss2Str)
end makeMMDDYYYYhhmmssStr

–数値にゼロパディングしたテキストを返す
on retZeroPaddingText(aNum, aLen)
  set tText to ("0000000000" & aNum as text)
  
set tCount to length of tText
  
set resText to text (tCount - aLen + 1) thru tCount of tText
  
return resText
end retZeroPaddingText

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

2010/12/04 Mobiolaでビデオ録画を開始、停止

Wifi経由でスマートフォンをMacの外部カメラとして使うアプリケーション「Mobiola」で、スマートフォン(iPhone)からビデオ映像のキャプチャを開始/停止するAppleScriptです。

Mobiolaでは動画/静止画キャプチャ時の解像度をLow(192 x 144)、Medium(480 x 360)、High(1280 x 720)の3つから選択可能で、自分が実際にIEE802.11g(802.11nではない)の無線LAN内で試した感じでは……Lowだと荒すぎるし、Highだとフレーム数が少なすぎて実用的ではなく、事実上Mediumしか使い物にならない感じでした(静止画像だとHighでもいいかも)。

キャプチャ解像度の指定はMac側アプリケーションではなく、iPhone側アプリケーションで行うようになっており、このあたり……Mac側で行えたほうがよいのではないかと思われました。あと、iPhoneのバッテリ残量を取得できるとか、ACアダプタをつないでいるかどうかというステートを取得できるとか、iPhone 4の場合にはLEDフラッシュを駆動させられるとか、HDR合成モードを使えるとか、リモートでiPhoneをスリープに移行させられるとよいと思われました。

スクリプト名:Mobiolaでビデオ録画を開始、停止
tell application “Mobiola WebCamera for iPhone”
  start recording
  
delay 10
  
stop recording
end tell

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

2010/12/04 Mobiolaで静止画像をキャプチャ、ファイル名指定つき

Wifi経由でスマートフォンをMacの外部カメラとして使うアプリケーション「Mobiola」で、指定フォルダに指定ファイル名で静止画のキャプチャを行うAppleScriptです。

ファイル名を指定する場合には、ファイル名だけ指定しておけば拡張子は「よきにはからって」くれるものとそうでないものがあるわけですが、本アプリケーションは「そうでない」タイプです。拡張子(.jpg)まできっちり指定しておく必要があります。

スクリプト名:Mobiolaで静止画像をキャプチャ、ファイル名指定つき
set dtPath to path to desktop
set dtPathPOSIX to POSIX path of dtPath –quoted form ofをつけるとアプリに拒否される

tell application "Mobiola WebCamera for iPhone"
  take snapshot to directory dtPathPOSIX using name "mobiola_image.jpg"
end tell

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

2010/12/04 Mobiolaで静止画像をキャプチャする

Wifi経由でスマートフォンをMacの外部カメラとして使うアプリケーション「Mobiola」で、静止画像のキャプチャを指定フォルダに対して行うAppleScriptです。

フォルダはMac OS形式ではなく、POSIX pathで指定する必要があります。さらに……経験を積んだScripterであれば途中のパスに空白文字や日本語の文字が入ることに備えて「quoted form of」でPOSIX pathをクォートして処理するのが常識ですが………………Mobiola WebCamera for iPhoneでクォート処理したPOSIX pathを渡すと認識してくれません(お前は、AdobeのAcrobat Distillerか?!)。

アンインストーラがAppleScriptで書いてあるなどAppleScriptが随所に見られる本アプリですが、ここだけはいただけませんでした。

なお、フォルダを指定しない場合には、「Mobiola WebCamera for iPhone」アプリケーションで指定のフォルダにキャプチャが行われます。

mobi11.jpg

ファイルについては、「Image_2010-12-04_09-06-58.jpg」のように日付+時刻形式のJPEGファイルが生成されます。

スクリプト名:Mobiolaで静止画像をキャプチャする
set dtPath to path to desktop
set dtPathPOSIX to POSIX path of dtPath –quoted form ofをつけるとアプリに拒否される

tell application “Mobiola WebCamera for iPhone”
  take snapshot to directory dtPathPOSIX
end tell

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

2010/12/04 Mobiolaで接続状態を取得する

Wifi経由でスマートフォンをMacの外部カメラとして使うアプリケーション「Mobiola」で、スマートフォン(iPhone)の接続状態を取得するAppleScriptです。

iPhoneが接続されている場合にはconnected属性にtrueが、接続されていない場合にはfalseが返ります。

iPhoneのバッテリー残量、どちらを向いているか、上下左右の角度、GPS経由で緯度/経度情報なども取得できるとすごそうですが、作者へのリクエストが通るかどうかは分りません。

スクリプト名:Mobiolaで接続状態を取得する
tell application “Mobiola WebCamera for iPhone”
  properties
end tell
–> {class:application, connected:true}

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

2010/12/04 スマートフォンをMacの外部Webカメラ化する「Mobiola」がv1.0.9でAppleScriptに対応

各種スマートフォンをWifi経由でMacの外部カメラ化できる「Mobiola」の、Mac用アプリケーション(映像/画像を受信するアプリ)がバージョン1.0.9でAppleScriptに対応。

実際に試してみました。

mobi1.jpg

サイトにでかでかと表示されている「Download」ボタンをクリックすると……スマートフォンの機種別にMac用アプリケーションも別れているらしく、Mac用アプリなのに使用スマートフォンの選択を求められます(分りにくいかも、、、)。

ここでiPhoneを選択すると……

mobi2.jpg

Mac用の「Mobiola WebCamera for iPhone」がダウンロードされます。インストーラーからインストールを実行。

mobi10.jpg

PC/Mac用のデスクトップアプリケーションは無料で、iPhoneなどのスマートフォン用アプリケーションを別途購入する必要があるようです。私が購入したときには230円で販売されていました。

iTunesでAppStoreにアクセスして、「Mobiola」をキーワードに検索すると見つけられます。

mobi3.jpg

まずは、Mac用アプリケーション「Mobiola WebCamera for iPhone」を起動。

mobi5.jpg

この状態では、まだiPhone側を認識していないため、映像は表示されません。

次いで、iPhone側のアプリケーション「WebCamera」を起動。

mobi4.jpg

iPhone側でWebCameraアプリケーションを起動すると、同一無線LANネットワーク内にいて、Mobiolaアプリケーションを起動しているMac/PCのうちどれを選択するかの選択を求められます。

mobi6.jpg

接続するマシンの名称をタップすると、選択したマシンとの間でコネクションが成立します。何回かエラーが出ることもありますが、しつこく繰り返すことでつながるようになったりします(割といいかげん)。

mobi7.jpg

これで、準備完了。iPhone 4からの映像がMacに届くようになります。

mobi9.jpg

この、Mac用Mobiola WebCamera for iPhoneがAppleScriptに対応したとのことなので、AppleScriptエディタで用語辞書の内容を確認。

mobi8.jpg

割と基礎的なコマンドしかありませんが、もともとMobiola自体にそれほど機能があるわけではないので、納得できるレベルだと思います。ひととおりAppleScriptを実際に書いて試してみましたが、AppleScriptの命令にもバグはないようです。