ysku's blog

ウェブ・無線通信・組み込みとか

CakePHP環境構築

f:id:yusuke1581:20141112005253j:plain
新たにCakePHPの環境構築が必要となったので、その手順を残しておきます.

【環境】
・さくらVPS
CentOS 6.6 (Final)
CakePHP 2.5
PHP 5.3.3
MySQL 5.1

【手順】
1)PHPのインストールと設定
以下のコマンドを実行

# yum -y install php php-mbstring php-mysql php-devel

デフォルトタイムゾーンの設定

# vi /etc/php.ini

ここで、以下を追記する

data.timezone = Asia/Tokyo

2)httpdのインストールと設定
さくらVPSの場合だと初期状態でインストールされている

設定の編集

# vi /etc/httpd/conf/httpd.conf

以下をそれぞれ変更
1.ServerTokens OS → ServerTokens Prod

2.#ServerName www.example.com:80 → ServerName centossrv.com:80
3.CGIの許可 Options Indexes FollowSymLinks → Options Includes ExecCGI FollowSymLinks
4..htaccessの許可 AllowOverride None → AllowOverride All
5..plの追加 #AddHandler cgi-script .cgi → AddHandler cgi-script .cgi .pl

3)MySQLのインストールと設定
次のサイトを参考にした
http://centossrv.com/mysql.shtml

インストール

# yum -y install mysql-server

設定の編集

# vi /etc/my.cnf

以下を追加する
[mysqld]の部分

character-set-server = utf8

[mysql]の部分(ない場合は書き加えます)

default-character-set = utf8

起動

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

起動時に実行するように設定

# chkconfig mysqld on

4)CakePHPのインストールと設定
公式ページを参考にしました.
インストール - 2.x

ディレクトリを/var/www/htmlに移動させ、以下を実行

# git clone git://github.com/cakephp/cakephp.git

これでcakephpというフォルダがダウンロードされます.

この時点でブラウザ上でhttp://localhost/cakephpと入力すると確認出来るがエラーメッセージが表示された状態である.そのため,以下の手順を踏む必要がある.

4−1)database.phpの作成と設定
app/Configに移動する
初期にdatabase.php.defaultというファイルが存在するため、それをコピーして作成する

# cp database.php.default database.php

設定の編集

# vi database.php

設定に関しては,過去に書いた以下の記事を参考にお願いします.

MySQLデータベースの移行&CakePHPの外部DBサーバアクセス - ysku's blog


4−2)Security.saltとSecurity.cipherSeedの設定
Security.saltとはパスワードを暗号化する際に付与されるデータである.
ターミナル上で以下のコマンドを入力すると生成される.

php -r '$num="";for($i=0;$i<10;++$i){$num.=rand(100,999);}echo sha1($num)."\n";'

Security.cipherSeedとは暗号化・複合化のシードとなるランダムな数値である.
同様に以下のコマンドを入力すると生成される.

php -r '$num="";for($i=0;$i<10;++$i){$num.=rand(100,999);}echo $num."\n";'

生成方法はこちらを参考させて頂きました.
http://blog.shiten.info/2013/03/cakephp-security-salt-%E3%81%A8-security-cipherseed-%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B.html


4−3)CacheEngine.phpの編集

# vi ~/lib/Cake/Cache/CacheEngine.php

以下の場所にdata_default_timezone_set('Asia/Tokyo');を追加する

        public function init ($settings = array()) {
                ...
                if (!is_numeric($this->settings['duration'])) {
                        data_default_timezone_set('Asia/Tokyo');
                ....
        }

以上の設定を行い、ブラウザ上で再度確認すると以下の様な表示がされる.
f:id:yusuke1581:20141208021515p:plain

以上が簡単なCakePHPの環境構築になります.

MySQLデータベースの移行&CakePHPの外部DBサーバアクセス

f:id:yusuke1581:20141112005253j:plain
研究用で使用しているデータベースを移行させました.
そのときの手順のメモです.

【やりたいこと】
[移行前]
移行元サーバ=WEBサーバ+DBサーバ
[移行後]
移行元サーバ=WEBサーバ
移行先サーバ=DBサーバ

【環境】
CentOS 6.5
MySQL 5.1
CakePHP 2.5

【手順】
1)バックアップファイルの作成
移行元のDBサーバにて以下を実行する.

# mysqldump -q [データベース名] -p[パスワード] > [バックアップファイル名]

2)バックアップファイルを移行先のサーバに送信
今回はsftpを使用した.

# sftp [移行先のユーザ名]@[移行先サーバのIPアドレス]

簡単な操作の説明
移行前のサーバを操作するコマンド
・lls
lcd
移行先のサーバを操作するコマンド
・ls
・cd
バックアップファイルを移行先のサーバに移動させる.

> put [バックアップファイル名]

3)移行先のサーバに接続
sshでの接続.移行元のサーバにて以下のコマンドを実行

# ssh [ユーザ名]@[IPアドレス]

必要に応じてパスワードを入力

4)移行先のデータベース(MySQL)の設定
MySQLにログインする.

# mysql -u [ユーザ名] -p[パスワード]

移行先のデータベースに新たなユーザを追加する.

mysql> GRANT ALL PRIVILEGES ON *.* TO [ユーザー名]@localhost IDENTIFIED BY '[パスワード]' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

データベースを作成する.

mysql> CREATE DATABASE データベース名 CHARACTER SET utf8;

4)データベースの移行
以下を実行させる.

# mysql -p[パスワード] [新たなデータベース名] < [バックファイル名]

[新たなデータベース名]には先ほど作成したデータベース名が入る.

5)外部から接続するユーザの設定
新たに作成(移行先)のデータベースに接続可能なユーザを作成する.

mysql > grant all privileges on sta_macaddr_webcam.* to cap@192.168.95.160 identified by ‘capcapcap’;
mysql > flush privileges;

6)ファイアウォールの設定

# vi /etc/sysconfig/iptables

以下を追加

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

3306はmysql用のポート

移行元サーバから以下を実行して接続出来るか確認する.

# mysql -h [移行先サーバのIPアドレス] -u [ユーザ名] -p[パスワード]

これで接続出来なかったらなんらかのミスがあるかと,

7)移行先DBサーバに接続させるためのCakePHPの設定

# vi ~/app/Config/database.php

/app/Config/database.phpを編集、内容は以下のようにする.

class DATABASE_CONFIG {
     
     public $default = array(
          ‘datasource’ => ‘Database/Mysql’,
          ‘persistent’ => false,
          ‘host’ => ‘192.168.95.240’,
          ‘port’ => ‘3306’,          // mysql用のポート
          ‘login’ => ‘cap’,
          ‘password’ => ‘capcapcap’,
          ‘database’ => ‘sta_macaddr_webcam’,
          ‘prefix’ => ‘’,
          ‘encoding’ => ‘utf8’,
     );
}

これでCakePHPのアプリで移行先のDBサーバにアクセス出来るようになります.

以上がMySQLのDBサーバの移行とCakePHPからの接続になります.

CentOS6.5へのVNC導入&Macからのリモートログイン

開発環境を整える際に必要になったので,簡単なメモ

【環境】
CentOS 6.5 (サーバ)
Mac OS X 10.9.5 (クライアント)

1)サーバ側

# yum -y install tigervnc-server

コンフィグファイルを書き換える

# vi /etc/sysconfig/vncservers

最後の2行のコメントアウトを外し,以下のように設定する

VNCSERVERS="2:hoge(個人用ユーザ)"
VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp"

個人ユーザでvncパスワードを設定

# su - hoge
$ vncpasswd

ルート権限に戻り,vncを起動

# service vncserver status
Xvnc は停止しています
# service vncserver start
VNCサーバー を起動中: 2:hoge xauth:   creating new authority file /home/hoge/.Xauthority

以下を編集

# vim /home/hoge/.vnc/xstartup

最終行をコメントアウトし、1行追加する

#twm &
exec gnome-session

ポート5901で起動

# vncserver :1

iptablesを編集する

# vi /etc/sysconfig/iptables

以下を追加する

-A INPUT -p udp --dport 5353 -j ACCEPT
-A INPUT -p tcp --dport 5901 -j ACCEPT

iptablesを再起動する

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


2)クライアント側
左上のリンゴマーク→システム環境設定→共有→画面共有
アクセスを許可する

Finderを起動
上に表示されるバーの「移動」→サーバに接続
ここで表示される画面にサーバアドレスとして

vnc://[サーバのIPアドレス]:5901

を入力して、接続

パスワードを問われるため、先ほどサーバ側で入力したパスワードを入力してやる

【参考記事】
http://hosii.net/?p=109
MacでLinuxサーバーと画面共有を行う - saito’s blog

複数Formボタンの設置と判別【CakePHP2.5】

f:id:yusuke1581:20141112005253j:plain
CakePHPを使用して1つのビューに複数のFormボタンを設置することがありました
その際のコントローラ側での判別方法です

以下の記事ではCakePHP1.3と2.0での判別方法を紹介しているようですが、CakePHP2.5では仕様が変わっているようでした

CakePHP2.0でsubmitを2つ使いたい - ぶろぐ


1)ビュー側での設定
ビュー側では以下のように、各Fromボタンにlabelとnameを設定する必要があります
今回はlabelにtest、nameにhogeという名前をつけています

<?php
    $options = array(
        'label' => 'test',                         // ボタンに表示される名前
        'class' => 'ボタンのクラス',
        'name' => 'hoge'
    );
    echo $this->From->end($options);
?>

2)コントローラ側での判別
コントローラ側では、postされた際にそのデータが、

$this->request->data

に格納されるのですが、ボタンに与えられた名前もこの中に含まれます
具体的には、

$this->request->data['hoge']

に、testという値が格納されています

これを使用して、コントローラ側で押されたボタンを判別することが可能です

以上が、複数Formボタンの設置と判別方法になります

MySQLへの日本語入力(文字化け対応)【MySQL 5.1】

MySQLで日本語の文字化け問題で詰まってしまったためメモ
具体的には、insertで日本語を入力する際に文字化けしてしまうというもの

環境はMySQLが5.1、サーバはCentOS release 6.5 (final)を使用しています

MySQL文字コードの確認をします
ログインした後、以下を実行

mysql> show variables like 'char%';

私の場合、このようになっていました

Variable_name                       Value
character_set_client               latin1
character_set_connection      latin1
character_set_database          latin1
character_set_filesystem        binary
character_set_results             latin1
character_set_server              latin1
character_set_system             utf8
character_sets_dir                 /usr/share/mysql/charsets/

まず、my.cnfの設定
以下のコマンドでmy.cnfを書き換えます

 # vi /etc/my.cnf

書き換える内容は以下です

[mysqld]の部分

character-set-server = utf8

これで

character_set_database        utf8
character_set_server            utf8

となります

[mysql]の部分(ない場合は書き加えます)

default-character-set = utf8

これで

character_set_client             utf8
character_set_connection     utf8
character_set_results           utf8

となります

以上の変更を加えて一度再起動します

 # /etc/init.d/mysqld restart

次にデータベースとテーブルの文字コードを変更します
mysqlにログインした後、以下でデータベースの文字コードを行えます

mysql> alter database [データベース名] character set utf8;

テーブルの文字コードの変換は以下のコマンドです

mysql> alter table [テーブル名] charset = utf8;

以上が、MySQLの日本語文字化けへの対応になります

画像上でクリックした座標の値を取得する【CakePHP jQuery】

f:id:yusuke1581:20141112005253j:plain
ページ上に表示した画像のクリックした部分の座標を取得する方法です

【環境】
・CakePHP2.5
jquery-1.10.1

まずはビューの説明から
ビューには画像を表示させるのと、取得した座標を入力するフォームを作成します

<?php echo $this->Html->image('画像名', array('id' => 'image', 'alt' => '画像名')); ?>
<?php echo $this->Form->create(false, array('type' => 'post', 'action' => '遷移先のページ')); ?>
<fieldset>
<?php echo $this->Form->input('dimension.x', array('id' => 'pos_x')); ?>
<?php echo $this->Form->input('dimension.y', array('id' => 'pos_y')); ?>
</fieldset>
<?php
        $options = array('label' => '登録');
        echo $this->Form->end($options);
?>

最初にidをimageで画像を表示させています
2行目からはフォームを作成しており、xの値を格納するinputにはidとしてpos_xを、同様にyの値を格納するinputにはidとしてpos_yを振っています
postされた際には['dimension']['x']にxの値が格納されるという風にしています

次にjqueryの説明です
この部分は以下のブログを参考にさせて頂きました
http://piro-suke.hatenablog.com/entry/20070726/1185435069
http://piro-suke.hatenablog.com/entry/20070726/1185435069

$(function() {
    $('#image').on("click", function(e) {
        if (document.all) {
            rel_x = e.offsetX;
            rel_y = e.offsetY;
        } else {
            rel_x = e.pageX - $('#image').offset()["left"];
            rel_y = e.pageY - $('#image').offset()["top"];
        }
        $('input#pos_x').val(rel_x);
        $('input#pos_y').val(rel_y);
    });
});

コードの説明自体はブログの方を見て頂ければ良いのですが、自分の知識不足で$('input#pos_x').text(rel_x)としてしまっていて、取得した値がフォーム内に表示されないことに悩まされました
きちんと$('input#pos_x').val(rel_x)としてください
http://webhako.net/jquery/textbox-set-value/

以上が、画像上のクリックした座標を取得する方法でした

セレクトボックスで選択されている値の取得【CakePHP 2.5 select box】

f:id:yusuke1581:20141112005253j:plain
セレクトボックスで選択している値の取得についてです
例のごとく、CakePHP2.5で実装しています
送信ボタンでPOSTするというのは比較的簡単に実装出来るのですが、「セレクトボックスにて現在選択されている値を取得する」というので詰まったのでメモしました
きれいではないのですが、一応目的としていた動作はしました

1)セレクトボックスの実装
まずはビューファイルにて以下を記載
セレクトボックスの値が変更されたときに値を送信するために「onchange」を記載します

<?php
        echo $this->Form->create(false, array(
                'type' => 'post',
        ));
?>
<fieldset>
<?php
        echo $this->Form->input('test', array(
                'type' => 'select',
                'options' => $datas,
                'onchange' => 'submit(this.form)'
        ));
?>
</fieldset>

2)コントローラで変更された値を受け取る
コントローラでは以下のように記載しました

function test() {
        if ($this->request->is('post')) {
                $data = $this->request->data;
        }
}

これでセレクトボックスで変更された値が$dataの中に格納されます

取得した値をビューに受け渡せば完了です

簡単ですが、以上がCakePHPにおいてセレクトボックスで選択されている値の取得方法になります