handlename's blog

コード片など

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もそんな感じで結局使わなくなっちゃったし。

#ISUCON 2013に参加しました

ISUCON2013 に参加したやったこととか感想とか。

@w650、@nobu_ohtaとチームを組んでの参戦。

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 memosSELECT * 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分ではなす内容は終わってしまったけど、質問をたくさんもらえたので命拾いした
    • 自分が所属しているプロジェクトのこと(=自分が直接関わった物以外も含まれる)をはなすのであれば、もっと事前の準備をしておくべきだった
    • 自分が直接関わったものであれば、どんな質問にも答えられるはず・・・
    • 浅く広くはなすとまとめるのがむずかしい
    • 次はなすときは自分が作ったものについて深堀りしよう!
  • 開発フローやマネジメントについてのはなしがためになった
    • @onishi さんの はなし / 昼過ぎレビュータイムいいなー
    • @myfinder さんの はなし / 「増やせば速くなるような仕組みを作っておく」
  • 後夜祭のテーブルがやたらと豪華だった (@miyagawa さん、@charsbar さん、@inao さん、 @gfx さん、@akiym さん)
  • FreakOutの方やmixiの方とも話せてよかった (主にテストの話)

運営の方々、スピーカーの方々、参加者の方々、みなさまお疲れ様でした。 @lestrrat さん、@941 さんが運営から引退されるということで、来年以降はどうなるんでしょうね。

buffer-moves導入してみた

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

ログイン時には必ずターミナルを立ち上げるので、これで充分。