Lokkaのpluginを別リポジトリにするためにgit filter-branch --subdirectory-filterを使ってみました。

Pro Git - Pro Git 6.4 Git のさまざまなツール 歴史の書き換え

最強のオプション: filter-branch

歴史を書き換える方法がもうひとつあります。これは、大量のコミットの書き換えを機械的に行いたい場合 (メールアドレスを一括変更したりすべてのコミットからあるファイルを削除したりなど) に使うものです。そのためのコマンドが filter-branch です。

% git clone git@github.com:komagata/lokka.git
% cd lokka
% git filter-branch -f --subdirectory-filter public/plugin/lokka-hoptoad HEAD
Rewrite cedd2bc6856876f6a51cfbf2cf70f3ceb2b835a9 (1/1)
Ref 'refs/heads/master' was rewritten
% git st
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 247 different commit(s) each, respectively.
#
nothing to commit (working directory clean)
% git log
commit 34ad15f4435ccc563f48778419fe2d48d7c58161
Author: Masaki KOMAGATA <komagata@gmail.com>
Date: Thu Dec 2 17:26:34 2010 +0900

added hoptoad plugin.
% ls
Gemfile lib views

「やだ、なにこれ・・・」

スゲー変わってる。filter-branch系は歴史を遡って書き換えちゃう系なので新たにcloneしといた方がホント安全っぽいですね。

後はgithubに新たに作ったlokka-hoptoadリポジトリにpushして完了。便利ですね!

Lokkaの標準でないプラグインを別リポジトリにして、lokka.orgにプラグインのページを作りました。

Plugins - Lokka

githubを"lokka"で検索して出てくるものを書いてみました。数が増えたらWordPressのPlugin Direcotryみたいにアップ出来るようにしたい。

他にもっと作るべきものあると思うんですが、ちょっとこのブログに必要だったのでLokkaのHoptoadプラグインとNew Relic RPMプラグインを作りました。

Hoptoad

Hoptoad : p0t Errors

Hoptoadは僕も大好きなshouldaやfactory_girlやpaperclip等のライブラリも作っているthoughtbotのサービス。アプリのエラーを管理するサービスです。最近iOSアプリのエラーにも対応してみたいです。

New Relic RPM

Heroku | docs-komagata-org | New Relic RPM

New Relic RPMはアプリのパフォーマンスを監視してくれるサービスです。

プラグイン

komagata [p0t] - Lokka

プラグイン一覧にHoptoadとNew Relic RPMが増えました。

komagata [p0t] - Lokka

New Relic RPMの方は特はHerokuの場合、Addonを入れただけでプラグインが存在すれば動きますが、HoptoadはAPIキーを上記の設定画面で入力する必要があります。

Herokuの場合、Addonはそれぞれ下記で簡単に追加できます。

% heroku addons:add hoptoad:basic
% heroku addons:add newrelic:bronze

Google Analytics, Hoptoad, New Relic RPMの三つをこのブログに入れてみてわかったことは、1日250PVぐらいしかないのに、レスポンスに1〜3秒ぐらいかかっていて、特に不具合は発生してないが、Herokuから"Backlog Too Deep"のエラーが130も起きてるとのメールが来ることです。

2dynosにしたら$36/monthかかるんですが、性能はあんまり期待出来そうにありません。

Lokkaでメタディスクリプションとメタキーワード設定出来るようにしました。

komagata [p0t] - Lokka

これは簡単なんですが、そろそろLokkaのDBアップデート時のmigrationやimport/exportデータのフォーマットを決めないと面倒になってきました。xmlが無難なのかなあ・・・。

Lokkathon #1でプラグインで管理画面を作れるようにしました。

サンプルとしてGoogle Analyticsのプラグインを作りました。

管理画面の作り方

komagata [p0t] - Lokka

管理画面からIDともしあれば、サブドメインを入力できます。(@nkmrshnさん作)

module Lokka
module GoogleAnalytics
def self.registered(app)
app.get '/admin/plugins/google_analytics' do
haml :"plugin/lokka-google_analytics/views/index", :layout => :"admin/layout"
end

app.put '/admin/plugins/google_analytics' do
Option.tracker = params['tracker']
Option.tracker_dn = params['tracker_dn']
flash[:notice] = 'Updated.'
redirect '/admin/plugins/google_analytics'
end

app.before do
tracker = Option.tracker
if !tracker.blank? and ENV['RACK_ENV'] == 'production' and !logged_in?
dn = Option.tracker_dn
tracker_script = ""
(snip...)
content_for :header do
tracker_script
end
end
end
end
end
end

