vimでRSenseの補完ができない件で悩んでいたけどとりあえず解決できた

環境はWinXP/香り屋さんのvim7.3/RSense3.0/Ruby 1.9.3です。
RSenseをセットアップして、vimからRSenseVersionできるのに、補完が効かない。
C-x C-o でオムニ補完すると、「パターンは見つかりませんでした」と出る。

実は2週間だらだらとできないなーと悩んでいたのですが、腰を据えてトラシューしてみたら、原因が判明して、動作するようにできた。

状況の整理

    • vimからRSenseVersionするとちゃんと3.0と表示される
    • vimからRSenseServiceStartとかRSenseServiceStopができてる
    • %RSense_HOME%/rsense-service.logを見ると、vimから補完したタイミングでログ出力されているが、特にエラーっぽいログは見当たらない
    • だけど、オムニ補完(C-x C-o)すると「パターンは見つかりませんでした」といわれてしまう

調べたこと

ログは次のように出ているわけです

recv: code-completion --file=C:\DOCUME~1\ZZTSAS~1\LOCALS~1\Temp\VID331.tmp --location=5:5 --prefix= --detect-project=test.rb

test.rb

# RSense completion test

def test
	str = "testdesu"
	str.
end

str.まで打って、オムニ補完した。
その結果

で、vim->RSenseへの処理を調べてみた。この時点ではvimからRSenseに補完のリクエストが出ているけど、受け取るときとかに問題が出ているのではないかと予想

vimスクリプトよく知らないけど、眺めてみた。

オムニ補完すると、rsense.vim の RSenseCompleteFunction が呼ばれるらしいのでそこを見る

function! RSenseCompleteFunction(findstart, base)
    if a:findstart
        let cur_text = strpart(getline('.'), 0, col('.') - 1)
        return match(cur_text, '[^\.:]*$')
    else
        let result = split(s:rsenseCommand(['code-completion',
                                            \ s:rsenseCurrentBufferFileOption(),
                                            \ s:rsenseCurrentLocationOption(),
                                            \ '--prefix=' . a:base]),
                           \ "\n")

となっていて、rsenseCommand を呼び出している。

function! s:rsenseCommand(args)
    for i in range(0, len(a:args) - 1)
        let a:args[i] = shellescape(a:args[i])
    endfor
    return s:system(printf('ruby %s %s %s',
                           \ shellescape(s:rsenseProgram()),
                           \ join(a:args, ' '),
                           \ shellescape('--detect-project=' . bufname('%'))))

これをみると、s:system でコマンド実行しているようだ。
ということは、ログに出ていたのはこの部分で、コマンド実行されているだけってことか。ということで、ログの出力の先頭にs:rsenseProgramから戻ってくる結果をくっつけて、%RSense_HOME%で実行してみた

FileNotFoundException とは。。。
そして、エラーメッセージのファイル名に「¥」が無い。。。そうか!!エスケープシーケンスが悪さしているんじゃね?

で、コマンドラインをちょっと細工(¥→¥¥に。RSenseはJavaだからねー)

おー。補完されてるっぽい!

ということで、rsense.vimに細工
ぐぐると文字列の置換はsubstituteを使えばいいっぽい。
http://route477.net/w/?VimScriptMemo

--- C:/Program Files/vim73-kaoriya-win32/vim73/plugin/rsense.vim.original	Tue Sep 25 23:14:19 2012
+++ C:/Program Files/vim73-kaoriya-win32/vim73/plugin/rsense.vim	Sat Sep 29 05:00:41 2012
@@ -37,7 +37,7 @@
 
 function! s:rsenseCurrentBufferFile()
     let buf = getline(1, '$')
-    let file = tempname()
+    let file = substitute(tempname(), "\\", '\\\\', 'g')
     call writefile(buf, file)
     return file
 endfunction

これで補完ができるようになった。

やっとできて、すっきりしました~

いやーRSenseステキ〜!!vimステキ〜!!

