2014年5月25日日曜日

Facebook SDK for PHP ver.4.0 を使ってFacebookでログインする

Facebook Developer の公式ドキュメントがあまりにも不親切なチュートリアルしか用意していなかったので、実装にかなり手こずった。
今回はComposerを使うことで、SDKのダウンロードとnamespaceのルーティングを簡単にする。その後、ログインするPHPソースを作成する。


※ 作業はドキュメントルート以下にプロジェクト用ディレクトリを作成し、その中で行っている。

※ Facebookのアプリケーション登録が完了していることを前提とする。Facebook Developer → Apps(登録したアプリ) → Settings と進んだところで「Website」というボックスの「Site URL」に今回作成するPHPファイルのURLを入力することを忘れずに。



1. プロジェクトルートにcomposer.pharを配置する

公式サイト」からcomposer.pharをダウンロードする。私はすでにSymfony2をインストールする際に利用したものを持っていたので、それを移動させてきた。


2. composer.jsonを作成する

composer.jsonファイルを作成し、以下の内容をペーストする。
{
  "require" : {
    "facebook/php-sdk-v4" : "4.0.*"
  }
}
バージョンはFacebook Developer 公式ドキュメントを確認し、適宜書き換える。


3. Facebook SDK をインストールする

以下のコマンドを実行する。
$ php composer.phar install
これでSDKのダウンロードとnamespaceのルーティングが完了した。


4. ログイン用PHPファイルを作成する

以降はこまめに動作確認を行いながらPHPソースを作成していく。

SDKをインポートする

<?php
require 'vendor/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper; 
// 続く
Composerが自動で作成したvendor/autoload.phpがSDKのクラス群をルーティングしてくれているので、いちいちrequire_onceでクラスをインポートしなくても使える。

Facebookから認証コードを取得する

