2014年5月31日土曜日

centos6.5にnginxの導入

HHVM-FastCGIを動かしてみたいので、
これまでApacheを導入することが多かったのですが、
nginxというHTTPサーバを入れてみようと思います。

nginx(http://nginx.org/ja/)は”えんじんえっくす”と読むようです。
読み方がわからなかったので、勝手に”にんくす”みたいに思っていました。

(余談:スターウォーズに「ニンクス」というキャラクターがいるようだ。)


まず、
/etc/yum.repos.d/nginx.repo
というファイルを作成して、以下を記述します。
 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1


そして、インストールします。
$ sudo yum install nginx

これでインストール完了です。

サービスを起動します。
$ sudo service nginx start

ブラウザで確認すると、
http://192.168.33.10/

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working.

ということで、web serverが出来ました。


ssh接続で、Host key verification failed.

vagrant ssh ではなく、プライベートのIPアドレスでSSH接続するときに

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

と怒られてしまうことがあります。

幾つかの仮想マシンを作って実験しているとプライベートネットワークの
IPアドレスが既存の仮想マシンのIPアドレスと一緒の場合に
「以前のKeyと違いますよ」と言われているようです。

プライベートのIPアドレスを別のものに変更すれば良いですが、
実は以前の仮想マシンは既に破棄していて使っていないということが
よくあり、Vagrantfileの既定値で記載されている192.168.33.10を
そのまま使いたい場合は、
メッセージに表示されている /User/(USER_NAME)/.ssh/known_hosts
を開いて、被っているIPアドレスのKeyを削除することで解決できます。




vagrant で CentOS6.5にHHVMの環境構築


HHVMは、WEBサーバとPHPが実現できて、その上、PHPよりも高速だという話です。
これまでPHPを開発していたので移行しやすく有効活用できるらしいです。

vagrant は導入済みの前提となります。
(導入については過去記事またはを参照願います)

vagrant box を新規に作成

今回はこちらのCurrent BoxesからCentOS 6.5 x64をダウンロードする
http://puppet-vagrant-boxes.puppetlabs.com/


(以下、sudoが必要な場合も記載を省略しています)

$ vagrant box add centos65 ダウンロードディレクトリ/centos-65-x64-virtualbox-nocm.box
$ vagrant init centos65
$ vagrant up

既に、vangrant pluginにsaharaを導入しているので、
一旦ここで、sandboxをonにしておく。
$ vagrant sandbox on

仮想マシンへsshでログイン
$ vagrant ssh

まず、アップデート
$ yum -y update

不便なのでタイムゾーンが日本時間にします。
$ vi /etc/sysconfig/clock

ZONE="Asia/Tokyo"
と編集します。
それと、localtimeファイルを変更します。
$ cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime


一度再起動します。
$ vagrant reload

すると起動時にマウントの失敗のメッセージが出ますので、
VirtualBox Guest Additionsの最新をインストールします。
こちらの記事を参照)

再度、仮想マシンを起動して問題なければ、
一旦ここで、boxを残しておこうと思います。

まずは、sandboxのcommit
$ vagrant sandbox commit


そして、boxの作成をします。ファイル名は適当に。
$ vagrant package —output cento65-x64-ja.box

再始動します。
ここからが、HHVMの構築です。

$ vagrant up
$ vagrant ssh

epel repositoryをインストールします。
$ yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

hop5 repositoryをダウンロードします。
$ cd /etc/yum.repos.d    <--追記(記載漏れ)
$ wget http://www.hop5.in/yum/el6/hop5.repo

そして、hhvmのインストールをします。
$ yum install hhvm

いろいろとインストールされますが、最後にComplete!と表示され、完了します。

$ hhvm —version
HipHop VM 3.0.1 (rel)


動かしてみます。
phpが動作するということなので、

$ vi hello.php
echo ‘hello php’;
とphpファイルを作成して、保存します。

$ hhvm hello.php
を実行すると、「hello php」と出力されます。

ちなみにphpinfo()を書いて実行すると
「HipHop」
と出力されます。

