wordpressのソースを読みながらPHPを勉強する その2

【シリーズ一覧】

/wp-load.php

error_reporting()はどんなエラーを出力するかを設定するもの。デフォルトでは”E_ALL &~ E_NOTICE”らしい。^は排他的論理輪だから、E_ALLからE_NOTICEとE_USER_NOTICEのビットを0にしたもの(これらを無効にしたもの)に設定する。しかしこのE_ALLは6143(=1011111111111)あるいは30719(=111011111111111)と言う中途半端な値になっている(バージョンによって違う?)。いずれにしても12bit目が0になっている。じゃあこのビットは何かというと、E_STRICT=2048=100000000000だ。このE_STRICTというのは特別扱いなのか。わかりずらい。

E_STRICTはPHPコードに対していろいろなアドバイスをしてくれるもののようだ。E_NOTICEとE_USER_NOTICEの違いはUSERの方は、trigger_error()を使ってエラーを表示させる。というよりtrigger_error()はUSER系のエラーしか発生させられないので、コードの中で独自のエラー処理のためのものだと思われる。PHP本体からUSER系のエラーが発生されることはないのだろう。

PHPではエラーが発生したとき呼ばれる関数をset_error_handlerで登録できるので、それを呼びたいときにtrigger_error()を使ってUSER系のエラーを発生させる。といってもこの関数が呼ばれるかどうかはerror_reporting()の設定には依存しないので、エラーハンドラの中でerror_reportingの値を見なければならない。しかし見ると言っても取得関数がないようだが、2回呼ばなければならないのか?それともini_get()を使えばいいのか?

そもそもini_set()があるのにerror_reporting()関数があるのはなぜだろうか?よくわからないのでスルー。


/wp-load.php

file_existsはその名のとおりファイルがあるかを調べてくれる。ディレクトリでも調べる。しかしPHPは内部にキャッシュを持っているようで、いったんこの関数がTrueを返した後ファイルを削除してからまた呼んでもTrueを返すらしい。もちろんここでいう削除は同じスクリプト内でのunlink()によるものではない場合。こういう場合はclearstatcache()を呼ばなければならない。んーー。

wp-config.phpがなければwordpressはまだインストールされていないものとしてインストーラが動くようだ。よってこのファイルをみれば各種設定がみれるだろう。


/wp-settings.php

WP_MEMORY_LIMITはこれまでどこでも設定されていないので’32M’が設定される。PHPの’memory_limit’の値がこれより低ければ大きくする。

しかしintval()に’32M’を渡しても32ににしかならないような気がする。memory_limitの値は文字列’32M’を受け付けるが数値の場合はバイトのようだ。よってWP_MEMORY_LIMITを設定する場合は数値にした方がよさそう。

wordpressのソースを読みながらPHPを勉強する その1

【シリーズ一覧】

/index.php

WP_USE_THEMESをtrueにセット。
defineは定数を定義する。定義されて定数は”$”なしで参照できる。すでに定義されているかを調べるにはdefined()を使う。変数にdefineされたものが入っている場合はconstant()を使う。一度定義された定数は変更できない。定数はどこらかでも参照できる。

WP_USE_THEMESをfalseにするとなにも表示されなくなる。現在のところ使い道不明。


/index.php

requireはファイルを読み込んで実行する。includeとの違いはエラー処理のみで、requireはエラーになるとスクリプトの実行がとまる。


/wp-blog-header.php

issetは変数がセットされていればtrueを返す。「セットされている」とは一回も”=”で値が代入されてないか、NULLがセットされいる状態を言うらしい。empty()というのもあり、これは0とか空文字とか空arrayのときtrueを返す。

他のファイルで使われている変数があって、そのファイルをrequireしたファイルでその変数をisset()をした場合はtrueになるし、値はそのファイルで設定した値になる。つまりrequireやincludeは名前空間的には同じになるようだ。

関数の中で使った変数は関数の外ではissetにならない(falseを返す)。しかし以下の例では$aはissetにならない。

以下の場合もnotを返す。

