WordPress のソースを解析する方法

WordPress のコアファイル数は *.php だけだと、たぶん 260~270 あると思いますが、なにかしらの調査があって調べようと思うと最初はどこに何が状態になると思います。 ということで、ここは IDE の力を借りて簡単にソースを追う方法を紹介してみます。 というかぼくがいつもやっている方法です。 🙂

使っているのはおなじみの Eclipse PDT。 紆余曲折ようやく Ubuntu でも 2.0 が使えるようになったので PDT 2.0 であります。 面倒だったのでまだ英語のままです。

eclipsepdt10

これですね。

IDE というのは、プログラム言語をある程度知っています。 これが関数であるとか、ここが変数のスコープであるとか、という部分をパースしてくれているので、ふつうの検索とかより賢い検索であるとか、カーソルジャンプが使うことができます。

PHP は、言語仕様として、 requre とか include を動的にすることができるので IDE が無力になる場合もあるのですが、それでもある程度まではイケます。 動かすまでどういうプログラム構成になるか分からないというところが、PHP の最大の特徴のような気もします(笑) まぁ DI とかもそうですね。

てなわけで、ケース1。 page_navilink という関数があったとして、これってどこにあるんだっていう grep の例。

PDT では PHP Seach という機能が使えます。 ここで、Limit To を Declarations に設定すると定義部分だけ抽出して検索結果を返してくれます。

eclipsepdt11

おお、general-template.php にあるのね~。

eclipsepdt12 

ソースにぴょん。

eclipsepdt13

ふつうの grep だと、呼び元先、そのほかコメントとかにあるのもだしてきちゃうので、この Limit は賢いです。

ケース2。 じゃーこの page_navilink 関数はどこで使ってるの?

関数を改修しようとして、影響範囲を調べるのによくあるパターンです。 実は PDT には、Java IDE でおなじみの Call Hierarchy というメソッド呼び出し検索機能があるっぽくみえます。 関数なぞって右クリックして実行。。

eclipsepdt14

にゃーんも、でね~(汗)

[news.eclipse.tools.pdt] Re: ‘Open call hierarchy’ (Ctrl-Alt-H) doesn’t

Call Hierarchy is not implemented yet in PDT 2.0.

[tegaki]くらぁ~!(笑)[/tegaki]

というわけで、残念ながら Call Hierarchy 機能は使えないのですが、呼び元検索であれば先ほどの PHP Serach で代用できます。

Limit を References に。

eclipsepdt15

ほうほう、これから呼ばれているのか、の図。

eclipsepdt16

なんて感じですね。 いくつかの呼び出しをみれば使い方も分かってきます。

最後ケース3。 テーマをいじってたときに、the_tags という関数の使い方を見たくなったとき。

IDE を使う一番らくな部分が、定義ジャンプです。 the_tags の定義部分にボタン一つで飛ぶ機能であります。

こればっかりは、見ていただいた方が早い!1分動画なのでみてみて~。 🙂

検索すらいりません。 F3 押すだけでどんどんとべますので、ソースを追うときは恐ろしく効率的です。 テーマ表示部分のフィルターみつけるときはこの方法が一番早く見つけられるかもしれません。 あと、PHPDoc 形式にコメントがちゃんとなっていれば、カーソルあわせでホバーもします。

さてさて、ほかにも IDE には、それっぽいところにブレイクはっておいて、そっからステップで追っていくとかいろいろ小技があるのですが、少し大きめのアプリであれば使ってみる価値はあると思います。

以上、ひろまさワンポイント(!?)でした。

Ubuntu 9.04 の MonoDevelop 2.0 でデバッガがうまく動作しない

Ubuntu 9.04 で楽しみにしていたことのひとつに、オープンソース .NET 実装 mono の開発環境が MonoDevelop “2.0” と 2 系になることでした。 もちろん、コンパイルすれば 2.0 はどこにもで入るわけですが、やっぱり標準パッケージになっていると安心感が違います。 🙂

 monodevelop02

MonoDevelop 2.0 で注目していたのはデバッガが動作すること(1.0 ではできなかったのです)だったのですが、いっくらやってもうまくブレイクできません。。

[tegaki]しょぼん。。[/tegaki]

一応、インストールパッケージなどを確認して本日再挑戦してみました。 超簡単なプログラムにブレイクいれて、てい。

monodevelop01

・・・。 さようなら。。

現象としては、だんまりしたままうんともすんともです。

こういうときはログを・・・。

