hatotech::kumatch: PHP String_Random 0.3.1

一部の人にだけ大好評な PHP 版 String_Random が約一年ぶりに Ver.UP!

地味に便利でうれしい!

もはやPHPerはmkpasswdのためだけににexpectなんて入れてる場合じゃないね!(嘘)

colinux:~% sudo pear install http://hatotech.org/kumatch/datas/String_Random-0.3.1.tgz
colinux:~% php -r 'include "String/Random.php"; echo String_Random::getRandRegex("[a-zA-Z0-9]{5,8}")."\n";'
IcxP20CZ

pear-not-found.png

日本のPHPライブラリ界の発展を著しく阻害していた(日本語でPEARとググるといつもブッチギリだった)あの忌々しいサイトがヘイサ!

PHPどうやって開発してる?という基本的な問題を今更悩み、一通り使ってみて一段落したので大まかにまとめてみた。

Type A  開発環境:秀丸(PHPエディタもしくは同等のフリーのエディタ)  テスト環境:Windows

Type B  開発環境:Eclipse(もしくはZendStudio)  テスト環境:Windows

Type C  開発環境:vi(vim, nvi, elvis)  テスト環境:UNIX

Type D  開発環境:emacs php-mode  テスト環境:UNIX

Type Aはたぶん一番人口が多い。既に慣れたエディタがある人も多い。ローカルのApacheは使わず、テスト用のUNIX系サーバに上げて確認も多い。 Type Bは進化に期待。CVS/SVNとのシームレスな連携やステップ毎に実行できるデバッグ機能などが超でかい。 Type Cはシンプルな構成のためか、上級者に使用者多し。今日びのvimは機能がスゴイ。 Type Dは古いユーザーに多い。既存emacsユーザーはこれしか選択肢無し。

初学者はType Aがおすすめ。Java/MSの人はType Bがおすすめ。すでにUNIXに慣れてる人はType C、Emacsの人はType Dという感じです。 Windows系のエディタを使ってUNIX上で楽に確認したい場合はcoLinux + sambaが手軽でした。

これ以外でひそかに超便利な環境でやってるぜって人は教えてください!

php-modeの続き。

php-mode-pearに関してコメントを貰ったんですが、スパム削除の際に間違って消しちゃったかも。 頑張ってもう少しphp-mode.elを見てみると、

  ;; PEAR coding standards
  (make-local-hook 'php-mode-pear-hook)
  (add-hook 'php-mode-pear-hook
            (lambda nil (set (make-local-variable 'tab-width) 4)) nil t)
  (add-hook 'php-mode-pear-hook
            (lambda nil (set (make-local-variable 'c-basic-offset) 4)) nil t)
  (add-hook 'php-mode-pear-hook
            (lambda nil (set (make-local-variable 'c-hanging-comment-ender-p) nil)) nil t)
  (add-hook 'php-mode-pear-hook
            (lambda nil (set (make-local-variable 'indent-tabs-mode) nil)) nil t)
  (add-hook 'php-mode-pear-hook
            (lambda nil (c-set-offset 'block-open' - )) nil t)
  (add-hook 'php-mode-pear-hook
            (lambda nil (c-set-offset 'block-close' 0 )) nil t)

タブ幅4でスペース4個?他はよくわからん・・・・。

.emacsにこんな感で常にPEARモードに。

(custom-set-variables '(php-mode-force-pear t))

久しぶりにPEARマニュアルをチェックしてみるとコーディング標準についてemacs用の設定まで書いてありました。

PEAR :: Manual :: 標準コーディング規約

インデント

空白 4 つのインデントを使用します。タブは使いません。 PEAR コードの編集に Emacs を使用する場合、indent-tabs-mode を nil に設定する必要があります。以下に、これらのガイドラインに基づき Emacs を設定するモードフックの例を示します(PHP ファイルを編集する際に これがコールされるようにする必要があります)。

(defun php-mode-hook ()
  (setq tab-width 4
        c-basic-offset 4
        c-hanging-comment-ender-p nil
    indent-tabs-mode
    (not
     (and (string-match "/\\(PEAR\\|pear\\)/" (buffer-file-name))
          (string-match "\.php$" (buffer-file-name))))))

俺もスペース派になろうかな?

wgetの話で気になる点が。

p0t: wgetの本当の良さ

この1年くらいはGETを使うことが多いです

$ GET http://go-pear.org/ | php -Cq

みたいな. ヘッダーとか見たり弄ったりもできます(wgetでもできるけど

投稿者 ELF : 2005年12月23日 02:46

Fedora Core(&Red Hat&CentOS)だと perl-libwww-perl ってのに入ってるみたいです > GET SSL使えないけど

投稿者 ELF : 2006年01月02日 10:20

GET!? 単にGETだと検索で見つけ辛いですがこの話でわかりました!

komagata@colinux:~$ apt-cache show libwww-perl
Package: libwww-perl
Priority: optional
Section: perl
Installed-Size: 984
Maintainer: Jay Bonci <jaybonci@debian.org>
Architecture: all
Version: 5.803-4
Depends: perl (>= 5.6.0-16), libnet-perl (>= 1:1.09) | perl (>= 5.8.1), libdigest-md5-perl, libmime-base64-perl (>= 2.1) | perl (>= 5.8), liburi-perl (>= 1.10), libhtml-parser-perl (>= 3.33), libhtml-tree-perl (>= 3.11)
Recommends: libmailtools-perl, libhtml-format-perl, libcompress-zlib-perl
Suggests: libio-socket-ssl-perl (>= 0.81-2)
Filename: pool/main/libw/libwww-perl/libwww-perl_5.803-4_all.deb
Size: 358498
MD5sum: 0f326bde0be84e234e9eb312e6a87400
Description: WWW client/server library for Perl (aka LWP)
 Libwww-perl is a collection of Perl modules which provides a simple
 and consistent programming interface (API) to the World-Wide Web.  The
 main focus of the library is to provide classes and functions that
 allow you to write WWW clients, thus libwww-perl said to be a WWW
 client library. The library also contain modules that are of more
 general use, as well as a simple HTTP/1.1-compatible server
 implementation.
Tag: devel::library, langdevel::perl, made-of::lang:perl, protocol::http, role::sw:shlib

Debian etchだとlibwww-perlつーかLWPに入ってるみたいです。

komagata@colinux:~$ ll /usr/bin/GET
lrwxr-xr-x  1 root root 11 2006-01-02 17:43 /usr/bin/GET -> lwp-request

GETはlwp-requestのシンボリックリンクかよ!

komagata@colinux:~$ ll /usr/bin/POST
lrwxr-xr-x  1 root root 11 2006-01-02 17:43 /usr/bin/POST -> lwp-request
komagata@colinux:~$ ll /usr/bin/HEAD
lrwxr-xr-x  1 root root 11 2006-01-02 17:43 /usr/bin/HEAD -> lwp-request

ついでにPOSTもHEADもあるみたいです。

komagata@colinux:~$ GET http://p0t.jp/google.php/PHP
レッツPHP!       http://php.s3.to/
PHP研究所 PHP INTERFACE   http://www.php.co.jp/
phpspot - PHPスクリプト/MySQL/掲示板/入門/サンプル/正規表現   http://phpspot.net/php/
PHP-J.com        http://www.php-j.com/
PHP: Hypertext Preprocessor (in Japanese)        http://www.geocities.jp/rui_hirokawa/php/
PHP SAMPLES &amp; TIPS   http://www.spencernetwork.org/
PHP: Hypertext Preprocessor      http://jp2.php.net/
komagata@colinux:~$ HEAD http://p0t.jp/google.php/PHP
200 OK
Connection: close
Date: Mon, 02 Jan 2006 09:05:59 GMT
Server: Apache/1.3.34 (Unix)
Content-Type: text/plain
Client-Date: Mon, 02 Jan 2006 09:06:06 GMT
Client-Peer: 59.106.13.181:80
Client-Response-Num: 1
X-Powered-By: PHP/4.3.10

使い易っ!!! GETやPOSTの一番簡単な方法かもしれない。GETしたらデフォルトはwgetみたいにファイルに保存じゃないでしょ!やっぱ標準出力でしょ!

emacsでのPHP開発についてgoogleではかなり情報が少なくて苦戦したのでメモ。

sudo apt-get install php-elisp

何よりPHPの関数補完が気になってたんですが、

php-mode-not-yet.png

not implemented yetかよ。

$ apt-cache show php-elisp
Package: php-elisp
Priority: optional
Section: text
Installed-Size: 144
Maintainer: Pontus Ullgren <pontus@ullgren.com>
Architecture: all
Version: 1.1.0-2
Depends: emacs21 | xemacs21 | emacsen
Suggests: php4 | php3
Filename: pool/main/p/php-elisp/php-elisp_1.1.0-2_all.deb
Size: 17644
MD5sum: 5f8372578d2bb63e5ad16b61310ddc3a
Description: Emacs support for php files
 Emacs major mode for php supporting syntax highlighting, indentation
 and good integration with html-statements.

sargeのphp-mode(php-elisp)はVersion1.1.0らしいので、SourceForgeで最新版を見に行ってみると1.2.0が出てました。しかもRelease Notesが、

Changes: Implemented php-show-arglist, C-. (Engelke Eschner) Implemented php-complete-function, M-tab (Engelke Eschner) Re-enabled # comment detection in GNU Emacs (Urban M?ller) Fixed some keybindings and default settings (Engelke Eschner)

ちょうどこのバージョンから関数補完ができるようになっているようです。 /usr/local/share/emacs/site-lisp/php-mode-120.elとして置いてM-x byte-compile-file。 PHPのHTMLマニュアルを取ってきて/usr/local/share/php/doc辺りに解凍。それを見て補完するらしいので.emacsにパスを設定。

;; php
(load-library "php-mode-120")
(require 'php-mode)
(add-hook 'php-mode-user-hook
            '(lambda ()
             (setq php-manual-path "/usr/local/share/php/doc")))

補完できたー!

中身を見てみるとたまらない変数とかあります。

(defcustom php-mode-force-pear nil
  "Normally PEAR coding rules are enforced only when the filename contains \"PEAR\"\
Turning this on will force PEAR rules on all PHP files." 
  :type 'boolean
  :group 'php)

PEARのコーディング規約守れちゃうのかよ。

  (if (or php-mode-force-pear
          (and (stringp buffer-file-name)
               (string-match "PEAR\\|pear" 
                             (buffer-file-name))
               (string-match "\\.php$" (buffer-file-name))))
      (run-hooks 'php-mode-pear-hook))

設定してなくてもpearフォルダ以下のphpファイルは自動的に? これ以上はlispがわからん。

PHPサイバーテロの技法―攻撃と防御の実際

“PHP サイバーテロの技法”買ったっ!とてもためんなります。 今までScript InsertionというやつのことをXSSだと思ってたな、とか勉強になりつつ風呂で読んでたんですが、CSRFのところでこう書いてある。

ここではもっとも簡単な対策を施します。いわゆる「リファラーチェック法」です。

(中略)

このリファラーチェック法に対する批判は2つあります。1つは「リファラーは偽装可能である」というものです。ただ、この批判は的はずれです。よく考えればわかると思いますが、CSRFは権限保持者自身が踏むものです。偽装する理由がありません。また、リファラーを第三者が書き換えることもできませんので、チェックとしては十分、有効に機能します。もう一つの批判は、リファラーを送出しないブラウザでは、正常な操作も行えない、というものですが、これは当たっています。現実に、リファラーを送出しないことで守られる個人情報(具体的には検索エンジンへの検索文字列等)も確実にありますので、あえてリファラーを切っている人も少なくないでしょう。それを補う方法については、066ページで解説します。

わざわざサンプルまで作ってみた身としては見逃せない!リファラーチェック法なんかより以前検証した高木センセのセッションIDを渡す方法の方がいいんじゃないんだろうか。この066ページというのもPOST利用法やパラメータを全部セッション渡しする方法やワンタイムトークンが紹介されているだけだった。

ググッてみたけどこの本にそういう指摘が無いからもしやおれの理解が間違ってる?

PHP サイバーテロの技法 CSRF - Google 検索

ref: CSRF対策俺ルール2 ref: クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法

最近思ったんですが、Webサービスもshell上でパイプとかで繋げられたら楽なのに。 入力は標準入力とPATH_INFOをパラメータとして出力はtext/plainの行指向テキストでいいじゃないか。

理想としてはこんな風にできたら素敵だ。

$ export LANG=/bin:/usr/bin:http://foo.com
$ cat foo | foo.php | grep -v php

個々のコマンド(というかWebサービス)は作るのは簡単そうだがそもそもshellがHTTP経由でPATHを探しに行くようにはなってない。けどもしかしたらそういうshellはあるのかもしれない。

JavaScriptとかでもこんな感じで同じWebサービスをパイプで繋げて書けたら楽だ。(パラメータはスペース区切りの変わりにPATH_INFOで””/”“区切り)

result = shell("http://foo.com/foo.php | http://foo.com/grep.php/var")

試しに文字を第1パラメータに取ってgoogleの検索結果を行区切りplain textで出すものを作ってみた。

””PHP”“で検索した結果。 http://p0t.jp/google.php/PHP

レッツ<b>PHP</b>!    http://php.s3.to/
<b>PHP</b>研究所 <b>PHP</b> INTERFACE    http://www.php.co.jp/
phpspot - <b>PHP</b>スクリプト/MySQL/掲示板/入門/サンプル/正規表現 <b>...</b>    http://phpspot.net/php/
<b>PHP</b>-J.com    http://www.php-j.com/
birding.com forums: Penis Enlargement Device that actually works !    http://www.birding.com/forums/showflat.php?Number=1985
birding.com forums: Buy Generic Phentermine &amp; Adipex Online    http://www.birding.com/forums/showflat.php?Number=1960
<b>PHP: Hypertext Preprocessor</b> (in Japanese)    http://www.geocities.jp/rui_hirokawa/php/
<b>PHP</b> SAMPLES &amp; TIPS    http://www.spencernetwork.org/
DokiDoki <b>PHP</b>    http://dokidoki.lantecweb.net/
<b>PHP: Hypertext Preprocessor</b>    http://jp2.php.net/

こういうplain text見るとshell scriptとかに渡したくならないですか?(異常者)

Chris Shiflett: Zend Framework Webcast

The core focus of the framework is Extreme Simplicity. In order to achieve this, it must be very easy to use. This doesn’t just mean that it must be simple to write code – it also needs to be useful in existing PHP environments without the need for external libraries or custom modifications. In many cases, this means that features must be implemented in pure PHP, so that they’re available everywhere. For example, the search component is a pure PHP implementation of Lucene, and the front controller doesn’t rely on a sophisticated collection of mod_rewrite rules.

Zend Frameworkの内容が発表。すごいシンプルでかなり素性が良さそう! mod_rewriteに頼らないURIマッピングとかControllerには依存しない色んなComponentとか驚くべき新機能!って感じじゃないけど正直好感が持てる!PHPで実装されたLuceneは日本語平気なのかとか興味は尽きません。

blog.xole.net : script language="php"

だって、PHPならこんな風に書けるんですよ?

な、なんだtt(略

クライアントサイドスクリプトみたいに見える!いっそブラウザにPHPのエンジン積んでくれよ!