2013年に作ったVimプラグイン達

今年も残すところあと僅か!あぁ、Vimにどっぷりの一年でした。

今年書いたプラグインを紹介しまーす!

振り返ると、一年で人はここまでVimmerとして成長できるのかと驚くばかりです。(まだまだ未熟者ですが)

14個のVimプラグイン達

今年書いたプラグインは14個以上でした。 1年以内の出来事とは思えないぐらい、それぞれが思い出深いですね。。。

外部に発表していなかったプラグインもあるので、余力があれば試してみてください。

alpaca_powertabline

 alpaca_powertabline

tablineをpowerline化したプラグインです。

初めてのVim Advent Calendarでpowerlineをいつ使う?今でしょ!という記事を書いて、そこそこ人気な記事となり驚きました。

いやぁ…「今でしょ!」って、もうさぶいねぇ。笑

初対面の人で、「使っているよ!」と言ってもらえることもあって嬉しかったです。

今年はlightlineやvim-airlineが登場したので、statusline系の変化が大きかった年だとと思います。

alpaca_english

SQLiteの英和辞書を利用して、英語の補完をするプラグインです。Uniteを通じて、類義語検索や例文検索を行うこともできます。

alpaca_english_demo

これを書き始めたときに、勇気を出してlingrで発言しはじめました。+Ruby環境のバグをVim-JP報告したのもこのプラグインがきっかけですね。

右も左も分からず、色んな人に助けてもらいました。ありがたや、ありがたや。

Vimプラグインを書き始めたときなので、哀愁の漂うコードです。あぁ、そろそろリファクタリングしないと!

Beautify.vim

整形・変換を行うプラグインです。糞便利。

beautify.vim demo

CSS-SCSS, JS-Coffeeなどの相互変換や、圧縮されたJS/CSSの整形などはお手の物です。

alpaca_tags

tagsの非同期生成、tag用のunite-sourceなど同封しています。糞便利。

alpaca_tags.demo

京都のCamphorでの勉強会で初めてお披露目したので、あのメンバーと出会ったのもこれを作った時期だった気がする。いつだっけ。。

alpaca_octopress

最近作った、Octopressの操作を非同期で実行するプラグインです。糞b

:Octopress preview:Octopress gen_deployといった操作が非同期で行えるのが素晴らしい。

記事を書くのが随分楽になりました^^

vim-unite-watson.vim

watsonのcapture

watson用のUnite-sourceです。watson本体もガッツリ書き換えました。海外の方にも結構使ってもらえているようです。自身がプログラミングするとき、思考を止めないためにこのプラグインを作りました。

その他、今年作ったプラグイン

まとめ

Vimプラグインを通じて、一杯勉強させてもらえていたようです。Vim力もだいぶ上がりました。

来年はVim本体をガシガシいじっていきたいと思います・T・

さて、自分の作ったVimプラグインを振り返ると、Vimとともに一年の思い出が振り返れるようです!

ぜひ、他のVimmerもお試しあれ!

P.S.

ほぼVimの記事だけで、Qiitaのストック数が1,000に到達しました。わーい。(白目)

逆就活へ参加するときのノウハウまとめ

逆就活に参加してきました!

世の中にはIT系逆就活というイベントがあります。

東京で開催された23,24日にイベントに参加してきました。

僕は「東京の企業さんを知りたい」と思って参加してみました。

え、クリスマスって何それ美味しいの?

この記事の目的

  • 自分のための反省・備忘録
  • 次回イベント参加予定者のためのメモ
  • イベントについて感想を書きたい(広めたい)

特に、自分が「イベントに参加するメリットを最大化する」ことを目的にまとめます。

他の人には、多少参考になればという程度です。長いので、逆就活に関係の無い人は見ないことをお勧めします。

どんなイベントなの?

色んな企業さんとお話できます。楽しかったです!

pixiv, シーエーモバイル, 楽天, ネクスト, SanSan, GaiaX, リクルートホールディングス, 出版デジタル機構, ジャストシステム, エフォーション, イード, ABEJA, エイチーム, コロプラ, リッチメディア, ウイングル, Docomo, Microsoft…他数社(敬称略)

の企業さんが来てくださっていました。

イベントの流れ

イベントの体型は合同説明会の、企業と学生が入れ替わった感じでしょうか。 30分ごとに、企業は指名した学生との面談を繰り返します。

