April 5, 2012

LionでFinderのフォルダや選択したテキストからターミナルを開く

LionでFinderのフォルダや選択したテキストからターミナルを開くには,cdtoを利用する方法もありますが,元から入っている機能を利用して実現できます.以下はosx - Open terminal here in Mac OS finder - Stack Overflowの適当な訳.


Mac OS X Lion 10.7ではサービスを利用してターミナルを開く方法がある.デフォルトだと無効になっているので有効にする必要がある.

System Preferences → Keyboard → Keyboard Shortcuts → Services

New Terminal at FolderNew Terminal Tab at Folderを有効にする.日本語だとなんと表記されているかわかりません←


サービスのサブメニュー(メニューバーにあるアプリケーション名をクリックすると表示される)とコンテキストメニュー(フォルダか選択されたパス上で右クリックする)に表示される.ショートカットキーも割り当てられる.

これらのサービスは他のアプリケーションでも利用可能.またこれらはどこかのフォルダだけでなく,選択されたテキストの絶対パスからもターミナルを開ける.

フォルダを選択して右クリックでもいける

テキストを選択した状態でメニューバーからサービスを選んでもいける

さらにLionのターミナルではフォルダかパス名をターミナルのアイコンにドラッグアンドドロップすればFinderの新しいタブで開ける.

選択したテキストをドラッグアンドドロップしてもいける

フォルダかパス名をターミナルのタブバーにドラッグすると,自動的に"cd"コマンドが実行される.(単純にターミナルにドラッグした場合はパス名が挿入される)

選択したテキストでもいける

元記事にはシェルスクリプトでこれらを実現する方法や,関連情報としてサービスで選択したテキストのmanを見る方法も記されています.

March 13, 2012

KDD Cup 2012, Track 1の訳

追記

提出方法が追記されました.

追記終わり

KDD Cup 2012は3/15から.Track 1は

訓練データ(ユーザとアイテムとユーザがアイテムをフォローしたかどうか)とユーザ・アイテムのデータを使って,テストデータ(ユーザとアイテム)が与えられてたら推薦度を推定する,

というタスク.http://www.kddcup2012.org/c/kddcup2012-track1 をざっくり翻訳.誤訳なければいいけど.Tencent WeiboはTwitterとだいぶ似てるけどちょっと違うみたい.


データセット


Item, Tweet, Retweet, Comment, Followee/Followerの定義とデータセットについて.

Item


アイテムはTencent Weiboのユーザ.ユーザは個人とか組織とかグループ.アイテムはカテゴリに整理されている.カテゴリは階層構造をもつ.

たとえば Dr. Kaifu LEE, http://t.qq.com/kaifulee は
  •  X.science-and-technology.internet.mobile
  •  X.business.Invest.Angel Investment
の2つのカテゴリに属している.Xはルートカテゴリ.

階層は「.」で区切られていて,カテゴリの情報はモデル推定に使えるかも.たとえばPeterさんがkaifuleeさんをフォローしてる時,Peterさんはkaifuleeさんが属しているカテゴリのアイテムに興味ありそう,ついでにkaifuleeさんのカテゴリの親カテゴリのアイテムにも興味ありそうだとか.

Tweet


マイクロブログのメッセージのアクション.投稿されたメッセージそのもの.

Retweet


ユーザは他のユーザのツイートにコメントをつけてリツイートできる.フォローされてるほかのユーザに共有.

Comment


ツイートに対してコメントできる.コメントは他のユーザにはプッシュされない.コメント履歴には残る.Twitterにはないかな?

Followee/follower


AがBをフォローしてたら,AはBのフォロワー(follower),BはAのフォロウィー(followee).

データセットについて


データセットはユーザに対するアイテムの推薦とフォローの履歴.めちゃでかい.プロフィールやソーシャルグラフ,アイテムカテゴリの情報といった様々なドメインの情報がある.

