GitからLighthouseにチェンジセットを送る

Posted by yatsu Fri, 10 Oct 2008 08:09:11 GMT

GitからLighthouseにチェンジセットを自動で送る方法を探してみたのですが、ちょうどよいものが見つけられなかったので、自分でちょっとしたpost-receiveスクリプトを書いてみました。

例として、以下のような環境を用意します。

% mkdir project
% cd project
% git init
% touch README
% git add README
% git commit -m "Initial commit."
% cd ..
% git clone --bare project

これによって project.git ディレクトリができます。 作業レポジトリは project とし、そこから project.git に対して git push したときにチェンジセットがLighthouseに送られるように設定します。

まず、lighthouse-apiを project.git ディレクトリに置きます。

% cd project.git
% git clone git://github.com/Caged/lighthouse-api.git

RubyGemsでGritをインストールします。

% gem install grit

project.git/hooks ディレクトリに以下の post-receive を作ります。

#!/usr/bin/env ruby

require 'rubygems'
require 'grit'
require File.dirname(__FILE__) + '/../lighthouse-api/lib/lighthouse-api'

# ---
account   = 'foo'
permalink = 'project'
tokens    = {
  'foo@example.com' => '03129063afbb21293e71d873dea6362b67fdf81f'
}
# ---

logger = Logger.new(File.dirname(__FILE__) + '/logs/post-receive.log')
logger.level = Logger::INFO

begin
  rev_old, rev_new, ref = STDIN.read.chomp.split(/ /)
  logger.info "[receive] #{rev_old} #{rev_new} #{ref}"

  repo    = Grit::Repo.new(File.dirname(__FILE__) + '/..')
  commits = repo.commits("#{rev_old}..#{rev_new}")

  Lighthouse.account = account
  Lighthouse.token   = tokens[commits.first.committer.email]

  project = Lighthouse::Project.find(:first, :params => { :permalink => permalink })

  commits.reverse.each do |commit|
    logger.info "[post] #{commit.id}"
    diff      = repo.git.diff({ :name_status => true }, rev_old, commit.id)
    changeset = Lighthouse::Changeset.new(
      :project_id => project.id,
      :revision   => commit.id,
      :title      => "Changeset [#{commit.id}] by #{commit.committer.name}",
      :body       => commit.message,
      :changes    => diff.map {|l| l.split(/\t/) }.to_yaml,
      :changed_at => commit.committed_date
    )
    changeset.save
    logger.debug "[data] #{changeset.inspect}"
    rev_old = commit.id
  end
rescue => e
  logger.error "[error] #{e.message}"
end

このスクリプトのaccount, permalink, tokensを実際の値に置き換えます。

  • accountは、LighthouseのURLが http://foo.lighthouseapp.com/ の場合、「foo」
  • permalinkは、Lightouseの「Edit project」のページで設定したPermalink
  • tokensは、Lighthouseのアカウントごとに生成したトークン

トークンの生成方法はLighthouseのサイトで探してください。 このスクリプトが実行されると、git config user.email で表示されるメールアドレスからトークンを引くので、git config user.email が正しく設定されていることを確認してください。

このスクリプトを実行可能にします。

% chmod +x hooks/post-receive

ログのためのディレクトリを作ります。

% mkdir hooks/logs

以上で設定は完了です。

project ディレクトリから commit, push を行い、動作を確認します。

projectディレクトリに移り、originを設定します。

% cd ../project
% git remote add origin ../project.git

READMEを書き換え、commit し、push します。

% git commit -a -m "Modified README."
% git push

これでLighthouseにチェンジセットが送られます。 もし送られない場合は、project.git/hooks/logs/post-receive.log にあるログを参照してください。

例: チェンジセット一覧ページ

例: チェンジセット表示

Posted in  | no comments | no trackbacks

ruby-pytstをRubyForgeに登録

Posted by yatsu Mon, 04 Jun 2007 07:00:13 GMT

ruby-pytstのソースが行方不明になっていたので、RubyForgeに登録しました。

RubyForge: ruby-pytst

初めてRubyForgeに登録したのですが、WikiとSVNブラウザがエラーになります。なぜでしょうね?

ruby-pytstは、Wiki文章中のキーワード一括置換のために毎日使用していますが、半年以上、安定動作しています。

以下、READMEを載せておきます。

ruby-pytst

ruby-pytst is a port of pytst to Ruby. It is a implementation of Ternary Search Trie (TST) and it also supports scanning by the Aho-Corasick algorithm. It is built with SWIG.

This software is distributed under LGPL.

I have successfully built on the following environments.

  • (1) Mac OS X 10.4, Ruby 1.8.4 (Fink)
  • (2) Fedora Core 5, Ruby 1.8.4

