OS Xのマウスの振る舞い

OSのバージョンを換える度に、インストール画面で初期設定に戻ったマウスの反応に諦めにも似たうんざり感を感じます。
何故ここまで遅くするんだろう?何故ですか?

マウスのスピードについては、MouseZoom.prefPane<http://benh57.com/mousezoom.html>や更に機能豊富なユーティリティを使っていた時期もありましたが、Magic Mouseにしてから逆にジェスチャーなどを含めて初期設定以外使わなくなってしまったので、ターミナルから‘defaults’を使ってスピードを設定することにしていました。できるだけkernel extensionやdriverの類いは使いたくなかったのです。

■ターミナルコマンドで速度設定

$ defaults read -g com.apple.mouse.scaling

で現在の設定値を読み出すことができます。システム環境設定のマウスのスライダ「軌跡の速さ」で設定できる最速値は3.0になります。
この数値を設定するには、

$ defaults write -g com.apple.mouse.scaling x.x

スライダ「軌跡の速さ」の最速値よりも速くしたいのであれば、x.xの部分を3.0から上の値(5.0から6.0くらい)に設定すればいいでしょう。5.0を超えると「爆速」と言っていいでしょう。
因に、元に戻すには、

$ defaults delete -g com.apple.mouse.scaling

で設定値をリセットできます。

■SmoothMouseによるアクセラレーションと違和感の解消

上記で、マウススピードはなんとかなりましたが、何か違和感が拭えません。ポインタの反応が妙です。以前から感じていたのですが、OS Xのどのバージョン辺りからでしょうか、マウスポインタが引っかかるような気がしてなりません。アクセラレーションが関係しているのでしょうか?
ところで、「OS X マウススピード」などのキーワードで検索したところ、スピードに不満を持っている方はもちろんですが、アクセラレーションをオフにしたいという方が多いことに意外な気がしました。考えてみると、Windowsから移行して来た方に多いのでしょう。Windowsマシンのマウスのアクセラレーションは緩やかで、直線的ですから、Macの速度勾配に戸惑われるのでしょう。しかし、21インチ以上のモニタでは、如何にスピードを上げてもアクセラレーション抜きでは手首から先の移動が大きくなります。上記の‘defaults write….’でマウススピードを上げても、アクセラレーションに慣れた身には違和感が残り、疲れるのです。
「OS X マウス アクセラレーション」などをキーワードに検索してみました。
SmoothMouse<http://smoothmouse.com>というものを見つけました。当たりのようです。
設定方法や、使い方は、私が説明するよりもここ<http://applech2.com/archives/30495560.html>を見ていただいた方が早いでしょう。殆ど付け加えることはありません。
どうも私の違和感は、OS Xのシステム側が抱えている、マウスの移動に関するタイムムラグ問題に起因するようです。
試しに、SmoothMouseをインストールして見ました。

ScreenShot 2013-10-29 11.42.42

Velocityはもう少し大きくてもいいくらいですが、これです。
ようやく、長年の違和感から解放されるようです。

アンインストール機能も「About」タブに用意されていますが、参考までにインストールされる関連ファイルのパスを記しておきます。

/Library/PreferencePanes/SmoothMouse.prefPane
/System/Library/Extensions/SmoothMouse.kext
~/Library/LaunchAgents/com.cyberic.smoothmouse.plist
~/Library/LaunchAgents/com.cyberic.smoothmouseupdater.plist
~/Library/Preferences/com.cyberic.SmoothMouse.plist

ヘアピンNAT非対応のルータのために、‘ets/hosts’ファイルを書き換える

俗にいうヘアピンNATに対応していないルータのため、LAN内に配置されたサーバマシンへグローバルIP(あるいはドメイン名)でアクセスできない環境となっています。
(まあ、電話で言えば自分にかけてるようなものですから、ループバックを受け付けないというのもそれなりの理ではあるのですが…)

