AirMac のオン・オフをキーボード,もしくは自動で切り替える方法

AirMac

Mac ユーザーの方はよく知っているかもしれませんが, Mac には AirMac という無線LANシステムがあります.このオン・オフにはメニューバーをクリックして操作するのが(たぶん)一般的ですが,このわずか5秒程度の操作が煩わしいと昔から感じていました.全部キーボードで操作できないからです.これらをキーボードから操作する方法や,自動でオン・オフを切り替えられるようにする方法を日本語で解説しているサイトがなかった(と思う)ので備忘録として記しておきます.ちなみに AirMac をキーワードに使っても海外のサイトはヒットしません.実は

世界的には「AirPort」の名称で発売されているが、日本では関西電機によりすでに「AirPort」の名称が商標登録されていたことから、日本では「AirMac」の名称で発売されている。

http://ja.wikipedia.org/wiki/Airmac

という事実があって出てこないのです.海外のサイトで情報を調べたいときは AirPort をキーワードに使うことをおすすめします.

AppleScript

まず AppleScript があります.ランチャー(QuickSilver,Launchbar,Alfred,Auftakt,etc)を用いればキーボードだけで操作できます.

「AirPort AppleScript」で調べると案外すぐに見つかります.GitHub - andrewheiss/AirPort-Toggle: Script that either enables or disables the Wi-Fi connection in OS X 10.7. Best when used with a global shortcut key, like with Quicksilver.にあるやつを使えば簡単にできます.

使い方も簡単で実行すると AirMac のオン・オフの状態をトグルしてくれます.しかも Growl で表示までしてくれます.素晴らしいです.

仕組み

誰も興味ないであろうし,そもそも中身は難しくないので見りゃわかるって言われそうですが,一応解説します.まず,

set airport_status to do shell script "/usr/sbin/networksetup -getairportpower AirPort"

AirMac のオン・オフの状態を調べ,結果を変数に保存します.次にその結果がオンだった時は

do shell script "/usr/sbin/networksetup -setairportpower AirPort off"

オフだったときは

do shell script "/usr/sbin/networksetup -setairportpower AirPort on"

を実行して切り替えています.最後に結果に応じて Growl のメッセージを表示しているだけです.

自動切り替え

しかしそもそもこのオン・オフを操作する機会はあまりありません.普通に使っていればイーサーネットケーブルを挿したり抜いたりした時だけです.じゃあイーサーネットを抜いたり挿したりを監視して自動でオン・オフが変わるようにすればいいという発想に至ります.実はそれを実現する方法があります.以下でその手順を解説します.

  1. Toggle Airport.dmg からファイルをダウンロード
  2. ダウンロードしたファイルを開いて"Toggle Airport.mpkg"を実行

これはそもそもAuto-disable AirPort when ethernet is active - Mac OS X Hintsを参考にしています.このサイトではこれで完了と書いてあります.しかし僕の環境(MacOS 10.6.7)ではさらにコマンドラインから,

$ sudo launchctl load /System/Library/LaunchAgents/com.mine.toggleairport.plist

をする必要がありました.

これだけやっておけばもう完璧です.イーサーネットケーブル周りをいじると数秒遅れで AirMac の状態を適切な状態に切り替えてくれます.今のところそのような症状はでていませんが,上手く動作しなかったり,望んでいない動きをしたら前述の AppleScript を実行すればいいだけです.

さらに AirMac 周りを快適にする方法があれば是非教えてください.

Firefoxでダウンロードしたファイルをキーボードで操作するためのKeySnailプラグイン,dlbsnailをリリースしました

KeySnail

