Archive for the 'WiFi' Category

2016/12/17 ネットワークデバイスからactiveなものだけをピックアップする

ネットワークデバイスから、activeなものだけをピックアップするAppleScriptです。

DHCPのネットワークアドレスのリフレッシュを試みたときに、接続中のネットワークデバイス名が必要になるので、試しに作ってみました。

試作品レベルなので、実用性についてはいろいろ問題があります。

まず、ネットワーク接続が切れているとまともに動かないので、ネットワーク接続確認は別途行なっておく必要があります。

さらに、複数のネットワークインタフェース(USB-Ethernetアダプタと本体内蔵WiFiとか)がアクティブになっている場合の結果が正しいことは保証しません(まだ、このあたりの詰めが必要)。

本プログラムでは、複数返ってきた場合には最初の項目を返してくるので、自分のマシン環境でも「これはいかがなものか」という状態です(USB-Ethernetアダプタで有線接続しつつ、位置情報を取得するためにWiFiをオンにすることがあるので)。

正規表現の鬼のような人だと、もう少し美しく短いプログラムにまとめられると思います。自分が短く書くために選んだ道具はtext item delimiters。

text item delimitersに複数(2よりも多い複数)の項目を指定できるので、あらかじめ各デバイス情報の1行目だけをピックアップしておき、これをtext item delimitersに指定してifconfigの処理結果をリスト化し、欠けた各デバイス情報の1行目を順次補っていくという、かなり頭のおかしなプログラムです。

AppleScript名:ネットワークデバイスからactiveなものだけをピックアップする
– Created 2016-12-17 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4367

set aDevRes to getActiveNetworkInterfaceDeviceName() of me
set aDevName to devName of aDevRes
–>  ”en3″

–ifconfigからactiveなデバイス名だけをピックアップする
on getActiveNetworkInterfaceDeviceName()
  set aRes to (do shell script “ifconfig”)
  
set aList to paragraphs of aRes
  
  
set devNameList to {}
  
repeat with i in aList
    set j to contents of i
    
set bRes to regexMatches(j, “^[^\\t]*”) of me
    
if bRes is not equal to {{“”}} then
      set the end of devNameList to contents of item 1 of item 1 of bRes
    end if
  end repeat
  
  
–Parse ifconfig results by device name list
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to devNameList –かなりトリッキー
  
set tmpList to text items of aRes
  
set AppleScript’s text item delimiters to curDelim
  
  
–initialize
  
set bList to rest of tmpList –remove blank item at top
  
set aCount to 1
  
set aResList to current application’s NSMutableArray’s alloc()’s init()
  
  
repeat with i in bList
    set aCon to contents of i
    
set aDat to contents of item aCount of devNameList
    
–Device Name
    
set aDevName to retStrFromTopToAstr(aDat, “:”) of me
    
    
set bCon to paragraphs 2 thru -1 of aCon
    
set cCon to aDat & retDelimedText(bCon, return) of me
    
    
–Activeなdeviceを抽出するための条件付け
    
set activeF1 to cCon contains “status: active”
    
set activeF2 to cCon does not contain “media: autoselect (<unknown type>)”
    
    
set aRec to (current application’s NSDictionary’s dictionaryWithDictionary:{devName:aDevName, isActive:(activeF1 and activeF2), ifconfigRes:cCon})
    (
aResList’s addObject:aRec)
    
set aCount to aCount + 1
  end repeat
  
  
set activeIF to filterRecListByLabel(aResList, “isActive == [c]%@”, {true}) of me
  
(*
  {{devName:”en3″, ifconfigRes:”en3: flags=8863 mtu 1500\toptions=4\r\tether XX:Xx:xX:Xx:XX:xX \r\tinet6 xxXX::XxX:XXXX:XXXx:Xxxx%en3 prefixlen 64 secured scopeid 0×4 \r\tinet 192.168.0.5 netmask 0xffffff00 broadcast 192.168.0.255\r\tinet6 XXXx:XX:XXxX:X:xxX:XXXX:XXXx:XXxX prefixlen 64 autoconf secured \r\tinet6 XXXx:XX:XXxX:X:XXx:XXXX:XXXx:xXXx prefixlen 64 autoconf temporary \r\tnd6 options=201 \r\tmedia: autoselect (100baseTX )\r\tstatus: active”, isActive:true}}
*)
  return first item of activeIF –Multiple Device Name list may return. Now, I choose one.
end getActiveNetworkInterfaceDeviceName

–http://qiita.com/szk-3/items/8bbe841eb0295caee6b0
on regexMatches(aText as text, pattern as text)
  set regularExpression to current application’s NSRegularExpression’s regularExpressionWithPattern:pattern options:0 |error|:(missing value)
  
set aString to current application’s NSString’s stringWithString:aText
  
set matches to regularExpression’s matchesInString:aString options:0 range:{location:0, |length|:aString’s |length|()}
  
set matchResultList to {}
  
repeat with match in matches
    set mRes to {}
    
repeat with i from 0 to (match’s numberOfRanges as integer) - 1
      set end of mRes to (aString’s substringWithRange:(match’s rangeAtIndex:i)) as text
    end repeat
    
set end of matchResultList to mRes
  end repeat
  
return matchResultList
end regexMatches

–リストを指定デリミタを入れつつテキスト化
on retDelimedText(aList, aDelim)
  set aText to “”
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retDelimedText

–先頭から指定キャラクタまでを抽出して返す
on retStrFromTopToAstr(aStr, aTarg)
  set aLen to length of aTarg
  
set anOffset to offset of aTarg in aStr
  
set bStr to text 1 thru (anOffset - aLen) of aStr
  
return bStr
end retStrFromTopToAstr

–リストに入れたレコードを、指定の属性ラベルの値で抽出(predicateとパラメータを分離)
on filterRecListByLabel(aRecList, aPredicate, aParam)
  set aArray to current application’s NSArray’s arrayWithArray:aRecList
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate argumentArray:aParam
  
set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate
  
set bList to filteredArray as list
  
return bList
end filterRecListByLabel

★Click Here to Open This Script 

2016/12/01 現在位置の住所を取得する

Location Helperを利用して(Assisted GPS)現在のGPS座標を取得し、GPS座標をもとに住所を取得するAppleScriptです。

実行時にはWiFiによるネットワーク接続を行なっていることが必要です。Location HelperはMac AppStoreで無料で配布されています。

現在位置の取得についてはAppleScriptだけで(Location Helperを使わずに)行うこともできるわけですが、手軽ということでいえば圧倒的にLocation Helperです。

ただし、Location HelperはGoogleのWebサービスを呼び出しているため、連続して何度も(短時間に)呼び出すと、ペナルティが発生する可能性があります。また、Location Helper自体を勝手に再配布できないため、個人的にはなるべくこれに依存しないように書いています(客先に納品するという概念が存在しない場所では関係のない話です)。

とはいうものの、緯度経度情報から住所を取得する「逆住所ジオコーディング」についてはLocation Helperに頼る必要があるので、とりあえず一番簡単な記述を行なってみました。

ちなみに、Location Helperは不可視プロセスで実行されるため、Dock上にアイコンが表示されたりしません。AppleScriptから呼び出すための専用ツールです。

問い合わせを行なった結果は、同じ住所情報が異なる表現方法で11パターンほど返ってきました。ここに掲載できないほどズバリの住所が返ってくるので、実際に役に立つものと思われます。

AppleScript名:現在位置の住所を取得する
– Created 2016-12-01 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
–http://piyocast.com/as/archives/4338

tell application “Location Helper”
  set {aLat, aLong} to get location coordinates
  
set aRes to reverse geocode location {aLat, aLong}
end tell

★Click Here to Open This Script 

2016/11/17 ぐるなびの「レストラン検索API」でレストランを現在位置から3km以内でキーワード検索する

ぐるなびの「レストラン検索API」で、レストランを現在位置(CoreLocation経由で取得)から3km以内でキーワードを指定して検索するAppleScriptです。

実行のためには、ぐるなびAPIの「新規アカウント発行」より申請を行い、アクセスキーを取得してください(申請無料)。取得したアクセスキーをプログラム中のretAccessKey()ハンドラ中に記述しておいてください。また、現在位置取得のためにWiFiをオンにして実行する必要があります。初回実行時になかなか位置取得機能がイネーブルにならずに焦りました。

ぐるなびでは、「レストラン検索API」「多言語版レストラン検索API」「応援口コミAPI」「エリアマスタ取得API」「都道府県マスタAPI」「エリアLマスタAPI」「エリアMマスタAPI」「エリアSマスタAPI」「大業態マスタ取得API」「小業態マスタ取得API」などのAPIを公開しているため、さまざまなアプリケーション上のデータと組み合わせて有効に利用できると思います。

下世話なところでは、Webサイトから検索すると無駄なデータが多い割に一度に検索できるデータ件数が少ないので、(Webブラウザではなく)スクリプトエディタ上でしぼりこみ検索を行っていたりします。

