PHPをデバックするためにコンパイルする


ctags で PHP の src用タグファイルを作ってみる - ”たゆたえども沈まず”でPHP のコードを読めるようにしましたが、その後デバックもしたくなったため phpコマンドをデバックできるようにしてみました。
自分の環境は Mac Book AirOS X 10.8.3 です。コンパイルのための gccxcode 経由でインストール済です。インストールされてない方はhttp://memo.yomukaku.net/entries/UaLbzhEを参考にインストールしてみてください。

srcの取得

PHP のコードをダウンロードしました。自分が使っている PHP は 5.2.14 です。

phpコマンドのコンパイル

ダウンロードした tar.gz ファイルを解凍してコンパイルをおこないます。make の実行が終わると、phpコマンドができています。configure で --prefix を指定しているのは、デフォルトのパスで make install が実行されるのを避けるためです。デフォルトでは /usr/local となっているため、環境を汚さないために home配下のディレクトリを指定しました。

tar zxvf php-5.2.14.tar.gz
cd php-5.2.14/
./configure --prefix=~/opt/
make
ls sapi/cli/php

phpコマンドの printデバック

phpコマンドが作成できるようになりましたので、printデバックしてみたいと思います。今回は crc32 という PHP の関数を使って試します。ext/standard/crc32.c が crc32 関数の実装部分であるため、こちらに printf を仕込みます。仕込んだ後は該当のファイルをコンパイルして phpコマンドを作成しなおします。コンパイル実行のために .o .lo ファイル、phpコマンドを削除します。その後 make を実行します。

sapi/cli/php -r 'echo crc32(1)."\n";'
vim ext/standard/crc32.c
# rm -v sapi/cli/php ext/standard/crc32.lo ext/standard/crc32.
make
sapi/cli/php -r 'echo crc32(1)."\n";'


これで心置きなく PHP を printデバックできるようになりました。気になる動きがあったらガンガンデバックしてみたいと思います。

ctags で PHP の src用タグファイルを作ってみる

PHP を業務で使ってますが、PHP の関数の挙動を調べるために src を読む必要がありました。そこで ctags を使って vim用にタグタイルを作ってみました。環境は Mac Book AirOS X 10.8.3 です。

install ctags

ctagsコマンドは port でインストールしました。ってか自分の環境にはいつの間にかインストールされてました。いつインストールしたのやら。。。インストール方法は以下を参照してみて下さい。

download src

自分が使用している PHP の src をダウンロードしました。バージョンが異なると実装が異なることがありますので、ちょっと古いものですが探しました。

create tags

ctagsコマンドを使ってタグファイルを作成しました。

ctags -V -a -R --langmap=C:.c.h --exclude=tests -f ~/.vim/tags/php_src_tags ~/opt/php-5.2.14/

オプションもVimによるPHP開発でCtagsを使ってタグジャンプする – karakaram-blogを参考にさせて頂きました。
追加した点としては、exclude の指定です。src には tests 配下に phpt という大量のテストコードが入っているため、無駄なタグを作成したくなかったため除外しました。作成したファイルは vim で使用するため .vim 配下のディレクトリに配置しています。


あとは .vimrc に追加して終わりです。vim で実装がトレースできるようになりました。非常に快適です。

autocmd filetype c :setl tags=~/.vim/tags/php_src_tags

xcodeショートカット、エディタ画面へ移動したい

command + j そして return

xcode で実装をおこなっている際に、キーボード操作だけでナビゲーターからエディタへ移動したい、ということがちょくちょくあるようになってきました。command + shift + o でquick openを使ってファイルを開く、というのが手間に感じてきたのでショートカットを探してみました。command + j はフォーカスを移動させるショートカットであるため最短経路ではないのですが、これなら実用に耐えられそうな気がします。

XVim を使うようになって余計にキーボードのポジションで色々おこないたいという欲求がでてきました。story board で操作をしているとトラックパッドは使うんですけどね。でもコーディングの際はできるだけポジションは動かしたくないのです。

xcodeでのプロジェクト名,アプリ名もろもろの変更

サンプルアプリをコピーしてプロジェクトを作成した場合に、名前が一緒になってしまい困ることが多々あります。そこで、名前の変更周りについて調べてみました。といっても、すでにあるあるなネタですので、リンクをまとめただけです。


先駆者の方々ありがとうございます。無事名前を変えることができました。これで複製しながらサンプルに手を入れていくことができそうです。

"初めてのiOSアプリケーション" を読みなおしてみて