id:moozさんが作っているFirefoxアドオンでKeySnail(http://github.com/mooz/keysnail)というのがあります。このアドオンを使うことによってFirefoxの動作やjavascript関数などに手軽にキーバインドを与えることができ、FirefoxEmacs風にすることができるという、キーボード中毒の人には非常にありがたいアドオンです。このアドオンはプラグインシステムを持っており,機能をどんどん拡張できるという特徴もあります.

Download Statusbar

KeySnailとは別にDownload Statusbar(https://addons.mozilla.org/ja/firefox/addon/download-statusbar/)というシンプルなステータスバーでファイルのダウンロードを表示・管理できるアドオンもあります.非常に便利なので愛用していますが,1つだけ不満がありました.ダウンロードしたファイルを開くにはどうしてもステータスバー上のファイルをクリックしなければならないことです.キーボードで何でも済ませたい僕は今回,この問題を解決すべく,KeySnailのプラグインを作ってみました.

インストール

仕様にはもちろんKeySnailとDownload Statusbarがインストールされていることが前提となります.インストールされていない場合は上記のリンクからインストールしてください.
それが終わったらこのリンクを右クリックして「このプラグインをインストール」を選択してください.

設定と使用方法

下記の設定を.keysnail.ks.jsのPRESERVEエリアに貼り付けることをおすすめします.

key.setViewKey('d', function (ev, arg) {
    ext.exec("dlbsnail-show-file-list", arg, ev);
}, 'Show Download Statusbar Items', true);
key.setViewKey('D', function (ev, arg) {
    ext.exec("dlbsnail-show-command-for-all", arg, ev);
}, 'dlbasnail-all系コマンド', true);

これによってView Modeの時にdキーを押すことでダウンロードしたファイルの一覧が,Dキーを押すことでファイル全体を対象とする操作と対象のファイル数の一覧がそれぞれ表示されます.ファイルの一覧ではダウンロード完了したものを選択してEnterを押すことでそのファイルを開くことができます.全体操作コマンドの一覧では,(当たり前ですが)選択対象のコマンドが実行されます.
また,個別ファイルの操作は開く以外にもリネーム・URLのコピー・ステータスバーからの削除などができるようになっています.下記の設定をすることで実行できるようになります.

plugins.options["dlbsnail.file_key_map"] = {
    "C-z"   : "prompt-toggle-edit-mode",
    "SPC"   : "prompt-next-page",
    "b"     : "prompt-previous-page",
    "j"     : "prompt-next-completion",
    "k"     : "prompt-previous-completion",
    "g"     : "prompt-beginning-of-candidates",
    "G"     : "prompt-end-of-candidates",
    "q"     : "prompt-cancel",
    // for finished file
    "o"     : "open-this-file",
    "O"     : "show-this-file",
    "R"     : "rename-this-file",
    // "C-D"   : "delete-this-file",
    "C"     : "clear-this-file",
    // for in progress or pause file
    // "C-C"   : "cancel-this-file",
    // for in progress file
    // "C-P"   : "pause-this-file",
    // for pause file
    "r"     : "resume-this-file",
    // for all file
    "c"     : "copy-url",
    "V"     : "visit-ref-website",
    "u"     : "undo-clear",
    "h"     : "refresh-file-list"
};

これによりプロンプトで標準の操作以外には以下のコマンドが実行出来るようになります.

o ファイルを開く
O ファイルを含むフォルダを開く
R ファイルのリネーム
C ファイルをステータスバーから取り除く
r ファイルのダウンロードを再開
c ダウンロード元のURLをコピー
V ダウンロード元のURLを訪れる
u ステータスバーから最後に取り除かれたファイルを元に戻す
h 一覧の更新

ただ,ファイルの削除,ダウンロードのキャンセルなどは不可逆な操作なので誤操作によって実行されてしまうと元に戻せません.そのため上記の設定では誤操作が起きないようにコメントアウトしてありますが,危険を承知の上で使用する場合には適宣コメントを外してください.

バグ

ダウンロードが完了していないファイルがある場合,ファイル一覧を表示中にはダウンロード中のファイルの状態を更新するために,一定間隔(デフォルトでは1秒)でprompt.refresh()を呼んでいます.そのため,prompt-select-actionを行ってもリセットされてしまい,上手く動作しないバグがあります.何らかの方法で対処したいと思っています.しかし(ただの言い訳ですが)Javascriptを書くのは生まれてはじめてなので明らかに勉強不足であるのが現状です.対処方法があれば是非教えてください.

追記

上記のバグに対処しました.対処方法は,prompt-select-actionを自分で上書きするというとんでもない力技です.もっとエレガントな方法を知っている方は是非教えてください.