Home

memo-space

勝手に添削「PostgreSQL VACUUM FULLせずに不要領域を削除する」

そういう時はdeleteではなくtruncateを使う方法もあります。 truncateはいきなりテーブルを(不要領域を残すことなく)空っぽにするSQLです。

Continue reading

CakePHP日記:requestActionとSecurityコンポーネント

  • 2007-10-26
  • php

なるほど。viewからrequestAction()を呼びだすのか。 なかなかよさそう。 と思ってたらSecurityコンポーネントとの組み合わせでハマってしまいました。

どうやらSecurityコンポーネントのrequireAuthを使ってると、requestAction()が呼ばれた時にセッション側のトークンが書き換えられてしまうので絶対トークンが一致しない様子。うーん困った。

あと、セッションの中にはトークンのキーと同時に有効期限が セットされるんだけど、 Sessionコンポーネントの有効期限がCAKE_SECURITY * CAKE_SESSION_TIMEOUT なのに、トークンの有効期限はCAKE_SECURITYだけで決まっちゃってる気がする。

Pythonで、メソッド定義されたクラスを知る方法

それより、あるオブジェクトのメソッドがどのクラスで定義されているか調べる方法を知りたいなぁ。

と昨日書いたけど、わかった気がする。__dict__を調べればいいんじゃないだろうか。

Continue reading

「すごいリロード対策」ってトランザクショントークンのことだよね

  • 2007-10-22
  • php

いや記事いいんだけど、すごい勢いでブックマークされていることに驚いた。

Continue reading

Pythonで、メソッドがどこで定義されたか外から知る方法

sortするならusort

  • 2007-10-21
  • php

個人的には、sortをするならusort()が好きです。 Perlをはじめ他の言語を使ったことがある人ならそう思うんじゃないかな。

PHPのarray_multisort関数が激便利だったので紹介 : akiyan.com

Continue reading

phpのinclude_pathのカレントディレクトリ

  • 2007-10-15
  • php

require("foo.php")とrequire("./foo.php")って意味違うって知ってました? cliから実行する場合以外はあまり関係無いかもしれませんが。

読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path で探され、それから、カレントのスクリプトのディレクトリからの相対パスとしてinclude_path で探されます。 (中略)ファイル名が ./ あるいは ../ で始まっている場合は、 カレントのワーキングディレクトリからの相対パスとして探されるのみとなります。 (PHP: include - Manual)

Continue reading

間違ったRuby On Railsのはじめかた

  1. よくあるscaffoldを使ったチュートリアルをやる。
  2. scaffold :modelという一行が何なのか理解できずに悩む。
  3. 2がスタティックメソッドの呼び出しであることを知り、Rubyではクラス定義の中に任意の式を書けることに驚く。
  4. paramssessionは何故@params@sessionではないのか悩む。
  5. Module#attr_internalの存在を知り、気が遠くなる。←今ここ

どうもRubyのコードは苦手だ。

masuidrive on rails ≫ Blog Archive ≫ Railsでアプリを組むのは簡単か?

Railsでアプリを組むのは、PHPやJavaより楽だけど、Ruby/Railsが使えるようになった人間が、アプリを組むのが楽だって言うだけで、Ruby/Railsを覚えるのがPHP/Javaより簡単って訳じゃない。

なるほど。 RailsはWebアプリケーションを作るための便利な黒魔術集といったところか。

フレームワークとしてうんぬんより、script/generateは便利といった印象。 ただしそのscript/generateの使い方をどこで調べたらいいのかよくわからないけど。

PL/Proxyもおもしろいですよ

書こう書こうと思いながら3ヶ月くらい放置していたネタです。 巷ではMySQL Proxyが話題のようなので、 あえて今年のPostgreSQL ConferenceのJoshのプレゼンでもちょっと出ていたPL/Proxyをいじってみました。

Continue reading

今さらFizzBuzz(当然PostgreSQL)