これはsetを返して欲しかったんだが、なぜnotなのか。phpでは関数外で書かれた変数は全部global扱いなので、上のように書いても意味はないのだろう。そこで以下のようにしたら、setになった。

実行されない限りglobalも評価されないということだろう。では関数内で変数がglobalかどうか知るにはどうすればいいのかというと$GLOBALS[]を使えばいいらしい。

よって変数$wp_did_headerはif文の中を1回だけ実行されるようにしたいのだろう。しかしそれならdefineを使ったほうがいいと思うが、defineよりも緩くしたということだろうか。


/wp-blog-header.php

__FILE__はマジックコンスタントといって自分のファイルのパスをフルパスで返す。4.0.2以降はシンボリックリンクも解決してくれる。dirname()はディレクトリを返すので、この文はこのファイルがあるディレクトリにあるwp-load.phpをrequire_onceする。require_onceは一回だけrequireすることだろう。しかしこの場合以下のように書いてはいけないのだろうか。

phpにはカレントディレクトリを変える関数もあるし、デフォルトのカレントディレクトリは最初に実行されたファイルのディレクトリになると思うので、dirname(__FILE__)として自分と同じディレクトリにしているのだろう。ちなみにマジックコンスタントとして以下のようなものもある。
__LINE__ : これがかかれている行番号
__DIR__ : dirname(__FILE__)と同じ。5.3.0から利用可能
__FUNCTION__ : 実行されている関数
__CLASS__, __METHOD__,__NAMESPACE__ : 省略。

おわり

Ubuntuでbashdbを使ってシェルスクリプトをデバッグする

インストール

$ sudo apt-get install bashdb

/etc/init.d/ufwをデバッグしてみる。

ここからコマンドを入力してデバッグしていく。基本的にはgdbと同じだと思う。基本的なコマンドは以下。
p : 変数を見る(print)
l : ソース表示(list)
h : ヘルプ
s : ステップイン
n : ステップネクスト
[Enter] : 直前のコマンドと同じ
q : 終了

findとsedで一括置換

Linuxの話。日本語の置換は未確認。
【目的】
/var/www/html/以下のすべてのファイルに対して、192.168.0.51を192.168.0.99に置換する。

【準備】
バックアップを.koreiranaidesuをつけて作るので、あらかじめこのファイルがないかをチェック。あったら違う名前にする。

【実行】

フルパス/var/www/html/以下のファイル(-type f)に対して置換する。 ファイルを直接変える(-i)。バックアップを.koreiranaidesuをつけて作る。192.168.0.51を192.168.0.99に変える。{}を”で括らないとスペースのあるファイルでうまくいかない。xargsを使わないでじっくり一個づつやる。置換しなくてもバックアップが取られるのでいっぱいあると大変。

【確認】
ほんとになくなったか調べる

成功したら*.koreiranaidesuを削除

Linuxでファイルやgconfの変更をトレースする

ファイルのトレース

straceコマンドをつけてコマンドを実行すると、そのコマンドがコールしたシステムコールがすべてエラー出力に書き出される。しかしこれだと情報が多すぎるので、-e trace=を指定して、トレースするシステムコールを制限する。以下のコマンドはopenとwriteのみをトレースする。

$ strace -e trace=open,write 2>&1 gedit | less

しかしこれだとwriteのところを見ても第一引数はfdなのでファイル名が分からない。openしたときの戻り値がここには入るはずなので、それで検索して見つけるしかないか?いいツールがあるのかもしれない。

gconfのトレース
これは簡単。環境変数のGCONF_DEBUG_TRACE_CLIENTを設定すればいい。

$ GCONF_DEBUG_TRACE_CLIENT=1 gedit

出力も分かりやすい。

サーバとして利用しているvmwareゲストのハードディスクを圧縮する

vmwareのハードディスク(vmdk)は、使った分だけ大きくなり、大きくなった分は元に戻らないので、どんどん大きくなってしまう。これはvmdkを成長型で作成した場合。