一旦、仮想マシンを抜けまして、
ホストPC上で、Vagrantfileを編集し、仮想マシンを
プライベートネットワークからアクセスできるようにします。
Vagrantfileを開いて、26行目付近の
  config.vm.network :private_network, ip: "192.168.33.10"
のコメントを解除して保存します。

そして、
$ vagrant reload
$ vagrant ssh
で仮想マシンを再起動し、SSHログインします。

hhvmを以下のコマンドでサーバとして実行します。
$ hhvm -m server
(control + c で停止)

ホストPCからブラウザで、
http://192.168.33.10/hello.php
へアクセスすると、
「HipHop」
と出力されます。

これで一旦HHVMの導入を終了です。



2014年5月29日木曜日

CakePHPのControllerのテストでハマった

Cookbook http://book.cakephp.org/2.0/ja/development/testing.html#id23
にならって、テストケースを作成していたが、

ここで、test.phpで
Controller / ArticlesControllerをクリックすると

Error: Class 'AppController' not found
File: /var/www/html/cake_2_5/app/Controller/ArticlesController.php

とFatal Errorが出ている。
testでない場合は、ArticlesController.phpは問題ないようだが・・


いろいろとググって調べた。
こちらのサイトが参考になった。
http://y-stream.blogspot.jp/2013/08/cakephp-phpunit.html


TestCaseのほうで、

<?php
App::uses('AppController', 'Controller'); 
class ArticlesControllerTest extends ControllerTestCase {

と、App::usesのAppControllerの指定が抜けていた。
Cookbook通りだと忘れてしまうので、今後気をつけたい。


2014年5月28日水曜日

CakePHPでユニットテスト

cakeでUnitTestを実施してみる。
Cookbookのように
ProgressHelperを作成してapp/View/Helperに保存する。

次に、テストケースを作成する。

Cookbookに合わせて、app/Test/Case/View/Helperに、
ProgressHelperTest.php
を作成。

テストを実行。

ブラウザで、http://192.168.33.11/cakephp/test.php
を開く、
AppのTestsをクリックすると、CakePHPでPHPUnitのときにはなかった
Test Caseに、「ProgressHelper」が現れる

で、ProgressHelperをクリックすると、

赤くErrorが出ている。

Error: syntax error, unexpected 'pubic' (T_STRING), expecting function (T_FUNCTION)   
File: /var/www/html/cake_2_5/app/View/Helper/ProgressHelper.php   
Line: 4


pubicとタイプミスだ。

'public'と修正して、再度テストを実行する。


FAILED

と出ている。

ProgressHelper.phpにて、
divタグのclass名のタイプミスだ。
コロンが抜けていた。

修正して、テストを実行する。
こんなふうに何度でもテストが行える。

結果、グリーンに「1 passes」と出て、テストはパスしたことになる。

2014年5月27日火曜日

vagrant plugin sahara


vagrant のpluginに「sahara」というのがある。

導入するとサンドボックスとして使用できるようになるものだ。

サンドボックスモードのON/OFF, COMMIT/ROLLBACKが可能となり、
サンドボックスモードがONであれば、その間に仮想マシンに対して行った変更を、
ロールバックすることで元に戻すことができる。
oracleやpostgreSQLなどのリレーショナルデータベースなどのトランザクション処理   
のように、rollbackできるので、いろいろ試してみたい場合に便利だ。


というので、プラグインのインストール。

$ vagrant plugin install sahara

インストールしたプラグインを確認

$ vagrant plugin list
sahara (0.0.16)

saharaがインストールできたので、sandboxをonにする。
$ vagrant sandbox on


PHPUnitの導入で導入を失敗したときに、

$ vagrant sandbox rollback

として、sandbox onとしたタイミング、もしくは、前にcommitしたタイミングに
仮想マシンの状態を元に戻してから再度、PHPUnitの導入をやり直した。

そして、仮想マシンとして問題なければ
$ vagrant sandbox commit
する。

2014年5月24日土曜日

CakePHPでPHPUnit




PHPUnitの準備ができたので、
Cookbookに戻って、テスト用にDatabaseを作成する。

楽しようと思うので、
phpMyAdminを使うことにする。

ログインしたら、テスト用データベース「cake_test」を作成する。
照合順序は同じく「utf8_general_ci」とする。

データベース[cake_sample]を開いて、
postsテーブルを選択する。















「操作」メニュー






















「cake_sample」を「cake_test」に変更して、
cake_testデータベースのpostsテーブルにコピーをする。



次に、cakeのapp/Config/database.phpを編集。

DATABASE_CONFIG クラスの$test配列にcake_testへの接続を記入する。

テストが実行できるか確認する 
とあるので確認する
ブラウザで、http://192.168.33.11/cakephp/test.phpへアクセスする。

CoreのTestsを選択するとテストケースが並んで見れる。
「AllConfigure」をクリックする。

23/23 test methods complete: 23 passes, 0 fails, 54 assertions and 0 exceptions.と出て、テストすることが確認できた。

これで、CakePHPのテスト環境が完了。


PHPUnitの導入 (つづき)の続き

前回の続き、

やり直すことにした。

Cookbookのテストの記載の
内容は、こちらの環境では異なるようなので、別の方法として、

PEARをインストールすることからやらずに、直接PHPUnitをyumでインストールする
(※以下rootで実施)

$ yum install phpunit

Installing:
 php-phpunit-PHPUnit
Installing for dependencies:

 php-pear
  :

などと表示され、pearとphpunitはインストールされるようだ。
(他にもいろんなものが一緒に入ったが・・・)


その結果、
/usr/share/php/PHPUnit/ができており、
中には、Autoload.phpも存在する。

再度、
http://192.168.33.11/cakephp/test.php
を確認すると
Warningが解消され、「CakePHP Test Suite 2.4.9」と
PHPUnitの準備ができたようだ。


PHPUnitの導入 (つづき)

※環境によってはうまくいかないことがあります。最後までお読みください。

ブラウザで以下へアクセスしても
http://192.168.33.11/cakephp/test.php

PHPUnit is not installed! 
と、言われている。
phpunitはインストールできていると思うのだが。。

PHPUnit/Autoload.php云々とWarningが出ている。
そして、
To install with the PEAR installer run the following commands:
pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit
Once PHPUnit is installed make sure its located on PHP's include_path by checking your php.ini
とも言われている。

Cookbookによると、
“PHPの include_path 上にPHPUnitの ライブラリがあるか確認してください。”
とある

include_pathを確認すると、
.:/usr/share/pear:/usr/share/php

となっていた。


そこらには、"PHPUnit"は見当たらない。



phpunitは、/usr/local/bin/phpunit なので、

/usr/share/pearにシンボリックリンクを貼ってみる。

ブラウザで以下へアクセスする。
http://192.168.33.11/cakephp/test.php

解消されず。

一応、/usr/share/phpにシンボリックリンクを貼ってみるが、解消されない。


一応、"PHPUnit"と大文字にしてみても意味が無い。


何かが根本的におかしい。
Failed opening 'PHPUnit/Autoload.php'  
とエラーも出ているが、”PHPUnit”というのが見当たらない。

。。。
一からやり直すことにする。

2014年5月23日金曜日

PHPUnitの導入

※環境によってはうまくいかないことがあります。最後までお読みください。

CakePHPでの開発において、ユニットテストを実施するために、PHPUnitの導入を行う。

Cookbook記載の通りにやってみる。
$ sudo pear upgrade PEAR

“コマンドが見つかりません”となる。

PEARが入っていなかったようだ。


まず、PEARパッケージマネージャをインストールする
wget http://pear.php.net/go-pear.phar
$ php go-pear.phar

ディレクトリを変更するかどうか聞いてくるが、問題なければそのままEnterとする。
インストール完了

次に、PHPUnitのインストール
$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ mv phpunit.phar /usr/local/bin/phpunit

これで良いようだ。

確認。
$ phpunit --version PHPUnit 4.1.0 by Sebastian Bergmann.

ブラウザで以下へアクセスする。
http://192.168.33.11/cakephp/test.php

PHPUnit is not installed! 
と、言われている。

何かおかしいようだ。

2014年5月22日木曜日

FormHelperのpostLink

CakePHPを導入したらCookbookにある
「ブログチュートリアル」をベースに進めていくと大変わかり易い。

そこにある「記事投稿の削除」では、GETリクエストで投稿を削除するのはWEBクローラが不要に削除するので危険であるとあるので、POSTリクエストによる削除を行うことにするが、記事の追加、投稿記事の編集のようにFormHelperをつかって、createからendまで書くのは手間である。

そこで、postLinkというものがあるのでこれを解析してみる。

echo $this->Form->postLink('Delete', array('action' => 'delete', $post['Post']['id']), array('confirm' => 'Are you sure?'));

を書き、実際にページを作成してブラウザ(※Google Chromeを使用している)で表示したところで、
”Delete”リンクで右クリックし、”要素の検証”をクリックするとブラウザの下部に要素(ソースの一部)が表示される。

上記のpostLinkの箇所が以下のようになっているのがわかる。

