ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

#初めてのArduino ワークショップ#00というイベントをやった

どうもマコピーです。ページャnightの話は皆さん書かれると思うので良いかなと思いました。あとGoとかleveldb使って特化したDBつくるというソリューションはいいのでは。言いたかったのはそれぐらい。

さてページャnightの翌日にArduino初心者向けのワークショップを開いてみたのでそのご報告です。
初めてのArduinoワークショップ #00 - connpass
見学のかたも含めて7人ほど来てくださって良い会が出来たかなと思った次第です。今度はもくもく会をやるという話もあるのでその時はお知らせしますね。
使った資料は以下のものになります。

あとこれのmarkdown版をgistに貼っているのでそれもご活用ください。画像とかはないのでそれはスライドの方で。

あとリンクはreveal.jsをphantomjsで開いてPDFに変換したのでリンク情報がなくなってしまっているのでそれはgistの方で。

あとこれをやった後に「PCからLEDを消したりつけたりすることは出来ますか?」という質問があったので、それをシリアル通信でやるコードをその場で書いて見せたりもしました。こちらです。


話題に出た部品

LCD Keypad Shield For Arduino: ディスプレイ関連 秋月電子通商 電子部品 ネット通販
参考: Arduino用液晶シールド LCD Keypad Shields by ボクにもわかる地上デジタル

XBeeWi−Fi(S6B)モジュール(PCBアンテナタイプ): 無線、高周波関連商品 秋月電子通商 電子部品 ネット通販

  • 赤外線LED

