「プログラミング」カテゴリーアーカイブ

Ubuntu 16.04をインストールしてからPHPのデバッグができるまで

Ubuntu 16.04上でPHPのデバッグができる環境を整えました。手順をまとめます。

Apache2のインストール

まずはApache2のインストールから。

$ sudo apt install apache2
$ sudo a2enmode userdir

a2enmodeでuserdirを有効にします。これで、ホームディレクトリのpublic_htmlディレクトリを公開できるようになります。作ったディレクトリが/home/hoge/public_htmlだと、

http://localhost/~hoge/で、public_html以下が公開されます。

PHPのインストール

次は、PHPのインストール。

$ sudo apt install php libapache2-mod-php

/etc/apache2/mods-available/php7.0.confのphp_admin_flag engine Offをコメントアウト。これで、上で設定したpublic_html内でPHPが使えるようになります。

MySQLのインストール

次にMySQLのインストール。

$ sudo apt install mysql-server mysql-client

実は、最初mariadb-serverとmariadb-clientをインストールしたのだけれど、rootのパスワードが設定されずアクセスできませんでした。バグのようなのでMySQLに変更しました。

ところが、MariaDBをアンインストールして、MySQLをインストールしようとしてもエラーでできません。こちらの情報に従って完全に設定ファイルを削除した後でインストールできました。

Uninstall MySQL completely

PDOのインストール

PHPからMySQLにアクセスするPDOをインストールします。

$ sudo apt install php-mysql

$ sudo service apache2 restart

上述のようにuserdirを使える状態で、/home/hoge/public_html/index.phpに

<?php
phpinfo();

と書いたファイルを作って、http://localhost/~hoge/でアクセスして、PDOのところにmysqlとドライバが表示されていればOKです。

Javaをインストール

PHPのデバッグにNetBeansを使えればと思い、Javaをインストール。

$ sudo apt-add-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt install oracle-java8-installer

NetBeansをインストール

NetBeansは、PHPを使えるものをダウンロードしてインストールしました。

$ sudo sh ./netbeans-8.1-php-linux.sh

インストール先は、/usr/localではなくてホームディレクトリの中にしました。

日本語のインライン変換ができないときは、以下のようにFcitxの設定をするとうまくいきます。変換候補が離れたところに表示されるので今一つですけど。

Fcitx tips

xdebugをインストール

NetBeansで、PHPをデバッグするためにxdebugをインストールします。

$ sudo apt install php-xdebug

これでインストールはできるのですが、動かすために設定が必要になります。
xdebug.iniにzend_extensionしか設定されていないので、xdebug.remote_enable=1とxdebug.remote_autostart=1、xdebug.idekey="netbeans-xdebug"の3行を付け加えます。
remote_enableは、NetBeansでデバッグするときに必要になります。htmlからphpを呼び出すときなど、2つのファイルにまたがるときはidekeyが必要になります。
、remote_autostartは、後述するVisual Studio Codeでデバッグするときに必要になりました。
/etc/php/7.0/mods-available/xdebug.ini

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.idekey="netbeans-xdebug"

これで、上述のhttp://localhost/~hoge/にアクセスしてphpinfo()の結果を見ます。xdebugのremote_eanbleがOnになっていればOKです。

もし、Onになっていなければ、/etc/php/7.0/apache2/conf.d/20-xdebug.iniがあるかどうか確認してください。20-xdebug.iniは/etc/php/7.0/mods-available/xdebug.iniのシンボリックリンクになっているはずです。Apache2が設定を読み込んだ場合、phpinfo()のAdditional .ini files parsedという欄に20-xdebug.iniを読んだことが表示されています。

NetBeansでデバッグできることを確認

NetBeansを起動して、ホームディレクトリのpublic_html内にテストプロジェクトを作ります。ソースコードには、phpinfo();を入れます。ブレークポイントを設定して、デバッグを開始。ブレークできれば成功です。

phpinfo()で、xdebugのremote_enableがOnになっていれば、たぶん何も設定しなくても動くと思います。

Visual Studio Codeをインストール

せっかくなので、Visual Studio Codeをインストールしてみます。

code_1.4.0-1470329130_amd64.debをダウンロードして、Gnome ファイルから右クリックして「ソフトウェアのインストールで開く」でインストールしました。

Visual Studio技術情報にある、Visual Studio Code Preview ファースト ステップ ガイド (PDF: 5.9 MB)をダウンロードしてみると、インストールや簡単な使い方が載っています。日本語で読めます。

Ubuntuの場合、ターミナルでcodeと打つと起動します。

PHPのextensionをインストールします。左側のビューバーの上から5番目にある拡張機能を選択。ボックスにPHPを打ち込んでextensionを検索します。

PHP DebugとPHP,Perl,Asm,Bash Code Formatをインストールしました。コードのフォーマッタは、PHP Code Formatもあるのですが、PHPのファイルで?>で閉じるとタブがスペースに変換されなかったり、8カラムになったり不具合がありました。PHP Debugのほうが、xdebugを使うのに重要です。

あとは、コードの中にブレークポイントを設定して、左のビューバーの4番目のデバッグのモードに切り替えます。左上のStart Debuggingという緑色のボタンを押してからブラウザでファイルをアクセスしてみるとブレークします。NetBeansと違って手動でサイトにアクセスしないと勝手にデバッグが始まらないです。エディターと統合環境の違いかなと思います。