プログラムの難易度は高くないのですが、ふだんライブラリ化している部品を掲載のために1リスト中に展開しています。内容が素朴な割にプログラムが長くなってしまっていますが、AppleScriptObjCの宿命といったところでしょうか。

AppleScript名:ぐるなびの「レストラン検索API」でレストランを現在位置から3km以内でキーワード検索する
– Created 2016-10-29 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.5″
use scripting additions
use framework “Foundation”
use framework “CoreLocation”
–use curLocLib : script “curLocationLib”
–http://api.gnavi.co.jp/api/manual/restsearch/

–http://piyocast.com/as/archives/4320

–from curLocationLib
property locationManager : missing value
property curLatitude : 0
property curLongitude : 0
–from curLocationLib

set reqURLStr to “http://api.gnavi.co.jp/RestSearchAPI/20150630/”

–現在地の緯度、経度情報を取得する
set {aLat, aLong} to getCurrentLocation() of me
set aKey to retAccessKey() of me

–指定位置から3km以内の、キーワード”とんかつ”でヒットするレストランをピックアップ
set aRec to {keyid:aKey, |format|:“json”, latitude:aLat as string, longitude:aLong as string, range:“5″, freeword:“とんかつ”}
set aURL to retURLwithParams(reqURLStr, aRec) of me
set aRes to callRestGETAPIAndParseResults(aURL) of me
set aRESCode to responseCode of aRes
if aRESCode is not equal to 200 then return false
set aRESHeader to responseHeader of aRes
set aRESTres to (json of aRes)
–>  {@attributes:{api_version:”20150630″}, total_hit_count:”24″, page_offset:”1″, rest:{{name_kana:”アサノ”, address:”〒179-0074 東京都練馬区春日町6-12-5 “, party:{}, credit_card:{}, url:”http://r.gnavi.co.jp/nhefra550000/?ak=Q%2BN8L78dCT2RgZUYqtECBTRS3%2BEtZ0qY0cmsoQMxWqU%3D”, code:{category_name_l:{”和食”, {@attributes:{order:”1″}}}, areaname:”関東”, areacode:”AREA110″, prefname:”東京都”, prefcode:”PREF13″, areacode_s:”AREAS2225″, areaname_s:”光が丘”, category_code_s:{”RSFST01005″, {@attributes:{order:”1″}}}, category_code_l:{”RSFST01000″, {@attributes:{order:”1″}}}, category_name_s:{”とんかつ(トンカツ)”, {@attributes:{order:”1″}}}}, tel:”03-3999-4099″, parking_lots:{}, lunch:{}, fax:{}, @attributes:{order:”0″}, latitude:”35.747856″, category:”とんかつ”, url_mobile:”http://mobile.gnavi.co.jp/shop/5421186/?ak=Q%2BN8L78dCT2RgZUYqtECBTRS3%2BEtZ0qY0cmsoQMxWqU%3D”, name:”あさの “, holiday:{}, flags:{mobile_site:”1″, mobile_coupon:”0″, pc_coupon:”0″}, id:”5421186″, coupon_url:{mobile:{}, pc:{}}, access:{walk:”徒歩7″, line:”都営大江戸線(放射部)”, station_exit:”A3口”, note:{}, station:”練馬春日町駅”}, tel_sub:{}, longitude:”139.637081″, pr:{pr_long:{}, pr_short:{}}, budget:{}, e_money:{}, opentime:{}, update_date:”2015-10-14 14:14:02″, image_url:{shop_image1:{}, shop_image2:{}, qrcode:”http://r.gnst.jp/tool/qr/?id=5421186&q=6″}}, ….

set aNameRes to (aRESTres’s valueForKeyPath:“rest.name”) as list
–>  {”あさの “, “CoCo壱番屋 西武中村橋駅前通店”, “とんかつ かつ富士 “, “華屋与兵衛 豊島園店”, “華屋与兵衛 春日町店”, “とんかつ和幸 西武練馬駅店 “, “とんかつ和幸 IMA光が丘店 “, “松乃家 練馬店”, “とん陣 “, “よしだ “}

set aAddressRes to (aRESTres’s valueForKeyPath:“rest.address”) as list
–>  {”〒179-0074 東京都練馬区春日町6-12-5 “, “〒176-0023 東京都練馬区中村北3-22-10 友伸ビル1F”, “〒176-0021 東京都練馬区貫井3-14-5 “, “〒179-0085 東京都練馬区早宮4-39″, “〒179-0074 東京都練馬区春日町2-7-18″, “〒176-0001 東京都練馬区練馬1-3-5 西武池袋線練馬駅下 2F”, “〒179-0072 東京都練馬区光が丘5-1-1 光が丘IMA内 3F”, “〒176-0012 東京都練馬区豊玉北5-19-12″, “〒176-0012 東京都練馬区豊玉北5-18-7 “, “〒179-0073 東京都練馬区田柄1-4-24 “}

–GET methodのREST APIを呼ぶ
on callRestGETAPIAndParseResults(aURL)
  set aRequest to current application’s NSMutableURLRequest’s requestWithURL:(current application’s |NSURL|’s URLWithString:aURL)
  
  
aRequest’s setHTTPMethod:“GET”
  
aRequest’s setCachePolicy:(current application’s NSURLRequestReloadIgnoringLocalCacheData)
  
aRequest’s setHTTPShouldHandleCookies:false
  
aRequest’s setTimeoutInterval:60
  
aRequest’s setValue:“application/json” forHTTPHeaderField:“Accept”
  
  
set aRes to current application’s NSURLConnection’s sendSynchronousRequest:aRequest returningResponse:(reference) |error|:(missing value)
  
set resList to aRes as list
  
  
set bRes to contents of (first item of resList)
  
set resStr to current application’s NSString’s alloc()’s initWithData:bRes encoding:(current application’s NSUTF8StringEncoding)
  
  
set jsonString to current application’s NSString’s stringWithString:resStr
  
set jsonData to jsonString’s dataUsingEncoding:(current application’s NSUTF8StringEncoding)
  
set aJsonDict to current application’s NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value)
  
  
–Get Response Code & Header
  
set dRes to contents of second item of resList
  
if dRes is not equal to missing value then
    set resCode to (dRes’s statusCode()) as number
    
set resHeaders to (dRes’s allHeaderFields()) as record
  else
    set resCode to 0
    
set resHeaders to {}
  end if
  
  
return {json:aJsonDict, responseCode:resCode, responseHeader:resHeaders}
end callRestGETAPIAndParseResults

on retURLwithParams(aBaseURL, aRec)
  set aDic to current application’s NSMutableDictionary’s dictionaryWithDictionary:aRec
  
  
set aKeyList to (aDic’s allKeys()) as list
  
set aValList to (aDic’s allValues()) as list
  
set aLen to length of aKeyList
  
  
set qList to {}
  
repeat with i from 1 to aLen
    set aName to contents of item i of aKeyList
    
set aVal to contents of item i of aValList
    
set the end of qList to (current application’s NSURLQueryItem’s queryItemWithName:aName value:aVal)
  end repeat
  
  
set aComp to current application’s NSURLComponents’s alloc()’s initWithString:aBaseURL
  
aComp’s setQueryItems:qList
  
set aURL to (aComp’s |URL|()’s absoluteString()) as text
  
  
return aURL
end retURLwithParams

on retAccessKey()
  return “xxXxXXxxXxxxXxxXXxXXxXXxXxXXxxXX” –ぐるなびAPI アカウントのアクセスキー
end retAccessKey

on urlencodeStr(aStr)
  set aString to current application’s NSString’s stringWithString:aStr
  
set aString to (aString’s stringByAddingPercentEncodingWithAllowedCharacters:(current application’s NSCharacterSet’s URLQueryAllowedCharacterSet())) as text
  
return aString
end urlencodeStr

——————————————————–
— curLocationLib

on getCurrentLocation()
  
  
set locationManager to current application’s CLLocationManager’s alloc()’s init()
  
  
set locE to locationManager’s locationServicesEnabled()
  
if (locE as boolean) = true then
    locationManager’s setDelegate:me
    
locationManager’s setDesiredAccuracy:(current application’s kCLLocationAccuracyNearestTenMeters)
    
locationManager’s setDistanceFilter:500
    
locationManager’s startUpdatingLocation()
  else
    return false –error in init
  end if
  
  
set hitF to false
  
repeat 3000 times
    if {curLatitude, curLongitude} is not equal to {0, 0} then
      set hitF to true
      
exit repeat
    end if
    
delay 0.01
  end repeat
  
  
if hitF = false then return false
  
return {curLatitude, curLongitude}
  
end getCurrentLocation

on locationManager:manager didUpdateLocations:locations
  –Listing 1-3 Processing an incoming location event
  
set location to (locations’s lastObject())
  
set eventDate to (location’s timestamp())
  
set howRecent to (eventDate’s timeIntervalSinceNow())
  
  
–Calc ABS
  
set howRecent to howRecent as real
  
set howRecent to absNum(howRecent)
  
  
if howRecent < 15.0 then
    set alt to location’s altitude
    
set aSpeed to location’s speed
    
set aCourse to location’s course –North:0, East:90, South:180, West:270
    
set theDescription to location’s |description|()
    
set anNSScanner to current application’s NSScanner’s scannerWithString:theDescription
    
anNSScanner’s setCharactersToBeSkipped:(current application’s NSCharacterSet’s characterSetWithCharactersInString:“< ,")
    
set {theResult, aLat} to anNSScanner’s scanDouble:(reference)
    
set {theResult, aLng} to anNSScanner’s scanDouble:(reference)
    
    
copy {aLat, aLng} to {my curLatitude, my curLongitude}
  else
    locationManager’s stopUpdatingLocation()
  end if
end locationManager:didUpdateLocations:

on locationManager:anCLLocationManager didFailWithError:anNSError
  display dialog (anNSError’s localizedDescription() as text)
end locationManager:didFailWithError:

on absNum(aNum)
  if aNum > 0 then
    return aNum
  else
    return (aNum * -1)
  end if
end absNum

★Click Here to Open This Script 

2016/04/27 AppleScriptから電話をかける v2

同一WiFiネットワーク内にある自分の(Macとひもづけした)iPhoneを利用して、Macから電話をかけるAppleScriptの強化版です。

GUI Scriptingを利用しているため、実行前にあらかじめ「システム環境設定」>「セキュリティとプライバシー」>「アクセシビリティ」で本Scriptを実行するアプリケーション(おそらく、スクリプトエディタ)にコンピュータの(GUI側からの)制御を許可するよう設定しておく必要があります。

単にopen locationで電話番号を呼び出しただけでは、通知センターが表示するウィンドウ上の「発信」ボタンをクリックする必要がありました。それを野蛮なGUI ScriptingやCocoaの怪しい機能を活用して、「発信」ボタンをクリックさせることで自動発信を行わせるものです。

本来なら、「発信」ボタンに対してクリックイベントを送ることになりますが、この「発信」ボタンはどうもUI Element Inspectorで調べてもボタンとして認識されなかったため、ウィンドウの位置とサイズの情報だけ取得して、座標を計算してマウスカーソルを強制移動させ、強制的にクリックさせています。そのため、ユーザーがマウスカーソルを動かしている状態だとクリックできない可能性があります。

座標値の計算結果の照合のため、MacBook Pro Retina Mid 2012(Retina解像度)と、MacBook Air Mid 2011で動作確認を行ってあります。もっと遅いマシンで実行する場合には、冒頭のdelayの秒数を増やすなどして調整してください。

tel1.png
▲open locationの実行直後

tel21.png
▲2秒待ったあと、AppleScriptで「発信」ボタンをクリック。本当に発信されている(この電話番号はたぶん実在しないため、スクリーンショットを撮ったあとで慌てて止めています)

AppleScript名:電話番号を呼び出すv2
– Created 2016-04-27 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ApplicationServices”
use framework “Quartz”

set telNo to “0312345678″ –only numeric characters

open location “tel://” & telNo
delay 2

activate application “NotificationCenter”
tell application “System Events”
  tell process “通知センター” –This name is localized (Japanese)
    set wCount to count every window
    
if wCount is not equal to 1 then return –ウィンドウが表示されていなかった、あるいは多数のウィンドウが表示されていた
    
    
tell window 1
      set {xPos, yPos} to position
      
set {xSize, ySize} to size
    end tell
    
  end tell
end tell

clickAt(xPos + xSize - 20, yPos + 20) of me

–マウスカーソルの強制移動とクリック
on clickAt(newX, newY)
  set pt to current application’s CGPointZero
  
set x of pt to newX
  
set y of pt to newY
  
current application’s CGPostMouseEvent(pt, 1, 1, 1)
  
current application’s CGPostMouseEvent(pt, 1, 1, 0)
end clickAt

★Click Here to Open This Script 

2015/12/06 現在地点の緯度経度情報を取得する v2

Cocoaの機能を用いて、Macの現在位置の緯度経度情報を取得するAppleScriptです。実行時にWiFiがオンになっている必要があります。

だんだん、ASOCのScriptも書きこなれてきて、「この場合にはこう書く」的な方法論が蓄積され、便利に書けるようになってきました。処理系の方もCocoaを用いた記述に最適化されてきているのでしょうか(OS X 10.10ではForegroundで実行することを要求されましたが、OS X 10.11ではとくに文句も言われないので、、、)。

AppleScript名:GetCurrentLocation_ElCapitan v4
– Created 2015-03-04 by Takaaki Naganoya, Shane Stanley
– Modified 2015-12-06 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “CoreLocation”

property locationManager : missing value
property curLatitude : 0
property curLongitude : 0

set {aLat, aLong} to getCurrentGeoLocation() of me

on getCurrentGeoLocation()
  set locationManager to current application’s CLLocationManager’s alloc()’s init()
  
  
set locE to locationManager’s locationServicesEnabled()
  
if (locE as boolean) = true then
    locationManager’s setDelegate:me
    
locationManager’s setDesiredAccuracy:(current application’s kCLLocationAccuracyNearestTenMeters)
    
locationManager’s setDistanceFilter:500
    
locationManager’s startUpdatingLocation()
  else
    return false –error in init
  end if
  
  
set hitF to false
  
repeat 3000 times
    if {curLatitude, curLongitude} is not equal to {0, 0} then
      set hitF to true
      
exit repeat
    end if
    
delay 0.01
  end repeat
  
  
if hitF = false then return false
  
return {curLatitude, curLongitude}
end getCurrentGeoLocation

on locationManager:manager didUpdateLocations:locations
  set location to (locations’s lastObject())
  
set eventDate to (location’s timestamp())
  
set howRecent to (eventDate’s timeIntervalSinceNow())
  
set howRecent to howRecent as real
  
set howRecent to absNum(howRecent)
  
  
if howRecent < 15.0 then
    set alt to location’s altitude –>(NSNumber) 46.356517791748
    
set aSpeed to location’s speed –>(NSNumber) -1.0
    
set aCourse to location’s course –North:0, East:90, South:180, West:270
    
–>  (NSNumber) -1.0
    
set theDescription to location’s |description|()
    
–> (NSString) “< +35.xxxxx,+139.xxxxxx> +/- 65.00m (speed -1.00 mps / course -1.00) @ 2015/03/04 8時56分41秒 日本標準時”
    
set anNSScanner to current application’s NSScanner’s scannerWithString:theDescription
    
anNSScanner’s setCharactersToBeSkipped:(current application’s NSCharacterSet’s characterSetWithCharactersInString:“< ,")
    
set {theResult, aLat} to anNSScanner’s scanDouble:(reference)
    
set {theResult, aLng} to anNSScanner’s scanDouble:(reference)
    
copy {aLat, aLng} to {my curLatitude, my curLongitude}
  else
    locationManager’s stopUpdatingLocation()
  end if
  
end locationManager:didUpdateLocations:

on locationManager:anCLLocationManager didFailWithError:anNSError
  display dialog (anNSError’s localizedDescription() as text)
end locationManager:didFailWithError:

on absNum(aNum)
  if aNum > 0 then
    return aNum
  else
    return (aNum * -1)
  end if
end absNum

★Click Here to Open This Script 

2015/09/20 iPhoneから自宅/会社のMac上のAppleScriptを呼び出すEntangler

以前、Otto’s Antennaという名前で紹介したアプリケーションがバージョンアップして、「Entangler」という名前になっていました。

ちょうど、奥方様の実家のFAXの動作確認をする必要があったので、MacにFAXモデムをつないで、指定の電話番号にFAX出力するAppleScriptを書いて、iPhone上のEntanglerから呼び出してみました。

EntanglerというアプリケーションのMac版をMacにインストールし、iOS版をiPhoneにインストールして、iOS側からMac側の機能を呼び出すというのが、基本的な運用スタイルです(AppleWatch版もあるとは知りませんでした)。

前バージョンであるOtto’s Antennaよりもデザインがよくなって、iOSデバイスから操作してからの反応が速くなっていました。EntanglerはAppleScriptのほかにもAutomatorアクションやshell scriptなども実行できるそうです(AppleScriptしかテストしていないですけれども)。

Scriptを実行するMacはSleepせずに、ネットワーク(LAN/WiFi)に接続した状態にしておく必要があります。

print1.png
▲MacBook ProにUSRoboticsのUSB FAX Modem(OS X 10.10.5でも使える)をつなぎ、Sleepしないようにしてスタンバイ

print2.png
▲FAX送信元の電話番号に「ps-ax」と設定(最初に入っていた状態そのまま)

print3.png
▲Mac上のEntanglerにFAX送信するAppleScriptを登録

AppleScript名:print_a_fax
– Created 2015-09-20 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

property aPrinter : “USB Modem”
property targFaxNum : “03-XXXX-XXXX”

tell application “Safari”
  tell front document
    set aPrintSetting to {copies:1, starting page:1, ending page:9999, target printer:aPrinter, fax number:targFaxNum}
    
print with properties aPrintSetting without print dialog
  end tell
end tell

★Click Here to Open This Script 

print4.jpg
▲iPhone上のEntanglerを起動して、「print_a_fax」Scriptを実行

img_3127_resized.png
▲FAX受信中(「ps-ax」と通知が出ている)

63db476c-a6a1-4a82-8650-c79152570edd_resized.png
▲FAX受信中…

ptint0.png
▲Scriptの実行が終了すると、Macの通知センターに通知が表示される

bb1fb10f-5f86-43ed-bd72-fed8ec168e61_resized.png
▲確認のためにFAXで印刷したYahoo!のトップページ。印刷が途切れているのは、本来A4用紙が必要なところに無理やり別のサイズ(たぶんB5)の紙を突っ込んだため

2015/08/18 ASOCで無線LANの各種情報を取得する v2

Cocoaの機能を用いて無線LANの各種情報を取得するAppleScriptです。Shane Stanleyから「こんなやり方もあるよ」と教えてもらったものです。

CoreWLANまわりをいろいろ探ってみたものの、どーもCFSTR(ASOCで扱えない)を作成できないと呼べない機能などに阻まれ、あんまり凝ったことはできなさそうです。

[Update] WiFiがオフになっている場合への対処、およびv1のテストコードを統合しました。基本的にv1を短く書いたもので、機能は同じです。

AppleScript名:ASOCで無線LANの各種情報を取得する v2.1
– Created 2015-08-18 by Shane Stanley
– Modified 2015-08-18 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “CoreWLAN”

set allNames to current application’s CWInterface’s interfaceNames()’s allObjects()
–>  (NSArray) {”en0″} –@MacBook Pro Retina 2012

set hitF to false
repeat with i from 1 to allNames’s |count|()
  set aInterface to (current application’s CWInterface’s interfaceWithName:(allNames’s objectAtIndex:(i - 1)))
  
if aInterface’s serviceActive() as boolean then
    set hitF to true
    
exit repeat
  end if
end repeat

if hitF = false then return false –ActiveなWLANがない場合(WiFiをオフにしている)にはfalseをリターン

set aChan to aInterface’s wlanChannel()
–> (CWChannel) [channelNumber=52(5GHz), channelWidth={40MHz(+1)}, DFS]

set chanNumber to aChan’s channelNumber()
–> 52
set chanBand to aChan’s channelBand() – 0 = unknown, 1 = 2GHz, 2 = 5GHz
–> 2
set chanWidth to aChan’s channelWidth() – 0 = unknown, 1 = 20MHz, 2 = 40MHz
–> 2
set aTransRate to aInterface’s transmitRate()
–>  162.0
set aPower to aInterface’s transmitPower()
–>  0

set aChannnels to aInterface’s supportedWLANChannels()
–>  (NSSet) {(CWChannel) [channelNumber=1(2GHz), channelWidth={20MHz}, active], (CWChannel) [channelNumber=2(2GHz), channelWidth={20MHz}, active], ……………(CWChannel) [channelNumber=64(5GHz), channelWidth={20MHz}, DFS], (CWChannel) [channelNumber=136(5GHz), channelWidth={20MHz}, DFS]}

set aSSIDdata to aInterface’s ssidData()
–>  (NSData) <45787472 xxxxxxxx xxxxxxxx xxxx>

set aSSID to aInterface’s ssid() as text
–>  ”Extreme net_5G”

set aActive to aInterface’s serviceActive()
–>  true

set aSecurity to aInterface’s security()
–>  4

set aRSSIval to aInterface’s rssiValue()
–>  -72

set aPower to aInterface’s powerOn()
–>  true

set aNoise to aInterface’s noiseMeasurement()
–>  -91

set aIFname to aInterface’s interfaceName() as text
–>  ”en0″

set aMode to aInterface’s interfaceMode()
–>  1

set aHWAddress to aInterface’s hardwareAddress() as text
–>  ”b8:xx:xx:xx:xx:xx”–MAC Address

set aCountry to aInterface’s countryCode() as text
–>  ”JP”

set aConfig to aInterface’s configuration()
–>  (CWConfiguration)

set aCacheRes to aInterface’s cachedScanResults()
–>  (NSSet) {(CWNetwork) ……………… [channelNumber=11(2GHz), channelWidth={20MHz}], ibss=0]}

set aBSSID to aInterface’s bssid() as text
–>  ”10:XX:XX:XX:XX:XX”

set aPhyMode to aInterface’s activePHYMode()
–>  4

★Click Here to Open This Script 

2015/08/18 ASOCで無線LANの各種情報を取得する

Cocoaの機能を用いて無線LANの各種情報を取得するAppleScriptです。CoreWLAN.frameworkの機能(CWInterface)を使っています。

実行結果をみると、 transmitPower() だけ不思議な(アクティブになっているのに0が返ってくる)感じです。

AppleScript名:ASOCで無線LANの各種情報を取得する
– Created 2015-08-18 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “CoreWLAN”

set dName to getWiFiDeviceName()
–> “en0″ –(example on MacBook Pro Retina 2012)

set aInterface to current application’s CWInterface’s alloc()’s initWithInterfaceName:dName
–>(CWInterface) [interfaceName=en0]

set aChan to aInterface’s wlanChannel()
–>  (CWChannel) [channelNumber=52(5GHz), channelWidth={40MHz(+1)}, DFS]

set aTransRate to aInterface’s transmitRate()
–>  162.0

set aPower to aInterface’s transmitPower()
–>  0

set aChannnels to aInterface’s supportedWLANChannels()
–>  (NSSet) {(CWChannel) [channelNumber=1(2GHz), channelWidth={20MHz}, active], (CWChannel) [channelNumber=2(2GHz), channelWidth={20MHz}, active], ……………(CWChannel) [channelNumber=64(5GHz), channelWidth={20MHz}, DFS], (CWChannel) [channelNumber=136(5GHz), channelWidth={20MHz}, DFS]}

set aSSIDdata to aInterface’s ssidData()
–>  (NSData) <45787472 xxxxxxxx xxxxxxxx xxxx>

set aSSID to aInterface’s ssid() as text
–>  ”Extreme net_5G”

set aActive to aInterface’s serviceActive()
–>  true

set aSecurity to aInterface’s security()
–>  4

set aRSSIval to aInterface’s rssiValue()
–>  -72

set aPower to aInterface’s powerOn()
–>  true

set aNoise to aInterface’s noiseMeasurement()
–>  -91

set aIFname to aInterface’s interfaceName() as text
–>  ”en0″

set aMode to aInterface’s interfaceMode()
–>  1

set aHWAddress to aInterface’s hardwareAddress() as text
–>  ”b8:xx:xx:xx:xx:xx”–MAC Address

set aCountry to aInterface’s countryCode() as text
–>  ”JP”

set aConfig to aInterface’s configuration()
–>  (CWConfiguration)

set aCacheRes to aInterface’s cachedScanResults()
–>  (NSSet) {(CWNetwork) ……………… [channelNumber=11(2GHz), channelWidth={20MHz}], ibss=0]}

set aBSSID to aInterface’s bssid() as text
–>  ”10:XX:XX:XX:XX:XX”

set aPhyMode to aInterface’s activePHYMode()
–>  4

–指定ハードウェアポートのデバイス名を取得する
on getWiFiDeviceName()
  set v2 to system attribute “sys2″ –> 4
  
if v2 6 then
    set hardWareName to “AirPort” –Under Mac OS X 10.6.8
    
set aMesStr to “Current AirPort Network: “
  else if v2 7 then
    set hardWareName to “Wi-Fi” –Mac OS X 10.7 or later
    
set aMesStr to “Current Wi-Fi Network: “
  else
    display dialog “error”
  end if
  
  
set dName to getHardwareDeviceName(hardWareName) of me
  
return dName
end getWiFiDeviceName

–指定ハードウェアポートのデバイス名を取得する
on getHardwareDeviceName(targName)
  set sRes to do shell script “/usr/sbin/networksetup -listallhardwareports”
  
log sRes
  
set sList to paragraphs of sRes
  
set s1List to items 2 thru -1 of sList
  
  
set s2List to {}
  
repeat with i in s1List
    set j to contents of i
    
if j is equal to “VLAN Configurations” then
      exit repeat
    end if
    
set the end of s2List to j
  end repeat
  
  
–ネットワークポート関連のレコードを作成
  
set s3List to {}
  
set aLen to length of s2List
  
repeat with i from 1 to aLen by 4
    set a1Item to contents of item i of s2List
    
set a1Item to repChar(a1Item, “Hardware Port: “, “”) of me
    
    
set a2Item to contents of item (i + 1) of s2List
    
set a2Item to repChar(a2Item, “Device: “, “”) of me
    
    
set a3Item to contents of item (i + 2) of s2List
    
set a3Item to repChar(a3Item, “Ethernet Address: “, “”) of me
    
    
set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item}
  end repeat
  
  
repeat with i in s3List
    set j1 to hardwarePort of i
    
set j2 to device of i
    
if j1 is equal to targName then
      return j2
    end if
  end repeat
  
  
return “”
  
end getHardwareDeviceName

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

★Click Here to Open This Script 

2015/03/04 現在地点の緯度経度情報を取得する

This AppleScript get current location of your Mac by using CoreLocation. There is need to enable WiFi to get location using this AppleScript.

You can get altitude, timestamp, speed and course easily. But latitude and longitude were difficult to get.

I asked to Shane how to do this. His answer is “get description”.

You must execute this AppleScript in foreground. Original Script is made for a part of ASOC project on Xcode.

loc1.png
▲システム環境設定の「セキュリティとプライバシー」でScript EditorもしくはASObjC Explorer 4に位置情報の取得を許可しておく必要があります

loc2.png
▲許可しないとエラーが表示されます

本AppleScriptはお使いのMacの現在位置の緯度経度情報を取得するものです。CoreLocationを用いて、高度、タイムスタンプ、スピード、進行方向については容易に取得できました(位置情報を取得するためにWiFiをオンにしておく必要あり)。ただ、肝心の緯度経度情報だけはなかなか取得できず、Shaneに聞いてみたところ・・・「descriptionを取得しろ」とのこと(サンプルつきで)。

本AppleScriptの実行時には、foregroundで明示的に実行させる必要があります。オリジナルのScriptはASOC on Xcodeの一部として書いたもので、位置情報の取得/許可については本Scriptの方がうまくいっていない感じです(ASObjC Explorerがコケたりする)。

AppleScript名:GetCurrentLocation_Yosemite v3
– Created 2015-03-04 by Takaaki Naganoya, Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “CoreLocation”
use framework “AppKit”

property curLatitude : 0
property curLongitude : 0

on run
  startStandardUpdates()
end run

on startStandardUpdates()
  –Listing 1-1 Starting the standard location service
  
set locationManager to current application’s CLLocationManager’s alloc()’s init()
  
  
set locE to locationManager’s locationServicesEnabled()
  
if (locE as boolean) = true then
    locationManager’s setDelegate:me
    
locationManager’s setDesiredAccuracy:(current application’s kCLLocationAccuracyNearestTenMeters)
    
locationManager’s setDistanceFilter:500
    
locationManager’s startUpdatingLocation()
  end if
  
end startStandardUpdates

on locationManager:manager didUpdateLocations:locations
  
  
–Listing 1-3 Processing an incoming location event
  
set location to (locations’s lastObject())
  
set eventDate to (location’s timestamp())
  
set howRecent to (eventDate’s timeIntervalSinceNow())
  
  
–Calc ABS
  
set howRecent to howRecent as real
  
set howRecent to absNum(howRecent)
  
  
if howRecent < 15.0 then
    
    
set alt to location’s altitude
    
–>  (NSNumber) 46.356517791748
    
    
set aSpeed to location’s speed
    
–>  (NSNumber) -1.0
    
    
set aCourse to location’s course –North:0, East:90, South:180, West:270
    
–>  (NSNumber) -1.0
    
    
–By Shane Stanley
    
set theDescription to location’s |description|()
    
–> (NSString) “< +35.xxxxx,+139.xxxxxx> +/- 65.00m (speed -1.00 mps / course -1.00) @ 2015/03/04 8時56分41秒 日本標準時”
    
    
set anNSScanner to current application’s NSScanner’s scannerWithString:theDescription
    
anNSScanner’s setCharactersToBeSkipped:(current application’s NSCharacterSet’s characterSetWithCharactersInString:“< ,")
    
set {theResult, aLat} to anNSScanner’s scanDouble:(reference)
    
set {theResult, aLng} to anNSScanner’s scanDouble:(reference)
    
    
copy {aLat, aLng} to {my curLatitude, my curLongitude}
    
  else
    stopUpdatingLocation()
  end if
  
end locationManager:didUpdateLocations:

on locationManager:anCLLocationManager didFailWithError:anNSError
  display dialog (anNSError’s localizedDescription() as text)
end locationManager:didFailWithError:

on absNum(aNum)
  if aNum > 0 then
    return aNum
  else
    return (aNum * -1)
  end if
end absNum

★Click Here to Open This Script 

2014/03/31 現在見えているWiFiネットワークの情報を返す

現在Macから見えているWiFi(無線LAN)ネットワークの情報を取得するAppleScriptです。

ssid1.png

airportコマンドでいろいろ情報を取得しているので、WiFiネットワーク名(SSID_STR)以外にもいろいろ取得できます。

記述してテストしたのはSSD搭載のMacBook Pro Retinaだったのですが、airportコマンドで情報をplistに書き込ませたあとにSystem Eventsで読み込む際、ディスクの書き込みが終わる前に次の処理に進んでしまって「ファイルがない」と言われるケースがあったので、少々しつこくsyncコマンドを実行しています。

あとは、WiFiネットワークが見えたり見えなかったりで、実行するたびに毎回結果が微妙に異なったりするのは「お約束」です。

気のせいか、airportコマンドで-xでXML出力指定すると、(オプションによっては)通常出力される場合とデータ項目数が微妙に異なっている場合があるように見えます。「-I -x」と指定したときに、単に「-I」とは項目が違っており、びみょーにバグの香りが、、、、

スクリプト名:現在見えているWiFiネットワークの情報を返す

set aRec to getVisibleWiFiNetInfo() of me

set nList to {}

repeat with i in aRec
  set j to contents of SSID_STR of item 2 of i
  
set the end of nList to j
end repeat

nList
–> {”0622XXXXXXXX-X”, “ExtrXXXXXXX_XX”, “Buffalo-X-XXXX”, “0024XXXXXXXX”, “auhome_XXXXXX”, “BCW7XXXXXXXXXXX”, “0024XXXXXXXX-X”, “4CE6XXXXXXXX-X”, “BCW7XXX-XXXXX-X”, “4CE6XXXXXXXX”}

–現在見えているWiFiネットワークの情報を返す
on getVisibleWiFiNetInfo()
  
  
–一時ファイルのパス生成
  
set tPath to retTempPosixPath(“.plist”) of me
  
  
do shell script (“/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s -x > “ & tPath)
  
  
do shell script “sync” –たまにディスク書き込みが間に合わないケースがあったので、強制実行
  
do shell script “sync” –たまにディスク書き込みが間に合わないケースがあったので、強制実行
  
do shell script “sync” –たまにディスク書き込みが間に合わないケースがあったので、強制実行
  
  
set wifiRes to {}
  
  
tell application “System Events”
    set plif to property list file tPath
    
set pitm to every property list item of plif
    
repeat with p in pitm
      set end of wifiRes to {name, value} of p
    end repeat
  end tell
  
  
–一時ファイルの削除
  
do shell script “rm -f “ & tPath
  
  
return wifiRes
  
end getVisibleWiFiNetInfo

–テンポラリフォルダ内のテンポラリファイルを返す
on retTempPosixPath(aExt)
  set tPath to path to temporary items from user domain
  
set tpPath to POSIX path of tPath
  
set aFile to (do shell script “uuidgen”) & aExt
  
set tFile to tpPath & aFile
  
return tFile
end retTempPosixPath

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

2014/02/07 iPhoneからMacにAppleScriptを実行させるEventScripts+EventScripts Mobile

iOSデバイス+Mac上のAppleScript実行シリーズのしめくくりとして、Mousedown Softwareの「EventScripts」をご紹介します(現時点で、これとOtto’s Antennaの2つ以外には存在していません)。

es1.png

Mac用に「EventScripts」(原稿作成時のバージョンはv1.10 MacApp Storeで300円)というアプリがあって、マシンがシャットダウンするとかスリープするとか、Webブラウザが起動するとかいった(Mac上の)「イベント」を拾って、イベントごとに割り当てたAppleScriptを自動実行する機能を提供しています。

このEventScriptsに同じくMousedown SoftwareのiOS用(iPhone/iPad両用)リモートコントロールアプリ「EventScripts Mobile」(無料)を併用すると、iOSデバイスからWiFiネットワーク経由で、Mac上のAppleScriptをMacに実行させることができます。

es4.png

es2.png

ぱっと見、Bluetooth経由でiOSデバイス→MacにAppleScriptの実行要求をかけられそうに見えるのですが、それはできません。Bluetooth経由で3台までのデバイス(iOSでなくてもいいんでしょうね。マウスとかでも)を登録+監視することができ、Bluetoothデバイスの存在検出などのイベントをトリガーにしてAppleScriptの実行が行えるようになっています。

Otto’s Remoteと違うのは、WiFiネットワーク経由でiOSデバイス→MacへのAppleScript実行要求を出すことでしょうか。要求すると即座に実行されます。また、実行できたかどうかをiOSデバイス上で確認できます(緑で正常実行。赤だとエラー)。

img_2309.PNG

img_2310.PNG

ただし、実行結果をMacからiOSデバイスに返せないので、例によって別途さまざまなアプリケーションを経由して、実行結果を返してあげる必要がありそうです。

Otto’s RemoteがAutomator寄りだったのに対して、EventScriptsはAppleScript寄りです。というか、Automator Actionは実行できません。

EventScriptsに登録するAppleScriptは、

on run eventArgs
–なんか処理をする〜
end run

という書き方をします。このeventArgsの中にイベント発生情報が入っているようですが、どうなっているかドキュメントが存在していないので、実際に調べてみましょう。

Recordをまるごと文字化して、Console.appにsyslogとして出力することにします。

所要時間3分。あっという間にコピペで完成。

AppleScript名:イベントロガーだよ〜ん
on run eventArgs
  beep
  
–recordをstringsに変換
  
set aStr to recToString(eventArgs) of recToStrKit
  
  
logToSyslog(aStr) of me
  
end run

–Syslogにメッセージを出力する
on logToSyslog(theMes)
  do shell script “logger -s “ & quoted form of theMes
end logToSyslog

script recToStrKit
  
  
–エラートラップを使って、わざとエラーを発生させ、エラーメッセージからレコードをstringに変換する
  
on recToString(aRec)
    
    
–レコードを無理矢理stringにcastして、エラーメッセージを取得する
    
try
      set a to aRec as string –ここでエラー発生
    on error aMes
      set a to aMes
    end try
    
    
–エラーメッセージ文字列から、元のレコードの情報を組み立てる
    
set b to trimStrFromTo(a, “{”, “}”)
    
set b to “{” & b & “}”
    
    
return b
    
  end recToString
  
  
  
on trimStrFromTo(aStr, fromStr, toStr)
    –fromStrは前から探す
    
if fromStr is not equal to “” then
      set sPos to (offset of fromStr in aStr) + 1
    else
      set sPos to 1
    end if
    
    
–toStrは後ろから探す
    
if toStr is not equal to “” then
      set b to (reverse of characters of aStr) as string
      
set ePos to (offset of toStr in b)
      
set ePos to ((length of aStr) - ePos)
    else
      set ePos to length of aStr
    end if
    
set aRes to text sPos thru ePos of aStr
    
    
return aRes
    
  end trimStrFromTo
  
end script

★Click Here to Open This Script 

実際に、~/Library/Application Scripts/net.mousedown.EventScripts/フォルダに書いたAppleScriptを入れ、EventScriptsの画面上で「Add Script」で実行対象にします。その際に、応答するイベントを「EventScripts Mobile」にしておくとiOSデバイス上のEventScripts Mobileにスクリプト名が表示されます。

実行すると、ほぼ瞬間的に実行され、エラーが発生したかどうかがiOSデバイスの画面上で分ります。WiFiのネットワーク内にMacもiOSデバイスも共存できている環境であれば、Otto’s Antennaよりも使い勝手がよいと思われます。

iOS側からAppleScriptの実行をリクエストすると、Console.appの画面上に実行時のパラメータがそのまま文字で表示されます。

es5.png

Mobileからの実行イベントでは、scriptPathとtriggerの2つのパラメータが受け渡されるようです。scriptPathには実行したAppleScriptのPOSIX pathが、triggerには”EventScripts Mobile”が入っていました。

案外あっさりしている印象ですが、Mousedown SoftwareがWeb上で配布しているサンプルAppleScriptを見ると、イベントごとにAppleScriptに渡されるパラメータ(レコード)の内容が異なるようで、サンプル「Location Sample Script.scpt」では位置情報がAppleScript側に渡されることがうかがえます。

スクリプト名:Location Sample Script.scpt
on run eventArgs
  
  
– eventArgs is a record of with details of the action passed by the EventScripts application
  
– the properties passed depend on the action, however there will always be a trigger property
  
– which describes the event that triggered the script
  
  
set triggerAction to {trigger of eventArgs}
  
  
set latitude to {latitude of eventArgs} as string
  
set longitude to {longitude of eventArgs} as string
  
set previousLatitude to {previousLatitude of eventArgs}
  
set previousLongitude to {previousLongitude of eventArgs}
  
  
tell application “Finder”
    activate
    
display dialog “Your new location: “ & latitude & “, “ & longitude & return & ¬
      “Your old location: “ & previousLatitude & “, “ & previousLongitude with title triggerAction giving up after 2
  end tell
  
end run

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

どっちがいいの?

一長一短あり、EventScriptsとOtto’s Antennaのどちらをおすすめするかは、用途によると思われます。

es9.png

EventScriptは、自宅などWiFiネットワーク内にiOSデバイスもMacも共存できる場合がおすすめです。会社では、iOSデバイスのWiFiへのアクセスを禁止しているところが多いようなので、なかなか利用できないでしょう。

Otto’s Antennaは場所を選ばずに利用できるため、けっこう無茶な使い方ができそうです。ただ、リクエストしてから実行されるまでに時間がかかるのがデメリット。

こうした「iOSからAppleScript実行」系のソフトウェアが充実してくることで、さらに便利かつ強力なソリューションを構築できるようになると思われます。それぞれのソフトウェアの作者が開発を継続できるように、ぜひ購入して試してみてください。

2014/02/02 iOSデバイスからMac上のScriptを実行するOtto’s Remote & Otto’s Antenna

Otto’s Remote & Antennaは、iOSデバイス上のOtto’s Remoteアプリケーション(100円)から、Mac上のOtto’s Antenna(記事執筆時点では200円→無料)に指令を送って、Mac上のAutomatorアクション、Shell Script、AppleScriptをMac上で実行させるソリューションです。

Otto’s RemoteはiPhoneでもiPadでも実行できるUniversalアプリですが、このアプリの性格を考えれば絶対にiPhoneで使うべきです。

AppleScript使いにとって本ソフトは、用途がありすぎてとても書き切れないほどの可能性があるので、かなりていねいにチェックしたいところです。

本Blogの性格上、Automatorとshell scriptは完全にスルーして、AppleScriptにのみフォーカスしてレビューします。

レビュー時のバージョン:
 Otto’s Antenna: ver 1.3
 Otto’s Remote: ver 1.3.2

 → Otto’s AntennaのWeb

インストールとセットアップ

最初に、iOSデバイス(iOS 6.1以降)にOtto’s Remoteを、Mac(OS X 10.8以降)にOtto’s Antennaをインストールする必要があります。また、iOSデバイスとMacの両方とも同一のApple IDを使っている必要があります。これは、Otto’s Remote/AntennaがiCloudの通知システムを利用しているためです。

同一のApple IDを使っていれば、複数のMac上のAppleScriptの実行をiPhone側から行うことも可能です。

Mac側のScriptフォルダ(~/Library/Application Scripts/com.amolloy.ottoantenna/)に入れておいたAppleScriptが、iOSデバイス側のOtto’s Remoteの画面上に表示されます。これを選択して実行することになります。

otto0.png

セットアップで悩んだり、ハマったりすることはとくにありませんでした。

さあ実行だ!

iOS上のOtto’s Remote上のScript名を(例:say Hello)タップすると、

「Are you sure you wish to perform say Hello?」

と聞かれます。選択肢は、

Yes, this time.
Yes, every time.
Yes, for all actions.
No, thank you

の4つ。

毎回実行するとか、他のアクション(script)実行時に必ず実行するとかいうのは、とっても危険な香りがする(解除方法が提供されていない)ので、正直なところ最初の「Yes, this time」と最後の「No, thank you」以外の選択肢は使わないはずです。

まずは、小手調べということで……英語のファイル名のAppleScriptをMac側のScriptフォルダに入れてiPhone側から実行。iPhoneがWiFi環境にいても、LTEのネットワーク側にいても、だいたい10秒前後でMacに指令が届いて実行されました。

実行対象のMacがスリープ状態(たとえば、MacBook Airをクローズした状態)だと、指定のAppleScriptは実行されません。「システム環境設定」のPower Napをオンにした状態でも、Scriptは実行されませんでした。これは、Otto’s Antenna側がPower Nap実行のためのサービスを実装していないことが考えられます。

【重要】Otto’s Antennaを運用させる際には、Macの電源は入れたままにしておく必要があります。

日本語にちゃんと対応しているかな?

次に、Mac側のScriptフォルダに「こんにちは」と日本語のファイル名を付けたAppleScriptを置き、iOSデバイス側でブラウズすると……「こんにちは」および「こんにちは〜」と存在しないファイルが見えてしまいます(やっぱり日本語ではテストしてないだろうな〜)。

otto1.png

img_2298.PNG

「こんにちは」Scriptは実行できましたが、「こんにちは~」Scriptはそもそも存在しないので、実行できません。

この問題は、どうやらMac側のOtto’s Antennaの問題らしく、Mac上でステータスバーのメニューから「こんにちは〜」を選択して「Delete」を実行すると、Mac側のメニューにも出なくなりますし、iOS側にも表示されなくなります。

日本語の「絵文字」(Japanese Mobile Emoji Characters)には対応しており、MacのFinder上で絵文字を入力してファイル名に絵文字を入れると、Mac上のOtto’s Antennaのメニュー上にも表示されますし、iOS上のOtto’s Remote上にも表示されます。

otto4.png

img_2299.PNG

日本語ファイル名にかぎらず、名称変更したり元のScriptが見つからなくなると、メニュー上では赤く表示されたままメニューに残ります(赤く表示するぐらいなら、メニュー上から削除したほうが)。

本気でためしてみよう!

階層構造実験

まずは、Mac側のScriptフォルダにフォルダを作成して、Otto’s Antennaがフォルダの階層構造を認識するかどうかという実験。

ためしてみると、きちんとOtto’s Antennaがフォルダ内に格納したScriptを検出しました。これについては合格点です。

AppleScriptファイル形式実験

次に、どのような形式のAppleScriptを認識・実行してくれるかどうかの実験です。目下、OS X 10.9環境の「AppleScriptエディタ」では、

 通常AppleScript:拡張子「.scpt」
 通常AppleScriptテキスト:拡張子「.applescript」
 通常AppleScriptスクリプトバンドル:拡張子「.scptd」
 AppleScriptアプレット:拡張子「.app」
 AppleScriptObjCアプレット:拡張子「.app」

を作成可能です。Otto’s Antennaが、これらのうちどこまでを「AppleScript」として扱うのかを確認しておく必要があります。

 通常AppleScript:拡張子「.scpt」→実行可
 通常AppleScriptテキスト:拡張子「.applescript」→実行可
 通常AppleScriptスクリプトバンドル:拡張子「.scptd」→実行可
 AppleScriptアプレット:拡張子「.app」→Otto’s Antennaに認識されず
 AppleScriptObjCアプレット:拡張子「.app」→Otto’s Antennaに認識されず

できることとできないことを、明確にしておくことは重要です。

位置情報をトリガーにしてAppleScript実行!

現行バージョンでは、iOSデバイス上で位置情報(Geo Location)を取得して、そこに到着するか出発するかを実行トリガとして使用できます。

バッテリーが少なくなってきたら実行とか、iOSデバイスの温度センサーが設定温度よりも低い/高い場合には実行とか、メールで呪いのメッセージが送られてきたら実行とかいう機能はありません。iOSデバイスを振ると実行とか、音声認識で実行とかはできてもいいような気もします。

実行トリガを設定できるのはよいのですが……実行時の結果をiOS上のOtto’s Remote側に返せないので、そのあたりが気になります。

また、Otto’s RemoteをiOS上でバックグラウンドに回した状態でこれを実行してくれるでしょうか?

そこで、これらを試すべく2本のAppleScriptを書き、Mac上のOtto’s Antennaに登録して実験してみました。

otto10.png

スクリプト名:メモに外出時刻を書く
–タイムスタンプからユニークなタイトルを作成
set aTitle to “てすと” & (do shell script “date +%Y%m%d%H%M%S”)
set aBody to “ぴよまるさんが、家を出ました。
Piyomaru left home.”

makeNewNoteOnNotes(aTitle, aBody, “iCloud”) of me

on makeNewNoteOnNotes(aTitle, aBody, anAccountName)
  set noteHTMLText to

"

& (aBody as Unicode text) & “”
  
  
tell application “Notes”
    –activate
    
tell account anAccountName
      make new note at folder “Notes” with properties {name:aTitle, body:noteHTMLText}
    end tell
  end tell
end makeNewNoteOnNotes

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

スクリプト名:メモに帰宅時刻を書く
–タイムスタンプからユニークなタイトルを作成
set aTitle to “てすと” & (do shell script “date +%Y%m%d%H%M%S”)
set aBody to “ぴよまるさんが、家に帰りました。
Piyomaru return to home.”

makeNewNoteOnNotes(aTitle, aBody, “iCloud”) of me

on makeNewNoteOnNotes(aTitle, aBody, anAccountName)
  set noteHTMLText to

"

& (aBody as Unicode text) & “”
  
  
tell application “Notes”
    –activate
    
tell account anAccountName
      make new note at folder “Notes” with properties {name:aTitle, body:noteHTMLText}
    end tell
  end tell
end makeNewNoteOnNotes

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

登録したGPS位置情報から離れる(departing)/到着する(arriving)とAppleScriptの実行リクエストを行う「Geo Trigger」をそれぞれ登録。

img_2302.PNG

iPhoneの画面をオフにした状態でカバンに入れて自転車で移動。

5Kmほど離れた目的地に到着して、カバンからiPhoneを出して確認すると、通知センターに、

「Fired: メモに外出時刻を書く on MBPretina」

と表示がありました。成功です。画面表示時ではなく、はるかに前に実行されたことが確認できました。

img_2300.PNG

メモを見ると、「てすと20140202141308」のエントリが作成されており、

「ぴよまるさんが、家を出ました。
Piyomaru left home.」

と記入されていました。

帰宅時に実行されるScriptも無事動作していました。

ただ、出かける際にほぼフル充電だったバッテリーは4時間後の帰宅時には45%まで減っており、iPhone上でOtto’s Remoteを(GPS情報をトリガにするリクエストを登録して)実行させたまま1日運用するのはちょっと心もとないですね。真剣に位置情報をトリガにしたScriptを運用するのであれば、外部バッテリーの併用は欠かせないことでしょう。

Otto’s Antenna&Otto’s Remoteに必要不可欠な機能

まず、AppleScript(だけ)にパラメータを渡せないのはダメです。ダメを通り越してありえないです。早急に対応していただく必要があると思います。Otto’s Antennaが日本語の不必要なファイルをリストアップしてしまう問題も解消されるべきです。

あと、Automator Action/Shell Script/AppleScript全般に、実行結果を返せないのと、実行されたかどうかの確認ができないのもダメです。

ただし、緊急避難的にこれらの問題を解決する方法は存在しています。メモやリマインダー経由でiOSデバイスとMac間の情報のやりとりを行うというものです(もちろん、メールやメッセージ(iChat)で行ってもかまいません)。Otto’s Antenna&Remoteに多くを期待しないとそういう対応も行えます…………が、ここは少しOtto’s Antenna+Remoteでなんとかしていただきたいところです。

あとは、AppleScript側で受信できる追加パラメータとして、iOSデバイス側の実行タイムスタンプと位置情報(緯度、経度情報)が欲しいところです。

結論:こいつは使える!

本当に使えるのか半信半疑でしたが、たしかにこれは使えます。もっと注目されるべきアプリといえるでしょう。

iPhoneからMac上のAppleScriptの実行をキックできると、いろいろな処理が考えられます。

簡単なところでは、出力に時間のかかる(=出力枚数が多いので、給紙が必要+他の印刷物の状況を見る必要がある)書類の印刷を共用のカラーレーザープリンターで行う際に、プリンターの前まで行って、iPhoneから自分のデスクのMacのプリントアウトのAppleScriptを実行するとかいうのは、実際に実用性のある用途だと思います。

Mac側とiPhone側でCloudを介してデータを共用しているタイプのアプリケーションは、両者のI/O用に使えます。DropBoxなどでファイルをMacからiPhoneに渡すという処理も簡単ですし、Evernote経由でI/Oを行ってもよいと思います。

処理結果をMailやTwitter、WordPress経由で返すのも当然アリですが……データ転送量にしたがって課金されるタイプのサービスは避けたいところです。

2013/05/16 メニューバーにWiFiの状態を表示する

メニューバーにWiFilの状態を表示する(Menu Extraをオープンする)AppleScriptです。

wifi.png

メニューバーにWiFiの状態表示インジケータが表示されていなかった場合に、本Scriptを実行すると表示状態になります。

スクリプト名:メニューバーにバッテリーの状態を表示する
do shell script “open /System/Library/CoreServices/Menu\\ Extras/Battery.menu”

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

2012/06/03 無線LANネットワークを指定して接続する

指定の無線LANネットワークを指定して接続するAppleScriptです。

無線LAN経由でネットワーク接続しているMacをスリープさせておいて、指定時刻にスリープ解除。OSの機能で無線LAN接続が復帰するのが普通ですが、復帰しないケースもないことはありません。とくに、Mac OS Xのメジャーアップデートを行ってしばらくして、マイナーアップデートを経た後でこのような現象に直面することもままあります。

スリープ解除後に無線LANのネットワーク接続が復活していない場合には、あらかじめ記憶していたネットワークにAppleScriptで明示的にネットワーク接続を指定する必要が出てきます。そのために作成しました。

スクリプト名:無線LANネットワークを指定する
set netWorkName to “Extreme net_5G” –ネットワーク名
set netWorkPass to “XXXXXXX” –パスワード
set netWorkENcryption to “WPA2″ –ネットワーク暗号方式

setAirportNetwork(netWorkName, netWorkPass, netWorkENcryption) of me

–指定のWi-Fiネットワークに接続する
on setAirportNetwork(aNetworkName, aPassword, aEncType)
  
  
set v2 to system attribute “sys2″ –> 4
  
if v2 6 then
    set hardWareName to “AirPort” –Mac OS X 10.6
    
set aMesStr to “Current AirPort Network: “
  else if v2 7 then
    set hardWareName to “Wi-Fi” –Mac OS X 10.7
    
set aMesStr to “Current Wi-Fi Network: “
  end if
  
  
set dName to getHardwareDeviceName(hardWareName) of me
  
set sText to “/usr/sbin/networksetup -setairportnetwork “ & dName & ” “ & quoted form of aNetworkName & ” “ & aPassword & ” “ & aEncType
  
  
try
    do shell script sText
  on error errorMessage
    return errorMessage
  end try
  
end setAirportNetwork

–指定ハードウェアポートのデバイス名を取得する
on getHardwareDeviceName(targName)
  set sRes to do shell script “/usr/sbin/networksetup -listallhardwareports”
  
set sList to paragraphs of sRes
  
set s1List to items 2 thru -1 of sList
  
  
set s2List to {}
  
repeat with i in s1List
    set j to contents of i
    
if j is equal to “VLAN Configurations” then
      exit repeat
    end if
    
set the end of s2List to j
  end repeat
  
  
–ネットワークポート関連のレコードを作成
  
set s3List to {}
  
set aLen to length of s2List
  
repeat with i from 1 to aLen by 4
    set a1Item to contents of item i of s2List
    
set a1Item to repChar(a1Item, “Hardware Port: “, “”) of me
    
    
set a2Item to contents of item (i + 1) of s2List
    
set a2Item to repChar(a2Item, “Device: “, “”) of me
    
    
set a3Item to contents of item (i + 2) of s2List
    
set a3Item to repChar(a3Item, “Ethernet Address: “, “”) of me
    
    
set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item}
  end repeat
  
  
repeat with i in s3List
    set j1 to hardwarePort of i
    
set j2 to device of i
    
if j1 is equal to targName then
      return j2
    end if
  end repeat
  
  
return “”
  
end getHardwareDeviceName

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

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

2012/06/03 無線LANネットワーク名称を取得する v1.1

現在接続中の無線LANネットワークの名称を取得するAppleScriptです。

無線LAN接続中の場合には名称文字列を、未接続の場合にはヌルを返します。

air_port_names.png

▲実行時には「Extreme net」が取得される

スクリプト名:無線LANネットワーク名称を取得する v1.1
set aRes to getAirportNetworkName() of me

–無線LANで接続中のネットワーク名称を取得
on getAirportNetworkName()
  
  
set v2 to system attribute “sys2″ –> 4
  
if v2 6 then
    set hardWareName to “AirPort” –Mac OS X 10.6
    
set aMesStr to “Current AirPort Network: “
  else if v2 7 then
    set hardWareName to “Wi-Fi” –Mac OS X 10.7
    
set aMesStr to “Current Wi-Fi Network: “
  end if
  
  
set dName to getHardwareDeviceName(hardWareName) of me
  
set sText to “/usr/sbin/networksetup -getairportnetwork “ & dName
  
  
set sRes to do shell script sText
  
  
if sRes does not start with “You are not associated with “ then
    set sRes2 to repChar(sRes, aMesStr, “”) of me
  else
    set sRes2 to “”
  end if
  
  
return sRes2
  
end getAirportNetworkName

–指定ハードウェアポートのデバイス名を取得する
on getHardwareDeviceName(targName)
  set sRes to do shell script “/usr/sbin/networksetup -listallhardwareports”
  
set sList to paragraphs of sRes
  
set s1List to items 2 thru -1 of sList
  
  
set s2List to {}
  
repeat with i in s1List
    set j to contents of i
    
if j is equal to “VLAN Configurations” then
      exit repeat
    end if
    
set the end of s2List to j
  end repeat
  
  
–ネットワークポート関連のレコードを作成
  
set s3List to {}
  
set aLen to length of s2List
  
repeat with i from 1 to aLen by 4
    set a1Item to contents of item i of s2List
    
set a1Item to repChar(a1Item, “Hardware Port: “, “”) of me
    
    
set a2Item to contents of item (i + 1) of s2List
    
set a2Item to repChar(a2Item, “Device: “, “”) of me
    
    
set a3Item to contents of item (i + 2) of s2List
    
set a3Item to repChar(a3Item, “Ethernet Address: “, “”) of me
    
    
set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item}
  end repeat
  
  