色々考えたけど、まあ許せるのはこのくらいか。

-- スタンダードに
select case
  when i%15=0 then 'FizzBuzz'
  when i%5=0 then 'Buzz'
  when i%3=0 then 'Fizz'
  else i::text end
  from generate_series(1,100)as s(i);


-- ちょっとアグレッシブに(8.2以降)
select coalesce(v15.t, v3.t, v5.t, s.i::text)
  from generate_series(1,100)as s(i)
  left join(
       values(0,'FizzBuzz')) as v15(i,t) on (s.i%15=v15.i)
  left join(
       values(0,'Fizz')) as v3(i,t) on (s.i%3=v3.i)
  left join(
       values(0,'Buzz')) as v5(i,t) on (s.i%5=v5.i)

あ、valuesじゃなくて普通にサブクエリでいいのか。まあvaluesって書いてみたかっただけです。

Smartyのtruncateはfunc_overloadでいいんじゃない

  • 2007-06-15
  • php

ずいぶん前からよく見かける話題だけど、また最近見かけたので。

いちばん手っ取り早いのは、mbstring.func_overloadを設定しちゃうことだと思いますよ。自分でプラグイン書く必要とか無いです。

交換不可能な(ry

ファイルの直リンクを防止する方法をもう少し考えてみる

  • 2007-05-31
  • php

Refererを使わずに直リンクを防止する方法を考えてみます。

元ネタ: cl.pocari.org - PHP の apache_setenv と virtual を利用して,ファイルへの直リンクを防止する

この foo.php のファイル名を時間によって変えるなどすれば,まあ,直リンクを防止することができる……のかな?ちと強引ですが.

つまり、「直リンクを防止する」ことを考えるより「ある一定時間しか有効でないURLを作る」ことを考えれば良いということじゃないでしょうか。

で、foo.phpのファイル名を変えちゃうと、外部からの直リンクは防げても、内部からの普通のリンクを貼る時に困りそうです(それならぶっちゃけ、画像のファイル名そのものを時間によって変えちゃってもいいわけだし)。

なので、時刻をパラメータとして渡す方針で。

フェーズ1

  1. foo.php?t=....のようにfoo.phpにタイムスタンプを渡す
  2. foo.phpの中で$_GET['t']と現在時刻を比較し、n分以上たっていればはじく
  3. でもこれじゃ簡単に偽装されちゃうYO!

なので、フェーズ2

  1. foo.phpにタイムスタンプと、(タイムスタンプ+秘密鍵)のHMACを渡す。
  2. foo.phpの中で、(タイムスタンプ+秘密鍵)のHMACを再計算して、渡ってきたHMACと一致するかチェック。
  3. foo.phpの中で$_GET['t']と現在時刻を比較し、n分以上たっていればはじく

な感じじゃないでしょうか。本当はapache moduleとかで書いた方が楽そうですが。

勝手に添削「タグを実現するテーブル設計を妄想する」

添削するほどエロくないですが。

元ネタ:タグを実現するテーブル設計を妄想する - よくきたblog

まず、

SELECT COUNT(*) FROM (SELECT user_id FROM item_tags WHERE item_id = 1 GROUP BY user_id) AS rows;

は、

SELECT COUNT(DISTINCT user_id) FROM item_tags WHERE item_id = 1;

でいいです。

Continue reading

少年法厳罰化に対するmixiの反応に引いた

少年の凶悪犯罪の増加ってマスコミが煽ってるだけだよねっていう意見はわりと 浸透しているのかと思っていた。

[mixi] 日記一覧 | 少年法「厳罰化」の改正案成立(mixi内)

自分の考え方は、思ってたより少数派なんだなぁって思った次第。

近年、多くのマスメディアがしばしば「少年の凶悪犯罪が急増している」といった内容を喧伝しているが、「犯罪白書」によれば、少年犯罪の発生は1960年代前・中盤が最も多く、1960年代後半から激減。1970年代以降減少傾向にあり、マスメディアによる情報操作が行われている可能性が捨てきれない。(少年犯罪 - Wikipedia)

Continue reading

読書ブーム到来

一年ぶりの読書ブーム到来(現実逃避ともいう)。7冊くらい買ったかな。新書とエッセイが1冊ずつ。あとは小説。読んだ順に書きます。

おもしろかった。

憲法九条は、突然変異の奇跡で、無邪気な理想論で、挑戦で、冒険で、面白くて、修道院みたいで、ドン・キホーテみたいだ。

対談の間に挟まっている太田さんの花見のエピソード。桜を狂気の花というあたりは、太田さんは感性の人だなぁと思う。

九条を守りたいという立場でありながら、その発想は世界を一つの家族にという発想や戦争に突入していった時の発想に通ずるのではないかという疑問を呈するあたりもおもしろい。

PHPを3ヶ所だけ直すとしたら

  • 2007-05-22
  • php

そろそろPHPに関して一言いっとくか

PHPについてはいろいろありますが手短に釣られて見ます。

PHPのあれが駄目とかじゃなく、 もし神様(何の?)が、今までのは無かったことにしてPHPをどこでも3ヶ所直していいよっていったらどうするかってのを聞いてみたいです。

Continue reading

ミックさんのパズルに挑戦

ミックさんの問題に挑戦してみました。 case文を使う方が先に思いついたけど。こんな感じかな。 ヒラをどこで弾くかが微妙なところですが。

方法はいくつかありますが、代表的なものとしては、HAVINGを使ってUNIONする非効率的なものと、CASE式を使った効率的なものがあります。それぞれどんなクエリになるか、考えてみてください。

Yahoo!ジオシティーズ - ミックのブログ

Continue reading

SQLでIPアドレスから携帯のキャリアを判定する

PostgreSQLのinet型を使って、IPアドレスから携帯のキャリアを判定してみます。

とりあえずIPアドレスの情報源。

Continue reading

より分散された世界を想像する

人のBlogを読んだ時、そこに感想を書き込もうとするのがコメント。 自分のBlogに帰って、そこに感想を書き込んでから送るのがトラックバック。 それぞれ長所短所があるわけですが。

それより、自分がどこに書いた、どこに保存されているか、それをどのように見たいかというのはどうでもいいというか、もっと自由でいいんじゃないかなあ。

hail2uの中の人のblogなんかは、はてなブックマークでブックマークするとコメントできるようになってます。 これは、 はてなブックマークエントリー情報取得API を使ってJSONPでもってきて表示してるんだと思います。

同じことをあちこちでOpenIDでやれば、何がおこるのかな。 僕のBlogも、他のBlogへの感想も、全然バラバラのサーバに対して書き込まれる。 僕がはてなやlivedoorやmixiに書きちらかしたエントリは、IDでひもづけられる。RSSリーダーで気になったエントリがあれば、その場でそこに何か書き込む。 もうエントリとかコメントとかトラックバックとかブックマークとか、そんな区別いらないんじゃないかな。

TTYShareイイヨー

ずっと前から欲しかったもの(というか作ろうとして挫折してたもの)。あったじゃん。

TTYShare - share and view your tty data online.

ttyrecをweb上で再生するしくみです。ついでにOpenID対応してるよ。エクストリームなvi使い(いやemacsでもいいけど)のみなさん。今こそそのテクニックを披露する時ですよ。

あーあと、テクニックを披露する場合はぜひrectickもあわせて使っていただきたい。

関係無いけどtypespeedというのをはじめて知った。

OpenIDとmixiとはてなとlivedoor

話題になりはじめてからもう二年くらいたつのかもしれないけど、 やっとOpenIDが盛り上がってきたんでしょうか。

ほんまかいな。国内では対応サービス全然増えてない気がしますが。

Continue reading

単純なblosxomのコメントスパムよけ

数週間前にコメントスパムよけの仕組みを入れました。 ここのサイトはアクセス数が少ないので参考にならないかもしれませんが。

Continue reading

CP932 vs JISX0213

CP932の2バイト部分(何て呼べば良いんだろう)とJIS X0213の1面を比較してみました。元データはunicode.orgのCP932.TXTと、使いこなそうユニコードのsjis0213.txtです。

CP932 vs JIS0213(2)
CP932 vs JIS0213(2) posted by (C)あきを

  • グレーの点はCP932でもJISX0213でもreserved。
  • 赤い点は、CP932とJISX0213でUCSのコードが違う。
  • 緑の点は、JISX0213にしか存在しない。
  • 青の点は、CP932にしか存在しない。

となっていて、白い部分は一致しています。一番気になるのは青いところで、これは13区の10文字です。

CP932UCS
13800x8790U+2252
13810x8791U+2261
13820x8792U+222b
13840x8794U+2211
13850x8795U+221a
13860x8796U+22a5
13870x8797U+2220
13900x879aU+2235
13910x879bU+2229
13920x879cU+222a

これらのうち9文字は、2区との重複文字です。

Windows-31J の文字セット

残りの1文字(13, 84)はどこへいったのでしょう。sjis0213.txtには(1 -6-18)にこんなコメントがありました(適当に改行してあります)。

1- 6-18 0x83B0  U+03A3      # GREEK CAPITAL LETTER SIGMA 
# unified with Windows CP932 0x8794 (as a "KOKUNAI-JISSOU-GOKAN-MOJI",
a domestically implemented compatibility character, N-ARY SUMMATION (U+2211).

うーん。調べてみようと思ったらJISのサイトがメンテナンス中だった。

関連: 図解:Windowsの文字コード

消しゴムフェア

大丸藤井セントラル2Fで「消しゴムフェア」やってました。

超ビッグサイズ消しゴム「レーダーS-10000」

実物見てきました。大きさよりも重さのインパクトがすごいです。

数式いじり

久しぶりにオイラーの贈り物を開いてみた(P42あたり)。

のとき

となるらしい。

こっちは簡単。

これは和と差の積ですね。

中学校数学 3年生-数量/式の計算 - Wikibooks

中3レベルか、、、

ところで、

なので

、、、元に戻った。

あーあとP26のパスカルの三角形とフィボナッチ数列の図の意味がやっとわかった。左に30度傾けて見れば良かったのか。

SERIAL型のsequence名を取得する

PostgreSQLでは、SERIAL型とはsequenceをデフォルト値とするinteger型で、SERIAL型の列を持つテーブルを作成すると自動的にsequenceが作られます。 またこの時のsequenceの名前は、{表名}_{列名)_seqとなります。

なんだけど表や列をRENAMEした場合にsequenceの名前もあわせて変わるわけではないので、フレームワークなんかでこの命名規則に依存していると悲しい思いをすることがあります。

Continue reading

ミルカさん派です

ミルカさん派ですよミルカさん派。内容は全然理解できてませんが。

『数学ガール』出版記念インタビュー

ファンタジーの法則ですか。 プログラマの数学は読んでませんが、ミルカさんを読んだ時に感じたのはまさに、 これは冒険物語だということでした。

というわけで、数学ガールに絶対でてきそうにない台詞を勝手に想像してみる。

僕「テトラちゃん!そっちにいっちゃダメだ!」

ミルカ「どうやら間に合ったようだね」

何の話だか。

CakePHP日記:PostgreSQLのportを指定する

  • 2007-04-16
  • php

app/config/database.phpのコメントに惑わされてはいけません。

/*
 ...
 * host =>
 * the host you connect to the database
 * MySQL 'localhost' to add a port number use 'localhost:port#'
 * PostgreSQL 'localhost' to add a port number use 'localhost port=5432'
 *
 */

実は'host' => 'localhost port=5432'ではなく'port' => 5432を追加すればOK。

CakePHP日記:CakePHPでSmartyを使う時のTips

  • 2007-04-11
  • php

2007-04-12 追記:※注意!結論の「バッククォートで括ると便利」というのはあってますが、そこまでの過程はほとんどウソでした。そのうち直します。

CakePHPでViewにSmartyViewを使う時、おおざっぱにいうとこんな動きになっています。

  • コントローラがビューに変数を渡す
  • ビューがSmartyに変数を渡す(ついでに自分自身をviewというSmarty変数に登録する)
  • レンダリング

このように、変数のコピーが2度発生します。

{$post.id}   // これはSmartyの変数
{$html->link('linkto', $post.id)}  // この$postはPHPの(SmartyViewがセットした)変数

ここで困るのは、レンダリング中にセットされた変数はSmartyの世界からしか見えないこうことです。 典型的な例としてはループで使われる変数です。

Continue reading

CakePHP日記:Model,View,Controllerを共有する

  • 2007-04-09
  • php

同じmodel/actionに対して、一般ユーザ向け画面と管理者向け画面を分けたい時、CakePHPではAdmin Routingという選択肢があります。

4.4. 高度な Routing 設定: Admin Routing と Webservices

なんだけども、アプリケーションを分けてしまった方がすっきりする場合もあります。 分けてしまった場合でも、特にModelのクラスは同じもの使うことが多いです。こういう場合はファイルをコピーしなくても、app/config/bootstrap.phpでModelを検索するパスを$modelPaths 複数指定することができます。

Continue reading

blosxom starter kit + Vicuna

ちまちまと、blosxom starter kit + Vicunaという微妙なものを作っています。

まだあちこちちゃんと動いてませんが。 欲しい人がいるとはあまり思いませんが、いたら公開を考えます。

文字列の先頭と末尾を表わす正規表現

  • 2007-04-08
  • php

そういう時は普通、\zを使うんだと思う(元記事のコメント欄でも言及されてるみたいだけど)。

という話を書こうと思ったらPerl6では\Aと\zは廃止だそうです。

^と$が\Aと\z相当の動作をするらしい。

CakePHP日記:insertかupdateか

  • 2007-04-05
  • php

Model#save()は、idがセットされているかどうかでinsertかupdateかを判断しているようです(さらに、lidがセットされていれば、本当に存在するかをSELECTしてみています)。

ですが、一般的なコントローラのeditアクションは、

A.12. Posts の編集:CakePHP プログラマーズ リファレンスガイド

    function edit($id = null)
    {
        if (empty($this->data))
        {
            $this->Post->id = $id;
            $this->data = $this->Post->read();
        }
        else
        {
            if ($this->Post->save($this->data['Post']))
            {
                $this->flash('投稿を更新しました。','/posts');
            }
        }
    }

こんな感じで、データがpostされた場合はidをセットしていません。 ではなぜこれをupdateと判断するかというと、URLの1つめのパラメータは暗黙でデフォルトのモデルのidにセットされるからです。 じゃなくってこのドキュメントの例では、idをhiddenで渡しているからでした。 で、このhiddenが無い場合の話が以下に続きます。

しかし、コントローラでvar $uses = array('Model1', 'Model2')などと明示的に使うモデルを指定していると、この暗黙のidのセットは動作しないようです。

なので、uses を指定している時や、URLの1つめのパラメータをデフォルトのモデルのidとして使いたくない場合は、明示的にidをセットしましょう。

CakePHP日記:SmartyからHTMLヘルパーの属性を指定する

  • 2007-04-03
  • php

前回の続き。 実は、

<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>

こんなことしなくても、HTMLヘルパーのメソッドはたいてい、attributeにarrayじゃなく文字列を渡すこともできるらしく、

<p>Title: {$html->input('Post/title', 'size="40" class="classname"')}</p>

でいいんじゃないかということに気づいた。

2007-04-03 追記

やっぱダメだった。inputみたいなフォームの部品に関しては、valueとかidを付けてくれない。$html->image() なんかには使ってもいいかもしれない。

CakePHP日記:Smaryテンプレート内での配列生成

  • 2007-03-29
  • php

CakePHPからSmartyを使うのは一見いいとこどりのようで、実際結構大変かもしれない。

素のCakePHPだと

<p>Title: <?php echo $html->input('Post/title', array('size'=>40, 'class'=>'classname'))}</p>