GDD11JP DevQuiz解答晒し祭り:WebGame用ChromeExtension 意味なく公開


巷で流行っているそうですので、わたくしも晒します。


分野別クイズはWebGameとGoをやりました。
スライドパズルは519個しか解けませんでした。幅優先検索をスタートとゴールから実施して、マンハッタン距離(壁無視)でコストを出して、コストが低いものから解くようにしたという感じです。60秒で解けないものはあきらめるという作戦で、一晩動かしてそんなスコアです。よってこれは晒さない。


TF枠で当選していたこともあり、スライドパズルはその辺でやめてしまいました。
TF枠なんで当選したのかは等の本人も首をかしげる状態です。何基準なのでしょうか。

GO!

GOははじめて書きましたが、こんなのでいいのでしょうかね。。

package main

import (
    "fmt"
    "io"
    "strings"
    "image"
    _ "image/png"
)

func CountColor(png io.Reader) int {
    img, _, _ := image.Decode(png)
    rect := img.Bounds() //Rectangle

    //Colorを記憶するMap
    colors := make(map[string] string)

    for x := 0; x < rect.Max.X ; x++ {
      for y := 0; y < rect.Max.Y; y++  {
        //fmt.Println(img.At(x, 3))
        r, g, b, _ := img.At(x, y).RGBA()
        srtRgb := string(r) + "," + string(g) + "," + string(b)
        colors[srtRgb] = srtRgb
      }
    }
    //fmt.Println(len(colors))
    return len(colors)
}


コンパイラのインポートエラーがよくわからなかった(_ "image/png")のところ。今もちょっと良くわかってないw
あと、Try&Errするのに、以下が役に立ちました。特に環境がなくてもブラウザで動かせたので。
http://golang.org/doc/play/

Web Game

ChromeExtensionは以下に公開してみました
https://chrome.google.com/webstore/detail/hchabofhnbmpbeoocneocmlehpcflmbh?hl=ja

中身は結構かんたんです。
こんなの書きました。jqueryを使ってます。

solver.js

//[id1, id2]を格納していく。キーはcolorの値を使ったHash
var colors = {};

//カードを1枚ずつあけていく処理
var elements = $("div.card");
elements.each(function(){
	var self = $(this);
	self.click(function(){
		var _color = self.css("backgroundColor");
		var _id = self.attr("id");
		console.log("id=" + _id + ", color=" + _color);
		if (!colors[_color]) {
			colors[_color] = [];
		}
		colors[_color].push(_id);
	});
	clickEvByDom(this);
});

//console.log(colors);

//同じ色ごとにクリックしていく
for (var arr in colors) {
	console.log("arr:" + arr);
	elem0 = $("#" + colors[arr][0]).get(0);
	elem1 = $("#" + colors[arr][1]).get(0);
	clickEvByDom(elem0);
	clickEvByDom(elem0);
	clickEvByDom(elem1);
}

//jQueryのClickではNGなのでDOM経由でClickする
function clickEvByDom(elem) {
	var clickEv = document.createEvent("MouseEvents");
	clickEv.initEvent("click", false, true);
	elem.dispatchEvent(clickEv);	
}

とりあえず、1枚ずつあけていって色とIDを記憶して、同じ色同士をクリックしていくという単純な戦略です。この程度であっさりといけてしまった。


これをExtensionとして組み込むために、マニフェストを書きます。

{
  "name": "GDD11JP Web Game Solver",
  "version": "1.0",
  "description": "google developer day 2011 jp Web Game solver.",
  "content_scripts": [
    {
      "matches": [
        "http://gdd-2011-quiz-japan.appspot.com/webgame/problem*"
      ],
      "js": [
        "jquery-1.4.4.min.js",
        "solver.js"
      ],
      "run_at": "document_end",
      "all_frames": true
    }
  ]
}

JSON形式ですね。ポイントは

    • matchesのところに、実行したいURLを指定
    • jsのところに、jquery.js -> solver.js の順番で指定(逆は駄目)

