handlename's blog

コード片など

emacsにマルチバイト文字を入力した時のエラー表示をどうにかする

emacsの設定を一からやり直してからか、 マルチバイト文字を入力した時に、 以下のようなエラーが表示されるようになってしまっていた。

These default coding systems were tried to encode text
in the buffer `AppVideoSuggestHint.pm':
  (undecided-unix (482 . 12354))
However, each of them encountered characters it couldn't encode:
  undecided-unix cannot encode these: ¤¢

Click on a character (or switch to this window by `C-x o'
and select the characters by RET) to jump to the place it appears,
where `C-u C-x =' will give information about it.

Select one of the safe coding systems listed below,
or cancel the writing with C-g and edit the buffer
   to remove or modify the problematic characters,
or specify any other coding system (and risk losing
   the problematic characters).

  euc-jp shift_jis iso-2022-jp euc-jis-2004 iso-2022-jp-2004 utf-8
  euc-kr gb2312 gb18030 gbk big5-hkscs hz-gb-2312 utf-7 utf-16
  utf-16be-with-signature utf-16le-with-signature utf-16be utf-16le
  japanese-shift-jis-2004 japanese-iso-7bit-1978-irv iso-2022-7bit
  utf-8-auto utf-8-with-signature eucjp-ms utf-8-hfs utf-8-nfd
  korean-cp949 japanese-cp932 utf-7-imap utf-8-emacs prefer-utf-8
続きを読む

goでJSONを比較したい場合

JSONでデータをやりとりするパッケージで、 得られるJSONが期待するものかどうかをテストするときにどうすればいいのか、という話。

ググってもこれといったものが見つけられなかったので interface{}な変数にjson.Unmarshalしてからreflect.DeepEqualしてみたら うまく動いていそうな感じだったのでここに記す。

実際に使う場合はどのキーの値が間違ってる、とか このキーが余計、とかがわかったほうが親切なんだけど、 それをやるとなるとreflect.DeepEqualじゃなくて 自分で再帰して比較する処理を書かないといけなそう。

http://play.golang.org/p/x_TtCRnHjv

以下はplaygroundと同じコードと出力。

続きを読む

#isucon 4にfujiwara組として参加しました

ISUCON4の予選にfujiwara組として参加したのでその感想です。

というメンバーでした。(アレッ一人浮いてる!)

まとめ

長いのでまとめを最初に書いておきます

  • 最終スコアは67782
  • アプリが激薄だったので、できるだけ外部(MySQLとか)への接続がなくなるよう変更を入れた
  • 静的ファイルの点数を捨てた
  • 無理せず普段から使い慣れているもの(Perl,Redis,MySQL)を使った
  • 少なくとも競技中に見えていたものについて、やるべきことは全てできた
  • ISUCONたのしい

以下時系列順でお送りします。 主に自分がやった変更を書いています。 誰がやったか覚えているものについてはカッコ書きで名前を書いてます。

fujiwaraさんとacidlemonさんの記事もあわせて読んでもらうのがといいかと。

続きを読む

atom から emacs に戻ったはなし

.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:" みたいなやつ) が出まくるのがうざい・・・。 シンタックスチェック用のコマンドを差し替えれば回避できそうなので もうちょっと調べてみる。

新しく追加したもの

theme

今まで1つずつ設定していたのを、ちゃんとthemeを使うようにした。 solarize-dark を使ってる。

editorconfig

プロジェクトごとにインデント設定が違ったりするので、 それに対応するために導入。

emacs-lisp-mode のインデントも一律になってしまうので、 このモードでは無効になるよう一部を書き換えている。

find-file-hook で毎回対応する全 mode のインデント設定を更新しているんだけど、 それはちょっといまいちな感じがする。 開いたファイルを見て、それ用の mode の設定だけを書き換えればいいんじゃ・・・?

なくなったもの

メジャーモードもろもろ

書かなくなった言語のものを削除。 PHP まったく書かなくなったなぁ。 Scala も勉強途中で放り出しちゃったなぁ。

cua-mode

24.4から追加された rectangle-mark-mode でなんとかしてみる。

あと、 string-rectangle の入力内容が リアルタイムに反映されたりしてちょっと便利になってるみたい。

smartchr

今のところ困ってない。

org-mode

標準パッケージだからなくなったわけではないけど、使わなくなった。

SublimeText に移行した時も思ったのだけど、 エディタ依存の形式を使っているとそれ以外が使えなくなってつらい。 (エディタ変えなければいい?引越が趣味なので!)

単なるアウトラインツールとして使うならそんなに問題はないけど、 タスク管理とかカレンダー連携とかしてるともう動けなくなる。

タスク管理は Todoist を、 メモは Markdown 形式を使うことにした。 (タスク化管理がサービス依存になってるけど、エディタの依存がなくなったのでよし)

atom で気に入らなかったところ

ターミナルからファイルを開くのが遅い

コマンドライン用のコマンドが用意されているので、

$ atom path/to/file

とすれば atom で開くことはできる。 が、開くまでが遅い。

Cmd-p から開けばいいじゃないってはなしかもしれないけど、 ターミナル上でいじってるファイルをすぐ編集したいのにいちいち

  • atom (の該当するウィンドウ) をアクティブにして
  • Cmd-p して
  • ファイル名を入れて

ってするのがめんどくさい。

複数ペインで同じファイルを開いているとまともに入力できない

これはバグっぽいけど。 カーソルがペイン間を行ったり来たりしてまともに入力できない。 同じファイルの別の場所を参照しながら書きたい場合に不便。

TreeView と編集中のファイルの連携がいまいち

たとえばこういうディレクトリ構成で、

hoge
 └ fuga
    └ piyo.txt

piyo.txt を開いている時に TreeView で hoge のファイル名を変更すると、 piyo.txt のパスが変わらない。

変わらないので piyo.txt を保存しようとすると hoge というディレクトリを作って新規ファイルとして保存されてしまう。 fuga を変更した時はちゃんと追従してくれるのに・・・。

emacs の dired はちゃんと追従してくれる。


エディタを行ったり来たりしていると、 いらない(なくてもなんとかなる)機能がはっきりしてきて掃除が捗る。

atom の気に入らないところは3つ上げたけどどれも将来的に対応されそうではある。 ほかは概ねいい感じだった。

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

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 参照。

なにがうれしいか

今後の展望

  • config.sample.json にしれっと書いてあるけどコード中では使ってない content-type 対応
  • 長めのレスポンスとか JSON とか(いちいちエスケープしないといけない) は設定ファイル中には書きにくいので、 別ファイルを参照できるように

余談

YAPC::Asia 2014 参加中の隙間時間で書いた。 ちょうど聞いてた @deeet さんのトーク がすごいタイムリーでためになった。

get-git-ignore というツールを書いた

  • go 1.3.1

なにか書き始めるとき、小さいものでもとりあえず git で管理するようにしている。 で、ちょっと大きくなると .gitignore ファイルを置く必要が出てくる。

このときいつも github/gitignore から 該当言語を探して raw の URL をたどってダウンロード、というのをやっていたのだけど、 いいかんげんめんどくさくなってきたので楽して取ってこれるツールを書いた。 go の練習も兼ねてる。

REAMEにあるように言語一覧のファイルを用意して設定を .zshrc に書くと、 こんな風にこんな風にインタラクティブに絞り込んで目的の言語の .gitignore を取ってくることができる。 peco 便利。

f:id:handlename:20140819211429g:plain

言語一覧ファイルの生成機能くらいはつけてもいいかなーと思ったりしてる。 言語一覧ファイルは不要になった。追記参照。

追記 2014-08-21

mattn さんに プルリク を頂いて、 .gitignore.list を用意する必要がなくなりました。

しれっとコマンド中のエラー処理とか、net/http のレスポンスの処理とかも 直してもらっててありがたや〜

追記 2014-08-22

ブコメで知りましたが、

などの便利ツール・サービスが有るようです。 便利な世の中だ。