みたいな感じのものを、Smartyテンプレート内では配列を生成できないので、

{assign_assoc var='ArrayName' value='size=>40,class=>classname'}
<p>Title: {$html->input('Post/title', $ArrayName)}</p>

と書こうという話。そんなassignは個人的に許せないわけですよ。 CakePHPのbasic.phpにはaとかaaとかhとかprとか色々便利な関数があるのと、 Smartyテンプレート内では関数を自由に呼び出すことはできないけど、 テンプレート変数のメソッドなら治外法権という性質を利用して、 SmartyViewにラッパーメソッドを追加。

function aa() {
    $args = func_get_args();
    return call_user_func_array('aa', $args);
}

SmartyViewのインスタンスは$viewとしてテンプレート内から参照できるので、

<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>

と書くことができる。邪道な気もしますが。あと、同様にprも追加しておいた。

あと、テンプレート変数をヘルパーの引数に渡したい時とかどうしよう(ループカウンタとか)。 $view->Smarty->get_template_vars()かなぁ。どんどん道を外れていく気がする。

2007-04-03 追記:CakePHP日記:SmartyからHTMLヘルパーの属性を指定する

それ、yuiで

CakePHP日記:radioにlabelを付ける

  • 2007-03-27
  • php

デフォルトのHtmlHelper::radio()が出力するラジオボタンにラベルが無いので付けた。 誰もがやりたくなる改造だと思います。