// 続き 
session_start(); 
FacebookSession::setDefaultApplication('アプリID', 'アプリSecret'); 
$helper = new FacebookRedirectLoginHelper('PHPファイルのURL'); 
if ($_GET) {
var_dump($_GET);
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
Facebookから認証コードをもらうために、一度Facebookにアクセスする。すると、FacebookRedirectLoginHelperで指定したURLにリダイレクトがかけられ、その際にGETで認証コードが送られてくる。var_dumpで["code"]の中に有効値が入っていれば取得に成功している。


Facebookからアクセストークンを取得する

作成したPHPソースから以下を削除する。
if ($_GET) {
var_dump($_GET);
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
以下のソースを追記する。
$helper = new FacebookRedirectLoginHelper('http://centos.com/fb_connect_php/');
try {
    $session = $helper->getSessionFromRedirect();
} catch (FacebookRequestException $e) {
    echo $e->getMessage();
    exit;
} catch (\Exception $e) {
    echo $e->getMessage();
    exit;
}
if (isset($session)) {
    var_dump($session);
} else {
    echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
先ほど取得したコードと諸々の情報持ってFacebookにアクセスすると、今度はアクセストークンを送り返してくれる。アクセストークンがあればFacebookの情報を自由に取得できる。var_dumpで["token"]の情報が入っていれば成功している。

自身の情報の取得と全ソースコード

<?php
require 'vendor/autoload.php'; 
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper; 
session_start(); 
FacebookSession::setDefaultApplication('アプリID', 'アプリSecret');
$helper = new FacebookRedirectLoginHelper('PHPファイルのURL');
try {
$session = $helper->getSessionFromRedirect();
} catch (FacebookRequestException $e) {
echo $e->getMessage();
exit;
} catch (\Exception $e) {
echo $e->getMessage();
exit;
}
if (isset($session)) {
try {
$me = (new FacebookRequest(
$session, 'GET', '/me'
))
->execute()
->getGraphObject(GraphUser::className());
var_dump($me);
exit;
} catch (FacebookRequestException $e) {
echo $e->getMessage();
exit;
} catch (\Exception $e) {
echo $e->getMessage();
exit;
}
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
exit;
}

2014年5月17日土曜日

MySQLのインストールとmy.cnfについて

MySQLの設定について理解を深めるべくメモする。

MYSQLのインストール

yumのリポジトリからインストールする。
$ sudo yum install -y --enablerepo=remi mysql-server

my.cnfを設定する。
4行目に次を追加
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8

MySQLを起動する
$ sudo service mysqld start

セキュアの設定
$ /usr/bin/mysql_secure_installation
パスワードを設定する。

デフォルトで起動させる。
$ sudo chkconfig mysqld on

MySQLのオプションファイルをいじる

Ver 3.22以降のMySQLはデフォルトスタートアップオプションをオプション設定ファイル(本環境ではmy.cnf)から読み込む。


 MYSQLの設定 my.cnfをいじってみる

MySQLにログインして、現在設定されている変数情報を見てみる。
> show variables;

ズラッと変数情報が出てきた。
MySQLリファレンス」を参考に、innodb_で始まる変数の中で面白そうなものをいじってみる。

innodb_buffer_pool_size
データをキャッシュするバッファの大きさ。これが大きくなるほどI/Oが減る。
これを小さくして、10万件のInsertしたときの実行速度の差を見る。
・128MB(デフォルト)→ 0.34sec
・32MB → 0.34sec
・5MB(最小)→ 0.35sec
差は見られず。


気分転換にこちらを変えてみる。
innodb_log_file_size
これをいじるとmysqlが起動しなくなった。Innodbのログファイル関係をいじるときは次の手順が必要らしい。

rootで次のコマンドを実行
mysql> SET GLOBAL innodb_fast_shutdown=0;
$ sudo service mysqld stop

$ sudo mv /var/lib/mysql/ib_logfile* /tmp
$ sudo service mysqld start

正常起動しました。

10万件のinsert
・1MB → 0.37sec
・32MB → 0.32sec

100万件のinsert
・1MB → 3.76sec
・32MB → 3.50sec

ちょっとした差は出たが思っていたほどではない。。。

100万件Deleteのほうが大きな差が出た。
・1MB → 3.31sec
・32MB → 2.42sec

Innodbにはいろんなバッファがあり互いに影響し合ってるので、組み合わせによって変わるのだろうが、今のところ全くわからない。

最後に
skip-innodb_doublewrite
これはinnodb_doublewriteをオフにする。
100万件Insert
・ON → 3.33sec
・OFF → 3.36sec
100万件Delete
・ON → 2.89sec
・OFF → 3.76sec
OFFの方が二重書き込みをしないので早くなるかと思ったが、差がでない。


追記

innodb_log_buffer_size
100万件insert
・8MB → 3.5sec
・1MB → 8.7sec
ログファイルへのI/Oが減ることで早くなる模様。しかしなぜinnodb_buffer_pool_sizeでは差が出なかったのかが分からない。バッファ・ログファイル・ディスクへの書き込み順序の影響?

ECCUBEをインストールする



公式サイト」からドキュメントルートに最新版をダウンロードする。今回は「Version 2.13.1(tar.gz)」を利用した。
$ sudo wget http://downloads.ec-cube.net/src/eccube-2.13.1.tar.gz

解凍する
$ sudo tar xvzf eccube-2.13.1.tar.gz

名前を短くする
$ sudo mv eccube-2.13.1 eccube

ブラウザからインストールを進める
http://[サーバーIP or Domain]/eccube/html/install/

DBの初期化までは画面の指示通り。先にDBを作っておかなければならないことに注意。

管理画面にログインすると「install/index.phpを削除してください」とメッセージが出る。installディレクトリにある他のファイルも不要そうなのでディレクトリごと削除する。
$ sudo rm -rf /var/www/html/eccube/html/install/

ECCUBEの公開ページにアクセスするには次のアドレスを入力
http://[サーバーIP or Domain]/eccube/html/

phpMyAdminをインストールする

仮想サーバーにphpMyAdminのインストール手順と、基本的な操作をメモする。


環境


仮想マシン
→ VMware

OS
→ CentOS

インストール済み
→ Apache, PHP, MySQL


phpMyAdminのインストール


公式サイト」から最新版かつ「all-languages」の圧縮ファイルをダウンロードする。今回は「phpMyAdmin-4.2.1-all-languages.tar.gz
$ sudo wget http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/4.2.1/phpMyAdmin-4.2.1-all-languages.tar.gz

解凍する
$ sudo tar xvzf [ダウンロードした圧縮ファイル名]

解凍したディレクトリの名前が長いので変える
$ sudo mv phpMyAdmin-4.2.1-all-languages phpMyAdmin


動作確認


ブラウザからphpMyAdminディレクトリにアクセスすると、ログイン画面が出てくる。
この「ユーザー名」と「パスワード」はMySQLに接続可能なものを入力する。今回はrootで入る。

ログイン後、最下部までスクロールするとエラーが2つ出た。
「設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。」
「mcrypt 拡張がありません。PHP の設定をチェックしてみてください。」


先に2つ目を解決する

php-mcryptのインストール


利用可能なバージョンを探す
$ yum info --enablerepo=epel,remi php-mcrypt
出てきた情報を見るとremiリポジトリにあるらしい。

インストールする

$ sudo yum install -y --enablerepo=remi php-mcrypt

Webサーバーを再起動する
$ sudo service httpd restart

無事、2つ目のエラーが消えました


次に1つ目のエラーを解消する

config.inc.phpを作成する


サーバーに戻ってphpMyAdminディレクトリで作業する。

用意されているサンプルをコピーしてconfig.inc.phpを作る
$ sudo cp config.sample.inc.php config.inc.php

config.inc.phpを編集する
$ sudo vim config.inc.php

17行目に任意の文字列を入力する
$cfg['blowfish_secret'] = '???';
このパスフレーズは暗号化する前にデータに連結したりして、暗号を破られにくくするものだと思われる。後でパスワードとして入力することはないので、覚えにくいランダムな文字列にする。

31行目にMySQLのあるサーバーのIPアドレスを設定する。今回はWebサーバーと同じサーバーにあるのでlocalhostのままにしておく
$cfg['Servers'][$i]['host'] = 'localhost';

ブラウザに戻ってphpMyAdminにログインし直すとエラーが消えた。

WordPressをインストールする

仮想サーバーにWordPressをインストールする。


環境

仮想マシン
→ VMware

OS
→ CentOS

インストール済み
→ Apache, PHP, MySQL


MySQLでWordPress用のDBを用意する

MySQLにrootで接続
$ mysql -u root -p

新規DBを作成
mysql> create database DB名;

WordPress管理ユーザーを作成
mysql> grant all on DB名.* to '管理ユーザー名'@'localhost' identified by 'パスワード';


WordPressをダウンロード

公式サイト」のダウンロードの下にある「.tar.gz 形式をダウンロード 」を右クリックして「リンクアドレスをコピー」を選択

サーバーに戻って公開したいディレクトリにダウンロードする。今回はドキュメントルートに直接ダウンロードした。
$ cd /var/www/html/
$ sudo wget [コピーしたリンクアドレス]

解凍する
$ sudo tar xvzf [ダウンロードした圧縮ファイル名]
すると「wordpress」というファイルができた。

ダウンロードした圧縮ファイルは不要なので削除する
$ sudo rm -r [ダウンロードした圧縮ファイル名]


WordPressの初期設定

WebブラウザからWordPressにアクセスする
http://[サーバーのIPアドレス]/wordpress/
すると「wp-config.php ファイルが見つかりません」というメッセージが出るので、「設定ファイルを作成する」をクリックする。

画面の指示に従い進めると、DB接続情報を入力する画面が出る。
先ほど設定したMySQLの情報を入力する。

wordpressディレクトリに書き込み権限を与えていなかったので、「手動でファイルを作成してください」というメッセージが出た。

画面にあるPHPソースをコピーしておく。

サーバーに戻り、wordpressディレクトリに設定ファイルを作る。
$ sudo vim wp-config.php
コピーしたPHPソースをペーストして、間違いないことを確認して保存する。

ブラウザに戻り、画面に従って進める。



インストール完了したら使ってみるべし。

2014年5月16日金曜日

Gitの操作いろいろ

ユーザーネームを設定する。
$ git config --global user.name "Your Name"

メールアドレスを設定する。
$ git config --global user.email "youraddress@email"

UIに色付けする。
$ git config --global color.ui true

上記の設定を確認する。
$ git config -l

作業ディレクトリに移動して、gitを初期化する
$ git init

Gitのファイル状態遷移は以下のとおり
1. 作業ディレクトリ
2. ステージングエリア(インデックス)
3. リポジトリ(ローカル・リモート)

1→2へ上げるコマンド
$ git add [file name]

2→3へ上げるコマンド
$ git commit [file name]
$ git commit -m "memo~"
メモを残せるので、変更箇所等を記録する。

1→3へ一気に上げるコマンド
$ git commit -am "memo~"

履歴を見る
$ git log
$ git log --oneline

変更箇所を見る
$ git log -p

どのファイルが変更されたか一覧で見る
$ git log --stat

ファイルの状態遷移を見る
$ git status

削除する
$ git rm [file name]

移動する
$ git mv [file name]

作業ディレクトリにファイルがあるとき使えるコマンド

変更を取り消す
$ git checkout -- [file name]

差分を見る
$ git diff

カレントディレクトリのファイル全部をaddする
$ git add .

ステージングエリアにファイルがあるとき使えるコマンド

差分を見る
$ git diff --cached

ちょっとした変更をcommitする
$ git commit --amend


Git管理に含めないファイルがある場合
$ vim .gitignore
logファイルを省く場合は「*.log」を記述する。


logの一番上のコミット状態までバージョンに戻す
$ git reset --hard HEAD

logの2番目のコミット状態までバージョンを戻す
$ git reset --hard HEAD^

logのコミットIDを指定してバージョンを戻す
$ git reset --hard [コミットID]

前回取り消されたHEADの情報が1つ入っているので、そのHEADまで戻す
$ git reset --hard ORIG_HEAD


Branch
別々のバージョンを平行して開発するときに使う。

現在のbranch一覧を見る
$ git branch

branchを作成する
$ git branch [branch name]

branchを移動する
$ git checkout [branch name]

branchの作成と移動を同時に行う

$ git checkout -b [branch name]

branchをmasterに取り込む
$ git checkout master
$ git merge [branch name]
このとき、masterの内容がbranchに合わさるので、masterに有りbranchに無いものは消える。

branchを削除する

$ git branch -d [branch name]

branch間でコンフリクトが起きた場合
$ vim [file name]
採用するbranch以外の記述を削除する。

Tag
tagの一覧を見る
$ git tag

直前のコミットにタグを付ける
$ git tag [tag name]

コミットIDを指定してタグを付ける
$ git tag [tag name] [commit ID]

tag付けされたコミットの詳細を見る
$ git show [tag name]

tagを削除する
$ git tag -d [tag name]


共有リポジトリで操作する

共有リポジトリを作る
$ mkdir ourweb.git
$ cd ourweb.git
$ git init --bare

作業ディレクトリに共有リポジトリを認識させる
$ cd ~/myweb
$ git remote add origin ~/ourweb.git

作業ディレクトリからリモートリポジトリを確認する
$ git config -l

作業ディレクトリのファイルをリモートリポジトリに追加する
$ git push origin master

myweb内のファイルをmyweb2にコピーする
$ git clone ~/ourweb.git/ myweb2

myweb2でファイルを編集&コミットした後に、リモートリポジトリに反映する
$ git push origin master

mywebでmyweb2の変更を反映する
$ git pull origin master

コンフリクトが起きた場合
・変更後でも git pullを実行する。
・該当ファイルを編集するとコンフリクト箇所が出るので修正してコミットする。

2014年5月6日火曜日

VMwareでMac上に仮想サーバーを構築する

VMwareを使ってMacOS X(64bit)上に仮想サーバーを構築する手順をメモする。

仮想マシン:VMware
ホストOS:Mac OS X(64bit)
ゲストOS:CentOS6.5(64bit)


VMwareのインストールとCentOS 6.5で仮想マシンの立ち上げ

公式サイトより「VMware Fusion 6」をダウンロードする。
今回は構築してみるだけなので30日間有効な無償評価版を利用する。

ネットワークインストール用のisoイメージ「CentOS-6.5-x86_64-netinstall.iso」をダウンロードする。

最初にダウンロードしたVMwareのdmgファイルを実行する。

インストール方法を選択で「イメージからインストール」を選択する。

選択できるイメージがないので「別のイメージを使用」から、先ほどダウンロードしたCentOS6.5のisoイメージを選択する。

OSの選択で「Linux→CentOS(64bit)」を選択する。

「終了→保存」

ここから先の設定は「Mac OS X Mountain Lion + VMware Fusion 5 + CentOS 6.3 + Apache + mod_proxy + PSGI + Movable Type 5.2 のローカル環境を構築した」を参考にしてインストールを進める。

※上記サイトの補足
手順15.
 今回利用したURLはこちら →「http://ftp.riken.jp/Linux/centos/6.5/os/x86_64/

手順16.
 ここで「以下のストレージデバイスは、有用なデータを含んでいるかもしれません」ととてつもなく不安になる注意メッセージが出るが、この「ストレージデバイス」はVMwareが物理マシン上の空き領域に確保した仮想マシン用の領域なので、初期化しても物理マシンのデータが消されることはない。なので「どのようなデータであっても破棄してください」を選択する。


仮想サーバーにMac側のターミナルで接続

VMwareからCentOSにrootでログインする。

次のコマンドを実行
# ifconfig

ズラッと出てきたテキストの「eth0」の「inet adder:〜」にあるIPアドレスをメモする。

Mac本体のターミナルを開いて次のコマンドを実行し、パスワードを入力して接続完了。
$ ssh root@メモしたIPアドレス

今後はターミナルからCentOSに接続する。


システムの初期設定

SELinuxが有効だと、環境構築中にブロックされたりするので無効化する。
# vi /etc/selinux/config
開いたテキストの真ん中にある「SELINUX=enforcing」を「SELINUX=disabled」にして保存する。

設定を読み込むために再起動する。
# shutdown -r now

システムを最新化する
# yum update -y

今後、環境構築に使いそうなモジュールをインストールする。
# yum install -y wget
# yum install -y gcc
# yum install -y unzip

ファイアーウォールを設定する。
変更する前に既存の設定をオリジナルファイルとして保存しておく。
# cp /etc/sysconfig/iptables /etc/sysconfig/iptables.org

編集する。
# vi /etc/sysconfig/iptables
次の内容に書き換えて保存する。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

iptablesを再起動する。
# /etc/rc.d/init.d/iptables restart


Apacheのインストール

Webサーバーが既にインストールされているか確認する。
# yum list installed | grep httpd
何も出ないのでインストールする。
# yum install -y httpd
httpdの設定を変更する。
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
# vi /etc/httpd/conf/httpd.conf
行番号を表示する。
:set number
行へジャンプするには「行番号 + G」

44行目「ServerTokens OS」を「ServerTokens Prod」に変更する。
OSのままだとアクセスしてきたユーザーにサーバーのOS情報が表示されてしまうので隠す。

276行目「#ServerName www.example.com:80」を「ServerName メモしたIPアドレス」に変更する。コメントアウトを外すこと。

331行目「Options Indexes FollowSymLinks」を「Options -Indexes FollowSymLinks」に変更する。
ブラウザからディレクトリにアクセスした時に内容物が丸見えになってしまうので隠す。

536行目「ServerSignature On」を「ServerSignature Off」に変更する。
ユーザーにサーバー署名自体を表示させない。

保存した後、文法チェックする。
# apachectl configtest
「Syntax OK」だったのでWebサーバーを起動する。
# service httpd start


PHPのインストール

インストール可能なPHPの詳細を見てみる。
# yum info php
5.3.3とバージョンが古いのでyumのレポジトリを追加して、最新バージョンをインストールできるようにする。
今回は、よく使うらしい「epel」と「remi」を追加する。


インターネットで"epel downloads"と検索
→ https://dl.fedoraproject.org/pub/epel/6/x86_64/
上記サイトで"epel-release"を検索し、ホームディレクトリにダウンロードする。
# wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

 次に"remi"で検索
→ http://rpms.famillecollet.com/
CentOSからバージョン6をダウンロードする。
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
それぞれリポジトリに追加する。
# rpm -Uvh epel-release-6-8.noarch.rpm
# rpm -Uvh remi-release-6.rpm

epelの設定ファイルを編集する。
# vi /etc/yum.repos.d/epel.repo
6行目の「enabled=1」を「enabled=0」に変更して保存する。
remiはもともと「enabled=0」になっている。


追加したリポジトリからインストール可能なPHPの詳細を見てみる。
# yum info --enablerepo=epel, remi php
→ PHP 5.4.28
バージョンが新しくなったのでPHPをインストールする。使いそうなライブラリも一緒に。
# yum --enablerepo=epel,remi install -y php php-devel php-mysql php-mbstring php-gd

PHPの設定ファイルを編集する。
# cp /etc/php.ini /etc/php.ini.org
# vi /etc/php.ini

以下を探して編集
;error_log = syslogの下に追加
error_log = /var/log/php.log
次のコメントアウトを外す
;mbstring.language = Japanese
5行下辺りを編集
mbstring.internal_encoding = EUC-JP → UTF-8

10行した当たりのコメントアウトを外す
;mbstring.detect_order = auto
次を編集
expose_php = On → Off
;date.timezone = を探して編集
date.timezone = Asia/Tokyo

Webサーバーを再起動
# service httpd restart


Redisのインストール

yumのリポジトリからインストールする。
# yum --enablerepo=epel,remi -y install redis

Redisを起動する。
# /etc/init.d/redis start

サーバー起動時にRedisが起動するように設定する。
# chkconfig redis on

Redisをテストしてみる。
# redis-cli
> set 'test' 3
OK
> get 'test'
"3"
> exit


Memcacheのインストール

yumのリポジトリからインストールする。
# yum --enablerepo=remi,epel -y install memcached

Memcacheはrootユーザーで起動できない。
今更ながら作業ユーザーを追加する。
# useradd workuser
# passwd workuser

workuserで入り直す。
sudo権限を与える。
# su
# visudo
「root ALL=(ALL) ALL」の下に「workuser ALL=(ALL) ALL」を追加する。
# exit

初期設定
$ memcached -d -m 64 -p 11211
起動
$ sudo service memcached start
起動確認
$ ps aux | grep memcached
次回以降も自動的に起動
$ sudo chkconfig memcached on
PHPでMemcachedを利用するためのライブラリを追加
$ yum install --enablerepo=remi php-pecl-memcached

// test1.php
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$m->set('key', date('Y/m/d H:i:s'), time() + 60); // 有効期限1分

// test2.php
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
if ($val = $m->get('key')) {
    echo $val;
}

test1.php実行後すぐにtest2.phpを実行すると日時が表示されたが、1分経過後にtest2.phpを実行すると何も表示されない。うまいこと動作している。



MySQLのインストールは次回。

2014年5月2日金曜日

Symfony2をComposerでインストール

Vagrant/CentOSにSymfony2をインストールしようとしたら手こずったのでメモする。


Symfony2の公式サイトにある通りコマンドを実行する。

まずComposerを用意する。
$ curl -s https://getcomposer.org/installer | php

次にSymfony2をインストールする。
$ php composer.phar create-project symfony/framework-standard-edition /path/to/webroot/Symfony 2.4.4

> /path/to/webroot/
この部分はSymfony2を配置したいディレクトリ(Webサーバーのドキュメントルート)を指定する

> 2.4.4
この部分は最新バージョンを指定する。

実行した結果・・・
Fatal error: Class 'DOMDocument' not found in /vagrant/Symfony/Symfony/vendor/symfony/symfony/src/Symfony/Component/Config/Util/XmlUtils.php on line 52
Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the post-install-cmd event terminated with an exception
  [RuntimeException]                                                       
  An error occurred when executing the "'cache:clear --no-warmup'" command.
こんなエラーが出た。

> Fatal error: Class 'DOMDocument' not found
これを調べてみるとphp-xmlが無いとのこと。

yumでphp-xmlをインストールする。
$ sudo yum install php-xml

こっちでもエラー発生
--> Finished Dependency Resolution
Error: Package: php-xml-5.3.3-27.el6_5.x86_64 (updates)
           Requires: php-common(x86-64) = 5.3.3-27.el6_5
           Installed: php-common-5.4.22-1.el6.remi.x86_64 (@remi)
               php-common(x86-64) = 5.4.22-1.el6.remi
           Available: php-common-5.3.3-26.el6.x86_64 (base)
               php-common(x86-64) = 5.3.3-26.el6
           Available: php-common-5.3.3-27.el6_5.x86_64 (updates)
               php-common(x86-64) = 5.3.3-27.el6_5
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Installed: php-common-5.4.22-1.el6.remi.x86_64 (@remi)
そういえばPHPはremiでインストールしていた。

ということで、こっちのコマンドでphp-xmlをインストール
$ sudo yum install --enablerepo=remi php-xml

無事にインストールできたので、Symfony2を再度インストールする・・・その前に、
インストール先のディレクトリに中途半端なSymfony2が作られているので削除してから再度インストールコマンドを実行して完了。

2014年4月22日火曜日

Vagrantでローカル開発環境構築

Vagrantでローカル開発環境を構築するメモ

VagrantのBoxをダウンロードして追加する
$ vagrant box add centos64box http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

Vagrantfileを作成する
$ vagrant init centos64box

Vagrantfileをカスタマイズ
$ vi Vagrantfile

次のコメントアウトを外す
# config.vm.network :private_network, ip: "192.168.33.56"

Vagrantを立ち上げる
$ vagrant up

Vagrantに接続
$ vagrant ssh

最新化
$ sudo yum update -y

ネットワークの設定
$ sudo vi /etc/resolv.conf

行頭に追加
options single-request-reopen

ファイアーウォールを切る
$ sudo service iptables stop
$ sudo chkconfig iptables off

インストール済みのリストを表示
$ yum list installed

Webサーバーがインストール済みか確認
$ yum list installed | grep httpd

Webサーバーをインストールする
$ sudo yum install -y httpd

Webサーバーを立ち上げる
$ sudo service httpd start
$ sudo chkconfig httpd on

インストールされるphpの詳細を表示する
$ yum info php

古いのでepel remiを入れる
ディレクトリに注意

インターネットで"epel downloads"と検索
→ https://dl.fedoraproject.org/pub/epel/6/x86_64/
上記サイトで"epel-release"を検索
$ wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

次に"remi"で検索
→ http://rpms.famillecollet.com/
CentOSの-v 6を探す
$ wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

rpmのリポジトリにepelを追加
$ sudo rpm -Uvh epel-release-6-8.noarch.rpm

remiの追加
$ sudo rpm -Uvh remi-release-6.rpm

設定ファイルの編集
$ sudo vi /etc/yum.repos.d/epel.repo

6行目あたりを編集
enabled=1 → enabled=0

remiを使った場合にインストールされるphpの詳細
yum info --enablerepo=remi php

phpをインストール
$ sudo yum --enablerepo=remi install -y php php-devel php-pysql php-mbstring php-gd

phpの設定を編集
$ sudo vi /etc/php.ini

以下を探して編集
;error_log = syslogの下に追加
error_log = /var/log/php.log
次のコメントアウトを外す
;mbstring.language = Japanese
5行下辺りを編集
mbstring.internal_encoding = EUC-JP → UTF-8
4行下辺りのコメントアウトを外す
;mbstring.http_input = auto
10行した当たりのコメントアウトを外す
;mbstring.detect_order = auto
次を編集
expose_php = On → Off
;date.timezone = を探して編集
date.timezone = Asia/Tokyo

Webサーバーを再起動
$ sudo service httpd restart

MySQLをインストール
$ sudo yum install -y --enablerepo=remi mysql-server

設定ファイルの編集
$ sudo vi /etc/my.cnf

4行目に次を追加
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8

MySQLを起動する
$ sudo service mysqld start

更に設定
$ /usr/bin/mysql_secure_installation
パスワードを設定する

デフォルトで起動させる
sudo chkconfig mysqld on

PostgreSQLを入れる
公式サイトで次の命令をコピー
$ sudo yum install -y http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm

インストール
$ sudo yum install -y postgresql93-server postgresql93-contrib

初期化
$ sudo service postgresql-9.3 initdb
$ chkconfig postgresql-9.3 on
$ sudo service postgresql-9.3 start
$ sudo passwd postgres

$ su - postgres
$ psql
ユーザーを表示
# \du
# create user vagrant createdb password 'lssn6666' login;
# \q
$ exit

Rubyを入れる
複数のバージョンを管理できるrbenvを入れる
その前にgitを入れる
$ sudo yum intall -y git

公式サイトからコマンドをコピー
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ type rbenv

ruby-buildを公式サイトからインストール
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

rubyをインストール
$ rbenv install -v 2.0.0-p247
$ rbenv rehash
$ rbenv global 2.1.1

Ruby on Railsを入れる
gemをアップデート
$ gem update --system

インストール
$ gem install rails --no-ri --no-rdoc -V
$ rbenv rehash
$ rails -v

Rubyを最新にする

rbenvを更新する
$ cd ~/.rbenv
$ git pull origin master

ruby-buildを更新する
$ cd plugins/ruby-build
$ git pull origin master

利用可能なバージョンを確認する
$ rbenv install -l

最新バージョンをインストールする
$ rbenv install -v 2.1.1

2014年1月9日木曜日

Webサーバー (Apache) でPythonファイルを実行できるように設定する

webサイト作成中に躓いたこと。

Pythonで作成した配列をJSONにエンコードしてAjaxで受け取ろうとすると、JSONではなくPythonのソースコードがそのまま送られてきた。

原因はwebサーバー上でPythonを実行できるように設定していなかったため。

手順は以下のとおり

1.Apacheの設定ファイルを開く
sudo vim /etc/httpd/conf/httpd.conf

2.次の記述箇所を検索して編集する
  AddHandler cgi-script .cgi 
=>  AddHandler cgi-script .cgi .py

3.次の記述箇所を検索し
<Directory "/var/www/html">
その少し離れた下の方にある記述を編集

  Options Indexes FollowSymLinks 
=>  Options Indexes FollowSymLinks ExecCGI


4.Apacheを再起動
sudo service httpd restart

以上


ちなみに

手順2の編集箇所に .pl .rb など各言語の拡張子を追記すれば実行可能になる模様。

また、DirectoryIndex index.html〜 という箇所に index.py など使用したい言語のindexページを記述しておけば html の動的生成ができるようだ。

2014年1月4日土曜日

pillowにlibjpegを導入する

pillowでjpeg画像を編集しているとdecode errorのようなメッセージが出た。
どうやらpillowだけではjpeg画像を扱えないらしい。

ということでlibjpegを導入する。(sudoは省略)

1.libjpegのダウンロード

wget http://www.ijg.org/files/jpegsrc.v9.tar.gz


2.解凍

tar xzvf jpegsrc.v9.tar.gz


3.ちょいと設定をいじる
./configure --enable-shared


4.インストール
make
make install


5.pillowをアンインストール
pip uninstall -y pillow


6.pillowをインストール
pip install pillow


無事、JPEGを扱えるようになりました。


追記)pythonを実行中に
shared object file 云々
のエラーが出たら、ライブラリへのパスが設定されていない可能性があるので、
/etc/ld.so.config.d/
のディレクトリに次の記述をしたファイルを作成する。
/usr/local/lib/
ファイル名は
python2.7lib.conf
のように .conf で終わるように付ける。

2014年1月3日金曜日

Pillowのthumbnailオプション比較

JPEGが開けませんといった問題を乗り越えて使えるようになったpillowで画像のリサイズをしてみた。

リサイズに用いたthumbnailメソッドにはresampleというオプションがあり、

  • NEAREST
  • BILINEAR
  • BICUBIC
  • ANTIALIAS

の4種類から指定できる。ちなみにオプション省略時はNEARESTが適用される。


早速これら4つのオプションを比較してみる。
検証画像はこちら。



この画像を300×300にリサイズ

NEAREST
曲線部分がカックカクな上にぶつ切りになっている。
傾斜のある直線も垂直方向に修正された結果、変なストライプができてしまった。


 BILINEAR
全体的にぼかされて曲線や斜め線のカックカクが改善されている。



BICUBIC
曲線や斜め線のカックカクが改善されているのに画像がシャープなまま。
ただし水平や垂直に近い曲線はカクカクしている。


ANTIALIAS
全体的にぼかされてカックカクな部分がほとんどない。


まとめ

オプションはBICUBICかANTIALIASを指定すべきだろう。
シャープさを求めるならBICUBIC
曲線美を求めるならANTIALIAS
といったところか。


ちなみに
サイズは300×300を指定したが、実際には最大長が300になるように縦横比率を保持してリサイズされた。
いちいち最大長を求めて条件分岐云々をやらなくて済む便利なメソッドのようだ。

2014年1月2日木曜日

CentOSにPython2.7をインストールし直す

先日、Vagrant上のCentOSにPython2.7をインストールした。

これに画像処理のライブラリpillowを入れたがimportできない。

どうやらCentOSにデフォルトでインストールされているPython2.6の方にライブラリが入ってしまったらしい。


テキトーにインストールしていたためパスがカオスなことになっていたのでPython2.7をインストールし直すことにした。


以下が手順


まず、vagrantに接続


/usr/local/bin
Python公式HPからダウンロードする場合、このディレクトリにインストールされるため、ここにパスを通す必要がある

visudo
このコマンドでパスを編集するファイルを開く

Defaults    secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/local/bin:を追加



作業中に
permission denied
のようなメッセージが出たら sudo を付けて実行する



cd /usr/local/src
wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
圧縮データをダウンロード


tar xvzf Python-2.7.6.tgz
解凍


cd Python-2.7.6
解凍したディレクトリに移動


./configure --enable-shared --prefix=/usr/local --with-threads
いろいろ設定して

make
ビルドして

make install
インストール


vim /etc/ld.so.conf.d/python2.7lib.conf
Pythonライブラリのパスを記述する新規ファイルを作成


/usr/local/lib/
上記の一文を追加して保存


ldconfig
設定を読み込み直す



次はeasy_installのインストール


その前に
which python
コマンドを実行してパスが
/usr/local/bin/python
であることを確認(/usr/bin/pythonだと2.6の方にインストールされてしまう)


wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
distribute をダウンロード


tar zxvf distribute-0.6.49.tgz 
distribute を解凍


cd distribute-0.6.49
解凍先のディレクトリに移動

python setup.py install
distribute をインストール


easy_install pip
pipをインストール



無事、pipでライブラリを追加できるようになった。