イベントの流れはこんな感じです。(企業側の流れは完全な憶測です)

  1. (学生) プロフィールをイベントページに公開
  2. (企業) 学生のプロフィールを見て面白そうな人をリストアップ
  3. – イベント当日 –
  4. (企業) 名刺交換会にて、気になる学生に挨拶をする
  5. (企業) 会いたい学生に順位をつける(1~10位ぐらい)
  6. (主催) 順位を元に8タームの配分を調整する
  7. 面談 * 8
  8. 懇親会
  9. – イベント翌日 – : マッチングできた企業さんから個別に面談

逆就活ノウハウ

ノウハウって言い方だと、いかにも得意気ですね。笑

そうではなくて、イベントに参加して失敗したことの反省を書きます。

僕は仮説が間違っていたので、随分もったいないことをしましたね。。。

それぞれのレイヤーで、「間違っていた仮説」「次の仮説」を書いておきます。(次回に反省を生かす!)

プロフィール作成のノウハウ

  • 選考を通るために、プロフィールを作り込めば良い
  • [o] 特定企業への熱烈なアピールのためのプロフィール + α

今回、僕はプロフィールの作成において「選考を通る」ことのみを目的に作っていました。

そして、面談では30分という長い時間を使って、何でも話せると思っていました。

完全に間違いです。その理由は、次の通りです。

  1. 企業はプロフィールを見て、指名を決める(順位込み)
  2. 面談の30分で話せることはほとんどなく、プロフィールで示した内容の確認の時間だった

思えば、イベントの選考に通ることを目的にするのは大変馬鹿げていましたね。。

イベントの選考

今回、イベント選考は若い方が担当していました。

なので、プロフィールは「なぜこの学生を選んだのか」と、選考担当が上司に言い訳できる内容さえ押さえていれば大丈夫なはず。

ここに重点をおくとは、非常に馬鹿なことをしました。

プロフィールはこう作る

となると、改善してやることはHPと一緒ですね。おぉ、簡単。

  1. 興味をそそるコンテンツでページ(プロフィール)へ誘導する
  2. ファーストビューで、離脱率を減らす
  3. コンバージョン(次の選考/内定後の仕事)に向けて、必要なコンテンツを揃える

プロフィール画面が画一的なレイアウトなので、特徴を付けづらいのが残念です。

名刺交換のノウハウ

  • 顔をがんばって覚える
  • [o] 顔は覚えない

入れ替わり立ち代わりで、10~20人を覚えるのは無理です。笑

なので、MacBookAirで録画しながら名刺交換をします。

その場で覚える必要な無くなれば、随分楽に名刺交換できますね。

面談

  • 企業は人物を知りたいと思っており、30分でどれだけ自分のことを知ってもらえるかが重要
  • 面談に来る企業は、自分にかなり興味がある
  • [o] 企業はその学生は「何が出来るか」を知りたいと思っており、企業の事業と一致するかが重要
  • [o] 面談に来る企業は、それぞれ目的が異なる

うーむ、これは一番戦略を間違えましたね。 Yahooの方に教えてもらえたような気がします。

まず、企業さんは「僕にとても興味を持ってくれている」という前提で考えていました。 その前提でたつと、おかしな面談になります。

企業は何を考えている?

そもそも、イベントに来る企業さんはそれぞれ目的が違うみたいですね。 多分、次のようなパターンに分かれると思います。

ポジティブな目的
  1. プロフィールを見て企業の採用基準に合致すると思い、確認のため
  2. 単に、面白そうな学生だから話したかった
ネガティブな目的

企業はきっと多額のお金を主催者に払っています。 とすると、人事の方としても次のような思惑が出てくるのではないでしょうか。

  1. 人事の新人教育のため、練習台としての面談
  2. 興味がない学生だけれど、8人まで希望を埋めないとお金が勿体ない
  3. 自社のセミナーへ参加者が増えれば、自分の評価に繋がる

売上げは凄いけど、知名度の少ないベンチャー企業というのもあるので、(2,3)は十分に考えられます。

面談のノウハウ

面談は、企業も学生も貴重な時間を使って参加しています。しかしながら、先ほど述べたように企業さんが何を考えているか分かりません。

ということで、僕がまた参加する際には次のフローで面談を行おうと思います。

  1. 面談開始のときに、面談の目的をお互いに確認する
  2. その企業が求めている人材を確認する。(プロフィールのどこを見て来たのか、何位に指名したのか)
  3. 自分が出来ることと、企業に入ってやりたいことをプレゼンする
  4. 企業と雑談する