データセット内のユーザの数は数百万.いろんな情報(デモグラフィック,プロフィールキーワード,フォローヒストリーとか)があるから,いい推定モデルできるんじゃないかな.ユーザのプライバシーを守るため,ユーザとアイテムのIDは匿名化してる.更に,情報は,中国語の場合でも,ランダムな番号にしてる.だから中国語わかんなくてもカンケーない.推薦のタイムスタンプは与えられてます.



ファイル


7つのテキストからなる2つのデータセット.各項目はタブ区切り.

a) 訓練データ rec_log_train.txt
b) テストデータ rec_log_test.txt
(UserId)\t(ItemId)\t(Result)\t(Unix-timestamp)
  • (UserId) : ユーザID
  • (ItemId) : アイテムID
  • (Result) : 1か-1.1はUserIdが推薦されたアイテムItemIdをアクセプトしてフォローしたもの.-1はリジェクト.テストデータのResultは全部-1に設定されている.
  • (Unix-tmiestamp) : タイムスタンプ
% head rec_log_train.txt 
2088948 1760350 -1 1318348785
2088948 1774722 -1 1318348785
2088948 786313 -1 1318348785
601635 1775029 -1 1318348785
601635 1902321 -1 1318348785
601635 462104 -1 1318348785
1529353 1774509 -1 1318348786
1529353 1774717 -1 1318348786
1529353 1775024 -1 1318348786
1853982 1760403 -1 1318348789


c) ユーザとアイテムのデータ

i. ユーザプロフィール user_profile.txt
(UserId)\t(Year-of-birth)\t(Gender)\t(Number-of-tweet)\t(Tag-Ids)
  • (UserId) : ユーザID
  • (Year-of-birth) : 生まれ年.サービスに登録した時に選択
  • (Gender) “0, 1, 2” : わからない,男,女
  • (Number-of-tweet) : ツイートの数
  • (Tag-Ids) : 興味のあること.ユーザが選ぶ.山登りに興味があったら「山登り」を選ぶ.何も選ばない人もいる.「tag-id1;tag-id2;...;tag-idN」ってフォーマット.なにも選ばなかったら「0」
% head user_profile.txt 
100044 1899 1 5 831;55;198;8;450;7;39;5;111
100054 1987 2 6 0
100065 1989 1 57 0
100080 1986 1 31 113;41;44;48;91;96;42;79;92;35
100086 1986 1 129 0
100097 1981 1 75 0
100100 1984 1 47 71;51
100101 2003 1 31 0
100116 1988 2 39 35
100117 2009 2 37 0


ii. アイテム item.txt
(ItemId)\t(Item-Category)\t(Item-Keyword)
  • (ItemId) : アイテムID
  • (Item-Category) “a.b.c.d” : 階層的なカテゴリ.aはbの親カテゴリ…
  • (Item-Keyword) “id1;id2;…;idN” : キーワード.ウェイボの対応したプロフィールから抽出.数字.
