2009/12/01

PHP 5.3 の short_open_tag

やー、PHPに戻ってきたよ。いろんなところでdisられまくりのPHPですけど俺はお前の味方だぜ?

えっとですね、fedora 11 → 12 にアップグレードしました。そして yum upgrade したところ、PHPが5.3になりました。
そしたら急にPHPが動かない。HTMLに埋め込まれたPHPソースが丸見え・・・は、恥ずかしい。
俺はお前の味方なのにどうしてそういう、、、反抗期かい?

PHPとして認識されてないのは明らかなので、php.iniとhttpd.confあたりをチェックしてみよう。
似たような環境から php.ini を php.ini.sample なんて名前にして持ってきておもむろにdiffなんぞをやってみる。
diff /etc/php.ini.sample /etc/php.ini
< short_open_tag = On
---
> short_open_tag = Off

ああ、これか。
コア php.ini ディレクティブに関する説明 - Manual
PHP タグの短縮型 (<? ?>) を使用 可能にするかどうかを設定します。PHPをXMLと組み合わせて用いる 場合は、<?xml ?>をファイル中で用 いるためにこのオプションをオフにする必要があります。オンにし た場合にPHPでXMLを出力するには、例えば、次のようにします。 <?php echo '<?xml version="1.0"?>'; ?> これをオフにした場合、長い方の形式のタグ (<?php ?>)を使用する必要があります。


あれれ、いつからなんだろ。でもPHPはこういうものだからみんなも気にしないよね。
そんじゃーね。

2009/11/14

巨大なファイルとか大量のファイルをアーカイブしたり復元したり

gzipって、2GBまでっていうサイズの制限があるじゃないですか。
昔はそれでよかったかもしれないですが、今のご時世、そんなの余裕で超えちゃうことがあって困っちゃう。
そんなあなたに、今日ご紹介するのはこれ。
cpio - アーカイブファイルへのファイルのコピーや、アーカイブファイルからファイルへのコピーをおこなう

詳しいことはmanをみればいいんだけど、やたらといっぱいいろいろ書いてあってげっそりするので、超簡単に使い方を。

