「Redmine -もっと手軽にプロジェクト管理!」のプレゼントキャンペーン開催中!のお知らせ + α

先日書いたように「Redmine -もっと手軽にプロジェクト管理!」が7/24より好評発売中です。

Redmine -もっと手軽にプロジェクト管理!

Redmine -もっと手軽にプロジェクト管理!

現在、出版元のインプレスジャパン様のご好意により本のプレゼントキャンペーンを行っています!
欲しいけどまだ購入されていない方、これからRedmineの導入をお考えの方等、お気軽にご応募頂ければと思います。

キャンペーンの詳しい内容は以下を参照して下さい。
http://blog.sonicgarden.jp/2009/07/redmine--.html

で、共著のid:rx7から

# 他の章については、共著者がきっと紹介してくれるはず。

http://d.hatena.ne.jp/rx7/20090729/p1

という振りをされているので僕が担当した7章「プラグイン、どう追加する?、どう作る?」について簡単にご紹介

目次は以下のような感じです。

Chapter 7 プラグイン、どう追加する? どう作る?

  7/01 プラグインの追加

  7/02 プラグイン作りの流れ

  7/03 プラグインの雛形作り

  7/04 メニューへの登録と各MVCの編集

7/01 プラグインの追加

ここでは既存のプラグインの概要と一般的なインストールの仕方を紹介しています。執筆時点ではプラグインの紹介は簡単な表があるだけだったんですが、最近本家ドキュメントのメンテナが色々整理し始めてるようです。新しいプラグイン一覧ページは以下で参照できます。

http://www.redmine.org/wiki/redmine/PluginList

動作するRedmineのバージョンやIssueTrackerのURLが明示されるようになりましたのでプラグインの選定や、不具合の報告が行いやすくなったのではないでしょうか。僕にもBugcloudプラグインのメンテナということで何度か連絡が来たので周囲の助けを借りつつなんとか英語でやり取りしてます。また、執筆時点で39個だったプラグインも現時点で60個登録されています。

7/02 プラグイン作りの流れ以降

僕が過去に作ったBugcloudプラグインを題材にしてプラグイン作りの流れを解説していますが、本家のチュートリアルをさらに簡単にした程度の内容が中心なので英語に抵抗がなければ以下のドキュメントを読んだほうがたぶん話が早いです。
Plugin Tutorial - Redmine
Hooks - Redmine
Plugin Internals - Redmine
ちなみに僕は英語に抵抗あるのでよく自分の都合のいいように脳内変換して後で痛い目みます...

後はRedmine本体のlib/redmine/plugin.rbを読んだり、自分の作りたいプラグインに近そうな他のプラグインのソース読んだりするのがいいと思います。

実際に作ってみるとわかるんですが、書籍でも紹介しているように複雑なことしようと思わなければ簡単に作れます。ちょっとした機能をRedmineに追加したいと思われる方はぜひ挑戦してみて欲しいです。そしてその成果物をどこかで公開するともっといいと思います。

neocomplcache.vimを入れた。

これまでautocomplepop.vimを常用してきたんだけど、補完候補が増えてくると若干もたつくこともあって前々から気になっていたneocomplcache.vimを使ってみることにした。
neocomplcache.vim自体がgithubで管理されていて、僕の.vim以下もgithubにあるのでid:moroのやり方で導入した。

dotvim% git remote add neocomplcache git://github.com/Shougo/neocomplcache.git
dotvim% git fetch neocomplcache
dotvim% git merge neocomplcache/master

ドキュメントを読むとすごく細かく色々設定できるみたいだけど、とりあえず最低限だけということで

let g:NeoComplCache_EnableAtStartup = 1

を.vimrcに追加して自動で有効になるようにしておいた。細かい設定とかは後日色々試してみる。

チェックボックスで非チェック時にパラメタを送信する際の挙動が変わってる

最近SKIPのRails2.3.2対応をしていて大概の問題は既に情報が出し尽くされてるんだけど、情報が少なかったのでメモ。
チェックボックスに非チェック状態だとブラウザから何も送信されないので同名のhiddenを定義していたんだけど、2.3.2にするとチェックがついている/いないによらずhiddenの方のパラメタが飛ぶようになってしまっていた。

そんなわけで、lib/action_view/helpers/form_helper.rbにあるActionView::Helpers::InstanceTag#to_checkbox_tagを見る。
2.2.2だと以下のようにcheckbox -> hiddenになっており

      def to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0")
        options = options.stringify_keys
        options["type"]     = "checkbox"
        options["value"]    = checked_value
        if options.has_key?("checked")
          cv = options.delete "checked"
          checked = cv == true || cv == "checked"
        else
          checked = self.class.check_box_checked?(value(object), checked_value)
        end 
        options["checked"] = "checked" if checked
        add_default_name_and_id(options)
        tag("input", options) << tag("input", "name" => options["name"], "type" => "hidden", "value" => options['disabled'] && checked ? checked_value : unchecked_value)
      end 

