プロジェクト名に愛が無い

そしてリポジトリ名がncrm(多分New CRMの略)。だったら更に新しいの出たら何になるのか。nncrmか?nnncrm、n5crmとかschemeの仕様みたいになっていくのかと小一時間(略

テストが無い

テストぉ?そんなお上品なもんなんざぁ、とんとお目にかかったことねーなぁ?

バリデーションが無い

バリデーション?そんなお上品なもんなんざぁ(略

サーバーがrootログインの許可+IP制限している

セキュリティを高めたいのか低めたいのかどっちなのか。使い辛いわ。

バージョン管理システムがよくわかってない

なぜトップにぶち撒けられてる?trunkはどこ?branchesとtagsはなぜ空?

メソッドが大文字から始まる

あんた絶対Windows畑から来たね?同じ調子でPHP書かれても困るんだヨォ。

全テーブルに共通のプレフィックスが付いている

いや、データベース名があるからわかるよ。

テーブル名に型が付いている

はいはい、mはマスターでtはトランザクションね。データベース版ハンガリアン記法。

テーブル名が日本語

逆に分かり辛い。

テーブル名が日本語の複数形

「フレームワークの規約で複・・・」シャラップ!!みなまで言うな!!

テーブル名がその全部だ

もう何が何やら・・・

レガシー改善仲間募集

「これはひどい」といっても実際にはそこら中にいっぱいありますよね、こういうプロジェクト。ひとしきり毒づいたあとは一つづつ地道に改善していけばいいんです!

僕が現在関わっているプロジェクトではこういったレガシーPHPを改善してださるPHPプログラマー仲間を募集しております。くわしくはコチラ

phpプログラマーの募集 - komagata

ほんとたすけてくだしあ・・・

関連:レガシーPHP改善日記シリーズ

PHP Conference 2012に来ています。

PHPプログラマー・・・募集っっっ!!圧倒的・・・募集っっっ!!徹頭徹尾、募集っっっ!!

最近、大門からほど近い会社さんに週2日いってPHPプロジェクトのお手伝いをしています。所謂一つのレガシー改善というやつです。

PHP5.3.3 + CakePHP1.3って感じなんですが、圧倒的にPHPプログラマーが足りないっ!

なので、PHPプログラマーのかた、フリーランス・開発会社様、問いませんので、PHPプログラマーのかた、またはPHPプログラマーをご存知のかた、ご紹介いただけると嬉しいです・・・。(出来れば僕といっしょに常駐していただければなお・・・)

もちろんtestディレクトリなんて空っぽだったのでテストを追加したり、jenkinsでCI環境作ったりしています。一緒にPHPをガリガリ書いてくださるかたを募集しています。というか助けてください・・・。

ご連絡はTwitterで@komagataもしくはkomagata@gmail.comまで「興味あるよ!」って感じでいただければありがたいです。

※追記:

「来週までにPHPとCakePHP覚えといて」

と無茶振りしてるので、チンカスーくん(チンカス + わぷーくん)もいます。

関連:レガシーPHP改善日記シリーズ

cakephp1.3はwebアプリとしてのtestrunnerしか無い。terminalからやりたいとかjenkinsでshell exexuteしたいときとかに困る。

神の子、@itemanさん達が作られてるStagehand_TestRunnerがCakePHP x simpletestの実行に対応してるのでそれを使えばOK。

CLI のための継続的テストランナー v3 - Stagehand_TestRunner - Piece Framework

Stagehand_TestRunnerをComposerでインストール

% vi composer.json 
{
  "require": {
    "piece/stagehand-testrunner": ">=3.3.1"
  }
}
% php composer.phar install
% ./vendor/bin/testrunner --preload-script=vendor/autoload.php --cakephp-app-path=app --cakephp-core-path=cake cakephp app/tests/cases/models/post.test.php

(ハマっていた時、Twitterで@itemanさん、@rskyさんに助けていただきました。ありがとうございます。)

CakePHP1.3でtestを書くにはsimpletestが必要。(デフォルトで付いてない)CakePHP1.3はちょっと古いのでsimpletestの最新では動かないので1.0系を使う。

まずFixtureを書く。Fixtureはクラスで書く。(これyamlとかでできないかなあ)

<?php
class PostFixture extends CakeTestFixture {
    var $name = 'Post';
    var $table = 'posts';

    var $fields = array(
        'id' => array(
            'type'    => 'integer',
            'null'    => false,
            'key'     => 'primary'
        ),
        'name' => array(
            'type'    => 'integer',
            'null'    => false
        )
    );

    var $records = array(
        array('id' => 1, 'name' => 'komagata'),
        array('id' => 2, 'name' => 'machida'),
        array('id' => 3, 'name' => 'yoshida')
    );
}
?>

modelのテストケースを書く。

<?php
class TestPost extends Post {
    var $cacheSources = false;
    var $useDbConfig = 'test';
}

class PostTestCase extends CakeTestCase {
    var $Post = null;
    var $fixtures = array('app.post');

    function startTest() {
        $this->Post =& ClassRegistry::init('Post');
    }

    function endTest() {
        unset($this->Post);
        ClassRegistry::flush();
    }

    function testPostInstance() {
        $this->assertTrue(is_a($this->Post, 'Post'));
    }

    function testFetchKomagata() {
        $this->Post->recursive = -1;
        $result = $this->Post->fetchKomagata();
        $expected =  array(
            'Post' => array('id' => 1, 'name' => 'komagata')
        );
        $this->assertEqual($result[0], $expected);
    }
}
?>

こんな感じ。/test.phpから結果が見れる。

Selenium RCをインストール

PHPUnitをインストール

PHPUnit_Seleniumをインストール。

% pear install phpunit/PHPUnit_Selenium

testを書く(ファイル名はクラスと同じCamelCase)

test/integrations/LoginTest.php

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class LoginTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://foo/');
    }

    public function testTitle()
    {
        $this->open('/sign_in');
        $this->assertTitle('Sign In');
        $this->type('account', 'foo');
        $this->type('password', 'password');
        $this->submitAndWait('user_form');
        $this->assertTitle('Dashboard');
    }
}
?>