repeat with i in s3List
    set j1 to hardwarePort of i
    
set j2 to device of i
    
if j1 is equal to targName then
      return j2
    end if
  end repeat
  
  
return “”
  
end getHardwareDeviceName

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

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

2012/06/03 無線LANの電源のONOFF

Macの無線LANのハードウェアの電源ON/OFFを切り替えるAppleScriptです。

無線LAN(AirPort/AirMac)のハードウェアが存在しているMac上で実行することが条件です。

trueを指定すると無線LANの電源オン、falseを指定すると無線LANの電源オフになります。

airport_on.png
▲無線LAN電源オン

airport_off.png
▲無線LAN電源オフ

スクリプト名:無線LANの電源のONOFF
setAirportPower(true) of me –パワーオン
–setAirportPower(false) of me –パワーオフ

–無線LANの電源のON/OFF
on setAirportPower(aStatus)
  –パラメータのエラーチェック
  
if aStatus is not in {true, false} then return
  
  
set v2 to system attribute “sys2″ –> 4
  
if v2 6 then
    set hardWareName to “AirPort” –Mac OS X 10.6
  else if v2 7 then
    set hardWareName to “Wi-Fi” –Mac OS X 10.7
  end if
  
  
set dName to getHardwareDeviceName(hardWareName) of me
  
