たぶんこれに興味のある人は日本全国に10人くらいしかいないと思いますが、WordPressを PostgreSQLで使うドライバ、pg4wpのその後です。
プラグインを入れるたびに新たなエラーが発生して、その都度、いろいろと手を入れています。
今回は、Contact Form 7を入れたらエラーになりました。Contact Form 7が auto_increment付きのテーブルをクリエイトしようとしてエラーになりました。WordPressの標準って主キーにオートインクリメントを使ってないのですかね。それはそれでびっくりです。
if(stripos($sql, 'CREATE TABLE') === 0) {
$sql = str_ireplace('CREATE TABLE IF NOT EXISTS', 'CREATE TABLE', $sql);
$a = preg_split("/(CREATE TABLE | \()/", $sql);
$tbl = $a[1];
$sql = preg_replace("/DEFAULT CHARACTER SET .+;/", ";", $sql);
$sql = preg_replace("/,\s*PRIMARY KEY\s\(.+?\)/i", "", $sql);
$sql = preg_replace("/text\s+NOT\s+NULL/i", "text default ''", $sql);
if (stripos($sql, 'auto_increment')) {
$s = "";
$a = explode("\n", $sql);
foreach($a as $v) {
if (stripos($v, 'auto_increment')) {
$b = explode(" ", trim($v));
$key = $b[0];
$v = $key." integer DEFAULT nextval('".$tbl."_seq'),\r\n";
}
$s .= $v;
}
$sql = $s;
$sql = "CREATE SEQUENCE ".$tbl."_seq; ".$sql."; CREATE UNIQUE INDEX ".$tbl."_".$key."_key on ".$tbl." (".$key.");";
}
}
相変わらず力技です。(ここは笑うところか?)
まず、PostgreSQLには “IF NOT EXISTS”がないのでこれを取っ払って(テーブルがすでにあったらエラーになるので、なかったら実行はなくても可)、”PRIMARY KEY(key)”という指定もないみたいなので、これも取っちゃって、あと、これがクリビツテンギョウなんですけど、MySQLは text NOT NULL属性で値を指定しない(INSERT文に含めない)と、空文字を勝手に入れてくれるのに対して、PostgreSQLはエラーになっちゃうんですね。
これは NOT NULL属性をつけてる主旨からいって、PostgreSQLを支持したいです。でも、INSERT文でエラーになるのは仕方ないので、text NOT NULLは、text default “”にして、NOT NULLを外しちゃいました。
あと、面倒なところが、auto_incrementの取扱い。そのまま、SERIALにしちゃえばいいようなものなんですけど、そうすると、シーケンシャル・テーブルの名前が、table名_カラム名_seqという名前になって、wp_optionsなんかで使っている table名_seqルールと合わなくなってしまうこと。
で、SERIALが使えなくて、いちいち、CREATE SEQUENCE、CREATE UNIQUE INDEXみたいなことをやってるわけです。(きっとどっかにもっといい方法があるはずだ)
参考:PostgreSQL 日本語ドキュメントはよくできています。
Ruby備忘録
Tips久々にRubyを触ったらびっくりするくらい忘れていたので、これはこれで新鮮だった。
人ってこのくらいキレイさっぱり忘れられるんだなぁ、道理で失恋で死ぬやつがたくさんいないわけだ。
以下、なにを忘れていたかの記録。文字通り備忘録。
とりあえず、このくらい。主として文字列まわり。
pg4wpその後
WP Tipsたぶんこれに興味のある人は日本全国に10人くらいしかいないと思いますが、WordPressを PostgreSQLで使うドライバ、pg4wpのその後です。
プラグインを入れるたびに新たなエラーが発生して、その都度、いろいろと手を入れています。
今回は、Contact Form 7を入れたらエラーになりました。Contact Form 7が auto_increment付きのテーブルをクリエイトしようとしてエラーになりました。WordPressの標準って主キーにオートインクリメントを使ってないのですかね。それはそれでびっくりです。
相変わらず力技です。(ここは笑うところか?)
まず、PostgreSQLには “IF NOT EXISTS”がないのでこれを取っ払って(テーブルがすでにあったらエラーになるので、なかったら実行はなくても可)、”PRIMARY KEY(key)”という指定もないみたいなので、これも取っちゃって、あと、これがクリビツテンギョウなんですけど、MySQLは text NOT NULL属性で値を指定しない(INSERT文に含めない)と、空文字を勝手に入れてくれるのに対して、PostgreSQLはエラーになっちゃうんですね。
これは NOT NULL属性をつけてる主旨からいって、PostgreSQLを支持したいです。でも、INSERT文でエラーになるのは仕方ないので、text NOT NULLは、text default “”にして、NOT NULLを外しちゃいました。
あと、面倒なところが、auto_incrementの取扱い。そのまま、SERIALにしちゃえばいいようなものなんですけど、そうすると、シーケンシャル・テーブルの名前が、table名_カラム名_seqという名前になって、wp_optionsなんかで使っている table名_seqルールと合わなくなってしまうこと。
で、SERIALが使えなくて、いちいち、CREATE SEQUENCE、CREATE UNIQUE INDEXみたいなことをやってるわけです。(きっとどっかにもっといい方法があるはずだ)
参考:PostgreSQL 日本語ドキュメントはよくできています。
jQueryによるフォーム部品操作
Tips, WP Tipsここ『jQueryによるフォーム部品操作のレシピ』にまとめていただいているので感謝。
こういう書き方ができるというのが目から鱗。下の方は試したわけではないのですが、いけるそうです。
あと、画面表示のときにフォーカスを移したいなというときはこちら。
body onload=”ほげほげ” とかしなくていいので、HTMLを汚さないのがいいかも。
あと、ついでに、Contact Form 7とかで、ラジオボタンが横向きにずらずらっと並んでしまって、縦一列にしたいけど、ラベルに<br/>とか入れたり、¥n入れたりするのってダサくないというときの解決法。
これは目から鱗。display: block ってこういうときに使うんだという感じ。
Safariぽいスライダーを作るJavaScript
WP Tipsこれはさるところで、主として視覚効果として使用させていただいているスライダーです。本来はインプットの部品として使用するのですが、表示効果としてキレイで使いやすいので、少し外れた使い方ですが。
こちら『jQuery Slider update』がオリジンです。
使用方法はこちら『Safariぽいスライダーを作るJavaScript「jQuery Slider plugin」』が日本語で書かれているのでわかりやすいです。
ま、やってることはシンプルなので、オリジナルページのサンプルを読んだ方がいろいろと設定できてうれしいです。
JavaScriptで chr(N)をやる方法
TipsJavaScriptで chr(0x41)とかやって ”A”が出ないなと思って、JavaScriptって一度も文法書を読んだことないなと思った今日この頃です。
はてさて、数値を指定して文字を出すのはどうすればいいんでしょうか?
チクタク、チクタク、・・・(ググり中)・・・、チーーン
答えが出ました。結構難しい検索でしたね。答えは『String.fromCharCode(num1, …, numN) (e4/N4) 』です。
出典は、こちらです。
ob_start
Tipsこれは何かというと、PHPの関数です。
そういえば、遠いとぉーい昔使ったような記憶があります。
どういうときに使うかというと、関数が echoなどで直接標準出力へ書き出しているときに、それをさせないで文字列にコピーするということができます。
『便利な関数だけど、直接HTMLを吐くから加工して使えないんだよね』というようなときに、ob_start しといて、ob_get_contents()で文字列に代入して、ob_end_flush()でお仕舞いみたいな感じでしょうか。
ob_start(“callback”) みたいにコールバック関数を引数に渡して、その関数の中でごにょごにょやったあと、ob_end_flush()するというのもオシャレかも。こういうところが PHPの柔軟すぎてわかりづらいとこなんでしょうね。