実行。対象ディレクトリ以下のなんとかTest.phpを全部実行する。

$ phpunit test/integrations

何がLinuxデスクトップを殺したか(What Killed the Linux Desktop 日本語訳)

要約すると、(a) 第一の要因:物事があまりに早く変化し、オープンソースも独占ソフトウェアも同じように壊れる。(b) Linux ディストリビューション間の非互換性。

これがデスクトップ分野で Linux をターゲットとしようとするサードパーティの開発者のエコシステムを殺した。一度は挑戦して、「トップ」ディストロや寛容な人なら「トップ3」ディストロをサポートするのに最善を尽くすだろう。それで知ることになるのは、6ヵ月後にはそのソフトウェアがもう動かないということだけ。

何か覚えのある感覚。僕(ら)はサーバー用OSとしてDebianを選ぶのにも同じような考えをしているなと思いました。

Linuxはサーバー分野では成功して、沢山のサードパーティー開発者(僕も)に使われている。サーバー分野でサードパーティー開発者が作るプロプライエタリなソフトといえばWebアプリだ。サーバー分野では上記の様な問題があまり無いからだ。

僕らにとってVistaがコケたことに対応する出来事はRedhatがフリー版の提供を辞めた事だった。事実上の標準だったRedhatが使えなくなるというのでみんなパニックになった。Fedoraに行った人は暫くして立ち上がったCentOSを使い始めた。または僕も含め、多くの人がそれを機会にDebianに移った。確かSergeが出るちょっと前ぐらいだったように記憶しているけど、プロプライエタリなWebアプリを作るサードパーティー開発者(僕だ)にとってDebianは楽園だった。安定版は一度セットアップすれば殆ど手がかからなかったし、APIの変更で自分たちのアプリにも変更が必要ということはまず無かった。OSのメジャーアップデートは再起動無しに出来た。

2012年の現在でも楽園は健在だ。現在の安定版Squeezeはやはり安定していて、丁度昨日も一つセットアップしてきたところだ。レガシーのPHPアプリケーションをSqueezeに持ってきたところ、すっかり動作した。Debian万歳。

サーバー用途でもGUIを重視する必要があるWindowsやMac OS Xに比べて、GUIを切り捨ててサーバー用途の安定性を重視した為、比較的少ない対象に開発リソースを集中できていることがその原因だろう。その代償としてのGUI周りの不安定さならば僕は受け入れてしまうだろう・・・。

cakephp1.3系(+svn)のプロジェクトのテコ入れ的な仕事をやることになったのですが、php浦島状態です。下記、もしわかれば教えていただけるとありがたいです!

  • エンドツーエンドテストがしたい。(selenium rc+simpletestなのかな?)
  • CIしたい。(jenkins + selenium rc+simpletest or phpunitとかでできるのかな?)
  • migrationしたい。(若干あきらめ気味)
  • deployはどうやるんだろう?
  • stagingとproductionを簡単に切り替えるdeployがしたい(贅沢?)

識者の方、なにとぞ、なにとぞ・・・ m(_ _)m

追記:

@yandoさんに教えてもらった情報。

migration = migration plugin

deploy =cap-cake (capistrano)