vmware-toolsにはハードディスクを圧縮する機能がありwindowsの場合はタスクトレイから起動して簡単に行える。ただしLinuxでLVMを使っている場合は不可。

Linuxの場合はgtkを使って作られているようなので、gnomeを使っていたり、gtkライブラリがインストールされていてXが動いていればrootでvmware-tools実行してハードディスクを圧縮できる。

しかしサーバとして動かしていてX環境をインストールしていない場合はコマンドラインでやりたいのだが、その方法は提供されてないみたいだった。VMware’s backでコマンドラインツールがいろいろ公開されているのでこれを使えばできるかも知れないがここではWindowsにCygwinのX環境をインストールしてそれをディスプレイにしてやってみた。なおvmdkを圧縮するにはあらかじめホストに十分な空き容量がないとならない。vmdkファイルを新しく作り直すため。2Gで分割してある場合は2Gの空き容量があれば十分なはず。

Cygwinのページに言ってセットアップファイルをダウンロードして実行する。インストールするソフトウェアの選択画面でX11を[Install]にしてインストールする。

コマンドラインからipconfigを実行してIPアドレスを確認しておく。ここでは192.168.0.204。

XPの場合はファイヤーウォールも一時的に切っておく。

スタートメニュから[Cygwin]→[Cygwin Bash Shell]を起動してstartxを実行。
$ startx

xtermが起動するので、xhostを実行してサーバからの接続を許可。
$ xhost +192.168.0.34
192.168.0.34 being added to access control list

ここで192.168.0.34はサーバとして動いているvmwareゲストのIPアドレス。

サーバではX環境の全部は必要ないがライブラリは必要なので、XOrg-libsなどのパッケージをインストール。
# apt-get install XOrg-libs

次にrootでvmware-toolboxを起動。このときDISPLAYを指定する。
# DISPLAY=192.168.0.204:0 vmware-toolbox

成功すればWindowsにvmware-toolboxが表示される。

あとはShrinkタブからvmdkを圧縮することができる。

関連記事:
vmware-vdiskmanager.exeでvmwareのディスクファイル .vmdkを2Gに分割する

firefoxのutf8のページのフォント

firefoxのフォント設定は言語単位で行うらしいのだが、例えばgoogle.comやyahoo.comの英語のページで使われるフォントを変えたいときどうしたらいいのかが良くわからない。

結論から書くと、.mozilla/firefox/xxxxxx.default/chromeにuserContent.cssを置いてそこで以下のようなファイルを作ると、それが適用された。

*{
font-family: MS UI Gothic !important;
}

MS UI Gothicのところを適当に変えればいいのだと思われる。最初の*を適当なエレメントに変えればカスタマイズできるのか?

Windowsの場合はこのファイルはC:\Documents and Settings\user\Application Data\Mozilla\Firefox\Profiles\xxx.default\chromeにある。

DebianやUbuntuでソースを取得してコンパイルする

debianのapt系コマンドでソースやその依存ライブラリなどを自動で取得してコンパイルし、debファイルを作成する方法。ここではUbuntuのnetwork-adminというIPアドレスやDNSサーバの設定をするツールのソースを持ってきてコンパイルしてdebファイルをつくってみる。


network-admin

まずこのツールがどのパッケージにあるかを調べる。

gnome-system-toolsというパッケージにnetwork-adminが含まれている。そこでこのパッケージのソースを持ってくる。

つぎにこれをコンパイルするのに必要な開発用ライブラリやツールなどをインストールする。

fakerootを使うのでインストールする。

以下のコマンドでコンパイルしてdebを作成する。

成功すれば、1つ上のディレクトリにdebファイルが作成される。これをインストールするにはdpkg -iコマンドを使う。

もとに戻すには以下のコマンドを使う。

Mandriva 2009 インストールレポート その3

フォントのインポート

$ drakfont
[インポート]をクリックしてフォントを選択してインポートする。

2chブラウザ

ここではV2Cをインストールする。ここでは~/binに置く。

