2015年5月10日日曜日

MacOS XのTerminal.appでmoshを使う(英語環境の場合)

moshをFreeBSD(9.1と9.2)とMacOS X(10.9.5)でインストールした話の続きです。
FreeBSDとMacOS Xでmoshを使う
http://www.sakashita-net.jp/2015/05/freebsdmacos-xmosh.html

MacOS Xのターミナル.appでmoshを使う(日本語環境の場合)
http://www.sakashita-net.jp/2015/05/macos-x1095appterminalappmosh.html
先の記述は、システム環境設定/言語と地域/優先する言語で「日本語」を最優先としている場合にはうまく動きます。しかし、「言語と地域」で「English」を最優先にしている場合には、もう少し設定が必要です。
私の場合、仕事で米国の方にMacOS Xでの設定を伝える必要があり、画面写真を送る時などにメニューの表記などが英語になるように、「English」を有線にしています。
上記の記事にある記述のままで、ターミナルからmoshを起動すると、以下のような表示になってしまいうまく動きません。
mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",

The client-supplied environment (LC_CTYPE=UTF-8) specifies
the character set "".

LANG=
LC_CTYPE=UTF-8
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
Connection to ホスト名 closed.
/usr/local/bin/mosh: Did not find mosh server startup message.
よく見てみると、LC_CTYPEがUTF-8という謎の値になっています。本来であれば、en_US.UTF-8になっていなければなりません。試しに、Terminal.appの設定で「Set locale environment variables on startup」のチェックを外して起動してみると、次のようになります。
mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",

The client-supplied environment ([no charset variables]) specifies
the character set "US-ASCII".

LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
LANGなど環境変数に何も設定されていません。検索エンジンで調べてみると次のようなWWWページが見つかります。
Setting locales correctly on Mac OSX Terminal application
http://blog.remibergsma.com/2012/07/10/setting-locales-correctly-on-mac-osx-terminal-application/
ここでもLC_CTYPE環境変数がUTF-8となってしまうと書かれています。しかし、このWWWページにある解決先、「Set locale environment variables on startup」にチェックを外すとLANGには何も設定されていない状態になってしまい、うまくいきません。たぶん、MacOS Xのバージョンが違い、動作が違っているのでしょう。

もう少し調べてみると、次のようなページが見つかります。
システムワイドなロケール設定 ~ Mac OS X (その2)
http://d.hatena.ne.jp/flying-foozy/20140204/1391520123
ここでは、以下のように書かれています。
GUI 経由でアプリを起動した場合、起動されたプロセスに対して、ロケール系環境変数は設定されません。GUI 経由でのアプリ起動では、シェルが介在していないので、~/.bashrc 等での設定も意味を持ちません。
GUI 経由で起動される全てのアプリに対して、ロケール系のものを含めた、環境変数設定を行うには、設定ファイル /etc/launchd.conf を使用します。
ということで、「Set locale environment variables on startup」にチェックを外したままで、/etc/launchd.confを作成し、以下のように記述します。
setenv LANG en_US.UTF-8
記述方法は、さらに以下を参考にしました。
launchd で Homebrew を自動アップデート
http://kymmt90.hatenablog.com/entry/launchd_brew
これでよいかと安心していると、次のようなWWWページを見つけました。
launchd で Homebrew を自動アップデート(Yosemite 編)
http://kymmt90.hatenablog.com/entry/launchd_brew_yosemite
以下のような記述があり、MacOS XをYosemita(10.10.x)に変更するとうまく動かなくなるようです。
Yosemite では /etc/launchd.conf という lanunchd 設定ファイルが廃止されている(バグ?)ことがわかりました。
これは困ります。回避方法を検索してみると、次のようなWWWページがありました 。
Setting environment variables via launchd.conf no longer works in OS X Yosemite?
http://stackoverflow.com/questions/25385934/setting-environment-variables-via-launchd-conf-no-longer-works-in-os-x-yosemite
ここではAppleScriptとUsers&GroupsにあるLogin Itemsを使う方法が紹介されています。
To avoid this, launch AppleScript Editor, enter a command like this:
do shell script "launchctl setenv variablename value"

(Use multiple lines if you want to set multiple variables)

Now save (+s) as File format: Application. Finally open System SettingsUsers & GroupsLogin Items and add your new application.
そこでApplication/UtilitiesフォルダにあるAppleScript Editorを起動し、中ほどの入力欄に以下のように書き込みます。
do shell script "launchctl setenv LANG en_US.UTF-8"
そして/Users/ユーザー名/Applicationフォルダに名前をつけて保存します。これだけでは実行できないので[Export...]メニューからApplication形式で書き出します。次に、Systems Preferences/Users&Groupsで自分自身のアカウント選び、Login Itemsに先ほどのApplication形式で書きだしたApple Scriptファイルを追加します。
これで、英語環境でもmoshをterminal.appから使えるようになりました。

うまくLANG環境変数が設定されているかは、わざと「Set locale environment variables on startup」にチェックをしてmoshを起動してみるとわかります。
mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",

The client-supplied environment (LC_CTYPE=UTF-8) specifies
the character set "".


LANG=en_US.UTF-8
LC_CTYPE=UTF-8
LC_COLLATE="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=
LANGは確かにen_US.UTF-8になっていて、LC_CTYPEは「Set locale environment variables on startup」にチェックをしているために、UTF-8になってしまっています。

英語環境でTerminal.appが正しくen_US.UTF-8と設定してくれるなら、このような苦労は不要なのですが、残念です。