ヘルパーが出力するHTMLタグは、app/config/tags.ini.phpでカスタマイズできますが、 <label for="...">と書くにはヘルパー側に手を入れる必要があるので、 安易にapp/config/tags.ini.phpをこんな感じにしてみました。

radio =  <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>

CakePHP日記:AppErrorで日本語が表示できない

  • 2007-03-21
  • php

単にメッセージを表示するだけのエラーページのために、action毎にviewを作るのはめんどうなので何か無いかと探してみた。

Object::cakeError()あたりが使えそう。

  • app/error.phpというファイルにAppError extends ErrorHandlerを作る。
  • Apperror::foo() jを作る。
  • app/views/errors/foo.thtml を作る

が作法のようだ。詳しくはソース見てね。

なんだけど、日本語のメッセージが表示されない。どうやらErrorHandlerのコンストラクタでSanitize::paranoid()を使っているからみたいだ。

コンストラクタもオーバーライドしないとだめかな。 いや、もういっそcakeError()を使わずにAppControllerにエラーハンドラを作った方が良いのかな。

CakePHP日記:commit()は空のarrayを返す

  • 2007-03-21
  • php

Modelのcommit()は空のarrayを返すので、 if ($this->Model->commit()) { /* 成功 */ } とか書くと常に失敗する。

