emacsからST2に乗り換えたメモ
4年ほど使ったemacsからST2に乗り換えてみたメモ。 ST2の使用期間は1週間くらい。 emacsの設定は ここ。 ST2の設定につてはまだ固まってないので割愛。
きっかけ
Marvericksをクリーンインストールして、 .emacsのバックアップをそのまま置いたら動かなかったので。
el-getでパッケージを入れなおしても バイトコンパイルで失敗したりしてうまく行かなかったので この際乗り換えてみるかーということでやってみた。
emacsの機能/拡張と同等のプラグインが見つかったもの
el-get → Package Control
検索サイトが見やすい。
画面分割 → origami
本体の分割機能だけでは心許ないので。
align → Alignment
細かい設定ができないので若干不満。 ほかにも似たようなプラグインはあるようなので試してみる。
flymake → SublimeLinter
なんかうまく動いてない気がする。 たぶんlinterのパスとかその辺りの設定。
helm → 基本機能
プロジェクト内のファイルやファイル内の関数をインクリメンタルに探せる。
git-gutter → GitGutter
もともとST2由来ですし。
ace-jump-mode → EasyMotion
画面分割したときに別のペインにもジャンプしたいんだけど設定すれば出来るんだろか?
dash-at-point → DashDoc
ドキュメント引こう。
ensime → Ensime
ensime-serverをそのまま使ってるらしい。 ほかのエディタでも使えるようになってるensimeがGood。
org-mode → orgmode
完全互換ではないけど、アウトラインエディタまわりはほぼほぼ使えるみたい。 orgtblも使えるようにならないかなー
不満点など
ないのか、それともあるけど知らないのかは置いといて。
日本語入力
GoogleIMEに設定してる Ctrl+h
(一文字削除) とか Ctrl+m
(確定) とかが
ST2に奪われてしまって使えない。
かわりにBackspace/Enterを使えば同等のことができるけど、
ホームポジションから手を離すのはいまいち。
dired的なものがほしい
サイドバーにファイルツリーが出せるけど、あんまり使いやすくない。 ファイル操作までST2の中でやる必要はないけれど、 リネームや削除を追従してくれるdiredは使いやすかった。
helm-M-x相当の機能がほしい
用意されているコマンドを検索して実行できる機能がほしい。 知らない機能を探したり使い慣れていない操作を確認したりするのにとても便利。 コマンドラインコンソールはあるけど補完もされないし代替として使うのは難しそう。
おわり
オープンソースじゃないし開発スピードも落ちてるしっていう理由で Go実装のクローン が出てきたりもしてるけど、とりあえずライセンス買ってみたのでしばらく使ってみる。
最初はvimを使おうかと思ったりはしたけれど、 あまりにも操作方法が違うので長時間使うのは耐えられなかった。 vimはユーザーが考えなければいけないことが多い気がする。 SKKもそんな感じで結局使わなくなっちゃったし。
AWS Simple IconsをPNGに変換する
- ImageMagick 6.8.7-0
http://aws.amazon.com/jp/architecture/icons/
PNG形式で欲しかったので、ImageMagickでSVG形式のファイルを変換した。
mkdir png find . -name *.svg | perl -ne '$f = $_; chomp $f; (undef, $d) = split("/([^/]+)\$", $f); `convert -density 1200 -transparent white "$f" "png/$d.png`'
#ISUCON 2013に参加しました
ISUCON2013 に参加したやったこととか感想とか。
@w650、@nobu_ohtaとチームを組んでの参戦。
横浜会場の様子です #isucon pic.twitter.com/M7F9yac21o
— NAGATA Hiroaki (@handlename) 2013, 10月 5
DS置いてあるけど狩りに行ってたわけじゃないです。 あ、始まる前は狩りに行ってたけど始まってからは行ってないです。 さっきHR51になりました。
最終的な構成
perlアプリ + nginx + mysql + redis
memcachedを使っていると思ったら実は使ってなかった。
やったことを覚えている範囲で書いてみましょうか。
git
とりあえずサーバー上にgitリポジトリを作る。 各自このリポジトリからcloneして、変更を加えたらpushする、とういうやり方にした。 スコアが下がる変更を入れてしまった場合にもすぐに以前の状態に戻せて便利。
post-recieve hookをいじって、pushと同時にアプリの再起動をするようにしていたけど、 ベンチを走らせている時にうっかりpushして502が出る事故が何度かあったので 結局後半はhookをつかわなかった。
apache -> nginx
apacheは最近全く触っていなかったので、勝手のわかるnginxに置き換え。 もしかしてLuaを使って高速化できるんじゃないか? ということでわざわざopenrestyを入れなおしたけど、やっぱり使わなかった。
アクセスログの解析
nginxのアクセスログをtailしつつベンチマークを回して、 一度のベンチマークでリクエストされるURLをチェック。
$ cat access.log | perl -nE 's!/\d+!/__id__!g; say $_' | perl -nE '/"((:?GET|POST) \S+)/; say $1' | sort | uniq -c | sort -nr 3076 GET /js/jquery.min.js 3076 GET /js/bootstrap.min.js 3076 GET /css/bootstrap.min.css 3076 GET /css/bootstrap-responsive.min.css 2482 GET /memo/__id__ 2430 GET / 1150 GET /recent/__id__ 384 POST /signout 382 POST /signin 382 POST /memo 382 GET /signin 382 GET /mypage
集計結果を見て、
GET /memo/__id__
GET /
GET /recent/__id__
を重点的に攻めることに。
各テーブルのインデックス
WHERE句に指定されているのにインデックスが張られていないカラムにインデックスを追加。 ここは @nobu_ohta におまかせだったので追加でどこにはたのかは把握してない。
ORDER BY created_date -> ORDER BY id
created_dateとidの並び順が同じだったので、ORDER BYの対象をidに変更。 stringよりintの方がソートは速かったはず。
slow logの解析
my.conf の long_query_time=0.1
にして、
吐かれたslow logをpt-query-digestにかけてチェック。
GET /
と GET /recent/:page
で呼ばれるmemosを取ってくるクエリの、
SELECT * FROM memos WHERE ...
を
SELECT id FROM memos
と SELECT * FROM memos WHERE ID IN (...)
の
2回に分けることで多少は速くなった。
OFFSETがしんどそうだなーと思いつつもこれをなくすことはできなかった…。
アプリ周り
StarmanをStarletに変更。 worker数は変更なし。 静的ファイルはnginxから返す。 Markdown返還後のテキストをmemcachedにキャッシュ。 その他諸々をキャッシュ。 memosのcountはRedisのincrに置き換え。memosにinsertするたびにincr。 このあたりも @nobu_ohta と @w650 におまかせだったのであんまり知らない。
my.cnf
ほとんどいじってない。
query_cache_size
を0にしたのと、innodb_buffer_pool
を設定したくらい。
反省点とか
こうして書いてみると8時間あったのにあまり手を動かせていない。
インフラ担当だったのにアプリも弄りたくなって行ったり来たりしていた。 ボトルネック探しに専念していれば効率よくスコアを伸ばせたかも。
「memcachedみたいなもの」にはぜんぜん気づいてなかった。
最初から動いてるperlのアプリがどこで起動しているのかさっぱりだった。 探しまわって無駄な時間を使うことに…。
ベンチマークツールのworkloadを変更できることをすっかり忘れていた。 READMEには「スコアの集計はworkloadの値によらず〜」みたいな事が書いてあったのに、 スコア集計はworkloadを固定して行うから変えても効果はないよ、みたいな意味に勘違いしていた。 2とか3とかに変えていればもう少しマシなスコアになったのかも…。
トップのチームはスコア30000超えてますね。ぱねぇ
予選敗退と相成ったので、運営お手伝いに回ります。 本戦出場のみなさまがんばってくださいね!
tmuxのコピーモードの選択範囲を外部のコマンドにわたす
- tmux 1.8
tmuxのコピーモードで、選択中のテキストを外部のコマンドに渡せたら捗るのになー と思ってman引いたらそのまんまな例が載ってた。
One command accepts an argument, copy-pipe, which copies the selection and pipes it to a command. For example the following will bind `C-q' to copy the selection into /tmp as well as the paste buffer:
bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"
cat >/tmp/out
の部分を置き換えれば好きなコマンドに選択範囲を渡せる。
つまり、範囲を選択してNoPasteに投げる、みたいなことがコマンド一発でできる。
べんり〜
YAPC::Asia Tokyo 2013に参加してきた
参加するのは今回で4回め。
- 今回はスピーカーとしての参加だった トークのページ
- 40分枠なのに30分ではなす内容は終わってしまったけど、質問をたくさんもらえたので命拾いした
- 自分が所属しているプロジェクトのこと(=自分が直接関わった物以外も含まれる)をはなすのであれば、もっと事前の準備をしておくべきだった
- 自分が直接関わったものであれば、どんな質問にも答えられるはず・・・
- 浅く広くはなすとまとめるのがむずかしい
- 次はなすときは自分が作ったものについて深堀りしよう!
- 開発フローやマネジメントについてのはなしがためになった
- 後夜祭のテーブルがやたらと豪華だった (@miyagawa さん、@charsbar さん、@inao さん、 @gfx さん、@akiym さん)
- FreakOutの方やmixiの方とも話せてよかった (主にテストの話)
運営の方々、スピーカーの方々、参加者の方々、みなさまお疲れ様でした。 @lestrrat さん、@941 さんが運営から引退されるということで、来年以降はどうなるんでしょうね。
buffer-moves導入してみた
- emacs 24.2.1
bufferの移動には buffer-moveがいい感じ - Life is very short
便利そうだったので導入してみた。 el-get のレシピに最初から入っているので、
M-x el-get-install<RET>buffer-moves
でインストールできる。
カーソルキーが空いていたので、キーバインドはそこに割り当てた。
(global-set-key (kbd "M-<right>") 'buf-move-right) (global-set-key (kbd "M-<left>") 'buf-move-left) (global-set-key (kbd "M-<down>") 'buf-move-down) (global-set-key (kbd "M-<up>") 'buf-move-up)
捗る。
ログイン時にencfsをマウントする
- encfs 1.7.4
- zsh 5.0.2
.zshrc に次のように書いておく。
if [ ! -d "$HOME/crypt" -o -z "$(ls -A $HOME/crypt)" ]; then encfs ~/.crypt ~/crypt fi
ログイン時には必ずターミナルを立ち上げるので、これで充分。