2.3.2だと以下のようにhidden -> checkboxの順になっている。

      def to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0")
        options = options.stringify_keys
        options["type"]     = "checkbox"
        options["value"]    = checked_value
        if options.has_key?("checked")
          cv = options.delete "checked"
          checked = cv == true || cv == "checked"
        else
          checked = self.class.check_box_checked?(value(object), checked_value)
        end 
        options["checked"] = "checked" if checked
        add_default_name_and_id(options)
        hidden = tag("input", "name" => options["name"], "type" => "hidden", "value" => options['disabled'] && checked ? checked_value : unchecked_value)
        checkbox = tag("input", options)
        hidden + checkbox
      end 

というわけでhiddenを書いてからcheckboxを書くようにして解決した、が、根本原因がわからん。なんで逆にしないとダメになったんだ??

Redmine -もっと手軽にプロジェクト管理!- を共著で書きました。(本日発売!)

日本Ruby会議2009でも先行発売されていましたが、SonicGardenの仲間とはてなの人との共著で執筆したRedmineの本が本日発売されました。

Redmine -もっと手軽にプロジェクト管理!

Redmine -もっと手軽にプロジェクト管理!

うれしいことにAmazonでは現在品切れの様子です。Redmineに興味のある方はもちろん、これからRedmineを使ってみたいという方もぜひ手に取ってみて頂けたらと思います。

ちなみに、目次は以下のような感じです。

■目次・内容
Chapter 1 プロジェクト管理をもっと楽に!楽しく!
  1/01 プロジェクト管理に効くRedmine
  1/02 Redmineの課題管理と考え方
  1/03 Redmineで得られる効果
  1/04 Redmine導入のポイント

Chapter 2 Redmineの使いどころ・勘どころ
  2/01 進捗状況を管理する
  2/02 個々人のタスクを管理する
  2/03 情報を一元管理する

Chapter 3 どうやって導入する?
     [WindowsLinuxAmazon EC2編]
  3/01 Redmineを使うためには
  3/02 Redmineをセットアップする手順
  3/03 Redmineホスティングサービスを利用する
  3/04 クラウド上でRedmineを利用する

Chapter 4 プロジェクトメンバーはどう使う?
  4/01 ユーザの登録と削除
  4/02 プロジェクトの作成とメンバーのセッティング
  4/03 チケットの作成からウォッチ機能まで
  4/04 バージョンとロードマップ
  4/05 ガントチャートとカレンダー
  4/06 Wikiページの作成や編集
  4/07 文書
  4/08 ニュースの作成からコメントまで
  4/09 フォーラムとマイページ
  4/10 ソース管理システムとの連携

Chapter 5 システム管理者はどう設定する?
  5/01 管理者パスワードの変更
  5/02 ユーザの詳細設定
  5/03 プロジェクトの詳細設定
  5/04 ロール(役割)の詳細設定
  5/05 チケットの詳細設定
  5/06 カスタムフィールドの設定
  5/07 列挙項目の設定
  5/08 Redmineサイト全般の設定

Chapter 6 どう工夫して運用する?
  6/01 より良い運用を行うための設定
  6/02 データのバックアップ/リストア
  6/03 Redmineのバージョンアップ
  6/04 運用アプリケーションサーバの変更
  6/05 Amazon EC2仮想サーバのバックアップ

Chapter 7 プラグイン、どう追加する? どう作る?
  7/01 プラグインの追加
  7/02 プラグイン作りの流れ
  7/03 プラグインの雛形作り
  7/04 メニューへの登録と各MVCの編集

http://direct.ips.co.jp/book/Template/Goods/go_BookstempGR.cfm?GM_ID=2730&SPM_ID=1&CM_ID=004000I99&PM_No=&PM_Class=&HN_NO=00400

僕は当初執筆メンバーに入って無かったのですが、チーム内でRedmineプラグインの作り方を紹介したのがきっかけで「Chapter 7 プラグイン、どう追加する? どう作る?」を担当することになりました。共著とはいえ自分が執筆した本が世の中に出回る日が来るとは数年前には夢にも思っていなかったことなので単純にうれしいです。うれしさのあまり明日朝早いのに帰りに寄り道して新宿の紀伊國屋で激写してきましたw


近況とか

