Vim Ruby EvalというVimプラグインを作りました

Vim Ruby EvalというVimプラグインを作りました。

 

https://github.com/kmdsbng/vim-ruby-eval/

 

どういうプラグインかというと、以下の画像のようなことができるようになります。

 

f:id:kmdsbng:20140222222544g:plain

 

Ruby Tapasでこういうことをやってたのがかっこ良くて、どうやったらできるのか調べてみたところ、Sublime TextだとできるらしいけどVimではできないみたいだったので、作ってみた。

 

すごくかっこよかったので作ったんだけど、正直ライブコーディングですごい!と言われる以外にどういう使いどころがあるのか自分でも疑問だったんですが、実際に使ってみると、結構使える。

 

たとえばライブラリの挙動を確認したりするときには、pryを使ったり、短いサンプルコードを書いてQuickRun で動かしてみる、ということをやると思うんですが、QuickRunの代わりにVIM Ruby Evalを使うと、結果がコードのコメントとして残るので、あとから参照できるのがなかなか便利。あとは出力の整形を考えなくてもコードの途中に結果が出てくれるのはかなり気持ちいい。意外と実作業でも便利に使えることがわかってびっくりしました。

 

ただ、実装はあんまり良くなくて、ASTを作ってプログラムを解析するとかいうことはしてなくて、単に行レベルでマーカーコメントを見つけたら、その行の結果を出力するようにプログラムを変形してます。なので文字列の中でマーカーコメントと同じ文字列が含まれてたり、引数の途中でマーカーコメント入れたりするとうまく動きません。あまりそういうエッジケースでちゃんと動くことを求めたわけではないのでまあいいかなと思ってます。あとVimRuby Interfaceに依存してますので、入ってない場合は configureで --ruby-interp を有効にして Vimをビルドしなおしてください。

 

ライブコーディングや他人に見せるときに使うと、デキる奴感をアピールできると思います。便利に使ってください。

 

 

 

 

 

Refinementsを使ったRails Presenter

Ruby2.1のRefinementsを使って、RailsのPresenter層ライブラリを作れるんじゃないかと週末にがんばってみたところ、いい感じに実装できた。

 

現状はサンプルのRailsアプリケーションで動くようになったところ。

 

https://github.com/kmdsbng/refinements_rails_presenter_test

 

動きを一言で説明すると、特定のViewのファイルでのみ、refineで定義したメソッドが生える。例えば、あるViewでのみ、modelにメソッドを生やす、ということができる。

これはRuby2.1のRefinementsの機能を使って実現してるだけなんだけど、Viewのなかでusingを呼び出すだけでは動いてくれなかったので、動くようにActionpackに手を加えてる。

 

まず、refine定義するモジュールのサンプル。

 

https://github.com/kmdsbng/refinements_rails_presenter_test/blob/master/app/models/concerns/post_show_presenter.rb

refinement module sample

 

普通にrefineを使って、Postモデルにメソッドを定義してる。これはAutoLoadされるディレクトリならどこに置いてもいい。

 

https://github.com/kmdsbng/refinements_rails_presenter_test/blob/master/app/views/posts/show.html.slim

refinemehts rails presenter sample

 

これがViewの定義。 slimで書いてる。

先頭の using と書いてる行で、refineを定義しているmoduleを指定してる。

これで、このViewではPost#body_lengthが使えるようになる。

 

usingがViewの中で使えるなら、特別な処理の必要はなかったんだけど、残念ながら using は現状トップレベルからしか呼び出せないという制限がある。

だから、Viewテンプレートをevalしてるところで、usingを加えてevalするようにモンキーパッチを当てたところ、うまくいった。

 

Draperなどの既存のRails Presenterライブラリは、 modelをラップしたりextendを使ったりして model の機能拡張を行ってる。このやり方だとmodelインスタンスすべてに処理しないといけないのでどうしても手間がかかってしまったが、Refinementsが使えるならもっとスマートに同様の機能が実現できる。かなり有望なアプローチだと思う。

 

 

はてなブログで購読してるブログをReederで読む方法

