Home

memo-space

PHP のセッション共有(その2)

  • 2006-09-29
  • php

ひき続き Sharedance について調べてみる。PHP の標準のセッションハンドラである mod_files.c と見比べてみると、

  • flock していない

    一瞬はシングルプロセスだから必要無いのかなとも思ったけどそうでもないよな。まあ必要にあるケースはけっこう稀かもしれないけど、検証してみたい。

  • ディレクトリ階層を指定できない

    セッションデータをファイルとして保存すると 1 つのディレクトリに大量のファイルを作ることになる。このことによるパフォーマンスの低下を防ぐために PHP の標準セッションハンドラでは、session.session_save_path にディレクトリ階層を指定することができる(ということをソースを読んで初めて知った)。これがどれくらい影響するかわからないけど。 しかしどこかにセッションハンドラのパフォーマンスについて調べたデータとかないのかな。

さてそろそろ動かしてみるか。

PHP のセッション共有

  • 2006-09-27
  • php

Sharedance をちょっといじってみた(正確にはまだソースしか見てないけど)。

複数の Web サーバ間で PHP のセッション共有ができるものとして知られているみたいだけど、 実際にはとにかくキーと値のペアを TCP/IP 経由で fetch/store できるようにするというもの。

だからちょっとしたデータベースがわりにも使える。PHP 単体でもデフォルトのセッションハンドラに PHP からアクセスできれば便利なのになとちょっと思ったけど、まあ GDBM とか使えばいいんだけどさ。

あと libevent は便利そうだ。

しかし、たったこれだけの為にサーバーを作って独自のプロトコルを作るというのも何か悲しい感じがする。別に http でもいいんじゃないのかな。つまり、セッションを集中管理するためだけの apache を 1 つ用意しておく。

なんてことは世界で 2000 万人くらいの人が考えているかもしれない。なんか最近の PHP 事情をよくしらないからちょっと恥しいが思いついたので書いておこう。セッション管理する側はこんな感じ。

<?php
/* ppss.php */
if (empty($_GET["m"]) || empty($_GET["key"])) {
    exit;
}
session_id("ppss" . $_GET["key"]);
session_start();
if ($_GET["m"] == "f") {
    echo $_SESSION["data"];
}
else if ($_GET["m"] == "s") {
    $_SESSION["data"] = $_GET["data"];
}
?>

fetch と store だけで delete が無いのは手抜きです。もういっそ、fetch.php とか store.php ってファイルを分けちゃった方がいいかもしれない。 セッション ID にプレフィックスを付ける必要は本当は無いんだけど、1 台のマシンで試験しようとすると flock して悲しいことになるので付けてある。

セッションハンドラと使う側はこんな感じ。

<?php
$PPSS_URL = "http://xxxxxxxxx/ppss.php?";
/* for PHP4
function http_build_query($params) {
    $p = array();
    foreach ($params as $key => $val) {
        $p[] = urlencode($key) . "=" . urlencode($val);
    }
    return implode($p, "&");
}
*/

function session_handler_open($save_path, $session_name) { return TRUE; }
function session_handler_close() { return TRUE; }
function session_handler_delete($key) { return TRUE; }
function session_handler_gc($timeout) { return TRUE; }

function session_handler_store($key, $data) {
    global $PPSS_URL;
    $url = $PPSS_URL . http_build_query(array(
            "m" => "s",
            "key" => $key,
            "data" => $data));
    file_get_contents($url);
    return TRUE;
}

function session_handler_fetch($key) {
    global $PPSS_URL;
    $url = $PPSS_URL . http_build_query(array(
            "m" => "f",
            "key" => $key));
    $data = file_get_contents($url);
    return $data;
}


session_set_save_handler('session_handler_open', 'session_handler_close',
             'session_handler_fetch', 'session_handler_store',
             'session_handler_delete', 'session_handler_gc');