初めてのiOSアプリケーション の感想は d:id:tayutaedomo:20130321 で一度書きましたが、2つ目のiOSアプリケーション:ストーリーボード を読み進める中でもう一度読みなおしたため、新たに気づいたことを記録しておきます。

  • ボタンのイベント選択
  • アウトレット登録時はクリーンアップ不要
  • xcode の Editor のサジェスト機能
  • textFieldShouldReturnによる画面の切替
  • Modelオブジェクトによるデータの保存

ボタンのイベント選択


P38 にボタンのイベント「Touch Up Inside」を選択する部分があります。どのようなタイミングでイベント受け取るか、ということですが、「Touch Up Inside」以外にも色々とあるようなので、この辺りは一度試しておきたいところですね。
こちらのページが非常に分かりやすくまとまってました。

アウトレット登録時はクリーンアップ不要

P41 に下記のような記述がありますが、この自動でやってくれている内容を理解しておくことが必要だと感じました。本来クリーンアップが必要、ということを頭に入れておきたいと思います。

テキストフィールドにアウトレットを追加したことにより、次の2つを達成したことになります。
...
また、次の文をHelloWorldViewController.mのviewDidUnloadメソッドに追加しました。
self setTextField:nil;

xcode の Editor のサジェスト機能

P46 あたりの記述にエディタのサジェスト機能について明記されています。初心者の方からするとこの辺りはツールの機能を理解するという意味でも有益な感じがしました。Returnキーで確定させるオペレーションが記載されていますが、Tabキーで途中までの補完、またはカーソルを移動させつつ入力する方法なども記載されていると更によかったように思います。

textFieldShouldReturnによる画面の切替

P51 にテキストフィールドのデリゲート部分を実装する部分がありますが、その中でも textFieldShouldReturnメソッドの動きには驚きました。これ実装しないとテキスト入力の入力状態から戻れないんですね。ファーストレスポンダーの制御については常に考えておかないといけないのだと考えさせられます。

Modelオブジェクトによるデータの保存

P50 に userNameプロパティに代入する実装があります。これが Modelオブジェクトへのデータ保存、アプリケーションデータを取り扱う方法、の簡易実装のようです。色々とやろうとおもうとデータを扱う実装が必要になってきますので、この辺りは覚えておいた方がよいと思います。


やっぱりこのチュートリアルはいいドキュメントですね。気になったことを調べながら読み進めていくと色々な事が見えてきます。

dismissViewControllerAnimatedメソッドがよくわからない

2つ目のiOSアプリケーション:ストーリーボードを写経している中で、dismissViewControllerAnimated, dismissModalViewControllerAnimatedというメソッドがでてきました。新しく作成したシーンを MasterViewController とつなげる部分のようですが、Delegate も絡んできているためなかなか理解できません。そこでちょっと情報を集めてみました。

iOS View Controllerプログラミングガイドに P105「View Controller間の連携」という章がありました。この部分を呼んでいると「2つ目のiOSアプリケーション」の引用がよくでてきます。ちょうど詳細説明になっていて良い感じです。でもこれって dismissViewControllerAnimatedメソッドについて記述されているわけじゃないですね。「デリゲーションを使ってほかのコントローラと通信する」という部分でビューを閉じるためにコールしてるだけみたいでした。

こう考えると、やっぱりビューを閉じるために dismissViewControllerAnimated を呼んでいるという風に理解するのがよさそうですね。

更に調べていくと、iOS 6 からは dismissModalViewControllerAnimatedメソッドは is duplicated になってるみたいです。確かに UIViewController.h をみるとそう宣言されてますね。

// Dismiss the current modal child. Uses a vertical sheet transition if animated. This method has been replaced by dismissViewControllerAnimated:completion:
- (void)dismissModalViewControllerAnimated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

代替手段を探してみると、結局 dismissViewControllerAnimated を使えばいいみたいです。

写経の実装もそのようになおしてみたところ、問題なく動作しました。

- (void)addSightingViewControllerDidFinish:(AddSightingViewController *)controller name:(NSString *)name location:(NSString *)location
{
    if ([name length] || [location length]) {
        [self.dataController addBirdSightingWighName:name location:location];
        [[self tableView] reloadData];
    }
    //[self dismissModalViewControllerAnimated:YES];
    [self dismissViewControllerAnimated:YES completion:nil];
}

また別の実装として、Unwind Segue を使うという方法もあるようですね。詳しくはこちらを御覧ください。こちらの実装方法の方がしっくりくるようにも感じました。Delegate があると自分はどうも理解し難いようです。

結局 dismissViewControllerAnimated が何者であるかは調査しきれませんでしたが、ビューを閉じる動きについては多少理解できたように思います。