ぐらいですね。
マニフェスト書く上での注意点は、コメントアウトしては駄目とか、余分なカンマを打たないとかですね。

実際にローカルで作るときは、マニフェストとJSを同じフォルダに置いてchrome://extensions/ で、デベロッパーモードにして、そのフォルダ読み込めば動きます。Greasemonkeyと違って、Extensionを修正したら、chrome://extensions/再読み込みしないと駄目で、これをいちいち手でやるのが面倒ではありますが、結構手軽に作れますね。



それにしても、Chrome Web Storeに公開するときに、1280x800のスクリーンショットが必須とか、128x128のアイコンが必須とか、メンドクサイなと思います。デフォルトの何かを提供してくれたり、適当にリサイズしてくれればうれしいんですけれどね。こんなことぼやくとガイドラインに反するって怒られたりして。。。

夏の節電に向けてLinux物理サーバーを直接仮想化する

政府が電気の大口需要者に対して夏のピーク時の電力使用量を前年比25%減らすように言われているようで、うちの会社でも、サーバーの消費電力削減という話がありました。

そこで複数台のサーバーを1つの仮想サーバーにまとめると結構いい節電対策になりますのでやってみます。
移行時に1からインストールして、環境を復元しても出来ますがかなり手間です。
ということで、P2Vします。物理サーバーを直接仮想化することをP2Vとか言ったりします。
VMware vSphere Hypervisor(ESXi)とVMware vCenter Converter Standalone 4.3の環境でLinuxサーバー(CentOS5)をP2Vしてみます。

注意点としてLinux LVMで構成されている物理サーバーをConverterを利用してP2Vすると、問答無用に非LVMなパーティションに変換されてしまいます。

LVMをパーティションサイズの拡大を後から行えるようにという要件で設定している場合があると思いますが、オンラインでのサイズ拡大にこだわらなければ、LVMでなくてもGpartedなどのフリーなパーティション操作ツールを使ってオフラインで拡大すれば良いという判断も出来ます。
ハードディスクがESXiによって仮想化されているので、複数のディスクを束ねて一つにまとめられるというLVMの利点は薄れていますね。直接仮想ディスク(vmdkファイル)の容量を拡大してしまえるので、仮想ディスクの容量を拡大したあとにオフラインでGPartedでパーティション拡大してしまえます。
極力サーバを運用したまま容量を増やしたい要件がある場合は、この手順ではなく、Mondo Rescueなどを使って一旦ディスクイメージのバックアップを取ってから、仮想マシンへリストアしてLVMを維持するなどの方法を検討したほうが良いです。またLVMのスナップショットが必要という要件もあるかもしれませんが、同様ですね。。

必要なもの

  • ESXiサーバー

あらかじめESXiを導入しておきます

  • VMWareConverter4.3を導入した別WindowsPC

ConverterはVMWare社からダウンロードします info
注意点として、VMWareConverter 4.3へ4.0.xからアップグレードインストールすると、LinuxのHotP2Vが動かない問題があります(LinuxソースをConverterで指定すると[ライブ Linux ソース マシンをクエリできません]というエラーメッセージが出て先に進めない)。必ず4.0.xをアンインストールしてから4.3を新規インストールします。 デスクトップ、アプリケーション、データセンター仮想化のための VMware のサポートとダウンロード

変換を行っているときに、ヘルパーサーバーというのが裏で起動するらしいです。おそらくそれが利用するものです。DHCP環境なら意識する必要はありませんが、そうでないときはIPアドレスサブネットマスクデフォルトゲートウェイアドレスの指定が必要です

  • 変換対象の物理サーバー(今回はCentOS5)

サポートされるゲストOS(デスクトップ、アプリケーション、データセンター仮想化のための VMware のサポートとダウンロード )に直接の記載はありませんがRedHatがサポート対象なので、良しとしています。

  • ゲストOSへRootユーザーでSSH接続して変換処理を行うので、
    • rootアカウントのパスワード
    • SSHの設定を変更してrootログイン許可する(/etc/ssh/sshd_config のPermitRootLogin yes)
  • 必要なら移行用にもう一つのIPアドレス