5mm赤外線LED OSI5FU5111C−40 (5個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

  • 赤外線リモコン受信モジュール

赤外線リモコン受信モジュール GP1UXC41QS: センサ一般 秋月電子通商 電子部品 ネット通販
参考: 橋本商会 » ArduinoとRubyで赤外線リモコン作ってWebから操作できるようにした

CDSセル 5mmタイプ: パーツ一般 秋月電子通商 電子部品 ネット通販
参考: The Strange Storage: ArduinoとCdSセルで遊ぶ

  • Grove System

Grove - スイッチサイエンス

とまあそんな感じです。こういう会を開いて皆さんにArduinoとかハードウェアに興味持って貰えたらなと思います。
あとYAPCで関連するトークを応募しているのではてブとかしていただけたら大変助かります。

Perl meets Real World 〜ハードウェアと恋に落ちるPerlの使い方〜 - YAPC::Asia Tokyo 2014

vultrでstartup scriptが追加されていたので使ってみた

どうもマコピーです。ちなみにVULTR布教活動しておりますが、わたくしには一銭も入ってきません。

さて、久しぶりにVULTR見に行ったらスナップショットとスタートアップスクリプトなる項目が追加されていて、スナップショットはその名の通り動いているインスタンスのイメージを保存して再利用するやつですが、スタートアップスクリプトとはみたいなことを思っていたらVULTRの弱点を補う機能だったので紹介させていただきます。

startup scriptとは

My Servesの「My Startup Scripts」から行けるんですけれど、リンクはこちら
そこにはこう書かれていて

Startup scripts are run by the VPS the very first time it starts up.
- The startup script is saved to /tmp/firstboot.exec
- Output produced can be found in /tmp/firstboot.log
- Scripts are executed using /bin/bash (Linux), /bin/sh (FreeBSD), or cmd.exe (Windows)

初回起動のときに一度だけ実行するスクリプトを登録できるよということですね。Windowsの場合も使えるっぽくて便利。
なおスクリプトやログは/tmpに入るのでディスクの構成によっては再起動すると消えてしまう場合があるので注意です。Ubuntu 14.04のイメージだと2度目には無くなってしまいます。

使い方

Startup Scriptsのページを開いていただいて、Add Startup Scriptsを押していただくと以下の様なページになります。
f:id:mackee_w:20140629190155p:plain
Nameのところに適当な名前を入れて、Scriptのところにはシェルスクリプトを実行するだけの簡単な画面です。
例としてはじめから公開鍵をrootのauthorized_keysに埋め込むスクリプトが書かれています。
echo のあとの部分を少し変えて自分の公開鍵を入れるとそれだけで使えるスクリプトになります。

VULTRは使われている方はご存知かもしれませんが、公式イメージを立ち上げるとランダムでパスワードが設定されてそれでログインしろという仕組みなのですが、sshのパスワードログインはsshコマンドの引数で設定できないので自動化する上ではかなり難儀です。
そこでこのスクリプトを使って鍵を埋め込むことが出来るわけですね。

起動する

deployの画面からプランなどを選択して一番最後のStartup Scriptで選んで起動するだけです。
f:id:mackee_w:20140629190702p:plain
これはこれで便利なのですが、先ほど拙作のgo-vultrを更新しまして、そこからも使えるようにしました。
まずスクリプトを登録した後に、以下の様なコマンドを使って確認します。

$ vultr startupscript
2014/06/29 19:08:44 endpoint: https://api.vultr.com/
2014/06/29 19:08:45 200 OK
{
    "169": {
        "SCRIPTID": "169",
        "date_created": "2014-06-29 04:20:58",
        "date_modified": "2014-06-29 04:20:58",
        "name": "public key",
        "script": "#!\/bin\/sh\nmkdir -p \/root\/.ssh\nchmod 700 \/root\/.ssh\necho \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGnDdHjsZ6oQLcKrzZ2c2UVkzGMpZ6zEa+GYZzASL\/v3A8pX5i7VJ8Hz0OF6j60C4SYNXeqPbWb+c1ajs7201tylabncosbumd47IoNTtnQZUPSaTue6OiSQF1eIWzjW89Rs+C7kzNadPlSVBRQP0JcMno7VRJDFCwMRg1uwROD+9agK+r0xsTG6JClSaBY\/lICUzRy6UFsgO2loiaknmQ1qAMrGFrGn6k4LljRn5fEoUKd9BXuf3ST10akN0nYQ9iimtIrdu+9Se3YCts3cknK9zTFzx8I1yadWArCcloTRtmhvfYgWtWCgU6yfqKvV7LYEoF55F5uy8AeukdMyzh\" > \/root\/.ssh\/authorized_keys\nchmod 600 \/root\/.ssh\/authorized_keys"
    }
}

で、この169っていうのをメモっておいて、インスタンスをつくるときに使います。
以下のようにscriptidで番号を渡してやるとそれを使って起動します。

$ vultr create --osid 160 --dcid 25 --vpsplanid 31 --scriptid 169

あとはvultr listでIPアドレスを引っ張ってきて鍵を使ってログインするだけ。だいぶ簡単ですね。
なお、sshのパスワードログインは無効化されていないのでそれが嫌だという方は手動でオフにするなり、スタートアップスクリプト内で無効化するなりすれば良いと思います。

他の応用例

やってないですけれど以下の様な応用ができると思います。

  • 一般ユーザを使っておいてrootはログインできないようにする
  • よく使うパッケージのインストール(vimとかgitとか)
  • Dockerを入れて母艦にする
  • ……以上のようなことをやるansibleやchefのレシピの実行

たぶん使い捨てサーバの場合が多いと思うのでconfigspecを使ってもいいと思いますね。

そんなわけで試してみたらVULTRでライフチェンジングな機能だったので紹介してみました。

kuiperbeltのベンチマーク

golang大好きです、マコピーです。

昨日書いたkuiperbeltですが少しいじりまして、リファクタしたりComet部分を別のファイルに追い出したりしていました。
大きいのはコマンドをekboっていう名前に変えたことでしょうか。その際のディレクトリ構造はpecoを参考にしています。
あと、切断検知を入れました。今まではコネクションをクライアントがわから切ってもUUIDが残っちゃうという致命的な問題があったのでそれを検知してUUIDを消すのをしています。

さて、グループ機能はないですけれどここらでベンチでも取ろうかなという気になったのでやってみます。
初めは手元のMacbookAirでやってたんですけれどkuperbelt側とベンチ側でリソース食い合っちゃってあんまりよろしくなかったのでvultr上のインスタンス2台でやってみました。

準備

拙作のgo-vultrで立てていきます。

kuiperbelt側

1 core, 768MB memory, 15GB SSDインスタンスubuntuで東京リージョンに立てます。

$ vultr create --osid 160 --dcid 25 --vpsplanid 31

ログイン後、aptでgoを導入してkuiperbeltをgo get

# apt-get update
# apt-get install golang
# export GOPATH=$HOME
# export PATH=$HOME/src:$PATH
# go get github.com/mackee/kuiperbelt
# go install github.com/mackee/kuperbelt/cmd/ekbo

あとは立ち上げてこちらは放置

# ekbo
2014/06/22 12:07:11 Kuiperbelt start listen and serve on 8080

負荷をかける側

クライアント接続用のcurlベンチマークツールwrkを導入します。
kuiperbelt側と同じスペックでwrkを実行するとメモリが足りなくて怒られるので2 core, 2GB memory, 40GB SSDインスタンスで立てます。

$ vultr create --osid 160 --dcid 25 --vpsplanid 8

ログイン後、aptでbuild-essentialやopensslを入れます(この辺り曖昧

# apt-get update
# apt-get install build-essential libssl-dev

wrkをcloneしてきてbuild

# git clone github.com/wg/wrk src/github.com/wg/wrk
# cd src/github.com/wg/wrk
# make
# mkdir ~/bin
# mv wrk ~/bin
# export PATH=$HOME/src:$PATH

あと、wrkはPOSTでリクエストするにはluaで設定を書かなければならないっぽいので以下のスクリプトをどっかにおいておく。この例では~/work/wrk.luaに保存

wrk.method = "POST"
wrk.body   = "{\"ping\":1}"
wrk.headers["Content-Type"] = "application/json"

ベンチマーク

負荷をかける側でクライアントをconnect
ここではkuiperbelt側のホスト名をkuiperbeltにします。実際のベンチはそれぞれのIPアドレスを直接指定して行いました。結果は/dev/nullに捨てるという感じで。

# curl --silent http://kuiperbelt:8080/connect > /dev/null

これとは別のシェルでwrkで負荷をかけます
この例では8スレッド400接続30秒間でかけます

# wrk -t8 -c400 -d30s -s work/wrk.lua http://kuiperbelt:8080/broadcast

複数コネクションを張る時は以下の様な感じにしたけれど、なんかもっといけているツールがあれば教えて欲しいです

# wrk -t1 -c2 -d1m --timeout 1m http://kuiperbelt:8080/connect

結果

各生データはこちら
https://gist.github.com/mackee/3d135cee3894afa05682

グラフにすると
f:id:mackee_w:20140622233129p:plain
縦軸がreq/sec、横軸が接続数です。

きれいな双曲線になっていてまあそうだよな〜という感じです。
ちなみに1000コネクション時はtimeoutが発生しているのでグラフには載せませんでした。この規模になってくるとマルチコア使うとか台数並べるとかそういう施策が必要そうです。

まとめ

たぶん普通に使う分には大丈夫だけれど大規模環境レベルになると厳しそう。
あと1対1の/sendを使う場合は128 connection時と1000 connection時で性能劣化が見られなかったのでまあそういうアーキテクチャということです。
それとキューに溜まりすぎて送りきれてない説があるのではあどないしようという感じです。

#hachiojipm 41に参加してきたのとKuiperbeltという物を書いた

はい、老害がんばろう、マコピーです。

hachioji.pm #41に参加してきました。
皆さんお元気そうで何よりでした。

あ、あとその直前に行った八王子のヘヤニワというフリースペース(?)が良かった。人工芝が敷かれたところで寝転がったりクッションに座ったりして作業などが出来る。プロジェクターもある。値段も手軽で、唯一何点としては場所が分かりにくいこと。駅チカなのでお勧めです。持ち込み自由だし。

閑話休題。以下のようなプログラムをでっちあげて発表しました。

まあなんつうかというと、PerlでAnyEventつかってCometを実装するのがたるかったのでそこだけGoで書いたという次第です。TODOに書いていること以外にもまだまだやることいっぱいあるけれど(つないでいるコネクションリストとか、テストとか)、なんか意外と使えそうです。
Goの流儀みたいなのがまだよくわかっていないのでこれでパフォーマンス出るかとかは要検証ですが、覗いてみてください。
あとエンドポイントとか起動方法とかは変わる予定。ekbo --protocol Cometとかで起動したい。

他の方だとあずまさん(@)が書かれたVZnopeや、
cpp-HSDSが面白そうでした。
参考: hachiojipm 41 で老害っぷりを発揮してきた | All Your Bugs Are Belong To Ass

本日のハイライト

go-vultrというのを書いた

はい梅雨きらいです、マコピーです

結構前から作っていたんですけれど、最近公開していてそれを放置していたのでちょっと紹介させていただきます。

mackee/go-vultr · GitHub

何をやるもの?

vultr というVPSサービスがございます。詳細に関しては以下の記事を参照していただきたく。

新しいVPSのVULTR、東京リージョンはじまった - uzullaがブログ

そんでもって、こいつはDigitalOceanのようにインスタンスを立てたり消したり操作するAPIがあるのですが、それをコマンドから立たけるようにしたのがgo-vultrです。

インストール方法

# あらかじめgoは入れておいてください
$ go get github.com/mackee/go-vultr
$ go install github.com/mackee/go-vultr/vultr

依存にもろもろ入っているので、それは適宜入れると良い。

使い方

vultrに登録後にhttps://my.vultr.com/settings/にアクセスしていただき、ログインしてから下の方にずーっと行くと、Your API Keyというやつがあるのでソレをコピっておきます。
f:id:mackee_w:20140607153339p:plain

で、おもむろにコマンドを叩きます。gocode/binとかにパスは通しておいてね><

$ vultr list
your api key(https://my.vultr.com/settings API Information):********(さっきコピっておいたAPI Key)
2014/06/07 17:20:49 endpoint: https://api.vultr.com/
2014/06/07 17:20:50 200 OK
[]

持っているインスタンスがないのでこんなかんじです。これで正常です。
で、このあと皆さん課金して頂けましたら(課金しなくても今は$10つかえるらしいですよ!!!)とりあえずインスタンス立ててみましょう。

$ vultr os
...

とやると使えるOSのリストがだらだらーってJSONではかれるわけですが多すぎるので何がなんだかわかりません。なのでjqを使って探してみます。

$ vultr os | jq '. | to_entries | map(select(.value.family == "ubuntu" and .value.arch == "x64"))'
2014/06/07 17:29:28 endpoint: https://api.vultr.com/
2014/06/07 17:29:29 200 OK
[
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 12.04 x64"
    },
    "key": "128"
  },
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 12.10 x64"
    },
    "key": "129"
  },
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 13.10 x64"
    },
    "key": "131"
  },
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 14.04 x64"
    },
    "key": "160"
  }
]

