申し遅れましたが先月末からペパボで働いてます。Ruby on Railsで開発してます。社内IRCがあってVimやEmacs使ってる人がごろごろいて居心地いいです。前の会社よりも早く帰れるようになったのでNEETの頃みたいに毎日ブログ更新したいですね。以上、よろしくお願いいたします。
(Vim + TextMate) / 2 = Vico
仕事するときはWindowsでもLinuxでもVimを使っているので、最近ではVimが手足のようになっています。エレベーターに乗るときも
しかしVimが手足のようになってる皆さんならお分かりいただけるかと思いますが、Vimmerは口より先に
TextMateでVimのキーバインディングが使えないかなー、あるいはVimの中でTextMate Bundleが使えないかなー的なことを夢想していたら、それを実現しているテキストエディタがあったわけですよ。Vicoってやつでした。春頃チェックしてたんだけど、先日、「TextMate vim keybinding」みたいキーワードで検索していて改めてその存在を知ったので試用版をダウンロードして使ってみた次第です。まんまTextMate + Vimという感じ。
TextMateとの相違点としては、
- Vimキーバインディング(Vimが使えない人には多分使いにくい)
- デフォルトで日本語に対応!!!
- デフォルトでサイドドロワーがついてる
- ウィンドウ分割あり!!!
良くできてる点
- TextMate Bundleが利用できる
- GUIエディタとCLIエディタの長所をうまい具合に統合している。
- TextMate同様、カスタムシェル変数を設定できる。
- 従って
⌘ +R でスクリプトを走らせるときにTM_RUBY
という具合にシェル変数を設定しておくことで、RVMのRubyを実行時のインタープリタとして利用できる。
気になる点
- テキストをインサートモード時にバックスペースで削除すると、削除するつもりのない文字を一文字余計に削除する
- .vimrc を見て機能を拡張された状態のVimを使えるわけではなさそう
- upコマンド(テキストが変更されていれば保存する機能)が使えない
- なんとなく動作が不安定
このように気になる点がないわけでもないので、Vicoで書いていたこのテキストを途中でVimに切り替えて書いてしまっちゃった。Vimは .vimrc にごちゃごちゃ書いたりプラグインをインストールして始めて快適に使えるようになるので、キーバインディングだけviライクでもVimそのものの機能を提供してくれるわけではないVicoは、生粋のVimmerからするとちょっと使いにくいところがありますね。
それでも「
Liquidの中でLiquidをエスケープする
JekyllはLiquidというRubyのテンプレートエンジンを採用してるんですが、Liquid内でLiquidの文法をエスケープする方法が分からず大変苦しんでおりました。Jekyllの公式のDocument呼んでもXML出力時とかCGI出力時にコンテンツをエスケープする方法は書いてあるのに、Liquidテンプレート自体をエスケープする方法が書いてなく、大変不満でした。しかしその方法が分かったのでお知らせいたします。元ネタはスタックオーバーフロー。
例えば {{ "{% this " %}}}
と表示させたかったらこうやります。
{{ "{% this " %}}}}
ちょっとトリッキーですね。
Pygmentsと組み合わせて使うことも可能ですが、いちいち {{ "{% highlight " %}}}
のなかでコメントアウト処理をしてあげないといけないません。面倒くさいですね。
Jekyllにカテゴリ一覧を追加した
Jekyllを使いだしてから気がつくと一年経ってました。いろいろ便利に使えており気に入っております。
PygmentでコードをシンタックスハイライトしたりLSIで関連記事表示したりと結構手を入れてはいたんだけど、いわゆる世間の一般のブログにあるようなカテゴリ一覧表示機能と、カテゴリごとの記事アーカイブ機能がなくて、それを若干不便に思っておりました。
ググってみたところ、プログラマー向けなブログツールなだけあっていろんな方法が出てきました。以下そのまとめ。
カテゴリ一覧
JekyllのLiquid (テンプレート言語) には {{ "{{ sites.categories " }}}}
みたいタグがあるんだけど、こいつが意図したとおりに動かない。普通のRuby使いの感覚からすると site.categories
ってカテゴリを沢山持った配列になってそうな気がするんだけどこれが違う。
<ul>
{{ "{{ for category in sites.categories " }}}}
<li>{{ "{{ category.name " }}}}</li>
{{ "{{ endfor " }}}}
</ul>
↑みたいな感じのコード書くと何も表示されない。 site.categoires
はHashで、{ "カテゴリ名" => カテゴリ内の記事一覧 }
みたいな構造になってる。LiquidでHashのキーを取りだす方法が分からず、どうにもこうにもいかなかったので他の人が作っているプラグインを利用することにした。
↑のファイルを JEKYLL_ROOT/_plugins
にコピーする。(_plugins
というディレクトリがなければ作る)。そんでテンプレートを変更する。↑のやつを↓みたいにする。
<ul>
{{ "{{ for category in sites.iterable.categories " }}}}
<li>{{ "{{ category.name " }}}}</li>
{{ "{{ endfor " }}}}
</ul>
2行目のところが変更点です。これでカテゴリ一覧表示ができるようになる。
カテゴリごとの記事一覧
カテゴリごとの記事一覧を表示する方法だけど、こういうのを発見した。
ここの generate_categories.rb
を使えばカテゴリ内の記事一覧を作成できる。こんな感じ。
これもさっきのと同じように、JEKYLL_ROOT/_plugins
にファイルをコピーする。そんでLiquidテンプレートを書き換えるんだけど詳細はプラグイン内の記事をご確認くだしあ。
RVMでRubyをアップグレードしたら "bad interpreter" という警告が出る
Ruby 1.9.2-p290 がリリースされたので入れてみた。RVMで。
$ rvm install 1.9.2 --with-readline-dir=/usr/local #homebrewで入れたreadlineのパスを指定
$ rvm migrate ruby-1.9.2-p180 ruby-1.9.2-p290
migrate
を実行したところ、警告が出ながらも次のような感じでマイグレーションは完了した。
$ rvm migrate ruby-1.9.2-p180 ruby-1.9.2-p290
Are you sure you wish to MOVE gems from ruby-1.9.2-p180 to ruby-1.9.2-p290?
This will overwrite existing gems in ruby-1.9.2-p290 and remove them from ruby-1.9.2-p180 (Y/n): Y
Moving gemsets...
Moving ruby-1.9.2-p180 to ruby-1.9.2-p290
Making gemset ruby-1.9.2-p290 pristine.
ERROR: Error running 'rvm gemset pristine' under ,
please read /usr/local/rvm/log//gemset.pristine.log
Moving ruby-1.9.2-p180@global to ruby-1.9.2-p290@global
Making gemset ruby-1.9.2-p290@global pristine.
ERROR: Error running 'rvm gemset pristine' under ,
please read /usr/local/rvm/log//gemset.pristine.log
Do you wish to move over aliases? (Y/n): Y
Do you wish to move over wrappers? (Y/n): Y
Do you also wish to completely remove ruby-1.9.2-p180 (inc. archive)? (Y/n): Y
Successfully migrated ruby-1.9.2-p180 to ruby-1.9.2-p290
一見、問題なく移行できたように思えるのだけど、この後rakeなどexecutableなgemをコマンドラインから実行すると以下のようなエラーが出る。
zsh: /usr/local/rvm/gems/ruby-1.9.2-p290/bin/rake: bad interpreter: /usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby: no such file or directory
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/rake-0.8.7/lib/rake.rb:2377:in `raw_load_rakefile'
(See full trace by running task with --trace)
shebangに書いてあるrubyのパスがmigrate時に削除した ruby-1.9.2-p180 なのが問題なわけだ。
正しい対処方法かどうかは自信がないが、Rubyでサクサクッとshebangを書き換えるやつを書いた。以下みたいなやつ。
こいつを実行してやるとshebangが正しく書き換わったexecutableなgemができる。万が一のためにbackupファイルを作るのでこれをzshで rm *_backup
とかしてやるといいと思います。
と思ったけど、結局↑のRubyの入れ方はまずいみたいで、jekyllとかCライブラリに依存する系のgemが動かなくなってしまったので rvm implode
してRVMをまるっと入れ替えた(20回くらいRubyをインストールしなおした)。次の記事にでも書きます…。
理想の会社
こういう会社で働けたら幸せだろうなと思います。
理想の会社
- Gitでソースコード管理している。
- 会社のGithubアカウントがある。
- 外部に公開されている技術ブログがある。
- IDEよりVimやEmacsを使うことが奨励されている。
- 社員が勉強会に参加することを奨励している。
- オープンソースコミュニティに貢献している。
- 音楽を聞きながら仕事できる。
- Rubyで開発できる。
- 会議が短い。
- アジャイル開発を実践している。
- テストコードがある。
- エンジニアは全員ノートパソコンで開発して、好きかってに席を替わってペアプログラミングとかやってる。
- MacとLinuxしかない。
- 優秀なデザイナーがいる。
- でかい本屋が近くにある。
- プログラムを書くことが好きな人たちが集まっている。
- SEという肩書きの人がいない。
- 大所帯でない。
- 金曜の夜はみんなはやく帰る。
- イスに金をかけている。
- 社員がfoursquareで会社のMayorの座を競い合っている。
リダイレクトでけた
Lokkaで /article.php?id=数字
なURLへのアクセスをリダイレクトできました。
SinatraではURLの ?
以降のクエリストリングは request.query_string
というオブジェクトの中に入るらしい。そういうわけなので次のようなコードでリダイレクト処理してます。
module Lokka
module RedirectArticles
def self.registered(app)
app.get %r{/article.php} do
unless request.query_string.empty?
/id=(d+)?/ =~ request.query_string
redirect "/#{$1}", 301
end
end
end
end
end
Sinatra、Lokka越しで初めて本格的に利用させもらってますけど便利ですね。