if aStatus = true then
    set statStr to “on”
  else
    set statStr to “off”
  end if
  
set sText to “/usr/sbin/networksetup -setairportpower “ & dName & ” “ & statStr
  
  
set sRes to do shell script sText
  
end setAirportPower

–指定ハードウェアポートのデバイス名を取得する
on getHardwareDeviceName(targName)
  set sRes to do shell script “/usr/sbin/networksetup -listallhardwareports”
  
set sList to paragraphs of sRes
  
set s1List to items 2 thru -1 of sList
  
  
set s2List to {}
  
repeat with i in s1List
    set j to contents of i
    
if j is equal to “VLAN Configurations” then
      exit repeat
    end if
    
set the end of s2List to j
  end repeat
  
  
–ネットワークポート関連のレコードを作成
  
set s3List to {}
  
set aLen to length of s2List
  
repeat with i from 1 to aLen by 4
    set a1Item to contents of item i of s2List
    
set a1Item to repChar(a1Item, “Hardware Port: “, “”) of me
    
    
set a2Item to contents of item (i + 1) of s2List
    
set a2Item to repChar(a2Item, “Device: “, “”) of me
    
    
set a3Item to contents of item (i + 2) of s2List
    
set a3Item to repChar(a3Item, “Ethernet Address: “, “”) of me
    
    
set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item}
  end repeat
  
  