考えられる対処策としては、

  • 外部のプロキシサーバを経由してアクセスする
  • 内部アクセス専用のDNSサーバをたてる
  • hostsファイルを編集してドメイン名でLAN上のマシンにルーティングする

こんなものでしょうか。

外部のプロキシサーバということでは速度的なハンディキャップが大きそうです。DNSサーバも敷居が高そうです。hostsファイルの書き換えが一番早道のようなので、これで行くことにしました。

移動用のマシンを使っていない間は手作業でhostsファイルの書き換えをしていたのですが、MacBookを持ち歩くようになると外と中で使い分ける必要が生じ、その都度書き換えなければいけないという面倒な自体となり、
探せばhostsファイルマネージャーともいうべきツールがあるのでしょうが、ここはAppleScriptで書いてみることにしました。

■Exchange_Locale.app

Exlocale128・機能
図のように、内部ネットワークと出先(外部)で、「hosts」ファイルを書き換えます。
「hosts」ファイルの設定データは、次の図のように、Exchange_Locale.appのバンドルパッケージの中の「Resources」フォルダの中に、‘hosts_In.txt’、‘hosts_Out.txt’の名前で用意しています。この2つのファイルを環境に合わせてエディタで編集してください。
(テキストエンコーディングはUTF-8、行末コードはLFです)
Exchange_Locale.app自体は、この2つのデータファイルの内容に従って「hosts」ファイルを書き換えているだけです。

2013-07-23 8.23.53

2013-07-23 8.24.53

■使い方
任意の場所に置いてダブルクリックの起動でOKです。スクリプトメニューフォルダに置くのもいいでしょう。
最初の起動時に、管理者権限のユーザパスワードを入力してください。
起動後、「内部」「出先」いずれかのボタンをクリックしてください。‘Exchange_Locale.app/Contents/Resources/’内部の‘hosts_In.txt’、‘hosts_Out.txt’のデータに従って、‘etc/hosts’ファイルを書き換えます。
念のために、元の「hosts」ファイルは「hosts~org」という名前で(一度だけ)バックアップされます。

■ダウンロード
http://amstudio.zxq.net/amweb/Exchange_Locale.iso.zip
http://amstudio.sytes.net/amweb/Exchange_Locale.iso.zip
※Exchange_Locale.appの著作権は放棄いたしませんが、対価は不要です。自己責任で、自由にお使いください。
インターネット上のリンクは、作者への事前/事後の承諾は不要ですので、自由にリンクして下さい。
基本的に、再配布・転載は認めません。

■保証
動作に関する保証はいたしません。また、使用によって生じたと思われるいかなる損害に対しても、作者は一切責任を負い ません。使用は御自身の責任において行なってください。

mi.appのツールコマンド

TextWrangler.appでいくつかのスクリプトを紹介しましたが、それをmi.appで実現するにはどうするか?
TextWrangler.appの場合は、殆どの機能をAppleScriptから操作可能というところからAppleScriptで書きましたが、mi.appとなると「ツールコマンド」が活躍します。

「ツール」はmi.app独自のもので、よく使う文字列やよく使う処理を、ツールメニューから選択することにより使用できる機能です。
ツールメニューからアクセスできるファイルとして、テキストファイル、AppleScriptコンパイル済みファイル、アプリケーションのエイリアスがあり、「ツールコマンド」を利用するためには、テキストファイル中に「ツールコマンド」を埋め込むような形となります。テキストファイルとして作成されるドキュメントの中の、<<<と>>>の間に囲まれた部分を「ツールコマンド」として認識し、特定の処理を行うことができるという仕組みなのです。

■ツールコマンドのサンプル
・AppleScriptのラインコメントの挿入

選択範囲の段落の先頭を検索して、タブと半角スペースがあればそれも含めて”– “に置換します。

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^[ \t]*
--

ここでは行頭の半角スペースとタブを外していますが、そのまま残してもいいでしょう。

・AppleScriptのラインコメントの削除

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^--

