2013年1月31日木曜日

PATH環境変数の設定はどうなっている

PATH変数に定義するディレクトリの並びについて書きましたので、ターミナルにログインした時に、PATH変数がどのように設定されるのかについて書きたいと思います。一応、bashを使っている場合です。

大体、以下の流れになります。

  1. ターミナル.appが立ち上がる際にされる設定
  2. /etc/profileで行われる設定
  3. /etc/bashrcで行われる設定
  4. ユーザの~/.bash_profileで行われる設定
  5. ユーザの~/.bashrcで行われる設定

ターミナル.appが立ち上がる際にされる設定

ターミナル.appをDockなどから立ち上げる際に、launchd関係でPATH設定をしているとPATH環境変数が設定されます。他にもあるかもしれません。個人的には、bash本来の/etc/profile以降だけで設定される方が好きです。

/etc/launchd.conf - launchd経由で立ち上がるプロセスに適用されます。setenv PATH path_name1:path_name2:... のようにcsh系と似た記述で指定します。
launchd.plist - 使っていないのでわかりませんが、manをみるとEnvironmentVariables <dictionary of strings> で、XMLフォーマットでPATHを指定できそうです。対象は、launchd本体、Terminal.appなどでしょうか。

また、ターミナル.app自体の環境設定で特別なコマンドを指定しているとそこでPATHが指定される可能性もありますね。この場合は、あえて指定しているので問題ないと思いますが。

その後、ターミナルが立ち上がると、ウインドウが開きシェルが起動されます。デフォルトでは/usr/bin/login経由で、/bin/bashが立ち上がります(変更等していない場合)。以下にbashの場合を説明します。

/etc/profileで行われる設定

bashは、起動すると/etc/profileを実行します。デフォルトでは、その中でpath_helperが実行され、/etc/pathsに記述してあるディレクトリをPATHに設定します。その後、/etc/paths.dに記述してあるファイルをアルファベット順に読んで、中に記述してあるディレクトリをPATHに追加していきます。PATHの前の部分に挿入することはできないようです。paths.d内のファイル名が"-" (マイナス)等で始まる場合は、前の部分に付加できるなどの仕様になっているといいと思ったのですが。

/etc/profileの中から/etc/bashrcが実行されます。

/etc/bashrcで行われる設定

デフォルトでは/etc/bashrcでは、特にPATHの設定は行われていないようです。
次から、ユーザの~/.bash_profileが実行されます。

~/.bash_profileで行われる設定

.bash_profile以降は、ユーザがどのように書いたかに大きく依存しますので、あまり解説しても意味が無いかもしれません。ここでは私の場合を説明します。
私の.bash_profileでは、それ自身では細かい設定は行わず、.bashrc, .profileをそれぞれ呼び出しているだけです。

~/.bashrcで行われる設定

私は、ここでPATH変数の頭に~/bin, ~/local/bin、/usr/local系、/opt/local系を付加しています。また、PATHの最後にclamXavを追加しています。

~/.profileで行われる設定

私は、.profileは使っていませんでした。

この記事を書いていて、.bashrcにあまりよくない記述も見つかったので直したくなってきました。よさそうな修正ができたらこのブログにも書きたいと思います。

2013年1月29日火曜日

PATH環境変数内の、~/bin, /bin, /usr/bin, /usr/local/binなどの順番

ターミナルでシェルを使う場合の小ネタです。初心者には重要かもしれません。知っている人は今さらと思うかもしれませんが。
私は、以前はtcshを使っていました。Mac OS X 10.6.2までターミナルのデフォルトのシェルだったからです。Tiger (10.6.4)の時からbashにしました。乗り換えが1世代遅れたのは、使い方に若干慣れないところがあったのと、.tcshrcから.bashrc, .bash_profileへの変更が面倒だったためです。シェルスクリプトは/bin/shで書くことにしています。

今回の本題は、tcsh, bashのどちらにも関係するのですが、PATH環境変数内に設定するディレクトリの順番です。別の考え方もあると思いますので、参考ということで。

PATH環境変数は、コマンドを探すときのディレクトリの順番を指定するものです。PATH変数に含まれていないディレクトリにあるコマンドを指定しても、"コマンドが見つかりません"といったエラーがでます。

$ chdir
-bash: chdir コマンドが見つかりません

ディレクトリにコマンドが存在するのに上のようなエラーが出る時は、PATH環境変数にそのディレクトリが含まれていない(PATHが通っていないと言いますね)か、そのコマンドに実行権がないか、csh系だとrehashしていないという場合が多いです。(自分の経験では)

現在の私のPATH環境変数は、以下のようになっています。

$ echo $PATH
/Users/karuku/bin:/Users/karuku/local/bin:/usr/local/bin:/opt/local/bin:/usr/local/sbin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/clamXav/bin

基本的な考え方は、特殊なもの、局所的なものを先頭に持ってくる、標準的なものは後ろにするというふうにしています。一部、その考え方に沿っていないところもありますが。

定義順にそれぞれの使用目的を書いてみます。