というか、他のRDBMSは知らないけど、PostgreSQLってトランザクション内でエラーが出 てる状態でcommitすると成功を返してrollbackするのか。

これは、select以外のSQLをexecute()した場合も、成功の場合は空のarrayを返す。 失敗した場合はfalseを返す。

CakePHP日記:sessionとhidden

  • 2007-03-20
  • php

CakePHPをはじめた。

全体的にはよくまとまっていると思うけど、まだググり足りないのか、あれこれ足りないものも見えてきた。

ドキュメントのサンプルコードも微妙。

6.4. アソシエーション:Example 6.9. posts 作成のための /app/views/posts/add.thtml フォーム

<?php echo $html->hidden('Post/user_id',
 array('value'=>$this->controller->Session->read('User.id')))?>

アプリケーションの種類にもよるだろうけど、これはちょっとサンプルコードとしては怖い気がする。user_id詐称しまくりじゃないですか。 これはcontroller側で

$this->data['Post']['user_id'] = $this->Session->read('User.id');

してやるべきじゃなかろうか。

tbodyとrowspan

Sybianの日記 - tbodyをスクロール可能に

tbodyで思い出した。JOINの結果みたいなグループ化されたのを表にしたい時に、tdにrowspanを付けるのがけっこうめんどい。 なぜなら、上から走査していくのの、そのグループの要素が何個あるかを最初に知っていなければならないからだ(適当な説明だけどピンとこない人はスルーして下さい)。