tst_wrap.cxx in this package was generated on (1) with SWIG 1.3.19.

Author: Masaki Yatsu <yatsu at yatsu.info>

Installation

Generate the Makefile.

% ruby extconf.rb

Make it.

% make

Then, install it as root.

% make install

If you want to generate the Ruby wrapper codes from tst.i by yourself, execute the following at the beginning.

% swig -c++ -ruby -Iinclude tst.i

How to Use

There is no documentation at this point, but there is README.html of pytst in the doc directory.

There are examples in the example directory. You can run examples like this.

% ruby example/tokenize.rb

ruby-pytst supports following character sets.

  • ASCII ($KCODE = ‘NONE’)
  • EUC-JP ($KCODE = ‘EUC’)
  • Shift_JIS ($KCODE = ‘SJIS’)
  • UTF-8 ($KCODE = ‘UTF8’)

You have to specify $KCODE before you create a Pytst::TST.

There is the EUC-JP example in the example directory.

% ruby -Ke example/japanese_euc.rb

The option -Ke means $KCODE = 'EUC'.

See also

pytst:
http://nicolas.lehuen.com/download/pytst/

Ternary Search Trie:
http://en.wikipedia.org/wiki/Ternarysearchtries

Aho-Corasick algorithm:
http://en.wikipedia.org/wiki/Aho-Corasick_algorithm

Posted in ,  | no comments | no trackbacks

こんなプロジェクト管理ツールがほしい

Posted by yatsu Sun, 03 Jun 2007 23:46:26 GMT

僕の要求は変かもしれないし、こんな考え方じゃダメとか言われるかもしれないけれど、書いてみる。

  • プロジェクトのタスク管理と個人のToDo管理(GTD?)が連動
    • GTDツールでdoneにすると、プロジェクトのタスクもdone
  • タスクのプライオリティは単純に順番で管理
    • 上にあるものが優先度が高い
    • 緊急のタスクは「critical」とかタグを打てばよし
    • ドラッグで順番入れ替え
  • 着手ビューで着手順に表示(優先度とは別管理)
    • これもドラッグで順番入れ替え
    • 着手しているものをチェック(複数可)
      • 「おれ今これやってるから」(twitter感覚で)
  • タスクに所要日数の見積りを入力
    • 「誰が何日」で入力
      • 人によって所要時間が違うから最初から仮アサインしてしまう
      • アサインされる人が代わったら見積もり直し
    • 見積り日数がマイルストーンまでの日数を超えたらアラート
  • ソースレポジトリ、バグ管理システムと連動(IDで紐づけ)
    • ソースcommit時のメッセージにタスク番号を埋め込み(Tracと同じ)
    • タスクとchangesetがリンクされ、ソースレベルで進捗が確認できる

プログラマの立場から言うと、タスクの順番はなるべく柔軟に入れ替えて効率よくやりたい。→ 誰が何をやっているかちゃんとわかればよし。

線表はあまり必要だと思わない。 依存するタスク(あるチームの進捗が別のチームのタスクに影響するケースなど)も出てはくるだろうが、そのために線表を起こすよりは優先順・着手順の入れ替えで対処してしまいたい(ソフト開発/SIではそれほど依存はないと想定、スタブとか作るし)。

僕が関わるようなプロジェクトでは、こんなツールでうまく対処できるのではないかと思っています。

以下を試してみましたが、決定的なものは見つかっていません。作る?

Posted in  | no comments | no trackbacks

Review Boardを使ってみたのだけど……

Posted by yatsu Sun, 03 Jun 2007 12:59:52 GMT

Review Boardというコードレビュー・ツールを使ってみました。

[ZDNet Japan] Python/Django製のコードレビューツールを使ってみたに書いてあるようにインストールすればよいのですが、Mac, Windowsにインストールしようとしたため、ものすごく苦労しました。

Review Boardそのものでなくて、pysvnのインストールがつらすぎます。 Mac OS Xでビルドがうまくいかず、Makefileをこねくり回してなんとかビルドしインストールしてみたもの、import pysvnするとPythonがクラッシュ……。

それ以上調べるのはつらいので、Windows + Cygwin環境に入れてみようとしたのですが、今度はPILのビルドに

rebase -b 0x1000000000 /bin/tk84.dll

という謎の呪文が必要だったり、pysvnのコンパイルにminires-develが必要だったり、さんざん苦労したあげく、起動したらエラーであきらめました……。

結局、Ubuntu Linux 7.04を使って、やっとインストールが成功しました。 pysvnをビルドするためにlibc6-dev(libresolv.so)をインストールする必要がありましたが、それ以外はすんなりいきました。

で、使い方はドキュメントがないので、よくわかりません。

新しいレビューリクエストの登録は以下の画面で行います。

