コマンドラインで OS X のエイリアスを解決する

シンボリックリンクと異なり、ターミナルのコマンドは (OS X の) エイリアスを解決してくれません。

$ cd 名称未設定フォルダ\ のエイリアス
-bash: cd: 名称未設定フォルダ のエイリアス: Not a directory

エイリアスを解決してくれるコマンドがあればよいのですが、見当たらなかったのでシェルスクリプトを書いてみました。

osascript コマンドを使えばコマンドラインからAppleScriptを実行出来るので、これを利用します。

#!/bin/sh

# エイリアスへのパスを引数として渡すと、そのエイリアスが指す先を標準出力に出力する
# エイリアスでないものへのパスや、存在しないパスを渡した場合はそれをそのまま出力する
osascript -e '
on run fname
	try
		tell application "Finder"
			return POSIX path of (original item of (fname as POSIX file as alias) as alias)
		end tell
	on error
		return fname
	end try
end run
' "$1" 2>/dev/null

とりあえず以上のスクリプトを resolve_osx_alias という名前で保存し、実行権限をつけてパスの通ったところに置けば以下のような感じでエイリアスを解決出来ます。

$ resolve_osx_alias 名称未設定フォルダ\ のエイリアス 
/Users/nakt/Desktop/名称未設定フォルダ/

$ pwd
/Users/nakt/Desktop
$ cd "`resolve_osx_alias 名称未設定フォルダ\ のエイリアス`"
$ pwd
/Users/nakt/Desktop/名称未設定フォルダ

おまけ: bashエイリアスに直接 cd 出来るように

以下の記述を ~/.bashrc に加えることで直接フォルダのエイリアスに cd 出来るようになります。

cd(){
	command cd "`resolve_osx_alias "$1"`"
}
$ pwd
/Users/nakt/Desktop
$ cd 名称未設定フォルダ\ のエイリアス
$ pwd
/Users/nakt/Desktop/名称未設定フォルダ

おまけ2: Emacs

Emacsエイリアスを解決してくれません。
上記の resolve_osx_alias をパスの通ったところに置いた上で .emacs.d/init.el に以下の記述を加えれば、
C-x C-f や dired などでファイルを開く際にエイリアスを解決してくれるようになります。

(when (= (shell-command "which resolve_osx_alias") 0) ; resolve_osx_alias コマンドが存在すれば
	; find-file-noselect の第一引数を resolve_osx_alias コマンドに通す
	(defadvice find-file-noselect
	  (before resolve-osx-alias)
	  (ad-set-arg
	   0
	   (replace-regexp-in-string
		"\n$" ""
		(shell-command-to-string
		 (concat "resolve_osx_alias "
				 (shell-quote-argument (ad-get-arg 0)))))))
	(ad-activate 'find-file-noselect))

球面上のランダムな点

(3次元)単位球面上から、偏りなくランダムに点を得たいとします。


単位円上であれば、区間[0,2\pi)上の一様乱数\thetaを生成すれば点(\cos\theta,\sin\theta)が目的のものとなりますが、
球座標(r,\theta,\phi)で同様に「\theta[0,\pi)\phi[0,2\pi)上の一様乱数」としてしまうと極付近に点が偏ってしまいます。

方法1

区間[-1,1]上の一様乱数を3つ生成し、a,b,cとする。
(a,b,c)が単位球に含まれていれば、
\begin{pmatrix} x\\y\\z \end{pmatrix} = \frac{1}{\sqrt{{a^2+b^2+c^2}}}\begin{pmatrix} a\\b\\c \end{pmatrix}
が目的のもの。含まれていなければやり直し。

分かりやすくて良いですね。
ただ、1回で点が得られるとは限らないのが残念です。


(a,b,c)は単位球内から偏りなく選ばれるので、もちろん(x,y,z)も単位球面上から偏りなく選ばれます。

方法2

\phi[0,2\pi)上の、z[-1,1]上の一様乱数とすれば、
\begin{pmatrix} x\\y\\z \end{pmatrix} = \begin{pmatrix} \sqrt{1-z^2}\cos \phi \\ \sqrt{1-z^2}\sin \phi  \\z \end{pmatrix}
が目的のもの。

これだとまた極方向に偏ってしまいそうですが、そうはなりません。


球座標(r,\theta,\phi)\theta,\phiを一様乱数にすると、微小面積\sin\theta d\theta d\phiに対して(?)一様に点が
分布することになるため、\sin\thetaが小さい極付近に点が集まってしまいます。
ここで
 \cos\theta = z
とすれば
 \sin\theta d\theta d\phi = -dzd\phi
となり、\phizを一様乱数とすれば偏りは無くなります。

方法3

正規乱数を3つ生成し、a,b,cとすれば、
\begin{pmatrix} x\\y\\z \end{pmatrix} = \frac{1}{\sqrt{{a^2+b^2+c^2}}}\begin{pmatrix} a\\b\\c \end{pmatrix}
が目的のもの。

某所で最近見かけたのですが、どうやら正規乱数を用いると簡単に書けるようです。


正規分布
 f(x)=\frac{1}{\sqrt{2 \pi}}e^{-\frac{x}{2}}
のような形をしているので、ある点(a,b,c)が選ばれる確率密度(?)は
 (\frac{1}{\sqrt{2 \pi}})^3 e^{-\frac{a^2+b^2+c^2}{2}}
となり、原点からの距離sqrt{a^2+b^2+c^2}にのみ依存する(等方的である)、といった感じでしょうか。
これだと任意の次元に使えそうですね。

初等関数の範囲内での積分

「ある関数が初等関数の範囲内で積分出来るか」を判定するにはどうするか、というのが長年の疑問だったんですが、
リッシュのアルゴリズムというものを使って調べられるようですね。すっきりしました。
しかし、ざっと調べても具体的な内容が出てきませんでした。解析の教科書には載っているものだそうなので、買えということでしょうか。
数学は真面目に独習したいのでちょうどいいかもしれませんね。