で、楽する方法としてtbodyとrowspan="0"を使うという方法を思いついたんだけど、IEだと表示できなった。以上。

111aaa
bbb
ccc
222aaa
bbb
ccc

PostgreSQLドキュメントの閲覧用ブックマークレット

PostgreSQL日本語ドキュメントを見ていて、あれ?これって原文どうなってるのかな?とか思った時に、原文の同じページに移動するためのブックマークレットを作ってみた。

下のリンクをブックマークツールバーか何かにドラック&ドロップして下さい。

バージョンが上がった場合は直さなきゃだめだけど。

DBD::PgとEvent::Libで非同期通知

DBの変更をトリガーにしてPushしたいなら、PostgreSQLのLISTEN/NOTIFYですよ。 最近のDBD::Pgは$dbh->func('getfd')というのが使えるらしい。

POEとかよく知りませんが、libeventならCから使ったことがあるので書いてみた。 こんな感じ。

#!/usr/local/bin/perl
use strict;
use warnings;
use IO::Handle;
use Event::Lib;
use DBI;
use Data::Dumper;

sub listener {
    my ($ev, $type, $dbh) = @_;

    print Dumper($dbh->func('pg_notifies'));
}

my $dbh = DBI->connect("dbi:Pg:", "", "");
$dbh->do("listen hoge");