session_start();
if (!isset($_SESSION["count"])) {
    $_SESSION["count"] = 0;
} else {
    $_SESSION["count"]++;
}

echo "count = " . $_SESSION["count"];
?>

パフォーマンスとかはあまり考えていない富豪的アプローチだけど、まあメリットとしては手軽さと、apache + PHP だけで動いているというプラットフォームに対する信頼性か。パフォーマンスが欲しければ apache モジュールにしちゃうのもそう難しくないだろう。

筆記用具ヤケ買い

ムシャクシャしてやたらと筆記用具を買ってしまった。後悔はしていない。

筆記用具やけ買い
筆記用具やけ買い posted from フォト蔵

ユニ パワータンク スタンダード(ノック式)0.7

現在、油性ボールペンの人気を Dr.Grip G-SPEC と二分する一本にして、僕の油性ボールペンへの認識を変えた一本。あーちなみに私は太い軸が苦手なので Dr.Grip は使ってません。

3000hPa の加圧リフィルからくり出されるインクは、ダマになったり擦れたりすることがかなり少ない。(なんだけどネット上ではけっこうダマになると言っている人も多い。俺の書き方の問題なのか)。

やはり油性ボールペンの良さは、その使える範囲の広さだ。感圧紙に使うなら油性ボールペンが一番だし、上からラインマーカーを使っても滲まない。加えてこの POWER TANK は濡れた紙や無重力や氷点下でも書ける(らしい。当然試してないけど)。

タプリとパワタン
タプリとパワタン posted from フォト蔵

写真は上が POWER TANK、下が ZEBRA TapliClip。ノック式のボールペンでは(この TapliClip のように)軸と芯の間に遊びがあって書く時にカチャカチャしてしまうものがあるが、POWER TANK はこの隙間が埋められているの(黒い部分)がおわかりだろうか。

このクォリティで 200円という低価格のうえ、コンビニでも入手可能。凄い、凄すぎる。 普通のボールペンにできないことを平然とやってのけるッ!そこにシビれる!あこがれるゥ!

ユニ ジェットストリーム 0.7

今話題の新製品。低粘度油性ボールペンという意味では Dr.Grip G-SPEC のライバルはこちらかもしれない。 また、油性ボールペン特有のインクの紫っぽさがなくはっきりと黒いのも特徴(写真で伝わるかな)。なんだけど、どうも擦れがひどい。ネットではそれほど評判は悪くないようなので、個体差かもしれない。

ZEBRA テクノライン 0.4

油性ボールペンって普通 0.7 か 1.0 で、0.4 って書いてみるとびっくりするくらい細いです。手帳用に使っていた TECHNO LINE EX が気に入ったんだけど、いかんせん軸が細くて握り辛いので、中身が同じで軸が太い TECHNO LINE を買ってみた。

感想としては、良くも悪くも予想通り。線は細いし軸は握り易いが、結果的にどこで使っていいのかよくわからないw。ちなみに TECHNO LINE EX の方は軸が細いので、リングノートのリングに入れてます。

あと、うっかり Pelikano junior 買ってしまった。万年筆には手を出さないつもりだったのに。まあこれなら一本持っててもバチはあたるまい。油性ボールペンとは大分書き方が違うのでちょっとまだ思うように使えてない感じ。

日本版ポリティカルコンパス

「各人の政治的および経済的立ち位置を調べる」という、ポリティカルコンパスの日本版をやってみました☆

w h e a t n o o d l e s . o r g: 「日本版ポリティカルコンパス」

というわけで参戦。でもこの質問難しいね(特にQ2の方)。きっと何度かやれば結果も違うとおもう。結果は、

  • 政治的な右・左度(保守・リベラル度) -0.4
  • 経済的な右・左度(市場信頼派・政府介入派) 0.93
  • あなたの分類は リベラル右派 です。

大きく偏ることはないだろうなとは思ってたけど、予想以上のど真ん中っぷり。自分では政治的右派かなと思ってたんだけど。