vultrのAPIは{ "なんかのID" : {...} }みたいなあんまり見ない形式なのでto_entriesでゴニョってやる必要があります。
というわけでubuntuかつx64のOSを探してきました。
最新版を使いたいのでUbuntu 14.04 x64のkeyのIDである"160"をメモっておきます

次はリージョン

$ vultr regions | jq '. | to_entries | map(select(.value.name == "Tokyo"))'
2014/06/07 17:32:26 endpoint: https://api.vultr.com/
2014/06/07 17:32:27 200 OK
[
  {
    "value": {
      "state": "",
      "continent": "Asia",
      "country": "JP",
      "name": "Tokyo"
    },
    "key": "25"
  }
]

やっぱ近い所が良いのでTokyoですね! これも"25"をメモっておきます

最後にVPSプランです。インスタンスの性能とかですね

$ vultr plans | jq '. | to_entries | map(select(.value.price_per_month == "5.00" and .value.ram == "768" and .value.bandwidth == "0.10"))'
2014/06/07 17:34:34 endpoint: https://api.vultr.com/
2014/06/07 17:34:35 200 OK
[
  {
    "value": {
      "windows": false,
      "price_per_month": "5.00",
      "bandwidth_gb": "102.4",
      "bandwidth": "0.10",
      "disk": "15",
      "ram": "768",
      "vcpu_count": "1",
      "name": "768 MB RAM,15 GB SSD,0.10 TB BW"
    },
    "key": "31"
  },
  {
    "value": {
      "windows": false,
      "price_per_month": "5.00",
      "bandwidth_gb": "102.4",
      "bandwidth": "0.10",
      "disk": "15",
      "ram": "768",
      "vcpu_count": "1",
      "name": "768 MB RAM,15 GB SSD,0.10 TB BW, Custom ISO"
    },
    "key": "52"
  }
]