repeat with i in s3List
    set j1 to hardwarePort of i
    
set j2 to device of i
    
if j1 is equal to targName then
      return j2
    end if
  end repeat
  
  
return “”
  
end getHardwareDeviceName

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

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

2012/06/03 指定ハードウェアポートのデバイス名を取得する v1.1

ネットワーク関連の指定ハードウェアポートのデバイス名を取得するAppleScriptです。

指定ハードウェアポートといっても、無線LAN(AirPort……日本国内ではAirMac)のデバイス名称を調べるためだけに作成したものです。それだけではナニなので、汎用的にEhternetやBluetoothなど他のポート名を指定しても対応できるようになっています。

ただし、指定するハードウェアポート名が

Mac OS X 10.6:AirPort
Mac OS X 10.7:Wi-Fi

と、OSバージョンによって異なるので、その点に注意が必要です。

スクリプト名:指定ハードウェアポートのデバイス名を取得する v1.1
set dName to getHardwareDeviceName(“AirPort”) of me –Mac OS X 10.6
–> “en1″ (MacBook Pro Normal Configuration)
–> “en0″ (MacBook Air Normal Configuration)

set dName to getHardwareDeviceName(“Wi-Fi”) of me –Mac OS X 10.7
–> “en1″ (MacBook Pro Normal Configuration)
–> “en0″ (MacBook Air Normal Configuration)

