カテゴリー ‘ プログラミング

PHPのdate_default_timezone_set()のエラー対策


 

最近のPHPでdate関連の関数を実行すると、

Strict Standards: date() [function.date]: It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We now use ‘Asia/Tokyo’ for ‘JST’ in

こんな感じのエラーが表示されると思います。

これは、タイムゾーンを設定していないからです。

その対応の為のphp.iniの設定方法は、

sudo /etc/php.ini
date.timezone = Asia/Tokyo

これで、httpd or nginx or php-fpmを再起動してphp.iniの設定を読み込みます。

PHPでのmbstringの設定


 

PHPをUTF-8で使用する場合に、いつもmbstringの設定をするのでその備忘録

phpの[mbstring]の設定

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS-win,auto
mbstring.substitute_character = ?;

これが一番、POSTなどでデータを渡しても文字化けが少ないと思われる設定方法

もっと良い設定があるかもしれませんが、いつもこの設定でやっていて特に問題ないです。

さくらのVPSのCentOS6.2への環境構築


 

さくらのVPSでのOSでCentOS6.2が標準OSになったのでその時に行った設定をまとめる

iptablesの設定

sudo vim /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, HTTPS, MySQL
-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 433 -j ACCEPT
-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 25 -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を再起動する

sudo /etc/init.d/iptables start

ユーザーの作成

useradd [ユーザー名]
passwd [ユーザー名]

sudoの設定

visudo

次の行のコメントを外す

# %wheel ALL=(ALL)       ALL
  ↓
 %wheel ALL=(ALL)       ALL

次にgroupをユーザーに付与する

vigr

次の行にsudoを使用したい対象ユーザーをカンマ区切りで記述する

wheel:x:10:root
  ↓
wheel:x:10:root,[ユーザー名]

sshの設定

mkdir .ssh
chmod 700 .ssh
# scpで~/.ssh/auhtorized_keysをコピーする
chmod 600 .ssh/authorized_keys

sshd_configを編集

sudo vim /etc/ssh/sshd_config

以下のように修正して、パスワードでの認証を拒否する

PasswordAuthentication yes
  ↓ 以下のように「yes」から「no」に変更する
PasswordAuthentication no

sshdの再起動

sudo /etc/init.d/sshd restart

zshのインストール

sudo yum install zsh

ユーザーのログインシェルの変更

sudo chsh -s /bin/zsh [ユーザー名]

screenのインストール

sudo yum install screen

yumの設定

yum-prioritiesのインストール

sudo yum -y install yum-priorities

次に、CentOS-Base.repoにprioritiesの設定をする

sudo vim /etc/yum.repos.d/CentOS-Base.repo

開いたファイルの[base][updates][extras]に以下の設定を追加する

priority=1

RPMforgeリポジトリインストール

sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
sudo rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
sudo vim /etc/yum.repos.d/rpmforge.repo

rpmforge.repoの編集

sudo vim /etc/yum.repos.d/rpmforge.repo

rpmforge.repoの[rpmforge]に以下の内容を追加

enabled=1
priority=1

epelリポジトリのインストール

sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
sudo rpm -ivh epel-release-6-5.noarch.rpm
sudo vim /etc/yum.repos.d/epel.repo

epel.repoの編集

sudo vim /etc/yum.repos.d/epel.repo

epel.repoの[epel]を以下の内容で編集

enabled=1
priority=1

remiリポジトリのインストール

sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6-1.el6.remi.noarch.rpm
sudo vim /etc/yum.repos.d/remi.repo

remi.repoの[remi][remi-test]を以下の内容で編集

enabled=1
priority=1

memcachedのインストール

sudo yum install memcached

MySQLのインストール

sudo yum install --enablerepo=remi mysql.x86_64 mysql-server.x86_64

MySQLの設定

sudo vim /etc/my.cnf

以下の設定を記述する

[mysqld]

 〜 途中略 〜

character-set-server=utf8
skip-character-set-client-handshake

 〜 途中略 〜

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

データベースの作成

sudo mysql_install_db

mysqlを起動

sudo /etc/init.d/mysqld start

rootパスワードの設定

/usr/bin/mysqladmin -u root password '新しいパスワード'

PHPのインストール

sudo yum install --enablerepo=remi,remi-test php.x86_64 php-devel.x86_64 php-bcmath.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-fpm.x86_64 php-imap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64 php-soap.x86_64 php-snmp.x86_64 php-xml.x86_64 php-xmlrpc.x86_64
sudo yum install --enablerepo=remi,remi-test php-pecl-apc.x86_64 php-pecl-memcached.x86_64 php-pecl-http.x86_64

nginxのインストール

wget http://nginx.org/download/nginx-1.1.19.tar.gz
tar zxvf nginx-1.0.15.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-1.5.tar.gz
tar zxvf ngx_cache_purge-1.5.tar.gz
cd nginx-1.1.19/
sudo yum install libxslt-devel.x86_64 gd-devel.x86_64 geoip-devel.x86_64 pcre-devel.x86_64 openssl-devel.x86_64
sudo groupadd -g 700 www-data
sudo useradd -s /sbin/nologin -M -g www-data -u 700 -d /var/www www-data
./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --prefix=/opt/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --http-log-path=/var/log/nginx/access.log --add-module=../ngx_cache_purge-1.5
make
sudo make install

nginxの起動スクリプトの設定

sudo vim /etc/init.d/nginx

以下の内容を記述する

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest_q || configtest || return 6
    stop
    start
}

reload() {
    configtest_q || configtest || return 6
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    echo
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

configtest_q() {
    configtest >/dev/null 2>&1
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

# Upgrade the binary with no downtime.
upgrade() {
    local pidfile="/var/run/${prog}.pid"
    local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || configtest || return 6
    echo -n $"Staring new master $prog: "
    killproc $nginx -USR2
    retval=$?
    echo
    sleep 1
    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        echo -n $"Graceful shutdown of old $prog: "
        killproc -p ${oldbin_pidfile} -QUIT
        retval=$?
        echo
        return 0
    else
        echo $"Something bad happened, manual intervention required, maybe restart?"
        return 1
    fi
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    force-reload|upgrade)
        rh_status_q || exit 7
        upgrade
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart}"
        exit 2
esac

起動スクリプトの権限を変更する

sudo chmod 755 /etc/init.d/nginx

php-fpmの設定

php-fpmの起動ユーザーをnginxで指定したユーザーと合わせる

sudo vim /etc/php-fpm.d/www.conf
user = www-data
group = www-data

sessionのフォルダのグループを変更する

sudo chgrp www-data /var/lib/php/session

nginxの設定変更(以下の記述を追加)

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /opt/nginx/html/$fastcgi_script_name;
    include        fastcgi_params;
}

nginxの再起動

sudo /etc/init.d/nginx restart

php-fpmの起動

sudo /etc/init.d/php-fpm restart

info.phpを書いて動作確認

vim info.php
<? phpinfo();

自動起動設定

sudo chkconfig iptables on
sudo chkconfig nginx on
sudo chkconfig php-fpm on
sudo chkconfig memcached on
sudo chkconfig mysqld on
sudo chkconfig postfix on

これでCentOS6.2にnginx + mysql + phpの環境ができました。

[ruby] rvmをmacにinstallする方法


 

macにrvmをインストールする方法

rvmをインストール

ここを参考にrvmをインストール

curl -L get.rvm.io | bash -s stable

 rvmを最新更新する

rvm get head
rvm get latest

 ruby 1.9.3をインストール

rvm install 1.9.3

ruby 1.9.2をインストールする

rvm install 1.9.2

エラーが表示されて、以下のコマンド打てと言われた

$ rvm requirements

  Notes for Mac OS X 10.7.3, Xcode 4.3.2.

For MacRuby: Install LLVM first.

For JRuby:  Install the JDK. See http://developer.apple.com/java/download/  # Current Java version "1.6.0_26"
For IronRuby: Install Mono >= 2.6
For Ruby 1.9.3: Install libksba # If using Homebrew, 'brew install libksba'

You can use & download osx-gcc-installer: https://github.com/kennethreitz/osx-gcc-installer
** NOTE: Currently, Node.js is having issues building with osx-gcc-installer. The only fix is to install Xcode over osx-gcc-installer.

We had reports of http://hpc.sourceforge.net/ making things work, but it looks like not easiest/safest to setup.

To use an RVM installed Ruby as default, instead of the system ruby:

    rvm install 1.8.7 # installs patch 357: closest supported version
    rvm system ; rvm gemset export system.gems ; rvm 1.8.7 ; rvm gemset import system.gems # migrate your gems
    rvm alias create default 1.8.7

And reopen your terminal windows.

Xcode 4.2:
 * is only supported by ruby 1.9.3+
 * it breaks gems with native extensions, especially DB drivers.

Xcode 4.3+ users
- please be warned
- only ruby-1.9.3-p125+ is partially supported
- in case of any compilation issues:
 * downgrade to Xcode 4.1
 * uninstall Xcode and install osx-gcc-installer
and reinstall your rubies.

うーん・・・

どうやら、「Xcode 4.1」をインストールしないといけないらしいので、