そして、どこかで「あ、違うな。」と思ったら、もう面談は終えようかなと思います。

人事の方も疲れるので、休めるような会話に切り替えたいですね。

ただ、今回はそう思って切り替えて話した企業さんにNo.1学生に選ばれたので、就活って本当よく分かりません。

まとめ

まとめとして言うのなら、捨てることが大事だと思います。

もっと色んなものを捨てた方が良かったなと思います。

HPを作るときと一緒で、色んなことを捨象して集中するべきでした。せっかく、自分というコンテンツがあるのに、魅せ方へのこだわりが無かったですね。

ということで、次回参加する際には3社ぐらいからしか面談希望が来ないぐらいになれば合格かなぁ、と思います。

Vim中級者を脱する path編

はい、pathとは:set pathで出てくるやつのことです。 実際にはみなさんgfやファイル補完などでお世話になっていると思います。

今回はpathとは何かを説明して、.rbファイルのクラスからGemの定義元へ飛ぶ方法をやってみましょう。

方法だけ知りたい人は、一番下までスクロールしてください

pathとは?

Vimにおけるpathとは、set path?で出てくるpathです。

適当にファイルを開いてコマンドを打ってみましょう。

:set path?
path=.,/usr/include

これを設定しておくことで何が嬉しいかというと、編集中の変数の定義元へ飛べたり、ファイルを検索出来たりします。つまるところ、Vimが何かを探すときの基準になるディレクトリ達を指定することができます。

補完プラグインや、Vimの基本機能などもpathに依存していることが多いため、裏側では結構活躍している設定でもあります。

gfでGemの定義元に飛ぶ

gfは通常、カーソル

Rubyを編集する際、Vimのビルトインのftplugin/ruby.vimが読み込まれ、gfが自動的に関数にマッピングされます。

:set filetype=ruby
:nmap gf
n  gf          *@:<C-U>exe <SNR>121_gf(v:count1,"gf",'edit')<CR>

このおかげで、通常のgfが拡張されて幾つかのケースでgfが使えるようになります。(Rails.vimも同じ手法を使っていますね。)

具体的にはrequire 'path/to/file'やload, autoloadで書いたファイルパスへ飛ぶことができます。

内部では拡張子を取り除いたり、ファイル名に不要な文字を変換したりしていますが、そのオプションについては、今回は割愛します。

pathにRubyのload_pathを追加する

Rubyを編集中に、Gemの定義元へ移動する話をしましょう。

まずRubyについて理解しておく必要があるのは、load_pathの仕組みです。Rubyはrequireなどを使用したときに、指定されたファイルを$LOAD_PATHのディレクトリ一覧の中から探します。

下記のようなコマンドを打つことで、デフォルトの$LOAD_PATHを探すことができます。

ruby -e 'puts $LOAD_PATH'

Gemfileを定義した場合、この$LOAD_PATHにそれらのGemの場所が追加されるのでrequireで使うことがきるようになるんですね。

それでは、VimにもGemfileから取ってきたディレクトリ一覧を与えてやることで、定義元を探し出せるようにしましょう。

Gemfileからディレクトリ一覧を取り出す

bundle show --pathsを使うことで、一覧情報を取り出せます。

$ bundle show --paths
/Users/alpaca-tc/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/RedCloth-4.2.9
/Users/alpaca-tc/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/bundler-1.3.5
/Users/alpaca-tc/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/chunky_png-1.2.5
...

この情報をsetl path=...と与えてやれば、gfを使って定義元に飛べるようになります。

set path=を使って定義する

こちらのスクリプトをvimrcに貼付けましょう。vital.vim依存です(unite.vim, neocompleteがあれば動作します)

これで、GemPathを読み込む:LoadGemというコマンドが作られます。

下記のような動作で定義元に飛べるのが確認できると思います。

gemジャンプデモ

無事動いていますね。

まとめ

今回はpathについて、簡単に説明しました。

次回は、pathを活用してさらにinclude, includeexprあたりをやります。

この辺を勉強すると、自分の環境用にファイル補完を作り上げられます。 neocompleteのfile/includeあたりが書けるようになりますよ〜

仕事が捗る!VimからGitを使う最適解

先日の記事でもチラッと出てきたvim-unite-gitiというプラグインがあります。

ものすごーーーく便利なプラグインなんですが、何故かほとんど話を聞かないプラグインです。

