#!/usr/bin/xcrun swift
import Cocoa
struct ProgramOption {
var list : Bool = false
var set : String? = nil
var help : Bool = false
}
func getInstalledBrowsers () -> [ NSBundle ] {
var browsers = [ NSBundle ]()
let array = LSCopyAllHandlersForURLScheme("http").takeRetainedValue()
for var i = 0, len = CFArrayGetCount(array); i < len; i++ {
let bundleId = unsafeBitCast(CFArrayGetValueAtIndex(array, i), CFString.self) as String
if let path = NSWorkspace.sharedWorkspace().absolutePathForAppBundleWithIdentifier(bundleId) {
if let bundle = NSBundle(path: path) {
// let name: String = bundle.infoDictionary!["CFBundleName"] as String
browsers.append(bundle)
}
}
}
return browsers
}
func setDefaultBrowser (bundleId : String) -> Bool {
let httpResult = LSSetDefaultHandlerForURLScheme("http", bundleId)
let httpsResult = LSSetDefaultHandlerForURLScheme("https", bundleId)
if httpResult == noErr && httpsResult == noErr {
return true
} else {
return false
}
}
var option = ProgramOption()
for var i = 0, len = Process.arguments.count; i < len; i++ {
let arg = Process.arguments[i]
switch arg {
case "-h", "--help":
option.help = true
case "-l", "--list":
option.list = true
case "-s", "--set":
option.set = Process.arguments[++i]
default:
break
}
}
if option.help {
println("-h, --help: Show help (this)")
println("-l, --list: Show installed browser list")
println("-s [bundleId], --set [bundleId]: Set default browser to specified browser")
exit(0)
}
if option.list {
let browsers = getInstalledBrowsers()
for browser in browsers {
let bundleId = browser.bundleIdentifier!
let path = browser.bundlePath
println("\(bundleId)")
println("\t\(path)")
}
}
if let bundleId = option.set {
if setDefaultBrowser(bundleId) {
exit(0)
} else {
exit(1)
}
}
exit(0)

peco る

set_default_browser.swift --set $( set_default_browser.swift -l | grep -v "\t" | peco )

雑にpecoれる

経緯

むかしむかしに Obj-C で書いたことがあってな

  1. トップ
  2. tech
  3. デフォルトブラウザを5秒に1回変える人に便利な Swift スクリプト書いた (Mac)

出社した直後ぐらいからだるくなり、12時ごろに「もうこれはだめだな」と思い早退。

帰宅時点では37°ぐらいの微熱。悪寒がするので熱めの風呂に入ってからすぐ寝て、15時ぐらいに37.8°ぐらい。生卵をTKGとして摂取してひたすら寝つ続け、20時ぐらいに37.3°ぐらいまで下がる。それからまたひたすら寝て朝がたに36.5°ぐらいの平熱になった。

型紙付属のレシピから変えてマジックテープ式にしようとしたら (保育園の要求仕様を満たすため)、いろいろ失敗してしまった。マジックテープがどうも固く、ジグザグ縫いで目が飛びまくりどうしようもなく、しかたなく直線に変えたり、マチをつけて固定するところで手縫いする必要があるのだが、玉止めがうまくいかず……

とはいえ一応実用上は問題ない形に仕上げた…… 精進が必要。

オルファ(OLFA) セーフティロータリカッター ゴム L型 156B - オルファ(OLFA)

オルファ(OLFA)

5.0 / 5.0

オルファ(OLFA) 円形刃45ミリ替刃 RB45-1 - オルファ(OLFA)

オルファ(OLFA)

5.0 / 5.0

オルファ(OLFA) カッターマットA2 (450x620x2mm) 159B - オルファ(OLFA)

オルファ(OLFA)

5.0 / 5.0

布を切るといえば裁ち鋏でしょ??と思って思考停止していたけど、ローリングカッターを使ったほうが圧倒的に楽チンだった。

  1. 布を浮かす必要がない
    • 裁断精度があがる
  2. 1つの動作で完結できる
    • 裁ち鋏だと「ハサミを開く」「線にあわせる」「ハサミを線にあわせて閉じる」「途中で開いなおしてすすめる」を繰替えす
    • ローリングカッターはまっすぐ押すだけ。良く切れるのでほぼパツイチ

ただし欠点があって、一度に切れる長さはカッターマットの大きさに制限される。

