古橋貞之の日記

kumofs MessagePack fluentd @twitter

2007-08-29

開発環境としてのMac OS Xカスタマイズ 開発環境としてのMac OS Xカスタマイズを含むブックマーク 開発環境としてのMac OS Xカスタマイズのブックマークコメント

Mac OS Xを使っていないプログラマは、時間の80%を無駄にしている、かどうかは知りませんが、堅いGUIUNIX系のコマンドラインツールを使えるMac OS Xは、開発環境として使いやすいことは確か。

が、デフォルトのままでは、Terminal.appで日本語が表示できないとか、lsやfindがGNU系じゃなくてBSD系だとか、要するにOSだってカスタマイズしてなんぼというわけであります。


というわけで、私のMac OS Xのカスタマイズをこのあたりに書いておきます。


※2008/2/3追記: Leopard版書きました > 開発環境としてのMac OS X Leopard

Terminal.app

Mac OS Xにはデフォルトで「ターミナル」(/Applications/Utilities/Terminal.app)が付いてきますが、これがデフォルトではまったくイケてない。主要な問題は以下の3点。

  • 日本語を表示できない
  • DeleteやHomeキーが使えない
  • 色が見にくい

まず日本語が表示できない問題は、Terminal.appの設定と、readlineの設定の2点に起因しているようです。

  1. Terminal.appの「ウィンドウ設定」をいじる(後述)
  2. ~/.inputrcを修正

で解決します。~/.inputrcは確かデフォルトでは存在しないので、vimemacsなどなどお好みのエディタで作成して、以下を記述。

set meta-flag on
set convert-meta off
set input-meta on
set output-meta on


続いてDeleteやHomeキーが使えないのは、これまたTerminal.appの設定と、readlineの設定。というわけで、

  1. Terminal.appの「ウィンドウ設定」(後述)
  2. ~/.inputrcの修正

で解決します。Terminal.appのウィンドウ設定は後述として、とりあえず~/.inputrcに以下を追記。

"\033[3~": delete-char

vimな方は~/.vimrcに↓これも書いておくと良いです。

