Rails3用に書かれたerbファイルの文法チェックをする
erubisの文法チェックなら
$ erubis -z
で可能かとおもいきや、RailsというかActionViewのERBは謎の文法拡張がされており無理であった(一部のケースでvalidなテンプレートが引っかかる)。
ActionView::Template::Handlers::Erubisを使うことで正しく解釈可能。
https://github.com/jugyo/rails-erb-check/blob/master/lib/rails-erb-check.rb
ということでこういうシェルスクリプト書いた
function assert_valid_erb() { file=$1 echo "checking $file..." ruby -rubygems -raction_view -e 'begin;ActionView::Template::Handlers::Erubis.new(ARGF.read).result;rescue ::SyntaxError;raise $!;rescue ::Exception;end' $file }
MacBook Air設定メモ
開発用MacBook Air(2011)をもらったので設定したメモ。
以前個人用マシンを設定した時のメモ: MacBook Airを買った - <s>gnarl,</s>技術メモ”’<marquee><textarea>¥
前回との違いは、
- OSX Lion
- JIS配列
Rubyによる形態素解析エンジンokura 0.0.1をリリースしました
12月にさくさくテキストマイニングで発表したpure Rubyによる形態素解析エンジンをgem化しました。
まだ発展途上で機能が少なかったりパフォーマンスが悪かったりしますが、いちおう動くレベル*1になったので公開します。
注意事項
バージョン0.0.xのうちは、インタフェースや辞書フォーマットは頻繁に変更される予定です。
ある程度安定したら0.1.0出します。
今のところ、Ruby1.9系専用です。
使い方
MeCabフォーマットの辞書データを使用します。
動作確認はMeCab用NAIST辞書で行いました。
*1:起動に数分かかったりしないという意味
Vim、Ruby編集時にinsert modeが異常に重くなる現象の解決方法
概要
すごく重い。ファイルのサイズが大きい場合に顕著。
# ... loop { array=[1,2, # たとえばこのへんで入力してるとき } # ...
原因
matchitとかmatchparenあたりかと思ったが違った。
very slow insert mode in classes · Issue #8 · vim-ruby/vim-ruby · GitHub
結論としては、 foldmethod=syntax に設定してるのが原因。
解決方法
Insert modeのときはfoldmethodを変更する事で解決する。
私は以下の設定を使いました。
Keep folds closed while inserting text | Vim Tips Wiki | FANDOM powered by Wikia
" Don't screw up folds when inserting text that might affect them, until " leaving insert mode. Foldmethod is local to the window. Protect against " screwing up folding when switching between windows. autocmd InsertEnter * if !exists('w:last_fdm') | let w:last_fdm=&foldmethod | setlocal foldmethod=manual | endif autocmd InsertLeave,WinLeave * if exists('w:last_fdm') | let &l:foldmethod=w:last_fdm | unlet w:last_fdm | endif
JavaScriptの挙動は仕様を見ればだいたい書いてある
http://d.hatena.ne.jp/gfx/20120223/1329996834
(o.f=o.f)()はglobalになった
これの解釈はどうすれば…。
こういうのは仕様書見ればだいたい解決する。
http://www.ecmascript.org/docs.php
今回は3rdを参照しましたが5thでも同じであろう。
メソッド呼び出しは11.2.3のFunction callsなので、それを見る。 => 最初に(o.f=o.f)を評価 => =を使っているので、11.13.1 Smple Assignmentのルールに従って処理される。 => LeftHandSideExpression = o.f, AssignmentExpression = o.f => この処理の返り値は、GetValue(AssignmentExpression)である。 => 8.7.1 GetValueは、プロパティの参照から値を取り出す。 => つまり、単なるfunctionオブジェクトが返る
というわけで、裸の関数を呼んだ時と同じ挙動になる=レシーバはグローバルである
実際のところthisの挙動はそれほど複雑じゃなくて、
- プロパティの参照(hoge.fugaとかa[b])から直接関数を呼んだときは、this=プロパティの入ってるオブジェクト
- それ以外のときは、this=グローバル
と解釈しておけば問題ないのでは。そして悩んだら仕様読む。