一番安いやつ(月額あたり$5)かつメモリが768MBで帯域が0.10Tのやつを出してきています。Tokyoリージョンは0.10Tのしか使えないっぽいのでこういう条件です。
今回はCustomISOではないので"31"をメモ。

さて、準備が整ったので起動します!

$ vultr create --osid 160 --dcid 25 --vpsplanid 31
2014/06/07 17:38:42 endpoint: https://api.vultr.com/
2014/06/07 17:38:43 200 OK
{
    "SUBID": *******
}

こんなのが出ます。で、ココで先ほどのlistコマンドを打つと

$ vultr list
2014/06/07 17:39:34 endpoint: https://api.vultr.com/
2014/06/07 17:39:35 200 OK
{
    "******": {
        "os": "Ubuntu 14.04 x64",
        "ram": "768 MB",
        "disk": "Virtual 15 GB",
        "main_ip": "********",
        "vcpu_count": "1",
        "location": "Tokyo",
        "default_password": "********",
        "date_created": "2014-06-07 04:38:43",
        "pending_charges": "0.01",
        "status": "active",
        "cost_per_month": "5.00",
        "current_bandwidth_gb": 0,
        "allowed_bandwidth_gb": "100",
        "netmask_v4": "255.255.255.0",
        "gateway_v4": "****",
        "power_status": "running",
        "VPSPLANID": "31"
    }
}