–指定ハードウェアポートのデバイス名を取得する
on getHardwareDeviceName(targName)
  set sRes to do shell script “/usr/sbin/networksetup -listallhardwareports”
  
set sList to paragraphs of sRes
  
set s1List to items 2 thru -1 of sList
  
  
set s2List to {}
  
repeat with i in s1List
    set j to contents of i
    
if j is equal to “VLAN Configurations” then
      exit repeat
    end if
    
set the end of s2List to j
  end repeat
  
  
–ネットワークポート関連のレコードを作成
  
set s3List to {}
  
set aLen to length of s2List
  
repeat with i from 1 to aLen by 4
    set a1Item to contents of item i of s2List
    
set a1Item to repChar(a1Item, “Hardware Port: “, “”) of me
    
    
set a2Item to contents of item (i + 1) of s2List
    
set a2Item to repChar(a2Item, “Device: “, “”) of me
    
    
set a3Item to contents of item (i + 2) of s2List
    
set a3Item to repChar(a3Item, “Ethernet Address: “, “”) of me
    
    
set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item}
  end repeat
  
  
repeat with i in s3List
    set j1 to hardwarePort of i
    
set j2 to device of i
    
if j1 is equal to targName then
      return j2
    end if
  end repeat
  
  
return “”
  
end getHardwareDeviceName

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

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