今日もWEB更新してたら -3ページ目

勉強会資料

勉強会用の資料まとめ。



HTMLの成立と歴史。


 SGMLとXMLとTexとそしてHTML。HTMLが目指すものは文書に意味づけ。XMLの目指すものはデータの階層構造の表現。


見えるものがすべてではない。見えないものを信じる。


 既成概念を疑いなさい。

ブラウザが違えば表現が違う。

IE3~IE6経緯

NNとのブラウザ開発競争

サーチエンジンのプログラムにはページは如何にに見えるか?

縦書き?横書き?右から?左から?


JavaScriptとJScriptからDOM成立そしてAcitonScript



Javaの語る未来。



コンテンツとスタイルの分離。


media attribute



雑談

GooglePage Rank 10/10 はW3C

トピックリーディングとパラグラフ?。センテンス

練習

新聞の折り込みチラシ。マクマリーなどの洋書を見れば、H1の意味が理解できる?

Smartyの文法エラーをSmartに処理する

Smartyの文法エラーしょりはPHPのエラー関数を利用している。なので、ウッカリするとブラウザにSmartyのエラーを見せてしまうことになる。


Smartyには例外処理が存在しないのでどうしてもこうなるのと、PHP4.xでは例外handlerが綺麗じゃない。後方互換性を意識しての仕様かも。


そこでSmartyのエラーをなんとか処理したい。

/**
* display Smarty syntax error
*
* @param string $error_msg
* @param integer $error_type
* @param string $file
* @param integer $line
*/
function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null)
{
//なーーーーーんもしない
// return $error_msg;
}





こんな風に、関数をオーバーライドするといける希ガス



Smartyにはdefault Tag Handlerが見あたらない

変数のデフォルト Default タグ variable default

Modiferのデフォルト default_modifer

テンプレートのデフォルト default_templage

テンプレート保存先のデフォルト defalt_resource


は存在する。


しかし{TAG}のデフォルトhandlerは存在しない。


なぜか?

メーリングリストのこのあたりで議論されている。

http://marc.theaimsgroup.com/?l=smarty-general&w=2&r=1&q=b&s=smarty+default+tag+handler


http://marc.theaimsgroup.com/?l=smarty-general&m=100106228615651&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100106822101428&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100109839415897&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100109893017616&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100111517104523&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100116882731193&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100131586326421&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100140433821352&w=2

http://marc.theaimsgroup.com/?l=smarty-general&m=100140581225861&w=2



書いてあることでは、Online Template エディターを実現しようとするとUnrecognizedTagで処理が止まってしまうのは大変だ。


しかしDefault_Tag_Handlerを入れると、バグがどこ出てているかわかりにくい。

バグ報告がないと単純なスペルミスなんてどうやって発見するんだよ。



みたいなことが書いてある。

Javaで可変変数を実現する。

PHPPerlには可変変数という便利なモノがある。英語ではVariable variables という。


クラスの中からクラスを呼んだり、関数内で変数を呼び出すときに便利だ。初心者向けの本にはあまり使わないと、書いてあるけど。Pearのソースコード読むと頻出する。つまりそれだけ便利だと言うことだ。


 mod_rewrieを黒魔術と呼ぶなら 可変変数は 召還魔法といったところか。


で、これをJavaでやるには。。。ちと、苦労する。

java.lang.Class クラスと java.lang.reflect  パッケージを利用する。


可変変数にしたい変数を持つオブジェクトをインスタンス化し、それをJavaVMから呼び出す。

召還魔法の比喩がぴったり。


まず動作例 と ソースコード。

import java.lang.reflect.*;

public class Test{
public static String test1 = "hoge";
public String test2 = "foo";
protected String test3 = "bar";
public static void main(String[] args) throws Exception{
// クラスの取得
Class cls = Class.forName("Table");
Table record = new Table();
//フィールドの取得
Field fld1 = cls.getDeclaredField("column1");
fld1.set( record, "aaa" );
System.out.println( record.column1 );
}
}

class Table{
public String column1 = "";
public String column2 = "";
public String column3 = "";
public Table(){
//
}
}


でもって実行すると


/home/usr/test>aaa


空文字が格納されているはずのcolumn1 フィールドに aaa が代入されている


動作原理は、召還魔法。Classというクラスをインスタンス化(召還)する。召還にはjava.lang.Object#getClass()のメソッドを利用する。


JavaではすべてのインスタンスはObjectを継承してるのでどのクラスも召還出来る。


召還後、変数の中身をいじるには、

fld1.set( record, "aaa" );

としている。

第一引数は、召還したオブジェクト第二引数は召還したオブジェクトに代入する値fld1 は召還したオブジェクトのフィールドを抽象化してFieldとしたもの。