my $reader = event_new(
    IO::Handle->new_from_fd($dbh->func('getfd'), "r"),
    EV_READ | EV_PERSIST, \&listener, $dbh);

$reader->add;

event_mainloop;

ファイルディスクリプタからファイルハンドルを得るあたりが自信無し。

# 実行
$ perl notify.pl
...
# 別端末でpsqlからnotifyすると、
=> notify hoge;
=> notify hoge;
...
# 非同期通知。ってこの説明で伝わるのか!?
$VAR1 = [
      'hoge',
      15164
    ];
$VAR1 = [
      'hoge',
      15164
    ];

普通はトリガと一緒に使います。

=> create or replace function t1_trig_func() returns trigger as
     $$begin notify hoge; end;$$ language plpgsql;
CREATE FUNCTION
=> create trigger t1_trigger after insert or update or delete on t1
     for each statement execute procedure t1_trig_func();
CREATE TRIGGER
=> insert into t1 values(1);

以下、関連するPostgreSQLのドキュメント

図解:Windowsの文字コード

先日、某所でWindows Vistaで採用されたJIS X 0213:2004の話を聞いてきた。 実際にVistaに触る機会があれば色々実験してみたいと思うけど、 その前にとりあえずWindowsの文字コードについてまとめておきたいと思う。

まずは私の知っているWindows XPまでの話。以下のページを参考にさせてもらいました。 あわせて見ていただけるとわかりやすいと思います。

Windows-31J(CP932とも呼ばれることがあるけど、以降Windows-31Jと呼びます) というのは、

  • JIS X 0201:1997
  • JIS X 0208:1997
  • NEC特殊文字
  • NEC選定IBM拡張文字
  • IBM拡張文字

からなっている(あれ?ユーザ定義外字が無いな)。