map <C-[>[H <Home>
map! <C-[>[H <Home>
map <C-[>[F <End>
map! <C-[>[F <End>


色が見にくいのは、黒背景にすると青が見にくいし、白背景にすると黄色が見にくいし…。~/.dir_colorsや~/.vimrcで見にくい色を使わないようにするのも手ですが、TerminalColorsを使うのが最適です。これを入れると、Terminal.appでもANSIカラーを変更できるようになります。



さて、Terminal.appの設定ですが、お手軽な方法は↓このファイルを~/Library/Preferences/com.apple.Terminal.plistに上書きすればOKです。(元のファイルはバックアップをとっておいてください)

com.apple.Terminal.plist


手で設定する場合は、Terminal.appの「ウィンドウ設定」で↓を設定すればたぶんOK。

  • エミュレーション」で、「非ASCII文字をエスケープする」のチェックを外す
  • 「ディスプレイ」で、「日本語や中国語などにワイドグリフを使用する」にチェックを入れる
  • 「ディスプレイ」で、「ワイドグリフは2桁とカウントする」にチェックを入れる
  • 「カラー」と「ANSI Colors」で色をお好みに設定
  • キーボード」で、↓を追加
キー修飾操作操作の内容
del(deleteを送出)なし文字列をシェルへ送信する\033[3~
homeなし文字列をシェルへ送信する\033[H
endなし文字列をシェルへ送信する\033[F
page upなし文字列をシェルへ送信する\033[5~
page downなし文字列をシェルへ送信する\033[6~


iTerm.app

iTermは、タブ機能つきのMac OS X用ターミナルエミュレータです。ANSIカラーも変更可能で、デフォルトで日本語も使用可(違ったかも?)

Terminal.appは止めてiTermを使えばいいのでは?とも思うわけですが、残念ながらiTermにも「ターミナル速度が遅い」という問題があります。

画面全体にiTermに表示して、vimでウィンドウを縦に分割して、なんてやっていると、スクロールが遅くて泣きそうになります。


というわけで、Terminal.appとiTermは場面に応じて使い分けるといい感じです。




MacPortsをホームディレクトリインストール

最近やっとMacPortsを入れました。これはステキです。

ただ、dmgに入っているインストーラでインストールすると、/opt/local以下にインストールされるのが気に入らない。ホームディレクトリに入れて欲しい。というわけでMacPortsをソースからコンパイルして、$HOME/portsにインストールしてみました。以下その手順を。


まずreadlineの最新版を入れておきます。readlineを新しくしないとコンパイル時にエラーが出ます(でももしかしたらウチのMacだけかも?)。GPLがアレな場合はlibeditでも良いかも。

wget http://ftp.gnu.org/pub/gnu/readline/readline-5.2.tar.gz
wget http://ftp.gnu.org/pub/gnu/readline/readline-5.2-patches/readline52-00{1,2,3,4,5,6,7}
tar zxvf readline-5.2.tar.gz
cd readline-5.2
for p in ../readline52-*; do patch -p2 < $p; done
./configure --enable-multibyte --prefix=$HOME/ports
make -j3
make install 2>&1 | tee make-install-readline.log

続いてMacPortsをインストール。./configureの引数が長い。

wget http://svn.macports.org/repository/macports/downloads/MacPorts-1.5.0/MacPorts-1.5.0.tar.bz2
tar jxvf MacPorts-1.5.0.tar.bz2
cd MacPorts-1.5.0
LDFLAGS="-L$HOME/ports/lib" CFLAGS="-L$HOME/ports/lib" ./configure --prefix=$HOME/ports --with-included-sqlite3 --with-install-group=`id -g` --with-install-user=`id -u` --with-tclpackage=$HOME/ports/tcl
make -j3
make install 2>&1 | tee make-install-macports.log

環境変数で$TCLLIBPATHと$PATHを~/.bashrc(とか~/.zshrcとか~/.cshrc)で設定しておきます。

export TCLLIBPATH="$HOME/ports/tcl"
export PATH="$HOME/ports/bin:$PATH"

あとはport selfupdateしてお好みのパッケージをインストールパーティすればOKです。ユーザー権限でインストールできます。sudo要りません。

port selfupdate
port install coreutils +with_default_names
port install findutils
port install wget
port install ruby



QuickSilverがたまに暴走する

Mac OS Xの3大アプリと言えば、QuickSilverとKeynoteとiTermなんじゃないかと勝手に思ってます。Ensemble2とCotEditorも入れたい…それからAdiumとCyberduckとSSHKeychainと日めくりと…キリが無いですが、なにはともあれQuickSilver無いことには始まらないわけです。ランチャーなので。

QuickSilverは「マニュアルを読むたびに新機能が見つかる」タイプで、vimやscreenと似たものを感じます。各種機能はプラグインになっていて、かなりの数があります。


このQuickSilverですが、ATOKと干渉するのか、ATOKと共にCPU使用率をごっそり持って行って応答しなくなってしまうことがありました。検索しても全然出てこないので、ウチのMacだけかもしれないのですが…

QuickSilverのPreferencesで、Appearanceの中にある「Superflous visual effects」のチェックを外すと発症しなくなりました。QuickSilverを呼び出したときのエフェクトがなくなってちょっと寂しいのですが、エフェクトが無い分速くなるし、それもいいかなーなんて思ってます。




SSHKeychainをホームディレクトリに入れる

今まで.app単体で配布されていたSSHKeychainですが、最近インストーラ形式になってしまい、ホームディレクトリ以下にインストールできなくなりました。しょうがないので、インストーラをバラして.appを取り出します。(ソースからコンパイルするのもアリです)


まずはSSHKeychian.dmgをダウンロードしてきて、ディスクイメージをマウントします。

そうすると、↓こんな感じになってます。

$ find /Volumes/SSHKeychian
/Volumes/SSHKeychain
/Volumes/SSHKeychain/.DS_Store
/Volumes/SSHKeychain/SSHKeychain.pkg
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Archive.bom
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Archive.pax.gz
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Info.plist
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/PkgInfo
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/.DS_Store
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/BundleVersions.plist
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/background.gif
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/Description.plist
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/License.txt
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/ReadMe.txt
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/SSHKeychain.info
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/package_version
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/postinstall
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/postupgrade
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/SSHKeychain.bom
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/SSHKeychain.pax.gz
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/SSHKeychain.sizes

いわゆるMac OS Xのインストーラの実体は、拡張子がpkgのディレクトリ(いわゆるバンドル)のようです。

怪しいのは拡張子が.gzのSSHKeychain.pax.gz。こやつをfileコマンドで調べてみると、↓こうなります。

$ cd /Volumes/SSHKeychain/SSHKeychain.pkg/Contents
$ file Resources/SSHKeychain.pax.gz 
Resources/SSHKeychain.pax.gz: symbolic link to `../Archive.pax.gz'
$ file Archive.pax.gz 
Archive.pax.gz: gzip compressed data, from Unix

SSHKeychain.pax.gzは../Archive.pax.gzへのシンボリックリンクで、Archive.pax.gzは見たままgzipで圧縮されたデータのようです。というわけでArchive.pax.gzを展開します。

$ cp Archive.pax.gz ~/tmp
$ cd ~/tmp
$ gunzip Archive.pax.gz
$ file Archive.pax
Archive.pax: ASCII cpio archive (pre-SVR4 or odc)

Archive.paxはいわゆるold ASCIIタイプのcpioアーカイブのようなので、これをバラします。

$ cpio -ivd < Archive.pax
.
./.gdb_history./SSHKeychain.app
./SSHKeychain.app/Contents
…以下略…

めでたくSSHKeychain.appが出てきました。あとはこれを~/Applications/にでもコピーしておけばOK。

redgeckoredgecko 2007/08/31 09:05 SSHKeychain の訳者の redgecko です。
SSHKeychain がインストーラパッケージになちゃったのは、トンネル掘りの対象を 1024 番より小さいポートにも適用するためです。
まぁ、おかげで、最近になってこれが原因でセキュリティーホールが発覚しましたが....
それはともかく、パッケージ内の .pax.gz ファイルを解凍するには、The Unarchiver.app が便利です。
おためしあれ。

hengsuhengsu 2007/08/31 10:38 横入りで済みません、The Unarchiverで展開できるんですね。
今まで、下のコマンドでやってました。

展開する
sudo gunzip -c Archive.pax.gz | pax -r -p e

ついでに。Archive.pax.gzのファイルリストが入っているArchive.bomのリストをとるには
lsbom -p MUGf
勝手に取り出したファイルのアクセス権の確認に使ってます。

viverviver 2007/08/31 12:38 >> redgeckoさん
なるほど。そういう事情があったのですね。
The Unarchiver.appで展開できました。.paxという拡張子は登録されていなかったのですが、cpioフォーマットとして展開してくれたようです…と思ったら、The Unarchiver.appのバージョンが古かっただけで、v1.6には.paxもありました。

>> hengsuさん
なんとpaxというコマンドがあったんですね…
Archive.bomも読めました(↓こんな感じになりました)。ありがとうございます。

$ lsbom -p MUGf /Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Archive.bom
drwxr-xr-x primary primary .
-rw------- primary primary ./.gdb_history
drwxr-xr-x primary primary ./SSHKeychain.app
…以下略…

k12uk12u 2007/09/03 13:54 installer -pkg /Volumes/SSHKeychain/SSHKeychain.pkg -target ~/
ではダメでしょうか?

viverviver 2007/09/03 16:48 >k12uさん
installerコマンドは知りませんでした! ↓これですね。
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man8/installer.8.html

試してみたところ、↓こうなってしまいました。

$ installer -pkg /Volumes/SSHKeychain/SSHKeychain.pkg -target /Users/frsyuki
installer: This package requires authentication to install.

$ sudo installer -pkg /Volumes/SSHKeychain/SSHKeychain.pkg -target /Users/frsyuki
installer: Package name is SSHKeychain
installer: Installing onto volume mounted at /.
installer: The install failed.

$ installer -volinfo -pkg /Volumes/SSHKeychain/SSHKeychain.pkg
/

-target引数で指定できるのは、Installer.appでインストールするときにも表示される「インストール先ボリュームを選択」で選べるボリュームしか指定できず、任意のディレクトリは指定できない様です。