同時に、行頭のブレットなどを含めて削除するには、

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^[ ->・•\t]+[ \t]*

とすればいいでしょう。

・列の反転1<->2

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
^([^\t]+)\t([^\t\r]+)(.*)$
$2\t$1$3

タブ区切りのリストの1列と2列を入れ替えます。

・AppleScriptのブロックコメントの追加

(*
<<<SELECTED>>>*)

なんともシンプルです。

・AppleScriptのブロックコメントの解除

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
\*\)\r

<<<SELECT-WHOLE-PARAGRAPH REPLACE-REGEXP-SELECTED
\(\*\r

<<<MOVECARET-RIGHT

「ツールコマンド」は、連続して処理できます。

・ダブルクォート間の文字列の選択

<<<FIND-REGEXP-FROMFIRST
(?:["”“])([^"”]*?)(?:["”])

mi.appの場合、検索/置換機能などへのAppleScriptからのアクセスはできません。しかし、それに代わる手段として、「ツールコマンド」を利用した「ツール」を作成し、ツールメニューから実行するという方法がとれます。
また、作者が日本人ということが大きなアドバンテージで、見通しの良いヘルプを日本語で参照できます。

TextWrangler.appのスクリプト—encodeURI.scptとdecodeURI.scpt

TextWrangler.appのドキュメント内の選択範囲の文字列をURIエンコーディングするスクリプトと、その反対でデコードするスクリプトです。
選択された文字列を対象に動作します。

■encodeURI.scpt

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		set selection of text window 1 to my encodeURI(selection of text window 1 as Unicode text)
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" -- subtitle "" sound name "Frog"
		(*
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
		*)
	end if
end tell

to encodeURI(theString)
	do shell script "echo " & quoted form of theString & " | tr -d '\\n' | perl -pe 's/([^\\w ])/\"%\".unpack(\"H2\", $1)/eg;'"
end encodeURI

■decodeURI.scpt

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		set selection of text window 1 to my decodeURI(selection of text window 1 as Unicode text)
	else
		display notification "文字列を選択してから実行しましょう。" with title "Notification" -- subtitle "" sound name "Frog"
		(*
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
		*)
	end if
end tell

to decodeURI(enc_String)
	do shell script "echo " & quoted form of enc_String & " | tr -d '\\n' | perl -pe 's/%([0-9A-Fa-f][0-9A-Fa-f])/pack(\"H2\",$1)/eg;'"
end decodeURI

■補足

OS X 10.9 Mavericksから‘display notification’で通知センターの通知パネルを呼び出せるようになったので、試しに組み込んでいますが、不都合であれば、「(*」と「*)」で囲まれたコメントアウト部分の‘display dialog’と入れ替えて下さい。

TextWrangler.appでAppleScriptのシンタックスカラーリング

TextWrangler.appでは、シンタックスカラーリングをサポートする言語からAppleScriptが外されています。
mi.appでも現在ベータ版の3.0からは対象から外されてしまったようです。
まあ、対象アプリケーションごとにコマンドなどがすっかり変わってしまうような曖昧な言語ですから、整ったカラーリングを行えないというのが現実なのでしょう。
でも、あると便利です。
そこで、TextWrangler.appの親にあたるBBEditで、なんとかならないかと探してみました。

なんとかなるもんです。
ここ<http://bbeditextras.org/wiki/index.php?title=Codeless_Language_Modules>から辿って、ここ<http://www.mail-archive.com/bbedit@googlegroups.com/msg00548.html>で、AppleScript.plistというリンクをオプションキー+クリックでダウンロードします。
(単なるクリックでは、テキストページとして開いてしまいます)
ダウンロード後は、この「AppleScript.plist.txt」をTextWrangler.app開けば、インストール方法が下記のように書かれています。


To install :
( 1 ) You need to open the following folder : ~/Library/Application Support/BBEdit/Language Modules/
( 2 ) Copy the string -&gt; ~/Library/Application Support/BBEdit/Language Modules/
( 3 ) From the Finder menu, select “Go -> Go to Folder…”, paste, and hit return,
it should open the Language Modules folder :
( 4 ) if you get no results in the way of an open window, try the GO menu again with :
( 5 ) Copy the string -&gt; ~/Library/Application Support/BBEdit/

In my case the [Language Modules] folder was missing, so I created one.
You can do the same, so create a new [Language Modules] folder (if required).

Do one of the following :
( 1 ) Download the plist at the top of this document, and put it in the [Language Modules] folder
or
( 1 ) Create an empty document in BBEdit
( 2 ) Paste the contents of this plist, beginning with “<?xml”
( 3 ) Save to the [Language Modules] folder with the name “AppleScript_CLM.plist”
( 4 ) Menu Select “Text -> Zap Gremlins…” to clear up any platform html incompatibilities
( 5 ) Make sure the TYPE AND CREATOR are empty, and restart BBEdit.

要するに、BBEdit.app用のファイルなのですが、上のインストール方法の中のBBEditをTextWranglerに置き換えれば、そのままTextWrangler.appで使えます。
上記を要約すれば、

  • ‘ ~/Library/Application Support/TextWrangler/Language Modules/’を開く(フォルダがなければ作る)
  • ダウンロードした「AppleScript.plist.txt」を「AppleScript_CLM.plist」とりネームして、‘ ~/Library/Application Support/TextWrangler/Language Modules/’フォルダにいれる
  • TextWrangler.Appをリスタートする

以上です。

1

図のように、サポート言語リストにAppleScriptが入っています。
やってみたところ、「AppleScript_CLM.plist」という名前ではなく「AppleScript.plist」でもOKでした。
AppleScript エディタ.appと比べてはいけませんが、それなりの精度でカラーリングしてくれます。

TextWrangler.appのスクリプト—テキストエンコーディングと改行コード変換

テキストファイルのエンコーディング(文字コード)と改行コードは、プラットフォームごとに異なっていて、うっかり異なった組み合わせで手渡すと不要なトラブルになることもあります。
ここでは、代表的な組み合わせをTextWrangler.app上でセットするためのスクリプトを紹介します。

■Shift_JIS/CR+LFの組み合わせ
Windows環境へテキストを渡す場合の最善の方法は、ユニコード(UTF-8)のままWindowsへ転送し、Windows上でユニコード(UTF-8)対応のエディタで開き、変換するというものですが、Mac上で変換をするとすればこの組み合わせの選択となります。
以前、ユニコード(UTF-8)のキャラクタセット指定でWebのサイト構築を依頼され、htmlファイル以下一式を納品したところ、クライアントの担当者から電話が入り、えらく怒鳴られたことがあります。宥めながら理由を聞くと、ノートパッドでindex.htmを開いたところ、たった1行しか画面表示しないとのことで、一体貴殿はどんな仕事をしたのかね、と詰られたことがあります(ブラウザでページを見てくれれば分かったはずなのですが…)。
Web担当者でありながら、テキストエンコーディングと改行コードについての知識がなかったようで、参りました。そりゃあ、数百行のデータが1行しか表示されなければ焦るでしょう。(笑

さて、スクリプト自体はシンプルです。

tell application "TextWrangler"
	activate
	set encoding of text document 1 to "Japanese (Windows, DOS)"
	set line breaks of text document 1 to DOS
end tell

■UTF-8/LFの組み合わせ
OS 9までは、テキスト処理は、通常Shift_JIS/CRの組み合わせでしたが、OS X環境では、これが一般的になりました。
古いMacからのデータを引っ張ってくる時には、この変換が必要となるでしょう。

tell application "TextWrangler"
	activate
	set encoding of text document 1 to "Unicode (UTF-8)"
	set line breaks of text document 1 to Unix
end tell

それぞれ、前面に開いているドキュメントへの処理となります。
TextWrangler.appではScriptsフォルダの中のスクリプトに、パレットメニューからScriptsを選択して表示されるパレットでキーボドショートカットを適用できるので、ショートカットを当てればキー一発で実行できます。
なお、現在のエンコーディングと改行コードをAppleScriptから得るのには、次のようにすれば値を取得できます。

tell application "TextWrangler"
	activate
	get encoding of text document 1
	get line breaks of text document 1
end tell

因に、TextWranglerで‘Japanese’として実装されているエンコーディングは図のように6種類あります。

2013-10-25 5.11.33

■補遺
参考までに、文字コード、Shift_JIS、改行コードについてのWikiページをリストアップしておきます。
<http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89>
<http://ja.wikipedia.org/wiki/Shift_JIS>
<http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89>

key code left arrow ?

AppleScriptで、矢印キーを操作させる方法がなかなか分からなくて、

<http://www.macspeech.com/extensions/forums/topic.php?id=811>
<http://forums.macrumors.com/showthread.php?t=602163>

などでようやく、keystrokeではなくkey codeなんだということが分かりました。
で、そのkey codeを調べるのは、Key Codes.app<http://manytricks.com/keycodes/>のお世話になることにしました。
取り敢えず、矢印キーについてはこんな風になるようです。

tell application "System Events"
	tell process _currentAppName
		key code 123 -- left arrow
		key code 124 -- right arrow
		key code 125 -- down arrow
		key code 126 -- up arrow
	end tell
end tell

いつか使うことになるかもしれないので、その他の使いそうなキーをリストアップしておきましたので、記しておきます。

tell application "System Events"
	key code 53 -- escape
	key code 122 -- F1
	key code 120 -- F2
	key code 99 -- F3
	key code 118 -- F4
	key code 96 -- F5
	key code 97 -- F6
	key code 98 -- F7
	key code 100 -- F8
	key code 101 -- F9
	key code 109 -- F10
	key code 103 -- F11
	key code 111 -- F12
	key code 105 -- F13
	key code 107 -- F14
	key code 113 -- F15
	key code 106 -- F16
	key code 64 -- F17
	key code 79 -- F18
	key code 80 -- F19

	key code 115 -- home
	key code 116 -- page up
	key code 117 -- forward delete
	key code 119 -- end
	key code 121 -- page down

	key code 123 -- ←(left arrow)
	key code 124 -- →(right arrow)
	key code 126 -- ↑(up arrow)
	key code 125 -- ↓(down arrow)

	key code 65 -- . (Keypad)
	key code 67 -- * (Keypad)
	key code 69 -- + (Keypad)
	key code 71 -- clear (Keypad)
	key code 75 -- / (Keypad)
	key code 76 -- enter (Keypad)
	key code 78 -- - (Keypad)
	key code 81 -- = (Keypad)
	key code 82 -- 0 (Keypad)
	key code 83 -- 1 (Keypad)
	key code 84 -- 2 (Keypad)
	key code 85 -- 3 (Keypad)
	key code 86 -- 4 (Keypad)
	key code 87 -- 5 (Keypad)
	key code 88 -- 6 (Keypad)
	key code 89 -- 7 (Keypad)
	key code 91 -- 8 (Keypad)
	key code 92 -- 9 (Keypad)
	key code 95 -- , (Keypad)

	key code 102 -- 英数
	key code 104 -- かな

	-- return, tab, spaceはkeystrokeでも動作させられます。
	key code 36 -- return
	key code 48 -- tab
	key code 49 -- space
	(*
	keystroke return
	keystroke tab
	keystroke space
*)

	-- modifier keyの使い方
	keystroke "c" using {command down, option down, shift down}
	keystroke "k" using {control down, shift down}

end tell

TextWrangler.appのスクリプト—Line comment_Remove.scpt

TextWrangler.appのドキュメント上で、AppleScriptのラインコメント”– “を追加するためのスクリプトを紹介しましたが、今度はその削除をするスクリプトです。

2013-10-24 5.37.35

選択範囲の段落の先頭を検索して、”– “だけでなく”>”、”・”、”•”、”タブ”があれば同時に削除してします。
処理はハイライト部分だけですから、削除は追加に比べて随分簡単です。

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "^[ ->・•]+[ \\t]*" using "" searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
	else
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
	end if
end tell

TextWrangler.appのスクリプト—Line comment_Add.scpt

TextWrangler.appのドキュメント上で、AppleScriptのラインコメント”– “(ハイフン2つ)を追加するためのスクリプトです。

2013-10-22 14.57.31

選択範囲の段落の先頭を検索して、タブと半角スペースがあればそれも含めて”– “に置換します。
実に単純なロジックなのですが、選択範囲に段落末の改行が含まれると、TextWrangler.appは次の段落の先頭にも”– “を付加してしまいます。
例えば2行の段落を段落末の改行まで選択して、このハイライトになっている‘replace “^[ \\t]*” ….’以下のステップを実行すると、選択範囲の次の段落(行)の先頭にまで”– “が挿入されるという訳です。

さて、考えました。
TextWrangler.appでキャレットを動かすスクリプトが見当たらなかったので(方法があるのかも知れませんが…)、‘System Events’から‘→’キーを一回打って、その位置から段落頭の”^– “を検索し、選択状態にして、その部分を削除しています。
かなりスマートではない方法です。(汗

置換文字列を”– “から、”・”や”• “に換えれば、ブレットリストが作成できます。また、”> “で引用符にもできます。

tell application "TextWrangler"
	activate
	if (selection of text window 1 as string) is not "" then
		replace "^[ \\t]*" using "-- " searching in selection of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
		tell application "System Events"
			key code 124
			delay 1
		end tell
		find "^-- " searching in text 1 of text window 1 options {search mode:grep, starting at top:false, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false} with selecting match
		set selection of text window 1 to ""
	else
		activate
		display dialog "文字列を選択してから実行しましょう。" buttons {"OK"} default button "OK" with icon note giving up after 3
	end if
end tell

ファイルの日付スタンプを変更する—3 Re-set_DatestampPlus.app

ファイルの日付スタンプを変更する—2で、Re-set Datestamp.appを紹介しましたが、権利者権限の必要なファイル/フォルダには適用できない仕様でした。
そこで、必要に応じて、管理者パスワードを入力すれば管理者権限で実行できるようにした、Re-set_DatestampPlus.appを作成しましたので公開します。
‘SetFile’を使っていますので、Xcode.appのインストールが必要です。

■使い方
スクリプトメニュー内に置いて下さい。
処理対象をFinder上で選択してから、スクリプトメニュー内のRe-set_DatestampPlus.appを起動して下さい。
ドラッグ&ドロップにも対応していますので対象となるファイル/フォルダをアプリケーションアイコンの上にドロップすれば動作します。
パスワードは保持しませんので、必要であればその都度入力して下さい。

2013-10-21 8.26.39

 

2013-10-22 7.52.36

編集可能なバージョンはそのまま残しておきますので<http://wp.me/p1Cs3W-2W>、内容を加工したい場合はそちらをベースにして下さい。

■ダウンロード
http://amstudio.zxq.net/amweb/Re-set_DatestampPlus.iso.zip
http://amstudio.sytes.net/amweb/Re-set_DatestampPlus.iso.zip
※Re-set_DatestampPlus.appの著作権は放棄いたしませんが、対価は不要です。自己責任で、自由にお使いください。
インターネット上のリンクは、作者への事前/事後の承諾は不要ですので、自由にリンクして下さい。
基本的に、再配布・転載は認めません。

■保証
動作に関する保証はいたしません。また、使用によって生じたと思われるいかなる損害に対しても、作者は一切責任を負い ません。使用は御自身の責任において行なってください。