lokkaでFerret
みんな大好きlokkaでFerretによる全文検索プラグインを作ってみました。
https://github.com/yagitoshiro/lokka-ferret
クラウド環境での動作を前提にしている、というかみんなが愛してやまないHerokuでの動作を前提としているlokkaなので、MeCabで分かち書きというわけにもいかないですから、Yahoo! Japanの形態素解析サービスを利用できるオプションもつけてみました。アプリケーションIDを登録すると使えるようになります。
もちろん、Herokuでない環境でMeCabが使える人は、Gemfileの一行目をコメントアウトしてくれたらMeCabのRuby用バインディングをインストールするようになっているので、そちらを使ってください。
Ferretのインデックスは、/tmp/ferretとか適当な場所を指定すればいいと思います。上の例ではlokkaのトップディレクトリにしれっと置いてあります。
Lokkaでスタティックな変数みたいなものを
Lokkaのプラグインを作成していて、スタティックな変数が欲しいなあと思った。
例えば、メニューのリストがあって、複数のプラグインからリストに値を追加したい場合。というとややこしいので、
class Menu @menu_list = [] def self.menu_list=(name) @menu_list << name end def self.menu_list @menu_list end end Menu.menu_list = 'hoge' p Menu.menu_list #=> ["hoge"] Menu.menu_list = 'fuga' p Menu.menu_list #=> ["hoge", "fuga"]
普通のRubyのプログラムであればこんな感じになるケース。
SinatraをベースにしたLokkaの場合、プラグインとgetなどのアクセスできるスコープが異なる箇所にインスタンス変数やクラス変数を使うとしたら、configのsetを利用するのが手っ取り早い。
configure do set :foo => :bar end get '/hoge' do "#{settings.foo}" #=> "bar" end
単純な値であればこれで事足りるわけだが、例えば複数のスコープになってしまう箇所でこの変数(例えば配列)に値を追加していきたい、なんて場合はconfigureのブロック内で
configure do My_Struct = OpenStruct.new(:list => []) set :menu_list => Proc.new{|menu| My_Struct.list << menu unless My_Struct.list.include? menu} end
としておいて、
before do settings.menu_list 'もんじゃ焼き' end get '/hoge' do settings.menu_list 'たこ焼き' My_Struct.list.each do |menu| "#{menu}" # => 'もんじゃ焼き'と'たこ焼き' end end
とやれば、スタティック変数みたいに扱うことができる。以上。
Lokka用Akismetプラグイン
update: Akismetを間違ってAkismentと綴っていました。
Lokka用Akismetプラグインを作成しました。本体にコメントの評価機能を追加したので、このコミット以降のLokkaではAkismetを利用することができます。これで迷惑なコメントとはすっぱりお別れです。大まかな仕様は
- ログイン中の人のコメントは自動承認
- 未ログイン状態ではAkismetキーを登録していたらSPAM判定、なければ未承認状態にセット
です。そろそろ案件で使いたいなあ、と思っていたところなので必須機能だろうと追加しました。
動作確認ですが、未ログイン状態でコメントの名前欄に「viagra-test-123」と記入してください。必ずSPAM判定されます(Akismet APIが用意しているテスト機能です)。ログイン状態で同じコメントを投稿したら即時に自動承認されます。
コメントの管理画面にステータスが表示されます。今のところ編集ボタンからステータスを変更する方法しかありません。もうちょっと管理が楽になるように変更したいです。
Lokka
WordPressを憎む根性曲がりな人のための密やかな楽しみ、Lokkaをいじってみた。というかgithubにあるので華麗にフォークした。
ざっと眺めて、最初に必要なのはプラグインの自動ロードだろうなあ、と思っていたのだけれど、迷うところが2点。ひとつは、まあルールにしてしまえばいいんだけど、自動ロードするからには何らかの命名規則に従ってもらう必要がある。ちょうどサンプルにhelloプラグインがあったので、これ幸いと
plugin/hoge/lib/lokka/hoge.rbがあったらHogeクラスをregisterする
ということにしてしまった。これはSinatraでいうところのregister Hogeと同等なのだが、じゃあSinatra拡張モジュールの二大巨頭であるところのhelpersはどうするんだという問題がある。するとHelperの方を拡張するやつを書いている人が見つかったので、
plugin/hoge/lib/lokka/hoge.rbの中でHelperを再オープンしてくれたら活きになる
ということにした。それでhelpers Lokka.Helpersが呼び出されるより前にLokka.Helpersを拡張できるようにしておけばいいじゃない、ということでさっそく変更を施してコミットしておいた。呼び出される順番ってのもあるわけだが、それはRuby側の問題だってことにしておけばいいじゃないか、と心の中の悪魔が言うので従っておいた。以上がプラグイン作成のお作法、英語でいうところのconvention over configurationである。
ちょっと仕事が狂ったように忙しいので、ほとぼりが冷めたらプッシュしておこう。
参考文献:Pyhaの大体の仕組み
update: マージされたよ!これでみんなAkismetとAll in one SEO packとHowdyを作ればいいよ!