header image

Ryuzeeについて

mixi Twitter Twitter

携帯対応

QRコード

RING

人気ブログランキング

新着記事

2010/05/31 14:53:49 PHP none Comments

久々のどうでもよい話。
別にKVSなんて今に始まった話でもないんだけど、ちと仕事で使うかもしれないので試してみた。

MongoDBって何よ?

以下の特徴をもつ所謂NoSQLデータベースの1つ。(特徴の日本語訳はこのへん)

  • ドキュメント指向のストレージ
  • フルインデックスをサポート
  • レプリケーションと高い可用性
  • 自動シェアーディグ
  • 高機能なドキュメントベースクエリ
  • Fast In-Placeな更新
  • Map/Reduce
  • GridFSによるファイル保存
  • 商用サポートもある

MongoDBの入手

MongoDBこの辺からダウンロード
Mac用もWindows用もその他のOS用もビルドされたモジュールが用意されている。
試験環境はWindows XP SP3(32bit)なので、それに該当するものをダウンロード

MongoDBのインストール

ダウンロードしたファイルは単なるzipファイルなので、解凍して適当な場所に配置する。
以上で準備完了。

起動するには、binディレクトリに移動して、コマンドプロンプトで

mongod.exe --dbpath=../data

とすれば良い。

これだとMongoDBを開始・停止するのが面倒なのでWindowsのサービスに登録する。こんなかんじでコマンド打つとサービスとしてインストールされる。
なお、--dbpathの指定をしないとうまくインストールできないようなので注意
(Linuxの人は/etc/rc.d/init.d/あたりに起動スクリプト用意すればよし)

mongod.exe --install --dbpath=C:\tools\mongodb-win32-i386-1.4.3\data

MongoDBへPHPで接続する準備

ちゃんとPHP用の拡張が用意されている。
Linux系の環境なら

pecl install mongo

として、php.iniに

extension=mongo.so

を追加すれば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の場合)

extension=php_mongo.dll

その後(一応)XAMPPのapacheを再起動しておく。

MongoDBをPHPから使ってみるよ

このチュートリアルが良くまとまっている(英語)ので、それを見ればおおよそ分かる。

MongoDBへの接続

try
{
    $link = new Mongo();
}
catch(MongoConnectionException $e)
{
   die('つながらないんです');
}

コンストラクタの引数に、下記のように接続先のMongoDBの情報を設定できる。

$link = new Mongo("example.com:65432");

DBの指定

$db   = $link->testdb;

もしこのtestdbが存在しなければ自動で作られる。

コレクションの作成

$col  = $db->user;

コレクション(テーブルみたいなもん)も存在しない場合は自動で作成される。

データ追加

$doc = array(
    'name' => 'ryuzee',
    'age' => 24,
    'country' => 'Japan',
    'url' => array('http://www.ryuzee.com/','http://twitter.com/ryuzee')
);
$col->insert($doc);

連想配列にセットして、insertすればOK。第二引数はoption配列で、safeをtrueに指定すると追加に成功したかどうかの戻り値を応答する。

$option["safe"] = true;
$ret = $col->insert($doc, $option);

検索

$res = $col->find();

テーブルのデータを全件取得する。

$res = $col->findone(array('_id' => new MongoId('4c0347097bb3f8c013000000')));

ID指定で検索できる。

$res = $col->find()->skip(1)->limit(1);

開始位置や件数を指定できる。

更新・削除

$col->update(
    array('_id' => new MongoId('4c0347097bb3f8c013000000')),
    array('$set' =>
        array('name' => 'ryuzee2')
    )
);

IDを指定して、$setの配列に更新フィールドをセットすることでデータの更新を行う。

$col->remove(array('_id' => new MongoId('4c0347097bb3f8c013000000')), array('safe' => true));

IDをキーにしてデータを削除する。safeオプションの意味は追加時と同じ。

コレクションの削除

$col->drop();

その他

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. 一般的には、「スクラムをしていますか」という質問に対して、「(やってます。)だけど」と答える人のこと

「だけど・・・」に逃げ込むと、改善が進まなくなる。振り返りを使ってそうならないようにしなければならない。

2010/05/28 15:15:12 PHP none Comments

もうタイトルのまんまですが、データの更新時に自動でデータの差分を取得して履歴テーブルに突っ込むbehaviorを作りました。
自分で作っているアプリケーションで、データ更新時の変更履歴を表示させたいと思ったのだが、対象テーブルが沢山あっていちいち似たような実装をあちこちに作るのは気が狂いそうなので汎用化しちゃえ、というのが作った動機

概要

AutoLoggerBehavior

http://github.com/ryuzee/auto_logger_behavior から入手可能

ライセンスはMITライセンス

使い方

1. 入手したauto_logger.phpをapp/models/behaviors/に配置
2. 履歴テーブルの作成

CREATE TABLE `change_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mode` varchar(6) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `old_value` text,
  `new_value` text,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

