go-opts というパッケージを書いた
- go 1.3.1
go 言語でコマンドライン引数を受け取る場合、 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
引数の種類が増えると煩雑になるし、管理も面倒だなーと思ったので、 楽ちんに書けるパッケージを書いてみた。
こんなふうに書ける。
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.Parse(&o) fmt.Printf("hoge = %d\n", o.Hoge) }
あ、あれ、コード長くなってる?? ま、まあ引数が多くなった時に定義と保存先をまとめて宣言できると便利なんじゃないかな・・・。
いまのところ自分が必要になった型しか実装してないので、
string
、 int
、 float64
、 bool
しか受け取れない。
あと、テストがない。 flag
パッケージのテストを読んでみよう。
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したディレクトリ一覧が出て、選択すると移動できる。
便利。
参考
GitHubのatomをちょろっと触ってみた感想
atom: 0.60.0
運良くinvitationをゲットしたので軽く触ってみた感想。 atomで書きました!
- 見た目はSublimeTextにそっくり
- HTMLでできてるっぽい
- 「Toggle Dev Tools」するとChromeのインスペクタみたいなのが出てくる
- GUIの設定画面があるので取っ付きはよさそう
- キーバインドの適用範囲設定が独特
'body': 'ctrl-g': 'core:cancel' '.editor': 'ctrl-g': 'core:cancel' 'ctrl-m': 'editor:newline' 'ctrl-i': 'editor:indent' 'ctrl-v': 'core:page-down' 'cmd-v': 'core:page-up' 'ctrl-y': 'core:paste'
- emacsのmarkにあたるものはデフォルトではなさそう
- ディレクトリを開くとプロジェクトとして扱われる
cmd+t
でプロジェクト内のファイルをインクリメンタルに絞り込むことができる
- 日本語も問題なく入力できる
- SublimeTextはこれができなくて離脱した
- GitHubで開くコマンドが最初から使える
- コマンドパレットから
プラグインにはまだ触っていないので今度試してみる。
mykie.elが便利
mykie.el が便利だったのでいくつか設定してみた。
(require 'mykie) (setq mykie:use-major-mode-key-override t) (mykie:initialize) (mykie:global-set-key "C-w" :default '(kill-region (line-beginning-position) (line-end-position)) :region 'kill-region) (mykie:global-set-key "M-w" :default '(kill-ring-save (line-beginning-position) (line-end-position)) :region 'kill-ring-save) (mykie:define-key-with-self-key "a" :region 'align :region&C-u 'align-regexp) (mykie:define-key-with-self-key "i" :region 'indent-region) (mykie:define-key-with-self-key "s" :region 'sort-lines) (mykie:define-key-with-self-key "u" :region '(call-process-region (region-beginning) (region-end) "uniq" t t))
C-w
と M-w
の挙動はSublimeTextから輸入。
捗りそう。
蛇足
mykie:define-key-with-self-key
がmultiple-cursors-modeと干渉する。
(setq mykie:minor-mode-ignore-list '(multiple-cursors-mode))
ではだめっぽい。ふむ。
追記 2014-01-08
mykie.el作者の id:dbq さんにコメント頂きました。 以下のコードをinit.elに追記するとmultiple-cursorsとも問題なく併用出来ました。 https://gist.github.com/yuutayamada/8304923
追記ここまで
ST2のマーク機能を有効活用する
- Sublite Text 2.0.2
emacsから乗り換えたので、マークをもっと活用したい欲がある。
run_multiple_command 的なものを定義して、 マーク+(何かしら操作)を簡単にできるようにした。
- マークからキャッレットまでをコピー
- マークからキャッレットまでをカット
- マークからキャレットまでをコメントアウト
- マークからキャレットまでを整列 (要Alignment)
設定は以下。
{ "keys": ["ctrl+x", "super+c"], "command": "run_multiple_commands", "args": { "commands": [ { "command": "select_to_mark" }, { "command": "copy" } ] } }, { "keys": ["ctrl+x", "super+x"], "command": "run_multiple_commands", "args": { "commands": [ { "command": "select_to_mark" }, { "command": "cut" } ] } }, { "keys": ["ctrl+x", "super+forward_slash"], "command": "run_multiple_commands", "args": { "commands": [ { "command": "select_to_mark" }, { "command": "toggle_comment", "args": { "block": false } } ] } }, { "keys": ["ctrl+x", "super+a"], "command": "run_multiple_commands", "args": { "commands": [ { "command": "select_to_mark" }, { "command": "alignment" } // needs plugin - alignment ] } },
そこそこ捗る。
行は行番号の隣に●マークがつくのでわかるが、
何文字目なのかはわからないのでそこを何とかしたい。
emacsの (setq-default transient-mark-mode t)
みたいな感じに
マークからキャレットまでをhighlightすることはできないだろか。
scalaでirc botを書く場合
Javaのライブラリを使うのがらくちんみたいだ。 PircBotを使う場合はこんな感じ。
package com.example.IRCBot import org.jibble.pircbot._ class Bot() extends PircBot { override def onMessage( channel: String, sender: String, login: String, host: String, message: String) { message match { case m if m.startsWith(this.getName) => this.sendMessage("hi") case _ => } } } object SimpleBotApp extends App { val bot = new Bot() bot.setName("echo-bot") bot.setEncoding("utf-8") bot.connect("irc.example.com", 6667) bot.joinChannel("#hoge") }
#ISUCON 3 本戦に(スタッフとして)参加してきました
今回の成果↓
(参加してきましたエントリにちょこちょこ登場しててうれしい)
予選でなすすべなく敗退したので、本戦では問題アプリの言語移植と、テスト回答、当日運営のお手伝いをしていました。
移植
@fujiwaraさんが作ったperlのリファレンスアプリをnodejsに移植するというのを担当したのですが、 mysqlのユーザー指定が空になっている(オブジェクトのキーが間違っていた…!)ことを本戦中に指摘されてしまいました…。 nodejsで挑戦していたチームの方々ごめんなさい。
いちおう言い訳をしておくと、 nodejsのmysqlモジュールは、ユーザー名の指定がない場合はrootとしてつなぎに行くようになっていて、 検証中(=サーバー1台)では問題なく動作してしまっていたのです。 サーバーを増やすとrootでは外からつなぐことができないので正常動作しないという…。 すべての言語のアプリをがっつりテスト解答することは、 時間と人手が足りない中ではなかなか厳しい物があったのですが、もう少し慎重になるべきだったと反省しています。 なんせ賞金100万がかかってますし。
テスト回答
本戦前日に、おなじく出題手伝いをしていた@mix3さんと perlのアプリを使って本番サーバーでテスト回答を行いました。 大事なことなので二回言われていた「初期画像を消したらゲームオーバー」にバッチリハマったりしながら、 ひたすら画像変換の最適化をしつつアプリケーションサーバー1台/workload=2で 17000弱のスコアが出るところまでいってその日は時間切れ。
memcachedを5台すべてで動かして、画像のuidでシャーディングする、という戦法でした。 memcachedの1アイテム1Mb制限(と、Cache::Memcached::Fastのmax_sizeのデフォルト1Mb制限) に引っかかって時間を食っていなければアプリ4/DB1くらいにして 複数台で走らせるところまでいけたんじゃないかなぁ…。
当日のお手伝い
出発予定時刻の5分前に目が覚めて、慌てて会場に向かったらなんとか間に合った組。 会場をうろうろしてルールの質問に答えたり、レゴでISUCONロゴ作ったりしてました。
中盤以降はほとんど質問も無くなったので、スタッフ控室で問題アプリのScala移植でもしてみようかなーと思っていたら 隣の@m0t0k1ch1くんが全く同じことをやっていたので完成したら見せてもらうことにしました。Scala書けるようになりたい。 代わりに ST2のセットアップ が捗りました。
LINE選抜チームが4万点台を叩きだした時には会場がざわめいてましたねー。 1分半遅れでカヤック選抜チームも惜しかった! 寿司おごってもらいたかった!
最終計測では再起動後のベンチマークでFAILして脱落していくチームをどきどきしながら見てました。 勝負の世界はきびしいなーと。 トップスコアを維持しつつ最後までベンチを完走したLINE選抜チームはさすがです。
おわり
次回(があれば)自力で本戦にでたい。