% head item.txt 
2335869 8.1.4.2 412042;974;85658;174033;974;9525;72246;39928;8895;30066;2245;1670;85658;174033;6977;6183;974;85658;174033;974;9525;72246;39928;8895;30066;2245;1670;85658;174033;6977;6183;974
1774844 1.8.3.6 31449;517124;45008;2796;79868;45008;202761;2796;101376;144894;31449;327552;133996;17409;2796;4986;2887;31449;6183;2796;79868;45008;13157;16541;2796;17027;2796;2896;4109;501517;2487;2184;9089;17979;9268;2796;79868;45008;202761;2796;101376;144894;31449;327552;133996;17409;2796;4986;2887;31449;6183;2796;79868;45008;13157;16541;2796;17027;2796;2896;4109;501517;2487;2184;9089;17979;9268
1775000 1.4.2.4 259580;626835;12152;6183;561;10666;12152;6183;561;60774;21206;561;160212;539;2225;320443;12152;6183;561;10666;12152;6183;561;60774;21206;561;160212;539;2225;320443
1775024 1.4.1.4 498354;61029;60774;12318;3825;465;5788;6183;561;61029;539;71940;335;27;60774;12318;3825;465;5788;6183;561;61029;539;71940;335;27
1774455 1.4.1.2 155009;345081;12203;6183;561;9642;12203;561;3203;40075;539;345081;26124;10638;490970;12203;6183;561;9642;12203;561;3203;40075;539;345081;26124;10638;490970
1775040 1.4.2.2 100947;97714;12203;6183;3203;45782;12203;3203;46868;13;97714;12203;6183;3203;45782;12203;3203;46868;13;97714
1774505 1.4.9.2 254337;195099;974;12203;6183;974;11354;12203;974;37888;17713;62372;454;974;12203;6183;974;11354;12203;974;37888;17713;62372;454;974
1774776 8.1.4.2 239661;974;46479;17713;974;14461;46479;17713;974;31325;610;46441;143118;208450;5647;35944;70488;307170;175621;326588;46479;17713;974;14461;46479;17713;974;31325;610;46441;143118;208450;5647;35944;70488;307170;175621;326588
495072 8.1.4.2 296259;596521;4861;4385;31325;31693;12152;974;35133;205881;474444;1100;115394;76462;636390;112571;75629;4861;35639;4385;31325;136353;87610;93388;159442;146683;300971;4861;4385;31325;31693;12152;974;35133;205881;474444;1100;115394;76462;636390;112571;75629;4861;35639;4385;31325;136353;87610;93388;159442;146683;300971
2076876 1.4.9.2 239661;974;428257;6183;68271;974;6254;46479;17713;36169;6183;68271;974;50048;68271;125744;41791;30825;31325;46479;17713;60765;490251;3824;22793;102745;288673;6183;68271;974;6254;46479;17713;36169;6183;68271;974;50048;68271;125744;41791;30825;31325;46479;17713;60765;490251;3824;22793;102745;288673


iii. アクション user_action.txt
(UserId)\t(Action-Destination-UserId)\t(Number-of-at-action)\t(Number-of-retweet )\t(Number-of-comment)
  • (UserId) : ユーザID
  • (Action-Destination-UserId) : 相手のユーザID
  • (Number-of-at-action) : アクションの数
  • (Number-of-retweet ) : リツイートの数
  • (Number-of-comment) : コメントの数
たとえば
“A B 3 5 6”
だったら,AのBへの @つきアクション(リプライ?メンション?)が3回,リツイート5回,コメントが6回.
% head user_action.txt 
1000004 1000004 0 3 4
1000004 1290320 0 3 0
1000004 1675399 0 1 0
1000004 1760423 0 1 0
1000004 1774718 0 1 0
1000004 1774862 0 1 0
1000004 1775076 0 1 0
1000004 1837210 0 1 0
1000004 1928681 0 1 0
1000004 1954203 0 1 0


iv. ユーザSNS user_sns.txt

ユザーのフォロー履歴
(Follower-userid)\t(Followee-userid)
  • (Follower-userid) : フォローしたユーザのID
  • (Followee-userid) : フォローされたユーザのID.
% head user_sns.txt 
1000001 373407
1000001 461001
1000001 692475
1000002 1760423
1000002 1760426
1000002 1760642
1000002 1774712
1000002 1774861
1000002 1774957
1000002 1774963


v. ユーザキーワード user_key_word.txt

ツイート,リツイート,コメントから抽出したキーワード
(UserId)\t(Keywords)
  • (UserId)
  • (Keywords) “kw1:weight1;kw2:weight2;…kw3:weight3” : weightが大きいほどユーザは興味が有りそう.Integer.