移行元サーバーと移行先を並行運用する場合に必要に応じて用意します

作業手順

VMware Converterを適当なWindowsPCに導入します
移行元サーバーの前準備
  • 移行元CentOSで外部から更新が起きないようにhttpdNFSなどのサービスを停止します。また、可能な限りサービスを停止させます
    • 特にデータベースはとめておいたほうが良いです。
    • ただし、移行時に必須なのでSSHは停止しません
  • SSHでrootユーザのログインを許可する
#vi /etc/ssh/sshd_config
    • SSHを再起動させる
#service sshd restart
Converterで変換する
  • マシンの変換をクリック


  • まずソース(変換元)のIPアドレスやrootアカウント情報を入力する


  • 次にターゲット(ESXi)のIPアドレスやアカウント情報を入力する



  • 仮想マシンのファイルを格納するデータストアを指定する


  • オプションの画面で大事な設定が2つあります
    • 仮想ディスクファイルの容量をあらかじめ確保しないようにする(フラット→シンにする)。詳細のリンクをクリックして、タイプを「シン」にする。フラットのばあい、100GBの仮想ディスクを作った時点でデータストアの容量を100GB消費しますが、シン(シンプロビジョニング)にすると、実際にファイルとして使用した容量が消費されます。


    • もう一つがヘルパーVMネットワークの設定。この設定を間違えると変換タスクが1%から先に進まなかったりします。。


  • 内容を確認して終了をクリックする。変換作業が始まる。


  • しばらく待つと仮想化されます。

CentOS5の開発機(HDD使用量47GB)が1時間40分で仮想化されました。

以上で終わりです。
Converterのアップグレードインストールの件と、ヘルパーVMの設定に気づかなくて多少時間をロスしてしまいましたが、それ以外はすんなりと変換できてよかったですよ。

HT-03A +Cyanogenmod 6.1 + Maps5.0hack版 で Maps5.0の新機能(3Dやコンパスぐりぐり)を有効化する

先日公開されたGoogle Maps 5.0ですが、すばらしい機能がついてますね。
以前、ヘッディングアップのGoogle Mapsのサンプルを作ってみたこともありましたが、もうそんなもの要らなくなりました。
一部新機能はAndoroid2.0以上みたいでしたが、自分はCM6.1だからね。へへん!って思ってたのです。
で、Updateが来て!やったー!!!とおもった数分後に絶望が。3Dはどこ行った?

気を取り直して、CMのForam見ると、情報が・・・
http://forum.cyanogenmod.com/topic/12628-map-50-update/page__view__findpost__p__107221

どうもGoogle Maps 5.0の新機能はデバイス情報から3Dなどの新機能の有効・無効を切り替えているらしいです。
強制的に追加機能を有効にするHackがXDAにありましたので、試してみました。
でも、やっぱりパフォーマンス不足らしく、新機能は動作しますが重いです。とくに3Dで渋谷を表示すると激重です。。

前提
  • Root化し、ROMをCyanogenMod6.1などAndroid2.0以上にする必要があります。
  • PCでの作業が必須のようです。開発環境を整備し、USBケーブル経由でadbが使えるようになっている必要があります(Hack版のAPKを端末上でインストールすると何故かインストール不可でした。)
  • すべて自己責任になります。操作を誤ると端末が使えなくなる可能性が考えられます。また端末の保障もなくなると思いますのでご注意を。
手順
  • 万一のためにバックアップを取得します。ROMごとバックアップするとか、Titanium BackupでMapsをバックアップするとか。
  • HackバージョンのGoogleMaps5.0をPCにダウンロードします

