formのvalidationを無効にする
Formのcreate()で 'novalidate'=> trueを指定せよ。
echo $this->Form->create('Partner', array('action' => 'search', 'novalidate' => true));
cakephp search plugin とご丁寧にvaludationまでしてくれて、
必須項目があるばあい、それを入力しないと検索してくれない。
そこで検索を数十回重ねた後、たどり着いたのが、
http://stackoverflow.com/questions/15505287/cakephp-2-3-1-deactivate-form-validation-in-certain-views
ありがとう。
Leverano Leverano イタリア フィレンチェの紳士服仕立て職人
Leverano Leverano イタリア フィレンチェの紳士服仕立て職人
毎日8amから7pmで、
自分を犠牲したぶんだけいいものが提供できる。
自分の仕事に満足したことはない、いつも
こうやればもうちょっと良かったんではないかとか思う。
若い奴には、ただ仕事だけを盗んで欲しくない、そこにあるなにか宝を探して欲しい。
僕はただ、服をつくっているんじゃない
文化をつくっているんだ。
引用from another sky.
rc init.d で自動起動
自動起動は
/etc/init.d/に自動起動したいスクリプトを置くことでできる。
/etc/rc0.d/の下に/etc/init.dへのシンボルリンクを貼ることで
ランレベルごとの起動を制御できる。
シンボルリンクは
S + 二桁の数字 + ファイル名 みたいなかんじで
httpdの場合は
S85httpd
Sはサービス
KはKill(停止したい)サービス
のようにする。
85は起動順の制御に使われる。低い数字から順に実行されてく。
例として
sampledamonを作ってみる体で話す。
まずsampledamonをつくる。
startとかstopとかの引数は必須か?
/etc/init.d/
に配置
これだけではsampledamonは起動されない。
明示的にどのランレベルで実行するか指定して初めて動く
rc2.dとrc5.dで走らそうか。
それぞれにシンボルリンクをつくる。
ランレベルのまとめ
distributionのよって少し違うがこんな感じ。wikiによくまとめられている。(http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%AC%E3%83%99%E3%83%AB)
UNIX System V Releases 3 および 4
0 - シャットダウンを実行。ハードウェアがサポートしている場合、そのまま電源を切る。コンソールからのみ実行可能。
1 - シングルユーザーモード。root 以外のファイルシステムはマウントされない(既にマウントされていたらアンマウント)。コンソールプロセス以外のプロセスを終了させる。
2 - マルチユーザーモード
3 - マルチユーザーモード + RFS(Release 4 では NFS も)のファイルシステムをエクスポート
4 - マルチユーザー、ユーザー定義
5 - オペレーティングシステムを停止し、ファームウェアへ移行
6 - システムを停止し、デフォールトのランレベルを再起動
s, S - 1 と同じだが、現在の端末がコンソールとなる。
rcSってなに?
Debian系だと
rcSはinitスクリプト(ブート終了後最初に起動されるスクリプト)が起動されて、最初に/etc/init.d/rcSが実行される。
rcSは/etc/rcS.dにはいってるスクリプトをすべて起動する。
そのあと/etc/inittabでランレベルが指定されているのでそれを見て
ランレベルを決定それに、対応するrc?.dのスクリプトをすべて起動。
という順だ。ただubuntuで/etc/inittabがなかったので、何が同じ用途に使われているのだろう?
=>/etc/event.d/rc-defaultが使われます。いや、ごめん。これもなかった。Ubuntuのinit以降の起動シーケンス(図入り) – upstart /etc/event.d/ initctl(http://wps.watanet.mydns.jp/2009/06/27/ubuntu%E3%81%AEinit%E4%BB%A5%E9%99%8D%E3%81%AE%E8%B5%B7%E5%8B%95%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E5%9B%B3%E5%85%A5%E3%82%8A-upstart-etcevent-d-initctl)
をよませていただきたい。
ということで、まず、rcS.d ほんで、rc?.dという順なんですね。
大変よくわかりました。
参考:http://greenonions.blog5.fc2.com/blog-entry-25.html
ちなみにランレベルは
$ runlevel N 2
っていうコマンドでわかります。
ディフォルトのランレベルは2です。
Nは変更前のランレベルで、NはNoneかな、まだ一回も変更されてないのがわかる。
rc.localってなに?
参考にしたのは、
http://www.atmarkit.co.jp/ait/articles/0206/04/news001.html
init.dとinitって違う?
他にも
Ubuntu Server における/etc/initと/etc/init.dの違いとserviceコマンドの関係 はSys VとUpstartっていう流儀の違いを吸収するためのserviceコマンドってことがわっかって良かった。
Xdebug動かね。だから、ポートつかってるプログラムを特定したい。
僕は、二時間ちかくはまりました。
しこたま生産性に欠けたなと反省しつつも、今回の時間を無駄にしないよに反省も込めてまとめます。
ハマった点。
Cakephp + Xdebug on eclipseでデバックボタン(eclipseの虫の奴)押しても反応しない!!
エラーもなにも表示されない。ブラウザすら起動されない。とにかく何もでてない。
普通にブラウザから起動すればちゃんとアプリは起動、動作する。
昨日はちゃんと動いていた。
とりあえずやったこと、
eclipse --clean
breakpoints 全クリア
lampp,browser,PC再起動
次にやったこと、
eclipseのproblemsタブをみるとjavascript系のエラーがいっぱい
でてるなー、これをProperties->Javascript->Source tab, Include Pathでexcludeしてエラーをでないように。
Preference->General->Web Browserの設定
Preference->PHP->Debugらへんの設定をなんどもチェック、php.ini, http_conf等々を少し変え実行のtry and errorを繰り返す。
全然ダメ。
解決の兆しが見えてきた瞬間。
ダメ元で、Zend_debuggerをPreference->PHP->Debug指定して実行。
すると、
ブラウザが起動し、なにやらapplicationが立ち上がっている。
よくわかってないが、urlでいろんな引数を指定している。
当然zend_debuggerは設定してないので、breakpointsでは止まらない。
次に、Xdebugに戻して、portを9000から適当にあ9010とかにして虫ボタンを
おすと、
お、
ブラウザが立ち上がった。
当然、Xdebugは9010では立ててないので、breakpointsでは止まらない。
ただ、もうおそらく9000のポート コンフリクトで動かなっかった!?
っていう一つの推測ができた。
悩んでる時に推測が出てくるときは、良いこと。推測をすべて試して、だめで新しい推測が生まれるまでの時間が大変なんだよね。
て、php.iniにもどって9010にしたら、
タラーーン
デバッグ機能 再開!!
んで、誰がポート9000使っているのか、調べたくなった。
ポートからプログラムを見るには、netstatが使える。
出力結果は一部割愛してるが、下のような結果が出された。
netstatのオプションはmanでも見て欲しいが、こんな感じ
- n 数字でIP見せてね
- l はlistenしてるポートだけよ
- a はlistenもnon-listenも見せてね。
- p プログラムも見せてね
最後に-pで一番右側に ポート番号/名前(e.g. 1980/java) みたいな感じで出力される
netstat -nap | grep 90 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:37661 127.0.0.1:9010 ESTABLISHED - tcp6 0 0 :::9010 :::* LISTEN 1980/java tcp6 0 0 127.0.0.1:9010 127.0.0.1:37661 ESTABLISHED 1980/java unix 3 [ ] STREAM CONNECTED 13366 1790/geoclue-master unix 3 [ ] STREAM CONNECTED 13362 1790/geoclue-master unix 3 [ ] STREAM CONNECTED 8690 -
ここで僕にわかるのは
Xdebugを9010で起動するよにしたからっていう事実から
tcp6 0 0 :::9010 :::* LI
こいつがXdebugでぇ、ただ 1980/javaっていう 荒い情報しかわかんない。
ここで、プロセスからプログラムを特定する方法を調べた。これです。
http://okwave.jp/qa/q7027494.htmlを参考にさせていただきました。
quote "あと、PIDが特定できていると言うことであれば、
cat /proc/プロセス番号/cmdline とか、
ls -l /proc/プロセス番号/fd とか。"
cat /proc/1980/cmdline
9000を表示している
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LI
こいつ誰ー!?? プログラムも表示されてないし!!
それについて、検索したら
Weird port 9000 service, how do I find out what it is? で
udo netstat -tlnp って実行してて、この場合、僕の環境でも
sudo netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1114/php-fpm.conf)
ってでてきて、1114のPIDで php-fpm.confっていうプログラムっていうことが、判明しました。
そのあと、lsof | grep "9000 (LISTEN)"ってやれば、って書いてあるだけど、僕の場合は何も出力されませんでした。
ちなみに、sudoでなくて、上のコマンド叩くと、
netstat -tlnp (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN -
って出力で、プログラム名が表示されないんです。
これ結構大事で、実行したユーザーで起動されているプログラム名しか表示されないんです。unix系ってことを再認識する挙動ですね。
最後に、
さっき習ったやり方で、プロセスの詳細を見てみる。
といっても、javaとかいう総称ではなくphp^fpmなんちゃらって結構単体レベルの名前なんで、あんまり見なくてもいいですが、
~$cat /proc/1114/cmdline php-fpm: master process (/etc/php5/fpm/php-fpm.conf) ~$ ls -l /proc/1114/fd ls: cannot open directory /proc/1114/fd: Permission denied makoto@ubuntu:~$ sudo ls -l /proc/1114/fd total 0 lrwx------ 1 root root 64 5月 4 12:02 0 -> /dev/null lrwx------ 1 root root 64 5月 4 12:02 1 -> /dev/null l-wx------ 1 root root 64 5月 4 12:02 2 -> /var/log/php5-fpm.log l-wx------ 1 root root 64 5月 4 12:02 3 -> /var/log/php5-fpm.log lrwx------ 1 root root 64 5月 4 12:02 4 -> socket:[10824] lrwx------ 1 root root 64 5月 4 12:02 5 -> socket:[10825] lrwx------ 1 root root 64 5月 4 12:02 6 -> socket:[10826] lrwx------ 1 root root 64 5月 4 12:02 7 -> anon_inode:[eventpoll]
ってな感じで
php-fpm.confというコンフがなにやらポートを使ってリッスンしてるようです。
ちょっと気になったので、
php-fpm.confを調べてみると(http://php-fpm.org/wiki/Configuration_File
とhttp://php.net/manual/ja/install.fpm.configuration.php)
fpmはFastCGI Process Managerという略で、なにやら
複数プロセスをプールで管理するときに、このポートつかって別々の設定を持たすことが、出来、そのためのポートなのです。
てなことがわかりました。
長いこと時間かけましたが、わからないことがなくなるまで調べると
こんかもんですかね。
以上です。
Fatal error: php.h no such a file or directoryでコンパイルエラ
よくある話。
sourceからコンパイルしたい。
source.tar.gz解凍、./configure
make
生成される。どこかわからないときは、find ./ -name "*.so"とかで探そう。./.libsとかに吐かれること多し。
問題は、ヘッダがないよ、とコンパイルエラがでること。
今回はphp.hがないっつって、エラー出たので、その例で話す。
やることは、
エラー対象のヘッダがprefixで指定されるincludeにあるか?
なければ、それ探してインストールする。php.hの場合は、apt-get install php5-devする。
udo find / -name php.h /usr/include/php5/main/php.h
これでも、makeしたら、エラーでる。
多分、prefixは何も指定してないので、/usr/include直下しかみてくれない。
解決策
まず、./configure --help=shortでオプション確認
./configure --help=short Optional Features and Packages: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-libdir=NAME Look for libraries in .../NAME rather than .../lib --with-php-config=PATH Path to php-config php-config --enable-xdebug Enable Xdebug support --enable-shared=PKGS build shared libraries default=yes --enable-static=PKGS build static libraries default=yes --enable-fast-install=PKGS optimize for fast installation default=yes --with-gnu-ld assume the C compiler uses GNU ld default=no --disable-libtool-lock avoid locking (might break parallel builds) --with-pic try to use only PIC/non-PIC objects default=use both --with-tags=TAGS include additional configurations automatic Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider.
手な感じで確認できる。
includeなので、CPPFLAGSあたりがつけそうだ。
ってことで.
CCPFLAG=-I/usr/include/php5/main/ ./configure --enable-xdebug
としてみた
んで、make
おおお^^^、できたできた。