この設定方法がちょっとややこしいかも。


同じように、召還したオブジェクトのメソッドを使うことも出来る(invokeメソッド)。これはオブジェクト継承すればいいのであまり使わないかも。


注意)

Javaはオブジェクト指向言語なので、オブジェクトカプセル化されている。なのでprotected private の変数やメソッドを召還することできない。


なんでもかんでも召還できるとセキュリティーホールになるので、secruityマネージャーによってアクセス不能(召還できない)にされているオブジェクトがある。


参考URI

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

http://www-128.ibm.com/developerworks/java/library/j-dyn0603/


http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Class.html

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/reflect/Field.html

Smartyの文法チェック

テンプレートエンジンが大きいと、テンプレートのSyntaxが重要になる。

そこでSmartyのSyntaxをvalidateするvalidatorが欲しくなる。


だけど、PHPに基づく文法チェックのみ。


SmartyのERROR処理はPHPのtrigger_errorを使っているので実に頼りない。


try ~ catch 出来ないし、エラースタック積むのも大変だし、かといってPearのパッケージに準拠してるわけでもないし。。。



Smartyテンプレートのエラー処理をPear_Errorに対応させるaddon書くとしても、それはSmartyのSuggestionで提案されるだろうし。。。http://smarty.incutio.com/?page=SmartyFeatureSuggestions


かといって独自にextendsしちゃうとSmartyのUpdateが面倒だ。


SmartyValidatorというSmarty継承クラスを作ってる人がいるので、これでしばらくは凌ぐことにする。

http://www.phpriot.com/d/code/smarty/smarty-validator/index.html


たった100行程度なので自分で作っても良かったわけですが。。

Smarty:StringをSmartyに処理させるには?

Smartyはファイルを読み込んで実行しかできないと思っていた。

$smarty->display("file:FILE_NAME");


$smarty->display( $string_template );

に出来ればいいなと思っていたら、出来るんですね。

http://smarty.incutio.com/?page=resource_string

SmartyにStringで文字列をHTMLに変換させるプラグインがあったりします。


/*
* Smarty plugin
* -------------------------------------------------------------
* Type: resource
* Name: string
* Version: 1.1
* Author: Joshua Thijssen
* Credits:
* Purpose: using php strings as smarty resouces
* Input:
*
*
*
* Examples: $smarty->display ("string:<b>{$foo}</b>");
* -------------------------------------------------------------
*/

サニタイズ

sanitize
【他動】 衛生的にする、消毒する、不適切な[好ましくない]部分を削除する◆【同】clean
【発音】sae'nэta`iz、【分節】san・i・tize


sanity
【名】 正気{しょうき}、健全{けんぜん}さ
・ His drug use took its toll on his sanity. 彼は薬物を乱用して、正気を失ってしまった。
【レベル】8、【発音】sae'nэti、【@】サニティ、【分節】san・i・ty


sanitize user's http request

HTTPでユーザーからのリクエストをサニタイズする


これを消毒と翻訳するのはどうも違和感がある。ワームを取り除くという意味で防虫の方が良いような気もするが。不適切な[好ましくない]部分を削除する意味で訳さないのはどうしてなんだろう?


同義語のCleanでも良いだろうに。なぜ真っ先に消毒になるかなぁ。


まだあった、Smartyの高速化

HTTP Response 304 とキャッシュ以外にまだあった。

Smartyの高速化。


http://smarty.php.net/manual/en/variable.use.sub.dirs.php



$smarty->use_sub_dirs = true


にすることで、OSにかける負担が減るため処理の高速化が図れると書いてある。キャッシュフォルダは確かに強烈なファイル数になる。これは使えそうだ。


あともう一つ、

テンプレートやSmartyに割り当てた変数からいっさいのホワイトスペース( \s )を取り除く。ホワイトスペース取り除くにはOutputFilterにプラグインを登録すると良いだろう。



これをすると、tableレイアウトが素直に言うこと聞いてくれたり、\t \s が無くなるので処理量が減る。


http://smarty.incutio.com/?page=SmartyTips
つまりすべてが終わって出力前に行う操作だ。(gzip処理なんかもここに登録する)


SmartyのGzip plug-in。最近見つけた。まぁプラグイン使うより、php.ini書き換えた方が手軽だけどね。

http://smarty.incutio.com/?page=GZipPlugin

Smartyはgzip&deflate しない。

Smartyは内部でob_start(); ob_get_content(); ob_clean();をしてる。


なのになぜか、gzip や deflate による圧縮に対応していない。304に対応しているのに、gzipの設定をする変数がなかった。


Smartyがサポートしない。これはどういう事だろう・・・・だからPHP のgzip関数のマニュアルに立ち返ってみた。。