/Users/karuku/bin - ホームディレクトリ下のbinです。自分で作成したスクリプト類を置いています
/Users/karuku/local/bin - テスト目的でインストールしたいものを置いています
/usr/local/bin - MacPortsでサポートされていないコマンドを置いています
/opt/local/bin - MacPortsでサポートされているコマンドを置いています
/usr/local/sbin - MacPortsでサポートされていないシステムコマンドを置いています
/opt/local/sbin - MacPortsでサポートされているシステムコマンドを置いています
/usr/bin - 一般的なユーティリティ、プログラミングツール、アプリケーション
/bin - ユーザ用ユーティリティの基本的なもの。シングルユーザ環境、マルチユーザ環境どちらでも使用する
/usr/sbin - (ユーザによって実行される) システムデーモン、およびシステムユーティリティ
/sbin - (ユーザによって実行される) システムデーモン、およびシステムユーティリティ
/opt/X11/bin - XquartzでインストールされるX Window System
/usr/local/clamXav/bin - ウィルスチェッカー clamav / clamXavをインストールしています。

( /binや/usr/binなどのシステムディレクトリ説明にはjman hierの記述を使いました。)

最後のふたつの /opt/X11/binと/usr/local/clamXav/binは、最初の考え方の原則に反していますね。

/opt/X11/bin (X11)は、Xquartsをインストールした際に、/etc/paths.dに登録されました。ここに登録されると、ログイン時に/etc/profile内で、その時のPATH変数にアペンドされる形になるようです。
X11は、以前Mac OS Xに使いたいGUIアプリケーションが少なかったころや、会社でLinuxマシンを使う際に使っていましたが、最近は全く使っていません。LinuxかFreeBSDを使うこともなさそうなので、当面このままにするつもりです。

clamXavは、ターミナルからではなく、Finderから使う場合がほとんどなので、PATHから外してもいいかもしれないですね。

コマンド名がぶつかる場合

たまに、同名のコマンドがそれぞれのディレクトリにある場合があります。上の考え方の場合、通常は使いたいコマンドが先に来ているので問題ないのですが、たまに後のディレクトリのコマンドをデフォルトとして使いたい場合があります。
例えば、rsyncはAppleの提供しているバージョンとMacPortsでインストールされるバージョンでは、HFS+関係の属性等を扱うオプションが違います。MacPortsのrsyncを使おうと思った訳ではなく、依存関係でインストールされたのですが。

こういう場合は以下のようにしています。

シェルスクリプトの場合は、以下のようにフルパスで記述します。

RSYNC=/usr/bin/rsync
RSYNC -hfsv ...

コマンドラインから使う場合は、~/bin から使いたいバージョンのコマンドにシンボリックリンクを張ります。~/binは先頭にあるので、意識せずに使いたいバージョンのコマンドが使えます。

$ ln -s /usr/bin/rsync ~/bin

別の解決方法として、alias が考えられますがあまり使っていません。特に意識していませんでしたが、bashの場合、whichコマンドでaliasで定義したコマンドが表示されないから(方法を知らないだけかもしれませんが)というような理由です。
また、bashに移行した初めの頃は、tcshも併用していたので、~/binの一箇所に設定しておけばいいからという理由もあったかもしれません。(ちょっとうろ覚えです)

2013年1月27日日曜日

Visor (ターミナル用プラグイン)の代替は、結局TotalTerminalか

Snow Leopardでは、Visorというターミナル (Terminal.app)用のプラグインを使っていました。私は、結構ターミナルを使うので、他のアプリケーションを使っていてもcontrol + ~ キーですぐ呼び出せる点が便利で重宝していました。
標準では画面の上部にVisorのウィンドウがスライドしながら出てくるのですが、私は画面の右側に外からスライドしてくるように設定していました。

ところが、昨年11月にMountain LionにしたところVisorが動かないことがわかりました。
Visorに代わるソフトウェアを探したところ、直接の後継はTotalTerminalだとわかりました。しかし、TotalFinderと間違えてしまったのだと思いますが、有料($18)だと思い込んでいました。私が必要としていたのは基本的にはcontrol + ~などのキーコンビネーションで簡単にターミナル呼び出せることだったので、ソフトウェアを呼び出すためだけに、$18も出すのは高いと思い、別のターミナルソフトを探していました。

そこで、見つけたのはiTerm2でした。これは、単独のアプリケーションですが、自分の設定したキーコンビネーションでVisorと同じように簡単に呼び出すことができます。ただ、他のアプリケーションに移動した時に自動的には消えません。自動的に消えないのは便利なこともありますが。また、ウインドウの現れ方も、スパッスパッという感じで、Visorのスライドインの方が格好いいかなと思います。
ちゃんと使っていませんが、iTerm2には、Visor/ターミナルの上下の分割と違って画面を縦横に分割する機能もあるようです。フルスクリーンで使うと便利かもしれません。
全体的には、iTerm2もなかなかいいので、以前のVisorのように画面の右側に現れるようにして使っていました。

ところが、iTerm2を2ヶ月ほど使っていて、つい最近、TotalTerminalは無料だとわかりました。以前、有料だと間違えたのがくやしくもありましたが、とにかく、インストールして使っています。
以下に、簡単にインストール方法と私の設定を書きます。



インストール