Subversionの場合、トップディレクトリでsvn diffして保存したファイルをアップロードすればよいのでしょう。Base Diff Pathは、「trunk」とか入れるのだと思います(trunk/branches/tagsの構成の場合)。

以下のように、diffのリビジョンの部分に日本語が入っているとエラーになります。

Index: javascripts/prototype.js
===================================================================
--- javascripts/prototype.js    (リビジョン 1)
+++ javascripts/prototype.js    (作業コピー)

LANG=C svn diff で回避しました。

Index: javascripts/prototype.js
===================================================================
--- javascripts/prototype.js    (revision 1)
+++ javascripts/prototype.js    (working copy)

以下の画面でレビュアーを指定して、説明を書きます。

レビュアーのアカウントでログインし直すと、以下のようにリクエストを確認できます。

えーと、ここからどうすればよいのかわかりません。 「Delete」ボタンしかないように見えるのですが……。 コメントを書き込んだりする機能とかないんですか?

使い方が間違っているのでしょうか……。

diffは画面上で以下のように確認できます。

まとめ

  • まだ使える品質でないようです
  • ドキュメントがないので、使い方がわかりません
  • インストールが大変です

Posted in  | no comments | no trackbacks

Vim環境構築とjst.vim (for TrimPath JavaScript Templates)

Posted by yatsu Fri, 01 Jun 2007 08:54:00 GMT

最近わけあってWindowsを使わなければいけない状況となりまして、テキストメイ党の私はエディタの選択に困り果ててしまったわけです。 E-TextEditorというTextMateクローンがあるのですが、フォントを変えられないなど、イマイチ。 Emacsはよいのだけど、elispでごりごり設定するのは、この歳になると正直しんどい。 設定が簡単で満足できる環境が作れるものを探した結果、Vimに落ち着きました。 エディタがVimのくせに、エディタ以外はXKeymacsでEmacsキーバインドにしているという変態具合ですが、それはよし。

以下の設定をしました(主にJavaScript関連)。

jst.vim

さて、エディタは決まりましたが、TrimPath JavaScript Templates(JST)を使うので、これ用のシンタックス・ハイライト機能がほしいです。

ということで、作りました。→ jst.vim

Vimのsyntaxディレクトリに放り込んで、~/.vimrc に以下の設定をします。

augroup filetypedetect
au! BufRead,BufNewFile *.jst setfiletype jst
augroup END

これで拡張子 .jst のファイルに対してJSTのシンタックスが有効になります。 拡張子 .html のファイルで使う場合は、同様の設定を .html に対しても行います。

eruby.vimを書き換えてでっちあげたもので、シンタックス・ファイルの書き方もちゃんとわかっていないですが、マークアップ({}${})の中のJavaScriptシンタックスも効いているようなので、とりあえず使えそう。

surround.vim拡張

surround.vim用の拡張を ~/.vimrc に書きます。

autocmd FileType jst let g:surround_123 = "{\r}"
autocmd FileType jst let g:surround_36 = "${\r}"
autocmd FileType jst let g:surround_37 = "${% \r %}"

