ラベル LAMP の投稿を表示しています。 すべての投稿を表示
ラベル LAMP の投稿を表示しています。 すべての投稿を表示

2012-07-02

NetBeans で PHPUnit を使う際の注意

NetBeans 上で PHPUnit が使えるのは非常に便利だが、その際にNamespace を用いているクラスの場合、名前解決に結構クセがありハマったのでメモ。
以下いくつか注意点を列挙。

PHPUnitフレームワーククラス自体の名前解決

当然ながらテストクラスはnamespace宣言により、テスト対象クラスの名前空間になっているので、継承時にPHPUnit_Framework_TestCaseだけではダメで最初に"\" が必要。サイトや書籍のサンプルを試すときは要注意(テストクラス自動生成時は既に追加されている)。
namespace Hoge\Moge;
class SomeClassTest extends \PHPUnit_Framework_TestCase 
{
}

クラス読み込み(require_once)

テストで使用するクラスはモックを使用する場合でも全て読み込みをする必要がある。 通常テスト対象クラスとテストクラスはディレクトリが異なるので(例えばsrcとtestsのように)、そこまでのパスを相対指定する。
namespace Hoge\Moge;
require_once __DIR__ . '/../../../src/Hoge/Fuga/AnotherClass.php';

ただし、この方法だと階層が深いと読みづらい上に、使用クラスが多くなると大変。bootstrap.phpを用意してauto_loadを実装したクラスローダークラス等を先に読み込ませた方がスマート。
その場合は、プロジェクトのプロパティ>PHPUnitカテゴリーのUse Bootstrapにチェックしてファイルを指定するか、require_onceで読み込ませる。
namespace Hoge\Moge;
require_once __DIR__ . '/../../bootstrap.php';

この方法だと使用クラスが増えた際も、その都度個別のファイルを指定する必要がなく便利。

クラスインスタンス生成

通常のクラスインスタンス生成はuseキーワードを追加することで、ショート名を用いることができる。
namespace Hoge\Moge;
require_once __DIR__ . '/../../bootstrap.php';

use Hoge\Fuga\AnotherClass;

class SomeClassTest extends \PHPUnit_Framework_TestCase
{
    public function testMethod() {
        $class = new AnotherClass();
    }
}

モック生成時のクラス名指定

問題はモックを使用する場合で、requireで個別にファイルを読み込ませたか、クラスローダーに読み込ませたかに関わらず完全修飾名で指定する必要がある。
namespace Hoge\Moge;
require_once __DIR__ . '/../../bootstrap.php';

use Hoge\Fuga\AnotherClass;

class SomeClassTest extends \PHPUnit_Framework_TestCase
{
    public function testMethodNotUseMock() {
        $class = new AnotherClass();
        $this->assertEquals('foo', $class->doSomething());
    } 

    public function testMethodUseMock() {
        $stub = $this->getMock('Hoge\Fuga\AnotherClass');

        $stub->expects($this->any())
               ->method('doSomething')
               ->will($this->returnValue('foo');

        $this->assertEquals('foo', $stub->doSomething());
    }
}

なぜか、PHPUnitに渡すクラス名の場合、名前解決は完全修飾名ではないとダメな模様。自分は、これに引っ掛かって相当時間を費やした。もしかしたら設定で指定できるのかもしれないが、とりあえずこれでも解決。

Abstract クラス
抽象クラスのモックインスタンス生成はgetMockForAbstractClassを使う(抽象クラスはそもそもgetMockではインスタンス生成できない)。その際、具象メソッドはメソッド上書きの対象にならないので注意。抽象クラス上の具象メソッドを偽装させたい時は一度その抽象クラスを継承したクラスを宣言した上で、そのクラスをgetMockで上書きする必要がある。
// AbstractClass.php
abstract class AbstractClass
{
    public function notOverridable() {
        return 'hoge';
    }