最近は(というかさっき)勉強会の資料作ったり、(個人的な)締切りの近いプログラム組んでたり、来週SonicGardenとして出展するBusiness Blog & SNS Worldのこと考えてみたり、その後参加するRubyKaigiに向けて色々妄想してみたり…職場絡みやプライベートでも飲んだり飲まれたり…。そして、そろそろSKIPの次期バージョンのリリースに向けた追い込みで忙しくなりそうな感じ。

そんなこんなでここの所一週間以上?帰ったら即、部屋にこもりっきりになってる。ソーシャルアパートに住んでる意味ねーよー…orz

かといってリビングで自分の世界こもるのも他の人が不快に思いそうだし、やっぱり部屋のほうが作業環境整ってるし、んー、どうしたもんか。

8月入ればちょっとは暇になる(はず)と思うけど、もうしばらくは部屋にこもり続ける日が続きそう。

Hokuriku.rbとか出来てる

いつの間にか、Hokuriku.rbというのが出来たみたいだ。こちらのブログ経由で知った。石川県出身のRubyist(と名乗っていいんだろーか)としては東京からこんにちはしようかどうか悩む所だ。どうせ盆からタイミングずらして帰省するつもりだったし、7/24の第一回の勉強会に帰省ついでに参加したいなぁ。RubyKaigiの一週間後というのもちょうどいいなぁ。SKIPのリリース間近の追い込みは別にどこだって作業できるし問題ないよね。んー、もうちょっと考える。

DevLOVEイベント「世界のすべてをテストせよ。」にいってきた

色々まとまってないんだけどもう時間もないので投げてしまう。

t-wadaさんのプレゼンで印象深かった部分

  • 自分の馬鹿さ加減と向き合う
    • RSpecでBDDするようになってからホントに痛感してる。自分の馬鹿さ加減に…
  • まず己から変わる => 自分と向き合う => 鍛錬する => 背中を見せる
    • どちらかというと背中を見ている方だと思う
  • TDDが不安克服の手法であるということ
    • フィードバックが大切
  • TDDは品質を保証するものではない(保証しないは言い過ぎだが、主目的は品質保証ではない
  • だが、TDDは品質を向上させる
  • 変化に対応するのは健康体のコード
  • 変化に対応できるのは健康体のチーム
  • テストはスキル
    • 質は量に転化する
      • 自分はまだまだ圧倒的に写経不足。

鈴木さんのプレゼンで印象深かった部分

  • (QA)はテストをパラメータで見る
  • 補集合をみる
  • 誰が、誰にという部分をよくみている
  • ディシジョンテーブルと状態遷移図をとにかく書く
  • 過去の経験を活かす

感想とか

t-wadaさんとかアジャイルデベロップメントの木下さんと同じテーブル。t-wadaさんとは前日のRails勉強会でもお会いしていたけど何度お会いしても緊張してしまう。 TDDはJavaのプロジェクトやっていた頃はどうしてもちゃんと出来たことがなかったんだけど、RubyRSpecを書くようになってようやく手に馴染むようになってきた。そのおかげもあってか、改めてt-wadaさんのおっしゃることがリアルに肌で感じられることとして共感出来た。自分の馬鹿さ加減を本当に嫌というほどわかるようになったし、TDD(やBDD)を開発を前に進めるための手段として使えるようになってきたように思う。(それでもたまにテストを書くことが目的になってる時があるけど…。

後半の鈴木さんのQAテストの話の前半はやっぱり違和感というかズレのようなものを感じていたんだけど、その理由が自分でもよくわからない。自動で繰り返せないテストに違和感を感じるんだろうか?結局テストするための材料が揃っていたとしてもそれを実行するのが人間のうちはどこかでさぼったり、はしょったり、忘れたりして必ず同じテストをこなせるとは限らないと思うんだよね。それでもやっぱり最後は人間がテストするしかない部分はあって、いつも悩んでる。後半の話は興味深いと同時に自分がいかにQAテストのド素人かということを痛感させられた。

TDDといえばもっと長い時間使っていろんな人といろんなお題でペアプロしたいなーと思う。ペアプロカフェとかないのか。ペアプロの為の場と人を集める仕組みがなんかあったらいいなぁ。

懇親会とか

id:papandaの熱さは相変わらず。彼のパワーはもっと見習いたいと思うが、どうしても僕は人を引っ張っていくタイプじゃないなぁ。とにかく凄い人だと思う。その他は元々所属していた会社の方々と名刺交換したり、SKIPをDisられてみたり、持ち上げられてみたり、Pokenでハイタッチしたり、id:t-wadaさんに熱く語ってもらったり。そういえば、帰り目黒で降りるはずが、気がついたら渋谷にいて危うく東横線の改札通りそうになった…orz(以前中目黒が最寄りだったので帰巣本能が働いたらしい