各種OSのパッケージ等はここで取得できますね。
CentOSなら、Linux => centos と進めばいい。
PHP+MySQLのWEBシステム開発の現場からお届け
Written in 10-7-2010 by シンプル・アイ社長 | No Comments
お名前.comのVPS(64ビット、CentOS5.3)にyumが入っていなかったのでインストールする。
http://www.onamae-server.com/vps/
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-elementtree-1.2.6-5.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-sqlite-1.1.7-1.2.1.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/m2crypto-0.16-6.el5.6.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-urlgrabber-3.1.0-5.el5.noarch.rpmrpm -ivh python-elementtree-1.2.6-5.x86_64.rpm
rpm -ivh python-iniparse-0.2.3-4.el5.noarch.rpm
rpm -ivh python-sqlite-1.1.7-1.2.1.x86_64.rpm
rpm -ivh m2crypto-0.16-6.el5.6.x86_64.rpm
rpm -ivh python-urlgrabber-3.1.0-5.el5.noarch.rpmwget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rp
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-3.2.22-26.el5.centos.noarch.rpmrpm -ivh yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm \
yum-metadata-parser-1.1.2-3.el5.centos.x86_64 \
yum-3.2.22-26.el5.centos.noarch.rpm
でも、FAQをよくみたら、コントロールパネルで自動アップデートをOFFにするとyumがインストールされるようでした。。。
http://www.onamae-server.com/support/faq/vps/common/common_43.php
初期セットアップ時は、yumはインストールされていません。
yumはコントロールパネルにてアップデート方法を”アップデートなし”に変更するとインストールされます
Written in 14-5-2010 by シンプル・アイ社長 | No Comments
OpenPNEのインストールで、
./symfony openpne:install
を実行した際に、
Couldn’t locate driver named mysql
と怒られたなら、それはPHPにpdo_mysqlエクステンションが入っていないから。ソースディレクトリからエクステンションをコンパイルする。
cd /usr/local/src/php/php-5.2.5/ext/pdo_mysql/
phpize
./configure –with-php-config=/usr/local/php5/bin/php-config \
–with-pdo-mysql=/usr/local/mysql5.0
make
make install
でインストールし、php.iniに、
extension=pdo_mysql.so
を加えてApacheリスタート。
起動OKと出て、安心できない。ブラウザでPHPのページをみると閲覧できない。Apacheが起動していない。。。
php -i
で、確認しようとすると、
php: symbol lookup error: /usr/local/php5/lib/php/20060613/pdo_mysql.so:
undefined symbol: php_pdo_declare_long_constant
とでる。これは、/usr/local/php5/include/php/ext/pdo/php_pdo_driver.hのバージョンがよろしくないようだ。PHPをソースインストールした際のソースディレクトリからコピーしてやる。
cp /usr/local/src/php/php-5.2.5/ext/pdo/php_pdo_driver.h \
/usr/local/php5/include/php/ext/pdo/php_pdo_driver.h
いったんpdo_mysqlをアンインストールする。
rm -f /usr/local/php5/lib/php/20060613/pdo_mysql.so
上記、ソースから再度インストール。make cleanしてからね。これでApache再起動でいけました。OpnePNEもインストール完了。
Written in 3-5-2010 by シンプル・アイ社長 | No Comments
PHPのpreg_matchにおいて、カッコを使って、サブキャッチパターンを作ることがあるだろう。ただ、そのサブキャッチパターンにマッチする文字数(バイト数)が10万文字(バイト)を超えると、エラーも発生させず、ただ単に、「マッチせずに」終了となる。(PHP5.2.5にて検証) 以下にサンプルコードを示す。
<?php
for ( $i=1; $i<=1000000000; $i++ ) {
$src .= ‘1234567890′;
if ( !preg_match( ‘/<(.+?)>/’, ‘<’.$src.’>’, $matches ) ) {
echo “not match at “.$i;
break;
}
}
?>
上記コードでは、決して「not match at ???」とは表示されることはないように思われるだろう。しかし実際はそうではない。実行してしばらく待つと以下の結果が出る。
not match at 10000
(.+?)というサブキャッチパターンにマッチする文字列が、10000×10文字=10万文字になった時点で、マッチしなくなり、echoして、breakしていることが分かるはずだ。ちなみに、以下のコードでは、どうだろう。
<?php
for ( $i=1; $i<=1000000000; $i++ ) {
$src .= ‘1234567890′;
$src2 .= ‘1234567890′;
if ( !preg_match( ‘/<(.+?)><(.+?)>/’, ‘<’.$src.’><’.$src2.’>’, $matches ) ) {
echo “not match at “.$i;
break;
}
}
?>
上記の場合、以下のような結果となる。
not match at 5000
おわかりだろう。やはり10万文字だ。(5000×10文字)+(5000×10文字)=10万文字なのである。
そんな長い文字をサブキャッチなんかしないといわれるかもしれない。しかし、私がこれに気付いたのは、XML-RPCのリクエストのパースを実装していた時だ。XML-RPCで、データを登録するリクエストにおいて、<base64></base64>タグで、画像データを受け取った際に、preg_matchのサブキャッチパターンで中身を取得したのだ。結果、大きな画像を受け取ったときに、マッチしないという事態に陥ったのだ。
たちが悪いのは、エラーをはいてプログラムが停止するのではなく、単にマッチしなくなって次の処理に進んでしまうことだ。ぜひ、気をつけていただきたい。
Written in 28-4-2010 by シンプル・アイ社長 | No Comments
うちのフレームワークの絵文字コンバータ機能を再作成しました。3キャリアのSJISのページから送られてくる絵文字をmbstring.encoding_translationで、内部エンコードのUTF-8に変換したのちに、絵文字を [emoji:E123] のような内部で扱う形式に変換し、DBに保存する。PCサイトの出力時には、<img>で絵文字画像を出力し、各携帯キャリアに出力する際には、各キャリアの絵文字に変換して出力する機能です。
絵文字のバイナリと絵文字タグの相互変換をするための変換テーブルをどのような形式にしようかとだいぶ模索しました。
■フォームからやってくる絵文字を内部用の絵文字タグに変換する実装
DoCoMo
フォームからのSJIS絵文字=>UTF-8に変換=>※置換実行※<=UTF-8に変換<=unicodeの16進数をpack
EzWeb
フォームからのSJIS絵文字=>UTF-8に変換=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack
Softbank
フォームからのSJIS絵文字=>UTF-8に変換=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack
DoCoMo
絵文字タグ=>※置換実行※<=UTF-8に変換<=unicodeの16進数をpack
※置換実行※=>SJIS-winに変換EzWeb
絵文字タグ=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack
※置換実行※=>SJIS-winに変換Softbank
絵文字タグ=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack
※置換実行※=>SJIS-winに変換
ドコモ絵文字は、mb_encoding_translationで、unicodeからSJIS-winや、UTF-8に変換して、それぞれの文字コードで表示できる。しかし、EzWebやSoftbankの絵文字では、unicodeから、SJIS-winや、UTF-8に変換しても、各エンコードの絵文字配列が異なるせいか、各エンコードで同じ絵文字を表示させることができない、というより文字化けとなる。したがって、サイトのHTML出力で使うエンコードの16進数を使ってバイナリを作り、それをmb_encoding_translationで変換してやる必要がある。(フォームからやってくる絵文字は、mbstring.encoding_translationで変換されているので。)
Written in 12-4-2010 by シンプル・アイ社長 | No Comments
XREAやCORESRVERのPHPで、モジュール版とCGI版のPHPを合わせて使って、セッションが引き継がれると以下のようなエラーが出る。
Warning: session_start() [function.session-start]: open(/tmp/sess_xxxxxxxxxxxxxxxxxxxxxx, O_RDWR) failed: Permission denied (13) in /virtual/xxxx/public_html/index.php on line xx
これはCGI版では、セッションファイルが、/tmp/にて、FTPユーザー権限で書きこまれ、一方モジュール版ではApacheユーザー権限で書きこまれるからだ。それで、CGI版PHPで作成されたセッションファイルをモジュール版PHPから読み込む際にパーミッションエラーとなるのだ。逆もまたしかり。
Written in 2-4-2010 by シンプル・アイ社長 | No Comments
TeraTermのマクロはとても便利だ。ログイン時の処理から、ログイン後のシェル実行までいろいろ使える。今回は、adminでログインして、rootにsu-してパスワード入力するマクロだ。
以下のようなフォルダを作り、そこをTeraTermのマクロを格納することにする。
C:\TTmacro
まずはそこにSSHログイン用の処理を記述したマクロを「ssh_login.ttl」という名前で作り、それを環境ごとのマクロからincludeする。
strcompare conn_method ’ssh’
ssh_method = !result
strcompare conn_method ’ssh1′
ssh1_method = !result
strcompare conn_method ’ssh2′
ssh2_method = !resultif ssh_method then
conn_str = ‘/ssh’
elseif ssh1_method then
conn_str = ‘/ssh /1′
elseif ssh2_method then
conn_str = ‘/ssh /2′
endifstrlen key_file
exist_key_file = resultif exist_key_file then
sprintf ‘%s:%s %s /LA=%s /KT=%s /KR=%s /auth=publickey /user=%s /passwd=%s /keyfile=”%s%s”‘ hostname conn_port conn_str language kanji_transmit kanji_receive username password work_dir key_file
else
sprintf ‘%s:%s %s /LA=%s /KT=%s /KR=%s /auth=password /user=%s /passwd=%s’ hostname conn_port conn_str language kanji_transmit kanji_receive username password
endifconn_param = inputstr
connect conn_param
次に、各ログイン先ごとのマクロを書く。例として192.168.1.5のサーバに公開鍵方式でadminでログイン後、rootにsu-するマクロ「root@192.168.1.5.ttl」を示す。秘密キー「id_rsa」をマクロ格納フォルダにおく。
; 設定
work_dir = ‘C:\TTmacro\’
hostname = ‘192.168.1.5′
username = ‘admin’
password = ‘adminpassword’
root_password = ‘rootpassword’
key_file = ‘id_rsa’; 言語 E:英語 J:日本語 K:韓国語 R:ロシア語 U:UTF-8
language = ‘J’
; 漢字コード受信 SJIS EUC JIS UTF8 UTF8m KS5601
kanji_transmit = ‘UTF8′
; 漢字コード送信 SJIS EUC JIS UTF8 KS5601
kanji_receive = ‘UTF8′
; SSHバージョン。 ssh or ssh1 or ssh2
conn_method = ’ssh’
conn_port = ‘22′; SSHログインを実行する
ssh_login_ttl = ’ssh_login.ttl’
ssh_login_ttl_path = work_dir
strconcat ssh_login_ttl_path ssh_login_ttl
include ssh_login_ttl_path; ここからはログイン後の処理
wait username
sendln ’su -’
wait ‘Password:’
sendln root_password
秘密キーのファイル指定「key_file」を空にすると通常のパスワード認証になる。
.ttlファイルがTTPMACRO.EXEに関連付けられていなければ、
マクロファイルを右クリック => 「プロパティ」 => プログラムの「変更」ボタン => TTPMACRO.EXEを選択
とする。これで、マクロファイルをダブルクリックするだけで、TeraTermの自動ログインができるようになった。
LogMeTTや、TeraTerm Menuなどで、こうしたマクロを利用するとさらに便利である。
Written in 1-4-2010 by シンプル・アイ社長 | No Comments
PCの遠隔操作にTeamViewerというソフトがよさそうだ。
http://www.teamviewer.com/ja/index.aspx
インストールしたPC同士、IDとパスワードで遠隔操作できる。
ファイル転送もできちゃう。商用利用でなければ無料。
商用利用の場合はライセンスを購入する。
Written in 30-3-2010 by シンプル・アイ社長 | No Comments
PHPでftp_put()関数などでFTP通信をする際に、
Warning: ftp_put() [function.ftp-put]: Ok to send data. in /path/to/script.php on line 99
のようなエラーに出くわすことはないだろうか。この場合、PHPが動作しているマシンのiptablesに注意が必要である。FTPログインはできたものの、相手からデータ通信のコネクションが張れないままタイムアウトしているのであろう。
通信相手のFTPサーバがアクティブモードで動作している場合、こちらから相手FTPサーバの21番ポートにコネクトしたのち、相手FTPサーバの20番ポートから、 こちらが通知した1024-65535の間のポートにコネクトしようとしてくる。
なので、こちら(PHPが動作しているマシン)のiptablesのINPUTチェーンで制限を加えている場合、INPUTチェーンでは、 1024-65535の間のポートが空いている必要が出てしまう。
これはあまりにも危険だし、その必要もない。以下のようにする。
iptables -L
を行い、INPUTチェーンに
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
の行があることを確認する。これは、確立済みのコネクションと、関連するコネクションを許可するものだ。なければ以下のように作る。
iptables -I INPUT 5 -p udp -m state –state ESTABLISHED,RELATED -j ACCEPT
上記、5の部分は挿入するINPUTチェーンの行番号です。
次にiptables関連のカーネルモジュールを確認する。
lsmod
を実行し、ip_conntrack_ftpと、ip_nat_ftpの行があることを確認し、ないものを入れる。それぞれ以下の通り。(多くの場合、ip_conntrack_ftpは入っている。)
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
これで、アクティブモードのFTPサーバに対して、PHPでFTP通信ができるようになった。
このままではサーバが再起動したら元に戻ってしまう。
/etc/sysconfig/iptables-config
で、使用するモジュールを以下のように設定する。
IPTABLES_MODULES=”ip_nat_ftp”
service iptables save
IPTABLES_MODULES=”ip_nat_ftp
Written in 29-3-2010 by シンプル・アイ社長 | One Comment
ソースインストールしたApache2.0に後からmod_cache.so、mod_disk_cache.so、mod_file_cache.so、mod_mem_cache.soを後から追加する。
ソースディレクトリに行く。うちの例では以下の通り。
cd /usr/local/src/apache/httpd-2.0.61/modules/cache/
apxsコマンドで、モジュールをコンパイル&インストール
apxs -i -a -c mod_file_cache.c
ソースディレクトリに行く。うちの例では以下の通り。
cd /usr/local/src/apache/httpd-2.0.61/modules/experimental/
apxsコマンドで、モジュールをコンパイル&インストール
apxs -i -a -c mod_cache.c cache_util.c cache_storage.c
apxs -i -a -c mod_mem_cache.c cache_cache.c cache_hash.c cache_pqueue.c
apxs -i -a -c mod_disk_cache.c
「-c」オプションでモジュールのソースファイルを指定。
「-i」オプションでビルド完了後モジュールをモジュールディレクトリに移動。
「-a」オプションでhttpd.confにLoadModule文が1行が追加されます。