はてなブログで購読しておくと、毎朝更新内容をメールしてくれるけど、メールじゃなくてReederで読めるようにしたかったので、そのための仕組みを作ってみた。

 

 

処理の流れは以下のとおり。

 

  1. はてなブログで購読中のブログ一覧を取得する
  2. ブログのフィードをFeedlyに登録する

 

ReederはFeedlyに対応してるので、Feedlyにブログのフィードを登録しておくと、Reederで読めるようになる。crontabでFeedlyへの登録処理を回してやって、新しく購読したブログのフィードが自動的にFeedlyに登録されるようにすることで、購読したものがReederで読めるようになる。

 

はてなブログで購読中のブログ一覧を取得する

はてなブログは購読中のブログを取得するようなAPIを公開してないみたいなので、CasperJSを使ってスクレイピングした。CasperJSは綺麗に書けて良いと思う。

 

はてなブログで購読中のrssを取得する

 

ブログのフィードをFeedlyに登録する

FeedlyのPOST APIをサポートしてるライブラリがなかったのでライブラリを作った。

 

https://github.com/kmdsbng/feedly

 

まだ実装してないAPIがいっぱいあるけど、とりあえず認証してフィードを登録することはできる。

FeedlyAPIを使うには、FeedlyのAccess Tokenを入手しないといけない。

Access Tokenを入手するための認証プログラムをサンプルに含めた。

https://github.com/kmdsbng/feedly/blob/master/sample/get_token.rb

実行して指示に従うと、Access Tokenを入手できる。以下の様なかんじ。

 

% ruby get_token.rb
1. Access this url. Then redirect https://cloud.feedly.com/feedly.html?code=???&status= .
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=5348905598... # このURLにアクセスすると、googleのログインページに飛んで、最後にcloud.feedly.comに飛ばされる。そのクエリパラメータにcodeがセットされてる
2. Please input code
> AQAAO7N7InAiOjE... # 1. で入手したcodeを入力する
OK. success to get tokens
access_token: AQAAUkN7I...  # Access Tokenが表示される

 

 Feedlyにフィードを登録するスクリプトはこんな感じ。

 

gist8158609

 

crontabから、これらをパイプでつないだ 処理を実行する。

 

0 * * * * cd $HOME/work/register_feedly; casperjs get_hatena_blog_subscribe_list.coffee | ruby register_to_feedly.rb

 

 これで、はてなブログで購読したら自動でFeedlyに登録されるようになります。

f:id:kmdsbng:20131228210707p:plain

 

 登録されてますね。

 

最高に簡単にwebサーバが書けるRubyのライブラリ作った

最高に簡単にwebサーバが書けるRubyのライブラリを作った。

 

webio

https://github.com/kmdsbng/webio

 

コンソールでデータを受け取って回すのと同じ労力でWebアプリ作るみたいなことがしたかった。

 

例えばこういうコードが動く。

 

getting started webio sample

 

これを走らせておいて、ブラウザで http://localhost:9999/World にアクセスできる。

結構面白いんじゃないかと思う。

 

今は実装スカスカなので、IOの要件満たすくらいに実装進めたい。

 

tmuxinatorが便利

tmuxinatorは、tmuxを起動したときの動作を設定できるアプリケーション。

ウインドウ0はエディタを起動して、ウインドウ1はmysqlクライアントを起動して、みたいな設定ができる。

tmuxinatorを使えば開発環境用に各ウインドウに役割分担させた状態で起動する、というようなことが実現できる。

 

 

tmuxinatorで一瞬で開発環境を起動する

http://qiita.com/naoty_k/items/869b00fdde27c2225989

 

インストール方法、設定方法はこの記事が詳しい。

ただ、Cent OS6だと、sudo yum install tmux すると tmux 1.6がインストールされてしまうが、tmuxinator の最新バージョン 0.6.6 は、tmux 1.8以降でないと使えない。

 

ソースからtmuxの最新版をインストールする方法はこの記事が詳しい。

http://d.hatena.ne.jp/naokton/20130811/1376232103

 

以前からやりたかった、自動化が簡単に実現してしまった。ありがたいです!

 

tmuxinator

https://github.com/aziz/tmuxinator