JIS X 0201は1バイトなので置いておいて、マルチバイト文字の基本は JIS X 0208という文字集合。これは94×94文字の集合なので 領域としては8836文字分あるけど、空きとかがあって実際に定義されているのは 6879文字だそうだ。

そこに特殊だったり選定だったり拡張だったりを追加した図がコレ。

Windows-31J
Windows-31J posted by (C)あきを

13区と89〜92区はJIS X 0208の空き領域に文字を追加している。 それはともかく115〜119区って94越えてるんだけど、 これはShiftJISというエンコードのなせる技だったりする。

で、本題はこの先。これらの追加された文字は、 歴史的経緯によってすべて重複している。同じ文字の形(グリフ)のものが 2箇所以上にある。つまり2つ以上の文字コードを持っているわけだ。 その重複を表わしたのが次の図。

Windows-31Jの重複符号化文字
Windows-31Jの重複符号化文字 posted by (C)あきを

普通ベン図 は楕円とかで書くんだろうけどそれじゃ上手く書けないので四角になってます。 赤い数字は各四角形の中の文字数。つまりNEC特殊文字は8+1+61+13=83文字と なっていて、そのうち14文字はIBM拡張文字と重複している。 また、9文字はJIS X 0208の2区と重複しているというわけです。

さてこの中には1つの文字で3つの文字コードを持つものは何文字あるでしょう? というと公文式か日能研かという感じだけど。実際のところ2文字あります。

しかし何時間もかけた割にはイマイチな図だな。誰か絵心のある人に書き直してもらいたい。

次はVistaについて書きたい。

2月21日のメモ

昨日、北口の地下でスケートボードをやっていた若者がムーディー勝山を歌っていた。「みぎからやってきたぁー♪」

deq blog - 共同ローカリゼーションフレームワーク

自分が欲しいなと思っていたものに近い。

bobchinの日記

素敵なことをやってる人を発見してしまった。

Makefileをもっと簡潔に

ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - - Makefile は簡潔に書きましょう

hoge.cからhogeを生成するより簡単な方法は、Makefileを書かないことです。

$ make hoge

Makefileを書くのであれば、

hoge:

とだけ書いて

$ make

で十分。

バレンタインですね

PHPの変数

  • 2007-01-30
  • php

PHPでの内部変数の扱われ方 - PHP5のオブジェクトコピーでありがちな勘違い - PHPプロ!ニュース

参照渡しで$aと$bが同じものだと思っている方は不思議に思うかもしれません。

普通の言語なら同様の実行結果になるんじゃなかろうか。 これを不思議に思うようであればかなり自由な発想の持ち主だと思うよ。

package StdClass;
sub new { bless {} }

package main;
use Data::Dumper;

$a = new StdClass;
$b = $a;
$a->{foo} = 'bar';
print Dumper($b);

$a = 'baz';
print Dumper($b);

    ...
$VAR1 = bless( {
         'foo' => 'bar'
           }, 'StdClass' );
$VAR1 = bless( {
         'foo' => 'bar'
           }, 'StdClass' );

Plagger入れた - 作るよ野良RSS

札幌市民に送る某at-macのRSSとか(用事無いくせに)。

http://www.mono-space.net/~iakio/rss/

plperlでUnicode正規化

PostgreSQLでUnicodeの正規化ができればいいなぁと思ってたんだけど、調べてみると自分でCで書くのはかなり辛そう。

PerlにはUnicode::Normalizeという実装があるので、これをplperlから利用してみた。(正確にはplperlu)。

Unicodeの正規化についてはこの辺を。

Unicode正規化

daily dayflower - Unicode::Normalize で遊ぶ

    utf8db=# create or replace function nfkc(text) returns text as 
        $$use Unicode::Normalize; return Unicode::Normalize::NFKC($_[0]);$$ language plperlu;
    CREATE FUNCTION

    utf8db=# select nfkc('ABC');
     nfkc
    ------
     ABC
    (1 row)

    utf8db=# select nfkc('イ

Home

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

Page Top