先日の記事でも、git系のプラグインは「知らなかった」という話を沢山聞きました。せっかくなので使い方を紹介します。

今回紹介するのはvim-unite-giti!!

何はともあれ、まずは動画をみてくれ。

とにかく、uniteインターフェースは操作を覚えることが少ない。

今回も、幾つかのUniteコマンドを使っているけれど、基本的に「選択」→「アクション」の動作しかない。

:Unite giti/status

add, unstage, checkoutなどの操作が簡単ですね

conflictがあれば、すぐ見れます。「選択」→「commitアクション」と進めば、指定したファイルだけのコミットもお手軽に作れます(!!)

:Unite giti/branch

tracking, chckout, deleteなどの操作が簡単ですね。

branchを切るのにわざわざShellを使うなんて。あなた、Vimと触れ合う時間が減ってしまうではないですか。

:Unite giti/log

紹介していませんが、普通に便利です。vimdiffなどを見る事も簡単です。

vim-unite-giti以外のプラグイン

git-vim :GitDiff, :Git push

こちらは、特に驚きはないので初めて使う人以外は見なくてもいいです。

言わずもがな、コマンド名の通りです。

git-vimを使って何がうれしいかと言うと、それなりに補完ができる点です。

fugitive :Gcommit, :Gblame

すでに語り尽くされているので、ここでは取り上げません。

他のプラグインにもにたようなコマンドがありますが、色付きなのと、機能性が優れているのでfugitiveがおすすめです。

vimrc

今回の動画で使用したvimrcと同じような設定です

vimrc Gist

まとめ

ujihisaさんに憧れてのYoutube記事です。笑

余談ですが、作者のkmnkさんのコードはめちゃくちゃ奇麗です。

今までで読んできた中で、一番奇麗なVimLのコードでした。ほどよい抽象化、適切な命名、整理されたファイル達。率直に、この人と一緒に仕事出来る人は幸せだろうなぁと感じました。

vim-unite-gitiを作ってくださって感謝します。

Rubyのクラス変数について詰まったのでヘルプ

基本的に、仕事でクラス変数を扱うことはほぼ無いです。

今回は遊びのコードを書いていて、悩んだことをまとめました。

Rubyのクラス変数の扱いが難しい…。

これ、結構Ruby書いている自分でも初めて遭遇して悩む問題だった。

まず、次のような動くコードを書いてみた。

class Base; end

class Node < Base
  @@val = 'Node'
end

class Branch < Base
  @@val = 'Branch'
end

p Node.class_variable_get('@@val') #=> 'Node'
p Branch.class_variable_get('@@val') #=> 'Branch'

ふむ、それぞれの派生クラスでクラス変数が使えますね。

では、続いて基底クラスにもクラス変数を与えてみる。

class Base
  @@val = nil
end

class Node < Base
  @@val = 'Node'
end

class Branch < Base
  @@val = 'Branch'
end

p Node.class_variable_get('@@val') #=> 'Branch'
p Branch.class_variable_get('@@val') #=> 'Branch'

Ooops!!! 派性クラス内のクラス変数が、基底クラス変数を参照しよる!!

解決編

やりたいことは、派生クラスの子クラスに共通の変数を持たせるということ。

うーん、意外と難しい!

どうもクラス変数という感じではなくなるけれど、こうするしかないのだろうか…。

メソッドにしてみたら、とっても気持ちが悪い。

class Base
  class << self
    private

    def val
      'Base'
    end
  end
end

class Node < Base
  class << self
    private

    def val
      'Node'
    end
  end
end

class Branch < Base
  class << self
    private

    def val
      'Branch'
    end
  end
end

p Node.send(:val) #=> 'Node'
p Branch.send(:val) #=> 'Branch'

これだと、一応コードとして動く。 ただ、これは無いだろ感あるよね。

しかし、クラスインスタンス変数だと継承されないし、こうするしかないのかなぁ。

だれか正しい方法があれば、教えてください! >_<

追記

思いついたんだけど、継承するときにクラスインスタンス変数を渡せばいいのかな?

どうでしょう。

class Base
  @val = 'Base'

  def self.inherited(klass)
    klass.instance_variable_set('@val', @val)
  end
end

class Node < Base; end
class Branch < Base; end

p Node.instance_variable_get('@val') #=> 'Base'
p Branch.instance_variable_get('@val') #=> 'Base'