Lost-Season: JSANライブラリでオブジェクト指向JavaScript
今日のJSANチェック。
どんどんライブラリが上がってきてます。Prototype.js の中から Class や Object.extend が抜粋されてますね。
そのうちAjax関連も上がってくると思います。てわけで、いくつか解説。
おお、Prototypeが読めない知恵の足りない子(俺)に最適のエントリ。
後で読むよ!
Lost-Season: JSANライブラリでオブジェクト指向JavaScript
今日のJSANチェック。
どんどんライブラリが上がってきてます。Prototype.js の中から Class や Object.extend が抜粋されてますね。
そのうちAjax関連も上がってくると思います。てわけで、いくつか解説。
おお、Prototypeが読めない知恵の足りない子(俺)に最適のエントリ。
後で読むよ!
第2回PHP勉強会inTokyoが開催されました – HotPHPPER News
6月より始まっているPHP勉強会の第2回が東京で開催されました。
PHP勉強会の第2回。体調を崩してしまって行けませんでした。残念。
次は是非行きたいです。
ishinaoさんのとこのこのエントリを見て衝撃を受けたのでソースコード検索エンジンのgonzuiを入れてみました。(debian sarge)
# apt-get install ruby1.8 ruby1.8-dev libdb4.1-ruby1.8
# wget http://jaist.dl.sourceforge.net/sourceforge/gonzui/gonzui-1.2.tar.gz
# tar -zxvf gonzui-1.2.tar.gz
# cd gonzui-1.2
# ./configure
# make
# make install
ACP5001APZは、D-Sub15ピン、Ethernet、シリアルポート、ステレオオーディオ出力、モノラルオーディオ入力、USB 2.0?4を備えたポートリプリケータ。プラグ&プレイ対応で、ノートPCのUSBに接続するだけで利用可能。
地味に素敵。メーカ純正の糞高いポトリに頭来てる人(俺)には最適!
PHP 4.4.0 ReleasedThe 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がリリース。バグ修正だそうです。
PHP: PHP 4 ChangeLogFixed 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元を全部修正したパッチを作りたいです。
2006/03/07追記: 修正版はこちら
引き続きセッション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
- 黄昏流星群 (23)
- 小学館(2005-03-30)
- (著)弘兼 憲史
- 定価:¥ 530
- 新品価格:¥ 530
- ASIN:4091873138
TGRGの23巻。
ドラマのプロットをそのまま読んでる感じ。
難しいビジネスや政界の話と違ってこういう話に物事を凄まじく解り易く説明する能力を適用するとこうなるのか!
そんな違和感がいちいち引っかかりになって楽しい。
複数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