出力制御 ob_gzhandler() http://jp2.php.net/ob_gzhandler
zlib 圧縮関数 http://jp2.php.net/manual/ja/ref.zlib.php#ini.zlib.output-compression


PHPの基本設定に設定がある。PHPが自動的に圧縮して送信可能か否かを判断してgz圧縮送信する。

PHPでgzip圧縮をするにはob_start()時にオプションで指定する。


「Smartyでサポートするほどのことではない」 「Smartyテンプレートで管理者とユーザーの設定が競合するかも」 そういう理由なんだと思う。


だからgzip を使うにはmod_deflate / mod_gzip または ob_gzhandler または php.iniの3択。一番簡単なのはiniset()することだと思う。htaccessに以下の行を足した

php_value zlib.output_compression "1"
php_value zlib.output_compression_level "1"



gzipはApache側でも出来るけど、レンタルサーバーなら、まぁPHPでやるのも楽でよい。

テキストデータはgzip圧縮すると見違えるほど早くなった。ただし、圧縮レベルと圧縮バッファサイズの指定は自分で適切な数字を探すしかないようだ。


ob_start や iniset() で簡単に圧縮できるのでやらないと損です。

俺が借りてるレンタルサーバーはZendOptimizerが入ってる事が分かった。。


ZendOptimizer+Gzip+304+サーバー側キャッシュ。


たぶん考えられる限り高速化してある。ふっっふっふ。。あとは台数を増やした分散くらいか、DNSラウンドロビン、リバースプロキシ、コンテツサーバーとAPサーバの分離 等々。


Smarty ::BBcode_plugin

SmartyでBBCODE(*)を書くプラグイン。      

Smartyのプラグインを書こうと思っていくつかのサンプル調べてた。

Smartyのplug-inには2種類あって、


1:Modifer ex:{ $hoge | sample_modifier }
2:Function ex:{ sample_function } OR { ex_function }{ /ex_function }


とかイロイロ調べたんです。Pearのパッケージ使ってplug-in書こうと思いました。


Text_Wiki_BBCode http://pear.php.net/package/Text_Wiki_BBCode
HTML_BBCodeParser http://pear.php.net/package/HTML_BBCodeParser
Text_Wiki http://pear.php.net/package/Text_Wiki


これらを呼び出すplug-inにするつもりだった。


しかしSmartyの本家サイトのWiki(* )を呼んでるとBBCodeを処理するplug-inが紹介されていた。


Smarty_BBCodePlugin http://smarty.incutio.com/?page=BBCodePlugin



メソッドのAbstractionにはこう書いてあった。


/*
* Smarty plugin
* ------------------------------------------------------------
* Type: modifier
* Name: bbcode2html
* Purpose: Converts BBCode style tags to HTML
* Author: Andre Rabold
* Version: 1.4
* Remarks: Notice that this function does not check for
* correct syntax. Try not to use it with invalid
* BBCode because this could lead to unexpected
* results ;-)
* It seems that this function ignores manual
* line breaks. IMO this can be fixed by adding
* '/\n/' => "<br>" to $preg
*
* What's new: - Rewrote some preg expressions for more
* stability.
* - renamed CSS classes to be more generic. (Example
* CSS file attached.)
* - Support for e....(以下略 原文 を参照してください)
* ------------------------------------------------------------
*/


このメソッドは、SmartyのModiferですよ。このメソッドはBBCODEの文法チェックはしませんよ。とか出力の色分けはCSSで定義しなさいよ?とか書いてあるわけです。(改行の扱いは自分で決めろよ?とも書いてある)


このプラグインが変換するBBCODEのHTMLはCSSのクラス定義になっていて

ul.bb-list-unordered { }
ol.bb-list-ordered { }
ol.bb-list-ordered-d { list-style-type:decimal; }
ol.bb-list-ordered-lr { list-style-type:lower-roman; }
ol.bb-list-ordered-ur { list-style-type:upper-roman; }
ol.bb-list-ordered-la { list-style-type:lower-alpha; }
ol.bb-list-ordered-ua { list-style-type:upper-alpha; }
ol.bb-listitem { }

.bb-code,
.bb-php {
border: 1px solid black;
padding: 10px;
font-family: Courier;
white-space: nowrap;
}

.bb-quote {
border: 1px solid black;
padding: 10px;
}

.bb-email { }
.bb-url { }

.bb-image {
border-width: 0;
border-style: none;
}

こんな感じで書くと良いですよと、サンプルが提示してある。



このプラグインはModiferなので、使い方は簡単。


<div class='bbcodearea'>
  { $hoge | bbcode2html }
</div>



登録方法はソースコードを Plugin-dirに放り込んでおけばいいだろう。


(*)BBCODEとはWikiやXOOPSなどで使われる書式。(たぶんphpBBが由来)