  1. <form action="/cakephp/posts/delete/5" name="post_537d6ddaf1adf620659485" id="post_537d6ddaf1adf620659485" style="display:none;" method="post”>
  2.      <input type="hidden" name="_method" value="POST”>
  3. </form>
  4. <a href="#" onclick="if (confirm("Are you sure?")) { document.post_537d6ddaf1adf620659485.submit(); } event.returnValue = false; return false;">Delete</a>
つまり、postLinkは、1〜3行目で、method=“post”のaction="/cakephp/posts/delete/5”のformタグを作成して、非表示としている(display:none)
その上で、4行目にて”Delete”としたaタグのonclickイベントで、先のformをsubmitするようになっている。
formのidは、自動で付加されているらしい。
また、postLinkでconfirmを指定しているので、確認ダイアログが出るようになっている。



2014年5月20日火曜日

vagrant 仮想環境構築のイメージ


vagrant仮想マシンの構成の私が想像するイメージ図を以下に示す。(誤解があるかも)
 


コマンド vagrant box 〜で管理できるものは、右の緑で表したものになり、vagrant box listでは、a, b, cが表示される。
左が、vagrant upで稼働するVMにあたり、いずれかのboxによって作られていることになる。
ここでは、VMの色が、それぞれディレクトリが異なる(Vagrantfileが異なる)ものとして構成され、上の水色の3つのVMは同じディレクトリに存在する。
defaultは最初にできてしまったものなので無くてもよいのだが、構成として意味があるものであれば良い。

VagrantfileにVMを3つ記述することで、別のVMを構築することができる。(しなくても特に問題ない)
vagrant up で一度に3つのVMを起動できるし、vagrant up [vm-name]で個別に起動もできる。
関連があるのであれば、Multi-Machineとして複数のVMをひとつのVagrantfileで管理できるし、特に関連がないならば、別のディレクトリに分けて扱うのがよい。


vagrantでpackageの作成

vagrantで構築した仮想マシン(vagrant machine)をpackage化する。

コマンドをたたく
$ vagrant package

package.boxが作成される

仮想マシンをシャットダウンしていなかったため、自動でshutdownしてくれる。
—outputオプションで、packageファイル名(パス)を指定しない場合は、同じディレクトリに「package.box」として作成される。

packageされたboxファイルを別のPCへ持っていけば、同じ仮想環境をすぐに作ることができる。
$ vagrant init [box-name] [box-url]
box-urlにpackage.boxへのパスを指定する。

ただし、元の仮想マシンがprivate networkで構築している場合に新しいPCでもprivate networkを使用する場合は注意が必要で、
vagrantのネットワークエラー」でも記載の通りエラーとなることがある。


2014年5月19日月曜日

CakePHP is NOT able to connect to the database.

cakephpのデータベースを設定(app/Config/database.php)しても
以下のメッセージがでる場合、

CakePHP is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.


接続するユーザの特権が不足している可能性がある。

phpMyAdminで対象ユーザの特権を確認し、
チェックが付いていなければ、チェックを付ける。