9月21日のどうでもいいこと

色々考えごとしながら帰宅しようと思ったら、逆方向の地下鉄に乗っていた。自分の注意力あなどれない。

ちょっと遅いが、

2006年9月6日は、多くの人々が待ちに待っためでたい日となった。いやめでたい。実にめでたい。

H-Yamaguchi.net: めでたい日に思う より

マスコミのバカ騒ぎっぷりにもウンザリだし、問題は何も解決していない。というか高度な釣りだ。

くそがっ!あのクソガキめが!!大人を馬鹿にするとひどいめに遭うぞ!くそっくそっ、次にあったら筆下ろししてやる。許さない、絶対許さない。

nonomachon2ndの日記 - 列車の窓から景色を楽しみながら より

この人の日記どこから読んでもいいんだけど、面白い。ちょっとライ麦畑を思い出してしまった。より今風に訳せば、ホールデン君も「死ねよワーキングプアめ!」とか言うのかな。そんなライ麦畑も読んでみたい。

まあとにかくこの人すごいな。

高校生の時、初めてこの本を読んで、何が面白いのかさっぱり分からなかった。

peanutsjamjamの日記 - カフカ『変身』 より

そういえば俺も初めてライ麦畑を読んだとき、何が面白いんだかよくわからなかったなぁ。まあホールデン君より大分若かったし。

あとちょっと前に、「海辺のカフカ」を読んでその感想について、その昔初めて私に村上春樹を勧めた peanutsjamjam と話した。

  • あまりの自由っぷりに(それが芸風なんだけど)村上春樹を読んだこと無い人には厳しいんじゃないかなぁと思うんだけど、これが海外で評価されているのは意外。
  • 序盤の、別の話が交互に出てくるところは「続き読ませろよ!」という感じで疲れた。
  • 後半は、とにかくホシノ君が良かった。

小説って、書いてる本人すら絵が浮ばないようなものでも書いちゃえば勝ちみたいなところがいいよね、とかいう話をした。 そいういえばダンスダンスダンスの中に、「紀ノ国屋のレタスはよく調教されている」(どんなんだよ)とかいうのが出てくるんだけどああいうのは絵では表現しようがないよね。

あと札幌に住んでいると、紀伊国屋というと本屋しか思い付かないんだけどe-kinokuniya 紀ノ国屋のことだったんだな。

図書館のレファレンスサービス

なんか眠れないのでまた書いてしまうよ。最近心がささくれだっているのでウトウトしか眠れない。いかに自分の心がささくれだっているかを書こうかとも思ったけど、途中からそれをどう第三者的に面白く書こうかという余計な感情が湧いてきてアホらしくなってきたのでやめとく。多分生理みたいなもんです。

苫小牧市立図書館 - Amazon 検索 を作っていたら図書館についていろいろ興味がわいてきた。 図書館というところが何かしら調べもののお手伝いをしてくれそうな印象は漠然とあったんだけど、それを利用したことはなかったし、そのことをレファレンスサービスと呼ぶことも知らなかった。要するに人力検索のプロ。

で、レファレンス共同データベースという、こんな調査テーマに対してはこう調べれば良い、という事例データベースみたいなものがあるそうです。つまりその人力検索の中の人が活用するデータベースということだと思います。

例えばここの調べかたマニュアルのサンプルには、

とかこういうのがある、ということは、図書館はこういうことも調べてくれる(かもしれない)ということか。

これを知ったきっかけは、北海道立図書館が図書館向けに発行しているレファレンスに関する広報誌「Do-Re」で、Web 上から PDF で閲覧できます。

この中には、

情報館では10月下旬から、館内に掲示板を設置しています。レファレンスという図書館用語がまだまだ町民に浸透していなく、また利用も少なくはないのですが、図書館のお得な活用方法をより知っていただけるようにと思い作りました。

(中略)