裁断が結構気が重い作業だけど気が楽になるし、時短できるしチートアイテムっぽい。

アイロンで写せる型紙を購入したのだけれど、見ての通り色の濃い生地を買ってしまったので全く写らず (写ってるけど見えない)、チャコペーパーをひいてがんばって写した…… というか厚紙に型紙起こしなおしたほうがいいかもしれない。むずかしい。

キルティング地なのですこし不安だったけど、とくに問題もなく製作できた。

紐の通し口の処理が勉強になった。

布端のかがりを細かいジグザグではじめてしまったのでだいぶ時間がかかってしまった。とはいえ全体の作業時間は型紙写すのに試行錯誤した時間を含め2時間弱ぐらい。

備考

これも保育園グッズの一つなのだが、保育園からの要求仕様には「コップ入れ」とか書かれておらず、どのぐらいのサイズが必要なのか、全くわからない。中に入れるコップのサイズが分からないのに、コップ入れを用意しろといわれる。世の中は厳しい。

  1. トップ
  2. tech
  3. 今日のミシン: コップ入れ

保育園入園時に必要なものに、サイズ指定のグッズいろいろがあり、調達に悩んだ結果自作した話。

入園グッズの工面方法

  • 手芸店に外注 (布団カバー1つで工賃だけで4000円ぐらい)
  • 自分で作る
  • なんとかして既製品を探す

といった方法がある

外注しなかった理由

習得も含めた時間などのコストと得られるメリットとのトレードオフになる。外注できるならしてもいいが

  • 必要なものの工賃だけでミシン買えるぐらいする(人件費考えれば妥当な値段だけど)
  • ミシンも自由にあつかえないとか技術力低いのでは?
  • 子供が学校でミシンやるとき教えられるぐらいのスキルは欲しい
  • 今後もたびたび作ることになりそう

といった点を鑑みてミシンを買った。これ

トーヨー 電動ミシン レッド JY-1R - 東洋精器工業

東洋精器工業

5.0 / 5.0