開発元のbinaryage ( http://totalterminal.binaryage.com ) から最新のインストーラのディスクイメージをダウンロードします。この記事を書いている時点では、v1.3でした。
ディスクイメージをマウントするとインストーラの入っているフォルダが開きます。インストーラは、パッケージ形式になっていますのでダブルクリックしてインストールできます。
インストール実行後に、アプリケーションフォルダ (/Applications)にTotalTerminal.appがコピーされます。

設定

TotalTerminal.appを実行するとターミナルが起動され、デフォルトの(TotalTerminalでない)ターミナルのウィンドウが開きます。
以前、Visorを使っていた場合は、ターミナルの環境設定を開いた後、設定アイコンを選ぶと、左ペインの下にVisorプロファイルが出てきます。
そこのテキストタブで、フォントや色を変更できます。
私は、Monaco 12pt.からOsaka-等幅 14pt.に変更してアンチエイリアスも外しています。その方が目が疲れない感じがします。
また、ウィンドウの位置は、環境設定ウィンドウのTotalTerminalアイコンで、Right-Topにしています。

Right-Strechにするとウインドウを非表示にしたり、Mission Controlの別のデスクトップに移動すると、Dockと重なってしまうようです。
また、ログイン項目でTotalTerminalを設定しておくと、ログイン時に自動的に起動されていいと思います。

2013年1月26日土曜日

Safariでユーティリティを使わずに縦長のページを1枚のPDFや画像にする

Safariなどのウェブブラウザでページを表示すると縦長になって一画面や1ページに収まらない場合がありますね。1画面に収まる方が少ないですね。
そういうページを資料やブログに入れるときに、1枚の画像やPDFに変換したい必要があります。その場合、専用のプラグインやユーティリティを使うと思います。

今回は、ユーティリティなどを使わずに1枚の画像やPDFにする方法を書きます。
完璧ではありませんが、それなりに使えるかと思います。ユーティリティがブラウザのバージョンアップに追いつかず動作しない場合や、有料のものには手を出したくない、プラグインなどをいろいろ入れたくないといった人には使えるかと思います。

長所としては、無料である、特別なソフトウェアを使用しない、また、一旦PDFにしますので、スクリーンショットと違い中のテキストを検索できるというメリットもあります。
一方、短所としては、手順が少し面倒なこと、ウインドウのタイトルバー等が入らないこと、縦に長いページだ少し時間がかかるといったところでしょうか。

考え方と全体の流れ

ここでは、Safari 6で、印刷用紙サイズA4で説明します。
考え方としては、画面が1ページに収まるような、縦に長い仮想の用紙を定義して、それをPDFとしてプリント画面から保存するというやり方です。
操作の流れは以下の通りです。

  1. 変換したいページを表示
  2. プリントダイアログを表示、詳細表示に変更
  3. 用紙サイズ、ページ数を確認
  4. カスタムサイズの選択と調整
  5. PDFで保存

では、順番に説明します。

変換したいページを表示

ここではグーグルのページを例に示します。1画面に収まらなければ何でもかまいません。


プリントダイアログを表示

Safariのファイル -> プリント... メニューからプリントダイアログを開きます。

もし、詳細表示になっていない場合は、詳細ボタンを押して詳細表示にします。


用紙サイズ、ページ数を確認

用紙サイズは、ここでは説明の都合上、A4と仮定します。実際には他の設定でもかまわないと思います。

印刷ダイアログボックスでページの縦横の長さ、ページ数を確認します。
上の例では、 A4で、横210mm、縦297mmとなっています。
またページ数は、印刷画面のプレビューの下の1/2の分母が2なので2ページですね。

カスタムサイズの選択と調整

用紙サイズメニューのA4の部分をクリックすると、「カスタムサイズを管理...」メニューが一番下に出てきますので、それを選びます。
そうすると、次のような画面が出てきます。
私の場合は、既にLongやはがき縦がありますが、通常はないと思います。その一番下の「+」記号を選んで新しい用紙サイズを設定します。
名称未設定を別の名前(ここではテスト)にして、縦、上下左右の余白を変更します。横の長さはそのままにして、余白は、問題なければ0mmでいいと思います。
縦の長さは、先ほどA4の場合で、2ページとなっていましたので最大A4の2倍を設定すればいいのですが、下にできる余白が気に入らない場合は、印刷プレビューを見ながら調整するといいです。
ここでは、以下のように2ページ分の長さ(594mm)より短く475mmにしてみました。
印刷プレビューは、次のような感じになります。
多少、下部に余白が見えますがいい感じですね。

PDFで保存

プリントダイアログの左下の「PDF」というプルダウンメニューを押して、「PDFとして保存...」を選びます。
後は、ふつうにPDFとして保存して終了です。ページの長さによっては多少時間がかかりますので、ゆっくり待ってください。
このページの先頭のサムネイルのような長いPDFが保存されますので、用途によってGIFに変換するといいと思います。
PDFのままでも、普通のスクリーンショットと違い、中身のテキストをプレビューやSpotlightで検索できるので便利だと思います。

2013年1月22日火曜日

Automatorで画像をGIFに変換する

スクリーンショットなどの画像をGIFに変換したい場合が結構出てきますね。GIF画像の方が他のフォーマットに比べて普通は小さいですし。
でも、ファイルが多いとプレビューでの操作は面倒になってきます。
ということで、少しでも楽をするために、Automatorを使おうと思います。

AutomatorにGIF画像に変換するアクションがない

Automatorを立ちあげてプレビューを選び、イメージのタイプを変更するというアクションを選んだのですが、変更後のタイプにGIFが出てきません。option キーを押しながら選んでも出てきません。
どうやらAutomatorのプレビューアクションではサポートされていないようです。残念。

Automatorでシェルスクリプトを使う

仕方がないので別の方法、「Automatorからシェルスクリプトを実行する」方法にしました。
Macには、ターミナルから使うsipsコマンドが用意されています。sipsコマンドは画像の情報を取り出したり、サイズやフォーマット(タイプ)を変更することができます。
GIFに変換する場合の基本的な使い方は以下のようになります。

$ sips -s format gif 入力ファイル名 --out 出力ファイル名

これを、Automatorから使おうと思います。
まず、Automatorを立ちあげて、アプリケーションを選び、「Automatorからシェルスクリプトを実行」のアクションを選びます。入力の引き渡し方法は「引数として」にして、シェルは、bashかshを選びます。
この中の echo "$f" の部分を以下のように変更します。
OUTF=`dirname "$f"`/`basename "$f" .png`.gif
sips -s format gif "$f" --out "$OUTF"


適当な名前を付けてアプリケーションとして保存します。

このアプリケーションにPNG画像をドラッグアンドドロップするとGIF画像に変換されます。このアプリケーションは、GIF画像が既に存在しても上書きしたり、PNG画像かどうかのチェックも行なっていないので注意してください。

[関連記事]
プレビューでGIFに変換する

2013年1月15日火曜日

キーボードショートカットの「次のウインドウを操作対象にする」を変更すると便利

アプリケーションの切り替えには、キーボード派の方は、command + tabキーやQuicksilverなどのランチャーを使う場合が多いと思います。
でも、Macを立ち上げて時間がたってくると、ウインドウをたくさん開き、同じアプリケーション内でもキーボードでウインドウを切り替えたいと思います。

そんな時に設定しておくと便利なキーボードショートカットのtipsです。

システム環境設定の「キーボード」の中に「キーボードショートカット」があります。
そこの左ペインの「キーボードと文字入力」の中に「アプリケーションの次のウインドウを操作対象にする」という項目があります。
Mountain Lionでは、「次のウインドウを操作対象にする」と名前が短くなっています。
アプリケーション間の切替えは、command + tabキーです。その逆方向の切替えがcommand + ` になっています。そのため、「次のウインドウを操作対象にする」をcommand + ` キーにすると覚えやすく、指の移動距離も短いためとても便利です。
USキーボードの場合、tabキーと` キーは上下隣ですので、USキーボードの人には特にお勧めです。
是非、使ってみてください。

2013年1月14日月曜日

Google Notifierのメニューバーアイコン変更

Google Notifierを使っていますが、Gmailが届くとメニューバーアイコンが赤く表示されます。

家で使っているMacは気にすることもないのですが、会社で使っているMacは何となく気になります。また、他のツールのメニューバーアイコンがモノクロなのでGoogle Notifierだけ赤いのも少し気になります。最近は、Preferenceでモノクロとカラーのアイコンを選べるようにしているソフトウェアもありますし。
ということで、ウェブを検索してみました。すると、他にも同じことを考えていたのかアイコンを公開している方が見つかりましたので、そこのデータを使うことにしました。

入手先

http://www.pajbam.com/?p=50
Pierre-Arnaud Marcelotさんという方のウェブページです。ありがとうございます。

インストール

ダウンロードしたzipファイルにinstall.txtが入っていて、簡単なインストール方法が書いてあります。それを元に少し付け加えて説明します。

1. ダウンロードしたzipファイルを展開し、Iconsディレクトリを開きます。

2. Google Notifierを実行中の場合、一旦終了します。

3. Google NotifierアプリケーションをFinderで表示します。

Quicksilverを使っている人は、Revealすると簡単ですね。


Quicksilverを入れていない人は、Finderの移動メニューからアプリケーションを選んで、"g" "o"と入力していくと近くまで移動できます。
どちらでも、以下の様な表示になればOKです。

4. Google Notifierアプリケーションを右クリックし「パッケージの内容を表示」を選びます。
フォルダをカラム表示にして、Resourcesを選択します。
このResourcesフォルダ内に、最初にダウンロードしたIconフォルダ内のアイコンファイルをすべてコピーします。
心配な人は、Resourcesフォルダをコピーしておくなりして、元に戻せるようにしておいてください。

5. 最後にパッケージのウィンドウを閉じて、Google Notifierを再実行すれば終了です。


新しいGmailが届いた時、上のようになると思います。ここだけ取り出すと好みの問題のようにも見えますね。

Macがスリープした後のSynergyの挙動を直す

前回の記事で書ききれなかった別の問題と解決法について書きたいと思います。

Windows側のマウスのスピードが速すぎる時がある


この現象が起きるのは、Macがスリープしてその後スリープ解除された場合です。スリープ解除後に、マウスをWindowsの画面に持って行くとマウスの移動速度が速すぎて使いづらいのです。
これは、Synergyの設定では対処できないようです。
これの対処には、Sleepwatcherというプログラムを使いました。
Sleepwatcherは、Macがスリープしたりスリープ解除(ウェイク)したりするのを監視して、そのタイミングであらかじめ指定してあるコマンドを実行するプログラムです。
Sleepwatcherは、MacPortsからインストールできます。また、作者のウェブサイトからもダウンロード、インストールできます。
私は、インストールにはMacPortsを使いました。

MacPortsでのインストール

MacPorts自体のインストールの説明は長くなりますので、既にインストールされていることを前提にします。以下のコマンドで簡単にインストールできます。

$ sudo port install sleepwatcher

実行後、sleepwatcherは /opt/local/sbin にインストールされます。

ダウンロード

作者のサイト http://www.bernhard-baehr.de/ からダウンロードできます。私はMacPortsでインストールしたのでプログラムのソースコードは不要だったのですが、設定ファイル(Ploperty Listファイル)の参考にダウンロードしました。

Property Listファイルの作成

SleepwatcherもSynergyと同様にlaunchctl経由で実行・停止の制御をします。そのためには、Property List (plist)ファイルの作成が必要です。一から作成するのは間違いが入る可能性も高くなるので、ダウンロードしたアーカイブファイルに含まれている plistファイルを参考にして作りました。
以下にその内容を示します。基本的には、ユーザ単位でのスリープ監視にしています。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>org.macports.sleepwatcher-localuser</string>
        <key>ProgramArguments</key>
        <array>
                <string>/opt/local/sbin/sleepwatcher</string>
                <string>-V</string>
                <string>-s ~/.sleep</string>
                <string>-w ~/.wakeup</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>


上記の内容を、~/Library/LaunchAgents/org.macports.sleepwatcher-localuser.plist として保存します。簡単な説明は以下のようです。
ProgramArguments keyにプログラム名と引数の並びをarrayとして定義しています。
-Vオプションはverboseオプションで詳細なログを出力します。
-sオプションでスリープする時に実行されるプログラムを指定しています。
-wオプションでウェイクアップした時に実行されるプログラムを指定しています。
どちらもシェルスクリプトにしています。

次に、.sleepと.wakeupの内容を説明します。
.sleepは #!/bin/sh だけの行で実質的に空ファイルです。
.wakeupは、Synergyを再起動するシェルスクリプト(restart_synergy.sh)を記述しています。

#!/bin/sh
$HOME/bin/restart_synergy.sh

restart_synergy.shの中身は次のようになっています。


#!/bin/sh

PLIST=$HOME/Library/LaunchAgents/org.synergy-foss.org.synergys.plist

if launchctl list | grep -q synergys ; then
    #echo unloading `basename $PLIST` ... 1>&2
    launchctl unload $PLIST
    sleep 1
fi

#echo loading `basename $PLIST` ... 1>&2
launchctl load $PLIST


launchctl listでsynergysが実行されているかどうかを確認し、実行されている場合は一旦停止してからsynergysを再起動します。もともと実行されていなければすぐsynersysを起動します。
また、これらのスリープ、ウェイクアップ用スクリプトファイルに実行用パーミッションを付けておきます。

$ chmod a+x .sleep .wakeup

最後に、launchctlコマンドで起動します。

$ launchctl load ~/Library/LaunchAgents/org.macports.sleepwatcher-localuser.plist

Macをスリープ、解除してWindows側の画面にマウスを持って行ってマウスの速度が通常通りになっていれば成功です。

2013年1月13日日曜日

Synergyを自動起動するようにする

Synergyを設定して以前より便利になりました。でも、だんだん直したい点も出てきました。以下に挙げます。
  1. Windowsの左画面が遠い。
  2. Synergyのアイコンが2個表示される。
  3. ログイン時に自動起動したい。
  4. ログメッセージが多い。
順番に、説明と対策を書いていきます。

1. Windowsの左画面が遠い

Synergyからは、Windowsの画面は1つあるようにしか見えないのですが、実際は24インチモニタが2台並んで接続されています。そのうちの右側のモニタをMacとWindowsで共用しています。ですので、Macのモニタの画面の左端からWindowsの左端のスタートメニューまで行こうとすると、距離が1920 x 2あるので移動が大変です。(何か設定があるのかもしれませんが)

実際の見た目は以下のようですが、
#   mon.1      mon.2     MB Air
# +--------+ +--------+ +-------+
# |Win7    | |MBA/Win7| |MBA    |
# |        | |        | |       |
# +--------+ +--------+ +-------+

Synergyからは以下のように見えます。

#   mon.1      mon.2      mon.2     MB Air

# +--------+ +--------+ +--------+ +-------+
# |Win7    | |Win7    | |MBA     | |MBA    |
# |        | |        | |        | |       |
# +--------+ +--------+ +--------+ +-------+


現状では、Synergyの設定を変えて、以下のようにMacのモニター2(メニューバーのある方)の下に、Windowsのモニタ1が来るようにしています。

# +--------+ +-------+
# |MBA     | |MBA    |
# |        | |       |
# +--------+ +-------+
# +--------+ + - - - -+
# |Win7    | |Win7    |
# |        | |        |
# +--------+ + - - - -+
物理的には、MBAの左側画面とWin7の右側が共用されていて、普段はMacの画面が表示されているわけです。ちょっとわかりづらいですかね。Mac上でマウスを下に持って行くと、Windowsの画面の上からマウスが下りてきます。これで、マウスの大移動をする必要がなくなり、楽になりました。


2. Synergyのアイコンが2個表示される

Dock上や、command + tabキーを押した際に、Synergyのアイコンが2個表示されています。
Synergyはいったん設定した後は、特に操作対象にはなりませんので、非表示でかまいません。
これには、アプリケーションファイルのパッケージを開き、その中のInfo.plistを修正します。
Info.plistをエディタで開いて、<dict>と</dict>で囲まれた領域に次の2行を追加します。

<key>LSUIElement</key>
<true/>

これで、Dock等にアイコンが表示されなくなります。また、注意点としてFinder上での起動操作等も出来なくなりますので、次の3, 4等の対策を行った後に変更するのがいいと思います。

3. ログイン時に自動起動したい
4. ログの出力が多い

Windows側のSynergyクライアントはログイン時に自動的に起動されます。Macでもログイン時に起動したいと思います。単純にSynergysのDockアイコンを「ログイン時に起動」と設定してもうまくいかなかったので、ちゃんとした方法を調べました。
まず、サーバの起動方法は、Synergyのwikiサイトをいろいろ調べると

$ synergys --config /path/to/synergy.conf

でコマンドラインから起動する方法が示してありました。また、Mac OS Xでは起動はlaunchdで行うのがよいとのことでした。このブログを書いている時点(1/13)では、サーバーのProperty List (plist)ファイルの例はまだなくソースコードを見てほしいという記述なっていました。
以下に現在使っているplistファイルの例を記載します。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <!-- Mac OSX only: Copy this plist file into [~]/Library/LaunchAgents to start synergy server automatically. Make sure you change configuration file below -->
  <dict>
    <key>Label</key>
    <string>org.synergy-foss.org.synergys.plist</string>
    <key>OnDemand</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
      <string>/Applications/Synergy.app/Contents/MacOS/synergys</string>
      <string>--no-daemon</string>
      <string>--debug</string>
      <string>NOTE</string>
      <string>--config</string>
      <!-- Replace this path with the path to your synergy configuration -->
      <string>/Users/your_user_id/.synergy.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>


以上の内容を、
~/Library/LaunchAgents/org.synergy-foss.org.synergys.plist
として作成します。
注意点というほどではありませんが、次の点に注目してください。

  1. この例では、synergysはデーモンとしては起動せず通常のプログラムとして起動しています。
  2. --debugオプションにNOTEを指定して、ログファイル(/var/log/system.log)の出力を抑えています。これを指定しない場合、デフォルトはINFOのため、マウスが別のマシンの画面に出入りした場合や、クリップボードへのコピー、ペーストなどの際もログファイルに出力が出てきます。(synergys -hでhelpが見れます)
  3. --configオプションの引数で、confファイルを指定しますが、ここは好きな場所を指定してください。また、confファイル自体は、wiki等を参考に作成してもいいのですが、前の記事のようにSynergyから、FileメニューのSave configuration as... を選んで、自分のホームディレクトリの下に.synergy.conを保存するのが簡単だと思います。
Synergyから保存した時、バグかもしれませんが、confファイルのパーミッションにreadが付いていませんでしたので、修正してください。

$ less .synergy.conf
.synergy.conf: Permission denied

なんと、自分で作成したファイルなのに読めません。

$ ls -l .synergy.conf
--w-------  1 karuku  staff  737 11  9 11:48 .synergy.conf

あまり見たことのないパターンです。次のように修正してください。
$ chmod a+r .synergy.conf

ここまで準備が整った状態で、以下のコマンドでsynergysが実行されるよう指定します。
launchctl load ~/Library/LaunchAgents/org.synergy-foss.org.synergys.plist

ログインし直しても実行されるようです。
実行を止めたい場合は、以下のコマンドを使います。


launchctl unload ~/Library/LaunchAgents/org.synergy-foss.org.synergys.plist


これでログイン後の立ち上げなどは気にする必要がなく使えるようになりました。

ただ、ちょっとした問題として、Macのターミナルが最前面のアプリケーションになっていると、Windows側にマウスが入っていっても、キーボード入力がWindowsに渡らないという現象が起きています。また、その状態でWindowsのExplorer上でスクロールバーをマウスで操作するとターミナル側の行がセレクトされたりの現象も起きています。
また、Windows上にマウスが移動している場合も、Macの画面上にマウスポインターが現れたりしているようですね。通常は、Windowsの画面を見ているので気にならないとは思いますが。

最後に、次の記事にMacがスリープして解除された後にWindows上のマウスのスピードが速くなる現象の対処について書きたいと思います。

.MaxOSX/environment.plistからPATH変数が読まれないことへの対処 [一部修正]

去年(2012年)の前半頃(まだ、Snow Leopardを使っていた頃)のことですが、NerdToolやcrontabから起動しているスクリプトの一部が動かなくなっていることに気づきました。


暫定的な対応


動いているスクリプトと動かないスクリプトを見比べると、スクリプトをフルパスで起動したり、PATH環境変数を再設定しているものは動いていました。PATH変数が何らかの原因で設定されていないようです。とりあえずスクリプト内の動かなかったコマンドが起動できるようにPATH変数を修正して動くようにしていました。
例えばこんな感じです。

修正前
#!/bin/sh
site_check.sh

~/bin ディレクトリにsite_check.shスクリプトを置いていますので、HOME変数を追加します。HOME変数は設定されていました。また、このスクリプト内から/opt/local/binあるコマンドを起動できるようPATHに追加します。

修正後
#!/bin/sh
PATH=/opt/local/bin:$PATH
$HOME/bin/site_check.sh

原因と対応

PATH環境変数が設定されなくなった原因は、Mac OS Xのセキュリティアップデートでの仕様変更のように思われる(どこかで読んだ記憶がある)のですが、ソースを見つけられませんでした。Security Update 2012-002による変更で、ログインした際に、~/.MacOSX/environment.plist内のDYLD_*変数を読み込まないようにしたという記述はあるのですが、PATH変数については記載されていませんでした。[Appleのリンク]

対処については、

  1. アプリケーション内でのInfo.plistでのLSEnvironmentキーを設定する方法
  2. /etc/launchd.confを作成する方法
  3. 個別のアプリケーション毎にlaunchd.plist (ファイル名は別にするようです)を記述する方法

などがあるようです。

1)は、最も安全だそうですですが、アプリケーションのバージョンアップ等で変更を忘れてしまいそうです。また、アプリケーションによっては使えません。2)は、今までログイン時(個別ユーザ用)に設定していたものを、他ユーザにも影響がでるような形で設定するのは、若干抵抗があります。設定自体は、シェルスクリプトの記法に近く楽そうでよいのですね。
3)は、設定がアプリケーション単位で個別にできるのがよい点です。記述は若干面倒そうです。(使い方はLaunchDaemons (launchctl, launchd.plist) の使い方にわかりやすくとめられていました)

いろいろ考えた末、以下の方針にしました。方針というほど大げさなものでもないのですが。
  1. /etc/launchd.confを使用するが、設定は最小限にする。特に、セキュリティのため、自分のIDの書き込み権がある場所は指定しない。
  2. 個別のアプリケーション内の環境設定等で対応できるものは、そこで対応する。NerdToolのシェルスクリプト等、手間がかからないものも各スクリプトで設定する。
  3. 1.〜2.で対応できない場合、そのアプリケーション用のlaunchd.plistを作成し、ユーザ領域の~/Library/LaunchAgents で管理する
  4. アプリケーション内のInfo.plistを修正は、バージョンアップ時に修正を忘れたり管理が大変なため行わない。

/etc/launchd.confを設定する前に、現在のlaunchdのPATH設定を調べたところ、以下のようになっていました。
$ sudo launchctl getenv PATH
/usr/bin:/bin:/usr/sbin:/sbin

/etc/launchd.confは存在していないのでこれらは、デフォルトで設定されているのでしょう。また、/etc/pathsは以下のようになっています。

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

自分のPATH設定に入っている$HOME/bin, /opt/local/bin, /opt/X11/bin, /usr/local/clamXav/binが含まれていませんが、これらはログイン後シェルで使うものが多いので/usr/local/binだけを設定することにしました。それ以外は、.bash_profile等で変更します。

/etc/launchd.confには、

setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

と設定しました。また、/etc/pathsもそれに合わせて/usr/local/binを先頭に持ってきました。

また、crontabやNerdToolなどのシェルは、必要に応じてPATHを追加する方針ですが、現状既にそのように修正しているので基本的にはそのままです。PATHの追加が必要になるのは、ほとんどの場合、$HOME/bin か /opt/local/bin (MacPorts用のパス) です。

感想

environment.plistがサポートされなくなった背景には、Flashbackマルウェアの発生などMac OS Xでもセキュリティを厳しくする必要があるということが挙げられます。Mountain Lionでのsandbox化や承認されたアプリケーションしか基本的にはインストール・起動できないというのもその流れですね。もっと自由にしたいとか、いろいろ意見もあるようですが、今後ますますユーザレベルでも気を付けなければならないのではと思います。

[追記 2013/1/16 ] http://jvn.jp/cert/JVNTA13-010A/ によると、JAVAにまたセキュリティホールが見つかっていますね。注意したいものです。

MacのマウスとキーボードをWindowsで共有できるよう設定(Synergy)

会社でMacBook AirとWindows 7 (Dell PC)を使っているのですが、困ったことがありました。


困っていたこと

机の上にWindows用のモニタとMac用のモニタ、MacBook Air (13")が置いてあり、普段はMacを使っています。たまにWindowsを使わなければならない時に、キーボードやマウスを持ち替えなければならないので面倒でした。また、Windows用のキーボードは10キー付きのフルキーボードで場所も取られます。Macのワイヤレスキーボードはコンパクトでいいのですが。

画面構成は以下のようになっています。

#   mon.1      mon.2     MB Air
# +--------+ +--------+ +-------+
# |Win7    | |MBA/Win7| |MBA    |
# |        | |        | |       |
# +--------+ +--------+ +-------+



モニタ1 (三菱 RDT24IWEX)は、常時Win7機用にしてあります。
モニタ2 (EIZO S2433W)は、MacBook Air (以下、MBAと略します)とWin7機につないでいますが、普段はMBAのメイン画面として使用しています。切り替えは、モニタの外部入力スイッチで行っています。
右端は、MBA本体(13")です。


今までは、MacからWindowsにVNC (Chicken of VNC)で入って、その状態でモニタ2をWindowsに切り替えて使っていました。そうすると、マウスはWindows用に持ち替えなければなりませんが、キーボードはMacのままで、モニタ2もVNCのタイムラグがなく使えていたからです。ただ、事前にVNCに入ったりやはりマウスを持ち替えなければならないのが面倒でした。


解決方法

しばらく上の設定で使っていましたが、もう少しよい解決方法はないかと調べていたらSynergyというフリーのソフトウェアで、異なるマシン間でマウスとキーボードを共用できることがわかりました。Mac, Windows以外にLinuxなどUnix系のOSもサポートしているようです。

ダウンロード

Synergyは、http://syngergy-foss.org/からダウンロードできます。このページのダウロードリンクをクリックし、そこからPremium (寄付をする場合)、Non-Premium (寄付をしない場合)を選択します。私はNon-Premiumを選択して、以下のような画面になりました。そこから、必要なOSバージョンに対応したものをダウンロードします。
私は、Windows 64-bit版とMac OS X 10.6用のver-1.10ベータをダウンロードしました。
構成としては、Mac側をサーバーに、Windows側をクライアント側にします。


インストール(Mac)

まず、Mac用としてダウンロードしたディスクイメージを、ダブルクリックしてオープンします。その中に入っているSynergyアイコンをアプリケーションフォルダにコピーします。
アプリケーションフォルダからダブルクリックして実行した後、Serverセッティングを選ぶと、以下のような画面になります。
Serverのチェックボタンがオンになっています。また、IP AddressがWindows側の設定に必要になるのでメモしておきます。(この場合は、192.168.56.4。環境によって異なります。)
次に、Configure Server...を押して設定を行います。
中心のグリッドにあるアイコンがサーバーのMacのアイコンです。クライアントの配置のために、右上のモニターアイコンを仮想的に配置したい場所にドラッグして置きます。
そのアイコンをダブルクリックして名前を決めます。(ここでは、Win7)
Screen nameだけ変更して、OKボタンを押すと次のようになります。
この後、更にOKボタンを押し、現在の設定をFileメニューの"Save configuration as..."からテキストファイルとして保存しておきます。
私は、ホームディレクトリ下に、.synergy.confという名前にしました。
先頭を.(ピリオド)にしていると、デフォルトではFinderから見えなくなるので注意してください。
この後、Synergyの起動画面のStartボタンを押してサーバーの実行を開始してもかまいませんが、Windows側の設定をしていないので、当然ですがまだ使えません。


インストール(Windows)

次に、Windowsの方にインストールします。ダウンロードしたインストーラをダブルクリックして、指示に従いインストールします。(スクリーンショットを取り忘れてわかりづらいですがすみません。時間があるときにアップデートしたいと思います。)
こちらもインストール後に、スタートメニュー等から実行すると以下のような画面が出てきます。
Cのチェックボックスでクライアントにして、Mac側でメモしていたServer IPを入れます。(私の場合は、192.168.56.4)
その後、Startを押すとクライアントの実行が開始されます。

サーバー(Mac側)の実行

Mac側に戻りServerのStartボタンを押すと実行開始されます。
通常の設定のままの場合、Serverが起動されるとDockに2つSynergyのアイコンが表示されます。名前はSynergyとSynergys (サーバのsが最後に付いています。)

私は、この状態でマウスポインタがMac用のモニタ1の左端から外れた後、更に左に動かすとWindows上にマウスポインタが現れ、キーボードもMacのまま使えるようになりました。
ついでですが、MacではUSキーボードを使っているので、日本語/英語の切り替えは、 shiftキーを押してescキーを押すことで切り替えています。

以前のVNCを使う場合に比べ、非常に楽になりました。マウスやキーボードの反応もほとんど気にならないくらい速いです。
なお、その後、いくつか設定を改善したい点も出てきたので別の記事として書きたいと思います。ちょっと長くなってしまいましたので。

2013年1月12日土曜日

iOS6.0とBluetooth3.0ヘッドセットの組み合わせでうまく聴けない

iPhone5用に使っていたソニーのDR-BT100CXが、イヤホン部分の断線のため、聴こえなくなりました。Bluetooth接続のヘッドセットで通話もできるので便利でした。
その後、しばらくiPhone5付属のイヤホンをiPhoneにつないで使っていましたが、やはりBluetooth接続のイヤホンが便利なので、LogitecのLBT-AR300を買いました。イヤホン部は付属していないのでまだ、iPhone5のものを使っています。そのうち、カナルタイプのイヤホンにしようと思って探しているところです。
LBT-AR300はDR-BT100CXよりも音はいいです。ところがしばらく使っているうちに、音が鳴らなくなる現象が出てきました。はじめは、Bluetoothの接続切れでも起きたのかと思っていましたが、度々起きるので調べてみました。
すると、iPhone5というか、iOS6.0のBluetooth 4.0とLBT-AR300などでサポートしているBluetooth 3.0の組み合わせで不具合があることがわかりました。例えば、アップルのディスカッションフォーラムで話題が出ています。
出ている意見としては、Apple側のBluetooth 4.0の実装に問題があるのかという話です。現在iOS6.0.2に上げていますがまだ直っていないようです。
早く直してほしいものです。カナルタイプのイヤホン探しのモチベーションもちょっと下がり気味です。

プレビューでGIF保存

Mountain LionにしてからOS付属のソフトウェアで変わったことがありますが、そのひとつにプレビューでGIFフォーマットでの保存ができなくなったことが挙げられます。(Lionを飛ばしたのでLionからなのかもしれません。)

例えばPNGフォーマットのファイルをプレビューでGIFに保存したいと思っても、下の図のように、GIFの項目が出てきません。また、「別名で保存...」なども無くなり、複製や書き出しになっている点にも戸惑いましたが。
しばらくは、GIFフォーマットを出力できる別のソフトウェア(SeashoreやGraphicsConverter)を使っていたのですが、やはりプレビューでなんとかしたいと思い、いろいろ試すとoptionキーを押しながらフォーマットのメニューを押すと、GIFも出てくることがわかりました。

GIF以外にも、ICNS、BMPやPhotohopが出てきますね。
GIFは使われる頻度が多いので、なぜoptionキーでしか出てこないようになったのかわかりませんね。ちょっと、というかかなり不便です。

また、ファイルメニューを押してoptionキーを押すと「複製」の代わりに「別名で保存...」が出てくることがわかりました。

iCloudの導入によってこのような変更が行われたのはわかるのですが、「別名で保存...」は長い間使ってきたのと、他のソフトウェアは「別名で保存...」がまだまだ使われているので戸惑ってしまいますね。