Archive for the 'システム情報取得(sys info)' Category

2016/11/08 macOS Sierraで実行できなくなった処理

macOS Sierra(10.12)になって、実行できなくなった、実行しても指定値を無視される処理が出てきました。

具体的にいうと、System Events.appでセキュリティをゆるく設定するための処理を受け付けなくなりました。

sys_event_dict.jpg

スリープからの復帰(wake)時にパスワードを要求しない、という設定を行っても無視されるようになりました。

AppleScript名:Sierraで実行できなくなった処理1
–http://piyocast.com/as/archives/4308
–macOS Sierraで実行できなくなった命令
tell application “System Events”
  tell security preferences
    set require password to wake to false
    
set aRes to (require password to wake)
    
–> true
  end tell
end tell

★Click Here to Open This Script 

システム環境設定の「セキュリティとプライバシー」で、設定内容を変更するさいにパスワードを要求するかどうかの設定で、true(要求する)と指定してもfalse(要求しない)という結果が返ってきます。かならずパスワードは要求させる、という意図はわかるのですが、こちらは返ってきている値が間違っています(かならずtrueでないとおかしい)。

AppleScript名:Sierraで実行できなくなった処理2
–http://piyocast.com/as/archives/4308
–macOS Sierraで実行できなくなった命令
tell application “System Events”
  tell security preferences
    set require password to unlock to true
    
set aRes to (require password to unlock)
    
–> false
  end tell
end tell

★Click Here to Open This Script 

2016/05/31 デスクトップピクチャを白いピクチャとトグルで差し替え

ソフトウェアの説明書などを作る際に、ウィンドウやメニューなどの画面のスクリーンショットを撮ることが多々あります。そのような場合に、一時的にデスクトップピクチャを白い色にしておきたいことがあります。通常デスクトップピクチャと白いピクチャの切り替えを行うAppleScriptです。

普通にスクリプトエディタで本スクリプトをオープンしておいて、実行するたびにトグルで状態が切り替わります。

img_3596_resized.png
▲通常のデスクトップピクチャの表示状態

img_3597_resized.png
▲スクリーンショットを撮るために背景を白い画像に設定した状態

AppleScript名:デスクトップピクチャを白いピクチャとトグルで差し替え
– Created 2016-05-31 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

property aSwitch : false
property desktopPictures : {}
property aColpath : “”

if aSwitch = false then
  –デスクトップを白くする
  
set desktopPictures to getDesktopPicturePathList() of me
  
–白い画像を作成してデスクトップピクチャに設定
  
set aColpath to makeColordImageToTmp(255, 255, 255, 255) of me –R,G,B,A(それぞれ 0〜255)
  
setDesktopPicture(aColpath) of me
  
set aSwitch to true
else
  –保存しておいたDesktop Pictureのリストを戻す
  
setDesktopPicturePathList(desktopPictures) of me
  
do shell script “rm -f “ & quoted form of aColpath
  
set aSwitch to false
end if

–デスクトップピクチャの状態を復帰する
on setDesktopPicturePathList(aliasList)
  if aliasList = {} then
    display notification “保存しておいたデスクトップピクチャのリストが空になっています”
    
return
  end if
  
  
tell application “System Events”
    set dCount to count every desktop
    
repeat with i from 1 to dCount
      set j to contents of item i of aliasList
      
tell desktop i
        set picture to (POSIX path of j)
      end tell
    end repeat
  end tell
end setDesktopPicturePathList

–デスクトップピクチャの強制指定
on setDesktopPicture(aPathStr)
  tell application “System Events”
    set picture of every desktop to aPathStr
  end tell
end setDesktopPicture

–デスクトップピクチャのパスをaliasリストで取得
on getDesktopPicturePathList()
  set pList to {}
  
tell application “System Events”
    set dCount to count every desktop
    
repeat with i from 1 to dCount
      tell desktop i
        set aPic to (picture as POSIX file) as alias
        
set end of pList to aPic
      end tell
    end repeat
  end tell
  
return pList
end getDesktopPicturePathList

–テンポラリフォルダに指定色の画像を作成
on makeColordImageToTmp(rDat as integer, gDat as integer, bDat as integer, aDat as integer)
  set rCol to 255 / rDat
  
set gCol to 255 / gDat
  
set bCol to 255 / bDat
  
set aCol to 255 / aDat
  

  
set aColor to current application’s NSColor’s colorWithDeviceRed:rCol green:gCol blue:bCol alpha:aCol
  
set aDesktopPath to current application’s NSString’s stringWithString:(POSIX path of (path to temporary items))
  
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)
  
set aRes to makeImageWithFilledWithColor(1, 1, savePath, aColor) of me
  
return (savePath as string)
end makeColordImageToTmp

–指定サイズの画像を作成し、指定色で塗ってファイル書き出し
on makeImageWithFilledWithColor(aWidth, aHeight, outPath, fillColor)
  –Imageの作成  
  
set anImage to current application’s NSImage’s alloc()’s initWithSize:(current application’s NSMakeSize(aWidth, aHeight))
  
  
–描画実行
  
anImage’s lockFocus()
  
set theRect to {{x:0, y:0}, {height:aHeight, width:aWidth}}
  
set theNSBezierPath to current application’s NSBezierPath’s bezierPath
  
theNSBezierPath’s appendBezierPathWithRect:theRect
  
fillColor’s |set|()
  
theNSBezierPath’s fill()
  
anImage’s unlockFocus() –描画ここまで
  
  
–生成した画像のRaw画像を作成
  
set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
  
–書き出しファイルパス情報を作成
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
return aRes –成功ならtrue、失敗ならfalseが返る
  
end makeImageWithFilledWithColor

★Click Here to Open This Script 

2016/04/06 指定のDiskの情報を取得する

diskutilコマンドの結果をparseして、指定のデバイス名のdiskの情報を取得するAppleScriptです。

デバイス名はbsdレイヤーで利用している/dev/xxxxxといった名前であり、マウント中の光学メディア(CD-R、DVD-R、BD-Rなど)のbsdデバイス名を求めるのはちょっと手間がかかります。本来なら、choose folderコマンドで指定したドライブ(に含まれているフォルダ)からbsdデバイス名を求めて処理・・・をしたかったのですが、時間がなかったのでとりあえず決め打ちで。

とりあえず、指定のドライブに入っている光学メディアの種類(Optical Media Type)と、光学ドライブ側がサポートしているメディアの種類(Optical Drive Type)を取得できます。結果がNSDictionaryになっているため、Script Editor上では内容を確認できません。AppleScriptネイティブのrecord型のデータだと属性ラベルの自由度が低いため(属性ラベルに空白文字とか入りませんし)、NSDictionaryのままにしてあります。

AppleScript名:指定のDiskの情報を取得する
– Created 2016-04-06 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set targDev to “/dev/disk3″ –Blu-ray drive via USB

set aDict to current application’s NSMutableDictionary’s alloc()’s init()
set a to do shell script “diskutil info “ & targDev
set aList to paragraphs of a

repeat with i in aList
  set j to contents of i
  
if j is not equal to “” then
    set jj to parseByDelim(j, “:”) of me
    
    
if (count every item of jj) is equal to 2 then
      copy jj to {j2, j3}
      
      
set jj2 to (current application’s NSString’s stringWithString:j2)
      
set jj3 to (current application’s NSString’s stringWithString:j3)
      
      
set jjj2 to (jj2’s stringByTrimmingCharactersInSet:(current application’s NSCharacterSet’s whitespaceCharacterSet()))
      
set jjj3 to (jj3’s stringByTrimmingCharactersInSet:(current application’s NSCharacterSet’s whitespaceCharacterSet()))
      
      (
aDict’s setValue:jjj3 forKey:jjj2)
    end if
    
  end if
end repeat

return aDict
–>  (NSDictionary) {Read-Only Media:”Yes”, OS Can Be Installed:”No”, Volume Name:”Not applicable (no file system)”, OS 9 Drivers:”No”, Virtual:”No”, Device Block Size:”2048 Bytes”, Low Level Format:”Not supported”, Removable Media:”Yes”, Device / Media Name:”MATSHITA BD-MLT UJ240AS”, Optical Media Erasable:”No”, Optical Drive Type:”CD-ROM, CD-R, CD-RW, DVD-ROM, DVD-R, DVD-R DL, DVD-RW, DVD-RAM, DVD+R, DVD+R DL, DVD+RW, BD-ROM, BD-R, BD-RE”, Part of Whole:”disk3″, Device Identifier:”disk3″, Whole:”Yes”, Optical Media Type:”BD-R”, SMART Status:”Not Supported”, Device Location:”External”, Volume Free Space:”Not applicable (no file system)”, Device Node:”/dev/disk3″, Read-Only Volume:”Not applicable (no file system)”, Media Type:”Generic”, Total Size:”0 B (0 Bytes) (exactly 0 512-Byte-Units)”, Media Removal:”Software-Activated”, Mounted:”Not applicable (no file system)”, Content (IOContent):”None”, File System:”None”, Protocol:”USB”}

–テキストを指定デリミタでリスト化
on parseByDelim(aData, aDelim)
  set aText to current application’s NSString’s stringWithString:aData
  
set aList to aText’s componentsSeparatedByString:aDelim
  
return aList as list
end parseByDelim

★Click Here to Open This Script 

2016/04/03 dark modeへの切り替えを高速で繰り返す

Dark Modeへの切り替えがSystem Eventsに実装されていることに気づかず、調べて驚きました。

ものすごく簡単に状態の取得と切り替えが行えるわけで、これだけならわざわざCocoaの機能を呼び出さなくても大丈夫でしょう。System Eventsに実装されているシステム情報の取得/設定系の機能はOSのアップデートのたびにバグが出やすい場所なので(なんで正式OSリリースまでに直さないかな)、複数のやりかたを用意しておくのが賢明です。

0.1秒のディレイでDark ModeとLight Modeを切り替えてみました。何か、通知を行うようなときに便利かもしれません。

AppleScript名:dark modeへの切り替えを高速で行う
– Created 2016-04-03 by Takaaki Naganoya
– 2016 Piyomaru Software
tell application “System Events”
  tell appearance preferences
    repeat 10 times
      set (dark mode) to false
      
delay 0.1
      
set (dark mode) to true
      
delay 0.1
    end repeat
    
set (dark mode) to false
  end tell
end tell

★Click Here to Open This Script 

2016/03/29 画面がDarkModeかLightModeかを判別

OS X 10.10以降でメニューバー、メニュー、Dockを暗くするDark Modeか通常モード(Light Mode)に設定されているかを判別するAppleScriptです。

状態の取得は手軽にできたものの、設定はまだAppleScriptだけではできていないため、とりあえずgithub上のdark-modeをコンパイルしてAppleScript Librariesの中に突っ込んでAppleScriptでラッピングして呼び出すようにして使っています。

lightmode.png
▲Light

darkmode.png
▲Dark

AppleScript名:画面がDarkModeかLightModeかを判別
– Created 2016-03-29 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set curMode to (current application’s NSUserDefaults’s standardUserDefaults()’s stringForKey:“AppleInterfaceStyle”) as string
–>  ”Dark” or “Light”

★Click Here to Open This Script 

2016/02/15 接続中のディスプレイのうちRetinaのものが存在するかどうかをチェック

実行中のMacに接続されている(本体ディスプレイも含む)複数のディスプレイにRetina Displayが存在するかどうかをチェックするAppleScriptです。

AppleScript名:接続中のディスプレイのうちRetinaのものが存在するかどうかをチェック
– Created 2016-02-14 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set rRes to detectRetinaDisplay() of me
–>  false –Retina Display is not present or closed
–>  true –Retina Display is present

on detectRetinaDisplay()
  set dispList to current application’s NSScreen’s screens()
  
set retinaF to false
  
  
repeat with i in dispList
    set j to contents of i
    
set aDepth to j’s backingScaleFactor()
    
if aDepth > 1.0 then
      set retinaF to true
    end if
  end repeat
  
  
return retinaF
end detectRetinaDisplay

★Click Here to Open This Script 

2016/02/14 メイン画面がRetina Displayか否かを取得

実行しているコンピュータのメイン画面がRetina Displayかどうかを取得するAppleScriptです。

AppleScript名:メイン画面がRetina Displayか否かを取得
– Created 2016-02-14 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aRes to current application’s NSScreen’s mainScreen()’s backingScaleFactor()
–>  2.0 –(Retina)
–>  1.0 –(Not Retina)

★Click Here to Open This Script 

2016/02/09 コンピュータの画像を取得して表示

実行しているコンピュータのアイコン画像を取得してWindow表示するAppleScriptです。アイコンを取得するのがメインで、表示部分はオマケです。

Script Editor上で、ControlーCommandーRで実行してください。

icondisp.png
▲MacBookPro10,1上で実行したところ

icondisp2.png
▲Macmini7,1上で実行したところ

icondisp3.jpg
▲MacBookAir4,1上で実行したところ

AppleScript名:コンピュータの画像を取得して表示
– Created 2016-02-09 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

–Get Computer Icon
set anImage to current application’s NSImage’s imageNamed:(current application’s NSImageNameComputer)

–Load Image to NSImageView
set aRect to current application’s NSMakeRect(0, 0, 128, 128)
set aView to current application’s NSImageView’s alloc()’s initWithFrame:aRect
aView’s setImage:anImage

–Display with Window
set aWin to current application’s NSWindow’s alloc()’s init()
aWin’s setContentSize:(aView’s frame()’s |size|())
aWin’s setContentView:aView
aWin’s |center|()
aWin’s makeKeyAndOrderFront:(me)
delay 5
aWin’s |close|()

★Click Here to Open This Script 

2015/11/06 Systemのアラートサウンド名称を取得して鳴らす

Cocoaの機能を無理やり使って、Systemに入っている警告音の名称一覧を取得して鳴らすAppleScriptです。

sounds.png

そういう「OSの警告音一覧を取得する」といったサービスがあるのかと思って探していたら、どうも存在していない雰囲気なので、Cocoaの機能を使ってものすごく常識的かつ地道に/System/Library/Soundsの中に入っているaiffファイルのファイル名の一覧を取得というところに落ち着きました。

AppleScript名:ASOCでSystemのアラートサウンド名称を取得して鳴らす
– Created 2015-11-06 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version "2.5"
use scripting additions
use framework "Foundation"
use framework "AppKit"

set sList to getSystemAlertSoundNames() of me
–>  {"Basso", "Blow", "Bottle", "Frog", "Funk", "Glass", "Hero", "Morse", "Ping", "Pop", "Purr", "Sosumi", "Submarine", "Tink"}

repeat with i in sList
  tell (current application’s NSSound’s soundNamed:i) to play()
  
delay 0.5 –時間待ちしないと全部一緒に鳴るので(Let’s Challenge!)
end repeat

on getSystemAlertSoundNames()
  set sList to getSystemAlertSoundPathList() of me
  
set nameList to {}
  
repeat with i in sList
    set j to contents of i
    
set aPOSIX to POSIX path of j
    
set pathString to (current application’s NSString’s stringWithString:aPOSIX)
    
set aFileName to pathString’s lastPathComponent()
    
set aFileName2 to aFileName’s stringByDeletingPathExtension()
    
set the end of nameList to (aFileName2 as text)
  end repeat
  
  return nameList
end getSystemAlertSoundNames

–Get System Alert Path List
on getSystemAlertSoundPathList()
  set aExt to "aiff" – no dot
  
set aFol to "/System/Library/Sounds"
  
set fList to getFilePathListFromPOSIXpath(aFol, aExt) of me
  
return fList
end getSystemAlertSoundPathList

–Get File List from POSIX path and file Extensions
on getFilePathListFromPOSIXpath(aFol, aExt)
  set aFM to current application’s NSFileManager’s defaultManager()
  
set aURL to current application’s |NSURL|’s fileURLWithPath:aFol
  
set urlArray to aFM’s contentsOfDirectoryAtURL:aURL includingPropertiesForKeys:{} options:(current application’s NSDirectoryEnumerationSkipsHiddenFiles) |error|:(missing value)
  
set thePred to current application’s NSPredicate’s predicateWithFormat:"pathExtension == [c]%@" argumentArray:{aExt}
  
set anArray to urlArray’s filteredArrayUsingPredicate:thePred
  
return anArray as list
end getFilePathListFromPOSIXpath

★Click Here to Open This Script 

2015/08/28 ASOCでプロセス関連のじっけん

CocoaのNSProcessInfoを叩いて、CPUコア(スレッド数)の取得を行うついでにいろいろ情報を取得してみました。

CPUのスレッド数については、Terminal上で「sysctl -n hw.ncpu」などと実行すると取得できますが、CocoaのAPIを呼び出して取得する方法を調べてみました。スピードが速いとか超豪華なデータが返ってくるとかいうことは一切なく、ただスレッド数(仮想コア数)がわかるだけです。

AppleScript名:ASOCでプロセス関連のじっけん
– Created 2015-08-28 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aCount to (current application’s NSProcessInfo’s processInfo()’s processorCount()) as integer –CPU’s Thread number
–>  8 –4 core, 8 thread machine (MacBook Pro Retina 2012)

set aInfo to current application’s NSProcessInfo’s processInfo()
–>  (NSProcessInfo)

aInfo’s hostName()
–>  (NSString) “mbpretina.local”

aInfo’s operatingSystemVersionString()
–>  (NSString) “バージョン 10.10.5(ビルド 14F27)”

–ASOC上で実行できない(T_T)
aInfo’s operatingSystemVersion()
–> can’t bridge argument of type {_NSOperatingSystemVersion=qqq}.

★Click Here to Open This Script 

OS X 10.11上でOSのバージョン取得を行ってみたところ、期待どおりの結果が得られました。

AppleScript名:10.11でOSバージョンを取得
– Created 2015-08-28 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set aInfo to current application’s NSProcessInfo’s processInfo()

–OS X 10.11上では結果を正しく返す
aInfo’s operatingSystemVersion()
–> {majorVersion:10, minorVersion:11, patchVersion:0}

★Click Here to Open This Script 

2015/08/28 ASOCでNSFont,NSFontManagerのじっけん

AppleScriptでNSFontやNSFontManagerを操作して情報を取得する実験です。

このあたり、Cocoaを呼べるからものすごい処理ができるぞ(TTSの音声検索なんかはわりとすごい)、とかいうことはなくて・・・普通にPure AppleScriptでFontBook.appを操作する方が有意義な感じがします。

Photoshop書類のテキストレイヤーからフォント情報を取り出してまとめて出力するAppleScriptを組んだときには、FontBookを用いてフォント情報の付け合わせを行いましたが・・・ここであえてNSFontやNSFontManagerを呼び出してみたところで、イレギュラーなフォントについてはまともに名前などの情報を返してこないケースもありますし、Photoshopのテキストレイヤー上に複数のフォントを指定してしまうとScript側からは正しく取得できないので困ります。

AppleScript名:ASOCでNSFontのじっけん
– Created 2015-08-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aFont to current application’s NSFont’s fontWithName:“HiraKakuStd-W8″ |size|:16
–>  (NSFont) “HiraKakuStd-W8 16.00 pt. P [] (0×600001457340) fobj=0×6180001f2800, spc=5.33″

aFont’s displayName()
–>  (NSString) “ヒラギノ角ゴ Std W8″

aFont’s familyName()
–>  (NSString) “Hiragino Kaku Gothic Std”

aFont’s fontName()
–>  (NSString) “HiraKakuStd-W8″

aFont’s coveredCharacterSet()
–>  (__NSCFCharacterSet) <__nscfcharacterset : 0x6000004472c0>

aFont’s fontDescriptor()
(*)
–>  (NSCTFontDescriptor) NSCTFontDescriptor <0×61800009cb60> = {
NSFontNameAttribute = “HiraKakuStd-W8″;
NSFontSizeAttribute = 16;
}
*)

aFont’s mostCompatibleStringEncoding()
–>  2.147483649E+9 –???

aFont’s renderingMode()
–>  1
(*
typedef enum NSFontRenderingMode : NSUInteger {
NSFontDefaultRenderingMode = 0,
NSFontAntialiasedRenderingMode = 1,
NSFontIntegerAdvancementsRenderingMode = 2,
NSFontAntialiasedIntegerAdvancementsRenderingMode = 3
} NSFontRenderingMode;
*)

aFont’s printerFont()
–>  (NSFont) “HiraKakuStd-W8 16.00 pt. P [] (0×600001457340) fobj=0×6180001f2800, spc=5.33″

aFont’s screenFont()
–>  (NSFont) “HiraKakuStd-W8 16.00 pt. S [] (0×600001457340) fobj=0×6180001f2800, spc=5.00″

aFont’s numberOfGlyphs()
–>  9354

★Click Here to Open This Script 

AppleScript名:ASOCでNSFontManagerのじっけん
– Created 2015-08-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aFontMan to current application’s NSFontManager’s sharedFontManager()’s availableFontFamilies()
–>  (NSArray) {​​​​​”01FLOPDESIGN”, ​​​​​”A-OTF Shin Go Pr6N”, ​​​​​”A-OTF Shin Go Pro”, ​​​​​”Abadi MT Condensed Extra Bold”, ​​​​​”Abadi MT Condensed Light”, ​​​​​”AGENDAJinmeiGyoshotaiL1″, ​​​​​”AGENDAJinmeiSeikaishotaiL1″, ​​​​​”Akubin”,….}

set aFontMan to current application’s NSFontManager’s sharedFontManager()’s availableMembersOfFontFamily:“MS Mincho”
–>  (NSArray) {​​​​​{​​​​​​​”MS-Mincho”, ​​​​​​​”Regular”, ​​​​​​​1, ​​​​​​​0​​​​​}​​​}

set aFontMan to current application’s NSFontManager’s sharedFontManager()’s availableMembersOfFontFamily:“Times”
–>  (NSArray) {​​​​​{​​​​​​​”Times-Roman”, ​​​​​​​”Regular”, ​​​​​​​1, ​​​​​​​0​​​​​}, ​​​​​{​​​​​​​”Times-Italic”, ​​​​​​​”Italic”, ​​​​​​​1, ​​​​​​​1​​​​​}, ​​​​​{​​​​​​​”Times-Bold”, ​​​​​​​”Bold”, ​​​​​​​1, ​​​​​​​2​​​​​}, ​​​​​{​​​​​​​”Times-BoldItalic”, ​​​​​​​”Bold Italic”, ​​​​​​​1, ​​​​​​​3​​​​​}​​​}

set aFontMan to current application’s NSFontManager’s sharedFontManager()’s localizedNameForFamily:“Osaka” face:“Regular-Mono”
–>  (NSString) “レギュラー−等幅”

★Click Here to Open This Script 

2015/08/27 NSTimeZoneのじっけん

NSTimeZoneについてのひととおりの(タイムゾーンの変更以外)メソッドを呼び出してテストしてみました。

AppleScript名:NSTimeZoneの実験
– Created 2015-08-27 by Takaaki Naganoya
– Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aTZ to current application’s NSTimeZone’s localTimeZone()
–>  (__NSLocalTimeZone) Local Time Zone (Asia/Tokyo (JST) offset 32400)

set aTZstr to aTZ’s |name|()
–>  (NSString) “Asia/Tokyo”

set aSecFromGMT to aTZ’s secondsFromGMT()
–>  32400

set a1Str to aTZ’s abbreviation()
–>  (NSString) “JST”

set a2Str to aTZ’s |description|()
–>  (NSString) “Local Time Zone (Asia/Tokyo (JST) offset 32400)”

set a3F to aTZ’s isDaylightSavingTime()
–>  false

set a4Num to aTZ’s daylightSavingTimeOffset()
–>  0.0

set a5Num to aTZ’s nextDaylightSavingTimeTransition()
–>  missing value

set bTZ to current application’s NSTimeZone’s systemTimeZone()
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set cTZ to current application’s NSTimeZone’s timeZoneWithAbbreviation:“JST”
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set dTZ to current application’s NSTimeZone’s timeZoneWithName:“Asia/Tokyo”
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set aDat to current application’s NSTimeZone’s defaultTimeZone()’s |data|()
–>  (NSData) <545a6966 00000000 00000000 00000000 00000000 00000003 00000003 00000000 00000009 00000003 0000000d c3553b70 d73e1e90 d7ec1680 d8f91690 d9cbf880 db071d10 dbabda80 dce6ff10 dd8bbc80 02010201 02010201 0200007e 90000000 008ca001 0500007e 9000094a 43535400 4a445400 4a535400 00000000 0000>
set eTZ to (current application’s NSTimeZone’s timeZoneWithName:“Japan” |data|:aDat)’s |description|()
–>  (NSString) “Japan (JST) offset 32400″

set fTZ to current application’s NSTimeZone’s timeZoneForSecondsFromGMT:32400
–>  (__NSTimeZone) GMT+0900 (GMT+9) offset 32400

set gTZ to current application’s NSTimeZone’s alloc()’s initWithName:“JST”
–>  (__NSTimeZone) JST (JST) offset 32400

set hTZ to current application’s NSTimeZone’s alloc()’s initWithName:“JST” |data|:aDat
–>  (__NSTimeZone) JST (JST) offset 32400

set aVerStr to current application’s NSTimeZone’s timeZoneDataVersion()
–>  (NSString) “2015f”

set iTZ to current application’s NSTimeZone’s localTimeZone()
–>  (__NSLocalTimeZone) Local Time Zone (Asia/Tokyo (JST) offset 32400)

set jTZ to current application’s NSTimeZone’s defaultTimeZone()
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set kTZ to current application’s NSTimeZone’s systemTimeZone()
–>  (__NSTimeZone) Asia/Tokyo (JST) offset 32400

set aDic to current application’s NSTimeZone’s abbreviationDictionary()
–>  (NSDictionary) {​​​​​EDT:”America/New_York”, ​​​​​GMT:”GMT”, ​​​​​AST:”America/Halifax”, ​​​​​IRST:”Asia/Tehran”, ​​​​​ICT:”Asia/Bangkok”, ​​​​​PET:”America/Lima”, ​​​​​KST:”Asia/Seoul”, ​​​​​PST:”America/Los_Angeles”, ​​​​​CDT:”America/Chicago”, ​​​​​EEST:”Europe/Istanbul”, ​​​​​NZDT:”Pacific/Auckland”, ​​​​​WEST:”Europe/Lisbon”, ​​​​​EAT:”Africa/Addis_Ababa”, ​​​​​HKT:”Asia/Hong_Kong”, ​​​​​IST:”Asia/Calcutta”, ​​​​​MDT:”America/Denver”, ​​​​​NZST:”Pacific/Auckland”, ​​​​​WIT:”Asia/Jakarta”, ​​​​​ADT:”America/Halifax”, ​​​​​BST:”Europe/London”, ​​​​​ART:”America/Argentina/Buenos_Aires”, ​​​​​CAT:”Africa/Harare”, ​​​​​GST:”Asia/Dubai”, ​​​​​PDT:”America/Los_Angeles”, ​​​​​SGT:”Asia/Singapore”, ​​​​​COT:”America/Bogota”, ​​​​​PKT:”Asia/Karachi”, ​​​​​EET:”Europe/Istanbul”, ​​​​​UTC:”UTC”, ​​​​​WAT:”Africa/Lagos”, ​​​​​EST:”America/New_York”, ​​​​​JST:”Asia/Tokyo”, ​​​​​CLST:”America/Santiago”, ​​​​​CET:”Europe/Paris”, ​​​​​BDT:”Asia/Dhaka”, ​​​​​MSK:”Europe/Moscow”, ​​​​​AKDT:”America/Juneau”, ​​​​​CLT:”America/Santiago”, ​​​​​AKST:”America/Juneau”, ​​​​​BRST:”America/Sao_Paulo”, ​​​​​BRT:”America/Sao_Paulo”, ​​​​​CEST:”Europe/Paris”, ​​​​​CST:”America/Chicago”, ​​​​​HST:”Pacific/Honolulu”, ​​​​​MSD:”Europe/Moscow”, ​​​​​MST:”America/Denver”, ​​​​​PHT:”Asia/Manila”, ​​​​​WET:”Europe/Lisbon”​​​}

set bDic to current application’s NSTimeZone’s knownTimeZoneNames()
–>  (NSArray) {​​​​​”Africa/Abidjan”, ​​​​​”Africa/Accra”, ​​​​​”Africa/Addis_Ababa”​​​​​….​​​}

★Click Here to Open This Script 

2015/08/26 ASOCでHostの情報を取得する

CocoaのNSHost関連のメソッドなどを調べてみました。

AppleScript名:ASOCでHostの情報を取得する
– Created 2015-08-26 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aHost to current application’s NSHost’s currentHost()

aHost’s localizedName()
–>  (NSString) “MBPretina”

aHost’s |name|()
–>  (NSString) “mbpretina.local”

aHost’s address()
–>  (NSString) “xxxx::xxxx:xxxx:xxxx:xxxx%en0″

aHost’s addresses()
–>  (NSArray) {​​​​​”xxxx::xxxx:xxxx:xxxx:xxxx%en0″, ​​​​​”192.168.0.10″, ​​​​​”xxxx::xxxx:xxxx:xxxx:xxxx%awdl0″, ​​​​​”xxxx::xxxx:xxxx:xxxx:xxxx%utun0″, ​​​​​”xxxx:xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx”, ​​​​​”xxxx::xxxx:xxxx:xxxx:xxx%utun1″, ​​​​​”xxxx::xxxx:xxxx:xxxx:xxxx%utun2″, ​​​​​”::1″, ​​​​​”127.0.0.1″, ​​​​​”xxxx::1%lo0″​​​}

set bHost to current application’s NSHost’s hostWithName:“mba13.local”
–>  (NSHost) (null) (() ())

bHost’s address()
–>  (NSString) “192.168.0.23″

set cHost to current application’s NSHost’s hostWithAddress:“192.168.0.23″
cHost’s |name|()
–>  missing value –Why ???????

bHost’s isEqualToHost:cHost
–>  true –OK

★Click Here to Open This Script 

2015/08/26 ASOCで性別と言語コードを指定してTTS voiceを取得 v2

Cocoaの機能を用いて、Text To Speechの音声から性別と言語を指定して、TTS Voice名称をリストで返すAppleScriptです。最初のバージョンに対して、「Premium」voiceに限定しないvoice名取得ルーチン「getAllVoiceNameWithFiltering」を追加しています。ほかに、機能的な差異はありません。

前バージョンに対し、Shane StanleyからNSPredicateの指定について、

set aStr to current application’s NSString’s stringWithString:(”VoiceLocaleIdentifier == ‘” & voiceLang & “‘ and  VoiceGender == ‘” & voiceGender & “‘ and VoiceIdentifier ENDSWITH[c] ‘premium’”)
set aPredicate to current application’s NSPredicate’s predicateWithFormat:aStr

って、書いてあるけど引数をNSPredicateの指定文字列から分離したほうがクォートで囲む囲まないで悩まなくていいから、分離しといたほうがいいよ(意訳)という指摘があって・・・実際、NSPredicate以外のコードはすぐに書けたものの・・・クォートの指定でけっこう試行錯誤して悩んでいたので、まったくその通り(^ー^;;;;

set aPredicate to current application’s NSPredicate’s predicateWithFormat_(”VoiceLocaleIdentifier == %@ and VoiceGender == %@ and VoiceIdentifier ENDSWITH[c] %@”, voiceLang, voiceGender, “premium”)

とか(ここで「predicateWithFormat_」とアンダースコアで書かないと構文確認をパスできないところにASOCの闇と、Shaneの試行錯誤を感じます、、、)、

set aPredicate to current application’s NSPredicate’s predicateWithFormat:”VoiceLocaleIdentifier == %@ and VoiceGender == %@ and VoiceIdentifier ENDSWITH[c] %@” argumentArray:{voiceLang, voiceGender, “premium”}

みたいに書いたほうがシンプルでいいよ的な話で、まさにそのとおり。で、いろいろ書き換えておきました。

各TTS Voiceについては、性別、言語、国などのほかに「年齢」というパラメータも持っているのですが、年齢を条件にして綿密に絞り込む・・・というほどには、TTS Voiceの数が多くないので、年齢は考慮していません。

これ(↑)を掲載するまでに、「クリップボードの内容をスタイル付きテキストで取得する方法」について調べ、調べきれなかったので、do shell script使いまくりの昔作ったAppleScriptでHTMLに書き出した、というオチもありました。Cocoaのクリップボード関連、普段使わないうえに、いざ真剣に調べだしてもあんまりまとまったまともでわかりやすい情報がなくて困りものです。

AppleScript名:ASOCで性別と言語コードを指定してTTS voiceを取得 v2
– Created 2015-08-25 by Takaaki Naganoya
– Modified 2015-08-26 by Shane Stanley, Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use BridgePlus : script “BridgePlus”

load framework

set v1Res to getPremiumVoiceNameWithFiltering(“VoiceGenderMale”, “ja_JP”)
–>  {​​​​​”Otoya”​​​}

set v2Res to getPremiumVoiceNameWithFiltering(“VoiceGenderFemale”, “en_US”)
–>  {​​​​​”Allison”, ​​​​​”Ava”, ​​​​​”Jill”, ​​​​​”Samantha”​​​}

set v3Res to getAllVoiceNameWithFiltering(“VoiceGenderFemale”, “en_US”)
–>  {​​​​​”Agnes”, ​​​​​”Allison”, ​​​​​”Ava”, ​​​​​”Jill”, ​​​​​”Kathy”, ​​​​​”Princess”, ​​​​​”Samantha”, ​​​​​”Vicki”, ​​​​​”Victoria”​​​}

–Premium Voices Only
on getPremiumVoiceNameWithFiltering(voiceGender, voiceLang)
  –Make Blank Array
  
set outArray to current application’s NSMutableArray’s arrayWithObject:{}
  
  
–Make Installed Voice List
  
set aList to current application’s NSSpeechSynthesizer’s availableVoices()
  
set bList to aList as list
  
  
repeat with i in bList
    set j to contents of i
    
set aDIc to (current application’s NSSpeechSynthesizer’s attributesForVoice:j)
    (
outArray’s addObject:aDIc)
  end repeat
  
  
–Filter Voice
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat_(“VoiceLocaleIdentifier == %@ and VoiceGender == %@ and VoiceIdentifier ENDSWITH[c] %@”, voiceLang, voiceGender, “premium”)
  
set filteredArray to outArray’s filteredArrayUsingPredicate:aPredicate
  
set aReList to (filteredArray’s valueForKey:“VoiceName”) as list
  
  
return aReList
  
end getPremiumVoiceNameWithFiltering

–All Voices
on getAllVoiceNameWithFiltering(voiceGender, voiceLang)
  –Make Blank Array
  
set outArray to current application’s NSMutableArray’s arrayWithObject:{}
  
  
–Make Installed Voice List
  
set aList to current application’s NSSpeechSynthesizer’s availableVoices()
  
set bList to aList as list
  
  
repeat with i in bList
    set j to contents of i
    
set aDIc to (current application’s NSSpeechSynthesizer’s attributesForVoice:j)
    (
outArray’s addObject:aDIc)
  end repeat
  
  
–Filter Voice
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat_(“VoiceLocaleIdentifier == %@ and VoiceGender == %@”, voiceLang, voiceGender)
  
  
set filteredArray to outArray’s filteredArrayUsingPredicate:aPredicate
  
set aReList to (filteredArray’s valueForKey:“VoiceName”) as list
  
  
return aReList
  
end getAllVoiceNameWithFiltering

on getLaunguageCodeFromTTSVoices()
  
  
–Make Blank Array
  
set outArray to current application’s NSMutableArray’s arrayWithObject:{}
  
  
–Make Installed Voice List
  
set aList to current application’s NSSpeechSynthesizer’s availableVoices()
  
set bList to aList as list
  
  
repeat with i in bList
    set j to contents of i
    
set aDict to (current application’s NSSpeechSynthesizer’s attributesForVoice:j)
    (
outArray’s addObject:aDict)
  end repeat
  
  
set aResArray to (outArray’s valueForKey:“VoiceLocaleIdentifier”)
  
  
set aSet to current application’s NSMutableSet’s setWithArray:aResArray
  
set aResList to aSet’s allObjects()
  
  
set bResList to BridgePlus’s listByDeletingBlanksIn:aResList –Remove Blank Items
  
  
return bResList
  
end getLaunguageCodeFromTTSVoices

★Click Here to Open This Script 

2015/08/25 ASOCで性別と言語コードを指定して高音質voiceを取得

Cocoaの機能を用いて、Text To Speechの音声から性別と言語を指定して、高音質のVoice名称をリストで返すAppleScriptです。

voice1.png
▲システム環境設定「音声入力と読み上げ」>「テキスト読み上げ」

voice2.png
▲OSにインストールされているVoiceリスト

男性:VoiceGenderMale
女性:VoiceGenderFemale

で性別を指定して高音質のvoice名称を取得します。

アメリカ英語(en_US)で男性の音声をどれでもいいから指定したいが、どの音声が入っているかは特定できないしデフォルトで指定されているかどうかもわからない、といった場合にある程度の見当をつけるために作ったものです。

TTS Voiceで使用可能な言語コード一覧については、「ASOCで全voiceから言語コードを抽出」のプログラムで取得できるようにしておきました。

AppleScript名:ASOCで性別と言語コードを指定して高音質voiceを取得
– Created 2015-08-25 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set v1Res to getPremiumVoiceNameWithFiltering(“VoiceGenderMale”, “ja_JP”)
–>  {​​​​​”Otoya”​​​}

set v2Res to getPremiumVoiceNameWithFiltering(“VoiceGenderFemale”, “en_US”)
–>  {​​​​​”Allison”, ​​​​​”Ava”, ​​​​​”Jill”, ​​​​​”Samantha”​​​}

set v3Res to getPremiumVoiceNameWithFiltering(“VoiceGenderMale”, “en_GB”)
–> {”Daniel”}

–Premium Voices Only
on getPremiumVoiceNameWithFiltering(voiceGender, voiceLang)
  –Make Blank Array
  
set outArray to current application’s NSMutableArray’s arrayWithObject:{}
  
  
–Make Installed Voice List
  
set aList to current application’s NSSpeechSynthesizer’s availableVoices()
  
set bList to aList as list
  
  
repeat with i in bList
    set j to contents of i
    
set aDIc to (current application’s NSSpeechSynthesizer’s attributesForVoice:j)
    (
outArray’s addObject:aDIc)
  end repeat
  
  
–Filter Voice
  
set aStr to current application’s NSString’s stringWithString:(“VoiceLocaleIdentifier == ’” & voiceLang & “’ and VoiceGender == ’” & voiceGender & “’ and VoiceIdentifier ENDSWITH[c] ’premium’”)
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat:aStr
  
set filteredArray to outArray’s filteredArrayUsingPredicate:aPredicate
  
set aReList to (filteredArray’s valueForKey:“VoiceNameRoot”) as list
  
  
return aReList
  
end getPremiumVoiceNameWithFiltering

★Click Here to Open This Script 

AppleScript名:ASOCで全voiceから言語コードを抽出
– Created 2015-08-25 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use BridgePlus : script “BridgePlus”

load framework

set cRes to getLaunguageCodeFromTTSVoices()
–>  {​​​​​”fr_FR”, ​​​​​”zh_TW”, ​​​​​”it_IT”, ​​​​​”en_ZA”, ​​​​​”es_AR”, ​​​​​”ko_KR”, ​​​​​”ro_RO”, ​​​​​”en_IN”, ​​​​​”fr_CA”, ​​​​​”hi_IN”, ​​​​​”da_DK”, ​​​​​”en-scotland”, ​​​​​”pt_BR”, ​​​​​”zh_CN”, ​​​​​”sv_SE”, ​​​​​”es_ES”, ​​​​​”hu_HU”, ​​​​​”ar_SA”, ​​​​​”en_GB”, ​​​​​”ja_JP”, ​​​​​”fi_FI”, ​​​​​”zh_HK”, ​​​​​”tr_TR”, ​​​​​”nb_NO”, ​​​​​”pl_PL”, ​​​​​”id_ID”, ​​​​​”cs_CZ”, ​​​​​”el_GR”, ​​​​​”he_IL”, ​​​​​”ru_RU”, ​​​​​”de_DE”, ​​​​​”en_AU”, ​​​​​”nl_BE”, ​​​​​”pt_PT”, ​​​​​”th_TH”, ​​​​​”sk_SK”, ​​​​​”en_US”, ​​​​​”en_IE”, ​​​​​”nl_NL”, ​​​​​”es_MX”​​​}

on getLaunguageCodeFromTTSVoices()
  
  
–Make Blank Array
  
set outArray to current application’s NSMutableArray’s arrayWithObject:{}
  
  
–Make Installed Voice List
  
set aList to current application’s NSSpeechSynthesizer’s availableVoices()
  
set bList to aList as list
  
  
repeat with i in bList
    set j to contents of i
    
set aDIc to (current application’s NSSpeechSynthesizer’s attributesForVoice:j)
    (
outArray’s addObject:aDIc)
  end repeat
  
  
set aResArray to (outArray’s valueForKey:“VoiceLocaleIdentifier”)
  
  
set aSet to current application’s NSMutableSet’s setWithArray:aResArray
  
set aResList to aSet’s allObjects()
  
  
set bResList to BridgePlus’s listByDeletingBlanksIn:aResList –Remove Blank Items
  
  
return bResList
  
end getLaunguageCodeFromTTSVoices

★Click Here to Open This Script 

2015/08/25 MacのHardware UUIDを取得する

Macのハードウェアを一意に特定する、Hardware UUIDを取得するAppleScript(shellを呼んでいるだけ)です。

uuid1.png
▲Appleメニューの「このMacについて」を実行。このWindowの下部にあるボタン「システムレポート…」をクリックすると…

uuid2.png
▲「ハードウェアの概要:」で「ハードウェアUUID」が表示されます

アプリケーションの中に入れて呼ぶ可能性については想定していませんが、ツール的にメニューから呼び出して使うことは考えています。たとえば、自分が参加している(知り合いの作者が行っている)ソフトウェアのβテスト時に、ソフトウェアの作者に伝えるような用途です。

shell呼び出しをなくす方向でいろいろ調べてはみたのですが、ASOCで扱えないCFStringなどの機能を用いているサンプルコードしか見当たりませんでした。残念!

AppleScript名:MacのHardware UUIDを取得する
– Created 2015-08-25 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions

set sText to “/usr/sbin/ioreg -rd1 -c IOPlatformExpertDevice | /usr/bin/awk ’/IOPlatformUUID/ { print $3; }’”
set aRes to do shell script sText
–>  ”\”XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\”"

★Click Here to Open This Script 

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/08/09 使用中のMacの製品呼称を取得する

使用中のMacの製品呼称を取得するAppleScriptです。

本来は、Cocoaの機能を呼び出してXMLをparseしようとしてこの数倍のプログラムを組んでいたのですが、いまひとつうまくいかずに挫折。System Eventsでparseするという安直な方法に落ち着きました(^ー^;;

→ ここの情報を参照しました

製品呼称コードは4文字パターン(例:DKQ2)と3文字パターン(例:5RU)があるようなので、シリアル番号から両方の文字列を作成して、両方試すと確実ではないでしょうか。

MacBook Air 2014で実行すると、「MacBook Air」としか返してこないことを確認、、、、いろいろ例外がありそうです。

AppleScript名:使用中のMacの製品呼称を取得する
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aSerial to retSerial()
set aID to text ((length of aSerial) - 3) thru -1 of aSerial

set aRes to do shell script “curl -o - http://support-sp.apple.com/sp/product?cc=” & aID & “&lang=en_US”
–> “<?xml version=\”1.0\” encoding=\”utf-8\” ?><root><name>CPU Name</name><configCode>MacBook Pro (Retina, Mid 2012)</configCode><locale>en_US</locale></root>”

tell application “System Events”
  set aData to make new XML data with properties {text:aRes}
  
set aModel to value of XML element “configCode” of XML element “root” of aData
end tell
–> “MacBook Pro (Retina, Mid 2012)”

–Get Your Mac’s Hardware Serial Code
on retSerial()
  set a to (do shell script “system_profiler SPHardwareDataType | grep Serial”)
  
set b to offset of “:” in a
  
set c to (characters (b + 2) thru -1 of a) as text
  
return c
end retSerial

★Click Here to Open This Script 

2015/08/07 CPUの詳細な型番を取得する

CPUの詳細な型番情報を取得するAppleScriptです(shell commandを呼んでいるだけ)。

新製品が登場したときとか、Apple Storeで自分の持っていないMacのCPUの型番をしらべてベンチマーク値を調べる時などに有用な情報です。

AppleScript名:CPUの詳細な型番を取得する
do shell script “sysctl -n machdep.cpu.brand_string”
–> “Intel(R) Core(TM) i7-3720QM CPU @ 2.60GHz” # MacBook Pro Retina 2012

★Click Here to Open This Script 

2015/08/07 ASOCでSafariのダウンロードフォルダを取得する

Shaneから、Cocoaの機能を用いてSafariのダウンロードフォルダを求めるAppleScriptです。

やっていることは、Pure AppleScript版とほとんど同じなので、比較するとひじょうに参考になります。

AppleScript名:ASOCでSafariのダウンロードフォルダを取得する
– Created 2015-08-07 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aRes to getSafariDownloadFolder()
–>  file “Macintosh HD:Users:me:Downloads”

on getSafariDownloadFolder()
  set theID to id of application “Safari” –> “com.apple.Safari”
  
set storedDefaults to (current application’s NSUserDefaults’s standardUserDefaults()’s persistentDomainForName:theID)
  
set downloadFolder to storedDefaults’s valueForKeyPath:“DownloadsPath.stringByExpandingTildeInPath”
  
return downloadFolder as «class furl»
end getSafariDownloadFolder

★Click Here to Open This Script 

2015/04/23 Macのモデル名を返す

Macのモデル名を返すAppleScriptです。Mac Pro/Mac mini/iMac/MacBook Pro/MacBook Air/MacBook などのざっくりしたモデル名(マシン種別)です。

AppleScript名:Macのモデル名を返す
–By Christopher Stone <listmeister@thestoneforge.com>
–2011/09/15

set aModelName to getModelName()
–> "MacBook Pro"

on getModelName()
  # Keeping the hardware data record:
  
set hardwareData to do shell script "system_profiler SPHardwareDataType" without altering line endings
  
set cmd to "sed -nE ’/Model Name/p’ <<< " & quoted form of hardwareData & " | sed -E ’s/^ +//’"
  
set macModel to do shell script cmd
  
  
# One-liner:
  
set macModel to do shell script "system_profiler SPHardwareDataType | sed -nE ’/Model Name/p’| sed -E ’s/^ +//’"
  
  
return (text 13 thru -1 of macModel) –Skip "Model Name: " strings
  
end getModelName

★Click Here to Open This Script 

2015/04/02 CocoaでDisk Free Space (Bytes) を求める

Shane wrote me various methods to get free space in Cocoa way. NSByteCountFormatter seems very useful.

“usedSpaceLongString” is good because they take the user’s number formatting and language into account (Shane said).

ShaneがCocoaでDiskの空き容量を(Byte単位で)返すscriptを書いてくれました(Thanks!)。NSByteCountFormatterが非常に使い勝手がありそうです。

“usedSpaceLongString”は実行時のユーザー環境の数値フォーマット形式と言語設定を反映させるため有用です(Shane談)。

あれ??? このScript、使用率が%で返ってきているものをただ文字フォーマットしているだけかも、、、

AppleScript名:CocoaでDiskSpace(Bytes)を求める
– Created 2015-04-02 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

usedSpace(“/”)
–>  4.5772857344E+10

usedSpace2(“/”)
–>  4.5772857344E+10

usedSpaceString(“/”)
–>  ”45.77 GB”

usedSpaceLongString(“/”)
–>  ”45.77 GB (45,772,857,344 bytes)”–English user environment
–>  ”45.77 GB (45,772,857,344 バイト)”–Japanese user environment

tell application “Finder”
  free space of startup disk
end tell
–>  4.5784592712E+10

on usedSpace(volumePath)
  set theNSURL to current application’s class “NSURL”’s fileURLWithPath:volumePath –considering “ASOC in Xcode”
  
set {theResult, theSize} to theNSURL’s getResourceValue:(reference) forKey:(current application’s NSURLVolumeAvailableCapacityKey) |error|:(missing value)
  
  
return theSize as real – integer may be too big for AS
end usedSpace

on usedSpace2(volumePath)
  set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value)
  
  
return (fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize)) as real – integer may be too big for AS
end usedSpace2

on usedSpaceString(volumePath)
  set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value)
  
set fRes to fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize)
  
  
–Formatting
  
set sizeString to current application’s NSByteCountFormatter’s stringFromByteCount:fRes countStyle:(current application’s NSByteCountFormatterCountStyleDecimal)
  
  
return sizeString as text
end usedSpaceString

on usedSpaceLongString(volumePath)
  set fileAttr to current application’s NSFileManager’s defaultManager()’s attributesOfFileSystemForPath:volumePath |error|:(missing value)
  
set fRes to fileAttr’s objectForKey:(current application’s NSFileSystemFreeSize)
  
  
–Formatting
  
set theFormatter to current application’s NSByteCountFormatter’s alloc()’s init()
  
theFormatter’s setCountStyle:(current application’s NSByteCountFormatterCountStyleDecimal)
  
theFormatter’s setIncludesActualByteCount:true
  
set sizeString to theFormatter’s stringFromByteCount:fRes
  
  
return sizeString as text
end usedSpaceLongString

★Click Here to Open This Script 

2015/02/08 起動中のプロセスの存在確認(ASOC)v2

Bundle IDで指定したアプリケーションプロセスが起動中かどうかを調べるAppleScriptです。

v1は「とりあえずこんなもんで動くだろー。でももっと短く書けそう」というものでしたが、やっぱり短く書けました。Shane Stanleyからチェックが入って(汗)、もっと短く書けるよ、とのこと。感謝です(^ー^)

AppleScript名:指定Bundle IDのプロセス存在確認(ASOC)v2
– Created 2015-02-08 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “AppKit”

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshop”)
–> true

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshopoo!”)
–> false

on chkAppProcesByBundleID(aBundleID)
  set appArray to current application’s NSRunningApplication’s runningApplicationsWithBundleIdentifier:aBundleID
  
return (appArray’s |count|() > 0)
end chkAppProcesByBundleID

★Click Here to Open This Script 

2015/02/08 起動中のプロセスの存在確認

Bundle IDで指定したプロセスが起動しているかどうかを確認するAppleScriptです。

AppleScript的には、System Eventsを経由してプロセスの起動中確認を行います。

AppleScript名:指定Bundle IDのプロセス存在確認(AS)
use AppleScript version “2.4″
use scripting additions

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshop”)
–> true

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshopoo!”)
–> false

on chkAppProcesByBundleID(aBundleID as string)
  tell application “System Events”
    set a to every process whose bundle identifier is aBundleID
    
if length of a 1 then
      return true
    else
      return false
    end if
  end tell
end chkAppProcesByBundleID

★Click Here to Open This Script 

しかし、この方法ではもしもMac App Storeに申請するアプリケーションで、System Eventsへのアクセスが封じられたらおしまいです。一応、shell script経由でpsコマンドを実行するという手段もありますが・・・

そこで、ASOCでCocoaの機能を用いてプロセスの存在確認を行ってみました。もうちょっと短く書けそうな気配もするのですが、とりあえず。

AppleScript名:指定Bundle IDのプロセス存在確認(ASOC)
– Created 2015-02-08 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “AppKit”

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshop”)
–> true

set aRes to chkAppProcesByBundleID(“com.adobe.Photoshopoo!”)
–> false

on chkAppProcesByBundleID(aBundleID as string)
  set appArray to current application’s NSWorkspace’s sharedWorkspace’s runningApplications()
  
set appList to appArray’s ASify() as list
  
  
repeat with i in appList
    set anID to (i’s bundleIdentifier()) as string
    
if anID = aBundleID then
      return true
    end if
  end repeat
  
  
return false
end chkAppProcesByBundleID

★Click Here to Open This Script 

2015/02/08 指定アプリケーションの存在確認

Bundle IDで指定したアプリケーションの存在確認を行うAppleScriptです。

古くから(Classic Mac OSの時代から)、AppleScriptにはFinder経由でアプリケーションの存在確認を行う手段が用意されてきました。いまはBunde IDで、Classic Mac OS時代にはcreator codeで存在確認を行ってきましたが、同様にFinderに対して問い合わせを行っていました。

AppleScript名:指定アプリケーションの存在確認(AS)
use AppleScript version “2.4″
use scripting additions

set aRes to chkAppIsInstalled(“com.adobe.photoshop”)
–> true

on chkAppIsInstalled(aBundleID as string)
  try
    tell application “Finder”
      set a to application file id “com.adobe.photoshop”
    end tell
    
return true
  on error
    return false
  end try
end chkAppIsInstalled

★Click Here to Open This Script 

そのため、一般的にはFinderで確認する方法で問題はないのですが、もしもMac AppStoreに申請を行うASOCのアプリケーションでFinder経由の確認を行っていた場合に、唐突に「この方法ではダメ」と言われかねません。

そこで、Cocoaの機能を利用して確認を行う方法について調査しておきました。速度面でとくに通常のASにくらべて有利ということはありませんが、SandBox内での実行が制限されづらいだろうということで書いておきました。

実際、有名なところではログイン時に自動起動されるStartup ItemsにAppleScript経由で登録する方法を採用すると、Mac App Store申請時にリジェクトされるという制限が知られています。

AppleScript名:指定アプリケーションの存在確認(ASOC)
– Created 2014-12-23 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aRes to chkAppIsInstalled(“com.adobe.photoshop”)
–>  true

on chkAppIsInstalled(aBundleID as string)
  set aRes to current application’s NSWorkspace’s sharedWorkspace()’s URLForApplicationWithBundleIdentifier:aBundleID
  
set bRes to (aRes is not equal to missing value)
  
return bRes
end chkAppIsInstalled

★Click Here to Open This Script 

2015/02/02 カレンダー.app(旧称iCal)で選択中のイベントの情報を取得

海外のBlogで、カレンダー.app(Calendar.app)の画面上で選択中のイベントの情報を取得するAppleScriptが公開されていました。

→ Reference selected Calendar events in AppleScript

カレンダー.appのAppleScript用語辞書にはselectionとかselected eventなどの予約語が用意されておらず、そのうえ「リマインダー.app」とイベントが共有されており区別できないなど、Apple純正アプリとしてはかなり「残念な出来」になっている筆頭残念アプリケーションです。

同Blogによれば、AppleScript用語辞書にselectionなどのプロパティは存在しないのに、設定ファイル”com.apple.ical.plist”には「SelectedEvents」のエントリが存在しているので、それをdefaults readコマンドで読み取って、parseして、sqlite3経由でsqlを発行して該当するイベントの情報を取得するのだとか。

・・・ここまでしないと取得できないことを嘆くべきか、存在しない機能を実現した努力を讃えるべきなのか、そもそも最初からselectionの機能があるべきという主張をすべきなのか、なかなか悩ましいところです。

カレンダー.app上でイベントを選択して同AppleScriptを実行してみたところ、どうも「選択中のイベントを取得できる」ときと「できない」ときがあります。ソース中にもそのように書いてあり、いろいろ試行錯誤してみたところ・・・

数行追加したら、バッチリ取れるようになりました。ただ、フィードバックするにも同Blogはコメント読んでないようで・・・修正版を掲載しておきます。オリジナルのScriptでは、取得した「選択中のイベント」の発生15分前にアラームを鳴らすようにしてありましたが、変更されるのがいやだったのでコメントアウトしてあります。

AppleScript名:カレンダー.app上で選択中のイベントを取得する
–https://www.johneday.com/1086/reference-selected-calendar-events-applescript
– Title: Reference selected Calendar events in AppleScript
– Created 2015-02-02 by @johneday on Twitter
– Modified 2015-02-02 by Takaaki Naganoya

use AppleScript version "2.4"
use scripting additions

——————————
– ABOUT
——————————
– Written and tested in Yosemite, Calendar Version 8.0
– The plist may take several seconds to update after a new event has been selected.
– Only the first instance of a recurring event will be referenced.

——————————-
– Modify by Takaaki Naganoya
——————————
tell application "Calendar"
  if running = false then return
  
activate
end tell
do shell script "sync"

——————————-
– MAIN CODE
——————————
set defaultsReply to (do shell script "defaults read com.apple.ical SelectedEvents")
set selectedEvents to parseDefaults(defaultsReply)

if selectedEvents = {} then
  display notification "Please try again" with title "No Calendar Event Selected"
  
return
end if

set eventReferenceList to {}
repeat with sEvent in selectedEvents
  set {eventID, calendarID} to sqlQuery(sEvent)
  
tell application "Calendar"
    set eventReference to event id eventID of calendar id calendarID
    
– INSERT YOUR CODE TO PROCESS EACH EVENT
    
    – Example of "Alert 15 minutes before start"
    
–my addDisplayAlarm(eventReference, -15)
    
    – OR BUILD A LIST OF EVENTS
    
set end of eventReferenceList to eventReference
  end tell
end repeat
return eventReferenceList

——————————
– HANDLERS
——————————
on parseDefaults(resultText)
  set localUIDs to {}
  
set {TID, text item delimiters} to {text item delimiters, quote}
  
set resultItems to text items of resultText
  
set text item delimiters to TID
  
repeat with i from 1 to (count resultItems)
    if i mod 2 = 0 then set end of localUIDs to resultItems’s item i
  end repeat
  
return localUIDs
end parseDefaults

on sqlQuery(localUID)
  local dateString, localUID
  
if localUID contains "/" then
    set {TID, text item delimiters} to {text item delimiters, "/"}
    
set {dateString, localUID} to text items of localUID
    
set text item delimiters to TID
  end if
  
  set sqlText to "
SELECT DISTINCT zcalendaritem.zshareduid AS eventID
, znode.zuid as calID
FROM zcalendaritem
JOIN znode
ON znode.z_pk = zcalendaritem.zcalendar
AND zcalendaritem.zlocaluid = ’" & localUID & "’
;"
  
  set sqlPath to POSIX path of (path to library folder from user domain) & "Calendars/Calendar Cache"
  
set {TID, text item delimiters} to {text item delimiters, "|"}
  
set {eID, cID} to text items of (do shell script "echo " & quoted form of sqlText & " | sqlite3 " & quoted form of sqlPath)
  
set text item delimiters to TID
  
return {eID, cID}
end sqlQuery

on addDisplayAlarm(myEvent, triggerInterval)
  tell application "Calendar"
    tell myEvent
      if not (exists (display alarms whose trigger interval = triggerInterval)) then
        set myAlarm to make new display alarm at end of display alarms with properties {trigger interval:triggerInterval}
      end if
    end tell
  end tell
end addDisplayAlarm

★Click Here to Open This Script 

2015/01/22 指定したアプリケーションの各lproj内の各stringsファイルのパス一覧を取得する

指定したアプリケーションの各言語のlprojフォルダ内にある、各stringsファイルへのパスを取得するAppleScriptです。

各アプリのローカライズ情報を取り出すプログラムはいろいろと試してはいるものの、作り方とかローカライズ方法が全然違うアプリケーションが紛れていることがあり、イレギュラーを除去すべきなのかも(Apple純正でもSafariあたりは全然違うし)。

AppleScript名:指定したアプリケーションの各lproj内の各stringsファイルのパス一覧を取得する
– Created 2015-01-22 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "ASObjCExtras"

set apPath1 to (path to applications folder) –dialog’s default directory
set anAlias to choose file of type "com.apple.application-bundle" default location apPath1 with prompt "ローカライズ情報を取得するアプリケーションを選択"
set aRes to getStringsPathWithinEachLanguageInApp(anAlias)
–> {{langStr:"English", stringsPath:{"/Applications/mi.app/Contents/Resources/English.lproj/Localizable.strings"}}, {langStr:"Japanese", stringsPath:{"/Applications/mi.app/Contents/Resources/Japanese.lproj/Localizable.strings"}}}

–指定したアプリケーションの各lproj内の各stringsファイルのパス一覧を取得する
on getStringsPathWithinEachLanguageInApp(anAlias)
  –アプリケーションのローカリゼーションを取得する(言語の重複を許容)
  
set locList to getSpecifiedAppFilesLocalizationListWithDuplication(anAlias) of me
  
  
set lprojList to {}
  
  
repeat with ii in locList
    
    
set jj to contents of ii
    
    
set appPath to POSIX path of anAlias
    
set appBundle to (current application’s NSBundle’s bundleWithPath:appPath)
    
set resPath to ((appBundle’s pathForResource:jj ofType:"lproj") as string) & "/"
    
    
if resPath is not equal to missing value then
      
      
set aLangBundle to (current application’s NSBundle’s bundleWithPath:resPath)
      
if aLangBundle is not equal to missing value then
        
        
set stringsList to (aLangBundle’s pathsForResourcesOfType:"strings" inDirectory:"") as list
        
        
if stringsList is not equal to {} then
          set the end of lprojList to {langStr:jj, stringsPath:stringsList}
        end if
        
      end if
    end if
    
  end repeat
  
  
return lprojList
  
end getStringsPathWithinEachLanguageInApp

–指定アプリケーションファイルの、指定Localeにおけるローカライズ言語リストを求める。重複を許容
on getSpecifiedAppFilesLocalizationListWithDuplication(anAppAlias as alias)
  
  
set aURL to (current application’s SMSFord’s URLFrom:anAppAlias)
  
set aBundle to current application’s NSBundle’s bundleWithURL:aURL
  
  
set theNSLocale to current application’s NSLocale’s localeWithLocaleIdentifier:"en" –Output Locale Name in English (en)
  
  
–Get Localization Info
  
set locList to aBundle’s localizations()
  
–> {"de", "English", "fr", "French", "German", "ja", "Japanese"}
  
  
return locList as list
  
end getSpecifiedAppFilesLocalizationListWithDuplication

★Click Here to Open This Script 

2015/01/22 言語と地域の「優先する言語」を取得する(ASOC)

「システム環境設定」の「言語と地域」で、「優先する言語:」に指定されている言語リストを取得するAppleScriptです。

本当は、OS上で用意している言語(35言語)のリストが欲しかったのですが、とりあえず。

international.png

AppleScript名:言語と地域の「優先する言語」を取得する(ASOC)
– Created 2015-01-22 by Takaaki Naganoya
– 2015 Piyomaru Software
– Technical Q&A QA1391
– How can I determine the order of the languages set by the user in the Language tab of the International preference pane?
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set defaultsO to current application’s NSUserDefaults’s standardUserDefaults()
set globalDomain to defaultsO’s persistentDomainForName:"NSGlobalDomain"
set langArray to (globalDomain’s objectForKey:"AppleLanguages") as list
–>  {​​​​​"ja", ​​​​​"en-US", ​​​​​"en-GB", ​​​​​"fr", ​​​​​"en"​​​}

★Click Here to Open This Script 

2015/01/13 Display情報の取得

NSScreenの情報にアクセスして、各ディスプレイの詳細情報を取得するAppleScriptです。

img_0866.png

非Retina DisplayはResolutionが{width:72.0, height:72.0}、MacBook Pro Retina 2012のRetina Displayは{width:144.0, height:144.0}と返ってきます。

screens0.png

ただ、結果を見直してみると・・・RetinaではないDisplayでも{width:144.0, height:144.0}と返ってくるケースがあり、実際にScreen CaptureをそのDisplay上で行うとRetina解像度のキャプチャ画像が取得されたりして、ソフトウェア的なResolutionのことを指しているのではないかとも思われます。

moni12.png

その割に、同一構成でMacBook Pro Retina本体をLid Closed Mode運用させると(本体を閉じると)、Resolutionで軒並み{width:72.0, height:72.0}が返ってくるあたりが悩ましいです。

ここでは、「OSが返してくる値がこうなっている」という事実のみ書いておきます。ご覧の通り、とくにScript側で数値に手心を加えているわけではありません。

moni3.png

上記のように、同一の表示&同一のDisplay上でのScreen Capture画像を比較した場合に、Retina Displayを含むモニター群の場合の画面キャプチャと、含まない場合の画面キャプチャでは解像度が異なっていました。仮想画面自体が、Retina Modeと非Retina Modeの切り替えを行うのかもしれません。

なお、本ScriptはCocoa経由でデスクトップピクチャを調査しようとして作成した副産物です(でも、AppleScript経由で調べたほうが圧倒的に楽、、、、)。

AppleScript名:display情報の取得
– Created 2015-01-13 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “AppKit”

–Retina Displayを含む構成のとき
set dInfoList to retScreenInfos()
–>  {{screenSize:{{width:1920.0, height:1200.0}}, screenResol:{{width:144.0, height:144.0}}, screenIsScreen:true, screenNumber:”69501832″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}, {screenSize:{{width:1920.0, height:1200.0}}, screenResol:{{width:144.0, height:144.0}}, screenIsScreen:true, screenNumber:”69513475″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}, {screenSize:{{width:1920.0, height:1200.0}}, screenResol:{{width:144.0, height:144.0}}, screenIsScreen:true, screenNumber:”69731202″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}, {screenSize:{{width:1920.0, height:1080.0}}, screenResol:{{width:72.0, height:72.0}}, screenIsScreen:true, screenNumber:”458586661″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}}

–Retina Displayを含まない構成のとき(MacBook Pro Retina本体のLid Closed Mode時)
set dInfoList to retScreenInfos()
–>  {{screenSize:{{width:1920.0, height:1200.0}}, screenResol:{{width:72.0, height:72.0}}, screenIsScreen:true, screenNumber:”69501832″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}, {screenSize:{{width:1920.0, height:1200.0}}, screenResol:{{width:72.0, height:72.0}}, screenIsScreen:true, screenNumber:”69513475″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}, {screenSize:{{width:1920.0, height:1080.0}}, screenResol:{{width:72.0, height:72.0}}, screenIsScreen:true, screenNumber:”458586661″, screenColorSpace:”NSCalibratedRGBColorSpace”, screenColDepth:”8″}}

on retScreenInfos()
  set sList to (current application’s NSScreen’s screens()) as list
  
  
set dList to {}
  
repeat with i in sList
    set a to i’s deviceDescription()
    
set aSize to a’s NSDeviceSize as list
    
set aResol to a’s NSDeviceResolution as list
    
set aScrn to a’s NSDeviceIsScreen as boolean
    
set aNum to a’s NSScreenNumber as string
    
set aColSpc to a’s NSDeviceColorSpaceName as string
    
set aColDepth to a’s NSDeviceBitsPerSample as string
    
set the end of dList to {screenSize:aSize, screenResol:aResol, screenIsScreen:aScrn, screenNumber:aNum, screenColorSpace:aColSpc, screenColDepth:aColDepth}
  end repeat
  
  
return dList
  
end retScreenInfos

★Click Here to Open This Script