% head user_key_word.txt 
1000000 183:0.6673;2:0.3535;359:0.304;363:0.1835;377:0.1831;10:0.1747;58:0.1725;127:0.1624;459:0.1482;54:0.142;330:0.1361;1480:0.1358;40:0.1136;672:0.1037
1000001 92:1.0
1000002 112:1.0
1000003 154435:0.746;30:0.3902;220:0.2803;238:0.2781;232:0.2717;1928:0.2479
1000004 118:1.0
1000005 157:0.484;25:0.4383;198:0.3033;185:0.3012;31:0.2991;80:0.2971;203:0.241;34:0.2347;95:0.2327;37:0.214
1000006 277:0.7815;1980:0.4825;146:0.175;103:0.1475;83:0.1382;107:0.1061;892:0.1019
1000007 4069:0.6678;2557:0.6104;137:0.4261
1000008 16:0.7164;154:0.3278;164:0.3222;246:0.2258;17:0.1943;14:0.1789;340:0.1789;366:0.1719;139:0.1587;279301:0.1139;484:0.1083;116:0.1055;193:0.1027



出力

各テストデータに対して
(UserId)\t(ItemId)\t(Prediction)
  • (UserId) : ユーザID
  • (ItemId) : アイテムID
  • (Prediction) : -1 ~ 1の値.点数が高いほど,より推薦されやすい.


評価


平均適合率で量る
ap@n = Σ k=1,...,n P(k) / (number of items clicked in m items)
  • 分母が0だったら結果は0
  • P(k)はkで足切りしたアイテムの適合率.つまりk番目までのアイテムの中でクリックされたアイテムの割合.一つもフォローされてなかったらP(k)は0
  • n=3がデフォルト
たとえば
  1. 5つのアイテムが推薦されて,ユーザが1,3,4番目をクリックしたら, ap@3 = (1/1 + 2/3)/3 ≈ 0.56
  2. 4つのアイテムが推薦されて,ユーザが1,2,4番目をクリックしたら ap@3 = (1/1 + 2/2)/3 ≈ 0.67
  3. 3つアイテムが推薦されて,ユーザが1,3番目をクリックしたら ap@3 = (1/1 + 2/3)/2 ≈ 0.83

各ユーザに対する平均適合率平均がスコア

AP@n = Σ i=1,...,N ap@ni / N

いまいちどうやって出力したらいいかわからん.テストデータは3/15公開.


提出方法


The rec_log_test.txt にはリーダーボード(順位表)用セットと評価用セットが含まれている.ファイルは一時的にソートされている.タイムスタンプが1321891200未満のデータはリーダーボードに用いられ,1321891200以上のデータは評価に用いられる.ゴールはそれぞれのセットの中であるユーザに推薦されたアイテムがユーザによってフォローされかどうかを推定してやること.

出力サンプルはダウンロード可.2種類のフォーマットが利用できる.一つはヘッダあり2列のcsvファイル(サイズは大きくなる).一つはヘッダなし1列のcsvファイル(サイズは小さくなる).圧縮して提出することが望ましい.アップロードされたら10〜20秒後にリーダーボード用のデータにスコアが付けられ,結果がリーダーボードに表示される.

2列csvフォーマットでは,1列目はユーザID(リーダーボード用,評価用,それぞれでソートされている),2列目は0~3個のスペース区切りの推薦すべきアイテムID(e.g. "647356 458026 1606609")を.n=3の平均適合率が計算される.提出ファイルのユーザIDの順番はサンプルと同じ順番に正確に対応させなくてはならない.すなわち,リーダーボードセットの結果は評価セットの前におき,それぞれのデータ内ではユーザIDでソートされていなくてはならない.

1列フォーマットでは,単純にスペース区切りでアイテムを.順番は2列の場合と同じ.

% head rec_log_test.txt
1449438 1394821 0 1321027200
1449438 372323 0 1321027200
1525431 1774707 0 1321027200
1587150 1774422 0 1321027200
1587150 1774934 0 1321027200
2064344 1505267 0 1321027200
2081969 1760410 0 1321027200
2141596 1760376 0 1321027200
2359607 1606609 0 1321027200
2359607 2105484 0 1321027200

2列
% head sub_small_header.csv 
id,clicks
100001,647356 458026 1606609
100004,647356 1606574 1774568
100005,1606574 1774532 586592
100009,647356 1760327 1606574
100010,458026 2105511 713225
100011,1774594 1774717 1774505
100012,458026 2105511 727272
100013,1870054 514413 1760401
100014,859545 2167615 715470

