2014年9月1日月曜日

MacBook Airでスクリーンロック

ちょっと離席するときなど、画面をロックしたい場合は以下のショートカットでできる

shift + control + power

2014年7月29日火曜日

削除したファイルの復旧(Windows)


Windowsで、ファイルを誤って消してしまってゴミ箱にも入っていない場合に
削除したファイルを復元したいという依頼がありました。

なぜ、ゴミ箱にも入っていないのかわからないということで、
ググって調べたところ大容量のファイルの削除では、ゴミ箱に入らずに
削除されるようなので、それだと思います。

以下のサイトを参考にしました。
http://e-ene.com/soft/download_recuva/

ここに書いてあるとおりですが、
一旦MACでソフトをUSBメモリに解凍し、
そして対象のWindowsにUSBメモリからソフトを起動して
復元を実施します。

大量の写真や動画ファイルなので、結構時間がかかりました。

復元したファイルですが、ディレクトリ階層までは復元せず、
ファイルが全て同じディレクトリに復元し、同じファイル名であれば、
`_1`と付番されていってます。

なので、ソフトの復元対象の一覧を元に、
ディレクトリを一つ一つ作って、ファイルをそれぞれのディレクトリに
移していくという作業を強いられました。

なんとか無事に復旧出来ましたが、
他に良いソフトが有ったかもしれないです。

2014年7月10日木曜日

CakePHP のPluginのSchemaを構築するときの問題

CakePHPのPluginのSchemaを導入するときの問題

$ Console/cake schema create -p Users
とプラグインを指定してSchemaを導入しようとした時に、
The chosen schema could not be loaded. Attempted to load:とメッセージが出て失敗していた。

Class名を指定する必要があったので、

$ Console/cake schema create --name Users -p Users
として導入できた。

2014年7月4日金曜日

UnitTestでデータベース接続失敗


こちらの記事 で、CakePHPのUnitTestの環境を作りましたが、
cookbook
http://book.cakephp.org/2.0/ja/development/testing.html#id5
にあるように
$ ./Console/cake test app Model/Post
とコマンドからテストを実施することを確認しました。

CakePHP Test Shell
---------------------------------------------------------------
Error: Database connection "Mysql" is missing, or could not be created.

とエラーが出てしまいます。

調べたところ(参照元のサイトをひかえておくのを忘れてしまいました。。)
lib/Cake/Console/cake のシェルスクリプトに、
exec php -q "$CONSOLE"/cake.php -working "$APP" "$@"
と、phpコマンドを実行しています。
これを、
exec hhvm "$CONSOLE"/cake.php -working "$APP" "$@"
と変更すると良いです。
同様に、
app/Console/cake シェルスクリプトも

exec php -q "$CONSOLE"/cake.php -working "$APP" "$@"
       ↓
exec hhvm "$CONSOLE"/cake.php -working "$APP" "$@"

と変更します。

これでコマンドからのテストも問題なく動きました。

2014年6月28日土曜日

Macbook Airで、aliasを設定する

前回、CentOSのaliasを調べたので、

Macbook Airのターミナルに適用したいと思います。

~/.bash_profile
に以下を記述します。

if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi


~/.bashrc
に、以下を記述します。

alias l.='ls -d .*'
alias ll='ls -l'
alias ls='ls'
alias vi=‘vim'

2014年6月27日金曜日

CentOSのalias設定


CentOSに、vagrantアカウントでログイン後には、
$ ll
コマンドで、
$ ls -l
と同じことができるようになっている。
ほとんど癖で使っていたが、Macbook Airのターミナルでは
$ ll
は使えなかったので、設定しようと思うのですが、
CentOSの方でどのようになっているかを調べてみます。

CentOSでは、aliasが設定されているので、
$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde’

と表示されました。
なので、こちらを参考にし、
http://www.atmarkit.co.jp/ait/articles/0203/12/news001_2.html

/etc/profile
を見てみます。

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" ]]>/dev/null 2>&1
        fi
    fi