3. 履歴テーブル用のモデルを作成。上記のテーブルの場合はapp/models/以下にchange_log.phpという名でChangeLogモデルを作成

4. 履歴を取得したいモデルを開き、以下を追加。savetoには履歴を保存したいモデル名を指定する。省略時はChangeLogモデルとみなす。

var $actsAs = array(
    'AutoLogger' => array('saveto' => 'ChangeLog'),
);

5. 以上で完了。あとは対象モデルの新規作成、編集、削除時に自動で指定のテーブルに履歴が保存されます。

その他

自分が使うために作ったので、あんまり細かくテストしていないです。ご利用は自己責任で。

SlideShareで見つけた。
こういうスライドは話と一緒に見た方が面白いけど、スライド単体でも十分参考にはなるだろう。

2010/05/25 07:00:09 PHP 2 Comments

別にUNIONに限らず、生のSQLを投げて取得したデータは、何でも同じようにページングできる。

・ページングのために利用する新しいモデルを作成する
・そのモデルでは$usetable=falseに設定し、既存のテーブルとは関連付けしない。
・そのモデルにおいて、paginate関数とpaginateCount関数をoverrideする。
・コントローラー側では、既存のpaginateと同じ利用の仕方をする。但し引数として設定しても無視する項目がある。

サンプルコード

下記のサンプルコードはPHPMyScrumでのタスクとストーリーの横断検索機能の実装。

app/models/search.php

class Search extends AppModel {
    var $useTable = false;
    var $base_sql = " SELECT ? as itemtype, resolution_id, id, name, description FROM stories where disabled ='f' and ( name like ? or description like ?) UNION SELECT ? as itemtype, resolution_id, id, name, description FROM tasks where disabled = 'f' and ( name like ? or description like ?) ";
    var $keyword   = "";
    var $bind_param = array(ITEMTYPE_STORY, "","",ITEMTYPE_TASK, "","");

    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

class SearchController extends AppController {
    var $name = "Search";

    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をリリースしました。
リリースといっても、そろそろ小さい案件には十分使えるだろ!というレベルで、これからもうちょっと機能拡張したり、ソース綺麗にしたり、真面目にテスト書いたりしていこうかと思っています。

特徴

  • Scrum管理ツール初(たぶん)の純国産オープンソース製品
  • ライセンスはMITライセンス
  • PHP5とデータベースを用意すれば動作。環境を選ばない柔軟性
  • データベースはMySQLで動作確認。基本的にCakePHPが対応しているDBMSなら何でも動作する(はず)
  • i18N対応済み
  • シンプルな機能
  • 作者のいい加減なきまぐれな対応

機能

  • プロダクトバックログ
  • スプリントバックログ
  • ストーリーの作成・編集・削除
  • タスクの作成・編集・削除
  • スプリントバーンダウンチャート
  • スプリントタスクかんばん
  • ストーリーボード
  • 主要画面のExcel形式での出力
  • Wiki
  • お知らせの掲載
  • ダッシュボード
  • CSVファイルによるストーリー・タスクのインポート
  • プロダクトバックログの検索
  • ストーリとタスクのrss配信

入手とかスクリーンショットとかデモサイトとかもっと詳しいこととか

http://www.phpmyscrum.infoをご参照ください。

その他

デザインのセンスが自分には無いことが良くわかったので、俺がデザインしてやるぜー、という人居たら是非お願いします。
要望はTwitterでもこのポストへのコメントでもGithubのIssueでもどれでもOKです。

Bob Hartman氏のAgile antipattern: Target fixationより抜粋して適当翻訳。

ありがちな話。日本でよく言われるのが、「期日までに使わない(と思われる)機能も全部作れ、契約だから」とか。限られた時間軸の中で変化を受け入れながら進めている中でこういうのを要求されると、品質やチームのモチベーションやコラボレーションを犠牲にしはじめてしまう。このような状況が続けば焼畑農業のようにチームには何も残らなくなる。結果として顧客にとっても幸せな結果にならない。

以下意訳。