## DebuggerServer started
Cannot read symbol file `/usr/lib/mono/2.0/mscorlib.dll.mdb':
  Could not find file "/usr/lib/mono/2.0/mscorlib.dll.mdb".
WARNING: Got event 137f for unknown pid 15158
WARNING: Got event 137f for unknown pid 15159

はい? たしかに該当ファイルはないようです。 で、このログをたよりにバグを探していくと、ありました。

Mono – MonoDevelop IDE – error on debugger init (mscorlib.dll.mdb)

I think the problem is that you’re trying to use mono-debugger-2.0 which seems to be buggy. Use the SVN version, it works for me but the 2.0.

Bug #367232 in mono-debugger (Ubuntu): “mdb stops with "Got event 137f for unknown pid 8522"”

Binary package hint: mono-debugger

Hi, the mono-debugger in Jaunty has a serious bug in it, which prevents it from debugging.

This has to do with a race condition, which only appears with newer kernels.

Ubuntu のバグ登録日は 4/26 ということで、ついこの前ですね。

2.4 系の mono-debugger では修正されていることですが、Ubuntu は 2.0 系を使っているので修正するにはバックポートになりそうですが、はたして誰か拾ってくれるかどうか・・・。 どなたかお願い。。(笑)

ただ不思議なのは、ごちゃごちゃやったら一度だけうまくうごいたことがあるのです。。 なにかカーネルが絡んだ不具合のようなので難しい問題なのかもしれません。

まぁまぁうちの環境の不具合じゃないということが分かっただけでも収穫であります。 果報は寝て待て 🙂

Ubuntu 9.04 + 内蔵 GeForce で動作が安定しない場合

8.10 のときからだったかもなのですが、メイン PC の Ubuntu で NVIDIA ドライバをつかって Compiz とか 3D 系をつかうと、たまに X がクラッシュするような動作をし再起動しなければならない現象がでていました。

これがだいたい1日1回くらいの頻度・・・、起きる日もあれば起きない日もあり、頻発するひもありの気まぐれ具合。 再現性があれば何か分かりそうなもんですが、これまたないため困り果てておりましたが、ついに解決したようです。 🙂

まぁ、要は NVIDIA のドライバの不具合だと思うのですが、、もし同様に内蔵タイプの GeForce で不具合が起きている方がいたら新しいドライバを試してみるといいかもしれません。 ちなみにうちは、GeForce 8200 です。

185.18.08 (BETA) for Linux x86/x86-64 released – nV News Forums

Fixed stability problems with some GeForce 6200/7200/7300 GPUs on multi-core/SMP systems.

ちょっと型番違いますが、うちは マルチコア(Phenom X4) + GeForce 8200 でこのフィックスで直ったような気がします。。 185.18.08 (BETA) 導入以降、2週ほどたちますが不具合は一度も起きていません。 Ubuntu 標準パッケージは現時点では、180.44 だった気がします。

NVIDIA 配布ドライバを独自で入れる方法ですが、ちょっとくせがあります。 たぶん以下でいけるかと思います。

はじめて入れる場合は、gcc などの開発系とカーネルヘッダをいれておくひつようがあります。 また Ubuntu パッケージが入っている場合は入れる前に消しておかないと、X が起動しなくなる模様です。

$ sudo apt-get install build-essential
$ sudo apt-get install linux-headers-`uname -r`
$ sudo apt-get remove nvidia* linux-restricted-modules*

でもって、NVIDIA からドライバパッケージをダウンロードしてきます。

Current NVIDIA Linux graphics driver releases – nV News Forums

どこかわかりやすいところにファイルをおいて、いったんログアウトしてログイン画面まで戻ります。  で、CTRL + ALT + F3 とかおしてコンソール表示して、テキストログイン。

gdm をおとして X を終了させてしまいます。 これは、インストーラが X が起動していると怒り出すのでこのようにするといいと思います。 で、ドライバインストーラを起動します。

$ sudo /etc/init.d/gdm stop
$ sudo sh NVIDIA-Linux-x86-185.18.04-pkg1.run

あとは、適当に質問に答えれていきます。 最後 xorg.conf を書き換えるかという質問にはOKすると良いです。

nvidia01

できたらリブートすればこのドライバで動き出すはずです。

nvidia drivers error: Failed to load the NVIDIA kernel module

だめだったら残念。。 xorg.conf を元に戻して標準ドライバ起動して対策を考えましょう。 /etc/default/linux-restricted-modules-common と、/etc/modprobe.d/lrm-video の修正が必要かもしれません。

GeForce8600GT on Ubuntu 7.04 | Way2Go

8600GTでXが正常に起動できるまでのメモです。

あくまでも、私の環境では、この作業で動作したと言う報告なので、環境によっては、動作しなかったり、違うやり方があると思いますので、参考にとどめてくださいね。

参考になります。 🙂

ということで、NVIDIA ドライバが導入されたら Compiz とか OpenGL でぐりぐり遊べます。 CUDA 対応の ffmpeg とか動かすのもおもしろそうですね。

Compiz だけじゃつまらないということで、OpenGL のゲームを動かしてみました。 Linux でも 3D ゲームできるとうれしいですよね! 適当にパッケージがから探して。。

Super Tux Kart ・・・。

そこはかとなく、妙な胸騒ぎがするゲーム名です。。

インストール・起動してみました。 UNIX 系のオープンソースキャラがカートに乗っているようです。

nvidia02 

・・・。 さらに胸騒ぎのアフター5。(←意味不明

スタート。

nvidia03

道路にプレゼントがおちています。 どうやらアイテムのようです。 なぜかバナナの皮がみちにおちています。 いただいたアイテムは投げつけることができるようです。

[tegaki]○リオカートかYO![/tegaki]

– 完 –