http://forum.xda-developers.com/showpost.php?p=9868137&postcount=2079 にある、maps5.0.0.5014-brutdev.apk です。

 adb remount
 adb shell "find /system /data -name *com.google.android.apps.maps.apk* -o -name Maps.apk | xargs rm"
 adb uninstall com.google.android.apps.maps
  • adb経由でHack版をインストールする
 cd [ダウンロード先フォルダ]
 adb install maps5.0.0.5014-brutdev.apk
  • 端末でGoogle Mapsを開く
  • 通知バーに△マークの通知が出たら、クリックしてGoogleアカウントへのアクセスを承認する
  • GPSをONにして、現在地が特定されると画面右上の現在地ボタンがコンパスのような見た目に変わります。タップすると3D表示でコンパスよってグリグリ動きます。
スクリーンショット
  • 新機能

  • 渋谷の3D。ちゃんと描画できていない部分が・・・



・・・新しい端末がほしいなぁ

迷惑電話対策Androidアプリケーション MeiwakuBaster を公開しました

不動産投資の勧誘電話、かかってきませんか?
以前から会社の電話にはかかってきていましたが、いつからか私用の携帯電話にもかかってくるようになりました。心当たりといえば、知らない電話番号からの着信に出る際に自分の名前を先に名乗り、直後に切断されたことがあったということ。録音でもされていたのかも。。。電話に出るときには先に名乗ってはいけないというのが常識になりそうで、いやな世の中ですね。。

とにかくいろいろな番号から、市外局番で言えば、東京、横浜、大阪などからたまにかかって来ます。
せっかくスマートフォンを持っているのだから、何かアプリは無いかと探してみると、あるにはあるのですが、あらかじめ着信拒否の電話番号を登録する必要がありました。という事は一回は電話に出なければいけないということです。
そこに問題点を感じ、今回公開したMeiwakuBasterを作りました。電話着信時にGoogleで検索し、その結果から迷惑電話かどうかの判定を通知バーに表示します。

詳しい機能説明やインストールについては MeiwakuBaster サポートページ を参照ください。

もしよろしければ、使ってみてください!

shibuya.trac 第8回勉強会に参加してきました