上から、「{」,「$」,「%」キーに対応しています。 例えば「yss{」で現在行を {} で囲んだり、入力モードで「<c-g>s%」で ${% %} を入力したりできます。

ctagsでJavaScript使用

MMOをajaxで作りたい人のブログ: Javascriptの環境整備2。を参考に、~/.ctagsに以下を設定。

--jcode=utf8
--langmap=javascript:.js
--regex-javascript=/^(.*).prototype *= *(.*)/\1/o,object/
--regex-javascript=/^[ \t]*(.*) *: *function/\1/o,object/

これで hoge: function() {} のような関数定義も拾ってくれるっぽい。

javascript.vimの変更

JavaScript用syntaxをちょっと変更 | 東京嫉妬のようにjavascript.vimを書き換えると、JavaScriptのシンタックス・ハイライトが改善できます。

Posted in  | no comments | no trackbacks

Fink: gonzui, bdb-rb

Posted by yatsu Mon, 09 Apr 2007 04:22:08 GMT

gonzuiと、それが使用するbdbライブラリのfinkinfoを作成しました(探しても見つからなかったので……)。

こちらからどうぞ:
http://yatsu.info/finkinfo/

/sw/fink/10.4/local/main/finkinfo ディレクトリに devel, libs/rubymods のようにサブディレクトリを作り、その中に .info ファイルを置いて、fink install します。

% fink install bdb-rb gonzui

gonzuiはdaemonicに対応した方が親切だったかもしれませんが、今回は対応していません。

Posted in , ,  | no comments | no trackbacks

Cocoa Browser SNのスティッキー機能

Posted by yatsu Sat, 10 Feb 2007 02:08:10 GMT

Cocoa APIを調べるのに Cocoa Browser SN を使用していますが、これに新しく搭載されたスティッキー機能がものすごく便利です。

EIJIRO mini の人気機能の「スティッキー機能」を搭載。APIドキュメントの好きな部分のスティッキーを作成して、画面の好きなところに置いておけます。
Numata Designed Factory - Cocoa Browser SN

Posted in ,  | no comments | no trackbacks

RailsでMCImageManger, MCFileManagerを使う

Posted by yatsu Sun, 29 Oct 2006 01:21:30 GMT

JavaScriptで作られたHTMLエディタはいくつかありますが、僕はTinyMCEが好きで、よく使っています。 Railsアプリに組み込むのも簡単で、少しJavaScriptコードをいじるだけで、AjaxでロードしたテキストエリアにTinyMCEを組み込むこともできます。

TinyMCEがさらにすごいのは、MCImageManagerMCFileManagerというプラグインをもっていることです。 MCImageManagerは画像をアップロードすることができ、GDを使ってサムネイルも作ってくれます。 MCFileManagerは想像どおりの機能をもっています。 また、MCImageManagerとMCFileManagerは相互に連携することが可能です。

これらは単にTinyMCEのプラグインというだけでなく、単独でアプリに組み込むこともできるのが素晴らしいです。 どちらも売り物なので買わなければなりませんが、値段は高くないので、充分買う価値はあると思います。

MCImageManagerとMCFileManagerはこのように素晴らしいものですが、PHPで作られているというのがひとつの難点です。 ファイルをアップロードするときはたいていユーザー認証が必要となりますが、組み込み元のアプリがRailsの場合、それを実現するには、PHPからRailsのセッションとユーザー権限を参照しなければなりません。 そのやり方については、TinyMCE Forumに質問されているのを見つけましたが、具体的なやり方は見つかりませんでした。 ということで、ここに僕のやり方を書いておきます。

MCImageManager/MCFileManagerは認証の枠組をもっており、プラグインという形でそれを拡張できるようになっています。 そのため、コードをどこに記述し、どのように拡張するかは問題ではありません。 PHPとRailsでのセッション/権限情報の受け渡しだけが問題となります。

セッション/権限情報の受け渡し方法としては以下の2つの方法が考えられます。

  1. RailsのセッションをDBに保存し、PHPがそのセッション情報と権限を取得し認証する
  2. PHPからRailsにHTTPリクエストを送ってRails側に認証させる

まず1を検討します。 セッション情報をDBに保存するには、config/environment.rb で

config.action_controller.session_store = :active_record_store

とするだけでよいので非常に簡単ですが、セッションに保存されたデータは sessions テーブルの data フィールドに Marshal.dump の結果が格納されます。 セッションが有効かどうかチェックするだけであれば問題ありませんが、セッションからユーザー情報を取得し権限をチェックする必要がある場合、data フィールドの中身を Marshal.load しなければなりません。 PHP自身でそれをやるのは困難ですし、Rubyのスクリプトを作って呼び出そうとすると、Railsのライブラリ群をロードしなければならず(それがないとクラス情報が足りなくてエラーになります)、起動に時間がかかってしまいます。

sessions テーブルにカラムを追加してユーザー情報を取りやすくすることもできないわけではありませんが、ActiveRecordをこのために拡張するのはきれいでないし、実装も面倒です。

1は難しそうなので、2の方法を検討します。 RailsのセッションIDはCookieの _session_id で渡されており、MCImageManager/MCFileManagerを開いたときもこのCookieが渡されるので、PHPからRailsのセッションIDを取得することは可能です。 このセッションIDをCookieにセットして、PHPからRailsへ、ローカルホストのWebサーバーを介してリクエストを送って認証結果を返してもらえばよさそうです。 PHPにはCURLライブラリがあるので、HTTPリクエストを送るのは簡単です。

ということで、2の方法で実装することとします。

Read more...

Posted in ,  | no comments | no trackbacks

ruby-pytst-0.3.1 (bug fix)

Posted by yatsu Sat, 14 Oct 2006 23:45:19 GMT

2007-06-04 追記 ダウンロードはこちら → yatsu.info : ruby-pytstをRubyForgeに登録

ruby-pytstを更新しました。

TSTに入れてあるオブジェクトがGCで開放されてしまうという、重大でしょうもないバグを修正しました……。

今回はバグ修正だけです。

Posted in ,  | no comments | no trackbacks

ruby-pytst-0.3

Posted by yatsu Fri, 13 Oct 2006 22:38:47 GMT

2007-06-04 追記 ダウンロードはこちら → yatsu.info : ruby-pytstをRubyForgeに登録

ruby-pytstを更新し、pytst-1.14に対応させました。

Posted in ,  | no comments | no trackbacks

Older posts: 1 2 3 ... 26