emacsにマルチバイト文字を入力した時のエラー表示をどうにかする
- emacs 24.4.50.1
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組として参加したのでその感想です。
- fujiwaraさん(ISUCON1,2優勝/ISUCON3出題)
- acidlemonさん(ISUCON3出題)
- handlename(ISUCON3予選敗退)
というメンバーでした。(アレッ一人浮いてる!)
まとめ
長いのでまとめを最初に書いておきます
- 最終スコアは67782
- アプリが激薄だったので、できるだけ外部(MySQLとか)への接続がなくなるよう変更を入れた
- 静的ファイルの点数を捨てた
- 無理せず普段から使い慣れているもの(Perl,Redis,MySQL)を使った
- 少なくとも競技中に見えていたものについて、やるべきことは全てできた
- ISUCONたのしい
以下時系列順でお送りします。 主に自分がやった変更を書いています。 誰がやったか覚えているものについてはカッコ書きで名前を書いてます。
fujiwaraさんとacidlemonさんの記事もあわせて読んでもらうのがといいかと。
続きを読むatom から emacs に戻ったはなし
.emacs.d が事故で消えてからはや半年、 そのあいだ atom を使っていたのだけど物足りない感じがしてきたので 一から 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 される。
元ネタはこれ。
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.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 便利。
言語一覧ファイルの生成機能くらいはつけてもいいかなーと思ったりしてる。
追記 2014-08-21
mattn さんに
プルリク を頂いて、
.gitignore.list
を用意する必要がなくなりました。
しれっとコマンド中のエラー処理とか、net/http
のレスポンスの処理とかも
直してもらっててありがたや〜
追記 2014-08-22
ブコメで知りましたが、
などの便利ツール・サービスが有るようです。 便利な世の中だ。