ブログ書くまでが勉k(ry とか言われていたりしますが、最近は、次の勉強会でLTするまでが勉強会らしいです。。。
前回に引き続き、2回目の参加でしたが、楽しかったです。ビールのみながら、まじめな話と楽しい話と、同じことに問題意識を持った人が集まっていて、共感できて。そういう雰囲気でした。

以下、私なりのメモです

前説: Ruzeeさん

  • Shibtraとは
    • 企画会議なし!
    • しゃべりたい人がしゃべる!
    • 初心者歓迎!
    • 2、3ヶ月に1回は開催!

発表

分散開発におけるTrac: こんぴろさん
  • 個人的な意見です
  • 言いたいこと = はさみとツールは使いよう
    • 下手に使うと足かせだと
  • 現在のプロジェクト
    • 東京都福井で分散開発(320km離れている)
    • 地理的に離れた場所=分散開発
  • ところで、アジャイルマニフェスト
    • プロセスやツールより個人との対話
  • けど、320kmはなれたら
    • 個人との対話をプロセスとツールで補う!
      • ★なるほど
  • Tracはマクロ、プラグインが豊富でいい
  • FullBlogPlugin
    • 主に朝会
    • 画面見ながら、Skype
    • 昨日やったこと、今日やること、連絡を”事前に”書いておく
  • TagsPlugin
    • Wikiにタグを付ける
    • Blogにカテゴリの機能がつく
  • TracWysiwygPlugin
    • Wysiwyg!
    • ★うちも愛用してます!
  • Mikogo (http://www.mikogo.com/)
    • フリーのデスクトップ画面共有ツール
    • 朝会で活躍中
  • デモ
    • ChromeのExtensonでチケットにログを書く
    • Mikogoで共有
  • 最後にもうひとつ
    • いいやり方を知ると、原理主義になりがちだけど、自分たちのコンテキストに合わせて変えていく!が重要だね
HudsonとAutoItで自動テスト: こかわさん
  • 初参加
  • アンケート
    • Hudson知ってる?
      • みんな手が上がる。
    • Hudsonつかってる?
      • 半分ぐらい
    • 自動操作テストを導入している?
      • すくない
    • クライアント系?Web系?
      • Web系多し
  • Hudson自体の説明は省略
  • 自動操作テストをHudsonでやりましょうという話をする
  • (っと、ここでピザ到着。そして中断)
  • AutoItで自動操作テスト
    • フリーツール
    • Windows上のGUI操作を自動化できるBASICライクなスクリプト言語
    • アプリの起動、ウィンドウの監視、キー入力、ウィンドウキャプチャ
  • AutoItでできること
  • デモ
    • IEを起動して、Google検索
      • フォームの読み込み待ちは勝手に判断してくれるらしい
    • Windowへの操作はWindowハンドルをキーとして判別
      • ほかのWindowが前面にあってもエラーとならない
    • Hudsonでエラーが出た→バグ管理システムの自動登録を作ろうとしている
    • IE以外は公式サポートなし
Tracで今日からはじめるスクラム/アジャイル開発: kawaguchiさん
  • アジャイルの姿勢
    • 共感
    • 透明性
      • 見える具合を維持するのは結構大変ですよね
    • 実測駆動
      • 一回やった結果から、次はこれくらい!
  • スクラム
  • スクラムの源流
  • いい資料
  • 姿勢を維持するには、プラクティス
    • チケット駆動(TiDD
    • タスクボード+付箋(=チケット)
      • Not Planned
      • TODO
      • In Progress
      • Done
    • ハレパネ(スチレンボード)がお勧め
      • A1かA2サイズ。A0はでかくてやめた
    • ポストイット
      • 強粘着を必ず使う!
    • チケットの書き方(フォーマットについて)
  • 運用
    • 先にポストイットをつくる
    • それをTracのチケットに登録し、チケット番号アサインしたうえで、付箋に記載
    • 朝会にて確認し、根家手入るものはTracへ入れて、チケット番号を振る
    • チケットの種別を
      • 色でわける
        • 普通のチケット
        • 割り込み仕事
        • 期限が決まっている仕事
    • 朝会
      • 昨日やったこと
      • 今日やること
      • 困っていること
      • 朝会の内容が、チケットとちゃんと対応していること!
  • 見積もり
    • チケットの右上に見積もった工数を記載
    • プランニングポーカー
    • ポーカーで、せーのドンで各自の思う工数を提示する
      • どうしてその工数
      • みんなで共有して、
        • 全員参加、相対規模、近くは詳細で正確
TracAgile開発
  • Ruzeeさん
  • かわぐちさんとかぶる
  • よくある話
    • Tracつかったから。Hudosonつかったからアジャイル
      • これは違うと
    • 大事なこと
    • ラクティスをしていないからアジャイルではないということじゃない
      • ラクティスは助けるための道具
    • 頻繁に継続的に顧客のニーズにあった高品質なソフトウェアを届けることができれば、方法論は何でもいい!
    • アジャイル
      • 全員同席
        • 顧客も
        • 全員同席なら、ツールより、アナログな方法(チャートとか)のほうがいい!
        • 同席が難しい=ツールのサポートが必須
  • どうやってTracを使うか
    • プロジェクトの最初から使おう!
    • Tracが「場」になるように!
    • 立ち上がりが重要
      • 提案からスプリント0までが重要
      • スタート肝心!
  • 提案からスプリント0まで
    • 営業用Tracを作る
      • 客先に何聞いたとか
    • 案件用Trac(顧客公開用)
      • プロジェクトに関するリスクも盛り込む
      • メールのやり取りの前に公開して、Tracを使ってもらうように
      • Tracを真ん中に置く
  • Tracを顧客に公開する目的
    • 情報の一元化
    • 信頼の構築
      • 隠さない
  • スプリント0にやってること
    • Tracの立ち上げ
    • メーリングリスト
    • 仮想化した開発環境の配布
    • SCM
    • コーディング規約
    • 製品ビジョンの確認
    • おおまかなリリース計画
    • スプリントの期間と回数
    • Doneの定義
      • 終了の定義をきめる。プロジェクト(顧客ごと)に品質の定義がことなる
      • タスクのDone・プロジェクトのDone
  • スプリント中
    • 朝会の内容を事前にWikiにかく
    • ふりかえりの内容(ホワイトボード、デジカメにとる
    • 仕様メモ、手順などをWiki
  • プロダクトバックログTracで(Agilo)
  • Tracを使い続ける
    • 二次開発、保守でも、初期のTracを使う
      • ナレッジの分断を防ぐ
    • ゴミ箱にしない努力
      • チケット見て(毎日)たな卸し!
        • 放置したチケット数は不健康なプロジェクトを計る指標かもしれない

LT

神速さん: 5分でわかるTracPluginの作り方
  • いきなりの敗北宣言!(5分じゃ無理!)→爆笑
  • Pluginの仕組み
    • Python/JS/CSS/HTML
    • 特定のタイミングで動く
    • どのページで動かすか
    • どのJS/CSSを追加する?
      • CSSで書くこと
      • ケーキ!!!
  • 実例
    • ねたを決める
      • WorkFlowEditorPlugin
        • Web上からTrac.iniを弄る
        • ステータス変更以外はできない→できたらすごくない?

(っと、ここで時間切れ!)

ゆかわさん: Tracのソースを呼んでみたー
  • プラグインの作り方
    • Componetを拡張
    • 拡張ポイントを実装
  • アーキテクチャ
    • 拡張が容易な
    • Trac自身もプラグインとして実装
      • Adminモジュール
      • チケットモジュール
      • Wikiモジュール
    • 実現してるのはCore.py
  • Plugin処理フロー
    • TicetSubmitPolicyPlugin
  • まとめ
    • EclipsePlugin開発みたいな良書がほしい!
とらっくじら: ショーンさん

(TracとJIRA)

  • あとらしあんの中のひと
    • JIRA
    • Banboo=CI
  • 課題管理のシェア
    • 65%ぐらいはExcelだよね
    • けど課題管理はExcelでは問題あるよね
  • 当たり前だけど、できてないこと
    • 課題管理にはExcelでは無く課題管理ツールつかおうよ!
  • Excelをやめられない理由
    • 習慣
    • みんなで課題管理ツール使って変えて行きましょうよ
  • 宣伝
引越しのタスクをBTSで: ikikkoさん
  • かかわるひと
    • おくさんと(非ITの一般人
      • 一般人www
  • バックログで管理
    • 40チケット
    • 引越し前22件
  • 心がけたこと
    • シンプルに!
    • リアクションをする!
      • 奥さんがチケットをクローズしたら、「ありがとう」とかリアクション
    • レールを敷く
    • 振り返る
  • 良かったこと
    • チケットをクローズするのが気持ちいいと奥さんに実感してもらえた
    • どこからでもWEB経由でみれる
RedminでもTracLightnig: かおるんさん
  • TraclightingになれるとRedmineはインストールが大変
  • 楽なのを探すと
  • 思いついた!
    • TraclightingにRedmine入れる
      • BitNami::いれて、Portを変える
WikiMacro3分間クッキング: riskさん
  • TracWiki見てますか?
    • どうやって書いたら?
    • 使いづらい?
  • 小人さんが住んでる?
  • Wikiマクロで盛り上げよう
    • すみませんマクロ
      • 素直に謝れる男を目指すとかw
    • 材料
      • 下ごしらえ
      • Wkiマクロ用のテンプレ
        • Template.py
      • Sumimasen.py
      • SumimasenMacro
      • 時間切れーーー
すいぎんとう: @itouakihiro
  • MercurialTrac
  • TracMarcurialを使うのはすごくメンドクサイ
  • そこでhglight:
  • インストールが簡単!
  • hgの問題
  • 日本語の処理が辛い
    • 日本語のファイルが駄目
    • JamCircle

後説

  • Ruzeeさん
    • 次回未定
      • 年末か年始
      • 会場、発表者募集
    • かえってブログ書くまでが勉強会
    • ていうか、次回LTやるまでが勉強会
    • TracLightnig3.0
      • アルファ版テストご協力を!

trac 0.12 のマルチリポジトリでrefs #1をうまく動かす Multi Repository Helper Plugin を作りました

Tracはバージョン0.12でマルチリポジトリに対応しています

設定はこんな感じですね。

  • Trac0.12の配布アーカイブ内にある contrib/trac-svn-hook スクリプトを適当な場所に配置する
    • この例では、/opt/trac-0.12/hooks としています。環境に合わせて読み替えます。
  • #{SVN_ROOT}/#{PROJECT}/hooks/post-commit を作成します
    • 環境変数TRAC_ENVにtracのプロジェクトディレクトリへのフルパスをコロン「:」区切りで複数指定します
    • 実行権も付与します(chmod +x)
#!/bin/sh
#
REPOS=$1
REV=$2

export TRAC_ENV=/var/www/html/trac012/proj1:/var/www/html/trac012/proj2
/opt/trac-0.12/hooks/trac-svn-hook $REPOS $REV


上記のように複数のTracプロジェクト(プロジェクトAとプロジェクトB)が同じSVNリポジトリリポジトリ1)を参照している場合に、困ったことがおきます

  • リポジトリ1でrefs #1とすると、プロジェクトAの1番のチケット、プロジェクトBの1番のチケットともにチケットにコミットログが関連してしまう

ふつう、チケットとタスクは1対1ですから、どちらかのプロジェクトの1番チケットに対してのタスクを行ってコミットしているはずですよね(たとえばプロジェクトAの1番チケットのタスクとして、このようにコミットする場合)
共通ライブラリ的なものは、別リポジトリになりがち(え、違いますか?すみません)とおもいますので、このようなことがおきてしまいがちと思います。

ということで、次のような書式のrefsを受け取った場合に、目的のプロジェクトのチケットにコメントを残すようにできるPluginを作りました

  • refs #projectA/1
    • リポジトリが複数のTracプロジェクトに関連している場合は、コミットコメントに、in [1/projectA]というように記述を追加して、さらにprojectAリポジトリのチェンジセット1にリンクする
      • [1/projectA] の記法はTrac 0.12がもともと持っている書式です

また、#projectA/1がリンクとして機能するようにもしています。

shibya-tracリポジトリに置かせていただきました。

インストールはソースをチェックアウトしてEGGファイルを作って、プラグイン保存ディレクトリに配置してください。

$ svn checkout http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/MultiRepositoryHelperPlugin/trunk/ multiRepositoryHelperPlugin
$ cd MultiRepositoryHelperPlugin/
$ python setup.py bdist_egg
$ cp dist/TracMultiRepositoryHelperPlugin-0.1-py2.4.egg /path/to/trac-plugindir

Trac0.12からはプラグインディレクトリが変わっていて/usr/share/tracとか無くなっています。
ですので、site-packages か、各プロジェクトのpluginsに入れてください。管理画面からアップロードできるようになっています。
また、EGGを配置したらTrac0.12の管理画面でプラグインを有効化します。


なお、次の制限があります。

  1. refs #プロジェクト名/チケット番号の書式のみの対応です
    1. 複数のチケットにリンクする場合は、とりあえずのところは refs #projectA/1 refs #projectB/5 などとrefsを省略せずに書いてください(refs #projectA/1, #projectB/5のような記載には対応していません)
  2. fixes #hoge/1というように、fixesにも対応していません

※参考にしたページ
http://coders.g.hatena.ne.jp/bellbind/20070420/p1
http://trac.edgewall.org/wiki/TracDev/PluginDevelopment
http://trac.edgewall.org/wiki/TracDev/ApiChanges/0.12#IRepositoryChangeListener