formのvalidationを無効にする

http://stackoverflow.com/questions/15505287/cakephp-2-3-1-deactivate-form-validation-in-certain-views

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

おおお^^^、できたできた。