という感じで出てくるわけですね〜。
vultrだいぶ男気溢れる感じでpublic keyを登録する感じではなくなんかrootのデフォルトパスワードを発行するからこれでどうにかしろという感じなので、それで入ります。

で、使い終わったら

$ vultr destroy *****(vultrのlistのキーになっている数字)

インスタンスを落とすことが出来ます。

あとvultr sshというコマンドもあるのですが、こいつは挙動不審なのでExperimentalです。試さないでください

以上VPSライフでした! 次の記事はスナップショット機能とかCustomISOを使った話をします!

#yokohamapm は明日ですよというリマインドと

ども、マコピーです。Yokohama.pm 副リーダーをやっております。

Yokohama.pm #11 : ATND

リマインドですけれど、明日なんでね、皆さん要チェケラです。
補欠だった方も何人か繰り上がっているので確認しておいて損はないと思います。

以下余談。
あと以下の記述は僕の所属している団体には全く関係ございませんので、ご了承ください。僕自身の考えです。

今、pmがアツイという話。

Gotanda.pm #1 告知までにやったこと - 時計を壊せ

というエントリを見ての便乗エントリです。
Gotanda.pmもそうですが、Yokohama.pm、人数が溢れております。まあそれだけニーズが有るということなのかなと思っており、こういうイベントは皆さんガンガン開催しても損はないと思います。
Perlコミュニティに元からいるからその宣伝効果でしょう?」みたいなことを思われる方もいるかと思います。でも開催したいという方は僕に相談してください。宣伝しますし、行きますし、人も呼びます。

Yokohama.pmをやるモチベーション

もともとYokohama.pmという勉強会があり、これはもともと1年に1回程度の頻度で行われていたのと、@yusukebeさんが引き継いで、さらに僕もそこに乗っかることで3ヶ月に1度にやるみたいな感じに今はなっております。というか明日やって初めてその3ヶ月ごとになったって言える感じですね。

で、これはよく聞かれるんですが、「なんでお金ももらえないのに勉強会の開催なんてするのか」という質問の回答です。

正直に言うと半分弱は会社の宣伝です。今僕が働いている会社は面白法人とかいうやつで、今回ライブコーディングをやっていただく@songmuさんも同じ会社の先輩です。ですが、まあ以下のエントリのとおりです。
退職とFA宣言のお知らせ | おそらくはそれさえも平凡な日々
この記事に書かれている通り、弊社は絶賛サーバサイドエンジニアを募集しており、さらに今は横浜にオフィスがあるので、その近くで勉強会やったら興味持ってもらって〜っていう流れが作れるのかなとか思っております。
HTMLファイ部 新メンバー募集 | jsdo.it
こんなかんじでHTMLファイ部のメンバーも募集しているみたいですが、技術部も絶賛募集中でございます。毎日fujiwaramonitoring casualを体験したい方もぜひ。
fujiwaramonitoring 開催を希望する声 - Togetterまとめ

で、後の半分は雑多な何かです。内訳は、

  • ビール飲みたい
  • 司会業してみたい
  • 勉強会開催して持ち上げられたい
  • もっとPerlのことを知りたい
  • Perlのことを知ってもらいたい
  • 勉強会でいろいろ試行錯誤してみたい

という感じでございます。仕事上Perlをガッツリ書く人間ですので、飯のネタにもなって一石二鳥というわけです。学びがある。

趣向を毎回変える

