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
}
}
}
}
関連エントリー
- macOS の EOS Utility 「カメラとUSB接続できませんでした」 どうあがいても接続できなくて困った。 どうやらなんか Google Chrome が USB デバイスをかたっぱしからオープンする挙動をして...
- Mac でウェブカメラの定期撮影を Swift で書く macOS 用にウェブカメラからjpgを取得するコマンドラインツールにimagesnapというのがある。単発で使うには問題ないんだけど、イン...
- ccls + vim-lsp で補完時に後続のwhitespaceが削除される 以下をいれるととりあえずおさまる。ccls と相性が悪い?? let g:lsp_insert_text_enabled = 0 let g...
- AngularJS のテストでページ側のスクリプトを実行する protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行でき...
- Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directive に Controller をつけたいとき。 クソコード を書いたはいいが、釈然としなかった。 "View independent business logic: Services" と...
✖
EOS 5DS というフルサイズ5060万画素のカメラが発表された。
フルサイズ5060万画素
ところで以前レンズの理論上の解像度限界というのを求めたことがあった。これは、絞りを絞るほど回折によってボケてしまうという物理的な絶対的制約からくる解像度限界だった。
フルサイズセンサ (36x24mm) で 8688x5792pixel だとすると、画素サイズは 約 0.00414mm なので、F7 波長500nm でのレイリー限界 0.00427mm よりも細かくなる。
高画素数になるということは、より回折にシビアなセンサーになるということになる。ある程度よりも (この機種の場合 F7 程度) 絞ってしまえば、いくら高画素でも解像度はあがらないので意味がない。
実際のところでは、回折ボケよりも手ぶれのほうが厳しい場合が多いように思われるが、とにかく回折による解像度の限界を感じやすくなる。
ローパスレス
高画素化することによって空間的なサンプリング周波数があがり、ナイキスト周波数(=サンプリング周波数の半分)も上げることができる。十分に高いナイキスト周波数 (具体的にはレンズの性能よりもセンサーが勝る=レンズがローパスフィルタとして働く) の場合、センサー直前のローパスフィルタを省くことで画質の向上をはかることができる (ローパスフィルタでは、ナイキスト周波数ぴったりで遮断するということはできないので、いくらか解像度が犠牲になる)。
画素サイズを(アスペクト比間違いにより)間違えていたので、いろいろ修正しました。
関連エントリー
- レンズの解像度限界 センサーの高解像度化はどこまで可能なのか、実際今はどれぐらい限界に近付いているのかが気になった。 収差が全くないレンズであっても、回折によっ...
- ADC とローパスフィルタについてのメモ 概要 連続信号をADCでサンプリングする場合、前段にローパスフィルタが必要だが、それをどう設計したらいいかわからない、という話。 ローパスフ...
- HackRF One の Sweep Mode の動作 hackrf_sweep コマンドの動作を調べたので記録しておく。このコマンドは HackRF One のファームウェアと協調して、うまく広...
- たまにやってくるピンホールカメラ期 30年生きてきてピンホールは3回ぐらい期がきてるので、病気としては10年ぐらいで免疫が切れると考えられる。 ミラーレスフルサイズ (Eマウン...
- α7R II の動画画角 デフォルトでは動画モードにすると自動的に Super 35mm になる。つまり画角が狭くなる。フルサイズスチル撮影からいきなり動画モードに入...
Picasa にあげるときのカラープロファイル
Picasa での色化け
先にまとめ
- sRGB で出力すること
- sRGB もいろいろあるので、できれば sRGB IEC61966-2.1 black scaled にしておけば確実
- Google+ の「フォト」の設定で「自動補正」を「オフ」にすること
経緯
Picasa にアップロードすると、めちゃくちゃ色が変わるというのは認識していたが、面倒なので見ないふりをしていた。やる気を出してちゃんと調べた。
sRGB プロファイル強制適用
Picasa はアップロード時に問答無用で sRGB IEC61966-2.1 black scaled が適用される。マッチングされないで強制適用なようなので、AdobeRGB な画像をアップロードすると明かに彩度が落ちる。
sRGB でアップロードしても色が変わる
しかし、sRGB な画像をアップロードしても、色化けが起こる。OS に入っている sRGB と sRGB black scaled の違いかと思い (同じはずだけど)
http://www.color.org/srgbprofiles.xalter ここから .icc をダウンロードして
sudo cp ~/Downloads/sRGB_IEC61966-2-1_black_scaled.icc /Library/ColorSync/Profiles/ sudo chmod +r /Library/ColorSync/Profiles/sRGB_IEC61966-2-1_black_scaled.icc
(なぜか read できない permission になってて混乱)
として、このプロファイルを使って書きだしてアップロードしてみたが、やはりダメ。Picasa にアップロードすると少し明くなってしまう。
いろいろ試行錯誤していたが、Google+ 側の「フォト」を開き、該当画像の「自動補正」を「オフ」にしたら色が正しくなった。Picasa 側ではこの設定が見えないので気付かなかった……
今後ハマらないように、Google+ 側の設定で自動補正をオフにした。念のため sRGB black scaled はそのまま適用するようにする。
関連エントリー
- Google Chrome (Mac版) の色化け いろいろ確認していたところ、Chrome で Preview.app と色が違うことに気付いた。sRGB モニタで見ていると同じように見える...
- Google Photos の ICC カラープロファイルの扱い Google Photos は配信画像は基本的にすべて sRGB でなっています。 そこで ICC のテスト用 jpeg ファイル や、手元...
- 広色域時代の画像の正しい扱いかた モバイル端末も iPhone7 など DCI-P3 サポートが増えてきて、CSS での広色域サポートもはじまりつつあるなかで、サーバサイドな...
- Google Photos の ICC カラープロファイルの扱いの続き Google Photos の ICC カラープロファイルの扱い | tech - 氾濫原 の続きです。前回のまとめとしては Google ...
- (黒魔術) CSS の色を sRGB にあわせるには Chrome と Firefox では CSS の色にカラーマネジメントが適用されず、sRGB の画像と色をあわせることが基本的に無理です。...
Google Chrome (Mac版) の色化け
いろいろ確認していたところ、Chrome で Preview.app と色が違うことに気付いた。sRGB モニタで見ていると同じように見えるが、AdobeRGB 色域のモニタにウィンドウを移動するとかなり彩度が上がる。謎……
Google Chrome は ICC v4 には対応してないが、sRGB_IEC61966-2-1_black_scaled.icc は v2 なので、それが原因ではない。
結局、結論は「Google Chrome はプライマリディスプレイのプロファイルしか認識しない」だった。
マルチモニタ環境で、モニタごと別々の Chrome のウィンドウを置いておくと、プライマリモニタ以外は全て色がずれるので気をつけましょうという感じだった。
なお Safari だけがマルチモニタでのプロファイル適用に対応しているみたいだった。
関連エントリー
- CSS の色空間は sRGB のはずだけど… Chrome, Firefox, Safari で調べたところ、 Chrome: カラーマネジメントされない ( sRGB は適用されない)...
- Google Photos の ICC カラープロファイルの扱い Google Photos は配信画像は基本的にすべて sRGB でなっています。 そこで ICC のテスト用 jpeg ファイル や、手元...
- JavaScript で閲覧者モニタの色域を推定する このエントリの情報は古いです。現行 (2018年11月) のブラウザでは canvas の色の扱いが改善され、すべて sRGB で取り扱われ...
- Picasa にあげるときのカラープロファイル Picasa での色化け 先にまとめ sRGB で出力すること sRGB もいろいろあるので、できれば sRGB IEC61966-2.1 ...
- ディスプレイキャリブレーションの覚書 久しぶりにやるとカラーマネジメントまわりのことをすっかり忘れている。 キャリブレーションしてもOSのUIの色はあわない 写真を表示させるとあ...
USB 3.0 の 2.4GHz 帯干渉 (無線マウスなどへの電波障害)
USB 3.0 の伝送路における基本波が 2.5GHz なため、ISM バンドの 2.45GHz 帯 (2.4GHz〜2.5GHz)で電波障害が起きやすいという話。(波長の半分で1bit転送するのでデータレート的には5Gbps)
一応 USB 3.0 はEMI 対策として、スペクトラム拡散クロック (広い範囲にクロックを拡散することでピークを回避する) や、スプレッド処理 (信号経路には常にランダムのビットが流れるようにしてピークを防ぐ) をしているが、あまりに発生源とアンテナが近過ぎるとやはりダメらしい。
うちで使っているワイヤレスマウスも、USB 3.0 ハブに繋ぐとかなり挙動がおかしくてイライラする感じになる。
今後
USB 3.1 になると基本波が倍の 5GHz になるので、この問題は解決するかもしれない。(5.8GHz帯のISMバンドとはある程度離れてるし)
備考
USB 3.0 は 2.5GHz 基本波、5Gbps の物理ビットレートだが、8b/10b エンコードするので、実行ビットレートは 4Gbps 程度
USB 3.1 は 5GHz 基本波、10Gbps の物理ビットレート、128b132b エンコードなので、実行ビットレートは 9.7Gbps 程度
USB 3.0 では、USB 2.0 と違い、完全なスリープ状態でなければ常に信号が流れているらしい。
ref.\
- https://www.usb.org/sites/default/files/327216.pdf
- http://www.intel.com/content/www/us/en/io/universal-serial-bus/usb3-frequency-interference-paper.html
- http://monoist.atmarkit.co.jp/club/print/print.php?url=/feledev/articles/usb_ss/02/usb_ss02b.html&print_size=
- http://www.kumikomi.net/archives/2009/08/usb_30faq2superspeed_usb.php?page=4
関連エントリー
- USB 3.1 Gen2 のハブは現時点ではないみたい 思いたって USB 3.1 Gen2 のハブを探してみたけど、存在していなかった。 ところで、USB 3.0 というのは既に消滅している。過...
- 1.35GHz-9.5GHz 基板ログペリアンテナ Aliexpress で「15W 5-6dB 1.35GHz-9.5GHz UWB Ultra Wideband Log Periodic ...
- 粗悪品のUSBケーブルが多いので買ったら必ずベンチをとるべき 5Gbps / 10Gbps 対応の通信用ケーブルは購入したら必ずベンチをとるべき。 というのも粗悪品であっても再送制御などで実行速度が下が...
- WindowsでのUSBリンクスピード https://www.uwe-sieber.de/usbtreeview_e.html USB Device Tree Viewer を使...
- ✖ 今、自宅回線は LTE オンリーで生きているので (テザリング)、スマートフォンがルーターを兼ねてる。だいたいこれでいいんだけど、スマートフ...
✖
Mac でいっぱいUSB機器を繋げない問題
一定数以上のUSBデバイスを接続すると Mac が不安定になり、内蔵キーボード・トラックパッドなどが一切効かなくなる (USB バス全体が死ぬ感じ) という状況があり、よくわからないので、怪しいハブを止めたり、新しいハブを買ってみたりしていた。
そんななか、あるハブに替えたところバスが死ぬ前にエラーメッセージがでるパターンがようやく観測された。以下の通り (Console.app で USB を grep しながら見ていた)
the USB hardware ran out of device slots
このエラーメッセージで検索をかけたところ、まさにこの問題のことであろうFacebook のノートがひっかかった。
どうやら Haswell ではデフォルトだとたくさん繋ぐことができないらしい。このノートでもひとまずの解決方法が示されてはいるものの、USB 3.0 バスとの併用で疑問がある感じ。
リンクされているErgotron のドキュメントも読んだが、よくわからない。Haswell では25台以上はサポートしないと書いてあったり、もし30台以上のデバイスを繋ぐのであれば USB 3.0 デバイスは繋ぐなという感じのことが書いてある。
台数の根拠がよくわからないので、自分のところで追試を行なったが、「the USB hardware ran out of device slots」になるのは32台を超えたとき(32台までなら大丈夫)という感じだった。
そんなにいっぱい繋がないやろwww とお思いだろうか?
接続中のUSBデバイスの数
接続中のUSBデバイスの数は以下で出した。
system_profiler SPUSBDataType | grep 'Location ID' | wc -l
USB の規格上のデバイス数上限は127(USB のアドレスが7bitで、0は予約されている)、このアドレスは Mac 上では「場所 ID」や「Location ID」と呼ばれている。デバイスの抜き差しが発生していなければ普通は連番の番号が振られている。
上記コマンドではアドレスが割り振られたデバイスがいくつあるか? を算出している。なので現実世界における見掛けのデバイス数とは異なる。
手元の MacBook Pro Retina Late 2013 では何も接続していなくても以下のデバイスが有効になっている。
- メモリカードリーダー(内蔵)
- キーボード・トラックパッド(内蔵)
- Bluetooth ハブ(内蔵)
- Bluetooth USB コントローラ(内蔵)
つまり、外部にはこれらを抜いた28デバイスが最大となる。
USB 3.0 7ポートハブの罠
USB 3.0 ハブは USB 2.0 のハブの機能も持っている。これは、実際に物理レイヤーとして USB 2.0 レイヤーも持っている (USB 2.0 と USB 3.0 は物理プロトコルが全然違うからかな)。そんな関係からか、OS から見ると 3.0 のハブと 2.0 のハブ2種類が別々に見える。
あるチップの仕様書を見たりするとなんとなくわかりやすい、
http://ww1.microchip.com/downloads/en/DeviceDoc/00001681B.pdf
そして、7ポートのハブというのは、内部的には4ポートのハブチップを2個使って2段接続されている。
つまり、7ポートUSB3.0ハブは、見掛けは1台だが、OSには4つのデバイスに見え、SuperSpeed と Hi-Speed それぞれにアドレスが振られる。
どうしてもたくさん繋ぎたい場合
Ergotron のドキュメントに示されているように、とりあえず USB 2.0 の機器をたくさん繋ぎたい場合、
nvram -p | grep usb-options で何も設定されていないことを確認して
sudo nvram usb-options="%01%00%00%00"
を実行して再起動すると認識するようになる。
元に戻すには
sudo nvram -d usb-options
この方法は確かにデバイスの上限を突破できるみたいだが、手元で試したところバスが不安定になり、内蔵キーボードなどを巻き込んでバスが死ぬことがあった。
Mac の場合、USB 3.0 Hi-Speed バス (2.0 互換レイヤー)、USB 3.0 SuperSpeed バス (3.0レイヤー) のみがデフォルトでアクティブなバスとなっているが、このコマンドによって USB Hi-Speed バス (2.0 ネイティブレイヤー) のバスが有効になるっぽい。
消費電力が増えるデメリットがあるみたいだけど、他のデメリットがよくわからない。3.0 との併用がうまくいかない?
いずれにせよ、自分の環境では不安定になるのは解決されなかったので深く追わなかった。
自分の環境
これからは USB 3.0 だ!! と意気込んでハブ類は USB 3.0 にできるだけ統一しようとしており 7 ポートの USB 3.0 ハブを2台をメインにデバイスを接続していた。また、ディスプレイに内蔵されている USB 3.0 ハブも、どうせだからと接続していた。上記の罠の関係もあって、デバイス上限に達しやすい環境だった。
ハブがいっぱいあっても意味がないので、USB 機器は計画性を持って管理したほうが良い。上限いかねーよwwとか舐めてると余裕でひっかかる。
バスが死ぬのは、デバイス上限を超えるというエッジケース(仕様上は127台を超えるまで発生しない)をしっかりテストしておらず対応できないデバイスがあって暴走(バスをロック?)しているような気がする。バスが死ぬとCPUは生きているのにハードリセットしか終了方法がなくなるので絶対に避けたい。
まとめ
USB 2.0 ですむ範囲のデバイスは USB 2.0 用のハブでまとめたほうが良い。今回のようなケースもそうだし、コスト的にもかなり安くすむ。USB 3.0 が必要なケースはそれほど多くない。カードリーダーや、HDD などぐらいだ。
また、DELL のディスプレイにはカジュアルに USB 3.0 ハブがついているが「せっかくだから…」と繋いでおいたりすると、上限を超えやすくなる。
というか根本的に127デバイスまでちゃんといけるようにしてほしい。
iBUFFALO USB2.0Hub バスパワー 4ポート ブラック 【PlayStation4,PS4,PS3 動作確認済】BSH4U06BK cho45
関連エントリー
- USB 電圧・電流計 【ノーブランド】 USB簡易テスター ストレート型 cho45 ルートアール ★ 5.0 / 5.0 cho45 これ安いし1個あるととても...
- root化しなくても Wi-Fi 経由での adb はできる Android Debug Bridge (adb) | Android Developers に従うだけ。 一旦 USB で接続して、...
- Chrome App で USB デバイス (AVR V-USB) にアクセスする Chrome App は、chrome.usb という API を通じて低レベルなUSBデバイスドライバをJavaScriptで書くことが可...
- WindowsでのUSBリンクスピード https://www.uwe-sieber.de/usbtreeview_e.html USB Device Tree Viewer を使...
- VALETON GP-5 + 自作MIDIデバイスたち VALETON GP-5 というマルチエフェクタを買ってみた。小さいながら凝っていて、アンプシミュレータも内蔵しているのでヘッドフォン直結や...
4Kと2Kが同じにみえる、という人もいるらしい。
たとえば視力2.0の人が300ppiのディスプレーで十分に綺麗に(隣り合うピクセルを区別できない)見れる距離で使っていたとしたら、同じ鑑賞距離の場合視力1.0の人は半分の150ppiでも十分ということになってしまう。
というわけで、デスクトップのディスプレイを想定して鑑賞距離を50cm固定としたとき、各視力でどれぐらいのppiがあれば十分かを出してみた。
| 0.3 | 52 ppi |
| 0.5 | 87 ppi |
| 0.7 | 122 ppi |
| 1 | 175 ppi |
| 1.5 | 262 ppi |
| 2 | 349 ppi |
2K 24インチモニタの場合 96ppi なので、50cm の鑑賞距離の場合、視力 0.5 の人は 4K になっても気付きにくいということになる。
関連エントリー
- ディスプレイのppiはどれぐらい必要か? 疑問:ディスプレイサイズが大きくなるほど鑑賞距離も長くなっていき、ppi もそれほど必要なくなるはずだが、実際のところどれぐらいの ppi ...
- 写真のプリント画質と画角・人間の視力 「標準レンズ」について では、理想的なカメラと理想的なレンズを仮定して考えていたので、以下の点がひっかかっていた: 超広角で撮影したとして、...
- Dell UP2414Q 4K 23.8インチディスプレイ Dell ディスプレイ モニター UP2414Q 23.8インチ/4K/IPS非光沢/8ms/DPx2,HDMI/AdobeRGB 99%/...
- 4Kモニタ、24インチ (P2415Q) か、27インチ (P2715Q) か Dell 4Kモニター 23.8インチ P2415Q(3年間無輝点交換保証/sRGB 99%/広視野角/IPS非光沢/フリッカーフリー/DP...
- 「標準レンズ」について 「標準レンズ」の何が標準なのか、ここ数日考えてひとまず自分なりに結論を出したのでまとめてメモ 結論 一般的な鑑賞環境において、パースが自然、...