どうやら「Xcode 4.3」と「Xcode 4.1」同居出来るみたいなので

  • https://developer.apple.com/downloads/index.action

ここからXcode4.1をダウンロードしてインストールしました。

もし、Xcode4.2がインストールされている場合は、以下のコマンドアンイストールしてからインストールします。

$ sudo /Developer/Library/uninstall-devtools --mode=all

ん?「libksba」をインストールしろと書いてあるので、インストールと念の為1.9.3の再インストール、1.9.2のインストール

/usr/bin/ruby -e "$(/usr/bin/curl -fksSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
brew install libksba
rvm reinstall 1.9.3
rvm install 1.9.2

 railsのインストール

ruby1.9.3にrails 3.2.3をインストール

rvm use 1.9.3
rvm gemset create rails323
rvm gemset use tails323
gem install rails -v 3.2.3

ruby1.9.3にrails 3.2.2をインストール

rvm use 1.9.3
rvm gemset create rails322
rvm gemset use tails322
gem install rails -v 3.2.2

ruby1.9.2にrails 3.2.3をインストール

rvm use 1.9.2
rvm gemset create rails323
rvm gemset use tails323
gem install rails -v 3.2.3

ruby1.9.2にrails 3.2.2をインストール

rvm use 1.9.2
rvm gemset create rails322
rvm gemset use tails322
gem install rails -v 3.2.2

これで、

「ruby 1.9.3〜ruby 1.9.2」

「rails 3.2.2〜3.2.3」

のバージョンでのインストールが完了!

Perlでテンプレートエンジンを作ってみた!


ソースはこちら

ソースは「こちら」にあります。

テンプレートエンジンを作るまでの経緯

元々Javaのエンジニアだったので、テンプレートエンジンは

使った事はあったのですが、PHPを使い出して5年位、Smartyの使い方すら知らないw

てか、PHPでテンプレートエンジンの重要性をそれ程感じてなかった。

前の仕事でちょっとテンプレートエンジンが欲しくなった

テンプレートエンジンが欲しくなった理由

    1. プログラムを組む人が、周りにいない仕事環境・・・。
    2. 過去のプログラムはHTMLを分割してプログラムの至る所に配置されている
    3. ライトないい感じのテンプレートエンジンがなかった

唖然とした、プログラム出来る人がほぼ0なのになんでプログラムの中にHTMLが埋めこまれているの???

これじゃあデザインの変更すら用意に出来ない!!

普通プラグラマでも、こんなプログラム怖くてデサイン変更できない。

ということでまずは、ロジックとデザインの分離

至極当然の変更作業。

しかしプログラムはPerlで書かれてる・・・。

俺、Perlほぼしらない・・・。

でもやらないと!

まずは、Perlの勉強

すぐわかるオブジェクト指向Perl」を買ってきて読破!!

モダンPerl入門」必要な箇所を読破!!

(1週間くらい?)

で、プログラム開始。

Perlのフレームワークの調査

色々なしがらみがあってPerlからPHPへの変更は、難しい状態。。。なので、Perlのフレームワークを調査。

今プログラムが動いているサーバに出来るだけ変更をしたくないので追加でCPANモジュール入れないでもOKなライトな感じのフレームワークを探してただが・・・いいのがない

Perlでよく聞くCatalystでいいかと思ってたけど結構なフレームワークだ。ここまで機能いらないからもう少し軽いのと思ったのだが、以外といい感じのがない。

自作Perlフレームワークの作成

軽い奴だから無いのなら作るか!ということで、PHPでいうCodeIgniterのようなフレームワークを3日ほどかけて作成!

うーん、後はアプリを作りながら不備や足りない部分を足していこう、ということで開発開始

2週間くらいかけてフレームワークとアプリ作成完了!

無事リリースまでもって行けた。よかった。

ここで一番ネックになっていたテンプレート部分をどうしたかというと

独自テンプレートエンジン作成!!

Perlの既存のテンプレートエンジンも調査したのですが、あまりいいのがない

無いなら作るかという発想でまたもや作成というか、以前PHPで独自のテンプレートエンジンを作成していたのでそれを元に作成!

動作時の軽さの保証はないですが、自分でも中々いい物ができたんじゃないのかなと思っています。

何が一番いいってHTMLコメント形式での記述なので、DreamweaverのようなWYSIWYGエディタでも編集時に表示が乱れる事があまりない。

高機能では無いですが、その分習得は簡単ですw

ソースはgithubに上げています「Gen-Template-for-Perl」です。

使い方は、「こちらのスライド」を読んでください。

また、githubのtest.cgiの中を見てもらえたら使い方がある程度理解できるのではと思います。

よかったら使って見て下さい。

return top