PEARのインストール

既にシステムにPEARが入ってる場合。

% sudo pear uninstall pear

PEAR公式ドキュメントの通りにやる。

% curl -O http://pear.php.net/go-pear.phar
% php -d detect_unicode=0 go-pear.phar

(debianの場合)

% wget http://pear.php.net/go-pear.phar
% php -d suhosin.executor.include.whitelist="phar" go-pear.phar

PHPUnitのインストール

公式ドキュメントの通りにやる。

% pear config-set auto_discover 1
% pear install pear.phpunit.de/PHPUnit

include_pathは自動で追加してくれるけどPATHは通してくれないので自分で通す。

export PATH=~/pear/bin:$PATH
% phpunit --version
PHPUnit 3.6.12 by Sebastian Bergmann.

せばすちゃああああん

$ brew install selenium-server-standalone
$ cp "/usr/local/Cellar/selenium-server-standalone/2.25.0/homebrew.mxcl.selenium-server-standalone.plist" ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.selenium-server-standalone.plist

便利な時代になったもんですね。(結構メモリ食うのでウザくなったら起動しない設定に変えといたほうがよさそう)

テスト環境(ステージング環境)が本番環境と同居している問題

さくらVPS 1GBを借りてそこをステージング環境にした。

テストが無い問題

simpletest + Stagehand_TestRunnerでテストを書き始めた

デプロイが手動問題

capistranoでcakephp1.3用のtaskを書いて上記のさくらVPSにデプロイできるようにした。

CIされてない問題

さくらVPSにJenkinsを入れて、上記のテストとステージングへのデプロイをする設定をした。


ここからはわからない点、課題。

cakephp1.3をselenium rcでテストする時、simpletestかunittestどっちかに統一したい

今は混在しているので。

cakephpが古い(1.3)問題

既存コードに大きく手を入れず2.x系に移行できるのかな?

githubへ移行

phpconの資料を元に社長を説得中。($25/mかかるから)

テーブル名問題

まずは、これから新たに作成するテーブルは普通の名前にするという同意を得たが、既存の部分はどうもならない。

数万件のmail送信をテストしたいがsendmail or SMTPサーバーのモックが欲しい

そういうライブラリとかあるのかな?(webmockのsmtp版みたいな。PHP以外でも構わない)

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

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

そしてリポジトリ名が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さんに助けていただきました。ありがとうございます。)

% curl -s http://getcomposer.org/installer | php

http://packagist.org/ を見て欲しいライブラリをcomposer.jsonを書く。

% php composer.phar install

bundle installと同じ。vendor以下に色々入る。あとはアプリの方でvendor/autoload.phpをrequireすればいい。(Bundler.requireみたいなもん)

xxx.pharはxxx.jarみたいなもん。

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から結果が見れる。

phpの読み込みはコメントアウトされてるので外す。

# /etc/apache2/httpd.conf:
LoadModule php5_module libexec/apache2/libphp5.so

VirtualHostの設定の読み込みがデフォルトでコメントアウトされてるので外す。(罠)

# /etc/apache2/httpd.conf:
Include /private/etc/apache2/extra/httpd-vhosts.conf

Web共有は無くなったのでapachectlを使う。

% sudo apachectl restart

マンションのネットがJ:COMに統一されるということで工事の人が来た。マンションの大家としてはTV・ネット・電話が一括して一つの業者になることで手間が省け、インターネットが無料で使えるマンションという謳い文句も使えるようになるので一石二鳥といったところ。

しかし住民にとっては強制でJ:COMというのは厳しい。表向きは「大家が一部料金を負担するのでお得ですよ」だが、実質ネットの新規契約になるので手続きは面倒だし、今日日のネット新規契約には大量のキャッシュバックや特典がついてくるので大して魅力的ではない。自動的にもらえる固定電話番号も使わない。

ネット業者の移行と工事

今まではNTTフレッツ光とSo-netで月に約5000円かかっていたのをJ:COMのJ:COM NET ウルトラ160Mコースに変更した。基本は5250円だが、大家の負担で3840円で利用できる。

ケーブルTV設置とネット回線設置の工事のため2日間立ち会った。その際に強制的にJ:COMのセットトップボックスと上がり速度を安定させるという謎のブースターやACアダプタが設置された。邪魔だ。

邪魔なセットトップボックス。

謎のブースター。

回線速度

フレッツ光とJCOM: NET ウルトラ160Mコースとで回線速度を測ってみた。(BNR スピードテスト 回線速度/通信速度 測定

フレッツ光:

------ BNRスピードテスト (ダウンロード速度) ------
測定サイト: http://www.musen-lan.com/speed/ Ver5.3003
測定日時: 2012/09/09 11:30:06
回線/ISP/地域: 
--------------------------------------------------
1.NTTPC(WebARENA)1: 53.10Mbps (6.64MB/sec)
2.NTTPC(WebARENA)2: 57.40Mbps (7.17MB/sec)
推定転送速度: 57.40Mbps (7.17MB/sec)

JCOM: NET ウルトラ160Mコース:

------ BNRスピードテスト (ダウンロード速度) ------
測定サイト: http://www.musen-lan.com/speed/ Ver5.3003
測定日時: 2012/09/09 11:47:00
回線/ISP/地域: 
--------------------------------------------------
1.NTTPC(WebARENA)1: 76.79Mbps (9.60MB/sec)
2.NTTPC(WebARENA)2: 3.52Mbps (439.76KB/sec)
推定転送速度: 76.79Mbps (9.60MB/sec)

ちょっと速くなっている。

感想

ケーブルTVなど見ないのでセットトップボックスは非常に邪魔だ。しかし、全く期待してなかった下り速度が上がったのは少し嬉しい。ニコ動で体感できる程であればなお嬉しい。