実際に作る場合、ほかにもいろいろ必要なものがある。

  • 裁ち鋏
  • 糸切り鋏
  • 定規 (メジャーとかでもなんとかなるけど、チャコペンで線をひきにくい)
  • チャコ
  • ミシン糸 (#30〜#60ぐらい?)
  • ミシン針 (ミシンにも付属してるが太さがよくわからない。12 14 16 号あたりが必要?)
  • ボビン (ミシンに付属してる)
  • マチ針
  • ハリ山
  • 布 (案外高い)

ずっと裁縫道具は保存していたのでだいたいはなんとかなった。

大抵100円均一でも売ってるのでとりあえずはなんとかなりそう。ただ刃物系、糸切りハサミと断ちバサミはちゃんとしたのを買ったほうがストレスが少ないと思われる。

レオニス サイズがよく分かる カラーミシン針セット(10set)[99001] - LEONIS

LEONIS

3.0 / 5.0

SEWING 洋裁・手芸鋏 キャップ付 20.5cm ソフトリング - 貝印

貝印

3.0 / 5.0

Clover 糸切はさみ[ブラック]黒刃(10.5cm) 36-395 - クロバー(Clover)

クロバー(Clover)

3.0 / 5.0

布団カバー

まず作ったのが布団カバー。1つあたり布が260cmぐらい必要なので、布代だけで 2000 円はかかる (800円/m だとして)

比較的簡単だと思うが、縫う距離が長いので時間がかかる。裁断からやってできあがりまで、1枚あたり2時間〜3時間ぐらいかかった。

つまり時給1500円でも人件費だけで3000円〜4500円かかることになり、オーダーメイドの工賃は十分妥当な金額とわかる。

なので、その金額を外に出すか、自分でその分の仕事をするかの選択になる。(前述の通り内製で処理することにした。気楽に自力でそれだけ稼げる仕事なんてなかなかないわけだし)

品質はともかく作ることはできた。自分の子供が使うのだから過剰に品質にこだわることもないだろう。

のこり

まだまだ作るのがある。たぶんコツを捕めば楽しい気がするのでがんばる。

外注の考えかた

自分でやるのとコストがあまり変わらない場合 (スケールメリットがないとか) で自分でなんとかできそうなことなら、自分でやるほうを優先したい。外注してもスキルは得られず金が減るが、自作すればスキルも得られて金が出ていなかない。なにより技術力はずっと残って財産になる。

  1. トップ
  2. tech
  3. 保育園の入園グッズをつくるためにミシンを買った

Xcode 6.1.1 で Shortcut Recorder の 440a3d18e688142cd00fc88e4dc36ff355448fa6 を使ってみたらうまくいかなかった。

Xcode 上の Interface Builder で Custom View を追加し、Class を SRRecorderControl にすると、ビューがロードされてちゃんと表示される、という状態までは簡単にいけた。

しかし起動させてみるとグレーアウトされた状態になってしまった。これは enabled になっていないようなので、awakeFromNib で sr.enabled = true を付け加えた。これで起動させると、ひとまず動き、キー入力を受け付ける状態までは進むようになった。

しかし、キーを実際に入力しようとすると一切入力できず、無反応だった。これはどうやたら修飾キーまわりの設定が全くされていないとこのような挙動になるようだ。

結局 Shortcut Recorder のソースコードに println() を仕込みながら調べるハメになったが、デフォルトで設定されるはずのプロパティが一切設定されていないということがわかった。なので結局のところ自力で以下のようなコードを追加した。

inputHotkey.delegate = self
inputHotkey.allowsEscapeToCancelRecording = true
inputHotkey.setAllowedModifierFlags((NSEventModifierFlags.ShiftKeyMask | NSEventModifierFlags.CommandKeyMask | NSEventModifierFlags.ControlKeyMask | NSEventModifierFlags.AlternateKeyMask).rawValue, requiredModifierFlags: 0, allowsEmptyModifierFlags: false)
inputHotkey.enabled = true

該当コントロールのデフォルト値は initWithFrame: で行われているが、Interface Builder で配置したコントローラは initWithCoder: で初期化されるようなので、この処理が走らない。

Interface Builder 経由で置くことが想定されていないのだろうか。とはいえ README では IB で置けとも書いてあるし、よくわからない。

  1. トップ
  2. tech
  3. Shortcut Recorder がうまく動かなかった
  1. トップ
  2. swift
  3. Shortcut Recorder がうまく動かなかった
  1. トップ
  2. cocoa
  3. Shortcut Recorder がうまく動かなかった

水曜日に体調不良で会社を休んだ。といっても自分は頭痛と身体がだるいというだけで熱はなく、妻が高熱を出したために主に子供の面倒を見る必要があった。

子供の熱からの両親ダウンというパターンだった。これ思いのほか厳しい。子供が元気になってから親が体調不良になると、子供はとにかく元気良く、相手をするのが辛い。

あと自分は普段離乳食を作っておらず任せっぱなしだったので勝手がわからず苦労した。レトルトもあったので使ったらよかったが、頭が働いておらず効率的な方法を描けなかった。普段からの訓練が必要とは思っていながらも、やってもらってると甘えてしまう。

書いてなかったけど保育園は第一希望で内定しました。既に入園検診済み。

園長面談(平日だけど両親参加必須)というのがどういうものなのか心配……

前にMacRuby でスクリーンキャスト用のキーストローク表示スクリプトを書いたんですが、それを Swift で書きなおして機能を追加したりしてアプリにしました。

追加の機能:パスワードフィールドで自動非表示

基本的に AXSecureTextField への入力って、そもそもアクセシビリティのコールバックにこない?っぽいのですが、一部のアプリでは飛んできてしまったり、よくわからない挙動をします。

なので、こちらのツール側で、パスワードフィールドかどうかを判定して非表示に切り替えています。

と書くと簡単なんですが、実際一番やりたい Google Chrome ではデフォルトではアクセシビリティオブジェクトが生成されないみたいな罠があったり (VoiceOver が有効でなければアクセシビリティオブジェクトを作らない)、やっかいです。

あとよくやるパスワード入力といえば sudo ですが、ローカルについては sudo のプロセスが生きている限り自動的に非表示にするようにできるのですが、リモートではうまくできる方法が思いついていません (Terminal.app の画面内容をちゃんととれればヒューリスティックに判定できそうなんですが、screen 内だとそもそもとれないので諦めた)

Mac App Store

github で公開しつつ Mac AppStore に試しに出してみたいなと思っていたんですが、そもそもアクセシビリティAPIで他のアプリにちょっかいを出すアプリは、Mac AppStore で要求される App Sandbox 内では正常に動作しないみたいなので諦めました。

つまりアクセシビリティ機能を向上するためのアプリ (Assistive app) というのは Mac AppStore では出せないってことっぽいですね。純正の VoiceOver でも使ってろってことなんでしょうかね。

  1. トップ
  2. tech
  3. スクリーンキャスト用のキーストローク表示アプリ

自宅で使っているデスク

Garage CL-147H というやつ (約24kg)。fantoni GT-147H というやつ (約34kg) のほうがかっこいいけど、高い。

天板の色が濃くて、丈夫なやつが安くほしかった。これはかなり満足してる。ウォールナットタイプは幕板がないので左右に揺れやすいみたいだけど、普段使いでは全く気にしたことはない 。

天板自体に鉄パイプで補強がしてあり、60kg まで耐荷重がある。最近のモニタは軽いのでまずギリギリになることはなさそう。ゆすろうとすれば揺れるが、キーボード叩きまくる程度ではほとんど揺れることはない。キーボードを叩いてモニタが揺れたりすると、案外かなりイライラしてくるので、机はできるだけ丈夫で重いのを買うほうが良いと感じる。

デスクの配置

窓に背を向ける形、部屋の中のほうを向いて座っている。こうするとモニタを隔てて狭いスペースに身体が押しこめられるような形になって(狭くて雑然としているのが好きな自分には) 集中しやすい。

この配置だと家族と会話するとき後ろに振りかえる必要がない (ただしモニタで遮られているので相手か自分が少し動く必要がある) し、モニタで表示している内容をカジュアルに見られたりすることがないので、エロ画像を見ててもバレにくいというメリットがある (あんまり家で仕事しないけど、最悪自宅で仕事するときも都合が良い)。

チェア

 -

5.0 / 5.0

中古 13000円ぐらいで買ったイトーキのプラオチェアというのを使ってる (前書いたエントリ)。現時点で全く問題に感じる点はない。新品でも5万円ぐらいで、アーロンチェアとかと比べたらかなり安いと思うけど必要十分な機能はあると思う。ただ、金が無限にあるならバロンチェアが欲しいです。

フロアシート 1800×910×1.5mm(1畳サイズ) クリア A712 - ロイヤル通販(Royal Sale)

ロイヤル通販(Royal Sale)

3.0 / 5.0

賃貸なので床にシートをひいている。これは今のところ不満はあまりない (ちょっと見た目が悪いとか、床にくっつきすぎるとかが不満) けど、本質的な問題は次に引越すときに出てきそうなのでなんともいえない。

モニタ ディスプレイ

Dell 4Kモニター 23.8インチ P2415Q(3年間無輝点交換保証/sRGB 99%/広視野角/IPS非光沢/フリッカーフリー/DP,mDP,HDMI/高さ調整/回転) - Dell

Dell

4.0 / 5.0

Dell ディスプレイ モニター U2713H 27インチ/WQHD/IPS非光沢/6ms/DVI(DL),HDMI.DPx2(MST)/AdobeRGB 99%/USBハブ/3 - Dell

Dell

5.0 / 5.0

  • P2415Q (23.8インチ 4Kディスプレイ)
  • U2713H (27インチ AdobeRGB 色域ディスプレイ)

をディスプレイアームで固定している。電子工作する関係でとにかくデスクの空いているスペースを広くとりたいので、モニタの本体はデスクの端よりも外に出るように設置している。

エルゴトロン LX デスク モニターアーム アルミニウム 34インチ(3.2~11.3kg)まで VESA規格対応 45-241-026 - エルゴトロン

エルゴトロン

5.0 / 5.0

マウス・マウスパッド・キーボード

Logicool ロジクール ワイヤレスマウス M310t シルバー - Logicool(ロジクール)

Logicool(ロジクール)

5.0 / 5.0


SteelSeries ゲーミングマウスパッド ノンスリップラバーベース 32cm×27cm×0.2cm QcK 63004 ブラック - SteelSeries

SteelSeries

5.0 / 5.0

マウスはロジクールの M310 という無線マウス。手にあうマウスって案外すくないけど、これは使いやすい。

マウスパッドは Steel Series QCK。会社もこれ。ずっとこれ。最高。いちばん売れてるサイズよりもワンサイズ上かな? 小さくてもいい気はしてます。

 -

5.0 / 5.0

今使っているキーボードは先日 @naoya_ito さんから頂いた HHKB Pro2 墨で、会社もこれを使ってる (少し前までは自宅では MacBook のキーボードを直接叩いてた) 後ろに「ナオヤモデル」って今度サインしようと思います。最近会うことがないので、自分で…

最近のコード整理事情

ソースコードではなく物理的なコード

デスクの裏に100均のワイヤーラティス(網)をつけているというのは前に書いたが、最近はこれまた100均で2個100円で売られているC型クランプを4つ使い固定するようにした。前まで両面テープで固定していたが、どうしても時間が経過すると落ちてきてしまっていた。クランプを使うことにより完全に落ちなくなったのである程度重さがあるACアダプタとかもデスク裏に置いておけるようになった。ref. 500 Can't connect to lowreal.net:443 (certificate verify failed)

配線ボックスに入れるよりは放熱性があるかなという感じ。机の裏のはじっこのほうは案外デッドスペースなので活用できると嬉しい。

C型クランプはこういう感じのやつ (100均のなので、これよりもっと安いけど)

アルミ C型クランプ 50mm - ARC

ARC

3.0 / 5.0

周辺機器

Vertex Standard スタンダード HF/50MHz オールモードトランシーバー FT-450DM(HF・50MHz/50W) - YAESU

YAESU

5.0 / 5.0

アマチュア無線関係の機器と電子工作用の機器が端っこに置いてある。前までデスクの上で置いていたけど、作業スペースを増やしたいので、別の棚の上に置く形にしている。

その他

子どものときから、雑然としていて機械いっぱいに囲まれているデスクに憧れがある。昨今の風潮としてはモノは少ないほど良いというのがあって、まぁそれはそうだろうと思うし、なんか賢そうで良いと思うんだけど、それには逆行する形でいろいろ導入している。

測定器は憧れの最たるところで、とにかくかっこいいし夢が広がる。とはいえ現状では「必要に応じて」という原則をどうしても持っているので、自分のスキルレベルが上がらなければ新しい測定器の必要性が出てこない。

ものが増えると(特に家が狭い場合)保有コストというのがバカにならないので、あらゆるモノの導入には抵抗があるが、なんとかしてゴチャゴチャいろいろ置きたい。

  1. トップ
  2. tech
  3. 自宅をかっこいい作業環境にしたい

Xcode のメニューから C ファイルをヘッダファイル込みで作ろうとすると Bridging Header を作るか? と聞かれるので、作るを選ぶと、*-Bridging-Header.h という Obj-C の(?)ヘッダファイルができ、作った C ファイルのヘッダファイルが #import されている。

あとはできた C ファイルに適当に書いて C ファイルのヘッダに適当に関数シグネチャを書けば、Swift 側ではプロジェクト内のグローバル関数として使えるようになっている。全部 Unmanaged だけど調べればほぼその通りうごいてくれる。

ただし一部の複雑な struct を書くと Swift のコンパイルで刺さることがある。自分は kinfo_proc を使いたかったんだけど、まんまとこの罠でハマって2時間ぐらい悩んだ。

  1. トップ
  2. tech
  3. Swift から C で書いた関数を呼びたいとき

takeRetainedValue()
→ 呼び出した関数内で値が retain されている場合こちらを使う。Swift 側でアンラップする際には retain しないでメモリマネジメントに加える。

takeUnretainedValue()
→ 呼びだした関数内で値が retain されていない場合こちらを使う。Swift 側でアンラップする際 retain を行いメモリマネジメントに加える。

どっち使えばいいんだよ

とりあえず takeRetainedValue() を使い、問題が起こらないならそれでよい? もしヌルポが起これば takeUnretainedValue() に変えてみるとか?

Swift の参照カウンタのチェックポイントは関数脱出時のようなので、関数内で完結する分には常に takeRetainedValue() で取り出しても問題がおきない (勝手に解放されない) と思うが、よくわからない。

  1. トップ
  2. tech
  3. Swift takeRetainedValue() or takeUnretainedValue

UIElementInspector は Apple が提供している開発ツールで、マウスカーソル直下にあるアクセシビリティオブジェクトについて、どんな属性と値があるかを表示してくれる。便利

https://developer.apple.com/library/mac/samplecode/UIElementInspector/Introduction/Intro.html

  1. トップ
  2. tech
  3. Mac のアクセシビリティAPIで何が取得できるか簡単に調べられる UIElementInspector

自分のアプリケーション (AXApplication ) の AXEnhancedUserInterface (bool) を調べて、1 が入っていたら VoiceOver が起動している。

Google Chrome を強制的にアクセシビリティ有効にする方法

Google Chrome はこの値を見てアクセシビリティオブジェクトを作るかどうかを決めているようで (パフォーマンスのため?)、デフォルトではアクセシビリティオブジェクトが生成されない。

自分で作ったアプリケーションでアクセシビリティを使いたい場合、これは不便な仕様である。必要に応じて

  • 全アプリケーションに AXEnhancedUserInterface をセット
  • アプリケーションが起動するたびに AXEnhancedUserInterface をセット
  • アプリケーション終了時に AXEnhancedUserInterface をリセット (ただし VoiceOver が起動しているようなら何もしない)

みたいなことが必要になる。

なお Google Chrome でアクセシビリティが有効化されているかどうかは chrome://accessibility を見ればわかる。また、上記 AXEnhancedUserInterface を設定しなくても、一時的でいいのならこのページでアクセシビリティを有効にできる。

有効にしたあとはページのリロードが必要、と思ったけど必要ないっぽい…

  1. トップ
  2. tech
  3. Mac で VoiceOver が起動しているかどうかを判定する方法 / または Google Chrome を強制的にアクセシビリティ有効にする方法

ちょいちょい「環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」を開かせたいケースがあるが、openURL とかで Security.prefPane を開くだけだと「どこやねん」となりがちなので、アクセシビリティを設定するところまで一気に移動したくなる。

ScriptingBridge を使えばできるのだが、Objective-C でやる場合でもメソッド定義のヘッダファイルを生成して使うみたいな感じになっており、Swift からちょっと気軽に使おうと思うとダルくなってしまう。

フル機能を使うなら一度 Objective-C でラッパー書くのが正当だと思うが、一行も Objective-C を書きたくない気分のときは、プロトコルとエクステンションで必要なメソッドを強制的に定義してコンパイラを騙せば乘りきることができるようだ。

import Cocoa
import ScriptingBridge

// 元にないやつは optional にしないと extension でエラーになる
@objc protocol SBSystemPreferencesApplication {
    optional var panes: SBElementArray {get}
    func activate()
}


@objc protocol SBSystemPreferencesPane {
    optional var anchors: SBElementArray {get}
    optional var id: NSString {get}
    
}

@objc protocol SBSystemPreferencesAnchor {
    optional var name: NSString {get}
    optional func reveal() -> id_t
}

// protocol 定義を無理矢理使えるようにする
extension SBApplication : SBSystemPreferencesApplication {}
extension SBObject : SBSystemPreferencesPane, SBSystemPreferencesAnchor {}

struct Accessibility {
    static func checkAccessibilityEnabled(app: NSApplicationDelegate) {
        if AXIsProcessTrusted() != 1 {
            let alert = NSAlert()
            alert.messageText = "Require accessibility setting"
            alert.alertStyle = NSAlertStyle.CriticalAlertStyle
            alert.addButtonWithTitle("Open System Preference")
            alert.addButtonWithTitle("Quit")
            if alert.runModal() == 1000 {
                openSecurityPane()
                NSApplication.sharedApplication().terminate(app)
            } else {
                NSApplication.sharedApplication().terminate(app)
            }
        }
    }
    
    static func openSecurityPane() {
        // openURL 使うのが最も簡単だが、アクセシビリティの項目まで選択された状態で開くことができない
        // NSWorkspace.sharedWorkspace().openURL( NSURL.fileURLWithPath("/System/Library/PreferencePanes/Security.prefPane")! )
        
        // ScriptingBridge を使い、表示したいところまで自動で移動させる
        // open System Preference -> Security and Privacy -> Accessibility
        let prefs = SBApplication.applicationWithBundleIdentifier("com.apple.systempreferences")! as SBSystemPreferencesApplication
        prefs.activate()
        for pane_ in prefs.panes! {
            let pane = pane_ as SBSystemPreferencesPane
            if pane.id == "com.apple.preference.security" {
                for anchor_ in pane.anchors! {
                    let anchor = anchor_ as SBSystemPreferencesAnchor
                    if anchor.name == "Privacy_Accessibility" {
                        println(pane, anchor)
                        anchor.reveal!()
                        break
                    }
                }
                break
            }
        }
    }
}
  1. トップ
  2. tech
  3. Swift で Mac の ScriptingBridge を無理矢理つかう