タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2007/05/04/Etag, If-Modified-Sinceヘッダーメモ(2) | msakamoto-sf | 2009-03-29 23:08:52 |
日記/2007/05/04/Etag, If-Modified-Sinceヘッダーメモ(1) | msakamoto-sf | 2009-03-29 23:07:12 |
PHP/HTTP DateとGMTの処理について実験メモ2 | msakamoto-sf | 2009-03-29 23:02:53 |
PHP/HTTP DateとGMTの処理について実験メモ1 | msakamoto-sf | 2009-03-29 23:00:57 |
日記/2007/05/08/プログラミングに適した等幅フォントなど。 | msakamoto-sf | 2009-03-29 22:55:17 |
日記/2007/05/08/Unicows.dll に関するエラー。 | msakamoto-sf | 2009-03-29 22:54:15 |
日記/2007/05/13/JavaのClassLoader, クラスローディング関係の資料 | msakamoto-sf | 2009-03-29 22:52:08 |
日記/2007/05/27/References in PHP: An In-Depth Look(Derick Rethan) | msakamoto-sf | 2009-03-29 22:49:35 |
日記/2007/05/27/Understanding Class.forName() | msakamoto-sf | 2009-03-29 22:47:28 |
日記/2007/06/09/UUID, GUIDのリンクまとめ書き。 | msakamoto-sf | 2009-03-29 22:42:02 |
で、肝心のEtagの内容。これは単純に、コンテンツの内容が変わっていないか識別する為のユニークな文字列、とのこと。
ただコレがIf-Modified-Sinceと絡むと面倒くさくなってくる。
う~~ん・・・Apache自身の挙動と、ブラウザ毎による挙動とで、訳分からなくなってきてるな・・・。例えば状況によっては、Last-Modifiedは変わらなくても、Etagを変えて更新をユーザーエージェントに通知したい場合も、あるのかも知れない。そうしたときが、落とし穴になるらしい。
ちなみにPHPでEtagを判別して、200か304かを判別してくれるクラスが
http://www.ryo.com/ryo/2005/05/23/9/
にあった。・・・前にもどこかで見かけたな。
という案配。う~~ん、やっぱり、CGIやPHPは、自己の責任でLast-Modifiedを管理。で、静的ファイルは、FileMatchを組み合わせてFileEtagディレクティブで、Apache側でEtagを付けちゃう。その場合は、i-nodeではなくてmtimeとsizeを元に作るようにしておく。
みたいな感じ。・・・こうしてみると、CGIやJava系は、なるほど。アクセス数が多いサイトの場合はApacheをフロントに立たせるという手法も必要になるわなあ。特にJavaのASでWebサーバの機能を提供している場合、ここまでカバーしてくれるのか?という場合もあるし。
If-Modified-Since/Last-Modifiedのペアの取り扱いは割かし楽だった。Studying HTTPの解説と、若干のPHP関数のマニュアル見るだけでどうにかできた。(filemtime関数は盲点だった・・・。fstatしてたよ、畜生。)
で、まあ基本はこれで行けそうなんだけど、ずっと前にキャッシュ周りで調べてたときにちらっと気になった "Etag" というヘッダフィールドについて調べてみた。
実はこれ、Studying HTTP には載っていない。では非標準ヘッダーか?と調べてみたら、
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
にあるように、RFC2616で規定されている。
で、ざっとぐぐってみたところ。まずは@ITにヒット。
まあ上記は、画像やstatic-HTML, CSS, JavaScriptなどがメインの話になってくるのでしょう。Apacheだと"FileEtag"というので、どの情報を基にEtagを生成するのかを指定できるみたい。Apache本家のマニュアルはこちら。
http://httpd.apache.org/docs/2.2/ja/mod/core.html
@ITの記事では、逆にFileEtagを画像などでも無効化する対策が載ってるけど、
http://dsas.blog.klab.org/archives/50602499.html
では単にMtimeとSizeだけを元に生成するよう調整している。確かに、静的ファイルは自らLast-Modified吐いたりするわけじゃないので、FileEtagがあるに越したことはない。
CVSとか使ったり、最悪、mtimeならtouchコマンドで偽造できる。Sizeはコピーしたなら一緒だろう。なので、FileMatchで静的ファイルにのみ自動でEtagを付けるようにするのは、割かし効果的な気がする。
しまった。date/gmdateで'r'フォーマットすればHTTP-Dateに直せた。いちいちgmstrftimeしてたよ・・・。
いや、正確にはRFC-2822のフォーマットなんだけど、中身的にはRFC822 (updated RFC1123)と同じ。
http://www.faqs.org/rfcs/rfc2822
→ 3.3. Date and Time Specification
http://www.ietf.org/rfc/rfc0822.txt
→ 5. DATE AND TIME SPECIFICATION
http://www.ietf.org/rfc/rfc1123.txt
→ 5.2.14 RFC-822 Date and Time Specification: RFC-822 Section 5
(単にRFC822で年が2桁だったのを、2-4桁に修正しただけ)
DOS> php -r "echo date('r');" Mon, 7 May 2007 12:06:51 +0900 DOS> php -r "echo date('Z');" 32400 > php -r "echo strtotime(date('r'));" 1178507255 > php -r "echo time();" 1178507267 > php -r "echo gmdate('r');" Mon, 7 May 2007 03:17:08 +0000
きっかけは画像を出力するPHPを作ってたときに、Last-Modifiedを作る必要があって。
で、
http://www.studyinghttp.net/header#Last-Modified
を読んでたらHTTP-Dateというのが出てきて、
http://www.studyinghttp.net/header#HTTP-Date
を読んでたら"GMT表記"が必要らしい。
・プログラミングコード用のフォント
http://anond.hatelabo.jp/20061209160227
http://www.lowing.org/fonts/
http://dicey.org/vlgothic/
http://mix-mplus-ipa.sourceforge.jp/
→VLGothicが最強に使いやすい。日本語は・・・Win上だとMS-Gothicになれきってしまったが、Linux上であれば
多分これが最強レベルに見やすいのではなかろうか。
また、Win上でも少なくとも0とOの見分けをつける上でも、おそらくこれは使いやすいほうであろう。
次点でM+2P+IPAG-circle.ttfとなろうか。
あるマシンで、VLGothicを使用してOOWriter→PDF出力したのを、別の、VLGothicが入ってないマシン上で表示できるかチャレンジした。
で、別のマシンって言うのが、非常にPureなWin2kマシン。AcrobatReaderすら入れてなかった。で、ar7.0.9を入れて、いざ読ませようとしたら
Unable to load Unicows.dll
と怒られた。
適当にぐぐった結果、以下のWikipediaを発見。
元々Win9x系のアーキテクチャでUNICODEを扱う為のレイヤーDLL。らしい。
・・・Win2kなんだけど・・・。
ともあれ、入れてみて、実際直ったから、Win2kでも一定の効果?かも知れない。
というか・・・MediaPlayerすら入れておらず、Office2kだけだからなあ。WinXPまで引き継がれているmultimediaや開発環境系のソフトを全く入れていないから、それが影響しているのかも知れない。
とりあえず、いざという時は役立つかも知れないので、書き留めておく。
とりあえず、暇つぶしに調べてたののURL関係だけ。
http://www.nextindex.net/java/classloader.html
http://www-128.ibm.com/developerworks/java/library/j-dclp1/index.html
http://www-128.ibm.com/developerworks/java/library/j-dclp2.html
http://www-128.ibm.com/developerworks/java/library/j-dclp3/index.html
http://www-128.ibm.com/developerworks/java/library/j-dclp4/index.html
http://www.nminoru.jp/~nminoru/java/class_unloading.html
・・・なに、このヒト。Javaバイトコードまで読んでる。吹っ飛びすぎ。
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/class-loader-howto.html
http://www.sk-jp.com/mt/philosophical/archives/2005_04/05_224941.html
一応、
http://www.nextindex.net/java/classloader.html
に書いてあったのと同じコードをJDK1.6.0_01で試してみたら、同じ結果になった。
??何か、仕事先で適当に試したら、JDK5だと、CLASSPATHも、lib/extも、全部BootStrapLoader
が読んでないか?・・・みたいな結果になったんだけど。但し、全然違うコードだけど。やり方が悪かったのかな?そっちのコードだと、エントリポイントのクラスも、全部 class.getClassLoader()がnullなんだけど。う~~ん・・・あとで、変な結果になったソースコードも改めて検証してみよう。暇な時に、気が向いたら。
うお、いつのまにこんな機能が!?って、JDK5からか・・・。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/vm/class-data-sharing.html
あ、だからか・・・そういや、確かに、-verbose:class したときも、み~~んな
[Loaded ***** from shared objects file]
みたいに表示されてた。つまり、共有クラスキャッシュに入ってるら、BootstrapLoaderにみ~~~な読み込まれちゃうわけだ。
-Xshare:off
すれば、無効化できる。
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.6.0_01\jre\lib\rt.jar]
・・・みたいな感じになる。ただ、その分実行速度がめちゃくちゃ遅くなった・・・。
日本語では中々・・・というか皆無な、PHPの最大の汚点、変数の「参照」の内部詳細について、xdebugの開発者のDerick Rethanが、2005年6月のPHP architect誌に掲載した記事。
http://www.derickrethans.nl/files/phparch-php-variables-article.pdf
Rethan氏のその時のBlog:
http://www.derickrethans.nl/variables_and_references_article.php
PHP|architect誌のバックナンバー:
http://www.phparch.com/issue.php?mid=59
すんっっっっごい貴重。ZendEngineも2になって多少は変わってると思うけど、喉から手がでるほど(いや、実際自分でzval周りのコードを漁ろうと手を出してはいた。途中で頓挫したが。)欲しかった情報。
英語版のPDFは、Googleからは参照できるが、Rethan氏の対応する記事からはリンクが張られていない。そのため、ひょっとしたらでもなく著作権上まずいかも。
http://www.javageeks.com/Papers/ClassForName/index.html
より。
JDK1.0 - 1.2の境目で発生した、ClassLoaderの委譲モデルの変更点とその影響の解説、がメインといえばメインなんだけど、SunのJavaVMにおけるClassLoaderの構成や、JavaVMSpecの2nd以降のClassLoaderの親子関係、委譲モデル、Extension ClassLoaderに読み込ませるときの問題点などを丁寧に扱っている。
惜しむらくは、親サイトの
http://www.javageeks.com/index.html
のリンクが色々とおかしくなってて現状機能していない事か。
まあPDFはローカルにDLしたからいいけど。
ClassLoader周りは、この辺りの「基本」が分かっていないとTomcatや各種APの該当解説ページを見ても「何を言っているのか理解不能」な領域である為、こういうのがあると非常に助かる。
ExtClassLoader(JAVA_HOME/lib/ext*.jarを自動ロードするClassLoader)から読み込まれたクラス内で、CLASSPATH上にあるクラスをClass.forName()で牽こうとすると、クラスが見つからない。何故か。それはExtClassLoaderの親がBootstrapClassLoaderになってしまうため、CLASSPATHが検索対象に入らないからだ。
で、上記PDFではその解決方法としてThead.getContextClassLoader()で取得したCLを、Class.forName(完全限定名, クラスの初期化是非, CL)に渡す手法が述べられている。
確かに、ThreadをCLASSPATH以降でロードされたクラス内で生成するのであればこの手法が間違いない。但し実際にTomcatのCLツリーなどは専用のドキュメントが用意されているほど独特なので、そちらに合わせるが吉、か。
えっと、Open Source Foundation(OSF) の Distributing Computer Environment(DCE)の一部として標準化されて居るみたい。MicrosoftではGUIDとも呼ばれてて、開発ツールに生成ツールがくっついてくる。UNIX系だと、ext2/ext3のファイルシステムで使われている為、例えばJManによるとe2fsprogsに生成ツールが含まれている模様。
その実体は128bit(16byte)データ。通常は16進数で表現する(32桁)のだけれど、適当に5つに区切り、ハイフンで繋げるみたい。なので、正味16進数32桁+4つの"-"で36文字になるみたい。
http://jp.php.net/manual/ja/function.uniqid.php
とかで、かなりUUIDの生成で白熱?した議論が続いている・・・。