FC2ブログ

Boom Boom

ムネオって John Lee Hooker に似てるよな

スポンサーサイト

American Garage

本日はこんな気分

YouTube - Pat Metheny Group - (Cross the) Heartland
American Garage

日本では馴染みが薄いみたいだけれど、大御所中の大御所、パット・メセニー様であらせられる。
American Garageは高校生の時にリリースと同時に買ったアルバムで、たぶん1979年あたりかな。
擦りきれそうなくらい聞いた。

本当かどうかは知らないが、18歳で既にバークレー音大で"教え"ていたという天才ジャズギタリスト。
教え子なのかも知らないが、同時期に同い年のアルディメオラが在籍しているので、もしかしたら彼も影響を受けたのかもしれない。

まぁ自分じゃ楽器はできないんだけども、このあたりのクロスオーバー世代なもんで。

あぁっ、CHASEも見つけてしまった・・・これ聞いてから寝よ
YouTube - Chase "Get It On" LIVE 1971

外道

なんだかわからんけど来るのか?ブームが来るのか??


UbuntuのGwibber

クリスマス過ぎあたりからだろうか、Ubuntu10.04LTSのTwitterクライアントであるGwibberが起動しなくなった。
コンソールから叩くと、
** (gwibber:2261): WARNING **: Trying to register gtype 'WnckWindowState' as enum when in fact it is of type 'GFlags'

** (gwibber:2261): WARNING **: Trying to register gtype 'WnckWindowActions' as enum when in fact it is of type 'GFlags'

** (gwibber:2261): WARNING **: Trying to register gtype 'WnckWindowMoveResizeMask' as enum when in fact it is of type 'GFlags'
Updating...
Updating...
Traceback (most recent call last):
File "/usr/bin/gwibber", line 67, in
client.Client()
File "/usr/lib/python2.6/dist-packages/gwibber/client.py", line 448, in __init__
self.w = GwibberClient()
File "/usr/lib/python2.6/dist-packages/gwibber/client.py", line 59, in __init__
self.setup_ui()
File "/usr/lib/python2.6/dist-packages/gwibber/client.py", line 145, in setup_ui
self.stream_view.set_state(self.model.settings["streams"] or DEFAULT_SETTINGS["streams"])
File "/usr/lib/python2.6/dist-packages/gwibber/gwui.py", line 439, in set_state
self.update()
File "/usr/lib/python2.6/dist-packages/gwibber/gwui.py", line 427, in update
self.message_view.render([self.navigation.selected_stream["view"]])
File "/usr/lib/python2.6/dist-packages/gwibber/gwui.py", line 737, in render
accounts=accounts)
File "/usr/lib/python2.6/dist-packages/gwibber/gwui.py", line 285, in render
self.load_html_string(content, "file://%s/" % os.path.dirname(template_path))
TypeError: WebKitWebView.load_html_string() argument 1 must be string without null bytes, not str

を吐いて終了。
んー、なんか終わり方がまずかったかな。
もっと使い勝手がいいものがあるだろか。

続きを読む

PostgreSQLのBytea

備忘録に。

PostgreSQLにはBytea型があって、長さ制限無しにバイト列を扱う事ができる。
このいかにも単純で使いやすそうな型なのだが、ecpgから操作する場合にバインド変数型にByteaが無いことから混乱することが多いようだ。

ちなみに.NETでODBC操作を行うと、ごくごく普通にバイト列を返してくれる。

でecpgを使う場合の多くは、Oracle + Pro*Cからの移行なんじゃないかと想像したりするわけなんだが、ほぼ間違いなくバインド変数を使う。
だからByteaへのアクセスでも次のように書いてしまう。
EXEC SQL BEGIN DECLARE SECTION;
unsigned char data[] = "\x01\x02\x00\x03\x04";
EXEC SQL END DECLARE SECTION;

EXEC SQL INSERT INTO hogetbl VALUES(:data);
...

まぁもちろんOracleであろうとこれはサイズがわからんのでダメなわけなんだが。
で、あれこれ思考錯誤して、エスケープする事に気付く。で、こうする。
EXEC SQL BEGIN DECLARE SECTION;
unsigned char data[] = "\x01\x02\x00\x03\x04";
unsigned char *p;
EXEC SQL END DECLARE SECTION;

int len;
p = PQescapeBytea(data, 5, &len);
EXEC SQL INSERT INTO hogetbl VALUES(:p);
...

ここでなんとかINSERTが完了するので、次は取得にかかる。
EXEC SQL BEGIN DECLARE SECTION;
unsigned char buf[1024];
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT data INTO :buf FROM hogetbl;
size_t buflen;
unsigned char *p = PQunescapeBytea(buf, &buflen);

んでもって取得したpの中身にエスケープ文字やら何やらがバラバラ現われるのを見て愕然とする。
Google先生にお伺いを立てると英文で何やら「Bug」の文字がちらほら。
なんだよ結局使えねーじゃん、、となる向きが多いんじゃないかと思われる。勿体ない。
あちこち検索すると、「PQescapeByteaは使えないからBASE64でエンコードして格納したよ」みたいな話も出てきたり。

ここでの間違いは、せっかくエスケープした文字列を、埋め込みSQLのバインド変数として渡しているところ。
Bytea型が無いんだからしょうがないじゃない、と言ったって、charの配列をただ渡しちゃぁプリコンパイラだってどうしようもないじゃんか。

PQescapeByteaはINSERT可能な文字列にエスケープしてくれるだけのものなので、そのままINSERT文を書いてしまえば良い。
EXEC SQL BEGIN DECLARE SECTION;
unsigned char data[] = "\x01\x02\x00\x03\x04";
unsigned char *p;
char query[1024];
EXEC SQL END DECLARE SECTION;

int len;
p = PQescapeBytea(data, 5, &len);
sprintf(query, "INSERT INTO hogetbl VALUES('%s')", p);
EXEC SQL EXECUTE IMMEDIATE :query;
...

こうしてやると、取得側は先の例のままで良く、めでたくpの内容にbuflenのサイズで格納したバイト列がそのまま取得できる。
(PQescapeBytea/PQunescapeByteaの戻り値はPQfreememしなきゃだめっぽい)

たいした処理でもなし、お手軽バイト列で使える事には変わりがないので、今年もByteaをよろしくお願いします。
プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク