Archive for the 'System Preferences' Category

2017/11/08 システム環境設定で指定のpane中の指定のanchorを表示する v2

システム環境設定で指定のpane中の指定のanchorを表示するAppleScriptです。

comapplesystempreferences_resized.png

システム環境設定はScriptableなアプリケーションですが、どのpane、どのpane中のanchorを表示するぐらいの機能しかついていません。項目によってはSystem Events経由で設定内容を取得・再設定することもできます。

syspref1_resized.png
▲「一般」「デスクトップとスクリーンセーバ」などの各項目がpane

syspref2_resized.png
▲「ディスプレイ」「配置」などの各項目がanchor。ただし、かならずしも各タブ項目がanchorとして定義されているわけではない

Mac OS X 10.2:ただ辞書がついただけ
Mac OS X 10.4:paneとanchorが取得できるようになった。revealコマンドが追加された
Mac OS X 10.5:print系の機能が強化された

と、Mac OS X 10.4でほぼ機能が確立して、以後あまりAppleScriptから利用できる機能について変更されていません。最新のSystem Preferences.app v14ではauthorizeというユーザー認証(ユーザー名とパスワードの入力)を求める機能が追加されたぐらいです。

syspref_auth.png

authorizeでユーザー認証が成功したかどうか、という結果は返ってきません。ただ、認証のダイアログを表示させるだけのコマンドです。

ただし、システム環境設定のPaneにどのようなものがあり、その中に含まれるanchorにどのようなものがあるかどうかは、OSバージョンごとに異なります。

AppleScript名:システム環境設定で指定のpane中の指定のanchorを表示する v2
– Created 2017-10-10 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4956

set aList to getEveryPaneID() of me
–> “com.apple.preferences.appstore”, “com.apple.preferences.Bluetooth”, “com.nvidia.CUDAPref”….}

set pList to getEveryAnchorName(“com.apple.preference.displays”) of me
–> {”displaysArrangementTab”, “displaysNightShiftTab”, “displaysColorTab”, “displaysGeometryTab”, “displaysDisplayTab”}

set aRes to dispSystemPreferences(“com.apple.preference.displays”, “displaysNightShiftTab”) of me
–> true

on dispSystemPreferences(paneID, anchorID)
  tell application “System Preferences”
    activate
    
set pList to id of every pane
    
if paneID is not in pList then return false
    
    
set current pane to pane paneID
    
tell current pane
      set nList to name of every anchor
      
if anchorID is not in nList then return false
      
reveal anchor anchorID
    end tell
  end tell
  
  
return true
end dispSystemPreferences

on getEveryPaneID()
  tell application “System Preferences”
    return id of every pane
  end tell
end getEveryPaneID

on getEveryAnchorName(paneID)
  tell application “System Preferences”
    set pList to id of every pane
    
if paneID is not in pList then return false
    
set current pane to pane paneID
    
tell current pane
      return name of every anchor
    end tell
  end tell
end getEveryAnchorName

★Click Here to Open This Script 

AppleScript名:システム環境設定の「セキュリティとプライバシー」でユーザー認証
– Created 2017-10-10 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4956

set aRes to dispSystemPreferences(“com.apple.preference.security”, “Privacy_Assistive”) of me

tell application “System Preferences”
  authorize current pane
end tell

on dispSystemPreferences(paneID, anchorID)
  tell application “System Preferences”
    activate
    
set pList to id of every pane
    
if paneID is not in pList then return false
    
    
set current pane to pane paneID
    
tell current pane
      set nList to name of every anchor
      
if anchorID is not in nList then return false
      
reveal anchor anchorID
    end tell
  end tell
  
  
return true
end dispSystemPreferences

★Click Here to Open This Script 

2016/02/28 OS X 10.11ですでに利用可能になっていた日本語音声コマンド呼び出し

OS X 10.12になると、OS XでもSiriが利用可能になるなどの「噂」が聞こえてきています。使えれば便利ですが、使えないと困るというほどでもありません。

音声認識操作についていえば、Apple WatchがMacに直接BluetoothなりWiFiでつながって、Macの外部マイク的な役割を果たしてくれるか、Bluetoothヘッドセットを音声認識用に併用できないと一定レベルの実用性を確保しづらいところです。

OS Xに搭載されている音声認識コマンド自体について、現状(OS X 10.11)ではどうなのか? ちょっと確認してみました。

確認してみたところ、OS X 10.11上ですでに日本語で各種音声コマンドが呼び出せるようになっていることを見つけました。

v1.png
▲システム環境設定

v2.png
▲アクセシビリティ>音声入力。「次のキーワードで音声入力を有効にする」にチェックを入れないと、メニューバーに音声コマンド用のメニューエクストラ(マイクのアイコン)が表示されない

v3.png
▲「高度なコマンドを有効」はデフォルトではオフになっている。「メニューバーにアクセシビリティの状況を表示」もデフォルトでオフ。メニュー表示させておいたほうが便利

v5.png
▲音声コマンドの制御メニューアイテム

v6.png
▲とりあえず「キーワードなしで聞き取り」をメニューから実行すると、音声認識パレットが表示される

v7.png
▲音声入力コマンドパレット。音声認識コマンド一覧を表示。音声認識コマンド「コマンドを表示」で表示、「コマンドを隠す」で消去

AppleScriptでコマンドを追加するには、AppleScriptでアプレットを記述し、「システム環境設定」で追加可能。

v8.png

「+」をクリックするとユーザーによる音声認識コマンドを追加。

v9.png

AppleScriptアプレットを「Finder項目を開く…」で指定して実行させる

Spotlight検索や辞書検索については、この音声入力コマンドでフリーキーワードを指定できるようになっており、あなどれないレベルに達していることがわかります。ただ、複数のアプリケーションを操作して実現するような複雑で高度なAppleScriptを実行できるかどうかは、実際に確認してみないとわかりません。

ただ、GUIのメニュー階層を音声認識でナビゲートするのは、実際に作って使ってみるとかーーなりかったるいのと、1つの音声コマンドに類義語(エイリアスみたいなもの)を定義できないと実用性が下がります、、、、

Siriのキモは人間が間違った音声入力を行っても事前に想定したシナリオどおりに処理する柔軟なシナリオ制御能力。「可変パラメータ」+「固定コマンド」の組み合わせという高度な処理を行っているので、当初はOS側が用意したコマンドしか実行できない可能性も考えられます。

2011/03/20 サウンド入力元、出力先を設定する

システム環境設定の「サウンド」で入力元、出力先を切り替えるAppleScriptです。

例によってGUI Scriptingのプログラムであるため、OSがアップデートした際には微妙な手直しが発生するはずです。

いいかげん、オーディオ入出力関連の切り替えごときは標準命令で持っていてほしいのですが……10.7で標準搭載してくれないものでしょうか。

スクリプト名:サウンド入力元、出力先を設定する
set aRes to setSountInputSource("ライン入力") of me
–> true(設定成功の場合。失敗の場合にはfalseを返す)

set aRes to setSountOutputSource("内蔵スピーカー") of me
–> true(設定成功の場合。失敗の場合にはfalseを返す)

–サウンド入力先を設定
on setSountInputSource(aName)
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 3 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
if aStr = aName then
          set selected of row i of table 1 of scroll area 1 of tab group 1 of window 1 to true
          
return true
        end if
      end repeat
    end tell
  end tell
  
  
return false
end setSountInputSource

–サウンド出力先を設定
on setSountOutputSource(aName)
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 2 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
if aStr = aName then
          set selected of row i of table 1 of scroll area 1 of tab group 1 of window 1 to true
          
return true
        end if
      end repeat
    end tell
  end tell
  
  
return false
end setSountOutputSource

–システム環境設定で「サウンド」に表示を切り替える
on displaySoundPaneInSystemPrefs()
  tell application "System Preferences"
    activate
    
set current pane to pane "com.apple.preference.sound"
  end tell
end displaySoundPaneInSystemPrefs

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

2011/03/20 サウンド入力元、出力先の名称をリストで取得する

システム環境設定から、サウンドの入力元、出力先の名称をリストで取得するAppleScriptです。

よくあるGUI Scriptingのプログラムなので、Mac OS X 10.7になったら手直しが必要になること必至ではありますが、(個人的に)早急に必要になったので組んでみました。

スクリプト名:サウンド入力元、出力先の名称をリストで取得する
set outList to getEverySoundOutputName() of me
–> {"内蔵スピーカー", "PROPlantronics", "Soundflower (2ch)", "Soundflower (16ch)"}

set inList to getEverySoundInputName() of me
–> {"内蔵マイク", "ライン入力", "PROPlantronics", "Soundflower (2ch)"}

–サウンド出力先のリストを取得
on getEverySoundOutputName()
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 2 of tab group 1 of window 1 –「出力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
set the end of outList to aStr
      end repeat
    end tell
  end tell
  
  
return outList
end getEverySoundOutputName

–サウンド入力先のリストを取得
on getEverySoundInputName()
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 3 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
set the end of outList to aStr
      end repeat
    end tell
  end tell
  
  
return outList
end getEverySoundInputName

–システム環境設定で「サウンド」に表示を切り替える
on displaySoundPaneInSystemPrefs()
  tell application "System Preferences"
    activate
    
set current pane to pane "com.apple.preference.sound"
  end tell
end displaySoundPaneInSystemPrefs

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

2011/02/11 システム環境設定で指定のpaneを表示する

システム環境設定(System Preferences.app)で指定のpaneを表示するAppleScriptです。

まず、どのpaneを表示するかを決める前に、AppleScriptからどのようなpaneが、どのように見えるのかを確認しておかなければなりません。IDや名称などはOSのバージョンが上がると変更になることもあるからです(あとは、AppleがOSのアップデータで新たにバグを作って、それに影響を受けるとか)。

まずは、最低でもAppleScriptエディタ(Mac OS X 10.5まではスクリプトエディタ)で、システム環境設定のAppleScript用語辞書ぐらいは調べておく必要があります。

AppleScriptエディタにシステム環境設定のアイコンをドラッグ&ドロップすると、システム環境設定の用語内容を確認できます。

pref2.jpg

paneを変更するのであれば、当然「pane」にどのようにアクセスできるかは知っておかなくてはなりません。

pref3.jpg

id、localized name、nameあたりを調べてみましょう。

スクリプト名:システム環境設定ですべてのpaneのIDを取得する
tell application “System Preferences”
  set pList to id of every pane
end tell

–> {”com.avatron.AirDisplayPrefPanel”, “com.apple.preferences.Bluetooth”, “com.apple.preference.digihub.discs”, “com.divx.divxprefs”, “com.apple.preference.dock”, “com.apple.preference.expose”, “net.telestream.wmv.prefpane”, “com.growl.prefpanel”, “com.google.MacFUSE”, “com.apple.preference.internet”, “org.perian.PerianPane”, “com.ecamm.printopia”, “com.spanningsync.prefPane”, “com.apple.preference.spotlight”, “com.apple.prefs.backup”, “com.apple.preferences.users”, “com.apple.preference.general”, “com.apple.preference.keyboard”, “com.apple.preference.sound”, “com.apple.preference.speech”, “com.apple.preference.security”, “com.apple.preferences.softwareupdate”, “com.apple.preference.displays”, “com.apple.preference.desktopscreeneffect”, “com.apple.preference.trackpad”, “com.apple.preference.network”, “com.apple.preference.printfax”, “com.apple.preferences.parentalcontrols”, “com.apple.preference.mouse”, “com.apple.preference.universalaccess”, “com.apple.preference.startupdisk”, “com.apple.preferences.sharing”, “com.apple.Localization”, “com.apple.preference.energysaver”, “com.apple.preference.datetime”}

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

スクリプト名:システム環境設定ですべてのpaneのlocalized nameを取得する
tell application “System Preferences”
  set pList to localized name of every pane
end tell

–> {”Air Display”, “Bluetooth”, “CD と DVD”, “DivX”, “Dock”, “Exposé と Spaces”, “Flip4Mac WMV”, “Growl”, “MacFUSE”, “MobileMe”, “Perian”, “Printopia”, “Spanning Sync”, “Spotlight”, “Time Machine”, “アカウント”, “アピアランス”, “キーボード”, “サウンド”, “スピーチ”, “セキュリティ”, “ソフトウェア・アップデート”, “ディスプレイ”, “デスクトップとスクリーンセーバ”, “トラックパッド”, “ネットワーク”, “プリントとファクス”, “ペアレンタルコントロール”, “マウス”, “ユニバーサルアクセス”, “起動ディスク”, “共有”, “言語とテキスト”, “省エネルギー”, “日付と時刻”}

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

スクリプト名:システム環境設定ですべてのpaneのnameを取得する
tell application “System Preferences”
  set pList to name of every pane
end tell

–>
(*
{”Air Display”, “Bluetooth”, “CD と DVD”, “DivX”, “Dock”, “Expos
é
Spaces”, “Flip4Mac
WMV”, “Growl”, “MacFUSE”, “MobileMe”, “Perian”, “Printopia”, “Spanning
Sync”, “Spotlight”, “Time Machine”, “アカウント”, “アピアランス”, “キーボード”, “サウンド”, “スピーチ”, “セキュリティ”, “ソフトウェア
アップデート”, “ディスプレイ”, “デスクトップと
スクリーンセーバ”, “トラックパッド”, “ネットワーク”, “プリントと
ファクス”, “ペアレンタル
コントロール”, “マウス”, “ユニバーサル
アクセス”, “起動ディスク”, “共有”, “言語とテキスト”, “省エネルギー”, “日付と時刻”}
*)

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

と、こんな感じです。

……nameのあたりに微妙にバグっぽい実装が見られます。

Apple純正のpreferences paneがおそらく英語名称が返ってくるであろうnameでlocalized nameを返してきています。日本語ローカライズした担当が「しなくていいところまで日本語ローカライズ化」したためと思われます。おそらく、置換コマンドか何かで機械的に置き換えたんでしょう。この仕事をした担当者は相当使えない人間です。

Appleのどの担当者がどういうヘマをやらかすか認識した上で、「paneの指定にnameは使わないほうがよさそうだ。どうせ後でしれっと直すかもしれない」と考えます。

localized nameだと、英語やフランス語など別の言語環境で実行したときに動かなくなるので、ここは消去法で無難に「ID」で指定しておいたほうがよさそうです。

では、ひととおりのpaneのidをリストアップして、希望のpaneを表示状態にできるかどうか確認してみましょう。

スクリプト名:システム環境設定で指定のpaneを表示する
tell application “System Preferences”
  activate
  
  
set pList to id of every pane
  
set pRes to choose from list pList
  
  
set pItem to first item of pRes
  
  
set current pane to pane pItem
  
end tell

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

pref.jpg

選択したpaneを表示できたでしょうか? どうせAppleのやることなので、連中はすべての機能をチェックなどしていません。とりあえずすべてのpaneが選択できるか確認しておく必要があります。

そこまで調べて、最後に希望のpaneのIDを指定して表示状態にできるというわけです。

スクリプト名:システム環境設定で「日付と時刻」paneを表示状態にする
tell application “System Preferences”
  activate
  
set current pane to pane “com.apple.preference.datetime”
end tell

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

一見、何も工夫も努力もしていないかのように見える3行ぐらいのコードのために、そのぐらいの調査はしています。

アマチュアレベルで、自分の場所でいまのバージョンのOS上だけで動くコードならこのレベルでよいのですが、コードを配布して多くのユーザーに使ってほしいと考えた場合には、希望のpaneの名称を文字列で持っておいて、localized nameの一覧とその文字列を照合し、合致したらそのpaneのIDを取得して表示……というところまでやっておく必要があるでしょう。

システム環境設定のAppleScript用語辞書を見ていたら、paneの下のところにあるtype difinitionで……

pref4.jpg

こんなものを見つけました。作業途中に付けておいたのかもしれませんが、AppleScript用語辞書をエンジニア同士の文通欄にしてほしくないものです。「????」なんて、インターンの学生が分からなくて付けておいたメモぐらいにしか見えないのですが……つくづくAppleのチェックはザルだと思うものです。