T

lokkaでFerret

みんな大好きlokkaでFerretによる全文検索プラグインを作ってみました。

https://github.com/yagitoshiro/lokka-ferret

クラウド環境での動作を前提にしている、というかみんなが愛してやまないHerokuでの動作を前提としているlokkaなので、MeCabで分かち書きというわけにもいかないですから、Yahoo! Japanの形態素解析サービスを利用できるオプションもつけてみました。アプリケーションIDを登録すると使えるようになります。

もちろん、Herokuでない環境でMeCabが使える人は、Gemfileの一行目をコメントアウトしてくれたらMeCabのRuby用バインディングをインストールするようになっているので、そちらを使ってください。

ferret-lokka.png

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.png

コメントの管理画面にステータスが表示されます。今のところ編集ボタンからステータスを変更する方法しかありません。もうちょっと管理が楽になるように変更したいです。

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を作ればいいよ!