「勉強会でいろいろ試行錯誤してみたい」というところに通じるのですが、前回は金曜日の夜にやったYokohama.pmですが今回は計画段階から土日にやりたいというのは決まっておりました。
Gotanda.pmは土日を避けると言われていますがあえて土日に今回やるのかという理由は「参加者層を変えるため」です。
世の中いろんな人がいて、その中には平日夜の勉強会に来れるけれど土日は無理という方やその逆の方もいます。
そんでもって僕はこの勉強会で何がしたいかというと、色んな種類、いろんな人としゃべくりたい、コミュニケーションとりたいので、そこは万遍なく行こうという感じです。
なので、テーマや形式(LTとかそういうの)も固定化せず結構流動的にやっていきたいです。

このあたりはhachioji.pmに影響されたところがでかいです。というのもHachioji.pmに行くと「固定メンバー+初めての人」という人数構成が大体あって、固定メンバーで安定感を出しつつかというって初めての人が来れるコミュニティみたいな流動性もあって、そういうのいいよな〜って思っています。
Yokohama.pmの今回の参加者リスト見ると内輪感高いみたいなのを思われるかもしれません。でも、そんなことはなくて、なんでかというと内輪感高い人達はたいていHachioji.pmの人だからです。
あと、運営としては内輪的なのをガンガンぶっ壊していくという感じです。前回、IRKitの@maaashさんに喋っていただいたのも結構そういう部分がでかいです。
もちろんいつも来ている人も重要なので「いつも行っているから今回は遠慮しようかな」という考えは決して起こさないでくださいw ガンガン来てください。ガンガン来てしゃべくってください。各位よろしくお願いします。

そんなわけで

たぶんイベント、結構テーマというか、モットーというか、信念を持ってやるというのがそこそこ重要で、Perlもそのモットー(TIMTOWTDI)があるからこそ、今までやってこれたわけで、そういうわけなので一応僕なりのモットーをここで披露しておくかという話でした。

以上です。

sublime text3の環境を整えた

はいそろそろ夏、マコピーです。

きっかけ

最近Golangを書くことがあって、それを普段使っているvimで書こうとするとなかなか重い(補完あたりが悪さをしているっぽい)ので、この際だし深追いせずにGoを書く時はSublime Text3にしようかなと思い立ちました。

あとここ1年ぐらいはMacVim-Kaoriyaを使っていてコンソールのvimを使っていなかったのでGUIしかないSublimeであっても違和感がないかなーっていうのも理由の一つ。

インストール

homebrew-caskで入れました

$ brew cask install sublime-text3

参考:
みんなhomebrew-caskって知ってるか? - Qiita
2013年度 MacbookAirクリーンインストール祭 - パルカワ2

ちなみにひさいちはさっきMacbook Airにビールを飲ませたらしく、環境構築に関してはこれあるから大丈夫そうだけれど、まあがんばってほしいと思いました。

まあTimeMachineのバックアップあるらしいけれど

Vim化する

Vim化するには以下の記事を参考にしました。
VimからSublime Text 3に移行してみた - norinyang メガ進化!
僕の使う大体の機能はだいたいこれでOK

あとOSのクリップボード共有なんですが、以下の設定で出来ました。

{
    	"vintage_use_clipboard": true,
	"vintageous_use_sys_clipboard": true
}

vintageousも使っているとvintageous_use_sys_clipboardも設定しないといけないので、vintage_use_clipboardだけやってなんで変わらないの????ってなってハマっていました。

よく使っているVimPluginの機能をSublimeでも使えるようにする

  • textobj-indent

textobj-indetはテキストオブジェクトを拡張してインデント単位でいろんなことを実行できるVimPluginです。
僕がよく使うのは"v"+"a"+"i"のストロークで同じインデント量の範囲を選択して、そのあと:を押して同じインデント料の範囲内だけで置換するとか、とか後述のtextmanipを使ってブロックを移動させたいとか、そういうときに使います。

で、sublimeでこれをどうやるかというといろいろ調べたんですけれど、Command+Shift+jでインデント単位で選択出来るらしく、
SublimeText2 - Sublime Text2 のショートカット一覧 - Qiita
これをKey Bindings - Userで調べると以下の様な感じで設定してありました。

