Cocoa Emacsをインストールして使っています。
Mountain Lionは素直にsudo port install emacs-app
でよいみたい。
Lionはフルスクリーンなどいくつかパッチをあてる必要があるので、自分でコンパイルします。
git commit
をしたときなどに必要となるemacsclient
の設定も.zshrcなどに書いておきます。
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
export EDITOR='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
MacではAquaSKKを利用。現在、辞書をホストしているサイトが落ちているので、ミラーからダウンロードする。
git clone
して中身を/Library/Application Support/AquaSKK
につっこんで辞書ファイルの場所をそこに指定すれば解決。
git clone https://github.com/hsaito/ddskk.git
cd ddskk
SKK-CFGの終わりの付近をいじる。
;;; Apple Mac OS X self-contained Carbon/Cocoa Emacs
(setq SKK_DATADIR "/Applications/MacPorts/Emacs.app/Contents/Resources/etc/skk")
(setq SKK_INFODIR "/Applications/MacPorts/Emacs.app/Contents/Resources/info")
(setq SKK_LISPDIR "/Applications/MacPorts/Emacs.app/Contents/Resources/site-lisp/skk")
(setq SKK_SET_JISYO t)
;;
あとはインストールするだけ。
sudo make install Emacs=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
環境変数の設定をまずしておきます。
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
アップデートとかはこの付近で。selfupdateやsyncはプロトコルにrsyncを使っていたりするので、proxy環境下では注意が必要。port install
はhttpプロトコルを使っているっぽい。
sudo port -d selfupdate
sudo port -d sync
sudo port install zsh-devel +mp_completion
sudo port install screen
sudo port install ghostscript-fonts-hiragino
sudo port install pTeX +utf8 +motif
sudo port install nkf
sudo port install maxima
sudo port install breqn
sudo port install ImageMagick +lcms +jpeg2
sudo port install wget
sudo port install omake
sudo port install watch
sudo port install graphviz
sudo port install global # for gtags
Clojure自体はインストール不要。leinさえあればどうにでもなる。「leinがjavaのversionが古くてleinが動かない」といった環境では(leinを使えるところで作った)jarを使えばこれまたどうにでもなる。
cd ~/bin
wget https://raw.github.com/technomancy/leiningen/preview/bin/lein
chmod +x lein
leinの2.0からはself-installしなくても勝手にやってくれるようになりました。便利ですねー。
lein new # 新しいプロジェクトを作成するとき。srcやtestのディレクトリとかproject.cljの雛形も作ってくれるので便利
lein run # 普通にタスクを走らせるとき
lein run -m Namespace.function # coreとか以外に書いた関数を指定して走らせたい場合
lein uberjar # 依存しているものとかも含めてjarで掃き出してくれる
lein test # testを走らせる
(require 'clojure-mode)
;; http://paste.lisp.org/display/120878
(add-hook 'clojure-mode-hook
(lambda ()
(paredit-mode +1)
(show-paren-mode 1)
(setq minor-mode-overriding-map-alist
`((paredit-mode
,@(remove (cons ?\C-j 'paredit-newline)
paredit-mode-map))))))
(autoload 'paredit-mode "paredit"
"Minor mode for pseudo-structurally editing Lisp code."
t)
Emacsからclojureを触ろうと思ったときにREPLをぽんぽん叩けないとすごくストレスなのだが、lein2になってからlein swank
が叩けなくなっているので非常に不便感がある。最近は変わったっぽいのでそっちを使うことにする。
結局、nrepl.elを.emacs.dのpathの通ったところにダウンドードして、.emacsに
(setenv "PATH"
(concat '"~/bin:" (getenv "PATH")))
(require 'nrepl)
を記述。binにパスを通しているのはleinをemacsから見つけてくれないから。
バージョン管理系のソフトウェア。
sudo port install git-core
sudo port install tig
sudo port install git-flow
- git commit -m
- 変更内容を確認しながらcommitできるのでよく使う
sudo port install ruby19
# 1.8系ならこっち。1.9系はgemsも勝手に付いてくる
# sudo port install ruby
# sudo port install rb-rubygems
sudo gem1.9 install hpricot
sudo gem1.9 install mechanize
sudo gem1.9 install refe
sudo gem1.9 install kramdown
Clojureもそのまま動いてくれて便利。
sudo gem1.9 install heroku
herokuにpushするためには少し設定が必要です。
ssh-keygen -t rsa
heroku keys:add
git pull heroku master
MacportsでpTeXと依存しているパッケージをインストール。YaTeXを経由して普段は使用します。
LaTeXの原稿を変更したら、コンパイルもしなおして欲しいもの。Omakeではそういうった作業を自動化することができます。
omake --install
してできたOMakefileにあれこれ書きますが、雛形としてはこんな感じ。
LATEX = platex
DVIPDFM = dvipdfmx
BIBTEX = jbibtex
DVIPDFMFLAGS = -p a4
LaTeXDocument(template-e, template-e)
template-e.dvi: ref.bib
.DEFAULT: template-e.pdf template-e.dvi
その後、omake -P --verbose
などとしておくと継続的に監視してくれて便利です。
-
sands(Remap Space KeyをSpace to Shift_L + When you type Space only, send Space)、かな、英数をshiftに
-
emacsキーバインドに変更
-
ついでにspotlightのキーバインドも変更しておく(Ctrl+CMD+Space)
大きなディレクトリなどで差分だけをネットワーク越しに転送するときに便利。転送が失敗しても途中からやり直すといったことができるのでよい。
とりあえずは
rsync -avnu server://nfs/path/to/dir .
のようなオプションを付けてやってみるのがよい。nはどういう風に展開されるかをプリントしてくれるやつで、面倒だけど、一回かましておくのが安全。最後にスラッシュを付けるか付けないかとかであれこれあるっぽい。
大量の計算機にjobを投げて一括で管理したい、などの要望があるときに非常に便利なソフトウェア。以下より、ソースコード一式をダウンロード。
~/bin
など、パスの通ったところに展開して、.zshrc
などに
export PATH=$HOME/bin/gxp3:$PATH
とやってコマンドを叩いておけるようにする。
まず、前提としてローカルとリモートのいくつかのサーバーがpasswordなしでログインできる必要がある。そのためにはssh-keygen
などをした後に~/.ssh/id_rsa.pub
の内容をリモートサーバーの~/.ssh/authorized_keys
などにペタペタと貼っていけばよい。
あとローカルとリモートでユーザー名が違うなどの問題がある場合には、~/.ssh/config
ファイルに
Host radish
User yasuhisa-y
Host pepper
User yasuhisa-y
などと書いていけばよい。これでssh pine2
とかパスなしで行ければ準備は終わりである。
ローカルのマシンの名前がdn156-177、リモートのマシンの名前の一つがpepperだったとしよう。gxpにそれを教えてあげる必要があって
./gxpc use ssh dn156-177 pepper
などとする。引数なしのuseで
/Users/yasuhisa/Downloads/gxp-3.07% ./gxpc use
0 : use ssh dn156-177 pepper
1 : use ssh dn156-177 radish
2 : use ssh dn156-177 carrot
3 : use ssh dn156-177 tomato
4 : use ssh dn156-177 papaya
5 : use ssh dn156-177 parsley
というように教えた一欄が見れる。一つのマシンにタスクをいくつ割りふる(上のやつはそのそも名前を教えただけなので、実際にタスクをふるときにはこれをする必要がある)ときには
./gxpc explore radish 10
などとする。この例だとこのリモートサーバーで10個のタスクが並列して走るが、あまり増やしすぎると一つのタスクで使えるCPUが少なくなるのでかえって遅くなるので適度な数で。
投げるやつ一欄のようなものはstatを使うとできて
/Users/yasuhisa/Downloads/gxp-3.07% ./gxpc stat
/tmp/gxp-yasuhisa-default/gxp-57861810-session-dn156-177-yasuhisa-2010-08-15-17-08-09-63469-00954402
dn156-177-yasuhisa-2010-08-15-17-08-09-63469 (= dn156-177 dn156-177)
radish-yasuhisa-y-2010-08-15-17-42-18-2419 (= radish radish)
radish-yasuhisa-y-2010-08-15-17-42-20-2439 (= radish radish)
pepper-yasuhisa-y-2010-08-15-17-09-50-22429 (= pepper pepper)
papaya-yasuhisa-y-2010-08-15-17-08-58-19159 (= papaya papaya)
papaya-yasuhisa-y-2010-08-15-17-08-58-19160 (= papaya papaya)
という感じ。
簡単なテストっぽいものから。gxpc eは引数にコマンドを取って、各サーバーにタスクを投げに行く。
/Users/yasuhisa/Downloads/gxp-3.07% ./gxpc e hostname | head
parsley
radish
radish
parsley
dn156-177.naist.jp
radish
pepper
radish
carrot
parsley
実際に使うようなタスクの例を考えてみる。巨大なテキストファイルをいくつか分割して、分割したものに対して動くようなスクリプトファイルがあったとしよう。例えばkNNで全pairの近傍を探してくるというようなものだとN個サンプルがあれば、(N * N) / 2の類似度の計算が必要になる。こいつを分割したい(近傍探してくるのは、独立に計算できるのがミソ)。gxpではタスクファイルというものを用意するとこいつを並列にやってくれる。以下のようなタスクファイルを用意する。
0 cpp/add_knn_feature data/unlabeled/books.txt data/labeled/books_train.txt_0.txt ../data/labeled/books_train.txt_0_knn_books.txt
1 cpp/add_knn_feature data/unlabeled/books.txt data/labeled/books_train.txt_1.txt ../data/labeled/books_train.txt_1_knn_books.txt
2 cpp/add_knn_feature data/unlabeled/books.txt data/labeled/books_train.txt_2.txt ../data/labeled/books_train.txt_2_knn_books.txt
タスクid、(オプションも付けれるらしいが、ここでは使わない)コマンドという感じ。今はタスクファイルの中身をRubyで生成しているけど、プログラミングっぽいことはできないのかな?
実行する。
/Users/yasuhisa/Downloads/gxp-3.07% ./gxpc ep -H dn156-177 /Users/yasuhisa/java/hadoop/task.txt
今の実験設定だとlocalはmacbookでこいつでは実験しないので、excludeしてくれというのが-Hのオプション。あとはタスクファイルの場所を引数に取る。
実行がうまくいったかは"ローカルの"statusファイルに入っている。関係ないけど、このstatusファイルからどのサーバーでどれくらいのタスクが実行されたかは
/Users/yasuhisa/Downloads/gxp-3.07% cut -f 4 -d " " status | ruby -ne 'puts $1 if $_ =~ /(.*?)_\d\d$/' | sort | uniq -c
63 carrot
17 papaya
30 parsley
40 pepper
57 radish
などとすればよい。statusファイルはタスクのどこまでがうまくいったかなどの情報を持っていて、途中でkillした場合、もう一度gxp epすれば残ったものを実行してくれるようだ(どこかのサーバーが遅いとかそういう時に)。
出力を出すようなプログラムだと"リモートの"outputディレクトリ以下に入っている。
- Dropbox
- クラウドでファイル管理
- Skitch
- スクリーンショットを取るのに便利
- Omnifocus
- Papers