ありがたい仕事
武蔵流プログラマへの道 - httpsで提供されているフィードをとりこむそこでhttpsのRSSを読み込んでhttpにして返すスクリプトを書こうと思ったのですが、もっと手軽にやる方法を思いついてふとチャレンジしてみたらあっさりできました。
gjすぎ!
武蔵流プログラマへの道 - httpsで提供されているフィードをとりこむそこでhttpsのRSSを読み込んでhttpにして返すスクリプトを書こうと思ったのですが、もっと手軽にやる方法を思いついてふとチャレンジしてみたらあっさりできました。
gjすぎ!
PHP: htmlspecialchars_decode - Manualhtmlspecialchars_decode
(PHP 5 >= 5.1.0RC1)
htmlspecialchars_decode -- 特殊な HTML エンティティを文字に戻す
全米の↓この関数の持ち主が泣いた。。。
function unhtmlspecialchars($str) {
$entry = array_flip(get_html_translation_table(HTML_SPECIALCHARS));
return strtr($str, $entry);
}
PRADOバージョン3.0aリリース - HotPHPPER NewsPHP 5専用のフレームワークであるPRADOのバージョン3.0aがリリースされました。
日本ではmojaviや最近ではsymfonyが有名ですが、PRADOも一部では期待されているフレームワークです。
PHP Pro Podcastに作者が出てましたが、JSFみたいなイベントドリブンのフレームワークってことで他とはかなり違いそうです。超面白そう。
あと作者は少し落ち着け。(噛み過ぎ)
PHPの “そんなのあるんだったらはじめに教えといてくれよ!” シリーズ
PEAR Pager。
ページング処理(↓こういうやつ)をやってくれるライブラリ。
Mojavi2で“user1とuser2だけに見せたいページ”みたいな認証の仕方ができないかと聞かれました。
デフォルトのPrivilegeAuthorizationHandlerだとできないようなのでこんな感じで複数権限一度に指定できるPrivilegesAuthorizationHandlerを作ってみました。(sが付いている)
class FooAction extend Action {
function getPrivilege(&$controller, &$request, &$user) {
return array(
array("user1", "members"),
array("user2", "members")
);
}
}
PrivilegesAuthorizationHandler.class.php.gz
index.phpで元の奴の変わりに使う。
//require_once(AUTH_DIR . 'PrivilegeAuthorizationHandler.class.php');
require_once(AUTH_DIR . 'PrivilegesAuthorizationHandler.class.php');
require_once(USER_DIR . 'PrivilegeUser.class.php');
//$authHandler =& new PrivilegeAuthorizationHandler;
$authHandler =& new PrivilegesAuthorizationHandler;
$user =& new PrivilegeUser;
$controller->setAuthorizationHandler($authHandler);
$controller->setUser($user);
自分のPHP開発環境について。
ちまたでよく言うWcPE(Windows + coLinux + Putty + Emacs)というやつです。
・・・よく言わない上にウザいですか、そうですか。
Sooeyさんのとこを見てたら環境以外にも書いてアップして確認するみたいな開発のライフサイクルもわかると
参考になっていいなと思いました。
仕事時のライフサイクルはどんなのが普通なんだろう。おれは
て感じです。(おれもUnitテストとかしたい。Subversionに移行したい。)
ref: PHPどうやって開発してる?
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
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サイバーテロの技法―攻撃と防御の実際
- ソシム(2005-11)
- (著)GIJOE
- 定価:¥ 1,890
- 新品価格:¥ 1,890
- ASIN:4883374718
“PHP サイバーテロの技法”買ったっ!とてもためんなります。
今までScript InsertionというやつのことをXSSだと思ってたな、とか勉強になりつつ風呂で読んでたんですが、CSRFのところでこう書いてある。
ここではもっとも簡単な対策を施します。いわゆる「リファラーチェック法」です。(中略)
このリファラーチェック法に対する批判は2つあります。1つは「リファラーは偽装可能である」というものです。ただ、この批判は的はずれです。よく考えればわかると思いますが、CSRFは権限保持者自身が踏むものです。偽装する理由がありません。また、リファラーを第三者が書き換えることもできませんので、チェックとしては十分、有効に機能します。もう一つの批判は、リファラーを送出しないブラウザでは、正常な操作も行えない、というものですが、これは当たっています。現実に、リファラーを送出しないことで守られる個人情報(具体的には検索エンジンへの検索文字列等)も確実にありますので、あえてリファラーを切っている人も少なくないでしょう。それを補う方法については、066ページで解説します。
わざわざサンプルまで作ってみた身としては見逃せない!リファラーチェック法なんかより以前検証した高木センセのセッションIDを渡す方法の方がいいんじゃないんだろうか。この066ページというのもPOST利用法やパラメータを全部セッション渡しする方法やワンタイムトークンが紹介されているだけだった。
ググッてみたけどこの本にそういう指摘が無いからもしやおれの理解が間違ってる?
PHP サイバーテロの技法 CSRF - Google 検索
ref: CSRF対策俺ルール2
ref: クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法
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のエンジン積んでくれよ!
Raw Template Engine用のMojavi2 Renderer作りました。
やっつけ仕事用に使います。
<?php
//
// RawRenderer - Renderer for Raw Template Engine.
//
// Copyright (C) 2005 Masaki Komagata <komagata@p0t.jp>
// All rights reserved.
// This is free software with ABSOLUTELY NO WARRANTY.
//
// You can redistribute it and/or modify it under the terms of
// the PHP License, version 3.0.
//
require_once "Raw.php";
class RawRenderer extends Renderer {
function RawRenderer() {
parent::Renderer();
$this->engine =& new Raw;
}
function execute(&$controller, &$request, &$user) {
if ($this->template === null) {
trigger_error("A Raw template has not been specified", E_USER_ERROR);
}
$this->setAttributeByRef("controller", $controller);
$this->setAttributeByRef("mojavi", $controller->getMojavi());
$this->setAttributeByRef("request", $request);
$this->setAttributeByRef("user", $user);
if ($this->isPathAbsolute($this->template)) {
$dir = dirname($this->template)."/";
$this->template = basename($this->template);
} else {
$dir = ($this->dir === null) ? $controller->getModuleDir()."templates/" : $this->dir;
if (!is_readable($dir . $this->template) && is_readable(TEMPLATE_DIR . $this->template)) {
$dir = TEMPLATE_DIR;
}
}
if (is_readable($dir.$this->template)) {
$this->engine->template_dir = $dir;
if ($this->mode == RENDER_VAR || $controller->getRenderMode() == RENDER_VAR) {
$this->result = $this->engine->fetch($this->template);
} else {
$this->engine->display($this->template);
}
} else {
trigger_error("Template file $dir${this}->template does not exist or is not readable", E_USER_ERROR);
}
}
function &getAttribute;($name) {
$attribute =& $this->engine->template_vars[$name];
return $attribute;
}
function removeAttribute($name) {
unset($this->engine->template_vars[$name]);
}
function setArray($array) {
$this->engine->assign($array);
}
function setArrayByRef(&$array) {
$this->engine->assign_by_ref($array);
}
function setAttribute($name, $value) {
$this->engine->assign($name, $value);
}
function setAttributeByRef($name, &$value) {
$this->engine->assign_by_ref($name, $value);
}
}
?>
FooView_success.php(使い方):
<?php
require_once(BASE_DIR."opt/renderers/RawRenderer.class.php");
class IndexView extends View {
function &execute;(&$controller, &$request, &$user) {
$renderer = new RawRenderer();
$renderer->setTemplate("Index.php");
$renderer->setAttribute("message", $request->getAttribute("message"));
return $renderer;
}
}
?>
テンプレはRawと同じで。
デフォルトのRendererと違うところは、
デフォルトのRendererでその2点だけが気に入らなかったんですよね!
ref: Raw Template Engine
単純フレームワークAwesomeFrameworkを更新。
変更点
依存性を緩やかにするといってもDIではなく、ブルース・テイトが言っていた「Ruby などの言語では DI コンテナや AOP は必要ない」 のはなんでなんだろう?と思って考えてみました。
また見たほうが早いのでコード。
index.php(フレームワーク本体):
<?php
define("AF_DEFAULT_ACTION", "default");
define("VERSION", "0.8.1");
$vars = array();
$dependency = array();
include_once "dependency.php";
forward(isset($_REQUEST["a"]) ? $_REQUEST["a"] : AF_DEFAULT_ACTION);
function forward($action) {
extract($GLOBALS["dependency"]);
extract($GLOBALS["vars"]);
include "$action.php";
}
function fetch($action) {
ob_start();
forward($action);
$buffer = ob_get_contents();
ob_end_clean();
return $buffer;
}
function redirect($action) {
header("Location: index.php?a=$action");
}
function assign($name, $value) {
$GLOBALS["vars"][$name] = $value;
}
function assign_by_ref($name, &$value) {
$GLOBALS["vars"][$name] =& $value;
}
?>
dependency.php(設定ファイル):
<?php
include_once "SampleCalculator.php";
$dependency["Calculator"] = "SampleCalculator";
?>
SampleCalculator.php(ロジック):
<?php
class SampleCalculator {
function add($var1, $var2) {
return $var1 + $var2;
}
}
?>
default.php(アクション):
<?php
$calc = new $Calculator();
assign("result", $calc->add(1, 2));
forward("view");
?>
view.php(ビュー):
<html>
<head><title>Hello Calculator</title></head>
<body>
1 + 2 = <?=$result?>
</body>
</html>
依存性を排除するには動的型付け言語の場合、単に依存するクラス名を変数にして設定ファイルに出せばいいんじゃないだろうか?これだと制御は反転しないし、依存性は注入されない。だからDIコンテナは要らないってことなんじゃなかろうか。
Code InjectionでAOPにCode Generateでメタプログラミング?
これからはやっぱCode Replacementでしょ!!!
・・・トラブルの宝庫。
blog.xole.net : pregとevalでPHP6にする!(ネタはいらない。
また、(...)や[...]でarray(...)に置き換えとかやってみた。 ( via: kunitの日記 - [PHP] 配列の簡易書式 )
いろんな構文を単にpreg_replace()でeval()してるだけ!
うける。
設定ファイルとかに使えないかな?
俺もそこ問題だと思います。
http://forum.mojavi.org/index.php?showtopic=1119&hl;=e_user_notice自分ではここだけは2.0.3βから直して使ってますが、(略
とか言った手前、2.0.3bに対するパッチとパッチ当て済み2.0.3b2をアップしました。
*** mojavi.bk/opt/logging/ErrorLogger.class.php 2005-11-18 06:39:17.570000000 -0500
--- mojavi/opt/logging/ErrorLogger.class.php 2005-11-18 06:37:55.900000000 -0500
***************
*** 197,213 ****
switch ($level)
{
case E_USER_NOTICE:
$this->info($message, NULL, NULL, $file, $line);
break;
case E_USER_WARNING:
$this->warning($message, NULL, NULL, $file, $line);
break;
- case E_USER_ERROR:
default:
$this->fatal($message, NULL, NULL, $file, $line);
--- 197,216 ----
switch ($level)
{
+ case E_NOTICE:
case E_USER_NOTICE:
$this->info($message, NULL, NULL, $file, $line);
break;
+ case E_WARNING;
+ case E_CORE_WARNING:
+ case E_COMPILE_WARNING:
case E_USER_WARNING:
$this->warning($message, NULL, NULL, $file, $line);
break;
default:
$this->fatal($message, NULL, NULL, $file, $line);
PHPエンジニア向けキャリアアップセミナーと登録説明会 - HotPHPPER News株式会社デジタルスケープによりPHPエンジニア向けキャリアアップセミナー&登録説明会が開催されます。
これは無料で参加できるセミナーで、講師として株式会社アシアルの田中さんが講師を担当されるようです。
む、ちょっと興味が。
行ってきた人の話聞いてみたい。
クラスが出てこないフレームワーク、AwesomeFrameworkを更新しました。
変更点は
というより短いのでソースコードを見たほうが早いです。
index.php:(フレームワーク本体)
<?php
//
// AwesomeFramework - extremely simple framework.
//
// Copyright (C) 2005 Masaki Komagata <komagata@p0t.jp>
// All rights reserved.
// This is free software with ABSOLUTELY NO WARRANTY.
//
// You can redistribute it and/or modify it under the terms of
// the PHP License, version 3.0.
//
define("AF_DEFAULT_ACTION", "default");
define("VERSION", "0.7.0");
$vars = array();
forward(isset($_REQUEST["a"]) ? $_REQUEST["a"] : AF_DEFAULT_ACTION);
function forward($action) {
global $vars;
extract($vars);
unset($vars);
include "{$action}.php";
}
function fetch($action) {
ob_start();
forward($action);
$buffer = ob_get_contents();
ob_end_clean();
return $buffer;
}
function assign($name, $value) {
global $vars;
$vars[$name] = $value;
}
function assign_by_ref($name, &$value) {
$vars[$name] =& $value;
}
?>
default.php:(サンプルアプリ:Action)
<?php
assign("message", "World");
forward("view");
?>
view.php:(サンプルアプリ:View)
<html>
<head><title>Hello World</title></head>
<body>
Hello <?=$message?>.
</body>
</html>
自分でライブラリやツールを書いた時、「本当にAwesomeFrameworkより便利か?」と自問して余計に複雑な物を作らないための戒め的存在!
自分で最小限の物を書いてみないと本当にわかったかどうか実感が持てないので地味に修正して行きたいです。
lighttpd FastCGI は mod_perl Apache1.3 より1割ほど高速 :: Drk7jpPHP のインストール lighttpd で PHP を FastCGI として使う場合は、--enable-fastcgi オプションが必須。
lighttpdではFastCGIでPHP使えるんですね。
ちょっとやってみたい。
[php-study 125] php-studyの皆さんへの課題(仮)勝手な提案ですが、近いうちにPHPerのRSSをあつめた Planetシステムを公開するのでPHP界のアルファブロガーの方は 自分のブログのPHPカテゴリだけを抽出したRSSフィードを作って下さい。
カテゴリPHPのFeed、前々から作らなきゃいけないと思ってたのでMTのテンプレで用意しました。
(PHPには全然関係無い方法なのでMLには投稿できない・・・。)
http://p0t.jp/mt/php.rdf
Matzにっき(2005-08-04)PHPは言語じゃない。バッチ的にも使えるようになったけど、使うべきというわけじゃない。 私は(他のツールについて改めて学ぶのが面倒なので)PHPをバッチに使うこともあるけど。(Rasmus)
ちょwwwwww
PHP 観測所日誌 - Ethna に手を出してみたいいね!
今は Ethna で何か作りつつ Haste のリリース待ちデス。
Ethnaの強力なエヴァンジェリストがっ!
神の子どもたちはみな腕を磨く: 本日発表「PEAR_ErrorStackを使ったエラーハンドリングの統合」の資料を公開します本日開催の関西オープンソース2005 日本PHPユーザ会BOFで発表する「PEAR_ErrorStackを使ったエラーハンドリングの統合」の資料を公開します。
エラーハンドリング(とロギング)は重要!
まだちゃんとわかってないので勉強したい。
CodeZine:PHP5でSOAPを用いたブックマークサービスを作成するGoogleやAmazonを始め、多くの代表的なWebサービスでは、それ自身の機能を多くの利用者(開発者)に使ってもらうために、APIを提供しています。
その仕組みとしてSOAPやXML-RPCが使われていますが、今回はPHP5の新機能であるSOAP拡張機能を用いて、SOAPによるブックマークサービスを作成してみます。
CodeZineでPHP5+SOAPの記事。是非抑えておきたいです。
記事を書かれてるのはblog.xole.netの人ですね。
BMediaNode: Bruce Tate インタビューWeb Developers Moving Past Java(Web Services Summit)。軽快な Java や Beyond Java の著者である Bruce A. Tate 氏へのインタビュー記事です。
BMediaNodeさんのBruce Tateインタビューまとめがすごく参考になります。
あああ、再三言ってますが影響うけまくりです。おれ自身にちゃんとした根拠があるわけじゃないので単なる信者と言った方が正しい!
- Ruby などの言語では DI コンテナや AOP は必要ないので、解決すべき本来の問題に注力できる
- ユニットテストによって動的な型に関する問題のいくつかは解決できる
いつも自分の中でモヤモヤしたて部分をズバー言ってくれます。かなり癒し系アイドルです。
これからは困ったことがあったら、
「ブルース・テイトが言っていた」
というブルース・テイト論法で乗り切ろうと思います。(ポール・グラハム論法)
でも、
- PHP は quick で dirty だ(VisualBasic や Perl も同じ)
- quick and dirty に興味はない
かよ!
yohgaki's blog - ユーザ定義エラーハンドラの拡張パッチ最近のPHPはE_ERROR(未定義の関数呼び出しなどで発生)をユーザ定義エラーハンドラで処理できません。これはE_ERRORが発生した場合、必ずeixtを呼び出しスクリプトの実行を停止しないと誤作動する問題に対処した為です。
さらっと書いてあるけど死ぬほど有用な情報かよ!
BMediaNode: Symfony は Mojavi3 の forksymfony のソースを眺めていたら mojavi の Sean Kerr 氏のクレジットがあったので「どういう繋がり?」と不思議だったのですが、Credits によるとそもそも symfony が mojavi3-dev からの fork だったのですね。
なるほど。ちょうどMojavi Forumにもsymfonyの人の投稿が。
Mojavi3-DEV fork, Mojavi4 and collaboration, symfony framework
ZEND ANNOUNCES INDUSTRY-WIDE PHP COLLABORATION PROJECT AT ITS INAUGURAL PHP CONFERENCE# Zend PHP Framework: A Web application framework which will standardize the way PHP applications are built. The Zend PHP Framework will accelerate and improve the development and deployment of mission-critical PHP Web applications
# Engagement with the Eclipse Foundation: Zend is joining the Eclipse Foundation as a Strategic Developer. Zend is now proposing to lead a project focused on PHP within Eclipse
Zendのプレスリリース、PHP COLLABORATION PROJECT。
・エンタープライズ向けWebアプリケーションフレームワーク作る。
・Eclipse Foundationと組んでEclipseのPHPプラグイン作る。
エンタープライズ/ミッションクリティカルな用途向けっつーとEJBみたいなのを作るってことかな?
Eclipseの方もどうなるのか気になるところ。IBMがPHP用のPluginを寄与するんじゃないかと勝手に予想してたんですが、Zendがやるんですね。PHPEclipse、TruStudioはどうなるのか!
よくきたblog - RoundCube WebmaどっちかというとPHPのプログラムの参考書としてはイマイチ.
中のIMAPライブラリはPHPスクリプトで完全にIMAPをしゃべることができるようになるので,その参考にはなるかも.って程度?
RoundCube。PHPベースのWebmailだそうです。
超良さそう!・・・・・・・・・見た目が!
WebmailはSquirrelMailでいいやとかひよっていては駄目ですな。
PHPを極めて起業する - 勉強会のネタができた。今PEARのProposalにあがってるとあるライブラリ(コードがかなりごちゃごちゃしてる)をEthnaのActionForm向けに書き直しました。
三日もかかってしまった自分に反省。
テキストフォーム作るのと同じ感覚でできるようにしてあります。
QF Haters必見。
「・・・・・・・っ!!??」
Delphinus, PEAR Proposal, Ethna, QF・・・聞きてぇ!
この間注文したPHP Phrasebook届きました。
実物はちっちゃくてかわいい!
フレーズなのでクックブックよりもっとちょっとしたコードがたくさん載ってて楽しいです。
↓こんな感じの超ちょっとしたコードがたくさんある感じです。
Sorting Nested Arrays
function srotNestedArray(&$a) {
sort($a);
for ($i = 0; $i < count($a); $i++) {
if (is_array($a[$i])) {
sortNestedArray($a[$i]);
}
}
}
相当かわいい!
ref: PHP Phrasebook
- Php Phrasebook
- Sams(2005-09-02)
- (著)Christian Wenz
- 定価:¥ 1,746
- 新品価格:¥ 1,484
- ASIN:0672328178
PHP 観測所日誌 - Ethna/Creole アプリケーション Delphinus が公開にフィードアグリゲータとしても勿論期待ながら国産フレームワーク第二の刺客 Ethna によるお手本的な実装として非常に期待が高い。Creole 使っているのもいい。確か和製フレームワークでは初の国際デビューにもなると思うので英語圏に強い人には是非注目して欲しい。
実装はイケメン Ethna 使いとしてその方面の人にはもうたまらない halt さんによるもの。ソースコードは必読ですよ。
Ethna/Creole製Planetアプリキター!
php-adminのMLの方で公開するという話を見て、「是非お願いします!」と投稿したものの、登録メアドと違うアドレスから出したので届かんかった。
ソースは勉強になること間違い無しですな!
Mojavi Project - Mojavi 4 Development Open!Greetings everyone! Applications for Mojavi 4 development has been officially opened. The announcement has been made on the Mojavi Forum regarding positions that need to be filled and information on how to and who should apply!
Mojaviが動き出したようです。Mojavi 4の開発が始まったとか。まだ全然動かないらしいですが、何かTrucを使ったり、(Cakeでも使われてるやつ)開発メンバーを募集してたりして頼もし気な感じです。
そして英語力が無く、今頃知ったんですがこんな経緯があったらしいです。
【PHP】フレームワークについて語るスレ【総合】73 :nobodyさん :2005/08/24(水) 00:06:21 ID:???
>>72
みたいだね。
要約しますた。Seanのあとを引き継いだTylerがAgaviサイドにアプローチして、
MojaviとAgaviがマージできないか対話がもたれた。話し合いの結果、
1. フォークから時間が経ってないのでMojaviとAgaviはそんなに違わない。
2. TylerはMojavi開発を透明化して、コミュニティを発展させたい。
3. MojaviもAgaviも目指すものは同じ。
Agaviチームの意見としては
- Agaviは0.10.0をめざし、そのあと(もしくは同時に)Mojavi 4の開発にシフト。
- Mojaviは3.0.0-DEVの開発を中止、4に注力。
- Agaviの良い点 (phing integration, unit tests, public development model) をMojaviに持って行く。
- Mojavi4は完全な再設計になり、以前よりもリリースサイクルが短くなる。
気になるのがMojavi 3.0.0-DEVが開発を中止ってとこ。
でもphing integration, unit testsってAgaviですでにできてたんですね。すごい良さそう。
よくきたblog - PHP 4.4.1RC1で知ったこと- Fixed bug #34565 (mb_send_mail does not fetch mail.force_extra_parameters).
(Marco, Ilia)とかあった.
なんぢゃこりゃ? ってことでmb_send_mail()を追いかけたところ,どうやら第5引数をプログラム外から強制的に指定できるらしい.
mail.force_extra_parametersってうける。
BMediaNode: PHPUnit Pocket GuideO'Reilly から PHPUnit のポケットガイド(薄〜いやつ)が出るようです。
これは!買わなくては!
- Phpunit Pocket Guide
- Oreilly & Associates Inc(2005-10)
- (著)Sebastian Bergmann
- 定価:¥ 1,159
- 新品価格:¥ 1,044
- ASIN:0596101031
PHPEclipse.net : New XDebug CVS modules
Christian Perkonig worked the last weeks on a new debugger for PHP.
It uses the XDebug library.The following CVS modules contain the XDebug plugins
PHPEclipseがCVS上ではXDebugに対応し始めてるらしいです。
dbgでも動作は十分ですけどXDebugの方がmagumaも採用してるしメジャーっぽい気がします。
何よりdbgは対応バージョンが4.3.10で眠っ(略)
怠惰なテンプレライブラリRaw Template Engineを更新しました。
更新点:
大層な新機能ですが実際は・・・
テンプレ:
<html>
<head>
<title><?=$title?></title>
</head>
<body>
<h1><?=$title?><h1>
<hr />
<h2>Methods</h2>
<ul>
<?foreach ($methods as $method):?>
<li><?=$method?></li>
<?endforeach;?>
</ul>
<h2>Directories</h2>
<ul>
<li>
plugins/
<ul>
<li>html_options.php</li>
<li>html_radios.php</li>
</ul>
</li>
<li>
templates/
<ul>
<li>index.php</li>
</ul>
</li>
<li>index.php</li>
</ul>
<h2>Plugins</h2>
<ul>
<li><?html_options("html_options", $plugins)?></li>
<li><?html_radios("html_radios", $plugins)?></li>
</ul>
</body>
</html>
PHP:
<?php
include_once("Raw.php");
$raw =& new Raw();
$raw->assign("title", "Raw Template Engine");
$raw->assign("methods", array("assign", "assign_by_ref", "fetch", "display"));
$raw->assign("plugins", array(1 => "html_options", 2 => "html_radios"));
$raw->display("index.php");
ライブラリ:
<?php
//
// Raw Template Engine - the template engine using raw php.
//
// Copyright (C) 2005 Masaki Komagata <komagata@p0t.jp>
// All rights reserved.
// This is free software with ABSOLUTELY NO WARRANTY.
//
// You can redistribute it and/or modify it under the terms of
// the PHP License, version 3.0.
//
class Raw {
var $template_dir = "templates/";
var $plugin_dir = "plugins/";
var $template_vars = array();
function assign($name, $value) { $this->template_vars[$name] = $value; }
function assign_by_ref($name, &$value) { $this->template_vars[$name] =& $value; }
function display($template) { echo $this->fetch($template); }
function fetch($template) {
$this->_load_plugins();
extract($this->template_vars);
ob_start();
include($this->template_dir.$template);
$result = ob_get_contents();
ob_end_clean();
return $result;
}
function _load_plugins() {
if (is_dir($this->plugin_dir) and ($dh = opendir($this->plugin_dir))) {
while (($file = readdir($dh)) !== false) @include_once($this->plugin_dir.$file);
closedir($dh);
}
}
}
表示:
ただの関数をsmartyプラグインみたいに見せてるだけです!
- Php Phrasebook
- Sams(2005-09-02)
- (著)Christian Wenz
- 定価:¥ 1,746
- 新品価格:¥ 1,484
- ASIN:0672328178
PHPのフレーズブック!
表紙怖過ぎだけど注文しました。まったく前評判調べてないので届くのが楽しみ!
↓他のサイトでの説明。
The PHP Phrasebook is actually a pocket guide that is jam-packed with useful and essential PHP code "phrases" for the PHP developer's everyday use. The code is flexible, so it can be easily adapted to your needs and mulitple situations, and your time isn't wasted wading through chapters of tutorial lessons and extraneous information.
よくきたblog - php.s3.toのマニュアルが新しくなってる参考リンクいれるとランク上げに貢献するのでしません(何
とりあえず今年の5月,おそらく公式サイトにあるものを使用しているのでしょう.
php.s3.toのマニュアル問題がちょっと改善した模様!
笑った。
何が良いのかあまり共感を呼び辛いかもしれませんが、テンプレートエンジンを作りました。
特徴:
という後ろ向きなライブラリです。下記、使い方です。
テンプレ:
<html>
<head>
<title><?=$title?></title>
</head>
<body>
<h1><?=$title?><h1>
<hr />
<h2>Methods</2>
<ul>
<?foreach ($methods as $method):?>
<li><?=$method?></li>
<?endforeach;?>
</ul>
</body>
</html>
PHP:
<?php
include_once("Raw.php");
$raw =& new Raw();
$raw->assign("title", "Raw Template Engine");
$raw->assign("methods", array("assign", "assign_by_ref", "fetch", "display"));
$raw->display("index.php");
ライブラリ:
<?php
//
// Raw Template Engine - the template engine using raw php.
//
// Copyright (C) 2005 Masaki Komagata <komagata@p0t.jp>
// All rights reserved.
// This is free software with ABSOLUTELY NO WARRANTY.
//
// You can redistribute it and/or modify it under the terms of
// the PHP License, version 3.0.
//
class Raw {
var $template_dir = "templates/";
var $template_vars = array();
function assign($name, $value) { $this->template_vars[$name] = $value; }
function assign_by_ref($name, &$value) { $this->template_vars[$name] =& $value; }
function display($template) { echo $this->fetch($template); }
function fetch($template) {
extract($this->template_vars);
ob_start();
include($this->template_dir.$template);
$result = ob_get_contents();
ob_end_clean();
return $result;
}
}
表示:
賢明なみなさまのこと、一瞥しただけで全てが把握できたことでしょう。
やっつけ仕事や組み込み用途に!
kunitの日記次の点を修正した 3.0.2 をリリースしました。
* 3.0.1の修正によって、Tokenフィルターで二重submitチェックが効かなくなっていたのを修正
* 親ディレクトリのmaple.iniを継承した際の挙動が3.0.0と3.0.1とで違っていたので、3.0.0と同じようになるように修正
Maple 3.0.2がリリース。
フレームワークという以上に注目すべきオープンソースプロジェクトになってる気がします。kunitさんとはPHP勉強会でちょこっとお話させてもらっただけですが、設計に素晴らしいバランス感覚を持ってらっしゃる!と感じました。
あまりに精力的に活動されてるので交通費は会社の経費で落ちるのかがかなり気懸かりです。
AnyEdit tools plugin for Eclipse
3 "Convert -> Leading tabs to spaces"
(trailing whitespace will be removed automatically)4 "Convert -> Leading spaces to tabs"
(trailing whitespace will be removed automatically)
エディターに細かい機能を追加するEclipseのAnyEdit tools pluginがPHPEclipseでも使えるようになったとか。
spaceをtabにする機能はちょっと欲しい。
仕事ではPHP5.1が出たら(すぐ出そう)真剣に何使うか考えなきゃいけないですが、現状ではMojavi2使ってる人も多いはず!(おれも)
そこで地味Tips
「modules/foo/config.php」を置いておくとそのmodule呼ばれた時に読み込んでくれる!(ExecutionFilterが)
使い方としてはそのモジュールだけで使うライブラリや定数を書いとくと便利っぽいです。
<?php
define("FOO_BAR_LIMIT", 10);
include_once("Pager/Pager.php");
include_onceとPHP閉じタグを書かないのが流行です。(うz)
いつのまにKOF2005を日本PHPユーザ会としてやるようになったのだ?
ユーザ会の人が3人1組になって戦うのかと思った・・・orz
いやなブログ: 配列操作の比較表: Ruby, Python, JavaScript, Perl, C
Ruby, Python, JavaScript, Perl, C の配列操作の比較表を作りました。
言語ごとの配列操作の一覧。
array_push($a, $x)
って何かヘボさが漂って嫌ですな。組み込みクラスが多いのって大事かも。
PHP4で組み込みクラスといえば、、、
stdClass!、dir!、そして・・・__PHP_Incomplete_Class!
・・・なんて貧弱なラインナップなんだ。
最近よく見るJSONの意味がわからなかったので調べてみました。
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C , C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language.
JSONとは軽量のデータ交換用のフォーマットだそうです。
というかJavaScriptのオブジェクトの形式でデータをやり取りしたら楽だよねってことみたいです。
↓たとえばこんな感じだそうです。(via XMLをJSONデータに変換するJavascriptライブラリ - スピリッツオブゼロ@blog)
ListingInfo: {
Request: {
Parameters: {
Parameter: [
{ value: "あいうえお",
name: "keyword" },
{ value: "Shift_JIS",
name: "enc" },
{ value: "xml_lite4",
name: "tf" },
{ value: "FP",
name: "at" },
{ value: "10",
name: "ipp" },
{ value: "777",
name: "categ_id" }
]
}
}
}
}
PHPの配列をJavaScriptの配列に変換する処理なんかはやってる人も結構いるかもしれませんが、ちゃんと名前付けて仕様化してるところがすごくいい。
よく見たらPEARにもServices_JSONがProposalに上がってます。
JSON/READ-ME-JSON.php:
// create a new instance of JSON
require_once('JSON.php');
$json = new JSON();
// convert a complexe value to JSON notation, and send it to the browser
$value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
$output = $json->encode($value);
print($output);
// prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
// accept incoming POST data, assumed to be in JSON notation
$input = $GLOBALS['HTTP_RAW_POST_DATA'];
$value = $json->decode($input);
こんな感じで使えるなら便利そう。
既にXMLでやり取りしてるサービスもコレ(Amazon Web サービス ブログ: XML→JSON展開クラス)とか使ったらもっと便利になるかも!
(2)で特定したファイルをAspectをかませるように書き換えて、「components_c」に出力する。この際、「Zoo」クラスとなっている場合には「Foo_Bar_Zoo」に書き換えてしまう。
Aspectかませて書き換え!
その後、生成したファイルをunlink()すれば、メモリ上(?)にクラスファイルが読み込まれたされた状態になって、いつでも new できるって状態になってます。(詳しくはソース読んで :p)
includeして削除しちゃうって考えが面白い!
PHPでもコードインジェクションやコードジェネレーションの波が。
厭な感じを持たれる方もいるかもしれませんが、どんどんやっていーんです!
軽快なJavaに感化される。特にためになったのが、透明性を確保するための方法について。つまりアプリケーションの各ドメインがそれぞれ独立して他に依存しないようにする方法。ぱっと考えてそんなことできるのかと思いましたが、現在主流になってる方法は
- リフレクション
(きたオブジェクトに動的に対応)- コードインジェクション
(Build時にAntで自動的にコードを付け加える)- コードジェネレーション
(コード自体を生成する)
PHP 観測所日誌 - phpcon_quebec_cd*[PHP] PHPConference Quebec 2004 の CD が到着。
もう注文した事も忘れていたですよ。面白そうなコンテンツがあれば PHP-Stady のネタになるかと思ったんだけど、今更 Introduction to SQLite や Introduction to PHP5 ってのも。
さすが 2004 だぜ!
笑った。
PHPeclipse 1.1.7 available at update site
The update site (for use with the Eclipse configuration manager) now contains version 1.1.7 for Eclipse 3.1: http://pipestonegroup.com/eclipse/updates
There are still several annoying bugs with the debugger:
- Debugger view initialization fails at the beginning (appears harmless)
- Variables view doesn't work (Eclipse 3.1 event handling differs from 3.0)
- Source locator doesn't work automatically (have to click the call stack to go to the current line)
Eclipse 3.1対応のPHPEclipse1.1.7がリリース。
Debugger周りでまだバグが少しあるようですが、Eclipse 3.1は速度面でも機能面でも何かと素晴らしいので嬉しいです。
そんな中でもおれが地味に一番嬉しかったのがCVS commitにキーボードショートカットの割り当てが可能になったこと!
Webアプリケーションフレームワークでやってほしいこととして話されてるポイントを「目的 → 実装」の形で考えをまとめてみる。
大まかに、「再利用性の向上」と「とにかく楽したい」という2つの方向で機能が求められてるようです。
「楽したい」という意味ではテスト系の機能がもっと充実してくる気がする。
それ以外ではアプリの構造とか作成の進行状況とかを視覚的に見れる何かが充実してくると楽しい気がする!
Catalystのデモムービーを見る。(Ruby判らないので)
さっぱりわからない。
あ~何かこの感じ覚えがある、、、
HTML_QuickForm_Controllerがわかんなかったときと同じだ。
Mojavi 2.0 Tutorials, Updates and Docs
Downloads
I have recently been working on a bug-fixed release of Mojavi 2.0. I've comp leted the changes, and would love to have some people test against it before I c onsider it an official release. The highlights of this release include PHP 4.4. 0 support, and several bug fixes and enhancements.
MojaviProjectのやる気の無さに2.0.3βを勝手に出しちゃってる人が。
PHP 4.4.0対応とか良さそうだけどこれありなの?
Tanner BursonはPHP5で動くMojavi2プロジェクトYumaの人でもあります。(どんだけMojavi2好きなんだって話だよ)
What is it?
The Yuma project is a custom build of the Mojavi project. More specifically it is aimed to be a PHP5 compatible build of Mojavi 2.0. Mojavi 2.0 is an excellent framework for building PHP applications. It is efficient in both execution speed, and development time.
Mojavi Japan - フォーラム Smarty-Lightについて
SmartyRendererではSmarty-Lightって使えないんですよね?(頓珍漢な質問であればすいません)使えなかったら使えるようなプラグインがあったらいいかなぁ…と。
という話題があったのでSmartyLightRenderer作りました。
質問されたので答えたついでにのせるシリーズ。
Q: 「ログアウト後の戻るボタン対策はどうすればいいのか?」
A: 「PHPデフォルト設定(php.ini-dist)なら正しくログアウト(session_destroy)してればそれで良い。」
「ログアウト後の戻るボタン問題」とは何か。
ログアウトしてもブラウザの戻るボタンで戻るとキャッシュ上のページが表示されてそこから「購入」とか都合の悪い処理をされちゃう問題。
要はブラウザがキャッシュしないで、戻るボタンを押されても必ずサーバに問い合わせてくれれば大丈夫。
ブラウザに「キャッシュ使うな」と言うにはHTTPヘッダに下記を書けば良い。
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expiresは過去の日付とかなら良い。no-storeとno-cacheは、「ファイルとかにキャッシュするな」と「メモリ上とかにもキャッシュするな」、must-revalidateは「必ずサーバ見に行け」、PragmaはHTTP 1.0用らしいです。
ヘッダを自分で書いてもいいですが、PHPではphp.iniでsession.cache_limiterがnocache(デフォルト)に設定されていると上記のヘッダを自動的に出してくれます。
必ずサーバに問い合わせてくれれば、ログアウトされてるので「ログインしてください」画面に飛ばすことができます。
via: Hypertext Transfer Protocol HTTP/1.1 - 13 Caching in HTTP
なおRailsは、Rubyという言語の特徴を最大限に生かし、またJavaのフレームワークを参考にせず設計されています。PHPのフレームワークも、Javaのさるまねに陥ることなく、PHPの良さとは何かを考えながら、製作していただけたらと思います。
PHPの良さとは何か!
おれの考えたPHPの良さ:
それをフレームワークに生かせないかということで、一発ネタのはずだったAwesomeFrameworkをちょっと変えてみました。
1.関数いっぱい
AwesomeFramework(以下AF)は関数のみ!(クラスとか無い)
2.HTMLに埋め込める
AF標準のRendererはPHP!
いままでは「HTMLに埋め込める機能いらねぇ」とか思ってましたが、たとえば単に
Hello World!
と書いたテキストに拡張子「.php」をつけてincludeすると全内容が勝手に出力される!
PHPタグの外側は勝手に出力される=PHPタグが無いテキストは全部が普通に出力される。
3.オブジェクト指向とか知らなくても作れる
AFのactionはただのPHPファイル。関数ですらなく、上から順番に実行されます!
Hello Worldアプリのaction:
<?php
$_REQUEST["message"] = "Hello World";
forward("view");
?>
PHPファイルにするとグローバル変数地獄になって大変だろうと思っていたんですが、全てのactionはforward関数内でincludeされるのでフィルタチェイン的構造になったforward関数のスコープになって何気にnamespaceが分かれてる!
ファイルをactionの単位として$selfというそのaction自身の情報を含んだ変数をインポートすることにしました。($thisだと混乱するのでPerl的な$self)
$selfの中身:
Array
(
[action] => index
[file] => index.php
[abs_path] => D:/Program Files/eclipse-3.0.2/workspace/AwesomeFramework/actions/index.php
[abs_uri] => http://localhost/index.php?action=index
[resource] => Array
(
)
)
本家フォーラムの方で少し要望が出たのでMojaviInfoを修正しました。
version 0.4の変更点
ref: MojaviInfo
Mojaviについての質問をまたもらったので回答。
内容は、
「Mojavi+SmartyでHTMLファイルを吐きたいが、Viewの中でRendererをいじってもイマイチうまくいかない」
というものです。
「ActionでSmartyRendererを使う」または「ActionChainを使う」 という方法はどうだろうか。
普通に作っておいて、ファイルに吐く必要が出たら 簡単に移行できるので後者がいいような気がする。
[ ActionでSmartyRendererを使う ]
<?php
include_once(dirname(BASE_DIR)."/mojavi/lib/smarty/Smarty.class.php");
include_once(OPT_DIR."renderers/SmartyRenderer.class.php");
class CreateHtmlAction extends Action {
function execute(&$controller, &$request, &$user) {
$renderer =& new SmartyRenderer($controller, $request, $user);
$engine =& $renderer->getEngine();
$engine->compile_dir = BASE_DIR."/templates_c";
$engine->compile_id = $controller->currentModule."_".$controller->currentAction;
$renderer->setTemplate("static.html");
$renderer->setAttribute("title", "Static HTML by SmartyRenderer");
$renderer->setMode(RENDER_VAR);
$fp = fopen("staticHtmlBySmartyRenderer.html", "w");
fwrite($fp, $renderer->fetchResult($controller, $request, $user));
fclose($fp);
header("Location: ".dirname(SCRIPT_PATH)."/staticHtmlBySmartyRenderer.html");
return VIEW_NONE;
}
}
?>
[ ActionChainを使う ]
<?php
class CreateHtmlAction extends Action {
function execute(&$controller, &$request, &$user) {
$actionChain =& new ActionChain();
$actionChain->register("getHtml", "CreateHtmlByActionChain", "GetHtml");
$actionChain->execute($controller, $request, $user);
$fp = fopen("staticHtmlByActionChain.html", "w");
fwrite($fp, $actionChain->fetchResult("getHtml"));
fclose($fp);
header("Location: ".dirname(SCRIPT_PATH)."/staticHtmlByActionChain.html");
return VIEW_NONE;
}
}
?>
ref: 本当に理解すること
Reflection_Annotationを使ってみる。 - Paradigm Shift Design Projects
Reflection_AnnotationのAnnotation/Parser.php、微妙なので書き換えました。デモちゃんと動くかは知らない。
Sebastian(*)ウォッチャー発見!
Reflection_Annotation、疑惑のParse部のパッチを作っておられます。gj!
そういえば別アプローチとしてPhingはAnnotation拾えるのかな?
PEAR :: Manual :: 提供するに値 しない 場合
PEAR の "A" は、"Application" を表しているのですが、 アプリケーションがサポートされていないことについては単純な理由があります。 現在のところ、完全な WEB アプリケーションのパッケージを扱えるような インフラ(PEAR インストーラなど)が開発されるに至っていないからです。
状況が変わりましたら、サイトを更新してお知らせする予定です。
PEAR 1.4とかPHP_Archiveとかがそのインフラにあたるのかな!?
PHPカンファレンス2005のEthnaの藤本さんの発表であった、
「ウィザードなど一定のパターンのあるパーツをプラグインとしてフレームワークに組み込む」
っていう話を聞いて、なるほどそういうのがたくさんあったら便利かもと思いました。フレームワークでクラスライブラリより粒度の大きい再利用部品ができたので更に粒度を大きくしようとするとコンテンツを再利用できるようにしようとして自然とレイヤーが上がるのかもしれません。
最近PHPのフレームワークを調べていると、以前見つけたMidgardとか最近知ったBlueshoesとかCMSフレームワークというのを見かけるようになりました。
フレームワークより部品の粒度を上げてくと自然とCMSに向かっちゃうのかもと思いました。
ref: TownPortal
ref: PHPカンファレンス2005
PHPカンファレンス2005行って来ました。
寝坊したけど間に合って良かったです。
テンション無理やり上げて、発表も何とか終わりました。
フレームワークのお話はそれぞれ新しいトピックが聞けて、ホントに1ヶ月とか1週間とかいう単位で状況がどんどん動いていっているなと思いました。
トピック:
2~3時間ぐらいしかいられなかったんですが、Php Application Design Handbookを注文しちゃったZefardさんにお会いできたり、会社の別支社の方と話せたりして楽しかったです。
その後、西武新宿の激旨ホルモン屋「幸永」でプチ打ち上げ。
ref: PHPカンファレンス2005
This is a first preview release for Eclipse 3.1.
Especially some debugger issues aren't solved completly at the moment.
Eclipse 3.1対応PHPEclipseの preview release版が出てます。
まだデバッガ周りが怪しいとか。結構すぐに正式版が出そうな雰囲気なので待ちます。
PHPカンファレンス2005の詳細が公開されました - HotPHPPER News
毎年恒例のPHPカンファレンスの2005年版、「PHPカンファレンス2005」の詳細が公開されました。
今回はPHPでも昨今注目度の高いフレームワークを重点に置いたプレゼンテーションになるようです。
PHPカンファレンス2005で各フレームワークのお話の前に基本的な「フレームワークって何?」というお話をさせてもらうことになりました。
PHPカンファレンスに行ったことが無いので雰囲気がよくわからないんですが、パワポ作って12時頃行けばいいのかな?(予備知識無しにも程がある)
以前、PHP勉強会でEthnaInfoを見て真似しようと思っていたMojaviInfoを作りました。
単なるMojavi2のモジュールなのでmodulesディレクトリに置けば動きます。
設置例: iccサンプルのMojaviInfo
表示する項目は、configファイルで設定する値、include_path(Mojavi中で設定しているとphpinfoとは異なるので)、モジュール・アクション・ビュー・テンプレートの一覧、GlobalFilter一覧、index.phpで設定するLogger・Appender一覧、Authorization Handler、User、User Container、Session Handlerです。
ハードにMojaviを使ってるプロジェクトとかに入れてみるとズラーっと表示されて楽しいです。
BMediaNode: guesswork demo movie
今、私の手元にあるguessworkがどんな状態なのかがわかるようデモムービーを作ってみました(MOV形式、10MB)。
guessworkの次のバージョンのデモムービー。
Railsメソッド!サイトのかわいさといい、guesswork、見せ方が素晴らしいス。
公式サイト、周辺ドキュメント、拡張クラスの充実なんかもフレームワークを選ぶポイントになってますね。
- PHPデスクトップリファレンス
- オライリー・ジャパン (2001-04)
- (著)ラスマスラードフ
- (原著)Rasmus Lerdorf
- (翻訳)石川圭
- (翻訳)浜野 賢一朗
- 定価:¥ 1,155
- 新品価格:¥ 1,155
- 中古価格:¥ 500
- ASIN:4873110343
PHPデスクトップリファレンス。
オライリージャパンで出てるPHP本はこれだけで、扱いとしてはPythonより小さいです。
何とかしてPHPの本ももっと出してくれ!と働きかける方法はないもんでしょうか。
とりあえず現在英語で出てるPHPのオライリー本を列挙してみます。
- Programming Php
- Oreilly & Associates Inc(2002-03)
- (著)Rasmus Lerdorf
- (著)Kevin Tatroe
- (著)Bob Kaehms
- (著)Ric McGredy
- 定価:¥ 4,653
- 新品価格:¥ 5,156
- 中古価格:¥ 7,738
- ASIN:1565926102
これが日本語訳されてればマンモス本の代わりになったのかも・・・。
- Learning PHP 5
- Oreilly & Associates Inc(2004-08-15)
- (著)David Sklar
- 定価:¥ 3,488
- 新品価格:¥ 2,315
- 中古価格:¥ 7,380
- ASIN:0596005601
なかなか良い。
- PHP Cookbook
- Sitepoint Pty Ltd(2003-12-30)
- (著)David Sklar
- (著)Adam Trachtenberg
- (著)Harry Fuecks
- 定価:¥ 4,653
- 新品価格:¥ 3,709
- 中古価格:¥ 8,845
- ASIN:1565926811
第二版求む。
- Web Database Applications With Php and Mysql
- Oreilly & Associates Inc(2004-05-01)
- (著)Hugh E. Williams
- (著)David Lane
- 定価:¥ 5,235
- 新品価格:¥ 4,027
- 中古価格:¥ 10,892
- ASIN:0596005431
評判が微妙。
- Upgrading To Php 5
- Oreilly & Associates Inc(2004-07-22)
- (著)Adam Trachtenberg
- 定価:¥ 3,488
- 新品価格:¥ 2,750
- 中古価格:¥ 6,381
- ASIN:0596006365
どういう内容なんでしょうか!
- Php Application Design Handbook
- Oreilly & Associates Inc(2005-07-30)
- (著)Kevin Tatroe
- (著)Tobias Ratschiller
- 定価:¥ 4,071
- 新品価格:¥ 3,460
- ASIN:0596007086
あーこれも見たい。
第2回PHP勉強会inTokyoが開催されました - HotPHPPER News
6月より始まっているPHP勉強会の第2回が東京で開催されました。
PHP勉強会の第2回。体調を崩してしまって行けませんでした。残念。
次は是非行きたいです。
The PHP Development Team would like to announce the immediate release of PHP 4.4.0. This is a maintenance release that addresses a serious memory corruption problem within PHP concerning references. If references were used in a wrong way, PHP would often create memory corruptions which would not always surface and be visible. The increased middle digit was required because the fix that corrected the problem with references changed PHP's internal API. PHP 4.4.0 does not have any new features, and is solely a bugfix release.
PHP 4.4.0がリリース。バグ修正だそうです。
Fixed bug #32685, Fixed bug #29423 (Segfault when using assignment by reference within function).
ChangeLogではこの「関数内で参照代入するとsegfault」ってやつが一番でかそうです。
・・・ぐらいに思ってたのにMojavi2動かすと、
PHP Notice: Only variable references should be returned by reference(略
PHP Notice: Only variable references should be returned by reference(略
PHP Notice: Only variable references should be returned by reference(略
PHP Notice: Only variable references should be returned by reference(略
mojavi-all-classes.phpでNotice出まくり。原因はまさにコレ。参照返ししてるのに値で代入したり、値返ししてるのに参照代入すると注意されるようになったためです。たしかに注意してくれるとありがたいですが、Mojavi2のエラーハンドリングの仕組みが動く前(Controller::dispatchの中でset_error_handler)なので止めようが無し。
とにかく困ってる人はこうすればとりあえずは凌げるっぽいです。
mojavi-all-classes.php
// this is an uncommented, auto-generated file
// for full source, please view the Mojavi lib directory
//error_reporting(E_ALL);
error_reporting(E_ALL & ~E_NOTICE);
あとでがんばってNOTICE元を全部修正したパッチを作りたいです。
引き続きセッションIDかぶっちゃう問題。
一度session_id()を取得するんじゃなくて、
session_id(md5($_SERVER['SERVER_ADDR'].uniqid(rand(),1)));
とかやるのはどうですか?
某所でこんなコードを書いたことがあって、正解かどうか激しく気になります。正解でしょうか?教えてください。あと、$_SERVERの値って、php.iniやらの設定で取れないことあるよね。そんな時どうしよう。どうしよう・・・
投稿者 kかべ : 2005年07月12日 14:16
kかべさんのこの案が素敵な感じがします。
調べてみるとセッションID発行とmd5(uniqid("",1))はほぼ等価っぽいので正解なのではないでしょうか!
php-4.3.11/ext/session/session.c
sprintf(buf, "%ld%ld%0.8f", tv.tv_sec, tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);
PHP_MD5Update(&context, buf, strlen(buf));
php-4.3.11/ext/standard/uniqid.c
if (more_entropy) {
sprintf(uniqid, "%s%08x%05x%.8f", prefix, sec, usec, php_combined_lcg(TSRMLS_C) * 10);
} else {
sprintf(uniqid, "%s%08x%05x", prefix, sec, usec);
}
$_SERVERはどういうとき使えないんでしたっけ。その場合は、どうしよう・・・。
ref: PHPのセッションID3
複数Webサーバ、単一セッション管理でセッションかぶっちゃう問題ですが、調べたら5人日ぐらいかかりそう・・・とか思ってましたが、この間の勉強会で聞いたら、
「session_id()でセッションID設定できる。」
一瞬で解決しました。
解決策をまとめると、
「セッション維持してくれるロードバランサーを使う」 OR 「セッションIDにアドレスをくっ付ける」
となりました。
実装はこんな感じか!?
session_id(str_replace(".", "a", $_SERVER["SERVER_ADDR"]).session_id());
Mojavi2で使うためにIPでユニークなセッションIDを使うコンテナ、IpUniqueSessionContainerを作ってみました。
<?php
require_once (USER_DIR."SessionContainer.class.php");
class IpUniqueSessionContainer extends SessionContainer {
function load(& $authenticated, & $attributes, & $secure) {
if (ini_get("session.auto_start") != 1) session_start();
session_id(str_replace(".", "a", $_SERVER["SERVER_ADDR"]).session_id());
if (!isset($_SESSION["attributes"])) {
$authenticated = false;
$attributes = array();
$secure = array();
} else {
$authenticated = $_SESSION["authenticated"];
$attributes = $_SESSION["attributes"];
$secure = $_SESSION["secure"];
}
$_SESSION["authenticated"] =& $authenticated;
$_SESSION["attributes"] =& $attributes;
$_SESSION["secure"] =& $secure;
}
}
?>
IpUniqueSessionContainer-0.1.zip
index.phpのUSER CONTAINER SETTINGSのところでこんな感じで使う。
require_once(BASE_DIR."opt/user/IpUniqueSessionContainer.class.php");
$user =& $controller->getUser();
$user->setContainer(new IpUniqueSessionContainer());
ref: PHPのセッションID2
この間のおざきさんの話がすごい気になってたんですが、対策できました!
Mojaviのすべての基本となるSCRIPT_PATH定数をこんな感じで設定してやれば、この間つくったURIUtil::redirect()もSmartyプラグインのmojavi_uriも絶対URIを吐いてくれます。
/**
* An absolute web path to the index.php script.
*/
define('SCRIPT_PATH', strtolower(trim(array_shift(split("/", $_SERVER["SERVER_PROTOCOL"]))))."://".$_SERVER["HTTP_HOST"].dirname($_SERVER["PHP_SELF"])."/index.php");
きもちー。
ref: リダイレクト面倒
2005/07/08追記:
こっちの方がよい(via MugeSo)
/**
* An absolute web path to the index.php script.
*/
define('SCRIPT_PATH', strtolower(trim(array_shift(split("/", $_SERVER["SERVER_PROTOCOL"]))))."://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]);
Trackbackサーバを書いたんですがXMLがちょっと面倒くさい。
そこでRESTより簡単なRPCを考えてみました。
サーバ:
<?php
echo var_export(array("foo", "bar", "buz"));
?>
クライアント:
<?php
function var_export_rpc($uri) { return eval('return '.file_get_contents($uri).';'); }
var_dump(var_export_rpc("http://localhost/workspace/samples/var_export_rpc_server.php"));
?>
VAR_EXPORT_RPC!
XMLじゃなくてPHPコードを返す。
クライアントがPHPじゃないと死ぬほど面倒なことになる方式です。(Webサービスの利点台無し)
あぁ、しかもオブジェクト渡せない・・・。
この間やった内部勉強会の資料をアップしました。
この間の続きを面倒臭いながら実装中。
Accept-Languageヘッダフィールドの書式はRFC2616のSection14で定義されてるようです。
[RFC 2616] Hypertext Transfer Protocol -- HTTP/1.1
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
なるほど。これにそってgetLocales, getLocaleを実装してみました。
<?php
class RequestUtil {
function getLocale() {
return array_shift(RequestUtil::getLocales());
}
function getLocales() {
foreach (split(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]) as $value) {
list($name, $pri) = split(";", trim($value));
$num = preg_replace("/^q=/", "", $pri);
$langs[($num ? $num : 1)] = $name;
}
arsort($langs);
foreach ($langs as $value) {
$locales[] = $value;
}
return $locales;
}
}
?>
Firefoxでは仕様通りこんなのが来るのでちゃんと取れます。
ja,en-us;q=0.7,en;q=0.3
IEではこんな感じ。
ja
quality valueを省略した場合は1ということになっているのでこれも問題なさそう。
でもOperaのこれは間違ってないのかな
ja, en
両方1だとどちらを選んでいいのかわからない!
現在の実装だと上記の場合、getLocale()はenが返って来てしまいます。かといって左側優先なんてルールを勝手に実装したくない。
・・・と書いていたらyoshukiさんから情報が。
[RFC 3282] Content Language Headers
The syntax and semantics of language-range is defined in [TAGS]. The Accept-Language header may list several language-ranges in a comma- separated list, and each may include a quality value Q. If no Q values are given, the language-ranges are given in priority order, with the leftmost language-range being the most preferred language; this is an extension to the HTTP/1.1 rules, but matches current practice.
If Q values are given, refer to HTTP/1.1 [RFC 2616] for the details on how to evaluate it.
Accept-LanguageヘッダはRFC3282で再定義されていてquality valueが無い場合は左優先となっているそうです!
さっそくさっきのヤツを左優先に修正。
<?php
class RequestUtil {
function getLocale() {
return array_shift(RequestUtil::getLocales());
}
function getLocales() {
foreach (array_reverse(split(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"])) as $value) {
list($name, $pri) = split(";", trim($value));
$num = preg_replace("/^q=/", "", $pri);
$langs[($num ? $num : 1)] = $name;
}
arsort($langs);
foreach ($langs as $value) {
$locales[] = $value;
}
return $locales;
}
}
?>
これで安心です。
SourceForge.net: Project Info - AwesomeFramework
This is PHP application framework of an extremely simple Plain Old PHP File base. It is possible to use it for not only a browser but also the command line application.
1行のフレームワークAwesomeFrameworkをsourceforge.netにプロジェクト登録しました。
POPF(Plain Old PHP File)とか勝手に言っていいのかよ!
プロジェクト申請を通すために大層なこと書いてるけどソースは1行。嘘は言ってないからよしとします!
AwesomeFramework-0.4のソース:
<?php include $_SERVER["argv"][1] ? preg_replace('/^--action=/', "", $_SERVER["argv"][1]) : ($_GET["action"] ? $_GET["action"] : 'default.php'); ?>
しかし、この1行から恐るべき機能の数々が(実装したじゃなくて)発見されたので次の勉強会のネタはこれで行こうかと。
AwesomeFrameworkをコマンドラインに対応させました。
<?php
forward($_SERVER["argv"][1] ? preg_replace("/^--action=/", "", $_SERVER["argv"][1]) : ($_GET["action"] ? $_GET["action"] : "default"));
function forward($action) { include $action.".php"; }
?>
php index.php --action=action
なんて高機能なんだ。
コマンドラインから実行できるということは・・・Mojavi3超えたっっっ!?
AwesomeFrameworkにForwardを実装しました。
<?php
include $_GET["action"] ? $_GET["action"].".php" : "default.php";
function forward($action) { include $action.".php"; }
?>
なんて高機能なんだ。
これでViewにforwardすることでModelとViewとControllerがそろってると言えるのではないだろうか!!
AwesomeTemplateEngineと同様、PHPファイル自体をテンプレートとして使用しますがAwesomeFrameworkはあくまで、$GLOBALS経由でテンプレートに値を渡します!
Actionのファイル:
<?php
$GLOBALS["message"] = "World";
forward("view");
?>
Viewのファイル:
Hello <?=$GLOBALS["message"]?>!
あと、今思いついたんですが、
module/ action.php index.php
index.php?action=module/action
ってやってモジュールによって管理する機能搭載!とか言えないでしょうか・・・。
個別処理に関数やクラスを使っても良いが、各caseで関数などのコールが入るだけで、やることは変わらない。
PHPのフレームワークは、個別処理をどう別けて記述するかを決めるところが肝であって、mojaviとか見たいに、コントローラクラスなんて作らなくてもいいやんと言う気もする。柔軟性高いし速いし。
Harukiさんのフレームワークについての考察。
振り分け処理(あえてコントローラーとは言わない)の最小限サンプルを書かれています。
確かにFront Controller Patternといってもやりたいことはこれだけスね。
それに比べた場合、他のフレームワークの便利な点は何か?
名前付けとか開放・閉鎖原則とか単にオブジェクト指向の便利な点と変わらなくなってしまいました。
クラスになると名前空間を分けることができるけれど、(クラスに対してコンパイラがやっているように)関数名と変数名にPrefixを付ければ同じことになる。
JavaやPHP5のように仕様を強制できる仕組み(インターフェースとか)があると個別処理が交換可能なことが保障されるので便利。だけど仕様を覚えるのが面倒。
これを全部とっぱらって柔軟性が高くて習得コストが低いのを売りにしたフレームワーク(的なもの)っていう方向性も面白いなと思いました。
そこで、昔面白いなと思った「7行のテンプレートエンジンAwesomeTemplateEngine」に対抗して「1行のフレームワークAwesomeFramework」を作ってみました。
AwesomeFramework 0.1(HelloWorldサンプル付属)そのソース:
<?php include $_GET["action"] ? $_GET["action"].".php" : "default.php"; ?>
これを使ってある程度のアプリを作ろうとすると、逆に名前空間のありがたさとか(グローバル変数地獄)を身をもってわかって良いかも知れない!
Mojavi2、こんなFilterはどうだろうか。
<?php
class MessageFilter extends Filter {
function execute(&$filterChain, &$controller, &$request, &$user) {
if ($request->hasAttribute("messages") === false) {
// global messages
$globalMessagesPath = BASE_DIR."configs/messages_".DEFAULT_LANG.".ini";
if (is_readable($globalMessagesPath)) {
$messages = parse_ini_file($globalMessagesPath);
}
}
// module messages
$messagesPath = $controller->getModuleDir()."config/messages_".DEFAULT_LANG.".ini";
if (is_readable($messagesPath)) {
$messages = array_merge($messages, array($controller->getCurrentModule() => parse_ini_file($messagesPath)));
}
$filterChain->execute($controller, $request, $user);
}
}
}
?>
messages_ja.ini, messages_en.iniとか置いといて読み込むことで多言語化の枠組みを提供するFilter。
アプリ共通のiniとモジュール毎のiniを両方読み込む。
strutsのように環境変数から勝手に切り替えるようにしたいんだけどHTTP_ACCEPT_LANGUAGEのパースが面倒臭い。MojaviのRequestにもServletRequest.getLocale()があれば・・・。
先週、社内でPHPに関する質問メールを頂きました。
「MojaviのRequestクラスのsetAttributeメソッドとsetAttributeByRefメソッドの違いがわからない。」
というものです。
値渡しか参照渡しの違いですが、おれ自身、参照を本当に理解しているかあやしいもんです。本当に理解していないとわかりやすく説明することはできません。
概念を本当に理解したかどうかは言語化(コード化)、もしくは図にできるかどうかで判断することにしています。
「Prove it.(証明せよ)」ということでMojaviでのサンプルを作ってみました。
<?php
class DefaultIndexAction extends Action {
function execute(&$controller, &$request, &$user) {
$value = "foo";
$request->setAttribute("value", $value); // real
// $request->setAttributeByRef("value", $value); // ref
$value = "bar";
echo $request->getAttribute("value");
return VIEW_NONE;
}
}
?>
setAttributeとsetAttributeByRefで動作が変わる最小限サンプルです。
質問への回答はメールに返信してこのサンプルも一緒に送ったんですが、果たして解りやすい説明だったかどうか・・・自信がイマイチです。
PHP、すごく手軽で良いですね。セッション管理が楽だー。
これならさくさくといろいろ面白いサービスが作れそうですね。
とりあえず、今後はDBとの連携を一通りやってみるつもり。
いつも楽しみに見ているたつをのChangeLogのたつをさんがPHPをはじめられたっ!
せっかくなので自分が「そういうの最初から教えておいてくれよ」と思ったことを書き出してみます。
PHP Switcher Q&A;
Q. GETやPOSTを手っ取り早く取りたいんだけどCGIモジュール的なものは?
A. PHPコアの機能に含まれています。GETやPOSTのデータは自動的にグローバル変数の$_GET, $_POSTに連想配列として入っています。
Q. セッションは?
A. PHPコアの機能に含まれています。$_SESSIONというグローバル変数(連想配列)に代入するだけでセッションにデータが入ります。
Q. 配列と連想配列はどう違う?
A. 配列と連想配列は内部的には同じモノです。添字に文字列を指定すると連想配列になります。(添字に数字と認識できる文字列を入れると自動的に数値に変換されます。)
Q. ヘッダはどうやって書く?
A. Apacheモジュール版PHP(mod_php4)ではヘッダは自動的に付与されます。明示的に書きたい場合はheader関数を使います。それに対してコマンドライン版PHP(cli)が存在します。
Q. サードパーティ製モジュールは?
A. PerlでいうCPANにあたるPEARというリポジトリサイトがあります。(モジュールの登録には他のPEARメンテナの賛成投票が5票以上必要でstable/unstableという分類もあるため、CPANよりモジュール数が少ない代わりに一定の品質は保障されています。)
Q. PHP自体に機能を追加したい
A. Pure PHPのみのPEARに対して、Cで書かれたPHP extentionのリポジトリサイトとしてPECL(ぴくる)があります。
Q. Template-toolkit的なものは?
Q. PHP自体がHTMLに埋め込めるんだからテンプレートエンジンなんていらないんじゃないの?
A. そういう考えのもと、PHP自体をテンプレートとして扱うSavantというテンプレートエンジンもあります。
Q. Webアプリケーションフレームワークは?
A. Mojavi!
その他、国産フレームワークのMaple、Ethna、Java Seasar2のPHPポーティングS2PHP5などが有名です。
Q. O/Rマッパーは?
A. PEAR DB_DataObject。PHP5ではPropelなど。
PHP全体の印象としては、便利なものは少々言語デザイン的に美しくなくても標準関数にしちゃえ的節操のなさが良いところでもあり悪いところでもある。といったところでしょうか。
これを期に他言語をメインにしている人もちょっとPHPを触ってみる、もしくは多言語のライブラリやツールをPHPに移植してみるというのはどうでしょうか。
この「ビジネスロジックとして」という所に個人的には違和感を感じる。フォームやビューも「都度開発」しませんか?
ですので、フォーム、バリデイト、ビューあたりもCore Concernとして捕らえる必要が有るのではないでしょうか。
何がAOPで言うCore Concernかというお話。
Blogでは結論だけ書いてある書籍と違って、こういう思考の過程を見れるところがすごい勉強になるなあと思います。
でもこの部分の意味が解らなかったので気になります。
誤解していましたが、Core ConcernとCrosscutting Concernのクラス仕様が同じであると言う点から、すべてがAOPだと言ってはいけないのですね。
だとすると、mapleのすべてをフィルタで処理しようとする設計は、すべてをAOPでやろうということになってしまうのか。
おそらく、上記の遷移を扱うところが、メインのプログラムであって、それにフィルタを噛ましていくようなイメージになるのであろう。
とすると、ビューやバリデーションまでフィルタにするのはやりすぎとも言えるのではないだろうか。それらは、フィルタとは別けてコントローラのはっきりとした軸とする必要が有るだろう。
話は微妙に関係無いですが、MojaviもActionの実行自体ExecutionFilterというフィルタが行っている。はたから見ると単にFilterChainが走って終了。 何かに層を織り込むというより層だけしか無い。
Filterだと手続き的に追加していけるし入れ替えも簡単なので良いのかもしれない。
「Aが動くには先にBが動いている必要がある」みたいな前提条件を切り離す方法は無いのかな。
Mojavi Japanオープンしました!
「次の案件までにMojaviっていうのを覚えとけって言われたんだけど・・・」という人にはチュートリアルやサンプルを、使いこなしてる人には拡張クラスや関連ツールのアップロード/ダウンロードや情報交換場所として使ってもらえたらなあと思います。
第一回PHP勉強会 in Tokyo行って来ました。
PHPの濃い話がたくさん聞けてとってもためになりました!
内容はたくさんあって書ききれないですが、ためになったことメモ。(順不同)
おれの方ではMojaviでのパターンについて話させていただきました。
ある程度の規模で開発標準を決める場合、利便性よりも「共通の決まりを使用すること」や「繰り返し使うこと」の方が重要になってきてしまいます。
Mojaviでの開発標準やコーディング規約関連が落ち着いたらRailsやSeesaa、MapleやEthnaなど試したいです。
フォワードは
$controller->forward("modName", "actName");
で、いけるのにリダイレクトは面倒。
勝手な拡張は厭なので、ヘルパクラスを作ってみました。
<?php
class URIUtil {
function redirect($modName, $actName, $opt = null) {
$params = array(MODULE_ACCESSOR => $modName, ACTION_ACCESSOR => $actName);
if (is_array($opt)) $params = array_merge($params, $opt);
Controller::redirect(Controller::genURL($params));
}
}
?>
使うほうはこんな感じで
URIUtil::redirect("modName", "actName");
URL_FORMATに依存しなくて気持ちいい!
Mojaviのロギングやエラーハンドリングを見ていて、普通のPHPでもエラーハンドリングについてよく解ってなかったことに気づきました。
PHP自体の機能を使ってシンプルなエラー処理の正解(宣言してしまえば反対意見が出るまで正解と言い張れる)を作ってみました。
<?php
include_once("getContents.php");
// 行数の取得
function getNumLines() {
$contents = getContents();
if ($contents === false) {
trigger_error("getNumLines(): 行数の取得に失敗しました", E_USER_WARNING);
return false;
}
return count($contents);
}
?>
これであってるのかどうか気になる!
すごい基本なのにわからないこと多過ぎです。
Mojaviのアレについてパッチを作ってみました。
ErrorLogger.class.php-0.1.patch.gz
もう一個のアレについても作ってみました。
mojavi-all-classes.php-0.1.patch.gz
独自に改造してくのは厭なので
バグじゃないことがわかる OR パッチが本家に採用される
ってとこまで行かないと気持ち悪いです。
(というか仕事でベースとして使う人にとって問題ある)
ref: 正常ってことは無いだろう
ref: Mojaviロギングに疑問
PLANET PHP JAPAN - ハズレ日記 (見切り発車)
Blogのアグリゲート PLANETの日本語のPHPな方々版を作ってみました。 http://catbot.sakura.ne.jp/planetphpjapan/
Planet PHPの日本語版、Planet PHP Japanがオープンしてます。
Planet PHPはPHPに関するエントリーをまとめてきて出してるメタブログみたいなもんですが、、、ヤラレタ!
おれのToDoリストの中の
という項目を悲しく削除させていただきたく存じます・・・。
くやしいがgj。
何故ソレにこだわるのか一般の方には共感が得辛いかもしれないMSICCを一部修正しました。
修正点:
噂ではPHPでの開発では国内最大手と思われる楽○もPHP4 + Mojavi2.0.0を標準に採用とか。やはりある程度の規模の開発ではまだPHP5は怖いのかも。PHP4 + Mojavi2.0.0の枯れた環境下の正解を(仕事用に)さっさと知ってPHP5を調べて行きたい!
ref: MSICC回答編
or download the current features.zip at sourceforge.net:
PHPeclipse-1.1.4-features.zip
繋がらなかったPHPEclipse更新サイトですが、復活してさらにzip版も提供されてます。
1.1.4からサーバアプリまとめたパッケージXAMPP(1.1.3までは古いwampp2に対応)に対応したり、更新サイトでQuantum DBやSFTP、Subclipseなんかのプラグインをついでに入れることができてPHP開発環境としての利便性が増してます。
個人的にはApacheやPHPは手動でそれぞれ入れてますが、dbgでのデバッグも動くし快適です。(dbgのPHP 4.3.11対応版が出てないのが気になりますが)
後はCtrl + Shift + FのフォーマッタがJDTみたいにカスタマイズできたらいいなと思います。(のでFeature Requestsに出しときました。)
hatotech::kumatch: HTML_QuickForm からの脱却
前回のセミナーの懇親会中にも実は話題にあがってたのですが、HTML_QuickForm に関しては「もう使わない」というお話。 そこに至る理由が当然ありますが、すべてを統括し一言でまとめると「使う魅力を感じない」からです。
それなんですよ!自分じゃうまく説明できなかったんですが!
一番シンプルなやり方を押さえときたいという感じで!
QFでもいいと思います。投稿者 komagata : 2005年05月30日 23:48
とか言ってますが、
QF・・・ステッ!とまではいかなくともあんまり使いたくない感じなんですよねー!
フォームを抽象化するんだったらイベントドリブンでいけるようなとこまでならないと、結局QFの吐くHTMLやJavaScriptを読んだりして面倒くさいです。
QF嫌い5つの理由:
生産性で言えばフレームワーク付属のValidatorとかでもなかなか素早く作れるし、ある程度の規模の開発で標準として採用するにはなかなか難しいものがあります。(説得が)
出たみたいだけど、
http://pipestonegroup.com/eclipse/updates
↑eclipseでソフトウェア更新してもつながらない…
そうそう。超気になってるのにつながんないですよね。
There is also a BitTorrent file available? Just grab Azureus from Sourceforge if you haven't and use this link:
http://pipestonegroup.com/eclipse/torrents/PHPeclipse-1.1.4-features.zip.torrent
BitTorrent試してみるいい機会なのかな?
この間のMojaviバグ疑惑ですが、気になるのでもう少し調べてみました。
ForumのOld Supportに該当する投稿がありました。(去年の5月だからかなり前です。)
Mojavi Forum -> ErrorLogger and Smarty
However, Mojavi's controller automatically sets an instance of its own ErrorLogger class (opt/filters/ErrorLogger.class.php) as the error handler (thus overriding Smarty's settings), which defaults to flagging E_NOTICE as a fatal error. So every time I set a {$tag} in my Smarty template that does not have a corresponding value set in my View, I get a FATAL error.
やっぱりSmarty使ったときE_NOTICEがFATALエラーってでて困ってます。
I would really like to see that change in the source Mojavi too, feti. Error handling is really weird right now.
Will you resist the plea of your people? Come on, be a good and just ruler here ;)
ところでMojaviって1人で作ってるんでしょうか?エラー直してくれってsetiという人を名指ししてるし、Mojavi Founderの肩書きも他に見当たらないです。しかし言い方が気に入らなかったのか、
The check against error_reporting() is used to decide when to log an error depending on whether or not it was supressed.
Without the check, or with improper checking an error that occurs from @function() would be reported, when you don't want it to be. That's why the checking exists. Otherwise it proceeds as normal.
問題無い的発言。
しかし、その後の発言で端的にまとめられてますがそのままでは困る点が。
最後のは別にいいかなと思いますがその他は露骨に困ります。
最終的には結局自己解決して終了してます。
SVNの2.0.1 DEV見ても変わってないので特に取り入れられて無い様子です。
もう2系はどうでもいいやって感じなんでしょうか。それとも「もうPHP4アンインストールしたよ」とかでしょうか。
ブランチとか厭なのでパッチを公開しつつ本家に「できれば・・・反映してもらえないかと・・・PLZ・・・」という地道な働きかけをして行きたいと思います。
Mojavi + Smartyの入力・確認・完了。(DB登録のコードは省いてます)
Input、Confirm、CompleteということでICCという略語を強引に提唱させていただきます。
デフォルトMojavi-2.0.0からの変更点
とりあえず現時点ではコレが正解ということにします!!!
「片腹痛い、おれの方がもっと正解かつ美しいICC書けるわ!」
という方はぜひMojavi + Smarty ICC腹痛係り komagata@p0t.jp まで。
もっといいのが来たらそっちを正解ということにしてパクります。
Pro PHP:: The Podcast - Giving voice to the Professional PHP Community
Welcome to the Pro PHP Podcast. Your number one source for conversations, interviews, debates and op-eds with PHP pioneers, project heads, and companies using PHP. From PHP 5 to PEAR. From Databases to Daemons. The First All PHP Podcast.
PHPネタPodcast!
聞いてみたけど全然分からなかったおれが来ましたよ。
Mojaviの地味プログラム公開。(こないだMojaviのクラス図雛形作っておいたので簡単に図で説明できる。ツイてる!)
MojaviのロギングはLoggerにどんなAppenderをaddAppenderするかでログをどこに出すのか決めます。
opt/loggingにはデフォルトでStdoutAppender(標準出力に追加する)とFileAppender(ファイルに追加する)がありますが、本運用する場合に必ず必要なのがEmailAppender(メールに追加する=メール飛ばす)かと思って作りました。
具体的にはEmailAppender.class.phpをopt/loggingにでも入れてからindex.phpでLoggerにaddAppenderします。
$logManager =& LogManager::getInstance();
$deflog =& LogManager::getLogger();
$layout =& new PatternLayout('%N %c::%F() %m %d{r} %f:%l%n');
require_once(LOGGING_DIR."FileAppender.class.php");
$fileAppender =& new FileAppender($layout, LOG_DIR.'mojavi_%d{Y_m_d}.log');
$deflog->addAppender("file", $fileAppender);
require_once(LOGGING_DIR."EmailAppender.class.php");
$emailAppender =& new EmailAppender($layout, "komagata@p0t.jp");
$deflog->addAppender("email", $emailAppender);
上記の例だとLoggerはデフォルトでStdoutAppenderを持っているのでFileAppenderとEmailAppenderを追加してることになります。設定した閾値(レベル)を超えるエラーが発生したときにログを標準出力とファイルとメールに書きます。
PHP Webアプリ開発でのXSSやSQL Injection絡みのクォートだなんだのごっちゃになってて、今まで開発やってきたくせにいまいち明確に分かっていませんでした。
が、正解がやっと分かりました!
正解言っちゃいますけどいいでしょうか?これが正解なので暗記してください。あとお子さんが生まれたら真っ先に教えておいてください。
■問題名
■XSS
■SQL Injection
「magic_quotes_gpcはどうした?」という意見があるかもしれません。
magic_quotes_gpcに関してはphp.ini-recommendedに下記の記述があります。
; - magic_quotes_gpc = Off [Performance]
; Input data is no longer escaped with slashes so that it can be sent into
; SQL databases without further manipulation. Instead, you should use the
; function addslashes() on each input element you wish to send to a database.
magic_quotes_gpcはSQLのためにある設定で、パフォーマンス的には切ると上がるのでオススメと。これを使わない場合は自分でaddslashes()。
どっちでもいいんですが、下記の2点からOffにして自分でaddslashes()が正解(とします)!
あーすっきりした!
Mojavi2.0.0の疑問。
ログを取るレベルやプログラムを終了させるレベルを設定するためのレベルの定数が用意されています。
define('LEVEL_DEBUG', 1000);
define('LEVEL_INFO', 2000);
define('LEVEL_ERROR', 3000);
define('LEVEL_WARN', 4000);
define('LEVEL_FATAL', 5000);
これって・・・なんでERRORがWARNより低いんだろう。
switch ($level) {
case E_USER_NOTICE:
$this->info($message, NULL, NULL, $file, $line);
break;
case E_USER_ERROR:
$this->warning($message, NULL, NULL, $file, $line);
break;
case E_USER_WARNING:
default:
$this->fatal($message, NULL, NULL, $file, $line);
}
この間のバグの部分でシステム発のエラーを拾ってないってところ以外になんでERRORとWARNINGが逆なんだろうと思ってたんですが、コレLEVEL_*の部分と両方とも逆になってたからつじつまがあっちゃってたんじゃないでしょうか。
Connect PHP to DB2 and Cloudscape via PDO
PHP 5.1 is set to ship with a brand-new database connectivity layer known as PHP Data Objects (PDO). While PHP has always had very good database connectivity, PDO takes PHP to the next level. Learn how to obtain, install and use PDO to connect to IBM� DB2� Universal Database™ and IBM Cloudscape™
IBM developerworksのPDOでDB2/Cloudspaceの記事。
DB2ってODBC経由になるんですね。
何かおしゃれっぽいので誰か試しに業務でPDO + Cloudscapeやってみて欲しいです。
PHPのセッションIDの続編。
やはり複数WebサーバでのセッションID重複の可能性があるというのが問題になってきた(気になってきた)のでまた調べてみたところ、前回の結論には一部間違いがありました。
msessionはセッション情報を全てメモリに保持しているのでセッションID のコリージョンを検出しています。
とありますが、ちょっと考えたらリクエスト終了する毎にプロセスが終了するPHPの仕組み上、複数のリクエストが作成するセッションIDを見張ることなんて不可能。
msessionとはPHP extentionの一つでMsession - Mohawk Session Managerというセッション管理サーバへのAPIなんですね。セッション管理サーバが常駐してセッションIDを見張るので重複することが無いんだそうです。
普通はmsessionを使っておけば問題なさそうです。
ただ、msessionサーバが落ちたら困るのでその辺どうするかが悩みです。
ref: PHPのセッションID
仕事で10ヶ月振りにPerlの世界からPHPへ帰ってきたのでMojaviをまじめに勉強しています。
Mojavi2.0 + Smartyで
「FATAL [/path/to/input.html.php:28] Undefined index: foo」
ってエラーを良く見ないでしょうか。
何となく、「Mojavi + Smartyだとエラーちょっと厳しいような・・・」とか思ってましたが、良く考えたらなんで変数が無いぐらいがFATALエラーなんだよ!
頭にきて調べたら分かりました。
optのloggingの中にあるErrorLoggerで、E_USER_*は処理してるんだけどE_NOTICEやE_ERRORなどのシステム発のエラーを考慮して無いです。
修正。
200a201
> case E_NOTICE:
205,206c206,208
< case E_USER_ERROR:
<
---
> case E_USER_WARNING:
> case E_WARNING;
>
210d211
< case E_USER_WARNING:
これ、デフォルトがfatalなので、考慮してないエラーは全部FATALエラーになってました。
コレ直したら急に使い易い気がしてきた!
Features
Creole provides the following distinguishing features:
- Built for PHP5: new object model, Exceptions
- Interface-based system allows easy creation & registering of custom drivers or classes that wrap existing drivers to provide additional functionality (e.g. to log queries for debugging, do query performance analysis using EXPLAIN, etc.).
- Fully object-oriented API
- ResultSet scrolling: next, previous, first, last, relative, and absolute row fetching.
- ResultSetIterator (SPL) provides an additional means for iterating over recordsets.
- Comprehensive database metadata (database, table, full column info, pimary keys, foreign keys, indexes) using simple OO API.
- Full unified type system (based on JDBC Types)
- Simple, un-exceptional OO API for handling BLOB and CLOB data.
- Type-specific methods handle any necessary conversions and escaping for inserting and retrieving values.
- Native (no emulation) handling of autoincrement / sequence id generation.
- Extensive unit test framework tests each driver using real databases.
PHP5専用のO/Rマッピングツール(最近はパーシステンスフレームワークと言うのかも)のPropel
(via PHPLog)のサブプロジェクトCreole(クレオール?)。
PEAR DBみたいなDB抽象レイヤーのようです。
PHP5でこの辺のツール群はこういうのに全部取って代わられちゃうんでしょうか。PHP4 + Mojavi2.0 + DB_DataObjectはひよってますか。
Let the revolution begin - PHP_Archive 0.5.0 is live - Lot 49 - Greg Beaver's blog
Well folks, PHP is about to change dramatically. With the release of the fully unit-tested PHP_Archive 0.5.0, the ability to package a library or an entire application into a single file is now a reality.
PHP変革の第一歩的なPHP_Archiveが遂に出ました。
これを使っていろいろ出てきそうですね!楽しみ。
Go OO and Event-Driven Architectures finished. - International PHP Magazine & Conference
I just finished my two talks and made the slides available online:
話題のInternational PHP2005 Conference Spring Edtitionのスライドの一部が。
それぞれ、PHP5でデザパタとイベントドリブンのお話。
OOの話はみんなJavaの本買って勉強してると思うんですが、PHP5デザインパターンみたいな本だしたら今一冊も無いはずだから売れるかも?
もう一つの方もためになります。PHPにはあんまり無いようですが、patFormsやPRADOなどコンポーネントベースのツールを紹介してます。特にリリース情報でチラ見してたPEAR Event_Dispatcherが超気になる。(PEAR野郎)
Sparkline PHP Graphing Library
Aren't there existing PHP graphing packages that will generate sparklines? Why write your own?
In theory, any PHP graphing package should be able to generate a sparkline. In practice, however, many of these libraries are written with assumptions about the size of graphs they're going to produce. Simple rules about how to space tick marks on axes and what amount of padding belongs around graph elements begin to break down when the entire graph is 100x15 pixels.
小さい画像をシンプルに作るグラフィックライブラリSparkline。
これはかわいいかも!
osCommerceですが、やっぱり・・・という感じでしたね。以前このブログでもかきましたが、拡張性とか考えてるとは思えないつくりなんですよね。ちょっとひどすぎる感じがする。ワイズノットさんでosCommerceにかわるもっときれいなプロダクトをつくられてしまってはどうでしょう?ECサイトのノウハウをもたれているし、ニーズもわかられてると思うので、もっといいプロダクトをつくられちゃったほうがいい感じがします。(と無責任にいってみたり。実際、ECサイトベースの仕事がメインだったら作っちゃってたかもしれません。何でも自分でつくりたがるのが悪い癖・・・)
うは、岩崎さんが関西でosCommerceのセミナーを・・・ってPHP関西 第4回のことだったのかよ!
俺自身osCommerceそれほど触ってないんですが、
・本家コミュニティの開発は遅い。
(MLで「テンプレ分離したバージョンを一人で作ってみたら2日でできたがお前ら何してんだ」という発言が)
・日本語版2.2MS1は古くて問題もあるがそれぞれに対応するパッチが結構出ている。
・本家からブランチするとosCommerce最大の利点(知名度)が失われる。
機能拡張したらコミュニティに還元してどんどん良くしていくっていうのが一番良いと思いますが、日本で主流の2.2MS1だと"支払い"や"配送"に関する以外の部分はモジュール化されてないので結局でっかいパッチっていう形になってしまいます。
MS2では大分改善される予定のようです。
Midgard Project - TownPortal - Free Community Portal application (in TownPortal)
This project aims to produce a free portal system for villages and other local communities.
Midgardをベースにした町とか小さなコミュニティのポータルに特化したCMSだそうです。
Midgard自体はPHPベースのCMS Frameworkでイメージ的にはXoopsよりZopeでしょうか。
Annotations in PHP - Sebastian Bergmann
I could not resist and started working on a package that exends the Reflection API of PHP 5 by adding getAnnotations(), getAnnotation($name), and hasAnnotation($name) methods to ReflectionClass, ReflectionFunction, ReflectionMethod, and ReflectionProperty.
PHPにアノテーション機能追加しようというお話。
Sebastianさんはどうやら「PHP自体じゃなくてReflection API使ってPHPのクラスとして実装した方が良いんじゃないか」派。
とりあえず作り始めたコードが載ってますが、肝心のコメントをパースする部分はまだだそうです。
そこどうやるのかが一番気になるんだけども。
・追記
と思ったらすでにPEPr Proposalにあがってました。こんなにサラッと出しちゃうもんなんですねコレ・・・。
Features
- Complete framework for the analysis of website traffic and visitor analysis.
- Highly optimized logging engine that stores the access information into a database.
- Powerful interface to access the gathered data and perform operations on it: from simple statistical queries to the complex analysis of the visitors' clickpaths.
- Can be used to track both dynamic and static pages.
- Can be invoked directly from within PHP applications, for instance by a Content Management System, or through a HTML image tag -- a so called Web Bug.
- One installation of phpOpenTracker may track an arbitrary number of different web sites.
サイトのトラフィック解析とユーザ追跡フレームワークphpOpenTracker。
静的コンテンツにはimgタグを埋め込んで、PHPアプリからも直接APIが叩けるようです。
ソースが何かの参考になりそう。
イスラエルのZend,PHPアプリ向け統合プラットフォーム「Zend Platform 1.1」を発表 : IT Pro US News Flash
Zend Platform 1.1の主な特徴は以下の通り。
・PHP Intelligence:PHPアプリケーションの稼働において,パフォーマンス,スクリプト,動作エラーやデータベースのトラブルなど,各種のランタイム変更を検出しする
・PHP Performance Management:アプリケーションの実行を合理化し,性能を向上する
・PHP Configuration Control:サーバーのPHP設定管理機能を強化し,一貫した正確さと同期性を確保する
・PHP/Java Interoperability:すべてのJavaコールに単一のJava仮想マシン(JVM)を使用する。リソースの浪費を避けることで,PHPとJavaの相互操作性を図る
先日行われたZend Platform内覧会の発表資料を見せてもらいました。
Zend Platformはサーバにインストールして、PHP(入りのWebサーバ)を統一管理・監視したりするものらしいです。
へぇと思ったのが、Javaとの連携でノーマルのPHPではJavaを呼ぶ度にJVMを立ち上げてるのをZend Platformを使うことで一個のJVMで全て処理できるという特徴。
そもそも(Java連携機能が)ノーマルでは使えたもんじゃないですな。
UnknownPlace. - PHP での XML-RPC
そんなわけで他をあたろうといろいろライブラリ探してたみたら、Incutio XML-RPC Library for PHP というのがなかなかヨサゲ。
RESTマンセだがチェック。
PEAR XML_RPCはどうなのかな。
# 成長を続けるコミュニティ&ユーザーベース(Evolved)
# PHP未経験者でも15分もあればサイト立ち上げが可能(Ease of Use)
# J2EEアプリケーションをデプロイ可能なホスティング業者は少ない(Hosting)
# いくつかのJava製CMSはPHP製のものの10倍は大きくて複雑(Sleek)
# Javaを取り巻くコミュニティは大きなポイントだがPHPコミュニティも大規模になっている(Community)
# PHPの安定性やOOP機能はJavaに劣るかもしれないが大部分のWebサイト作者にとってはシンプルで機能豊富で容易に運用・管理ができることのほうが重要(Non Issues)
CMSはJavaよりPHP製。JavaネタのサイトもPHPを選択という話。
良い感じでまとまってます。仕事で引用しよう。
確かにPHPウェブアプリはインストールが簡単なのが多いぽい。PHP_Archiveでもっと簡単になるかもしれない!
ref: PEAR PHP_Archive
Yawp is Yet Another Web Programming foundation for PHP applications. It is one of the easiest "frameworks" you will ever see for PHP (even though it's not really a framework). Yawp attempts to enhance your own style of programming, not impose a programming method on you.
MVCじゃない1ファイルアプリ向きフレームワークYawp。
ほとんどの機能はYawpクラスを通してPEARを使う感じです。でもリクエストへのアクセサのYawp::getGet, Yawp::getPostって名前はどうなんだろう。MVC嫌い向け。
昨年末からコソーリ始まっているZend PHP Certification日本語版。本家ではSelf TestとしてWeb上でいくつかの問題を解くことができるようになったみたいです。それの回答など。
以前、PHPプロ・スタッフ ゴールドとかいうのを取りましたがこれはZend Japanが独自にやってる資格。Zend PHP Certificationの方は本家がやっている世界的な資格なので断然重要度高いです。
なんだか日本語の本はまったく見つからなかったので泣く泣く英語の方の購入ボタンを押しました。
The Zend Php Certification Practice Test Book: Practice Questions For The Zend Certified Engineer Examposted with amazlet at 05.04.13John Coggeshall Marco Tabini
Marco Tabini & Associates, Inc. (2005/01)
売り上げランキング: 142,851
通常3~5週間以内に発送
ref: Webアプリのセキュリティ
Kim PoleseがCEOを努めるSpikeSourceから、PHP用コードカバレッジツールPHPCoverageがリリースされました。
コードカバレッジとはテストに置いてコードの命令や分岐などをどのくらい網羅したかの指標だそうです。(via Software Testing)
組み込み系とかではかなりキチッとやりそう。興味あるので調べとこう。
Mojavi + Smartyでコンポーネント化されたテンプレートはどうやって作るんだろうか・・・。
コンポーネント化されたテンプレートとは要するに
こんな奴を
{$loginForm}
って感じで埋め込みたいってこと。
Filterでやろうにも特定のいくつかのページにだけ埋め込みたいし、Actionとテンプレが一緒になったものとしてほしいのでforwardやActionChainもどうもうまくない。それっぽいのがあった気がするブタさんとことももう見れなくなってるし。
たぶん仕事で使ってる人がみんなやってる方法っていうのがあると思うんですが・・・
現在開発中のMojavi 2.0.0を使っている案件で$controller->forward()を実行しているアクションの挙動がおかしいので調べたところ、この事実を知ることになり驚愕しました。超ショック。
まさに、「ここはforward()のためにあったのね」でした。ためんなるわあ。
<?php
require_once("AllSession.php");
$allSession =& new AllSession();
echo "<pre>";
// セッションIDの配列
print_r($allSession->sessionId);
// $sessions["セッションID"] = セッションの中身
print_r($allSession->sessions);
echo "<pre>";
?>
session.save_pathからsess~というファイルを復元しています。
共有サーバなんかはsafe mode or CGI&SuEXEC;が必須かもしれないですね。
ref: セパレータとして "|" を使ってるんですよ
ref: PHPのセッション自力復元
Mojavi + DB_DataObject使ってるとやっぱり、
$Member =& DB_DataObject::factory('Member');
$Member->get("userName", $request->getParameter("userName"));
if ($Member->password == md5($request->getParameter("password"))) {
$user->setAuthenticated(true);
$user->setAttribute("Member", $Member);
}
こんな感じで$userに$Memberを突っ込んだりしたくなるわけですよ。
でも悲しいことにPHPのセッションはリクエスト毎にファイルにserialize ⇒ ファイルからunserializeをしてるだけなのでunserializeするとき(session_start時)にクラスが宣言されて無いと__PHP_Incomplete_Classという謎オブジェクトが。
Mojaviでsession_startはSessionContainer#loadでやっているのでFilterでは遅いようです。しょうがないので__PHP_Incomplete_Classが現れた時に動くコールバック関数を指定するunserialize_callback_funcを使って無理やり読み込むことにしました。
<?php
ini_set("unserialize_callback_func", "findIncompleteClass");
function findIncompleteClass($className) {
$config = parse_ini_file(BASE_DIR."configs/DB_DataObject.ini", true);
$name = str_replace(strtolower($config["DB_DataObject"]["class_prefix"]), "", $className);
include_once($config["DB_DataObject"]["require_prefix"]."/".$name.".php");
}
?>
これもっといい方法無いのかな。
ブタさんとこのサンプルにあったようにMojavi + Smartyでcompileディレクトリを一個にしてると別モジュールの同名テンプレートを読み込んだ時にコンパイルされたファイル名がカブって動かない。(index.htmlとか)
Smartyのcompile_idにモジュール名を設定するさり気無い気配りを。
SmartyFilter.class.php:
<?php
require_once(RENDERER_DIR . "SmartyRenderer.class.php");
class SmartyFilter extends Filter {
function execute (&$filterChain, &$controller, &$request, &$user) {
// see if renderer is already loaded
$loaded =& $request->getAttribute("SmartyRenderer");
if ($loaded == NULL) {
// smarty init params
$params = array(
"cache_dir" => SMARTY_CACHE_DIR,
"caching" => SMARTY_CACHING,
"force_compile" => SMARTY_FORCE_COMPILE,
"compile_dir" => SMARTY_COMPILE_DIR,
"config_dir" => $controller->getModuleDir()."config/",
"app_name" => $controller->getCurrentModule(),
"debug_tpl" => SMARTY_DEBUG_TPL,
"debugging_ctrl" => SMARTY_DEBUGGING_CTRL,
"debugging" => SMARTY_DEBUGGING,
"compile_id" => $controller->currentModule
);
$renderer =& new SmartyRenderer($controller, $request, $user);
$smarty = & $renderer->getEngine();
foreach ( $params AS $key => $value ) {
$smarty->$key = $value;
}
// set the renderer as a request attribute so we can retrieve it
$request->setAttributeByRef("SmartyRenderer", $renderer);
// execute chain
$filterChain->execute($controller, $request, $user);
// remove renderer
$request->removeAttribute("SmartyRenderer");
} else {
$filterChain->execute($controller, $request, $user);
}
}
}
?>
xxxio : $_SESSION['foo']の、fooの所に使える文字って、きまりありましたっけ?
xxxio : うーん。"|"が入ってると上手く動かない気がする
xxxio : php5.0.3 / FC2 なんですけど、そもそも /tmp/sess_XXXXX の中って、
xxxio : セパレータとして "|" を使ってるんですよ
セッションの話。
そうそう、セパレータに"|"を使ってるんですよね!
セッション変数名|中身をserializeしたやつ;セッション変数名|中身をserializeしたやつ;
ってなってるんですよね。これ簡単なパースのやり方無いかな。
このクラスができたら楽しいけどsafe modeじゃない共有レンタルサーバとかすっごい危険。
ref: PHPのセッション自力復元
OOPP MemorandaさんとこにあったMojavi, QF連携でのFormLoadFilterについて。
素晴らしいのでやってみました。(via t-kawazu)
<?php
class FormLoadFilter extends Filter{
function execute(&$filterChain, &$controller, &$request, &$user) {
$form_file = BASE_DIR.'modules/'.$controller->getCurrentModule().'/forms/'.$controller->getCurrentAction().'Form.class.php';
if (is_readable( $form_file ) === true) {
require_once($form_file);
$form_name = $controller->getCurrentAction().'Form';
$form = & new $form_name($controller, $request, $user);
$request->setAttributeByRef('form', $form);
$filterChain->execute(&$controller, &$request, &$user);
$request->removeAttribute('form');
} else{
$filterChain->execute(&$controller, &$request, &$user);
}
}
}
?>
これって、
<?php
class FormLoadFilter extends Filter{
function execute(&$filterChain, &$controller, &$request, &$user) {
$form_file = BASE_DIR.'modules/'.$controller->getCurrentModule().'/forms/'.$controller->getCurrentAction().'Form.class.php';
if (is_readable( $form_file ) === true) {
require_once($form_file);
$form_name = $controller->getCurrentAction().'Form';
$instance =& new $form_name();
$form =& $instance->execute($controller, $request, $user);
$request->setAttributeByRef('form', $form);
$filterChain->execute(&$controller, &$request, &$user);
$request->removeAttribute('form');
} else{
$filterChain->execute(&$controller, &$request, &$user);
}
}
}
?>
こうじゃね?
コンストラクタだと$thisに$formを突っ込むしか返しようがなくて少しトリッキー。
ref: FormLoadFilter
The PDO (http://pecl.php.net/pdo) extension has been created to add some formality to PHP with regards to database connectivity. This allows developers to code without worrying about the seperate commands for each database. The extension will be a part of the upcomming PHP5.1 and will be enabled for all databases that you compile for.
PHP WikiにPDO関連の情報がまとまってます。チュートリアルもわかりやすくて良い。これから5系では必修になりそうなPDOだけに早めに知っておきたい。
PHP野郎どもは仕事ではいつから5系導入しようと思ってるんでしょうか。おれ的には4系の時を参考にして5.1.2ぐらいが出たら本気で移行考えます!
BMediaNode: PHPベースのプロジェクトビルドツール、Phing
PhingはもともとBinarycloudというフレームワークのサブプロジェクトとして開発されていたもので、タスクをPHPのクラスで定義することができるようです。
PHP版Ant的なものPhing。
Binarycloudが個人的にタイムリーだったので気になった。PHPEclipseで行こうと思うのでAntがいいや。
最近聞いた曲リストを使ってもらっていたBlogでeuc-jpのところがあって日本語の曲名が化けてました。
encodingパラメータで出力の文字コードを選べるようにしました。
埋め込みコード例
<script type="text/javascript"
src="http://komono.no-ip.org/rss.php?url=
http://ws.audioscrobbler.com/rss/recent.php?user=komagata&encoding;=euc-jp">
</script>
それにともなってkomono toolsのページも少し更新しました。
![]()
vBulletin is a powerful, scalable and fully customizable forums package for your web site. It has been written using the Web's quickest-growing scripting language; PHP, and is complimented with a highly efficient and ultra fast back-end database engine built using MySQL.
PHP, MySQLのフォーラムパッケージ。phpBBみたいなやつかな。
audioscrobblerで聞いている最新の曲を一覧で出力する komono toolを作ってほしいです。
投稿者 halt : 2005年02月28日 15:10
audioscrobblerがわからなかったので調べました。音楽を介したSNSみたいな感じなようです。自分の使っているプレイヤーに対応したプラグインを入れると聴いた曲がaudioscrobblerの自分のページにアップされました。なるほど、Webserviceを公開しているので素敵な連携ができそうです。
<script type="text/javascript"
src="http://komono.no-ip.org/rss.php?url=
http://ws.audioscrobbler.com/rss/recent.php?user=komagata">
</script>
表示例:太字の部分を自分のaudioscrobblerのアカウントに変えてください。
サーバにCGIとか設置する必要なくてちょっと楽じゃない?
思いついた日にサービスインシリーズ2。
FOAF検索エンジンFriend Searchリリース!ちゃんと動かなくてもその日中に公開していくよ。
無料のサブドメイン取得やDB作成、Apacheの設定とか素早くできるようになってきた。最近流行ってないっぽいFOAFですがSNSで何か起きるかもしれない!(他力)PINGサーバのWeblogUpdatesからBlogとってAuto-DiscoveryでFOAFクロールします。PEARにWeblogUpdates用のParser無いので自作。
require_once("XML/Parser.php");
class XML_WeblogUpdates extends XML_Parser {
var $weblogUpdatesInfo = array();
var $weblogs = array();
function XML_WeblogUpdates($handle = '') {
$this->XML_Parser();
if (@is_resource($handle)) {
$this->setInput($handle);
} elseif ($handle != '') {
$this->setInputFile($handle);
} else {
$this->raiseError('No filename passed.');
}
}
function startHandler($parser, $element, $attribs) {
switch ($element) {
case "WEBLOGUPDATES":
$this->weblogUpdatesInfo = $attribs;
break;
case "WEBLOG":
$this->weblogs[] = $attribs;
break;
}
}
function getWeblogUpdatesInfo() {
return (array)$this->weblogUpdatesInfo;
}
function getWeblogs() {
return (array)$this->weblogs;
}
}
PEAR XML_FOAF(α版)はありました。Parserは結構拾わない要素(bio:olbとか)あって不満ですが便利。その日中にリリースしようと思うとシンプルな方法でしかやろうとしなくなって訓練になるかも。検索エンジンは普通、クローラ、インデクサ、検索UIの3つが必要ですが、インデクサはめんどいからMySQLのフルテキストインデックスでいいや。
xored software - TruStudio 1.0 Final Release
Xored Software Team is pleased to announce that TruStudio 1.0 Final is released.
Built on top of Eclipse platform, TruStudio presents a unique extensible Integrated Development Environment for PHP and Python, providing a powerful set of editing, debugging and deployment tools:
EclipseのPHP開発環境プラグインTruStudio1.0 Finalがリリースされました。
使ってみてPHPEclipseとの違いなどをレポートできればと思います。
Re: 11 Cool Things You Can Do With PHP - PHP 観測所
David Sklar が 11 Cool Things You Can Do With PHP なるスライドを公開している。
PHP観測所さんで11 cool Things You Can Do With PHPの話題。
それぞれ相当面白い。PHPの節操無い便利さが良く出てる。特にantipopでも話題に出ていたXMLHTTPRequestがコード載ってて分かり易いです。XMLHTTPRequestってJavaScriptにそういうクラスがあるんだったのか。
MojaviよりもHTML_QuickFormよりも実はDB_DataObjectが一番好き。
でもMojavi + DB_DataObjectで罠るのが$user。
テーブル=クラス、カラム=メンバ変数、外部キー=包含と考えるとテーブル名はすごくシンプルで、データの集合を一言で表すいい名前をつけなきゃいけない。Userって凄く使いたくなる。
$user =& DB_DataObject::factory('User');
$user->find();
while ($user->fetch()) { $users[] = $user; }
とか超やりたい。(名前が気持ち良さのキモ)Action#execute($controller, $request, $user)なので無理・・・。
このアイデア、OOPP Memorandaの人がやってました。FormActionなるものを作って、そこでmodule/forms配下のclassをアクションに応じて自動的にexecuteするなんていう方法なんかどうでしょうか。
投稿者 おざき : 2005年02月07日 23:28
・Mojaviフィルタ FormLoadFilter.php
ブタすんのSmartyFilterをパクって作ってみました。 actionsフォルダと同じ階層にformsというフォルダがあって、その中にアクション名Formというファイルがあると、それを読み込んでフォームインスタンスを作り、リクエストにセットします。
FormLoadFilter
Actionを一個にしてれば(InputAction, ConfirmActionとか分けないって意味)これはイイ!
あれから環境は変わり、PHP5 はリリースされ PEAR もメジャーに突っ込み Mojavi だって当たり前&次の模索が始まり、enzo.bz で始めた 2003 年当初に比べると実に様変わりしました。php|architect も日本語で読めるようになり、最近では Ethna なんてスイートなモノも出て、主に英語圏の情報を喰わないと生きていけないという時代も終わった気がします。 1 年は長いな と実感。
PHP観測所が復活!
ちょうど自分に抜けてる情報が入ってくる心地よさ。ツイてる!
PHPのオープンソースSNS実装wawawaのMLに入っていますが、
[wawawa-dev 101] base-wawawa0でcreateTablesできない件について
私も先週これでハマりましたが、以下のURLに解決方法が載っていました。
基本的にPHP4.3.10とDBDOの組み合わせで発生するそうです。
参照URLココかよ!ツイてる!
komono toolsのsampleがIEでは見えていなかったので修正しました。
最近東京方面で PHP の勉強会を定期的にやりたいという意見が一部で上がっ ています。(関西が頑張っているので悔しいという思いももちろんあります。(笑)) その運営・連絡に用いる ML を php.gr.jp で立ち上げたいと思います。 東京勉強会に限らず、日本PHPユーザ会が関わるイベントの企画運営の話をで きる場にしたいと思いますので、ML 名は event にしようと思います。
PHPユーザー会運営MLでこんな話が。
むむ、行きて。
We moved the project.index (php identifier index file) to eclipse/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects// net.sourceforge.phpeclipse/project.index. for everey project name.
If you upgrade from 1.1.2 please delete your old project.index files and run menu Project->Clean... for all projects to create the new project.index files.
EclipseのPHP開発環境プラグインPHPEclipseの1.1.3がリリースしました。
バグフィクスと新しいショートカットができたとかぐらいのようです。その割りにproject.indexを作り直す手順が必要とか。ここは見(けん)か・・・。
komono tools bookの出力をキャッシュするように修正しました。
毎回Amazonにアクセスしなくていいようにキャッシュするのは結構面倒そうですが、Smartyのキャッシュ機能を使ったら簡単でした。
if ($smarty->is_cached("book.js", $_SERVER["QUERY_STRING"])) {
header ("Content-Type: application/x-javascript");
print($smarty->fetch("book.js", $_SERVER["QUERY_STRING"]));
exit();
}
Amazonから取ってきて出力するコード...
これでQUERY_STRING毎にできたキャッシュがある場合はそっちから表示します。
それとは別にJavaScriptのタグの書き方で、
<script type="text/javascript" src="foo" />
だと何故か他にJavaScriptのタグがあったときに対で認識されるようで表示が壊れてしまいました。(他にJavaScriptタグが無いと普通に出る)
<script type="text/javascript" src="foo"></script>
なので、こっちにしました。
超軽量Webサービスkomono toolsにbookを追加しました。
komono toolsはとにかくHtmlとかBlogとかCMSとか関係無く、登録不要で貼り付ければ使える小さなサービスを集めたものです。
bookは本のリストを出すだけのサービスです。使い方はhttp://komono.no-ip.org/book.phpにISBNコードをカンマ(,)区切りでつなげたものをJavaScriptとして貼り付けるだけです。
貼り付けるコード例:
<script type="text/javascript" src="http://komono.no-ip.org/book.php?isbn=487311201X,4873112079,487311215X"></script>
表示例:
aidパラメータに自分のアマゾンアソシエイトIDを指定することで自分のアソシリンクにすることができます。(デフォルトはおれのIDになる浅ましい仕様)
(bookというかAmazonにある商品ならCDとか何でもいいです。)
自分のアソシリンク例:
<script type="text/javascript" src="http://komono.no-ip.org/book.php?isbn=487311201X,4873112079,487311215X&aid;=p0t-22"></script>
ELFさんの言っていた方法で簡単に使えました。PEAR Services_Amazon。(今頃)
http://komono.no-ip.org/book.phpのソース。
<?php
require_once("Services/Amazon.php");
$amazon =& new Services_Amazon('XXXXXXXXXXXXXX', 'p0t-22', 'jp', 'http://xml.amazon.co.jp/onca/xml2');
$product = $amazon->searchAsin($_GET["isbn"]);
header("Content-Type: application/x-javascript");
print("<!--\n");
print('document.write("<span id=\"komono_book\">'.$product[0]["name"].'</span>");');
print("\n//-->");
?>
死ぬほど簡単です。
ところで、Services_AmazonはServices_Amazon.phpになってるんですが、
Services/ Amazon.php
ホントはこうじゃないの?勝手にリネームして使ってしまってます。
最軽量Webサービスkomono tools。
HTMLやBlogに貼り付けて使います。
オープンしました。
phphp.net - Log/2005-01-09/MSQD: Mojavi と QF 組み合わせについてちょこっと
どちらの方法も有りだと思いますが、QF 定義は Action に直接書いちゃう派が多いように思えたのでちょっとログってみました。
なるほど。
こんな感じでしょうか。
define("FORM_DIR", BASE_DIR."opt/form/");
class FormHandler {
function factory($formName) {
include(FORM_DIR.$formName.".php");
$f =& new $formName;
return $f->execute();
}
}
class UserRegistForm {
function execute() {
$form = new HTML_QuickForm('UserRegist', 'post');
$form->addElement('text', 'userName', 'ユーザー名');
$form->addElement('text', 'password', 'パスワード');
$form->addElement('text', 'eMail', 'E-mail');
$form->addElement('hidden', 'module', 'UserRegist');
$form->addElement('hidden', 'action', 'Input');
$form->addElement('reset', 'reset', 'リセット');
$form->addElement('submit', 'submit', '確認');
$form->setJsWarnings("入力内容に誤りがあります。", "");
$form->addRule('userName', 'メンバ名は必須です。', 'required', '', 'client');
$form->addRule('userName', 'メンバ名10文字までです。', 'maxlength', 10, 'client');
$form->addRule('password', 'パスワードは必須です。', 'required', '', 'client');
$form->addRule('eMail', 'E-Mailは必須です。', 'required', '', 'client');
return $form;
}
}
Actionの方。
$form =& FormHandler::factory("UserRegistForm");
MojaviはXMLとかなるべく設定ファイル作らないようにしてる気がするのでそれに合わせてみました。(個人的には設定ファイル派)
業務でビシビシMojavi使ってる人々に「普通こうだろ」っていうのを聞きたいです。
PHP: Unixシステム上のApache 2.0 - Manual警告
Unix上でもWindows上でも Apache 2.0.xとPHPの組合せを実運用環境で使用するべきではありません。その理由については、 FAQエントリも参照して下さい。
結構昔から「PHPでApache2.xは非推奨」ってことが言われてましたが、その根拠になっているのが本家マニュアル日本語訳のコレ。
・・・でも原文みたら違うじゃん!
PHP: Apache 2.0 on Unix systems - ManualWarning
We do not recommend using a threaded MPM in production with Apache2. Use the prefork MPM instead, or use Apache1. For information on why, read the following FAQ entry
Apache2.xのworkerとかperchildで使うなってことじゃん!つまりマルチスレッドに対応してないヨってことか・・・。
PHPの本家日本語訳マニュアルは「コレあれば本いらないかも」ってぐらい好きですが、微妙な部分は原文と見比べた方が良いかもです。
xored software - TruStudio Downloads
Preconfigured TruStudio 1.0M7 BundleThis preconfigured and ready-to-launch bundle recommended for novice Eclipse/TruStudio users and includes TruStudio Professional 1.0M7, Eclpse 3.0.1, and FTP/WebDAV plug-in.
Download Now
EclipseのPHP/Python開発環境TruStudio 1.0M7がようやくリリース。人柱の先輩からのメールを引用すれば、
「M7入れたら壊れた」
だそうなのでEclipse同伴版?を別に入れて試した方が良さそう。
UIとかがPHPEclipseより洗練されてる気がしてホントはこっちに早くでて欲しいです。
xored software - When is m7 coming?Hi Yegor,
can you give us a more detailed timeframe ?
One Week ? Two Month ?
EclipseのPHP開発用Plugin Trustudio。ロードマップでは去年リリース予定でした。RCどころかM7が出ない。いい加減に突っ込みが入ってきてます。
軽快なJava―Better,Faster,Lighter Javaposted with amazlet at 05.01.03ブルース・A. テイト ジャスティン ゲットランド Bruce A. Tate Justin Gehtland 岩谷 宏
オライリージャパン (2004/09)
売り上げランキング: 5,443
通常24時間以内に発送おすすめ度の平均:Javaプログラマ必読
率直な筆者の経験は必読
シンプル
軽快なJavaに感化される。特にためになったのが、透明性を確保するための方法について。つまりアプリケーションの各ドメインがそれぞれ独立して他に依存しないようにする方法。ぱっと考えてそんなことできるのかと思いましたが、現在主流になってる方法は
・リフレクション
(きたオブジェクトに動的に対応)
・コードインジェクション
(Build時にAntで自動的にコードを付け加える)
・コードジェネレーション
(コード自体を生成する)
の3つらしい。そしてそこに重要な役割を果たすコンフィグレーション。アプリケーションの独立性/再利用性を考えるときにAPIをこねくり回してコードで解決するより設定ファイルにしてしまえと。
PHPUnitを使って実感したこと、テスト容易性は設計の独立/透明性を表す。を最も重視して真っ先に取り組むことなんじゃないかという気がしてきた。コンパイルが無い分PHPでのUnitTestの重要性は高いんじゃなかろうか。テスティングの簡単な方法や有効な使い方は?早く調べないといけない気がする。コレとかいいのかも!
Mojaviなどのコンポーネント的フレームワークの嫌な点が見えてきた。純粋に「ActionとかViewクラスってどうやってテストすんの?」ていう疑問に答えられない。StrutsだとStrutsTestCase for JUnitなんていうのがあるみたいだけどようするにフレームワーク自体を模倣する何かが必要なわけで、それじゃあMojavi for PHPUnitを作れってことか?それは容易とは言えない気がするし、透明な設計とは言えない。
■自分覚書き
・設定ファイルはどんどん使ってよい。(Mapleはとっくにこれに気づいている)
・POPO?(Plain Old PHP Object)を扱うテストが容易なフレームワーク。
・継承を避ける。(継承は階層構造にクラスを縛る)
・コードジェネレーションを恐れず使う。
ココでコレが見たいなどと書いたらLive-Emotionの中の人がアゲてくれました。
すごく助かったので、探してたとき自分が一番欲しかった、Mojavi + HTML_QuickForm + Smarty + DB_DataObjectを使った登録、確認、完了のサンプルを上げてみます。(コード的にはほぼブタさんところのベースです)
もう仕事はこの組み合わせでいいんじゃないでしょうか。勝手に頭文字をとってMQSD MSQDという略語を提唱させていただきます!
仕事で、
「特殊な要件は無いみたいだからLAMPとMSQDでいいじゃん」
みたいな・・・。(ウザッ)
[ThinkIT]徹底比較!!PHP&JAVA;今回は、GoF(the Gang of Four)のデザインパターンの中でも最も簡単なSingletonパターンを利用して、PHP4とJavaのオブジェクト指向を比較してみたいと思います。
ThinkITで土橋さんのPHPとJavaの比較の連載。
「PHPでスレッドセーフなプログラムってどうやって書けばいいのかな?」と聞かれてこないだ調べてたわけですが、singleton・・・この連載のためだったんですね。
次回(第6回)が生産性についての比較ということで連載の本題になりそうな雰囲気です。
KinoWiki - Log/2004-12-12/IDE お試しメモ - MagumaWorkbench、PHPEclipseここ最近 TruStudio より勢いが良い。
英語圏では TruStudio よりこちらが伸びていきそうな雰囲気。
PHP観測所だったphphp.netが復活してるじゃないですカッ!しかもすでにPHPEclipise > TruStudioって勢いを察知してる辺りアツイ。 ここ最近っていうかTruSdutioのM7が予定日に出なかった日でかなりPHPEclipseに流れたのではないのかと。(おれだけ)
requireしてる別ファイルのメソッドを説明付きでコード保管してくれるのはありがたい。PHPUnitの設定があるのが相当気になるので試してみたい。TruStudioは1.0が出たらまた検証です。(年内出ないクサイ)
それとは別に実は↓がすごく見たい・・・。
Mojavi/Mojavi QuickForm Smarty - Live-Emotion.com - memoPHP観測所さんのサンプルがわかりやすいかも。
[PHP-dev 986]Re: 無名のメンバ変数試してみたら、メンバ変数に限らず普通の変数でも空の名前が 使えるようです。 さらに直接的なreproduce code( ${''} と書く)に仕立てて、 「マニュアルの変数名規約と合わない」のような言い方で バグレポートしてみました。(蹴られそうな予感。^^;) http://bugs.php.net/bug.php?id=27059
${''} のような長さ0の変数名が使えるんだそうです。
Perlの$_みたいに暗黙の変数として使ったらどうか → 意味無い。
ネタ元の無名メンバ変数になると更に紛らわしいです。
PHP 4.3.10 & 5.0.3 released!The PHP Development Team would like to announce the immediate release of PHP 4.3.10 and PHP 5.0.3. These are maintenance releases that in addition to non-critical bug fixes address several very serious security issues. All Users of PHP are strongly encouraged to upgrade to one of these releases as soon as possible.
PHP 4.3.10と5.0.3が出ました。
バグとセキュリティ絡みの修正のようです。Zend Engine2がやたら速くなるという次のやつが早く見たい。
「PHPでログインしている人リストを表示する必要がある」
という話を聞いたので、
session.save_pathにあるファイルunserializeすればすぐじゃんとか思ったんですが、コレ、serializeの結果とsessionファイルの中身違くね?
Array
(
[aaa] => 111
[bbb] => 222
[ccc] => book Object
(
[name] => namae
[price] => 1000
[releaeDate] => 2004/12/01
)
)
こうゆう配列をserializeした結果、
a:3:{s:3:"aaa";s:3:"111";s:3:"bbb";s:3:"222";s:3:"ccc";O:4:"book":3:{s:4:"name";s:5:"namae";s:5:"price";i:1000;s:10:"releaeDate";s:10:"2004/12/01";}}
そして、実際の$_SESSIONに入れた場合のセッションファイルの中身、
aaa|s:3:"111";bbb|s:3:"222";ccc|O:4:"book":3:{s:4:"name";s:5:"namae";s:5:"price";i:1000;s:10:"releaeDate";s:10:"2004/12/01";}
なんか微妙にフォーマット違う。どういうこと?
PHP: コンストラクタの内部での参照 - Manual注意: (PHP 4以降ではリファレンスカウンティングを使用しているため、)参 照ではなくコピーを返すことで性能が低下することはありません。逆に 多くの場合、参照を使うよりも単純にコピーを使った方が良い結果とな ります。これは、参照の作成には時間がかかりますが、コピーの作成に は理想的には時間が全くかからないからです。(ただし、大きな配列ま たはオブジェクトでその一つが変更されると、次々に参照先の他の要素 に参照先に波及するといった場合を除きます)
まじですか?要調査。
永続化がらみでPHPでアプリケーションスコープを扱うためのクラスを作ってみました。
ApplicationScope#setでアプリケーションスコープに変数をセット。
require_once("Book.php");
require_once("ApplicationScope.php");
$book =& new Book();
$book->name = "Effective Java";
$book->price = 1000;
$book->releaseDate = "2004/12/01";
$app =& new ApplicationScope();
$app->set("book", $book);
$app->set("mail", "bg@p0t.jp");
$app->set("age", 26);
ApplicationScope#getでアプリケーションスコープから変数を取得。
require_once("Book.php");
require_once("ApplicationScope.php");
$app =& new ApplicationScope();
$book =& $app->get("book");
$mail =& $app->get("mail");
$age =& $app->get("age");
var_dump($book);
var_dump($mail);
var_dump($age);
中身は結局ファイルにserializeです。デフォルトでsessionのディレクトリに一時ファイルを作ってます。setの時はその時点で書き込まれるので他のリクエストともやり取りできます。といってもアプリケーションスコープってどういう時に必要なんだろう。ASPやServletでも使ったこと無いです。
会社の五周年に楽天のKさんが来ていたのでPHP関連の質問を幾つかさせて頂きました。
Q1. PHPのセッションは重複するのか。(PHPのセッションID 参照)
A1. その理解の通り、1台では重複しないが複数台では重複する。
Q2. なぜPHPをApache2のようなマルチスレッドサーバで動かしてもおかしくならないのか。
A2. マルチスレッドでは動かない。Apache2で動かす場合はプロセスベースで動く設定にする。
その他にも楽天のDB構成やPythonの話などいろいろと聞かせてもらって勉強になりました。疑問がズバーン解決してとてもすっきりしました。
はてなダイアリー - Harukiからの平面波しかし、クラスが外部ファイルで定義されている場合、以下のようにするとエラーが出るので注意する。
$obj = new foo;
require_once 'class.foo.php';
これ、セッションに保存したオブジェクトを取り出すところでハマりました。
セッションからオブジェクトを復元するのにはunserialize()関数が使われているのでsession_start()より前にクラスファイルをrequireしとかないとPHPが何のオブジェクトなのか分からないので__PHP_Incomplete_Classになってしまいます。
取り出した物を見てみるとデータとしては完全にそろってる。でも何のクラスなのかわからないのでエラー。
これはガムを知らない民族の前に置いてあるガムみたいなものかと。おれらは目の前にあるものがガムクラスのインスタンスだと分かっているのでどんな振る舞いをするのかも知っている。しかしガムというものを知らない人の前に置かれたガムは謎のオブジェクト。ガムを知らないのでどんな振る舞いをするのかはさっぱりわからない、しかしデータだけは目の前にある。
「現実世界はそんなもの(クラスはわからないがインスタンスが目の前にある)ばかりなのでオブジェクト指向を無理矢理当てはめようとしても失敗する。」というのを何かで読んだ気がします。
手軽なPHPオブジェクト永続化のためのクラスStoredObjectを0.2にしました。
1オブジェクト=1ファイルだと10,000件の検索に5秒ぐらいかかるので1クラス=1ファイルにしました。(1オブジェクト=1行)
DataObjectよりシンプルにするためにfactoryを廃止。
下記は永続化のサンプル。
StoredObject#store()で保存。(保存先はデフォルトだと実行したディレクトリ。コンストラクタの第二パラメータでディレクトリ指定できます)
require_once("StoredObject.php");
class Book {
var $name;
var $price;
var $releaseDate;
}
$storedObject =& new StoredObject("Book");
$book =& new Book();
$book->name = "軽快なJava";
$book->price = "1000";
$book->releaseDate = "2004/12/01";
$storedObject->store($book);
$book->name = "Effective C++";
$book->price = "2000";
$book->releaseDate = "2004/12/02";
$storedObject->store($book);
$book->name = "Programming Perl";
$book->price = "3000";
$book->releaseDate = "2004/12/03";
$storedObject->store($book);
StoreObject#get()で取ってきます。
require_once("StoredObject.php");
class Book {
var $name;
var $price;
var $releaseDate;
}
$storedObject =& new StoredObject("Book");
$book1 =& $storedObject->get("name", "軽快なJava");
var_dump($book1);
$book2 =& $storedObject->get("name", "Effective C++");
var_dump($book2);
$book3 =& $storedObject->get("name", "Programming Perl");
var_dump($book3);
実行結果はこんな感じです。_StoredObject_hashというのはStoreObjectが勝手に割り当てているハッシュ値です。
object(book)(4) {
["name"]=>
string(10) "軽快なJava"
["price"]=>
string(4) "1000"
["releaseDate"]=>
string(10) "2004/12/01"
["_StoredObject_hash"]=>
string(32) "8141cda9579ef74e052390de23770469"
}
object(book)(4) {
["name"]=>
string(13) "Effective C++"
["price"]=>
string(4) "2000"
["releaseDate"]=>
string(10) "2004/12/02"
["_StoredObject_hash"]=>
string(32) "2d37647c506ed9a84f3e2966afcf40e0"
}
object(book)(4) {
["name"]=>
string(16) "Programming Perl"
["price"]=>
string(4) "3000"
["releaseDate"]=>
string(10) "2004/12/03"
["_StoredObject_hash"]=>
string(32) "ec905200936acd1ae7ecdcc6e7a4099d"
}
find()メソッドや正規表現での検索を追加予定です。
はてなダイアリー - Amethyst製作日記一つ考えられる方法として、オブジェクト管理クラスを用意して、そのオブジェクト管理クラスは管理対象のオブジェクトをシリアライズしてローカルにファイルとして保存、読み出しを行えるようにするとか。
まぁ、ファイル読み書きのオーバーヘッドが発生しちゃうけど、現実的な実装方法なのかも知れない。
コレを見てPHPで手軽にオブジェクトの永続化ができたらいいなと思ったのでちょっと作ってみました。
早い話が設定やDBがいらないDB_DataObjectといったものです。
require_once("StoredObject.php");
class Book {
var $name;
var $price;
var $releaseDate;
}
$book =& new Book();
$book->name = "Effective Java";
$book->price = "1000";
$book->releaseDate = "2004/12/01";
$storedBook =& StoredObject::factory("Book");
$storedBook->store($book);
クラス名でStoredObjectのfactoryを動かして、store()でオブジェクトを保存します。
require_once("StoredObject.php");
$book =& StoredObject::factory("Book");
$book->get("name", "Effective Java");
var_dump($book);
DataObjectライクに永続化していたオブジェクトを取得。
仕組みは簡単でクラス名で作成したディレクトリに1オブジェクトに対応する1ファイルを作ってserialize()保存しているだけです。取得するところはオブジェクトが増えると半端じゃなく遅くなると思いますが、何のインストールも設定ファイルもいらないのでプロトタイプの作成にはいいかもしれないです。
BMediaNode: PHPでのオブジェクトプーリングかなり大げさになりますが、memcachedというデーモンを使うとPHPでもオブジェクトのプーリング・キャッシングは可能になるみたいです。PHP用のクライアントAPIはPECLに含まれています。
PHPでオブジェクトプーリングを実現するもの。なるほど、PHPだとリクエストごとに消えちゃうし、別リクエストでは別ものになっちゃうので常駐してるデーモンに確保しといてもらうって感じですか。
・・・Servletでいいじゃん。
先日、PHPのセッション絡みの障害があり、調べてみました。何かというと「セッションIDが重複することがあるのか」ということについて。
PHP4.3.9のソースで見てみるとextというディレクトリがあります。これは拡張機能関連のソースがある場所のようで、pgsqlやmingやxmlなどが入ってます。ここにsessionディレクトリもありました。。拡張といっても本当のコア機能以外は全部ここに入っているようです。
php-4.3.9/ext/session の中のsession.cを見てみるとphp_session_create_idという露骨な名前の関数が定義されています。中身は大雑把に見ると、時間と php_combined_lcg()をMD5でハッシュ化しているようです。php_combined_lcgをググってみると、
[PHP-users 11996] Re: 「他人の情報を表示するサイト」php_combined_lcgはマルチプロセスサーバー(プロセスをフォームするサーバー)
ではPIDをマルチスレッドサーバーではthread_idを利用して疑似乱数を生成してい
ます。したがって、仮に、micro秒単位で同じ時刻にアクセスしても同じセッション
IDは生成されません。msessionはセッション情報を全てメモリに保持しているのでセッションID
のコリージョンを検出しています。
どうやらPHPのセッションIDは理論的に絶対に重複しないようです。でもこれって、Webサーバが複数ある状態で1つのDBにセッションを保存している場合、同じ時刻で偶然プロセスIDも一緒だったら重複しちゃうんじゃないでしょうか。もう少し調べてみたいです。
2005/05/17 追記:
一部間違いがありました。
ref: PHPのセッションID2
まるごとPHP! Vol.1―PHPを完全制覇。 (1)posted with amazlet at 04.10.02山田 祥寛
インプレス (2004/09)
売り上げランキング: 1,341
通常24時間以内に発送します。
まるごとPHP! Vol.1買いました。
・・・やべっ、自分のアソシで買やぁよかったっっっ・・・!?
表紙はコッチの猫にした方が売れたと思いました。
ビギナーズセクション、スペシャルセクション、エキスパートセクションの3つに分かれて書いてあっていろんな人によろしげです。初っ端の山田祥寛さん(山田祥平ではない)は何かもうPHP技術自体の国内エヴァンジェリスト的存在で、もう定番ですな。本全体を通してPEARマンセーなのでWeb+DB Pressの記事とかとあわせて皆が使うようになればいい。
そしてやっぱり良かった ネ申 のmojavi記事。あのページ数に収まる最高の形ではないかと思った。あと最後の vimでPHP のタイトルには意味無くボフりました。
PicoContainer - HomePicoContainer is a lightweight embeddable container for components that honour Dependency Injection.
Want more? See One minute description, Two minute tutorial, and Five minute introduction.
最近うちの会社でもDIコンテナが流行ってます。席の周りはみんなJava(おれはPHP)なのでやれSeasar2だSpringだPOJOだ言ってます。
「AOPを仕事に取り入れたいけどAspectJは糞面倒臭そう。ダイコン・・・これならいけるかも!?」
って感じで広まってるんでしょうか。
Javaのスクリプト言語Groovyで有名なcodehausのプロジェクトPicoContainer。ピコっつーぐらいだから小さくて簡単なんでしょうな。Dependency Injectionの考えは言語に依存しないのでこのPicoContainerもJava以外に.NETやRubyのなんかも。でもPHPは対応してないんですな。PHPの欄に「watch this space!」の記述。誰か作れってこと?
Mojavi関連で有名なトイレの落書きにもDI関連の記述が。PHPも5になったからっつってEJBみたいな重厚なもんじゃなくてPOPOとでもいうべきクラスを外からいろいろする方向なんでしょうか。
みなさん、普通の人はUMLモデリングツールに何を使っているんでしょうか。
とくにPHPの人は・・・???
PHPに対応したツールってほとんど見当たらないので本当に謎です。マジで!
会社ではVisio2000に PHP データ型 とか勝手に作って書いてます。
開発標準化にあたってツール類も探しているんですが、フリーの(オープンソースでなくてもいい)UMLモデリングツールってなかなかコレ!ってのが無いです。PHPに関してはラウンドトリップなんかはあきらめてるんですが、QtベースのUmbrelloというオープンソースのUMLモデリングツールがPHPに対応しているというので試してみました。(これのためだけにsargeインストール・・・)
見ての通りUMLモデリングツールとしては普通っぽいUIなのでVisioからすんなり入れました。本気でこれに移行しようとかいうんじゃないんで「おー良くできとる」っていう感じです。
適当なクラス図を描いて早速、クラス図からソースを吐いてみました。(ソースからの読み込みはできないみたいです。)
request.php
/**
* class Request
*
*/
class Request
{
/** Aggregations: */
/** Compositions: */
/*** Attributes: ***/
/**
*
*
* @param string name
* @return string
* @access public
*/
function get( $name )
{
} // end of member function get
/**
*
*
* @param int name
* @param int value
* @return void
* @access private
*/
function set( $name, $value )
{
} // end of member function set
} // end of Request
?>
view.php
/**
* class View
*
*/
class View extends Smarty
{
/** Aggregations: */
/** Compositions: */
/*** Attributes: ***/
/**
*
*
* @return void
* @access public
*/
function execute( )
{
} // end of member function execute
} // end of View
?>
おお、継承とかはちゃんとやってくれるみたいです。でもこのソースフォーマットって標準的じゃないっぽくない?
改めて考えてみるとラウンドトリップ機能ってコード書いてて途中でリファクタリングしてもクラス図やソースのメンテナンスが楽!っていうために使うんですな。吐いて終わりだと最初の一回だけだからあんまり嬉しくないかも・・・。
hatotech::kumatch: 第2回PHP関西セミナーPHP関西 SEMINAR : 2004年9月度セミナーのご案内
セミナーには PHP の初心者から言語全般上級者の方まで幅広く参加します。セミナー内容およびその後の懇親会まで非常に身になる内容になります、させますので是非ともご参加を。関西 PHP のその無駄に元気な部分まで垣間見ることができます。
23日、会社の命を受けて最近噂のPHP関西のセミナー行ってきます。レベルが高そうなので付いて行けるかどうか・・・。会場で見かけても物を投げないで下さい。
社内の開発方法標準化に取り組んでいます。
基本的にPHPでもオブジェクト指向開発&標準的なツール・ライブラリを使おうよってことで進めてるんですが穏やかに民主的に進めようとすると全然決まりませんな。
今更なにあたりまえのこと言ってんの?と思う人もいるかもしれませんが、結構多いんですよ、
「ファンクションベースで一から全部書くべきだ!」
とか
「オブジェクト指向開発は導入コストがかかりすぎる!」
といった反論に出会うことが。
そんな議論に付き合って半年ほど様子を見てきましたが、俺が責任者になったからにはそんなことを言う奴はフライス盤で右腕を切り落としてやる!
とりあえずPHPに関するところはこんな感じで行くことにします。(守らない奴はRS232Cケーブルで首を(略))
・フレームワーク(検証中)
・Mojavi
・データベースコネクション
・PEAR DB
・テンプレートエンジン
・Smarty
・エラーハンドリング
・PEAR PEAR
・O/Rマッパー
・PEAR DB_DataObject
・Unitテスト
・PEAR PHPUnit
・ユーザー認証(検証中)
・PEAR LiveUser or PEAR Auth
・入力検証(検証中)
・PEAR HTML_QuickForm
・ロギング(検証中)
・PEAR Log or syslog
・データベース
・MySQL4.0.20
そして2つのプロジェクトで試してみて良い感じだったのでPHPUnitによるテストファーストも必須にしました。
プロジェクトを成功させるにはこんな決めれば済むことはさっさと決めてしまって、メンバーのモチベーション管理や顧客とのコミュニケーションに時間を使いたいものです。
今後、この案が本当に通るのか、とか実際にやってみたら糞駄目で逆に左腕を切り落とされたとか、見守りつつ書いていこうと思います。PHPで開発をしている人は普通この辺の標準化をどうやって行っているか知りたいもんです。
IRCでariaが「Amazonで検索すると価格だけ出るようようなものができないか」という話をしていて、興味があったのでAmazonのWebサービスについて調べてみました。
PEAR XML_RPCを使ってみようと思ったんですが、よく見たらAmazonが提供するAPIはSOAPとRESTでした。AmazonのREST APIはパラメーターにxslも指定できるのでxslを用意するだけでいい感じの表示を得られるんですがやはりPHPで受け取ってパースすることに。
しかし作ろうと思ったとき何故かPEARのサイトが落ちてたのでリクエストの結果のXMLはxml関数でパースしました。(後日試したところPEAR XML_Treeは日本語文字化けした。みんな普通は何でパースしてるんだろう?)
少し面白げだったのでSmartyのキャッシュ機能とPEAR Pager_Slidingを使って価格調べ専用検索を作ってみました。
Smartyのキャッシュ機能、強力でした。この場合、カテゴリー名・検索ワード・ページ番号を繋げてキャッシュIDにしてあります。キャッシュがある場合はバックエンドのWebサービスやDBにアクセスしないで表示するので相当パフォーマンスに影響あると思います。
Amazon Hacks 世界最大のショッピングサイト完全活用テクニック100選Posted with amazlet at 04.09.03ポール・ボシュ 篠原 稔和 ウェブ・ユーザビリティ研究会
オライリー・ジャパン (2004/04/24)
売り上げランキング: 2,320
通常24時間以内に発送します。おすすめ度の平均:Amazon を使いこなすために
アマゾンをもっと使いこなすための1冊
翻訳する価値があったかどうか疑問
来週PHPプロ・スタッフの面接があるのでかなりの確率で質問されるというWebアプリケーションのセキュリティに関して調べてみました。
■抑えておく用語
・XSS(クロスサイトスクリプティング)
→フォームから入力した値がHTMLの一部として実行される場所で悪意あるスクリプトを動かしたり。具体的にはクッキーをパクッて他人のセッションを奪ったり。
・SQLインジェクション
→SQL文を流し込むこと。例えばフォームの値をwhere句の条件に使う場合、入力フォームに"1 or id = 2"と入力したら・・・。
"update foo set cost = 100 where id = ".$_POST["id"];
・セッションハイジャック
→他人のセッションを乗っ取ること。セッションIDの入ったクッキーがXSSによって盗まれたり、そのIDを使って成りすまされたり。
■対策
・GETパラメーター改竄
→GETの使用を最小限に留める。(Action=xxx的な処理の振り分けのフラグだけとか)
・HIDDEN値改竄(そしてAction値をフルパスに変更)
→HIDDENを使わない。セッションにする。
・XSS
→POSTにhtmlspecialchars。
・セッションハイジャック
→セッションIDを単純な値にしたりCookieが盗まれなければ大丈夫。PHPのデフォルト設定ならそこそこ安心?(セッション有効時間24分、セッションIDはCookieに保存、Cookieはブラウザ閉じたら削除)
・SQLインジェクション
→フォーム値の地道なValidationしかない?
マニュアルにも書いてあるけど、下記で簡単にSmartyの変数の修飾子が増えるゾ!
$smarty = new Smarty;
$smarty->register_modifier("number_format","number_format");
$smarty->register_modifier("stripslashes","stripslashes");
この二つは結構使うので便利。
金額: {$cost|number_format}円
こう書くと、
金額: 2,109,800円
という感じで。
stripslashesはmagic quoteとかやってる場合に元に戻す時に便利。
Smarty : Template EngineSmarty 2.6.3 Released
[16-June-2004] This release is focused on minor fixes and minor new features.
全然気付かなかったですが、メジャーテンプレートエンジンSmartyの2.6.3がリリースされてました。
プログラム自体とは全然関係ないですが、Smartyってどこにインストールしてますか?/usr/local/lib/smartyとか/usr/local/share/smartyとか迷うんですよ!
とりあえずDebianのPEARが/usr/share/pearに入るんで/usr/share/smartyで行っています。普通はどうなんでしょうか・・・。
ていうか
# pear install smarty
とかだったら良かったのに。
PHP usersのMLで白目剥いちゃってるような質問が!
初歩的な質問で申し訳ございませんがどなたか教えてください。先日、ウィルススキャンを行いPHPに関していくつかの脆弱性を
検知しました。
PHPは利用していないためにサービスを停止したいのですがそのような
ことは可能でしょうか?
また、可能でしたらどちらで設定すればよろしいのでしょうか?
即効で突っ込みが、
参考までにどのようなウィルススキャンをご使用なさったか教えていただけるでしょうか?
おれも知りたい。
皆様迅速なご回答ありがとうございました。
実は、サーバーは私が管理しているものではなく
検証環境を利用しているお客様の運営しているものでして・・・
もう少し具体的なヒアリングが必要でした・・・・また、ウィルススキャンは社内の独自のスキャンを使ったもので大変
申し訳ございませんが、皆様に公開することは出来ません。
かわしたっっっ!
TruStudio Japanお待ちかね、TruStudio の最新マイルストンリリースである、1.0M2 が公開されました。
使ってみた方はぜひフォーラムに動作状況や感想などを書いていただければと思います。
EclipseのPHP開発環境プラグインのTruStudio1.0 M2がリリースされたそうです。EclipseのPHPプラグインといえば他にPHPEclipseなどがありますが、こっちはドえらい更新止まってます。
今ところおれはEclipse2.1.2、PHPEclipse、EPIC(Perlプラグイン)であとはSFTP(SSH)とCVSのプラグインを使ってます。現状でもあんまり大きな不満は無いので3がでたらかなり便利になっちゃうんじゃないの?と思ってます。
おはようございます。雨の日は髪がヘナッとなって気分が悪いbGです。
今の会社に入ってまだ1ヵ月ぐらいなんですが、一緒のチームの人が寛大なので開発方法におれのわがままを取り入れまくってもらって軽くアツイです。
わがままというのはPHPほぼ素人のおれが、「MVC意識したフレームワークを作ってそれでやりませんか」みたいなことを言ったわけです。
一回ベタでやり始めるとヘボイなりの”資産”(関数満載のincludeファイルとか)ができちゃってそれを手放さなくなって寒い方向に行きそうだったので無茶承知で言いました。
そんな暴言を許してくれるんだからその人はズバ抜けて寛大と言えましょう。
フレームというぐらいなのでまず単に枠(ファイルの配置とかの取り決め)を作ります。
そのあと以下のようなWebアプリに必要な処理を用意していきます。
・エラーの処理
・ログの処理
・Requestの処理
・Templateの処理
・Databaseの処理
PHPの場合はTemplateはSmarty、DatabaseはPEAR::DBなんぞを使うので本当に枠だけって感じになります。
一番悩むのは”DBとの繋ぎ目をどうするか”です。
コレ、普通にやってるといきなり感じると思うんですが、
「データベースって何だよ!全然OOPじゃねーじゃん!」
とか思ってしまいます。感覚的に全然違うじゃん!と思って調べてみるとそもそも
プログラム :OOP(Object Oriented Programing)
データベース : DAO(Data Oriented Approach)
で全然考え方が違うっ!
単純に例を考えると、一つの商品に対応するItemsクラスを作るとする。DBにはItemsテーブルがあるとして、ItemsクラスはItemsテーブルのカラムに対応するプロパティを持っている。
ここで1000個のItemsオブジェクトを生成するとデータベースにSQLを1000回投げることになる。そんなもんベタ書きで一回のSQLで1000個持ってくりゃいいじゃねーかって話になる。
問題はそんな単純なことじゃないかもしれないけど要するにかなり厄介らしい。PHPでもそのへんをうまくやってくれる(予定)のDB_DataObjectというのがあるがまだこなれてないらしい。PerlのClass::DBIは結構使われてるのに。
「SQLがムカつくんですよ」
と会社の人に言ったら単にSQLがわかんなくて苦労していると思われた。この辺をいきなり導入するのはちょっと無謀か・・・。
そもそも、DOAの手法は、データ分析、リレーショナル・データベースの設計から実装、メンテナンスまで一貫したモデル駆動型開発として業務系システムを構築する際に活用されており、現在でも多くの開発者がこの手法を採用している。一方、オブジェクト指向言語を使うOOPは、プログラムの部品化や再利用を想定し、データとその振る舞いをカプセル化してしまう。このため、データを独立させるDOAとOOPを融合させることは不可能ではないものの、煩雑な手続きを必要とした。同社ではUML一辺倒の風潮に警鐘を鳴らす意味も込めて、「オブジェクト(O)-リレーショナル(R)マッピング」技術を実現する製品を投入し、自社で開発したアドオン製品を加えて、1つのソリューションとすることで、ソフトウェア開発の方法に新しい道を示そうとしている。
PHPを勉強しなきゃならないので興味無い人には一生糞の役にも立たないことを書きまくります。
■PerlユーザーのためのPHP
PerlやってたんでまあPHPもそんなにかわらんだろうってことでとりあえずPerlでいうHTML::Templateみたいなもんはどれなのか探しました。(CGIモジュールはPHP自体に入ってるようなもんっぽいです)
そもそも「PerlはHTMLの中に書けないからTemplate使うだけでPHPならいらねーじゃん」っつーのがあるかもしれません。おれ自身も「そんなことはないっ!MVC最高!」とか実感が持てるようになったのは結構最近の話。PHP界でそーゆーのを探すといきなりSmartyという奴が見つかりました。PHP標準テンプレート!とかどっかにかいてあったので有名なんでしょう。それ以前に相当良い名前してるところが気になる。すっごいスマーティ。
まとめ
・CGIモジュールの機能はほどPHP本体にある。
・Template-Toolkit(Perl) = Smarty(PHP)
Smartyをインストールといっても単なるPHPのクラスなので適当なところに置いてパス通すだけです。
公式ページからダウンロード。
適当なところに解党してlibsフォルダを好きなとこにコピー
参考 - http://www1.plala.or.jp/AGL/proevo/PHP/install/smarty_2.5.0.html
cd /tmp
tar -zxvf Smarty-2.5.0.tar.gz
cd Smarty-2.5.0
mv libs /usr/local/lib/php/Smarty
Smartyへのパスをinclude_pathに追加する。
include_pathはphp.iniで設定します。
Windowsなら c:\WINNT\php.ini とかで
UNIXなら /etc/php.ini とか /usr/local/lib/php.ini とかにあります。
include_path = ".:/usr/local/lib/php:/usr/local/lib/php/Smarty/libs"
(↑UNIXの場合の設定)
Apacheを再起動してphp.iniの設定を反映。
/etc/rc.d/init.d/httpd restart