  1. 期日を約束したりストーリーポイントのゴールを約束したり、その他のゴールが命取りになることがある。これらだけでは本質的に悪くは無いとしても、下記に述べるその他の項目と組み合わさると、問題となるだろう。
  2. チームはゴールを達成するために品質を端折り始める。これは多くの場合無意識に行われる。チームは段々テストを書く量が減っていく。特に自動化テストほど書く量が少なくなる。
  3. リスクやプロジェクトを妨げる事柄をミーティングで明らかにすることをしなくなる。結局、それらへ対応するためにゴールを達成できなくなるだろう。
  4. チームメンバーは、目標を達成するという観点から、「今回だけ」と言いながら、より多く残業するようになる。もしこのようなことがしばしば起こるようであれば、注意してみるようにする必要がある。
  5. チームメンバーは協調してオープンなコミュニケーションを取らずに、周りを顧みなくなり始める。「邪魔されなければ終わるんだ!」という態度が蔓延することになる。
  6. チームは朝会を飛ばすことを考え始める。それによってゴールにたどりつくまでにさらに多くの時間を要する結果となる。
  7. 振り返りが非難の場になる。
  8. チームは手遅れになってしまうまで、明らかな問題を放置するようになる。
2010/05/19 06:32:39 PHP none Comments

Webserviceコンポーネントを使うと、既存のコントローラーにほとんど手を入れることなく、簡単に応答をXMLやjsonに切り替えることが出来る。
Webserviceコンポーネントは、Jose Diaz-Gonzalez氏が作成し、MITライセンスで公開されている。

入手およびインストール

git://github.com/ryuzee/webservice_plugin.git

からgit cloneで入手する。
※日本語対応やいくつかの問題を筆者がforkして修正した。

入手したファイルのうち
controller/components/webservice.phpを自身のアプリケーションのcontroller/components/にコピーする。
views/webservice.phpを自身のアプリケーションのviewsにコピーする

使い方

app/config/route.phpを開き、末尾に以下を追加する

Router::parseExtensions();

XMLやjson形式で応答したいコントローラーにおいて

var $components = array('Webservice');

を追加する。
以上で作業は完了。

XMLやjson形式で応答したい場合は以下のようにリクエストを行う。
/controller名/action名.xml
/controller名/action名.json

現在のコンポーネントだと、有効にしたコントローラーの全アクションでXMLとjsonの応答が有効になるけど、このあたりは簡単にカスタマイズできるだろう。

というタイトルで記事を書く約束を@katzchangと約束したので、書いてみる。

前提として、スクラムマスターはいないが管理職が沢山いて、日々現場のメンバーが悩まされているようなシチュエーションを想像してみる。
(かなり)現実の管理職を悪くステレオタイプ化しているが、スクラムマスターとの対比のためにあえてそうしている。うちの管理職はもっとまともだ!とか言わないようにしてもらいたい。

  1. 管理職は部下を育てる責任、もしくは勝手に育つような環境を用意する責任があるのだが、もう1つの大きな責任である、「数字(※1)をあげる」というテーマが優先されてしまう。
    (※1:ムリと分かっていても勝手に経営が決めて部門目標とかいう名の元に押し付けてきた売り上げと利益目標のこと。)
    →スクラムマスターはコーチ・ファシリテーター・メンターとして、チームの成長をサポートする役目がある。

  2. 目先の目標を達成しないと管理職自身の身分も危うくなるので、部下が育とうが育つまいが、とりあえず数字を出そうとする。
    →スクラムマスターは、チームの力を最大化することで成果を出そうとする。

  3. 目先の目標を達成しないと管理職自身の身分も危うくなるので、顧客が満足しようがそうでなかろうが、不満で来期発注してくれなくなりそうでも、とりあえず数字を出そうとする。
    →スクラムマスターは顧客の満足を大前提として行動する。

  4. ましてや社員のQuality of Lifeなんて最後の最後。社員の退職率が高くても、他から補充すれば良いと思っていたりする。
    →スクラムマスターはチームを守る、というミッションも背負っている。

  5. 部下の痛みは管理職にとっては遠い昔に経験したけど忘れちゃった小さな事柄にしか過ぎない。
    →スクラムマスターはメンバーの痛みに共感し、改善する役割がある。

  6. 年功序列という制度のもとで、一定の年齢になると肩書きやポストが与えられるが、ポストの数は限りがあるため、肩書きだけの管理職が増えた。彼らは往々にして責任は取らないが、口は一杯出してくる。
    →スクラムマスターはチームに1人である。スクラムマスターは具体的な指示はせず、考えるヒントを与え、選択肢が複数ありチームで決定できない場合に最終決断する。

  7. 管理職が、人を育てることが上手とか、人を正当に評価できる、と思うのはまやかしである。システムを作ったり社内の政治をしたりしてきた人が、そのような能力を身に着ける場所は通常あまりないのだ。
    →スクラムマスターはコーチ・ファシリテーター・メンターの役割が要求される。これらの能力は通常の業務とは別に身につける。スクラムマスターは人を育てるのではなく、人が育つように仕向ける。

  8. 通常のキャリアの延長線上が管理職である、というのは間違いだ。名選手が名監督たりえない、というのはスポーツの世界では当たり前だが、ビジネスでも当たり前。
    →スクラムマスターはコードを綺麗に書ける、設計が上手である、といった技術要素とは能力は線形比例しない。むしろコミュニケーションスキルが重要であり、人の話を聞ける、問題解決ができるという能力である。

スクラムマスターはチームを強くする。

徘徊中に見つけたのでシェアしておく。
A4一枚によくまとまっているので、初心者が手元においてリファレンスにしたりするのに良いと思う。

Scrum Cheat Sheet

 

日記 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 情報共有


ads

読まなきゃモグリ