✖
Swift で Mac の ScriptingBridge を無理矢理つかう
ちょいちょい「環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」を開かせたいケースがあるが、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 } } } }
✖
EOS 5DS というフルサイズ5060万画素のカメラが発表された。
フルサイズ5060万画素
ところで以前レンズの理論上の解像度限界というのを求めたことがあった。これは、絞りを絞るほど回折によってボケてしまうという物理的な絶対的制約からくる解像度限界だった。
フルサイズセンサ (36x24mm) で 8688x5792pixel だとすると、画素サイズは 約 0.00414mm なので、F7 波長500nm でのレイリー限界 0.00427mm よりも細かくなる。
高画素数になるということは、より回折にシビアなセンサーになるということになる。ある程度よりも (この機種の場合 F7 程度) 絞ってしまえば、いくら高画素でも解像度はあがらないので意味がない。
実際のところでは、回折ボケよりも手ぶれのほうが厳しい場合が多いように思われるが、とにかく回折による解像度の限界を感じやすくなる。
ローパスレス
高画素化することによって空間的なサンプリング周波数があがり、ナイキスト周波数(=サンプリング周波数の半分)も上げることができる。十分に高いナイキスト周波数 (具体的にはレンズの性能よりもセンサーが勝る=レンズがローパスフィルタとして働く) の場合、センサー直前のローパスフィルタを省くことで画質の向上をはかることができる (ローパスフィルタでは、ナイキスト周波数ぴったりで遮断するということはできないので、いくらか解像度が犠牲になる)。
画素サイズを(アスペクト比間違いにより)間違えていたので、いろいろ修正しました。