1列
% head sub_min.csv 
647356 458026 1606609
647356 1606574 1774568
1606574 1774532 586592
647356 1760327 1606574
458026 2105511 713225
1774594 1774717 1774505
458026 2105511 727272
1870054 514413 1760401
859545 2167615 715470
647356 458026 1606574

February 17, 2012

Pythonで線形動的システムのパラメータ推定を実装してみるもなんかうまくいってない

線形動的システム(線形力学系,Linear dynamical systems; LDS)のEMアルゴリズムによるパラメータ推定を行いました.が,うまくいってない気がします.カルマンフィルタなどで扱う状態方程式(外部入力なし)と観測方程式において,状態と観測が与えられたときに,係数を求めるのが目的です.Ghahramaniらの論文1の手法を実装します.

状態方程式と観測方程式が
$\begin{align}
{\bf x}_{t+1}&=A{\bf x}_t + {\bf w}_t\\
{\bf y}_{t}&=C{\bf x}_t + {\bf v}_t\\
{\bf w}_t &\sim N(0,Q)\\
{\bf v}_t &\sim N(0,R)\\
\end{align}$
というように表され,$\{{\bf y}_1,...,{\bf y}_T\}$が与えられたときに,$A,C,Q,R$と初期状態の平均ベクトル$\pi_1$と分散共分散行列$V_1$を推定します.

論文がとても分かりやすいので,実装に必要なところだけ抜粋します.


Eステップ

以下のように定義します.
$\begin{align}
{\bf x}_t^{\tau}&=E({\bf x}_t|\{{\bf y}_1^{\tau}\})\\
V_t^{\tau}&=Var({\bf x}_t|\{{\bf y}_1^{\tau}\})\\
\end{align}$

Kalman filter
$\begin{align}
{\bf x}_1^0 &= {\bf \pi}_1\\
V_1^0 &= V_1\\
{\bf x}_t^{t-1} &= A {\bf x}_{t-1}^{t-1}\\
V_t^{t-1} &= A V_{t-1}^{t-1} A' + Q\\
K_t &= V_t^{t-1}C'(CV_t^{t-1}C'+R)^{-1}\\
{\bf x}_t^t &= {\bf x}_t^{t-1} + K_t({\bf y}_t-C{\bf x}_t^{t-1})\\
V_t^t &= V_t^{t-1} - K_t C V_t^{t-1}\\
\end{align}$

Kalman smoother
$\begin{align}
J_{t-1} &= V_{t-1}^{t-1}A'(V_t^{t-1})^{-1}\\
{\bf x}_{t-1}^T &= {\bf x}_{t-1}^{t-1} + J_{t-1}({\bf x}_t^T - A{\bf x}_{t-1}^{t-1})\\
V_{t-1}^T &= V_{t-1}^{t-1} + J_{t-1}(V_t^T - V_t^{t-1})J_{t-1}'\\
V_{T,T-1}^T &= (I - K_T C)AV_{T-1}^{T-1}\\
V_{t-1,t-2}^T &= V_{t-1}^{t-1}J_{t-2}' + J_t-1(V_{t,t-1}^T - AV_{t-1}^{t-1})J_{t-2}'\\
\end{align}$

これらを用いて,Mステップへの入力を求めます.
$\begin{align}
{\hat {\bf x}}_t & = {\bf x}_t^T \\
P_t & = V_t^T + {\bf x}_t^T {{\bf x}_t^T}' \\
P_{t,t-1} & = V_{t,t-1}^T + {\bf x}_t^T{{\bf x}_{t-1}^T}' \\
\end{align}$


