herokuのpg_dump.sqlしかバックアップが無い状態からDBを復旧させるため、適当なpostgres環境が必要になったんですが、$ brew install postgresql はv9.0とか未来的な感じが面倒そうだったので簡単にVirtualBoxの仮想環境が作れるという噂のVagrantを使ってみました。

Vagrant - Welcome

Vagrant - Welcome

Vagrantとは?

VirtualBoxの仮想環境をCUIから操作するツールです。数回コマンドを叩くだけで環境が作れるのでとても便利。rubyで書かれたシンプルな設定ファイルを元に面倒な仮想環境構築を自動化してくれます。

VM自体はVagrantfileという設定ファイルで設定し、VMの中身はchefで設定するという感じです。僕はchef使ったこと無いので今回はVM作成したあとはsshで入ってpostgresをインストールしちゃいました。それだけでもOSのCDイメージ落としてきて、インストールして・・・って面倒だったのが簡単になったし、バックグラウンド動作してくれるし、環境がキモくなったらすぐ削除して作り直せるのが精神衛生上良いですね。

Ubuntu 10.04 (Lucid Lynx) 環境を作る

$ gem install vagrant
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
$ vagrant box list
lucid32

OSイメージをダウンロードするので結構時間かかります。lucid32ってのがbox名です。

$ mkdir env
$ cd env
$ vagrant init lucid32
create Vagrantfile
$ ls
Vagrantfile

適当なディレクトリを作ってvagrant initでVagrantfileを作ります。RakefileとかCapfileとかGemfileとかあるので分かると思いますが、このディレクトリで実行するvagrantコマンドがこの設定ファイルを参照します。

# Vagrantfile
Vagrant::Config.run do |config|
config.vm.box = "lucid32"
end
$ vagrant up

vagrant upで同ディレクトリのVagrantfileを元にVMイメージを作ってバックグラウンドで起動します。(2回目からは単に起動します)

$ vagrant ssh
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.
Linux vagrantup 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux
Ubuntu 10.04.1 LTS

Welcome to Ubuntu!
* Documentation: https://help.ubuntu.com/
Last login: Wed Aug 11 17:42:46 2010

vagrant sshでVMにvagrantユーザーでsshで接続します。(デフォルトではlocalhost:2222をVMの22にforwardします)

sudoできるので後は普通のubuntuです。通常、設定はchefでやるみたいです。

忙しい人のためのVagrant

これだけだと何がどうなってるのか解かり辛いのでもう一個環境を作ってみます。

$ mkdir env2
$ cd env2
$ vagrant init lucid32
$ vagrant up

この状態でVirtualBoxの設定画面を見てます。

Oracle VM VirtualBox

ちゃんと2個のVMが実行中です。何にも設定してないですが実際はどうなってるんでしょう?vagrant haltでVMを停止して設定を見てみます。

仮想メディアマネージャ

$ tree ~/Library/VirtualBox/HardDisks
/Users/komagata/Library/VirtualBox/HardDisks
├── lucid.vmdk
├── lucid_1.vmdk
└── windows_xp_ie6.vmdk

HDDイメージはそれぞれ別々に作ってくれています。

% tree ~/.vagrant 
/Users/komagata/.vagrant
├── boxes
│   └── lucid32
│   ├── Vagrantfile
│   ├── box.mf
│   ├── box.ovf
│   └── lucid.vmdk
├── logs
└── tmp

box(CDイメージとVMのデフォルト設定)の方は共通です。

$ vagrant destroy
$ cd ..
$ rm -rf env2
$ ls ~/Library/VirtualBox/HardDisks
lucid.vmdk windows_xp_ie6.vmdk

vagrant destroyで綺麗に消えるので気軽に作成・削除が出来ます。

作りがシンプルで気に入ってしまいました。当初の目的だったpostgresはデータを救い出したあと要らないのでVMごと消してしまいました。そのぐらい気軽に環境が作れるところがいいですね。

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日をリリース日と決めて、毎月開催してもいいかなと思いました。

月曜日にHeroku-jpの飲み会?に行くのでHerokuネタを。

Herokuを使うには必ず鍵が必要。ちょっと試したいって人には敷居が高いので、使い捨ての鍵作るサービスを作ってみました。

DISPOSABLE KEYS

DISPOSABLE KEYS

GENERATE KEYS押すと、

DISPOSABLE KEYS

鍵が表示される。それぞれ指定の場所に適当なエディタでファイルに保存すればいい。

ソースコード:komagata's disposable-keys at master - GitHub

私有鍵は私有するから安全なのであって、他人に作らせたら意味が無い。あくまで使い捨て用途にどうぞ。1024bit、RSA、パスフレーズ無しで、コード的には下記の2行です。

@private_key = OpenSSL::PKey::RSA.new(1024)
@public_key = @private_key.public_key

標準ライブラリでこんなに簡単に書けるとは知らなかったです・・・。

% irb -rrubygems
>> require 'rack'
=> true
>> Rack::Mime::MIME_TYPES['.csv']
=> "text/csv"

ここにある。

疑問

「忙しい」ことを誇らしげに吹聴する人(ミサワ)と、恥として黙っている人(非ミサワ)がいる。これらは正反対の反応である。何故だろう。

仮定

両者の違いは職能に「スケジューリング」が含まれているかどうかによって生じる。

理由

「忙しい」とは「スケジューリング」が機能していない状態のことである。(職務の果たす役割という意味での)職能にスケジューリングが含まれる職業・役職(管理職等)において「忙しい」とはイコール任務遂行能力の欠如である。

職能にスケジューリングが含まれない職業・役職(作業者等)において「忙しい」とは想定以上に自らの職能が必要とされている状態である。

後者は思春期においては、自己承認欲求を良く満たすため、露骨に発露する。前者においては自己の思春期の未熟さへの嫌悪が「忙しさ」への嫌悪に直結する。

関連

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本体・プラグイン・テーマを作る。

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