done
と書いてあります。
/etc/profile.d/*.sh
で.shを全て読んでいるようです。

$ ls /etc/profile.d/
colorls.csh  glib2.csh  hphp.sh   lang.sh   less.sh  vim.sh
colorls.sh   glib2.sh   lang.csh  less.csh  vim.csh  which2.sh

colorls.sh
を開いてみると
いろいろと記載がありますが、最後に
alias ll='ls -l --color=auto' 2]]/dev/null
alias l.='ls -d .* --color=auto' 2]]/dev/null
alias ls='ls --color=auto' 2]]/dev/null
とありました。

vim.sh
には、
  alias vi >/dev/null 2>&1 || alias vi=vim
とあります。
そして、
which2.sh
には、
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde’
です。

一応、全てのaliasが設定されていることがわかりました。

2014年6月25日水曜日

cakephp(hhvm+nginx+mysql)のUnit Test

続いて、
unit testの環境を作ります。

CakePHPのUnit Testは、test.phpで実施できますので、
http://192.168.33.10/test.php
を指定します。


PHPUnit is not installed!

と出ます。

hhvmでは、phpをいれなくてもよいので、pearもいらないだろうと思うので、
pearは入れずに、phpunitを入れようと思います。

composerを使ってインストールします。

こちらを参考にしてダウンロードします。
https://github.com/facebook/hhvm/wiki/OSS-PHP-Frameworks-Unit-Testing:-General
https://github.com/facebook/hhvm/wiki/OSS-PHP-Frameworks-Unit-Testing:-CakePHP

$ cd /usr/share/nginx/html/cake_2_5

$ wget https://getcomposer.org/download/1.0.0-alpha8/composer.phar

$ vi composer.json

{
  "config": {
    "vendor-dir": "vendors"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*"
  }   
}


そして、インストール。
$ hhvm composer.phar install --dev

次のようなエラーがでることがあります。

SlowTimer [5007ms] at curl: https://packagist.org/p/provider-archived$4f097d431ccbfed3a6c36a172a662645d227ec94d074b7a9484490726c4c5500.json

The "https://packagist.org/packages.json" file could not be downloaded: Failed to open
   https://packagist.org/packages.json (Resolving timed out after 5000 milliseconds)   

などのメッセージが出てました。

タイムアウトっぽいです。
以下のサイトを参照。
https://blog.engineyard.com/2014/hhvm-hack-part-2

$ hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 -v Eval.Jit=false composer.phar install --dev

として、なんとかなりそうです。


phpunitが入ったかを確認します。

http://192.168.33.10/test.php

すると、
何も表示されなくなりました。
真っ白です。

一応、PHP Unitはインストールされたとみて良さそうです。


cake_2_5/lib/Cake/TestSuite/CakeTestSuiteDispatcher.php
を調べてみて、
100行目あたりにある
ob_get_clean();
これをコメントアウトして、実施すると、
test.phpが思ったようなTest Casesが出るようになりました。

どうやら
ob_get_clean();
がphpと動きが違うような気がします。
とりあえずは、OKで。
この辺はできれば追って調べることにします。

2014年6月12日木曜日

CakePHP Error: The requested address


http://192.168.33.10/へアクセスすると

Error: The requested address '/' was not found on this server.

とエラーが出て、はまってしまったので、記録に残します。

app/Config/core.php

34行あたりのDebug Levelを0にしていたために
出るようになったようです。

いろいろと試していて、Debug Levelを変えてしまったのですが、
http://192.168.33.10/posts/
へのアクセスではエラーがでていなかったため、なんの影響かがわからずに
はまってしまいました。

Debug Levelを1または2にするとエラーはでなくなります。

本番用としてDebug Levelを0にした場合には、あまり見せれないページですので、
そのまま、Not Foundが返るようにしておくとよいですが、
必要であれば、app/View/Pages/home.ctpを編集するとよいです。

2014年6月11日水曜日

MacBook Airでの、HomeやEndキーの扱い

WindowsのPCを使っていた頃は、よく「Home」キーや「End」キーで
文章の行頭や行末への移動にに使っていましたが、
MacBook Airを使ってそのキーがなく、不便に思っていました。

WindowsPCでは、fn+矢印キーでHome,End,PageUp,PageDownが出来るメーカーの
キーボードがありましたが、よく使うキーなので
あえてHome,End,PageUp,PageDownが独立したキーを持ったThinkpadを使っていたものです。

そこで思いつきました。
Macでもfn+矢印キーで同じようにHome,End,PageUp,PageDownに当たるのではないかと。

やってみました。

”ほぼ”思った通りでしたが、多少動きが違いました。
エディタ「Sublime Text」で使うと概ねできていましたが、
Evernoteだと”行”での先頭、末尾ではなく、ノート全体の先頭と末尾という感じです。
WinPCでのCtrl+Home,Ctrl+Endみたいな感じでした。
ブラウザ上だとまた動きが違いますので、完全な代替キーとはならないです。

今更ながらGoogleで「mac home end キー」とキーワードを入れて検索してみると
誰もが同じように考えているようでいろいろと出てきましたが、
以下のアップルサポートにあるように、fnキーよりは、Commandキーが対応しているようです。
http://support.apple.com/kb/PH13725?viewlocale=ja_JP

改めて、Command+矢印キーでやってみると、Commandキーのほうが”正しい”動きをしている感じです。
ブラウザのURL入力欄や、検索用Input欄も先頭と末尾へ移動できます。

2014年6月6日金曜日

cakephpのアプリとhtmlを分離する

Cookbookには、応用インストールとして
http://book.cakephp.org/2.0/ja/installation/advanced-installation.html#cakephp
「複数のアプリケーションでCakePHPを共有する」というのがあります。

エンジニアとデザイナが分散開発したいときに同じファイルを編集してしまい、
デグレードするということもありますので、うまく開発したいところです。
そのためにはソース管理から分けてしまうというのは、ひとつの手だと思いますので、
これを試して、CakePHPのコアライブラリと、phpアプリ部分と、静的なhtml(js,css)を分離したいと思います。


以下が手順です。(sudoが必要な場合もを省略して書いています。)

やりたいこととして、
  •  CakePHPのコアライブラリを/usr/lib/Cakeに置きます。
  •  appを/usr/share/nginx/scriptに置きます。
  •  webrootを/usr/share/nginx/htmlに置きます。

※前提として、この記事の環境までができているところからになります。

$ cd /usr/share/nginx/html/cake_2_5

まずは、コアライブラリを複数のアプリケーションで使えるようなところへ移動します。

$ mv cake_2_5/lib/Cake /usr/lib/

次は、アプリケーションのwebroot(静的なページ)をドキュメントルートにします。
$ mv cake_2_5/app/webroot /usr/share/nginx/html/

/etc/nginx/conf.d/default.confを編集
location / と location ~ \.php$ の2箇所のrootを次のようにします。
root  /usr/share/nginx/html/webroot;

confを編集したので、再起動します。
$ service nginx restart

(php)アプリケーション部分を移動します。

$ mv cake_2_5/app /usr/share/nginx/script/

最後に、CakePHPの定数を編集します。
/usr/share/nginx/html/webroot/index.phpを編集します。
編集する定数は、 ROOT 、 APP_DIR 、 CAKE_CORE_INCLUDE_PATH です。

それぞれ以下のようにします。
39行目付近     define('ROOT', DS . 'usr' . DS . 'share' . DS . 'nginx' . DS . 'script');
47行目付近     define('APP_DIR', 'app');
64行目付近     define('CAKE_CORE_INCLUDE_PATH', DS . 'usr' . DS . 'lib');

以上で、設定はできましたので、
ホストPCからブラウザで、http://192.168.33.10/へアクセスすると
CakePHPのデフォルトのページが出るようになります。
もちろん、http://192.168.33.10/postsへアクセスすれば、
ブログチュートリアルで作成したページヘアクセスできます。

2014年6月5日木曜日

failed (13: Permission denied) while reading upstream

nginxの設定ファイルnginx.confにuserという項目があります。
nginxのworker processというプロセスの実行ユーザを指定することができますが、
これを、apacheやwww-dataなどに変更する場合、
サイトが"応答なし"となったりしました。

ログファイル /var/log/nginx/error.log を確認すると

"/var/cache/nginx/fastcgi_temp/1/00/0000000001" failed (13: Permission denied) while reading upstream,

といったメッセージが出力されています。


/var/cache/nginx/fastcgi_temp
以下のディレクトリやファイルが、nginx.confで先に指定していたuserで
作成されているため、変更後のuserでは、Permission deniedということです。

変更後のuserがnginxの場合、

$ sudo chown -R nginx. /var/cache/nginx/fastcgi_temp/*

を実行して、アクセスできるようにします。

nginx, hhvmでcakephpを動かす その2

MySQLデータベースも準備出来たとして、(他の記事を参照)
以前に作成しているブログチュートリアルのcakephpのphpファイルをコピーして、

http://192.168.33.10/posts

とすると

404 Not Found

と出ます。

http://book.cakephp.org/2.0/ja/installation/url-rewriting.html#nginxurl
このCakePHPのCookbookにもあるように、nginxでの設定が載っています。

/etc/nginx/conf.d/default.confを編集します。
location / {}の欄に

    try_files $uri $uri/ /index.php?$uri&$args;

を追記します。


nginxをrestartして、

http://192.168.33.10/posts

を確認すると、postsコントローラが生きて、postsのデータが表示されるようになりました。

2014年6月4日水曜日

tmpディレクトリの書き込み権限



CakePHPにおいて、app/tmpディレクトリはWebサーバからの書き込みが

出来るようにしておく必要があるので、webサーバの実行ユーザを知るために、

whoami.phpファイルを作成して、以下を記述します。

<?php echo exec('whoami');?>

そして、ブラウザでアクセスすると

root

と表示されました。
apacheで構築した時は、ユーザはapacheだったので、今回の場合だと、ユーザはnginxになると思いましたが違いました。
apache+phpのときとは異なるようで、
さすがにrootで実行するのはよろしくないだろうと思いましたので、
HHVM-FastCGIの実行を、rootで実行していたのを、
適切なユーザで実行するようにします。

今回は、デフォルトユーザの、vagrantユーザで実行しますので、
$ hhvm -m server -vServer.Type=fastcgi -vServer.Port=9000
として、再度、whoami.phpを確認すると、

vagrant

と表示されました。

そうすると、今度は、CakePHPのサイト表示において、
Permission denied
Not a valid stream resource
_cake_model_ cache was unable to write ...
といったWarningが出ます。
CakePHPのapp/tmp/Cache内のファイルがrootで作成されているため、
変更したvagrantユーザでは扱えないといったメッセージです。

ですので、、CakePHPのapp/tmpディレクトリを、
$ sudo chown -R vagrant. app/tmp
として、vagrantで書き込みできるようにします。

nginx, hhvmでcakephpを動かす

cakephpをhhvm+nginx上で動かすように試みます。
(これまでの構築の続きなので前の記事の環境が前提となります。)

/usr/share/nginx/htmlにcakephpを配置します。

CakePHP-2.5.1を持ってきました。
/usr/share/nginx/html/cake_2_5
とします。

nginxの/etc/nginx/conf.d/default.confを編集します。

cakeのドキュメントルートは、app/webroot/になるので、以下のように変更します。

location / {
    root    /usr/share/nginx/html/cake_2_5/app/webroot;
    index  index.php index.html index.htm;
}

location ~ \.php$ {
    root           /usr/share/nginx/html/cake_2_5/app/webroot;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

今回、fastcgi_paramのところでは、$document_rootと変更しています。

これで、nginxのサービスを再起動しまして、
ホストPCからブラウザでアクセスします。
http://192.168.33.10/

CakePHPの既定のページが表示されるようになりました。

2014年6月2日月曜日

HHVM+nginxでphpを動かす

nginxのweb serverが立ち上がりましたので、
hhvmで、FastCGIモードでサービスを立ち上げます。

$ hhvm -m server -vServer.Type=fastcgi -vServer.Port=9000
※訂正:sudoで実行していましたが、適切なユーザで実行してください。

次に、nginxにfastcgiを設定します。
$ sudo vi /etc/nginx/conf.d/default.conf
を編集します。

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
の下にある
location ~\.php$ {}のところのコメントを外し、
半ばのfastcgi_paramの設定で、
/scriptを実際にphpファイルを置く場所に変更します。
とりあえず、今回はhtmlと同じドキュメントルートにして、
/usr/share/nginx/html
とします。

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

phpのテストファイルを作成して、先ほどの
ドキュメントルートに置きます。

ホストPCからブラウザでアクセスします。
http://192.168.33.10/test.php

これで一応nginx+hhvmでPHPが実現できました。

URLにindex.phpを指定せずに読めるようにするための設定が
抜けていました。

先ほどの/etc/nginx/conf.d/default.confを編集します。

location / {}のところのindexの設定に、"index.php"を追加します。
左にある方が優先されるようなので、すでにあるindex.htmlより左に追記します。

あとは、サービスをreloadします。

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で対象ユーザの特権を確認し、
チェックが付いていなければ、チェックを付ける。