    public function concrete() {
        $this->overridable();
    }
     public abstract function overridable();
}

-------------------------
// AbstractClassTest.php
class ConcreteClass extends Abstracrt
{
    public function overridable() {
        return 'fuga';
    }
}

class AbstractedClassTest
{
    public function testAbstractMethod() {
        $stub = $this->getMockForAbstractClass('AbstractClass');
        $stub->expects($this->array())
             ->method('overridable')
             ->will($this->returnValue('moge');

        // abstractメソッド(overridable()) は上書き(実装)される
        $this->assertEquals('moge', $stub->concrete());
    }

    public function testConcreteMethod() {
        $stub = $this->getMockForAbstractClass('AbstractClass');
        $stub->expects($this->array())
             ->method('notOverridable')
             ->will($this->returnValue('moge');

        // 具象関数 notOverridable は上書きされず 'hoge'が返される(アサート発生)
        $this->assertEquals('moge', $stub->notOverridable());
    }

    public function testOverridedConcreteMethod() {
        $stub = $this->getMock('ConcreteClass');
        $stub->expects($this->array())
             ->method('notOverridable')
             ->will($this->returnValue('moge');

         // ようやく overridable()  は上書き(実装)される
         $this->assertEquals('moge', $stub->notOverridable());
     }
}

もっともこのように抽象クラスの具象メソッドを偽装させたい時に、テストクラス側に抽象クラスのサブクラスを記述しなければならないのであれば、あまりgetMock系メソッドの恩恵は少ないように感じなくもないが、それでもなお各テストメソッドにおいて動的に返り値を指定できるというメリットは大きい。

2012-06-16

github 導入2 - リポジトリ作成編

github にリポジトリ作成

github のサイト右上の Create a New Repo をクリック
プロジェクト名を入力して作成。

※ Initialize this repository with a README のチェックは外しておく。
チェックしたまま作成すると、下記の手順ではpush時にreject される。
その場合は git fetch 後 git merge origin/master を実行すればOK。

ローカルにリポジトリ作成

$ mkdir test
$ cd test
$ git init
$ touch README
$ git add README
$ git commit -m 'first commit'
$ git remote add origin https://github.com/username/test.git
$ git push -u origin master

push時にgithubに登録したユーザー名とパスワードを入力
以降は既存のファイルを編集したり、新たにファイルを追加したり際には、 add > commit > push  を繰り返す
既存ファイルの編集だけで、新たに追加したファイルがない場合は"-a"オプションをつけてcommitを実行すればaddを省略することができる。
$ git commit -a -m 'modified'

SSHで接続するにはリモート追加時に下記のように記載する
$ git remote add origin git@github.com:username/test.git

README.md の編集

Markdown 文法については下記サイトを参照

リポジトリ内のファイル操作

ファイル名変更 (README からREADME.md に変更)
$ git mv README README.md

ファイル削除(README.mdを削除)
$ git rm README.md

コミット前に削除を取り消し
$ git reset HEAD -- README.md
$ git checkout -- README.md

ファイル名変更、ファイル削除のいずれの場合も commit でリポジトリに反映
$ git commit -m 'comment'

コミット前にステータスを確認するには
$ git status

2012-06-07

【備忘】 Utuntu11.04にXdebugをインストール


eclipse PDTやNetbeansでデバッグ実行するためのXdebugの導入手順。

1 Xdebug
$ sudo apt-get install php5-xdebug

2 設定ファイルに追記
$sudo gedit /etc/php5/apache2/conf.d/xdebug.ini

zend_extension=/usr/lib/php5/20090626/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

3 Apatche 再起動
$ sudo /etc/init.d/apache2 restart


2011-08-05

Ubuntu 11.04 にLAMP環境を構築


taskselをインストールしてLAMP Server にチェックするか
$ sudo apt-get install tasksel

apt-getで次のモジュールを直接インストールする。
$ sudo apt-get install apache2 php5 php5-gd php5-mysql phpmyadmin

途中2回ほどMySQLのパスワード等を聞かれるので入力。
基本的にはこれだけで良い。
いつの間にこんなに簡単になったんだ...

念のためちゃんとインストールされたか確認:
■Apache
ブラウザからアクセス
http://localhost/
「It works!」が表示

■PHP
$ php -v
バージョン情報表示

■MySQL
$ mysql -u root -p
インストール時のパスワードでログイン

mysql> show databases;
information-schema、mysqlやphpmyadminなど既に
いくつかデータベースが作成されているはず。

■phpMyAdmin
http://localhost/phpmyadmin/
インストール時のパスワードでログイン

■PHP
test.phpなど適当な名前でファイルを作成して
/var/www 以下に保存。
ブラウザからアクセス
http://localhost/

ファイルの中身は何でも良いけど例えばこんなの。
例1: 定番Hellow World
<?php echo"Hello World"; ?>

例2: phpinfoを表示
<?php print_r(phpinfo()); ?>

---
■ログインユーザーのグループ追加、ドキュメントルートのオーナー変更とパーミッションの最適化
$ sudo usermod -g www-data USER_NAME
$ sudo chown -R USER_NAME:www-data /var/www/
$ sudo chmod 750 /var/www/

■PHPのエラーメッセージ表示
設定ファイル /etc/php5/apache2/php.ini を開いて
「display_errors = Off」をOnに修正してapacheを再起動。

■apache 再起動時に"Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName"となる場合の対策
/etc/apache2/httpd.conf を開いて次の一行を追加(デフォルトではこのファイルは空のはず)してApacheを再起動。
ServerName localhost

---
Apache 関連の備忘録:

起動/終了/再起動
$ sudo /etc/init.d/apache2 [start][stop][restart]

設定ファイルの文法チェック
$ sudo apache2ctl -t

モジュールの有効化/無効化:
$ sudo a2enmod php5
$ sudo a2dismod php5

有効な/利用可能なモジュール一覧:
$ ls /etc/apache2/mods-enabled
$ ls /etc/apache2/mods-available

サイトの有効化/無効化:
$ sudo a2ensite SITE_NAME
$ sudo a2dissite SITE_NAME

有効な/利用可能なサイト一覧:
$ ls /etc/apache2/sites-enabled
$ ls /etc/apache2/sites-available

ディレクトリの設定ファイル
/etc/apache2/sites-available/default

Apache 設定ファイル
/etc/apache2/apache2.conf

その他設定ファイル保存箇所
/etc/apache2/

Webサーバのファイル保存箇所
/var/www/

CGIディレクトリ(http://localhost/cgi-bin/)
/usr/lib/cgi-bin/

---
参考:

2011-08-04

VirtualBox 4.1 に Ubuntu 11.04 をインストールする(2) - Unity 2D

前回、VirtualBox 4.1 に Ubuntu 11.04をインストールして
Unity 3D を動かしたく色々試してみたが、結局解決せず。

Ubuntu 11.04 で Unity 3D が動作しない場合の推奨はUtuntu 10.10 までと
同様のインターフェースである Ubuntu Classic であるが、下記サイトによれば
それも2010年10月以降のリリースで廃止予定とのこと。
どうせなら、今後標準インターフェースとなるUnityに早くから慣れておきたい。
そんなで諦めきれず Unity 2D をインストールすることにした。

■Unity 2D
推奨外なので標準ではインストールされていないため、先のサイトを参考に、
ソフトウェアセンターで "unity 2D" を検索してインストール。

無事Unityは表示されるようになったけど、またしても問題発生。
今度はNautilusなどがWindows95のようなグレーのテーマに。
この現象は結構発生しているようで、フォーラム等にも載ってた。
解決策としては、下記ファイルを開いて、
/etc/xdg/autostart/gnome-settings-daemon.desktop
そこに書いてあるこの行を
Exec=/usr/lib/gnome-settings-daemon/gnome-settings-daemon
次のように修正するというもの。
Exec=bash -c "sleep 5; /usr/lib/gnome-settings-daemon/gnome-settings-daemon"

ここで自分の場合はスリープを20まで上げてみてようやく解決。
もっともそれでもダメな時もあり安定しない。ちょっとお手上げ。
この辺で辞めておかないと本職(開発作業)に影響でそうなので
とりあえずこれはこのままに。そのうちバグフィックスされることを期待。

---
以下、インストール後に行ったその他の作業。

■英語OS 日本語入力化
画面左上のUbuntuボタンをクリックして「Language Support」を検索、
起動して表示されるリスト上でEnglishを一番上にドラッグして
「システム全体に適用」をクリック。再起動すれば英語で
ログイン画面が表示される。

ログイン時は下部のタスクバーでEnglishを選べばOK。
でもこのままだと完全に英語だけなので、同様に「Input Method」を
起動してIBusが起動していないとのダイアログが表示されるのでIBusをON。
その後のダイアログでリストにAnthyを追加(というより既に追加されているはず)。
これでCtrl + Spaceキーを押せば日本語入力ができるように。

もっともCtrl + SpaceはIDEのインテリセンスで使うから削除してALT + `を追加。
これでWindowsを使ってる時と同じになる(英語キーボードでの話)。

■ホームディレクトリの日本語フォルダを英語にする
$ LANG=C xdg-user-dirs-gtk-update

■スリープ設定を切る
システム設定のハードウェアセクションにある「電源管理」を立ち上げ
「次の時間、アイドル状態が続いたら画面をスリープする」を「しない」に変更。

システム設定のスクリーンセーバーを立ち上げ「アイドル状態になったら
スクリーンセーバーを起動する」オプションと、「スクリーンセーバーを起動
したら画面をロックする」オプションをオフに。

■IPv6 無効化
Firefoxのアドレスバーに「about:config」と入力してエンター。
フィルタに「ipv6」と入力して、「network.dns.disableIPv6」を検索。
値をダブルクリックして「true」に。

端末から以下のコマンドを実行して、「sysctl.conf」ファイルを開く。
$ sudo gedit /etc/sysctl.conf
sysctl.confファイルの一番下の行に、「net.ipv6.conf.all.disable_ipv6 = 1」と
入力して保存後、OS再起動。

■ダウンロードサーバー最適化
ソフトウェアセンターを立ち上げ、メニューの「編集」>「ソフトウェアソース」を選択。
「ダウンロード元」リストは、から「その他」を選択後、「最適なサーバを探す」を
クリック。

---
参考:

2011-08-02

VirtualBox 4.1 に Ubuntu 11.04 をインストールする(1)

次の開発はLAMPで行うので、空いてるマシンがないこともあり、
オフィスの今自分が使っているマシンのVirtualBox上に
環境を構築する。LAMPでの開発、何年ぶりだろ。

それにしても、通常版Ubuntu 11.04を使うそうだが
LTS版の方じゃなくて良いのかね...

通常版だとWeb化予定の全開発が終わる前にUbuntuの
サポート期限の方が先に切れてしまいそうだが(笑)

とりあえず作業メモとして

■VirtualBox 4.1 インストール
Downloads - VirtualBox より下記2つをダウンロードしてインストール
  • VirtualBox platform packages.VirtualBox 4.1 for Windows hosts
  • VirtualBox 4.1 Oracle VM VirtualBox Extension Pack
変更など特になくウィザードに従うだけ。
途中Virtualbox用のドライバをインストールするか聞かれるのでyes

■Virtual Machineの作成

Newをクリックしてウィザードに従うだけ。途中下記を入力
[VM Name and OS Type]
Name: Ubuntu
Operating System: Linux
Version: Ubuntu

[Virtual Hard Disk]
create New hard diskのチェックを確認して、Nextをクリックして
Welcome to the virtual disk creation wizardを起動

.VDI, .VMDK, .VHDが選べるようだが VirtualBox デフォルトのVDIをチェック
パフォーマンスを考えるとFixed Sizeだろうが、ハードディスクの残容量が余り
ないのでDynamically allocatedを選択。

Locationはデフォルトだとユーザーフォルダ以下に作られてしまうので
E:\\vm\Ubuntuに変更。サイズは32GB位あれば大丈夫だろう。

■Ubuntu 11.04 インストール
いくつか種類があるが下記よりダウンロード可。

本番機は当然サーバー版を使うだろうが、開発もUbuntu上で行いたいのと、
日本語サイトも綺麗に見たい(?)ので日本語Remix版(デスクトップ版)を利用。

VirtualBox Managerで作成したVirtualMachine(今回はUbuntu)を選択して、
Storageをクリック。Storage TreeのIDE Contoller下のEmptyをクリック後、
Attributesの右端にあるCDマーク→Choose a virtual CD/DVD disk file...を
クリックして↑でダウンロードしたISOファイルを選択。
OKでSettingsを終了してVirtualBox Managerに戻ってStart。

起動したら言語を選択してインストールをクリック。
普段は英語OSで使うのだが、日本語入力もしたい(ググる時とか)。
日本語環境を後で設定するよりも、日本語環境をインストーラーに
構築してもらって英語OSに戻した方が楽だろうとの勝手な憶測から
インストール言語は日本語に。

後は下記を指定したくらいで特に問題もなくインストール終了。
  • インストール中にアップデートをダウンロードする: チェック
  • サードパーティー・ソフトウェアをインストールする: チェック
  • ディスクを削除してUbuntuをインストール
  • タイムゾーン: デフォルト「Dominica」
  • キーボードレイアウト: USA-USA
  • ログインユーザのアカウント

■Unity 3D
端末開いて下記を実行。
$ sudo apt-get update
$ apt-cache search virtualbox
$ sudo apt-get install virtualbox-ose-guest-utils
$ sudo poweroff

一旦終了してVirtualBox Managerに戻ってSettings > Display の
Enable 3D Accelerationにチェック

Unity3D 有効にならず。Virtualbox4.04用のせい?
4.1 Extensionの方が新しいので起動してVMメニューから
「デバイス」→「Guest Additionsのインストール」。これでもダメ。

Unity 対応チェック
$ /usr/lib/nux/unity_support_test -p
Unity supported: no
やはり...ちなみに別のマシンで全く同じ環境で構築したところも問題なくUnityが
有効になったのでマシンのせい?
VMとはいえ、ホスト側のデバイスドライバとかも関係するのか...

---
参考:
 
Copyright 2010 toconuts. Powered by Blogger Blogger Templates create by Deluxe Templates. WP by Masterplan