あとはエンドツーエンドテストが気になります。(個人的にbehatはやり過ぎ感)

数年前、受託開発の会社を辞めてこれから自社・製品サービスを作ってる会社で働こうと思い、会社を転々としつつ今(FJORD, LLC)に至ります。

上記のような事を思った切欠は下記の様なことがあったからです。

中規模の案件

その時、僕はコンシューマ向けのWebシステムの案件を5〜6人ぐらいのチームで取り組んでいました。データベースに保存されたデータをPHPでXMLを返すAPIを作り、Flashで表示するサイトで、時代が時代だったので「このトラフィックをPHPで構築するなんて。Javaでやるべきだ。」なんて言われてましたが今考えるとおかしいですね。

サーバーとFlashクライアントが連携するのでAPI(XMLのSchema)に関してはデザイナーとも結構密にやり取りしていたように思います。僕はガントチャートとにらめっこしながらも案件の後半になってもそれ程デスマという感じも無く、定時で帰れるメンバーも普通にいて、

「余裕という程では無いにしてもどうやら無事リリースできそうだな」

なんて考えていました。

そんな時、Flashクライントも担当していたデザイナーの@946さんから、

「この部分のUIはこう変更した方が使い易いのではないか?」

という提案がありました。それに対して僕は、

「確かに改善案はもっともですね。僕も使い易くなると思います。しかし、今までのやり取りの感じだとクライアントはその分の工数追加を認めないでしょう。」

と答えました。

そしてその後凄く落ち込みました。

(僕ら受託開発会社とクライアントの利害は必ずしも一致していない。エンドユーザーに至っては受託開発会社の利益と相反してるとさえ言えるじゃないか。)

受託開発という商売

商売の仕組みとして受託開発はとても凄い。ソフトウェアを開発する前から買い手と値段が決まっているんだから。皆がこぞってやるのも当たり前だ。世の中に需要が一定数あるかぎり、ローリスク・ミドルリターン?のとても手堅い商売だ。

僕もその時まではデマルコやワインバーグに始まってAgile関係の書籍を読んだり実践したりして、受託開発がより良く進化していくことに期待していた。しかし「はじめの契約形態、要は契約書になんて書くの?」が解決しない限り本質的に問題は解決しない。(何度か受託でAgile開発系のイベントに行って質問したが、決まって「業務請負契約にしてもらっています」という答えだった。これは僕には妥協に感じられた。)

実際に昨今では永和システムマネジメントの価値創造契約など、その問題に正面から取り組んだ企業出てきた。(これは僕のように逃げずに真正面から受託開発に取り組む本当に素晴らしい姿勢だと思う。)

しかし、そういった問題は経営から考え方を刷新しないと無理だ。その時点で平凡なプログラマーである僕には「まず確実に5年はこの状況がかわることは無いだろう」と考え(実際に5年たったが変わってない)、「ならばエンドユーザーと直接金銭をやり取りする自社製品・サービスを作る仕事をしよう」と考えて転職した。(要は逃げた)

そして現在

現在のFJORD, LLCでも自社サービス(怖話)で利益を上げようと頑張っているが、それだけで食べていける状態に達していないので受託開発も承っているが、僕は上記の様に受託開発を良くしようとする方法論の進化から遠ざかっていた。しかし、下記の2点からまた勉強を始めました。

  • 5年ぐらいたっているので僕の知らないだけで上記の問題が解決しているのではないか?
  • メンバー2人でもAgile開発の恩恵が無視できない。

「ニワカほどよく語る」と申しますが、恥をかくのは得意なので、Agile開発について勉強したこと、疑問なども書いていこうと思います。

追記

新卒時を除いて、僕の経験した受託開発とはほとんどがコンシューマー向けWebシステムなので、エンタープライズシステムのゼネコン体質などといった、更に難しい問題が無かったのは幸運でした。

PHP PaaSのORCHESTRAを試してみた。

Orchestra

komagata/orchestra-test - GitHub

index.php:

<?php
echo 'unk';
?>

http://test-orchestra-komagata-org.orchestra.io/

外部のgit(github)やsvnのリポジトリからビルドってのがスマート。

phpアプリをdeployしたいだけなのにpython製コマンドやbazaar使わされる(gitもOKらしいけど)cloudControlとは段違いの手っ取り早さ。イイネ!

Fred Wu's Blog | Freelance Ruby on Rails, PHP, Front-end Web Developer

rubycommitters.orgやslim-lang.comのデザインをやってみているdeveloper/designerの方のページ。中華な感じが面白いなあ。日本のイラストともちょっと違うし、アメリカの方だとシンプソンズとかサウスパークとかもっと崩した感じのイメージがある。その中間って感じ。