アジャイル,Trac,オープンソースなどの話。認定スクラムマスター。Twitterは@ryuzee
久々のどうでもよい話。
別にKVSなんて今に始まった話でもないんだけど、ちと仕事で使うかもしれないので試してみた。
以下の特徴をもつ所謂NoSQLデータベースの1つ。(特徴の日本語訳はこのへん)
MongoDBはこの辺からダウンロード
Mac用もWindows用もその他のOS用もビルドされたモジュールが用意されている。
試験環境はWindows XP SP3(32bit)なので、それに該当するものをダウンロード
ダウンロードしたファイルは単なるzipファイルなので、解凍して適当な場所に配置する。
以上で準備完了。
起動するには、binディレクトリに移動して、コマンドプロンプトで
とすれば良い。
これだとMongoDBを開始・停止するのが面倒なのでWindowsのサービスに登録する。こんなかんじでコマンド打つとサービスとしてインストールされる。
なお、--dbpathの指定をしないとうまくインストールできないようなので注意
(Linuxの人は/etc/rc.d/init.d/あたりに起動スクリプト用意すればよし)
ちゃんとPHP用の拡張が用意されている。
Linux系の環境なら
として、php.iniに
を追加すればOK。
Windowsの場合は、peclコマンドでソース持ってきたところでコンパイルできないので、バイナリを導入する。
詳細はPHPのマニュアルに書いてある。
テスト環境はPHP5.2.8なので、こちらのTSモジュールをダウンロード・解凍して、php_mongo.dllを[XAMPPのインストールフォルダ]/php/extにコピーする。
(XAMPPの場合は、Thread Safe版のモジュールでないと、php5.dllが無いぞ~、というエラーでPHPが起動しないはず)
その上で、php.iniに以下を追記(XAMPPの場合、apache/bin/php.iniとphp/php.iniの2つの設定ファイルが利用される。前者はapache経由の場合、後者はCLIの場合)
その後(一応)XAMPPのapacheを再起動しておく。
このチュートリアルが良くまとまっている(英語)ので、それを見ればおおよそ分かる。
コンストラクタの引数に、下記のように接続先のMongoDBの情報を設定できる。
もしこのtestdbが存在しなければ自動で作られる。
コレクション(テーブルみたいなもん)も存在しない場合は自動で作成される。
連想配列にセットして、insertすればOK。第二引数はoption配列で、safeをtrueに指定すると追加に成功したかどうかの戻り値を応答する。
テーブルのデータを全件取得する。
ID指定で検索できる。
開始位置や件数を指定できる。
IDを指定して、$setの配列に更新フィールドをセットすることでデータの更新を行う。
IDをキーにしてデータを削除する。safeオプションの意味は追加時と同じ。
CakePHPでMongoDBに接続するには以下を参照。
http://d.hatena.ne.jp/cakephper/20100122/1264140610
意外と日本語でScrumButのことが紹介されているページがないので紹介しておく。
Jurgen氏のScrumButs Are the Best Part of Scrumの冒頭から抜粋して適当訳。
ScrumButとは以下のようなものだ。
「我々はスクラムを利用している。だけど」 「我々には特殊な事情がある」 「それゆえにスクラムを変更する必要がある」
(原文) "We use Scrum, but" "we have these unique circumstances" "so we have had to modify Scrum so it works here"もっと短く言うと、
ScrumBut = (従っていないプラクティス)(ロジカルな言い訳)(回避方法)
さらには以下のようにも定義できる。
scrumbut [skruhmbut] 名詞
1. アジャイルプロジェクトマネジメントや開発メソッドの一部だけに従う人のこと
2. セミ・アジャイルや似非ウォーターフォールの開発メソッドに従う人のこと
3. スクラムのメソトロジーをいくつか拝借して適用する人のこと
4. 一般的には、「スクラムをしていますか」という質問に対して、「(やってます。)だけど」と答える人のこと
「だけど・・・」に逃げ込むと、改善が進まなくなる。振り返りを使ってそうならないようにしなければならない。
もうタイトルのまんまですが、データの更新時に自動でデータの差分を取得して履歴テーブルに突っ込むbehaviorを作りました。
自分で作っているアプリケーションで、データ更新時の変更履歴を表示させたいと思ったのだが、対象テーブルが沢山あっていちいち似たような実装をあちこちに作るのは気が狂いそうなので汎用化しちゃえ、というのが作った動機
AutoLoggerBehavior
http://github.com/ryuzee/auto_logger_behavior から入手可能
ライセンスはMITライセンス
1. 入手したauto_logger.phpをapp/models/behaviors/に配置
2. 履歴テーブルの作成
3. 履歴テーブル用のモデルを作成。上記のテーブルの場合はapp/models/以下にchange_log.phpという名でChangeLogモデルを作成
4. 履歴を取得したいモデルを開き、以下を追加。savetoには履歴を保存したいモデル名を指定する。省略時はChangeLogモデルとみなす。
5. 以上で完了。あとは対象モデルの新規作成、編集、削除時に自動で指定のテーブルに履歴が保存されます。
自分が使うために作ったので、あんまり細かくテストしていないです。ご利用は自己責任で。
SlideShareで見つけた。
こういうスライドは話と一緒に見た方が面白いけど、スライド単体でも十分参考にはなるだろう。
別にUNIONに限らず、生のSQLを投げて取得したデータは、何でも同じようにページングできる。
・ページングのために利用する新しいモデルを作成する
・そのモデルでは$usetable=falseに設定し、既存のテーブルとは関連付けしない。
・そのモデルにおいて、paginate関数とpaginateCount関数をoverrideする。
・コントローラー側では、既存のpaginateと同じ利用の仕方をする。但し引数として設定しても無視する項目がある。
下記のサンプルコードはPHPMyScrumでのタスクとストーリーの横断検索機能の実装。
app/models/search.php
function setKeyword($value)
{
$this->keyword = "%" . $value . "%";
$this->bind_param = array(
ITEMTYPE_STORY,
$this->keyword,
$this->keyword,
ITEMTYPE_TASK,
$this->keyword,
$this->keyword,
);
}
/** * Overridden paginate method */
function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array())
{
if($page == 0){ $page = 1; }
$recursive = -1;
$sql = $this->base_sql . ' LIMIT '.(($page-1)*$limit) . ',' . $limit;
return $this->query($sql, $this->bind_param);
}
/** * Overridden paginateCount method */
function paginateCount($conditions = null, $recursive = 0, $extra = array())
{
$this->recursive = $recursive;
$results = $this->query($this->base_sql, $this->bind_param);
return count($results);
}
}
app/controllers/search_controller.php
function index()
{
$result = array();
if(isset($this->passedArgs['Search.query']))
{
$keyword = $this->passedArgs['Search.query'];
$this->Search->setKeyword($keyword);
}
$this->paginate = array(
'limit' => 20,
);
$result = $this->paginate();
$this->set('result', $result);
}
function search()
{
$url['action'] = 'index';
foreach ($this->data as $k=>$v){
foreach ($v as $kk=>$vv){
$url[$k.'.'.$kk]=$vv;
}
}
$this->redirect($url, null, true);
}
}
ということでGW明けくらいにgithubにソース置いて、Twitterでは話してたりしましたが、PHPMyScrumをリリースしました。
リリースといっても、そろそろ小さい案件には十分使えるだろ!というレベルで、これからもうちょっと機能拡張したり、ソース綺麗にしたり、真面目にテスト書いたりしていこうかと思っています。
http://www.phpmyscrum.infoをご参照ください。
デザインのセンスが自分には無いことが良くわかったので、俺がデザインしてやるぜー、という人居たら是非お願いします。
要望はTwitterでもこのポストへのコメントでもGithubのIssueでもどれでもOKです。
Bob Hartman氏のAgile antipattern: Target fixationより抜粋して適当翻訳。
ありがちな話。日本でよく言われるのが、「期日までに使わない(と思われる)機能も全部作れ、契約だから」とか。限られた時間軸の中で変化を受け入れながら進めている中でこういうのを要求されると、品質やチームのモチベーションやコラボレーションを犠牲にしはじめてしまう。このような状況が続けば焼畑農業のようにチームには何も残らなくなる。結果として顧客にとっても幸せな結果にならない。
以下意訳。
Webserviceコンポーネントを使うと、既存のコントローラーにほとんど手を入れることなく、簡単に応答をXMLやjsonに切り替えることが出来る。
Webserviceコンポーネントは、Jose Diaz-Gonzalez氏が作成し、MITライセンスで公開されている。
からgit cloneで入手する。
※日本語対応やいくつかの問題を筆者がforkして修正した。
入手したファイルのうち
controller/components/webservice.phpを自身のアプリケーションのcontroller/components/にコピーする。
views/webservice.phpを自身のアプリケーションのviewsにコピーする
app/config/route.phpを開き、末尾に以下を追加する
XMLやjson形式で応答したいコントローラーにおいて
を追加する。
以上で作業は完了。
XMLやjson形式で応答したい場合は以下のようにリクエストを行う。
/controller名/action名.xml
/controller名/action名.json
現在のコンポーネントだと、有効にしたコントローラーの全アクションでXMLとjsonの応答が有効になるけど、このあたりは簡単にカスタマイズできるだろう。
というタイトルで記事を書く約束を@katzchangと約束したので、書いてみる。
前提として、スクラムマスターはいないが管理職が沢山いて、日々現場のメンバーが悩まされているようなシチュエーションを想像してみる。
(かなり)現実の管理職を悪くステレオタイプ化しているが、スクラムマスターとの対比のためにあえてそうしている。うちの管理職はもっとまともだ!とか言わないようにしてもらいたい。
スクラムマスターはチームを強くする。
徘徊中に見つけたのでシェアしておく。
A4一枚によくまとまっているので、初心者が手元においてリファレンスにしたりするのに良いと思う。
日記 PHP オープンソース インストールマニアックス IIS Trac MySQL Perl Linux Agile・生産性向上 wordpress フリーソフト 自宅サーバ 書評 ブックマーク phpMyFaq TraM Plugin 早起き Delphi apache CakePHP Firefox Ruby eclipse セキュリティ プラグイン アジャイル mojavi Subversion Ajax/Web2.0 SQLServer Zope サーバ フレームワーク phpBB 仮想化 PostgreSQL OpenVZ scuttle CMS 文字化け 自宅 翻訳・日本語化 ApacheDS LDAP Excel 生産性向上 CodeIgniter XAMPP hacks taskfreak 修正 言語ファイル Ajax SBM ダウンロード HTML::FillInForm mod_security 情報共有