管理画面を作るプラグインのコードはこんな感じです。管理画面のURLを '/admin/plugins/プラグイン名' にすると、プラグイン一覧のプラグイン名から自動的にリンクが張られます。

komagata [p0t] - Lokka

/admin/〜というURLには自動的に認証が係るので、プラグイン内で認証を気にする必要はありません。

テンプレートへの挿入

テンプレートの中にはheader, footerという外部から何かを挿入できるポイントがあります。(テーマ側でこのheader, footerが無い場合は何も起きません)

要はyieldなので、プラグインの中からそれぞれの場所にcontent_forしてあげればプラグインからテンプレートにタグを挿し込むことができます。

content_for :footer do
'<p>created by unk</p>'
end

この仕組を使えばjavascriptを使ったプラグインなどが簡単に作れそうです。

Lokkathon #1でLokkaをgem化しました。

$ gem install lokka

lokkaコマンドが入ります。

$ lokka
== Sinatra/1.1.0 has taken the stage on 9646 for development with backup from WEBrick
[2010-11-22 17:19:23] INFO WEBrick 1.3.1
[2010-11-22 17:19:23] INFO ruby 1.8.7 (2010-08-16) [i686-darwin10.4.3]
[2010-11-22 17:19:23] INFO WEBrick::HTTPServer#start: pid=8950 port=9646

デフォルトのポートは9646(苦しむ)番になりました。

あくまでプラグインデベロッパーのテストを書くのを簡単にするためと、プラグイン同士の依存関係解決のためにgem化しただけで、ユーザーのインストール方法は変わりません。(zip解凍する)

Lokkathon #1は何と定員(1名)の約倍の人数が押しかけ、大盛況の内に幕を閉じました。っつーか意外と真面目にモクモクと作業しちゃいました。毎月1日をリリース日と決めて、毎月開催してもいいかなと思いました。

pluginの事を考えるとbeforeが複数回定義されてもちゃんとそれぞれが実行されないと意味が無い。なので試してみた。

komagata's double_before at master - GitHub

require 'rubygems'
require 'sinatra'

before do
@name = 'Masaki'
end

before do
@name += ' Komagata'
end

get '/' do
"Hello, #{@name}"
end
require 'rubygems'
require 'test/unit'
require 'rack/test'
require 'shoulda'
require './double_before'

class DoubleBeforeTest < Test::Unit::TestCase
include Rack::Test::Methods

def app
Sinatra::Application
end

context "Access pages" do
should "show index" do
get '/'
assert_equal 'Hello, Masaki Komagata', last_response.body
end
end
end
% ruby double_before_test.rb 
Loaded suite double_before_test
Started
.
Finished in 0.030489 seconds.

1 tests, 1 assertions, 0 failures, 0 errors

おお、問題無い!これは期待してなかったので嬉しいですゾ!(@ムック)

明日土曜日・日曜、待ちに待った大イベント、Lokkathon #1が開催されます。気になる開催概要は下記です。

Lokkathon #1

  • 日時 / DATE: 2010/11/20 10:00 to 19:00
  • 定員 / LIMIT: 俺
  • 会場 / PLACE: FJORD, LLC
  • URL / URL: http://fjord.jp/
  • 内容 / DESCRIPTION: Lokka本体・プラグイン・テーマを作る。

ああ、そうだよ。思いつきだよ。ダジャレだよ。

プラグインの管理画面へのリンク

Lokkaでプラグインで管理画面を持った時にプラグイン一覧からリンクしてくれるようにしました。

Test Site - Lokka

最初はプラグイン内でhave_admin_page(acts_as_fooみたいなの)を宣言するようにしてたんですが、頑張って、

Lokka側から "/admin/plugins/#{プラグイン名}"のページがプラグインに存在したらリンクを貼る。

というようにしました。

管理画面左メニューへの追加

また、管理画面の左メニューの一番下にyield_content :admin_menuというプラグインから挿入できるポイントを入れときました。複数回呼べるみたいなので、色んなプラグインから挿入されても大丈夫ですね。(順番はプラグインの読み込まれる順)

まだ、プラグイン内で管理画面作った場合の認証入れてないんですが、sinatra1.1のパス指定beforeを使えるようにしてからの方がいいかなと・・・。

テーマの方にもheader, footerという挿入できるポイントを入れようと思ってます。(全テーマ修正がだるい・・・)