blog.handlena.me

コード書いたりゲームしたり

  • highlight-symbolとhydraを組み合わせると捗る

    GNU Emacs 24.4.50.1 highlight-symbol 1.2 hydra 0.10.0 Awesome Emacsという 便利packageリンク集があるのを知って眺めていたら、 表題のhighlight-symbolとhydraを組み合わせてみたら捗るんじゃないかと 思って組み合わせてみたらやっぱり捗りそうな感じだったのでメモしておく。 highlight-symbolとは 名前の通りコード内の同一シンボル(と思われるもの)をハイライトしてくれるツール。 hydraとは 関連するコマンドを複数定義して、 それらのコマンドを連続して簡単に呼び出せるようにするツール。 捗る設定 init.elに以下のように書いて、評価して、 (global-set-key (kbd "C-x H") (defhydra hydra-highlight-symbol (:post (progn (highlight-symbol-remove-all))) "highlight-symbol" ("." highlight-symbol-at-point "highlight") ("n" highlight-symbol-next "next") ("p" highlight-symbol-prev "prev") ("N" highlight-symbol-next-in-defun "next in defun") ("P" highlight-symbol-prev-in-defun "prev in defun"))) C-x Hとタイプすれば各コマンド(この場合.、n、p、N、P)が使えるモードになる。 (「モード」という呼び方が正しいのかどうかは知らない) C-x Hとタイプした後は各コマンドを単体で連続して使える。 つまりn、n、nとタイプすれば次々とシンボルをたどることができる。 定義されているキーバインド以外を入力するとこのモードから抜ける。 :postを設定して、抜けるときにハイライトを解除するようにしている。 よくわからないと思うのでスクリーンキャストをどうぞ: 録画の都合上emacs起動時からになっているので半分くらい起動を待つ時間になっております:p 録画用に軽い設定を用意すればいいのかもしれない。 asciinema初めて使ってみたけど便利。 ・・・抜けるときにハイライトが解除されてないことに気づいちゃった人もいると思いますが、 なんでかターミナルで動かすとhighlight-symbol-remove-allが効かないんです。 普段はEmacs.appを使っていてそちらでは問題ないので深追いはしない。 hydraのREADMEに載っているzoomやGoto-errorは普通に便利そうなので後で試す。 追記 2015-02-20 10:00 Emacs.

    Read more…
  • tmuxのcopy-pipeとsplit-windowを組み合わせると捗る

    tmux 1.8 以前こういうエントリを書いた。 tmuxのコピーモードの選択範囲を外部のコマンドにわたす - handlename's blog ローカルで使っているtmux.confに以下のような設定を書いて、 選択範囲をnopasteに投げられるようにしていた。 bind-key -temacs-copy C-q copy-pipe "cat | ~/bin/np" 上の例にあるnpというコマンドは、 nopasteした後にそのURLを標準出力に出す そのURLをブラウザで開く というもの。 copy-pipeした場合は標準出力が見られないものの、 ブラウザで開くというのは有効なのでローカルで使っている分には特に問題がなかった。 しかし、リモートでtmuxを使っている場合は ブラウザが開けないのでnopasteしたURLが得られず 無意味な設定になってしまう。 アカウントに紐付いたものリストが見られるような nopasteサービスを使っていればそこから辿れなくはないが、 めんどくさいし今使っている社内nopasteにはそんな機能はない。 とはいえこれが使えないとちょっとしたテキストを 共有するのにすごく不便(一度ファイルに落としてからnpコマンドに食わせないといけない)。 そこでtmuxのsplit-window(ウィンドウの分割)と組み合わせて その場でnopaste先のURLを確認できるようにしてみた。 bind-key -temacs-copy C-q copy-pipe "cat | ~/bin/np > ~/.last_np; tmux split-window -p 1 'less ~/.last_np'" 下の方にピコッと表示される (社内nopasteのURLなのでモザイクだらけとなっております) ちょっと長いがやっていることは簡単で、 nopasteした後にその結果をtmuxのsplit-windowに渡している。 npコマンドの結果(=nopaste先のURL)を~/.last_npというファイルに保存 split-windowコマンドで~/.last_npの内容をlessで表示 URLが表示できればいいだけなので-pは最小の1に split-windowは引数にコマンドを指定すると そのコマンドが終了すると同時にペインを閉じる。 今回はlessで開いているので、qを入力すればペインごと閉じてくれる。 いちいちファイルを介さないといけないので無駄な感じもするが、 手を動かさないといけないわけではないし、 履歴を確認できると思えばまあいいかな、と。 cat | ~/bin/np >> ~/.

    Read more…
  • flycheck用のgo-vetコマンドを再定義する

    go 1.3.1 darwin/amd64 emacs GNU Emacs 24.4.50.1 わけあってgoamzのコードをemacs上で読んでいたら、 こことかで flycheck経由のgo-vetが次のようなワーニングを出していた。 composite literal uses unkeyed fields AttributeDefinitionsはsliceだから、なんでunkeyed fieldsと書かれているのかがわからない。 スルーしてもいいのだけど、気になるのでググったら 「-composites=falseするといいよ!」ってあった。 https://code.google.com/p/go/issues/detail?id=6820 というわけでflycheckのcheckerを再定義した。 (flycheck-define-checker go-vet "A go syntax checker." :command ("go" "tool" "vet" "-composites=false" source-inplace) :error-patterns ((error line-start (file-name) ":" line ":" (minimal-match (message)) line-end)) :modes (go-mode)) これで上記のワーニングは出なくなった。

  • #isucon 4決勝にfujiwara組として参加した感想

    順位はこちら。 ISUCON4 本選結果 : ISUCON公式Blog 表題の通り感想がメインです。 結果 (2位以上に大差を付けられての)3位だった 推測できたはずのスコアアップポイントに気付けなかった 今年の問題 動画広告配信サービスをいい感じにスピードアップする 動画広告の入稿・配信・レポート機能がある サーバーは3台 残業(開始が遅れたことによる1時間延長)あり やったこと @acidlemonさんの記事を読んでもらうのがいいかと。 Cache-Controlを有効にして高qps勝負に持ち込むところまで行けなかったので、 後半はアプリよりもnginxとベンチマーカーのパラメータのチューニングがメイン。 感想など 複数チーム分同時に走らせていた影響か、 ベンチマーカーの結果が乱高下して打ち手が効いているのかどうなのか 判断できなかったのが残念。 とはいえキャッシュを効かせて帯域勝負を脱していれば そんなことには影響されなかったはずなのでベンチマーカーのせいにはできない。 ネットワーク帯域を使いきっている 使いきらないためには・・・? 動画を送らないというのはどうだろう? というところまでは辿り着いたものの、 動画配信を適度に失敗させてスコアを稼ごう、という ちょっとずれた方向に進んでしまった。 一時期33万点というスコアを出したチームがあったが、 スコアのグラフからはすぐ消されてしまったので、 「桁が変わるようなブレークスルーはないのだろう」と決めつけてしまっていた。 (優勝チームはこれを見てスコアを劇的に延ばすポイントを探しはじめたとのこと) ISUCONだからということで、普通のWebサービスなら普通にやることをやらずに (頭のなかの)ベンチマーカーに対してどうやってリクエストを返すか、 ということに時間を使ってしまったのが敗因ですかね。 順位はともかく出題意図に気付けなかったことがくやしい〜〜!! 運営の皆様、参加者の皆様、お疲れ様でした。 来年もISUCONあるよとのことなのでぜひともリベンジしたいところです。

  • atom から emacs に戻ったはなし

    emacs 24.4.50.1 atom 0.124.0 .emacs.d が事故で消えてからはや半年、 そのあいだ atom を使っていたのだけど物足りない感じがしてきたので 一から emacs の設定をしたはなし。 リポジトリはこちら。 いちいちリポジトリ毎作りなおすのが面倒だったので、 タグ を切って ファイルを全消しするスタイルにした。 handlename/dot-emacs 移行したもの quelpa なんか新しいらしい。 "ケルパ" って読むのかな? el-get から移行。 el-get はキャッシュファイル(?)が壊れるとリカバリーが面倒だったので。 (そんなに頻繁になることではないから、実質大した不満はなかったのだけど) 自分でレシピを追加できるのがいい。 でもまだ MELPA にあるものしか使ってない。 気に入らなくなった時に package.el にすぐ戻れそうなところもいい。 projectile, helm-projectile 自前のプロジェクト移動機能 (.emacs.d が消えた時に消失) から移行。 "helmインターフェイスでプロジェクト選択 - そのままファイル絞り込み" ができて便利。 プロジェクトの追加が自動なので、 ちょっと開いただけのディレクトリがどんどん追加されていくのでちょっと不便。 ghq に対応させたい。 多機能っぽいので使いながら他の機能も調べてみる。 flycheck flymakeから移行。 というか一時期から flymake すら使っていなかった。 やっぱりあったほうが便利。 elisp で warning (You should have a section marked ";;; Code:" みたいなやつ) が出まくるのがうざい・・・。 シンタックスチェック用のコマンドを差し替えれば回避できそうなので もうちょっと調べてみる。

    Read more…
  • emacs でシェルの環境変数を全部読み込む

    emacs 24.4.50.1 zsh 5.0.2 perl 5.18.1 emacs で普段使っているシェルの環境変数を引き継ぎたい。 exec-path-from-shell を使うのがいいらしいが、 使いたい環境変数が増えるたびに el ファイルに追加していくのはめんどくさい。 ちょっと古いやり方かもしれないが、 実況中のシェルの環境変数を全部 el ファイルに書きだすようなスクリプトを書いた。 .emacs.d を git で管理していて github などにあげている場合は、 shellenv.el を .gitignore に追加しておかないとたぶん危ない。 https://github.com/handlename/dot-emacs/blob/master/scripts/init_shellenv.pl 実行すると、 $ perl scripts/init_shellenv.pl こういうファイルが作られる。 $ cat shellenv.el (setenv "TERM" "screen") (setenv "PLENV_ROOT" "/Users/handle/.plenv") (setenv "PLENV_VERSION" "5.18.1") (setenv "HOME" "/Users/handle") (setenv "GOPATH" "/Users/handle") ... で、 init.el とかに (load-file (concat user-emacs-directory "/shellenv.el")) と書いておけば全部 set される。 元ネタはこれ。 シェルと Emacsの PATHを共有する - Life is very short

  • mimic っていう http mock サーバーを書いた

    go 1.3.1 引き続き go 勉強中。 mux というものを知ったので これを使ってなにか書いてみた結果。 https://github.com/handlename/mimic ユースケース フロントエンドの人と平行して作業をするときに、 「このAPIまだ出来てないの?」 「とりあえず持っくでいいからレスポンス用意してよ」 と言われることがよくある。 そういう場合はとりあえず固定のレスポンスを返すコントローラーを定義して、 開発サーバーに上げたりするのだけど、まあめんどくさい。 なんとかフロントの人で完結できないか? コードを書かずに動かせるモックサーバーがあれば・・・! (あとづけです) 最初に書いたとおり mux を使ってみようっていうのがモチベーションなので、 同じことができるツールが有るかとかはぜんぜん調べてない。 これはなに? JSON で設定を書くとその通りにレスポンスを返してくれる http mock サーバー。 こういう JSON を書いて、 { "rules": [ { "method" : "GET", "path" : "/", "content" : "hello" } ] } mimic に食わせると、 $ mimic --config=config.json こういうレスポンスを返してくれる。 $ curl http://localhost:3390/ hello% 詳しくは README 参照。 なにがうれしいか 使う人はコード書かなくていい 各環境用のビルド済みのバイナリ があるので go をビルドできる環境がなくても OK 今後の展望 config.

    Read more…
  • get-git-ignore というツールを書いた

    go 1.3.1 なにか書き始めるとき、小さいものでもとりあえず git で管理するようにしている。 で、ちょっと大きくなると .gitignore ファイルを置く必要が出てくる。 このときいつも github/gitignore から 該当言語を探して raw の URL をたどってダウンロード、というのをやっていたのだけど、 いいかんげんめんどくさくなってきたので楽して取ってこれるツールを書いた。 go の練習も兼ねてる。 https://github.com/handlename/go-get-git-ignore REAMEにあるように言語一覧のファイルを用意して設定を .zshrc に書くと、 こんな風にこんな風にインタラクティブに絞り込んで目的の言語の .gitignore を取ってくることができる。 peco 便利。 言語一覧ファイルの生成機能くらいはつけてもいいかなーと思ったりしてる。 言語一覧ファイルは不要になった。追記参照。 追記 2014-08-21 mattn さんに プルリク を頂いて、 .gitignore.list を用意する必要がなくなりました。 しれっとコマンド中のエラー処理とか、net/http のレスポンスの処理とかも 直してもらっててありがたや〜 追記 2014-08-22 ブコメで知りましたが、 gibo コマンドラインツール gitignore.io Webサービス/APIあり などの便利ツール・サービスが有るようです。 便利な世の中だ。

  • go-opts というパッケージを書いた

    go 1.3.1 go 言語でコマンドライン引数を受け取る場合、 flag というモジュールを使う。 http://golang.org/pkg/flag/ こんなコードを書くと --xxx / -xxx 形式でコマンドライン引数を受け取ることができる。 package main import ( "flag" "fmt" ) func main() { var hoge int flag.IntVar(&hoge, "hoge", 10, "hoge value") flag.Parse() fmt.Printf("hoge = %d\n", hoge) } $ go run sample_flag.go --hoge=1 hoge = 1 $ go run sample_flag.go hoge = 10 引数の種類が増えると煩雑になるし、管理も面倒だなーと思ったので、 楽ちんに書けるパッケージを書いてみた。 https://github.com/handlename/go-opts こんなふうに書ける。 package main import ( "fmt" "github.com/handlename/go-opts" ) type myOpts struct { Hoge int `flag:"hoge" default:"10" description:"hoge value"` } func main() { o := myOpts{} opts.

    Read more…
  • zshrcにwidget定義して2ストロークでghq list -> pecoで絞り込み する

    pecoとghqを組み合わせると便利やで〜 というはなしを聞いてはいたものの、まだ手を出していなかったので。 zshでzawを使っていて、gitのbranch切り替えとかは bindkey '^xb' zaw-git-branches みたいな感じでやっていたので、それに合わせてghqで管理しているディレクトリに飛べるようにした。 function _peco_ghq_list () { cd $(ghq list -p | peco) } zle -N _peco_list_ghq bindkey '^xg' _peco_ghq_list Ctrl-x g でcloneしたディレクトリ一覧が出て、選択すると移動できる。 便利。 参考 https://github.com/peco/peco https://github.com/zsh-users/zaw http://webtech-walker.com/archive/2014/06/peco-ghq-gh-open.html