$ cd
$ wget http://v2c.s50.xrea.com/V2C_T20081001a.tar.gz
$ tar xfvz V2C_T20081001a.tar.gz
$ mkdir bin
$ mv v2c bin/

パネルの[Menu]ボタンを右クリックして、メニューエディタを起動してV2Cを作成。アイコンはv2cicon.pngを指定。

Wine

# urpmi wine wine-doors
$ wine-doors
最初に起動するといろいろインストールする。途中ファイルダイアログが出たらデフォルトでそれらしいファイルを選んで進む。

IE6をインストールした。実行してみる。その前に一旦ログアウトした方がいいみたい。
$ wine ~/.wine/drive_c/Program\ Files/Internet\ Explorer/iexplore.exe

Mandriva 2009 インストールレポート その2

その1からのつづき。

インストールシステム

Mandrivaのインストールシステムはrpmを利用しているようで、urpmシリーズがリポジトリなどを管理する上位ツールとなっているようだ。さらにrpmdrakeがGUIツールとなっている用である。ここでは主にurpmを使う。

レポジトリソース

レポジトリソースは/etc/urpmi/urpmi.cfgにあるようだ。ここではここを参考に以下のようにした。
# mv /etc/urpmi/urpmi.cfg /etc/urpmi/urpmi.cfg.back
# urpmi.addmedia --distrib --mirrorlist '$MIRRORLIST'
# urpmi.addmedia --distrib --mirrorlist 'http://plf.zarb.org/mirrors/$RELEASE.$ARCH.list'

パッケージを探すurpmq

$ urpmq package # 普通に探す
$ urpmq --fuzzy package # ファジーに探す
$ urpmq -i package # パッケージの情報を表示

-aをつけると全部表示する。

パッケージをインストールするurpmi

# urpmi package

アップグレードする

# urpmi.update updates && urpmi --update --auto-select

日本語環境

日本語環境がまだできていないので、適当にやってみた。

# urpmi kde-i18n-ja
# urpmi kde4-l10n-ja
# urpmi fonts-ttf-japanese fonts-ttf-japanese-extra fonts-ttf-japanese-ipamona fonts-ttf-japanese-mplus_ipagothic

メニューから[Tools][Regional Settings]を選択。

# urpmi scim-anthy scim-input-pad scim-tomoe scim-bridge-qt4

この後ログオフしてサイドログインすることによりAnthyで日本語が入力できるようになった。切り替えはデフォルトで[Ctrl]+[SPACE]になっているが使いずらいので、Anthyのバーを右クリックして、[SCIM Setup]を選んで、以下のように設定して、全角半角キーにした。

デスクトップの設定からCountry and Regionを以下のように設定する。

テンキーが効かないので「コンピュータを設定」から以下のようにしてキーボードの種類をJapanese-106-keyにする。(要ログアウト)

以下のコマンドを実行してfirefoxを日本語化。
# urpmi firefox-ja

以下のコマンドを実行してOpenOffice.orgを日本語化。
# urpmi openoffice.org-l10n-ja openoffice.org-help-ja

Windowsの共有フォルダを自動マウントする

# urpmq samba-client autofs
# vi /etc/autofs/auto.master

# vi /etc/autofs/auto.smb
opts="-fstype=cifs"
を以下のように変える。
opts="-fstype=cifs,iocharset=utf8"

# mkdir /sambaauto
# chmod 777 /sambaauto

# chmod 755 /etc/autofs/auto.smb
# service autofs restart

# ls /sambaauto/192.168.0.100/

これで一覧が出てきたので成功。

音楽を再生

デフォルトではmp3はAmarokに関連付けされている。これは普通に再生できた。

動画を再生

# urpmi mplayer mplayerplugin
$ mplayer aaa.avi

再生できないのもあるがスルー。

パネルの設定

パネルを画面一杯にしたり、時計とかボタンとかの位置を変えるには、パネルの一番右の半円みたいなところをクリックして、編集モードにする。そうすると場所ボタンやルーラみたいなのが出るのでそれで画面一杯にできる。またボタンとかの場所も変えられる。

Mandriva 2009 インストールレポート その3