情報館の利用に関することもありますが、子ども達が日常感じているふとした疑問が多いです。 “なんで空にくもがあるんですか?” “どうして季節があるんですか?”などです。 また、将来に関すること、“にんじゃになりたいんですが、 どうしたらいいですか”などもあります。

(レファレンスの森本さんの掲示板を設置 (本の森厚岸情報館)- Do-Re 26号より)

レファレンスの森本さんって、、、それ生協の白(ry

いいなぁ。俺もにんじゃになろっかなぁ。

JavaScript雑感

Livedoor Reader のソースを眺めていたらコロンキーで vi モードにはいることを発見した。調べてみたらやっぱり自分は 4 ヶ月ほど遅れていることに気がついた。

livedoor Readerとは - はてなダイアリー

(ブラウザ上で動く)JavaScript は、強制オープンソースだという魅力もさることながら、今まさに動いているプログラムに対して Greasemonkey とか JavaScript Shell とか使って動作を変更できちゃうというのが面白い。動いている心臓をバイバス手術みたいな。

苫小牧市立図書館 - Amazon 検索 を作ってみてやっと少し JavaScript がわかるようになってきた。何かしら新たな発見をしては、それについて調べてみると自分が 1 年くらい遅れていることに気付くというのの繰り返しだった。だいたいやりたいことは実装したけど、UI 周りをもうちょっと直したい。

言語としての JavaScript は、シンプルで自由度の高い言語。とはいえシンプルであることも自由度が高いことも言語としての価値であるかどうかは何とも言えない。単にそうなら Scheme がもっと流行ってるんだろう。でもまあまとまっていると思う。

この自由度の高さをフレームワークや IDE がどうコントロールしていくかというのが今後の JavaScript 界隈の動きになっていくんじゃないかな。Ruby という自由な言語が Rails という規約によって飛躍したように。(まあ Rails も真面目にやったことないんだけどさ)。

一方言語の本質とは別に、その歴史的経緯から、現時点では Web 上には古い情報が蔓延していてとてもググりずらかったり、あとプラットフォーム間の移植性というやっかいな問題はある。

JavaScript を学ぶには、まず初級はどこでもいいんじゃないかな。とほほさんの所あたりでもいいと思う。で次は「プロトタイプベースのオブジェクト指向」とか「プロトタイプチェーン」とかいうキーワードでググる。以下はまだ僕も全部読んだわけじゃないです。

で、そこを卒業したらとりあえず prototype.js でも読んでみるのが良いんじゃなかろうか。はっきりいって最初は全く理解できないと思う。例えば、冒頭の、

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

これが何をやっているか、はっきりいって僕は自力では理解できませんでした。幸い、その手のことをやっている人は他にもいるので、先人の調査結果を参考にするといい。

リファレンスとしての情報源は未だにどこを見て良いのかよくわからないけど、とりあえず MDC を見ている。

あと、 FireBugJavaScript Shell は便利だと思う。

はてブの「IMEをオフにして、、、」が邪魔

Scroll With IME という FireFox プラグインを使っていると、IME オンのままの状態でもスペースキーでスクロールできるんだけど、 はてなブックマークでは IME がオンの状態でキーを押すと、左下に「ショートカットキーはIMEをオフにしてご利用下さい」と出てきてスクロールできない。

Bookmark.keybind.remove("ime");

以上。

1行だけを保証する

Gapless Sequences for Primary Keys: Varlena, LLC | PostgreSQL General Bits Newsletter

PostgreSQL の SERIAL は値が連続していることは保証しない。じゃあ連続する値を得るにはどうしたらいいかという話。なんだけどその中で出てくる以下の SQL が面白かった。

-- Initialize table with one row on creation --
INSERT INTO emp_pk_counter VALUES (0);

-- Disallow further insertions and deletions --
CREATE RULE noins_emp_pk AS ON INSERT TO emp_pk_counter
DO NOTHING;
CREATE RULE nodel_only_emp_pk AS ON DELETE TO emp_pk_counter
DO NOTHING;

emp_pk_counter というテーブルに対して 1 行だけ INSERT しておいて、以降 INSERT も DELETE も無視してしまうという RULE を定義している。これで emp_pk_counter テーブルは 1 行だけということが保証される。設定値を保持するテーブルなんかに使えそうだ。

「鏡の法則」について思ったこと

今更だけど「鏡の法則」について書く。あるいは、何故僕がこの話に違和感を感じるのか。

「あなたの人生の現実は、あなたの心を映し出し鏡です」という考え方って怖いなあと思う。 たとえばこの子供はイジメにあって、で、イジメは無くなった。でも世の中には取り返しの付かない災いっていうのもあるんじゃないか。

例えば子供がイジメにあって自殺しました。「あなたの人生の現実は、あなたの心を映し出し鏡です」と言われました。息子を殺したのは自分だと後悔して生きていくこと以外に何ができる?

というか、人生に何か一つの解があると思うことが怖い。

いろいろ調べているうちに、この作者のblogのあるエントリに辿り付いた。 この人のblogはかなりの分量があるし、その一部だけを引用してケチをつけてもしょうがないんだけど、気にな内容だったので引用する。

幸せ成功力を日増しに高めるEQコーチング!毎日読めば目標達成力を多角度から強化できます!:成功法則が作用しない人はいるのか?

どんな困難に出会っても、「必ず実現する」という信念を持って行動し続 けたら、やがて、その信念が潜在意識の奥深くにまで浸透して磁石になり、 信じたとおりの現実を引き寄せて具現化するのです。

としながら、

しかし、こんなことを言う方もいらっしゃいます。

「私は数年前から、『自分は豊かだ!お金持ちだ!』と念じ続け、豊かな 人生を描き続けた。だけど、ぜんぜん豊かにならない。私には成功法則が 作用しないみたい。」 (中略) 主な理由は2つ考えられます。

(1)頭で思い描くだけで行動をしていなかったり、行動が中途半端になっている。

で、

「殺人事件で家族を殺された人は、それも自分の心が引き寄せたので しょうか?」といった内容のご質問も、これまで何人かの読者さんか らいただいてます。 (中略) 人生で出会う大きな試練はあらかじめ計画されたもので、必ずしも、自分の 心が引き寄せているわけではないと考えます。

あらかじめ計画された人生設計を土台にして、さらにその上に、自分の心が 引き寄せるものによって人生が築かれていくのだと、私は考えています。

これは僕の主観で読むと、

「強く思えた必ず実現します。でも思うだけではダメです。行動しましょう。でもあらかじめ計画された試練は避けられません」

もっといえば、

「強く思って行動すれば、願いが叶う場合もあります」

という風に読める。まあ、そうかもね。

currentいじってみた

PostgreSQLのcurrentをちょっといじってみた。INSERT .. RETURNINGとかUPDATE .. RETURNINGというのが追加されたみたい。 「INSERTやUPDATEをした行をSELECTする」を一度に書ける機能っぽい。

=# create table r (i serial, t text);
NOTICE:  CREATE TABLE will create implicit sequence "r_i_seq" for serial column "r.i"
CREATE TABLE
=# insert into r (t) values ('One') returning *;
 i |  t
---+-----
 1 | One
(1 row)

INSERT 0 1
=# insert into r (t) values ('Two') returning i;
 i
---
 2
(1 row)

INSERT 0 1

INSERT文なのにSELECT文のように行を返しているのがおわかりでしょうか。

今まではSERIAL型の列にINSERTした値を得るには、SELECT curval()しなきゃならなかったんだけど、その必要がなくなる。 なかなか面白いけど、またデータベース抽象化レイヤとか書いてる人は気をつけなきゃだめかもね。

あと、standard_confoming_strings の値が変更可能になってる。(デフォルトは off)。

=# select '\\';
WARNING:  nonstandard use of \\ in a string literal
LINE 1: select '\\';
           ^
HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
 ?column?
----------
 \
(1 row)

=# set standard_conforming_strings to on;
SET
=# select '\\';
 ?column?
----------
 \\
(1 row)

他にもいろいろありそうだけどとりあえず。

9月6日のいろいろ

なんか書きたいことがいっぱいたまってる。

弟「僕だって、好きでニュータイプになった訳じゃない(怒)!」

めぐみのホームページ1000 - 9月3日より

あいかわらずこの人面白いなぁ。終り方も秀逸。

でも愚痴を聞いていれば僕のことを話さなくていいので。沈黙がないので安心します。

@nifty:デイリーポータルZ:対人スキルが高すぎる人

凄い。沈黙を恐れるという消極的な理由でいろんなことに巻き込まれてしまう人。この人をモデルに小説か映画かなんか作ってほしい。

みなさんは、テストファーストだ、ユニットテストだ、と言いながら、実際は「テストに通って当り前」のテストしか書かずに済ませてしまっていないだろうか。そのようなテストはバグを見付けることにはあまり貢献せず、「次の実装の見直しにも合格する」ためのベンチマークにすぎなくなってしまっている

プログラマがテストも書くならば lightweight なランダムテストを試すといいと思う - Inemuri nezumi diary(2006-09-06)より

レグレッションテストってそういうものだと思う。

テストをもたらす勇気よりも、テストデータを大量に用意する鬱さが勝ってしまって、あーうーあーうーとげんなりします。

ここでテストデータ作成ツールですよ、と言うだけ言っとく。

レグレッション・テストに逆ギレ - capsctrldays (2006-08-08)

テストデータ作成ツールじゃなくて、テストデータをどうマネージメントするかという方向で問題は解決できないかな、ということを最近考えてる。

Refactoring Databasesの中にスキーマのバージョン管理という話が出てくるんだけど、それを読みながら、テストデータはバージョン管理の対象にはいるのかどうか、とか。

とにかく、ソースコードの外側にあるものをマネージメントするにはひと工夫必要だ。

9月5日のいろいろ

peanutsjamjamの日記 - 図書館にある本は買わずに済ませるためのナントカ その二 より。似たようなことをやろうとしている人はけっこういるらしく。

あと、関連事象を検索して目に付いたのがAmazon - 苫小牧市立図書館検索これ、ヤバいくらいにCool、Web2.0的ってのは見た目じゃないってことをわからせられた感じです。

natu_nの日記 - ISBNで検索出来ない図書館の続き より

褒められた♪(のか?)。

あと他にも

コードは自由になった。次はデータが欲しいんだ。Amazon Web サービスとか、Google Map とか、Livedoor Weather Hack とか。データを中心としたバザールモデル?(また勢いで適当なこと書いてます)。

次は何のデータが欲しい?時刻表とか、番組表とか。

アンチフルスタックという開発手法

また何となく思いついただけなんだけどさ。

Ruby on Railsみたいな「フルスタック」って、要するに最大公約数的?な手法だと思うわけだ。

「SQL を書かなくてもデキる」みたいなのとかもあるけど、SQL 書いちゃった方が楽な場合もあるわけで。

で、それぞれの構成要素が得意分野でベストを尽す、みたいな開発手法もあっていいなじゃないかなと。

クライアント側は JavaScript でテンプレートでも使って、サーバー側はひたすら JSON でやりとり。

画面遷移とか認証、セッション管理なんかは Apache でやらせる。Apache モジュールを C で書いちゃうのは究極だけど、mod_{perl,python,ruby} のフックを使ってやるのがいいと思う。ブラウザが「画面遷移してくれ」と Apache に通知する感じだ。

あと、トランザクションが必要ならもうデータベース側でストアドプロシジャにしてしまう。

そうすることのメリットはこれから考える。

Home

Search
Feeds
Profile
石田@苫小牧市と名乗りつつ札幌の某社に勤務するプログラマ
書いた本
Links

Page Top