dec64(和名:でじこん)
数字列をURLで扱える形で変換する関数群です。
base64エンコードの数字入力限定版というとわかりやすいかも。
base64というと非ASCII文字列をASCII文字に変換する用途に使われますが、
このエンコードでは数字列を短縮化するのが目的です。
使用例
<?php $dec64=new dec64(); $src="31415926535897"; $enc=$dec64->encode($src); print $enc; $dec=$dec64->decode($enc); print $dec;
本体
<?php
class dec64 {
function __construct() {
// digit convert(0-9 to binary)
$this->digicon= array(
0=>'000',
1=>'001',
2=>'010',
3=>'011',
4=>'100',
5=>'101',
6=>'1100',
7=>'1101',
8=>'1110',
9=>'1111'
);
// replace_list(6bit safecode)
$replace_list=array();
// 0-9 -> 0-9
for ($i=0;$i<=9;$i++) {
$replace_list[$i]=0x30+$i;
}
// 10-35 -> A-Z
for ($i=10;$i<=35;$i++) {
$replace_list[$i]=0x41+$i-10;
}
// 36-61 -> a-z
for ($i=36;$i<=61;$i++) {
$replace_list[$i]=0x61+$i-36;
}
// 62->'-' 63->'_'
array_push($replace_list,0x2d,0x5f);
$this->replace_list=$replace_list;
}
function encode($num) {
$ebit='';
for ($clm=0;$clm<strlen($num);$clm++) {
$t=substr($num,$clm,1);
$ebit .= $this->digicon[$t];
}
$mod=strlen($ebit)%6;
switch ($mod) {
case 0:
$suffix='';
break;
case 1:
$suffix='00011';
break;
case 2:
$suffix='0001';
break;
case 3:
$suffix='111';
break;
case 4:
$suffix='00';
break;
case 5:
$suffix='0';
break;
}
return $this->bin64_encode($ebit . $suffix);
}
function bin64_encode($bin) {
$rz='';
for($cur_s=0;$cur_s<strlen($bin);$cur_s+=6) {
$src=substr($bin,$cur_s,6);
$gen=bindec($src);
$dst=chr($this->replace_list[$gen]);
$rz .= $dst;
}
return $rz;
}
function decode($str) {
$exted=$this->bin64_decode($str);
$sizesrc=strlen($exted);
$clm=0;
$ddig='';
while ($sizesrc > $clm) {
$remain=$sizesrc-$clm;
$bef=substr($exted,$clm,2);
if ($remain < 3) {
break;
}
if ($bef == '11') {
if ($remain==3) {
break;
}
$enable_digits=4;
} else {
if ( (($remain==4) or ($remain==5)) and (substr($exted,-1,1) == '1') ) {
break;
}
$enable_digits=3;
}
$unit=substr($exted,$clm,$enable_digits);
$clm+=$enable_digits;
$ddig .= array_search($unit,$this->digicon);
}
return $ddig;
}
function bin64_decode($str) {
$rz='';
for($cur_s=0;$cur_s<strlen($str);$cur_s++) {
$src=substr($str,$cur_s,1);
$gen=array_search(ord($src),$this->replace_list);
$dst=sprintf("%06s",decbin($gen));
$rz .= $dst;
}
return $rz;
}
}
?>
Sajax+PHPセッション
PHPセッション機能を利用するにはCookieかGETクエリ文字列でセッションIDを渡さないといけない。
しかしSajaxのAjax通信部分ではHTTPヘッダを追加できないのでセッションを利用できない。
仕方ないのでSajax自体を書き換えることにした。
function sajax_get_my_uri() {
session_start();
return $_SERVER["REQUEST_URI"] . '?PHPSESSID=' . urlencode(session_id());
}・・・たいしたことはしてませんね。
この場合必ずGETクエリで渡さないといけないのでCookieは使わないようにする。
ということで以下の設定値を適用する
session.use_cookies = 0 session.use_only_cookies = 0 session.use_trans_sid = 0
■
postgresql8.3.12,phpPgAdmin5.0という環境で一般ユーザーがデータベースを作ってスキーマを見ると
ERROR: permission denied for relation pg_authid
と言われてテーブルのリストを見ることができない。
一般ユーザがpg_authidを見ることができないのは当然だけどこれじゃ使えない。
とりあえず対策考えた。
pg_rolesというテーブルがpg_authidのほぼクローン(パスワードが隠されてる)なので、差し替えれば良い。
すなわちclasses/database/Postgres.php 867行目
LEFT JOIN pg_catalog.pg_authid pu ON (pn.nspowner = pu.oid)
これを
LEFT JOIN pg_catalog.pg_roles pu ON (pn.nspowner = pu.oid)
こうするととりあえず見ることができた。
他で問題が起きそうだけどそのときはまた考えよう。
シュークリーム分の補給に失敗
本日は7でとろりんシューを購入。
生クリーム使用なのに冷凍庫に保管してしまった・・・
これではシューシャーベットである
Google 日本語入力
Google日本語入力
http://www.google.com/intl/ja/ime/
流石Google
入力途中でも予測変換してくれるしなかなか凄い。
起動後はちょっと重いかなと思うが、使っていると気にならないぐらい速くなる。
ただ予測変換が災いしてGoogleで検索するとき予測単語列が被る。
PDO+MySQLは面倒である
Apache+PHP+PDO+Postgresqlの場合DSNにユーザ名を書いておきそれが
.pgpassに一致する接続設定がある場合パスワードを読んでくれるのでDSNさえ書けば
$pgsql_connect= new PDO($dsn)
これだけですむ。
mysqlの場合DSNにユーザ名をかけないしどうやら.my.cnfは適用されない。
$mysql_connection=new PDO($dsn,$username,$password)
とパスワードまでベタ書きしなきゃいけないらしい。
pgsqlに慣れてしまった今となっては
パスワードをweb領域外とはいえコードに書くのはいやだな。