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
}

Rubyによる形態素解析エンジンokura 0.0.1をリリースしました

12月にさくさくテキストマイニングで発表したpure Rubyによる形態素解析エンジンをgem化しました。
まだ発展途上で機能が少なかったりパフォーマンスが悪かったりしますが、いちおう動くレベル*1になったので公開します。

注意事項

バージョン0.0.xのうちは、インタフェースや辞書フォーマットは頻繁に変更される予定です。
ある程度安定したら0.1.0出します。
今のところ、Ruby1.9系専用です。

取得

gem install okura

でインストールできます。

ソースは https://github.com/todesking/okura

使い方

MeCabフォーマットの辞書データを使用します。
動作確認はMeCab用NAIST辞書で行いました。

*1:起動に数分かかったりしないという意味

続きを読む

Vim、Ruby編集時にinsert modeが異常に重くなる現象の解決方法

概要

  • Vimにおいて
  • Ruby編集時に(filetype=ruby)
  • foldmethod=syntaxを指定していて
  • 括弧の対応が取れていない状態で
  • Insertモードで文字入力すると

すごく重い。ファイルのサイズが大きい場合に顕著。

# ...

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=グローバル

と解釈しておけば問題ないのでは。そして悩んだら仕様読む。

mecab-NAIST-jdicのCSVは、カラムがダブルクオートで囲まれてることがある

手元にあった mecab-naist-jdic-0.6.3b-20111013 時点でこれくらい。

',5,5,667,記号,一般,*,*,*,*,"'","'","'",,
(,6,6,287,記号,括弧開,*,*,*,*,"(","(","(",,
),7,7,292,記号,括弧閉,*,*,*,*,")",")",")",,
",",10,10,-731,記号,読点,*,*,*,*,",",",",",",,

一番下の、半角カンマを単語定義してるところが特に問題になりがちだと思います(igoで読めなかった)
半角カンマを形態素解析したいというニーズない人は当該行削除すれば問題ないです。