10/1に第56回PHP勉強会@関東、10/6にCakePHP2.0勉強会へ行ってきた。

途中まで書いてて未公開のまま放置してた(;´Д`)
せっかくなので公開するっ!

最近のトレンドはCakePHPとテスト(TDD)です!!

そしてみなさん半端ない phpmatsuri おしw

ちなみにCakePHP2.0はまだ全く触っていません!
が、もうすぐでリリースされそうなのでそろそろ使ってみようかなーっ。

  • @cakephper オープニング
  • @basuke セッション1「CakePHP2.0のModel関係の変更点と、Entity Pluginの2.0対応状況報告」
  • @hiromi2424 セッション2「CakePHP2.0の新しいAuth」
  • @konsan (LT) bake by CakePHP2.0

bakeでsearch plugin対応したソースを吐き出す。

1.3ですけど、自分もやってたなー。

  • @yando candycane
  • @kaz_29 pull request

その場でCakePHP2.0のGithubへpull requestを送信!
そして数時間後には返事が!!早いっ。
https://github.com/cakephp/cakephp/pull/229

Githubは一応使ったことあるけど、よくわかってない。
そしてオープンソースへのこういったpullもやったことないので、
そのあたり今後はやっていきたいなー。

  • @junnama MT Cake

MTのテンプレートエンジンをCakeで使うお話。
MT自体使ったことないに等しいので…。

1つわかったのは4月1日にリリースはしないほうがいいってことww

いろんなエディタを使用してきて、最終的にvimに行き着き、
cakeのaction,controller,viewなどへのジャンプ機能プラグインが最強っていうお話。

cake.vimはすごい気になった!
viはサーバーいじる時に使ってるけど、vim経験はないんですけどね。

ちなみに僕のこれまでのエディタ遍歴

サクラエディタ(ちょっとした変更には今も使用してます)

eclipse(重たいので封印)

netbeans(今ここ。)

  • @gusagi CakePHP2.0の例外処理 ちょっとだけ食べてみた

ここまで使うの?ってほどいろいろ用意されてるってお話。


会場を提供いただいた、株式会社 永和システムマネジメントさん、株式会社VOYAGE GROUPさん、また運営者の方々ありがとうございました。

Mac Air Lion にPHPの開発環境を構築する

MacではPHP開発環境を構築する方法は2つあります。

1つ目は、MAMPをインストールする方法で、
2つ目は、MacPortsからPHPapacheMySQLをインストールする方法です。

今回は2つ目の方法で環境を構築しました。

※あとで知ったことですが、MacPorts以外にも Fink とか homebrew というパッケージ管理ツールもあるみたいです。
Fink は調べてないのでわからないですが、homebrew は Ruby で実装されてたり MacPorts よりも早いという情報があったのでいつか試してみたいです。

MacPortsインストール

OSはLionなので「MacPorts-2.0.1-10.7-Lion.dmg」をダウンロードして、インストールを実行します。

ターミナルを開いて、インストールされているか確認。

$ port version
Version: 2.0.1

以下のコマンドで最新の状態にできます。
それぞれダウンロードと更新を行っているようです。

$ sudo port selfupdate 
$ sudo port sync

PHPPearApacheインストール

(間違えて-vオプションをつけてしまったので結果は残せず…)
ちなみに、Pearのインストールは今後peclでmongoをインストールする可能性があるので、入れてあります。普通は必要ないかな。

$ sudo port install php5 +apache2 +pear

yumみたいに勝手に php が有効にならないんですね。
その辺も含め下記のように修正しました。(diffで表記)

$ sudo vi /opt/local/apache2/conf/httpd.conf

117d116
< LoadModule php5_module modules/libphp5.so
208c207
<     Options ExecCGI FollowSymLinks
---
>     Options Indexes FollowSymLinks
215c214
<     AllowOverride All
---
>     AllowOverride None
230c229
<     DirectoryIndex index.html index.php
---
>     DirectoryIndex index.html
473,474d471
< Include /opt/local/apache2/conf/extra/mod_php.conf

MySQLインストール

$ sudo port install mysql5-devel mysql5-server-devel
Password:
--->  Computing dependencies for mysql5-devel
--->  Fetching archive for mysql5-devel
--->  Attempting to fetch mysql5-devel-5.5.2-m2_1.darwin_11.x86_64.tbz2 from http://packages.macports.org/mysql5-devel
--->  Fetching mysql5-devel
--->  Attempting to fetch mysql-5.5.2-m2.tar.gz from http://mirror.facebook.net/mysql/Downloads/MySQL-5.5/
--->  Attempting to fetch mysql-5.5.2-m2.tar.gz from http://distfiles.macports.org/mysql5
--->  Verifying checksum(s) for mysql5-devel
--->  Extracting mysql5-devel
--->  Applying patches to mysql5-devel
--->  Configuring mysql5-devel
--->  Building mysql5-devel
--->  Staging mysql5-devel into destroot
--->  Installing mysql5-devel @5.5.2-m2_1
The MySQL client has been installed.
If you also want a MySQL server, install the mysql5-server-devel port.
--->  Activating mysql5-devel @5.5.2-m2_1
--->  Cleaning mysql5-devel
--->  Computing dependencies for mysql5-server-devel
--->  Fetching archive for mysql5-server-devel
--->  Attempting to fetch mysql5-server-devel-5.5.2-m2_1.darwin_11.noarch.tbz2 from http://packages.macports.org/mysql5-server-devel
--->  Fetching mysql5-server-devel
--->  Verifying checksum(s) for mysql5-server-devel
--->  Extracting mysql5-server-devel
--->  Configuring mysql5-server-devel
--->  Building mysql5-server-devel
--->  Staging mysql5-server-devel into destroot
--->  Creating launchd control script
###########################################################
# A startup item has been generated that will aid in
# starting mysql5-server-devel with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo port load mysql5-server-devel
###########################################################
--->  Installing mysql5-server-devel @5.5.2-m2_1
******************************************************
* In order to setup the database, you might want to run
* sudo -u _mysql mysql_install_db5
* if this is a new install
******************************************************
--->  Activating mysql5-server-devel @5.5.2-m2_1
--->  Cleaning mysql5-server-devel
$ sudo port install php5-mysql
--->  Computing dependencies for php5-mysql
--->  Fetching archive for php5-mysql
--->  Attempting to fetch php5-mysql-5.3.6_0+mysqlnd.darwin_11.x86_64.tbz2 from http://packages.macports.org/php5-mysql
--->  Fetching php5-mysql
--->  Verifying checksum(s) for php5-mysql
--->  Extracting php5-mysql
--->  Configuring php5-mysql
--->  Building php5-mysql
--->  Staging php5-mysql into destroot
--->  Installing php5-mysql @5.3.6_0+mysqlnd
To use mysqlnd with a local MySQL server, edit /opt/local/etc/php5/php.ini and set
mysql.default_socket, mysqli.default_socket and pdo_mysql.default_socket
to /opt/local/var/run/mysql5/mysqld.sock
--->  Activating php5-mysql @5.3.6_0+mysqlnd
--->  Cleaning php5-mysql
MySQL初期化
$ sudo -u _mysql msql_install_db5
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
Installing MySQL system tables...
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
OK
Filling help tables...
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'
/opt/local/lib/mysql5/bin/mysqladmin -u root -h iwamoto-no-MacBook-Air.local password 'new-password'

Alternatively you can run:
/opt/local/lib/mysql5/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /opt/local ; /opt/local/lib/mysql5/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /opt/local/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /opt/local/lib/mysql5/bin/mysqlbug script!

The latest information about MySQL is available at http://www.mysql.com/
Support MySQL by buying support/licenses from http://shop.mysql.com/
php.iniにsocketを指定

php.ini の mysql.default_socket, mysqli.default_socket and pdo_mysql.default_socket
へ/opt/local/var/run/mysql5/mysqld.sockを追記する。

最初にphp.iniがまだないので、用意されているサンプルをコピーする。
developmentとproductionがあり今回は開発用途なのでdevelopmentをコピーしました。

$ sudo cp /opt/local/etc/php5/php.ini-development /opt/local/etc/php5/php.ini

$ sudo vi /opt/local/etc/php5/php.ini
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock
pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
MySQLの root パスワードを設定
sudo /opt/local/lib/mysql5/bin/mysqladmin -u root password 'パスワード'

phpMyAdminインストール

$ sudo port install phpmyadmin
Password:
--->  Computing dependencies for phpmyadmin
--->  Dependencies to be installed: php5-gd freetype jpeg libpng php5-mbstring php5-mcrypt libmcrypt php5-zip
--->  Fetching archive for freetype
--->  Attempting to fetch freetype-2.4.5_1.darwin_11.x86_64.tbz2 from http://packages.macports.org/freetype
--->  Fetching freetype
--->  Attempting to fetch freetype-2.4.5.tar.bz2 from http://jaist.dl.sourceforge.net/freetype
--->  Attempting to fetch freetype-doc-2.4.5.tar.bz2 from http://jaist.dl.sourceforge.net/freetype
--->  Verifying checksum(s) for freetype
--->  Extracting freetype
--->  Applying patches to freetype
--->  Configuring freetype
--->  Building freetype
--->  Staging freetype into destroot
--->  Installing freetype @2.4.5_1
--->  Activating freetype @2.4.5_1
--->  Cleaning freetype
--->  Fetching archive for jpeg
--->  Attempting to fetch jpeg-8c_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/jpeg
--->  Fetching jpeg
--->  Attempting to fetch jpegsrc.v8c.tar.gz from http://distfiles.macports.org/jpeg
--->  Verifying checksum(s) for jpeg
--->  Extracting jpeg
--->  Configuring jpeg
--->  Building jpeg
--->  Staging jpeg into destroot
--->  Installing jpeg @8c_0
--->  Activating jpeg @8c_0
--->  Cleaning jpeg
--->  Fetching archive for libpng
--->  Attempting to fetch libpng-1.4.8_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/libpng
--->  Fetching libpng
--->  Attempting to fetch libpng-1.4.8.tar.bz2 from http://jaist.dl.sourceforge.net/project/libpng/libpng14/1.4.8
--->  Verifying checksum(s) for libpng
--->  Extracting libpng
--->  Configuring libpng
--->  Building libpng
--->  Staging libpng into destroot
--->  Installing libpng @1.4.8_0
--->  Activating libpng @1.4.8_0
--->  Cleaning libpng
--->  Fetching archive for php5-gd
--->  Attempting to fetch php5-gd-5.3.6_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/php5-gd
--->  Fetching php5-gd
--->  Verifying checksum(s) for php5-gd
--->  Extracting php5-gd
--->  Configuring php5-gd
--->  Building php5-gd
--->  Staging php5-gd into destroot
--->  Installing php5-gd @5.3.6_0
--->  Activating php5-gd @5.3.6_0
--->  Cleaning php5-gd
--->  Fetching archive for php5-mbstring
--->  Attempting to fetch php5-mbstring-5.3.6_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/php5-mbstring
--->  Fetching php5-mbstring
--->  Verifying checksum(s) for php5-mbstring
--->  Extracting php5-mbstring
--->  Configuring php5-mbstring
--->  Building php5-mbstring
--->  Staging php5-mbstring into destroot
--->  Installing php5-mbstring @5.3.6_0
--->  Activating php5-mbstring @5.3.6_0
--->  Cleaning php5-mbstring
--->  Fetching archive for libmcrypt
--->  Attempting to fetch libmcrypt-2.5.8_1.darwin_11.x86_64.tbz2 from http://packages.macports.org/libmcrypt
--->  Fetching libmcrypt
--->  Attempting to fetch libmcrypt-2.5.8.tar.bz2 from ftp://ftp.jp.FreeBSD.org/pub/FreeBSD/ports/distfiles/
--->  Attempting to fetch libmcrypt-2.5.8.tar.bz2 from ftp://ftp.jp.FreeBSD.org/pub/FreeBSD/ports/local-distfiles/
--->  Attempting to fetch libmcrypt-2.5.8.tar.bz2 from http://jaist.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8
--->  Verifying checksum(s) for libmcrypt
--->  Extracting libmcrypt
--->  Configuring libmcrypt
--->  Building libmcrypt
--->  Staging libmcrypt into destroot
--->  Installing libmcrypt @2.5.8_1
--->  Activating libmcrypt @2.5.8_1
--->  Cleaning libmcrypt
--->  Fetching archive for php5-mcrypt
--->  Attempting to fetch php5-mcrypt-5.3.6_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/php5-mcrypt
--->  Fetching php5-mcrypt
--->  Verifying checksum(s) for php5-mcrypt
--->  Extracting php5-mcrypt
--->  Configuring php5-mcrypt
--->  Building php5-mcrypt
--->  Staging php5-mcrypt into destroot
--->  Installing php5-mcrypt @5.3.6_0
--->  Activating php5-mcrypt @5.3.6_0
--->  Cleaning php5-mcrypt
--->  Fetching archive for php5-zip
--->  Attempting to fetch php5-zip-5.3.6_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/php5-zip
--->  Fetching php5-zip
--->  Verifying checksum(s) for php5-zip
--->  Extracting php5-zip
--->  Configuring php5-zip
--->  Building php5-zip
--->  Staging php5-zip into destroot
--->  Installing php5-zip @5.3.6_0
--->  Activating php5-zip @5.3.6_0
--->  Cleaning php5-zip
--->  Fetching archive for phpmyadmin
--->  Attempting to fetch phpmyadmin-3.4.3.2_0.darwin_11.noarch.tbz2 from http://packages.macports.org/phpmyadmin
--->  Fetching phpmyadmin
--->  Attempting to fetch phpMyAdmin-3.4.3.2-all-languages.tar.bz2 from http://jaist.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.4.3.2
--->  Verifying checksum(s) for phpmyadmin
--->  Extracting phpmyadmin
--->  Configuring phpmyadmin
--->  Building phpmyadmin
--->  Staging phpmyadmin into destroot
--->  Installing phpmyadmin @3.4.3.2_0
--->  Activating phpmyadmin @3.4.3.2_0

phpMyAdmin must be configured before it can be used. Consult the documentation at file:///opt/local/www/phpmyadmin/Documentation.html#config

A sample configuration file is installed at /opt/local/www/phpmyadmin/config.sample.inc.php, but you mustn’t edit this file. The file to edit is the real configuration file at
/opt/local/www/phpmyadmin/config.inc.php.

--->  Cleaning phpmyadmin
httpd.conf の DocumentRoot 修正

apachephpMyAdmin の DocumentRoot がそれぞれ別のものになっているので、
下記のように修正しました。(diffで表記)

sudo vi /opt/local/apache2/conf/httpd.conf
168c167
< DocumentRoot "/opt/local/www"
---
> DocumentRoot "/opt/local/apache2/htdocs"
195c194
< <Directory "/opt/local/www">
---
> <Directory "/opt/local/apache2/htdocs">

その他

Apacheの起動と停止
$ sudo /opt/local/apache2/bin/apachectl start

$ sudo /opt/local/apache2/bin/apachectl stop
MySQLの起動と停止
$ sudo /opt/local/share/mysql5/mysql/mysql.server start
Starting MySQL
. SUCCESS! 

$ sudo /opt/local/share/mysql5/mysql/mysql.server stop
Shutting down MySQL
.110804 02:39:31 mysqld_safe mysqld from pid file /opt/local/var/db/mysql5/MacBook-Air.local.pid ended
 SUCCESS! 

今まで CentOS の yum ばかり使っていたのですが、それと比べるとMacPorts でのインストールは結構手間のかかるかんじでした。

いろいろなところで差があって、それぞれまとめておかないと次にまた同じような苦労しそうですねー。

CentOSへMongoDBをインストールする

MongoDB本体をインストールする。

http://www.mongodb.org/display/DOCS/CentOS+and+Fedora+Packages

このURLにMongoDBインストール用のリポジトリ設定方法が書いてある。

今回は64bit版をそのまま入力保存しました。
(MongoDBは32bit版だと2GBまでしか使えないのでできるだけ64bitをインストールする。)

# vi /etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0

yumでインストールコマンドを打ちます。

# yum install mongo-10gen-server

起動させて、

# /etc/rc.d/init.d/mongod start

次回から起動時に自動実行するように設定。

# chkconfig mongod on

PHPからMongoDBを扱えるようにする。

peclコマンドを使いたいのでpearをインストールします。

# yum install php-pear

peclでmongo php ドライバをインストール。

# pecl install mongo

php.iniにextension=mongo.soを追加する。
場所は適当に。

# vi /etc/php.ini
extension=mongo.so

Apacheを再起動

# /etc/rc.d/init.d/httpd restart

以上です。

Authコンポーネントを使って、情報更新した時にセッション情報が新しくならない

今まで何度かログアウトしてログインさせることで対応せさせていたんですが、
ちゃんとしたサイト作ることになったので、考えなおしてみた。

<?php
function edit() {
    if ($this->data) {
        $this->User->set($this->data);
        if ($this->User->save($this->data)) {
            $user = $this->Auth->user();
            $user['User'] = array_merger($user['User'], $this->data['User']);
            $this->Session->write('Auth', $user);
        }
    }
}

こんな感じで更新が成功した場合に、セッションを上書きする。

今まで微妙すぎる対応してたな…。

東北地方太平洋沖地震へはてなポイントで寄付した。

去年の2月半ばに購入したはてなポイント1000円分を全く手を付けておらず、先月メールで有効期限切れるよーってきてたけど、特に使うことなかったのでほっといた。

ツイートで誰かがはてなポイントの有効期限切れしそうだったら寄付できるヨ。
的なのが流れてて、確認してみると、まだポイント残ってたので寄付しました。
(5%手数料掛かるので全部寄付することできず、3ポイントだけ残った…。)
http://d.hatena.ne.jp/hatenacontrib/20110312/1299904670


きっとこうやって期限切れするポイントいっぱいあるはずなので、みなさんも確認してみて使わないのであれば寄付すればいいと思うよ!!

CakeDCの TinyMCE Plugin を使ってみた。

TinyMCE の本家です。プラグインの中に入ってるので特に今回は必要なし。
http://tinymce.moxiecode.com/


CakePHPのTinyMCEプラグインはここからダウンロード。
http://cakedc.com/eng/downloads/view/tinymce


tests_controller.php

	var $helpers = array('TinyMce.TinyMce');


/views/tests/add.ctp

<?php
echo $this->TinyMce->editor(array(
	'language' => 'ja',
	'mode' => 'textareas',
	'theme' => 'advanced',
	'plugins' => 'spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template',
	'theme_advanced_buttons1' => 'save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect',
	'theme_advanced_buttons2' => 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor',
	'theme_advanced_buttons3' => 'tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen',
	'theme_advanced_buttons4' => 'insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage',
	'theme_advanced_toolbar_location' => 'top',
	'theme_advanced_toolbar_align' => 'left',
	'theme_advanced_statusbar_location' => 'bottom',
	'theme_advanced_resizing' > 'true',
	'skin' => 'o2k7',
	'skin_variant' => 'silver',
	'template_external_list_url' => '/tiny_mce/js/tiny_mce/template_list.js',
	'external_link_list_url' => '/tiny_mce/js/tiny_mce/link_list.js',
	'external_image_list_url' => '/js/tiny_mce/image_list.js',
	'media_external_list_url' => '/tiny_mce/js/tiny_mce/media_list.js',
));
?>
<div class="tests form">
<?php echo $this->Form->create('Tests');?>
	<fieldset>
 		<legend><?php __('Add Tests'); ?></legend>
	<?php
		echo $this->Form->input('body');
	?>
	</fieldset>
<?php echo $this->Form->end(__('Submit', true));?>
</div>
<div class="actions">
	<h3><?php __('Actions'); ?></h3>
	<ul>
		<li><?php echo $this->Html->link(__('List Tests', true), array('action' => 'index'));?></li>
	</ul>
</div>

TinyMce の設定をあらかじめ何種類か書いておくことが出来るみたいなのですが、
プラグイン自体に書き込む方法しかわからなかった。
controller から入れることは出来る気がするんですが…。


テキストエリアは自動で WYSIWYG で編集できるようになります。


ちなみに、TinyMCEのファイルや画像のアップロードを行なうプラグインは有料なので注意。

redmine + passenger でのアクセス制限

会社で使うために redmine と passenger をいれたときにアクセス制限ではまったので書いておく。

普段は以下のような感じでアクセス制限を入れてます。

<Directory /home/www/htdocs/redmine>
    Order Deny,Allow
    Deny from all
    Allow from xxx.xxx.xxx.xxx
</Directory>

が、mod_passengerの制御が優先されているためこれではダメみたいです。
なので、Location で書きなおしてみました。

<Location /redmine>
    Order Deny,Allow
    Deny from all
    Allow from xxx.xxx.xxx.xxx
</Location>

できたー!!