ファイルをアーカイブしたいときはファイル名のリストを渡してやります。
私の都合で恐縮ですが、hote.txtってファイルよりも新しいファイルだけをアーカイブしたいのでこんな感じで。
find ./* -cnewer hoge.txt | cpio -oa > backup.cpio


ほんでそれを復元するときは、
cpio -idm < backup.cpio


アーカイブした時のオプションの説明はこれ
-a, --reset-access-time
ファイルを読み込んだ後に、それらのファイルのアクセスタイムの再設定を行います。これは、これらのファイルがその時点で読み込まれたもののように見えないよ う
にするためです
-o, --create
コピーアウトモードで走行します。

復元した時のオプションの説明はこれ
-d, --make-directories
必要に応じてディレクトリを作成します。
-m, --preserve-modification-time
コピー先のファイル生成時に、コピー元のファイルの更新時刻を保持します。
-i, --extract
コピーインモードで走行します。

manからコピってきただけだよ!じゃあの。

2009/10/19

Pythonのスライス表記

こんばんはー、Pythonビギナーです。どうぞよろしく。

えーっと、Pythonでは foo[1:3] と書くと配列の一部とか文字列の一部が取り出せるそうです。
ただ、これがすごくわかりにくい。

Python リファレンスマニュアル
5.3.3 スライス表記 (slicing)
スライスは i および j をそれぞれ指定した下境界、上境界として、インデクス k が i <= k < j となる全ての要素を選択します。

ああ、もう何言ってるんだよ・・・わからないよ。もっとわかりやすく言って欲しい。

どうやら"境界"っていうので、
0  1  2  3  4  5
[a][b][c][d][e]
↑<-->↑
この間

の事を言うらしいんだ!だから「b,c」が取り出される。いやまぁ、ちゃんと「i <= k < j」っておっしゃられてるんですけどね。

でもね。多くの場合はさ、
 0  1  2  3  4  5
[a][b][c][d][e]
↑<--->↑
この間

って、思うよね?だから「b,c,d」が取り出されるって思うよね?よね?
僕ちんわかんないよ。できることなら図で示して、やさしく教えて欲しい。

ああ、この先入観でムダに時間を使っちゃったので、自分へ言い訳をして心を落ち着けてる次第です。

2009/10/14

PythonAutoReload On しても、リロードしてくれない

2009/12/5 追記
Djangoのマニュアルにちゃんと書いてあった・・・ orz
mod_python 上で開発用サーバを動かす
開発用サーバに mod_python を使う場合、コードを変更する度にサーバを再起動するようなやんちゃは避けられます。 MaxRequestsPerChild 1 をアパッチの httpd.conf ファイルに指定し、Apache にリクエストごとに全てをリロードさせてください。

というわけで、以下の文章は無視する方向でどうぞよろしく。
-------------------

Djangoハジメマシタ

それで、Apache mod_python っていう環境で開発してるわけですが、コードを修正しても、なんだかいつまでたっても反映されないことがある。
ブラウザをリロードする度に、エラー、正常、エラー、、、、みたいな。なに、もう、すごいストレス。

ググっても、なんかみんな「PythonAutoReload On」ってすればオッケーみたいに涼しい顔してるけど、ほんとにー?ならないよ!
もー、なんでだろ、もうあれだ、「MaxRequestsPerChild 1」ってして、1リクエストごとに子プロセスを再起動することにしよう。

もちろん、開発環境だけですよ。

2009/09/30

えっとですね、とりあえず余ってるDELLのデスクトップPCをサーバにしたてて運用してやろうと。
こんなご時勢なので新しい設備投資はなかなか厳しいですよね。あー世知辛い。

で、一通りセットアップしてからリブートして、自分の席からゴニョゴニョしてやろうかと思ったらSSHでつながらない・・・
あれれー、なんでなんでー?さっきまで上機嫌だったじゃん。ちょっと離れたらもうご機嫌ナナメ?
もーしょうがないなー、どうしたんだい?
Keyboard Failure

サーバ運用だから、ディスプレイだとかキーボードだとかいきなり引っこ抜いてごめんネ
でも、文句は言わせないゾ
  1. BIOS設定画面を表示
  2. Standard CMOS Features を選択
  3. Halt On の項目を、All,But Keyboard に設定

2009/09/17

Remember The Milk のタスクを Skype でリマインド

たいした仕事もしてないんですけど、Remember The MilkでToDo管理をしてたりします。
で、よくありがちなリマインド機能ですが、いちいちメールなんかでお知らせされるとうっとおしいんです。そのうち無視するようになっちゃって、あぁ、もう何がなんだか。
なので、Skypeに通知するようにしたんですけど、これがまた思うとおりに行かない。
なんでか、最初に、Remember The MilkのSkypeアカウントの「rtmremind」へなんかメッセージを送らないと、教えてくれないんですよ。
なので、毎朝メッセージを送ってたんですけど、そんなの当然、忘れちゃうよヽ(`Д´)ノ

ってことで、正しい対処法かわかんないですけど、起動時に自動でメッセージを送るようにしました。

SkypeTask.js
var rtmremind = 'rtmremind';
var body = 'task';
var trycount = 10;

//------------------------------------------------

var skype = new ActiveXObject("Skype4COM.Skype");
var user, chat;

WScript.ConnectObject(skype, 'Skype_');

var i = 1;
while(!skype.Client.IsRunning){
WScript.Sleep(20000);
if(i++ >= trycount) break;
}
skype.Attach();

user = skype.User(rtmremind);
chat = skype.CreateChatWith(user.Handle);

chat.SendMessage(body + "\n");

スタートアップにでも放り込んで下さい。
Skypeは起動に時間がかかるので、Sleepしながら10回頑張ります。
それでも起動してないと、Skype4COM.Skypeがエラーしますけど、そんときは今日は調子が悪いんだなとあきらめて下さい。

あ、あと、この部分を、
var body      = 'task';

var body      = '麗子君、今日の予定は?';

とかすると、なんだかちょっとえらくなった気分を味わえるかもしれません。

2009/08/20

コンソールでちょこっとPHPが試したいとき

あれー? PHPの設定ってどうなってたっけー?
phpinfo() をやればいいんだけど、いちいちファイルを作るのめんどくせーな、って時にはですね、こんな塩梅ですよ。
echo '<?php phpinfo() ?>' | php

こんな風にすれば、有効な関数も一覧にできちゃう。
echo '<?php $funcs = get_defined_functions(); foreach ($funcs['internal'] as $val) { echo "$val\n"; } ?>' | php

まぁ、ここまでするなら、ファイル作ったほうが楽ですけどね。
# 本末転倒

2009/08/15

mknmz が重複して実行される

mknmz は、実行時に NMZ.lock2 というファイルを生成して、重複実行されないようになっているそうです。
でも、私の環境では実行されることがあります。おかしいですね。

どうやら、mknmz が実行されてすぐに、NMZ.lock2 が生成されるわけではなくて、対象ファイルをチェックしてからとかある程度処理をしてから生成されるみたいです。まぁ勘ですけど。

cronとかで、定期的に実行してたとして、対象ファイルが沢山あったりして、NMZ.lock2 が生成されるまで時間がかかってる間にもう一回 mknmz を実行したりするとそのまま重複実行できちゃたりします。

なので、daemontoolsで実行をコントロールすることにしましたよ、と。

2009/07/01

まるちSkype (4.0以降ですよ!)

私は裏表があります。その場その場で態度が変わります。
なので、Skypeもいろいろと使い分けたいです。
ので、こんなものを作ってみました。

multi_skype.js

//アカウント設定
var account = [
{
id : ''
,pw : ''
}
,
{
id : ''
,pw : ''
}
];

//Skypeプログラムへのパス
var SKYPE = '"C:\\Program Files\\Skype\\Phone\\Skype.exe"';

//------------------------------------------------

var wsh = new ActiveXObject("WScript.Shell");
var cmd;
var opt = new Array();

for(var i = 0; i < account.length; i++){
opt = [
"/username:" + account[i].id
,"/password:" + account[i].pw
,"/nosplash"
,"/minimized"
,(i > 0) ? "/secondary" : ""
];
cmd = SKYPE + " " + opt.join(" ");
wsh.exec(cmd);
WScript.Sleep(1000);
}

アカウント設定のところに使い分けたい id, pw を入力したらダブルクリックで起動します。
Skypeの自動起動オプションはチェックを外して下さいね。


2009/05/20

IPv6?

なんだか、MySQL5.1にしたら、リモートから接続できなくなった・・・?

mysql> SELECT version();
+------------------------------+
| version() |
+------------------------------+
| 5.1.32-ndb-7.0.5-cluster-gpl |
+------------------------------+
1 row in set (0.00 sec)


[root@ ~]# mysql -u root -p -h 192.168.1.xxx
Enter password:
ERROR 1130 (00000): Host '::ffff:192.168.1.nnn' is not allowed to connect to this MySQL server

ああ、もう・・・。

CentOSのIPv6をきっちりOFFにすればいいのかなぁ?
でも、おんなじ環境でMySQL5.0のサーバには接続できるしなぁ。

bind-address というのを設定すればいいのか?
[root@ ~]# vi /etc/my.cnf
[mysqld]
bind-address = 192.168.1.xxx

[root@ ~]# /etc/init.d/mysql restart

わーい、つながった。

2009/03/08

ライブラリはあるのに、無いと怒られるとき

CentOS 5 の話です。
configure なんかでライブラリが無いっていうから、あれれ?って探すとあるじゃん!
なんで無いっていうの!もう!ってときは、ありかをそっと教えてあげてください。
[root@ ~]# vi /etc/ld.so.conf.d/local-lib.conf
/usr/local/lib

[root@ ~]# ldconfig

 

namazu.so の作り方

(2010/02/06)
Sourceforgeのphp-i18に移動したようですのでそちらにあわせて手順を変更
[root@ ~]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fphp-i18n%2F14174%2Fnamazu-2.3.1.tgz'
[root@ ~]# tar zxvf namazu-2.3.1.tgz
[root@ ~]# cd namazu-2.3.1
[root@namazu-2.3.1 ~]# phpize
[root@namazu-2.3.1 ~]# ./configure --with-namazu
[root@namazu-2.3.1 ~]# make
[root@namazu-2.3.1 ~]# make install
[root@ ~]# cd ..
[root@ ~]# rm -rf namazu-2.3.1
[root@ ~]# rm -f namazu-2.3.1.tgz


ソース取得
cvs -d:pserver:cvsread@cvs.php.net:/repository co pecl/namazu


コンパイル
[root@ ~]# cd pecl/namazu
[root@ namazu]# phpize
[root@ namazu]# ./configure --with-namazu
[root@ namazu]# make
[root@ namazu]# make install


phpize がない場合
[root@ ~]# yum install php-devel


エラーが出る場合
configure: error: Cannot find libnamazu.h. Please specify correct Namazu installation path
Namazuがインストールされているか確認する
[root@ ~]# which namazu

 

2009/02/15

MySQLのSLAVEが切れて涙目

Slave_IO_Running: No
Slave_SQL_Running: No

とかなって、切ない気持ちになることあるじゃないですか。
ほんで、どーにか簡単に復旧できねーかなぁと思ったらようやく見つけましたよ。

mysql> STOP SLAVE;
[root@ ~]$ /etc/init.d/mysqld stop
[root@ ~]$ rm -f /var/lib/mysql/relay-log.info
[root@ ~]$ /etc/init.d/mysqld start
mysql> START SLAVE;

これでどうにか復旧できることもあると思いますよ。

 

2009/02/11

mknmzでインデックスを作成する際に文字コードが正しく認識されないようです

Namazu: FAQ
mknmzはLANGに `ja' から始まるlocale名が指定されていない時は日本語の処理を行いません。
Namazu 2.0 tutorialの 日本語の文書を扱うにはを参照してください。

ほー、そうなのか。日本人が作ったからって油断してちゃダメってことですね。わかります。
mknmz に --indexing-lang=ja をつければいいんですね。

2009/01/03

LVS+keepalived で負荷分散

LVS と keepalived で負荷分散に挑戦してみましたよ!
CentOS release 5.2 ですよ。

構成はこんな感じ
              |192.168.1.100
+-----------+
| LVS |
+-----------+
|
+---------------+
| |
+-----------+ +-----------+
|192.168.1.4| |192.168.1.5|
+-----------+ +-----------+



ロードバランサにするマシンにLVSとkeepalivedをインストールします。
LVSは、RPMでさくっと入ります。
yum -y install ipvsadm

keepalived RPM が無いから作ります。
[root@~ ] yum -y install kernel-devel
[root@~ ] cd /usr/src/redhat/SOURCES/
[root@~ ] wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
[root@~ ] tar zxvf keepalived-1.1.15.tar.gz
[root@~ ] cd keepalived-1.1.15

おもむろに ./configure する
[root@~ ] ./configure
Keepalived configuration
------------------------
Keepalived version : 1.1.15
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : No
IPVS sync daemon support : No
Use VRRP Framework : Yes
Use LinkWatch : No
Use Debug flags : No

あれ?Noばっかし・・・・
カーネルのソース指定が必要なんだそうな
http://d.hatena.ne.jp/yoshifumi1975/20070731/p1
でも、何を指定すりゃいいんだろ?
Makefile.in に rpm なんてオプションがあるから試してみる。
[root@~ ] make rpm

んーなになに。うちの環境ではこれですか。
--with-kernel-dir=/lib/modules/2.6.18-92.el5/build

もっかい試す
[root@~ ] ./configure --with-kernel-dir=/lib/modules/2.6.18-92.el5/build

でも、だみだよー
/usr/src/kernels/2.6.18-92.1.6.el5-x86_64/net/core/link_watch.c... no
Keepalived configuration
------------------------
Keepalived version : 1.1.15
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
Use VRRP Framework : Yes
Use LinkWatch : No
Use Debug flags : No

link_watch.c がないってさ。なんだよー
とりあえず、ここに入ってるってさ。
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.gz
カーネルに近いのを探して、ターゲットの下にコピーして下さい。
[root@~ ] cd ..
[root@~ ] tar zxvf linux-2.6.18.8.tar.gz
[root@~ ] cp -r linux-2.6.18.8/net/core /lib/modules/2.6.18-92.el5/build/net/

そんでなんとかこんな状態に持ってって下さい。
[root@~ ] ./configure --with-kernel-dir=/lib/modules/2.6.18-92.el5/build
Keepalived configuration
------------------------
Keepalived version : 1.1.15
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
Use VRRP Framework : Yes
Use LinkWatch : Yes
Use Debug flags : No

できた?ほしたらこれでRPMができるはず
[root@~ ] make rpm
[root@~ ] rpm -ivh /usr/src/redhat/RPMS/x86_64/keepalived-1.1.15-5.x86_64.rpm


後片付け
[root@~ ] cd ..
[root@~ ] rm -rf keepalived-1.1.15
[root@~ ] rm -f keepalived-1.1.15.tar.gz
[root@~ ] rm -rf linux-2.6.18.8
[root@~ ] rm -r linux-2.6.18.8.tar.gz




ロードバランスされる側のマシン(192.168.1.4,192.168.1.5)に、仮想IPの192.168.1.100を認識させてやります。
[root@~ ] vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
[root@~ ] ifup lo:0

[root@~ ] vi /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
[root@~ ] sysctl -p

Google Analytics