{
    { "keys": ["super+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} },
}

これをKey Bindings - Userの方にコピペして以下のように書き換えました。

{
    // textobj-indent.vim like selection
    {
        "keys": ["v", "a", "i"],
        "command": "expand_selection",
        "args": {"to": "indentation"},
    },
}

これでインデント単位の選択がv+a+iで出来るようになりました

  • textmanip.vim

僕はtextmanip.vimというプラグインを使っていて、特に選択範囲ごと上下左右に移動するという機能を使っています。
どういうプラグインかは以下の記事や上のツイートを見ていただければ。
Vim-users.jp - Hack #223: テキストを直感的に移動、複製する
僕は.vimrcに以下の様な設定を書いてtextmanipを利用しています。

xmap <C-j> <Plug>(textmanip-move-down)
xmap <C-k> <Plug>(textmanip-move-up)
xmap <C-h> <Plug>(textmanip-move-left)
xmap <C-l> <Plug>(textmanip-move-right)

で、選択範囲単位でどうやって移動するのかなと思って調べると、これもsublimeの機能として実現できるっぽいので、以下の様な設定をKey Bindingsに書きました。

{
    // textmanip.vim like
    {
        "keys": ["ctrl+k"],
        "command": "swap_line_up",
    },
    {
        "keys": ["ctrl+j"],
        "command": "swap_line_down",
    },
    {
        "keys": ["ctrl+h"],
        "command": "unindent",
    },
    {
        "keys": ["ctrl+l"],
        "command": "indent",
    },
}

左右移動は思えばただのインデントですね。こんなかんじです。

  • tagジャンプ

ctagsのtagファイルを使ったタグジャンプも頻繁に使っています。
Vim でタグジャンプを使ってみる - Archiva
これはSublime Text3からの機能らしいgoto_definitionで実現できそうです。

    // vim ctags jump like
    { "keys": ["ctrl+]"], "command": "goto_definition" },
    { "keys": ["ctrl+t"], "command": "jump_back" },

だいたいこの2つしか使っていないのでこれで大丈夫っぽいです。

今のところやったのはこのぐらいです。
あとはGoSublimeを入れて終わりかなという感じです。
DisposaBoy/GoSublime · GitHub

ためしに仕事のPerlのプロジェクトを開いてみてタグジャンプなどをしてみたところ思いのほか便利で、Perlのほうでも乗り換えられるのでは??という気分がしております。僕がそんなにVimを使いこなしていないせいもあるかもしれませんが……。

とりあえずこれでGolangを書いてみたいと思います。

追記: ctrl + aで数値インクリメント/ctrl + xでデクリメント

vimにあるctrl+aでインクリメントするやつ出来ないの?と言われて確かに使うなーって思って調べて設定してみました。
以下のプラグインを使えば出来そうです。
rmaksim/Sublime-Text-2-Inc-Dec-Value · GitHub
Package ControlでInc-Dec-Valueで出てくるので選択してインストール。
同じキーバインドにするには以下を設定する。

    // vim like inc/dec
    { "keys": ["ctrl+a"], "command": "inc_dec_value", "args": { "action": "inc_min" } },
    { "keys": ["ctrl+x"], "command": "inc_dec_value", "args": { "action": "dec_min" } },

これでOK

追記: alignをやる

今までvimで変数代入とかの整形(=alignment)をalignta.vimというプラグインでやっていました。どういうふうにやっていたかというと、exコマンドで:Align =とかいちいちやっていて、Perlのハッシュの整形は頻繁にやるので上のtextobj-indentと組み合わせて,(カンマ)+a+iで同じインデント量を選択して=>でalignというショートカットを作っていました。
sublimeだと以下のプラグインを使うと良さそうです。
Sublime Alignment – a Sublime Text Package by wbond
これもInc-Dec-Valueと同様Package ControlでAlignmentで出てくるのでそれでインストール。
vintageousのexモードで何かを実行するというのはよくわからなかったのでctrl+iに以下のように割り当てました。デフォルトのcommand+ctrl+aは指がツライので。

    // alighment
    { "keys": ["ctrl+i"], "command": "alignment" },

あとUser Prereferenceにも以下を設定。

	"alignment_chars": [
            ":",  "=", "=>"
        ],
	"alignment_space_chars": [
            "=", "=>"
        ],

追記その2:
alignment_space_charsなるオプションもあり、コレに入れとかないと=>とかが前のスペース無しでalignされてしまう。のでこれも入れておくことにしました。
カンマは誤爆がウザすぎるのでなくした。