handlename's blog

コード片など

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)
}

あ、あれ、コード長くなってる?? ま、まあ引数が多くなった時に定義と保存先をまとめて宣言できると便利なんじゃないかな・・・。

いまのところ自分が必要になった型しか実装してないので、 stringintfloat64bool しか受け取れない。 あと、テストがない。 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

http://atom.io/

運良くinvitationをゲットしたので軽く触ってみた感想。 atomで書きました!

  • 見た目はSublimeTextにそっくり
  • HTMLでできてるっぽい
    • 「Toggle Dev Tools」するとChromeのインスペクタみたいなのが出てくる
  • GUIの設定画面があるので取っ付きはよさそう
  • キーバインドの適用範囲設定が独特
    • CSSセレクタで適用範囲を設定する
    • body を指定すればエディタ全体に、.editor を指定すればエディタ部分のみに適用される
    • いちいち範囲を調べなくてはいけないので若干面倒
    • 編集モードごとにキーバインドを変えたいときはどうするんだろう?
    • 例えばこんな感じ
'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で開くコマンドが最初から使える
    • GitHub上の該当するファイルをコマンド一発で開ける
    • openとかblameとかhistoryとか
    • プライベートリポジトリは開けない?
  • コマンドパレットから
    • emacsのM-xみたいな感じ
    • SublimeTextはこれができなかったのでだいぶ不便だった
    • helm-M-xみたいにキーバインドも表示される
      • 使い方を勉強するのに便利

プラグインにはまだ触っていないので今度試してみる。

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-wM-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 本戦に(スタッフとして)参加してきました

今回の成果↓

f:id:handlename:20131109115826j:plain

(参加してきましたエントリにちょこちょこ登場しててうれしい)

予選でなすすべなく敗退したので、本戦では問題アプリの言語移植と、テスト回答、当日運営のお手伝いをしていました。

移植

@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選抜チームはさすがです。

おわり

次回(があれば)自力で本戦にでたい。

f:id:handlename:20131109163923j:plain