Mステップ
$\begin{align}
C^{new} & = (\sum_{t=1}^T {\bf y}_t {\hat{\bf x}}_t')(\sum_{t=1}^T P_t)^{-1} \\
R^{new} & = \frac{1}{T}\sum_{t=1}^T({\bf y}_t{\bf y}_t' - C^{new}{\hat{\bf x}}_t{\bf y}_t') \\
A^{new} & = (\sum_{t=2}^T P_{t,t-1})(\sum_{t=2}^T P_{t-1})^{-1} \\
Q^{new} & = \frac{1}{T-1}(\sum_{t=2}^T P_{t} - A^{new}\sum_{t=2}^T P_{t-1,t}) \\
{\bf \pi}_1^{new} & = {\hat {\bf x}}_1 \\
V_1^{new} & = P_1 - {\hat {\bf x}}_1{\hat {\bf x}}_1'
\end{align}$
なおN個の観測列があるときは
$\begin{align}
{\bar {\hat {\bf x}}}_t & = \frac{1}{N}\sum_{i=1}^N {\hat {\bf x}}_t^{(i)} \\
V_1^{new} & = P_1 - {\bar {\hat {\bf x}}}_1{\bar {\hat {\bf x}}}_1' + \frac{1}{N}\sum_{i=1}^N [{\bar {\hat {\bf x}}}_1^{(i)}-{\bar {\hat {\bf x}}}_1][{\bar {\hat {\bf x}}}_1^{(i)}-{\bar {\hat {\bf x}}}_1]' \\
\end{align}$



実験

Wikipediaのカルマンフィルタの例にあるシステムで実験してみました.トロッコが摩擦なしの無限レール上でランダムな力によって動くシステムです.

データを生成するために用意したパラメータは
A
[[ 1.   0.1]
 [ 0.   1. ]]
C
[[ 1.  0.]]
Q
[[  2.50000000e-05   5.00000000e-04]
 [  5.00000000e-04   1.00000000e-02]]
R
[[ 1.]]
でした.

が,下のコードによって推定された結果は
A
[[ 0.62656567  0.64773696]
 [ 0.56148647  0.0486408 ]]
C
[[ 0.19605285  1.14560846]]
Q
[[ 0.15479875 -0.12660499]
 [-0.12665761  0.31297647]]
R
[[ 0.59216228]]
pi_1
[[-0.39133729]
 [-0.89786661]]
V_1
[[ 0.18260503 -0.07688508]
 [-0.07691364  0.20206351]]
でした.下のコードでは生成されるデータは毎回異なるので結果はその都度変わります.がどうもうまくいかない.


赤が真の位置,マゼンダが推定された位置.青が真の速度,シアンが推定された速度.


どこがおかしいのだろう(:D)| ̄|_ =3


1. Z. Ghahramani and G.E. Hinton. Parameter estimation for linear dynamical systems. University of Toronto technical report CRG-TR-96-2, 6, 1996.

February 1, 2012

Xcode 4でPythonの開発環境を整える


XcodeでPythonを開発することができるようです.はじめは少々面倒かもしれませんが.でもXcodeのPythonシンタックスハイライトはきれいな気もするし,Emacs風のキーバインドも使えるし,アリかも.

Python in Xcode 4 - Stack Overflow訳しただけ参考にしました.

  1. Xcode 4を開く.
  2. "File" → "New" → "New Project…"で新しいプロジェクトを作成.


  3. "Mac OS X"の"Other"を選択.
  4. "External Build System"を選択し,"Next"をクリック.


  5. プロダクト名と識別名(Company Identifier)を入力.
  6. "Build Tool"には,/usr/bin/pythonを入力して"Next"をクリック.ほかの場所にPythonをインストールしてたらそれを入力.
  7. どこに保存するか決めて"Create".


  8. メニューバーから"File" → "New" → "New File…"を選択.


  9. "Mac OS X"の"Other"を選択.
  10. "Empty"を選択し,"Next"をクリック.


  11. 拡張子".py"を含んだPythonファイルをプロジェクトのフォルダに保存し"Save"をクリック.


  12. メニューバーから"Product" → "Edit Scheme…"を選択.


  13. 左のコラムから"Run"を選択.
  14. "Info"タブから,"Executable"フィールドを選択し,"Other…"を選択.


  15. 手順6で選んだ場所に移動.⇧⌘G (shift + command + g)で移動する場所を指定できる.


  16. "Executable"から選択.
  17. "Debugger"フィールドは,"None"を指定.


  18. "Arguments"タブから"Base Expansions On"フィールドを選択,プロジェクトの名前を選択.
  19. "Arguments Passed On Launch"の"+"をクリック.
  20. $(SOURCE_ROOT)/実行したいファイル名 を記入.ファイルはプロジェクトフォルダの中にないと実行できない.もしほかの場所のものを実行したいときはフルパスを記入.スペースを含む場合はクォーテーションで囲む.


  21. "OK"をクリック.
  22. コーディングをはじめましょう!



  • ⌘Rで実行できます.
  • デフォルトでは出力は下のパネルに表示されます.
  • タブ幅,文字コードは右のパネルから変更可能です.
  • Pythonの自動インデントはできません.
  • 応用すれば他の言語の開発環境もつくれるかも.

Macbook Airの環境を整える覚書 その2

自分用.以前書いたMacBook Airの環境を整える覚書と合わせて.

Finder


サイドバーの文字サイズ変更


System Preferences > GeneralでSidebar icon sizeをSmallに.
ついでにRestore windows when quitting and re-opening appsはアンチェック.



Terminal


ログインシェルをzshに変更


System PreferencesからUsers & Groups
左下のロックを外して,Current Userを右クリック,Advanced Options...
Login shellを/bin/zshに.


行数の変更,終了後の動作の変更,metaキーの設定の変更


PreferencesからWindowでRowsを43に.



PreferencesからShellでWhen the shell exits:をClose if the shell exited cleanlyに.



PreferencesからKeyboardでUse option as meta keyにチェック.




キーボード


フルキーボードアクセスをすべてのコンポーネントで.ダイアログでタブとスペースを組み合わせて選択できるようになる.




IME


Input Sources


System Preferences > Language & Text > Input SourcesからDvorak - Qwerty ⌘,Kotoeri > HiraganaRomajiの3つを選択.ときどき気が向いたらDvorak←
ついでにKeyboard & Character Viewerにもチェック.
2つ以上のInput Sourceの切り替えは⌘長押しで.

Google 日本語入力


すばらしいんだけどDvorakとうまく共存できない…?



App Store


Xcode

開発環境.ダウンロード後,Install Xcodeを実行.

Stuffit Expander

解凍.

The Unarchiver

解凍.

Evernote

メモ.

Skitch

スクリーンキャプチャ.



パッケージ管理


Homebrew


MacPortsより楽な気がする.
/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
要Intel CPU,OS X 10.5 or higher,Xcode with X11,Java Developer Update.



フォント


Ricty


Incosolata + Migu 1M.Terminalに開発環境に.RictyをインストールするためにはFontForgeを入れる必要があります.
brew install fontforge
ln -s /usr/local/Cellar/fontforge/20110222/FontForge.app /Applications
2行目のシンボリックリンクの張り方はFontForgeインストール後に表示される.



テキストエディタ


CotEditor


Preferences > Syntax > Delay coloringにチェック



ウェブブラウザ


Chrome


Firefox

Opera

LaTeX

UpTeX.app

色々まとまって入ってる.

ghostscript

Homebrewインストール後
brew install ghostscript

TexShop

LaTeX書くときは便利.テキストエディタで書いちゃうことも多い.

ファイル共有

Dropbox

よほど大きくならない限り計算結果なんかもここに.持ってるすべての端末でzsh, vim, emacs, CotEditorの環境設定も共有.~/Dropbox/Settings以下に共有する環境設定を置いておく.下は環境共有をまとめて設定するシェルスクリプト.つったってシンボリックリンク貼ってるだけ.

Python

pip

Python用パッケージ管理.http://www.pip-installer.org/en/latest/index.html
easy_install pip
easy_installのかわり.アンインストールもできる.

ScipySuperpack


Lionの環境に合わせたscipyやら入れるために.