もし動かないときは、phpinfo()のxdebugの欄でremote_enableがOnになっていること、remote_autostartがOnになっていることを確認しましょう。

実際にVisual Studio Codeでデバッグしてみましたが、1度フリーズした他は快適に使えました。ソースコードのオートフォーマットなどはNetBeansの方が細かく設定できていいですけれど、高機能なエディタと思えば、デバッグもできるしいいかなと思いました。

ただ、Intellisenseは動いているのですが、よい候補があまり出てこなくてコード補完はあまり使えませんでした。ちょっと残念。

Linuxカーネルのアトミック操作

Linuxカーネル内のアトミック操作には、atomic_readとか、atomic_incといった関数があります。この場合の、アトミックというのは、スレッドが複数あったときに、メモリから変数を読んで、増やして、書き込むまで同時に増やそうとしないということを言います。
typdef struct {volatile int counter;} atomic_t;
というタイプが宣言されていて、atomic_read(v)とすると、(v)->counterが読まれます。counterは、volatileですのでgccが最適化せずにちゃんとメモリ上の値を読んで来ます。
また、atomic_incは、

static inline void atomic_inc(atomic_t *v)
{
__asm__ __volatile__ (
LOCK "incl %0"
:"=m" (v->counter)
: "m" (v->counter));
}

のようになっていて、LOCKプレフィックスが付いているので、数を1増やすのがアトミックに出来るようになっています。
LOCKは、"lock; "に定義されています。
また、BUG_ON(condition)というマクロがあって、conditionが成立した時、エラーメッセージを出しpanicします。
これだけわかると、

static inline struct dentry *dget(struct dentry *dentry)
{
if (dentry) {
BUG_ON(!atomic_read(&dentry->d_count));
atomic_inc(&dentry->d_count);
}
return dentry;
}

は、dentry->d_countが0だったらエラーメッセージを出し、アトミックに参照カウントを増やしてそのままdentryを返す関数であることがわかります。
このくらいだったらわかるのですけどね。
Linuxのソースコードを読むって、EmacsだとM-x cdでディレクトリを変えて、M-x grep-findで片っ端から検索していくことになります。どこに何があるのかを知らないと始まらないのでしょうがないですけど。
ちなみに、コマンドラインでは、
find . |xargs grep hogehoge
というのを、よく使います。

Lions' Commentary on UNIX 読み終わって

UNIXって、シンプルなコードでかかれてあるんだなと思った。それなりには複雑だけど。
コードを完璧に理解してコメントがしてあるのを随所に感じて、すごいなって思った。コメントが無ければ理解できないと思う。
ハードウェアに関することはわからなかったけど、それ以外のところはなんか理解できた気がしてる。大雑把だけど、よかったと思う。
C言語は、古い形式だし問題もあると思うけどね。
Linuxもこんな感じに読めたらなあ。

Lions' Commentary on UNIX iノード

iノードって何かなと思っていたのですけど、ファイルの属性とかの情報が入るデバイスのブロック#1がスーパーブロックで、その次の#2から#(N-1)にiノードテーブルという名で保存してあるのだそうです。
それとは別に、ディレクトリファイルというファイル名とiノード番号を対応づけるファイルが存在しています。ユーザーがファイルを開けと命令すると、まず、iノード番号を見つけ出して、その次にiノードテーブルを見つけて操作を開始するのだそうです。
Linuxのext2ファイルシステムは、どんな風になっているのだろうと思った。

Lions' Commentary on UNIX プロセス管理

これから3回ほど、Lions本について書きます。
シェルが自分自身をコピーして新しいプロセスを生成するということが書いてあるのを時々見かけるけれど、なぜかということがやっとわかった気がした。
プロセスを表す構造体にエントリーが確保されていることがプロセスが存在していることの証明になっているということなんだ。だから、新しいエントリーを作るときにコピーするんですね。
ということは、カーネルのプロセスとは全く別の構造体で定義されたユーザープロセスを生成するOSというのも可能なのか。KISSの法則には反するけれど。
生成するたびに違う構造のプロセスを生成していたら、管理できなくなっちゃうよねとか思った。

CygwinでのGLOBALのコンパイル

Cygwinで、GNU GLOBALを作ったのですが、cannot make GPATHとかエラーが出て、うまく動きません。
メーリングリストに、config.hのpreadとpwriteをコメントにするとうまく動くという記事をみつけて、そのようにしたらうまく動きました。
ひげぽんさんの所を参考に、Meadowで使ってみたのですが、
active_timers 703 /cygdrive/c/msys/1.0/home/kazu/qemu/vl.c pt =
active_timers 727 /cygdrive/c/msys/1.0/home/kazu/qemu/vl.c pt =
active_timers 744 /cygdrive/c/msys/1.0/home/kazu/qemu/vl.c for(t =
こんな感じで、探したい単語と、ファイル名は出るのですが、ファイルの内容の右側が切れてしまいます。これは、Meadowを広げれば何とかなりますけど。
ついでに、LinuxのソースコードをHTMLにしてみました。でも、task_structが見つけられなかった。
ソースコードを読むことを考えると、まだM-x grep-findがいいのかなと思います。GLOBALがもう少し洗練されるといいのですけど。たとえば、i386のコードのみが検索されるとかね。
LXRとかだったら大丈夫なのかな。