してログ

最近のブラウザは、showModalDialog で開いたウィンドウ内の遷移は普通に行えます。 しかし、IE8 では新しいウィンドウが開いてしまします。 ググると、iframe を入れて面倒なことして回避している輩もおられるようですが、そんなことしたくないですよね。 いろいろと調べてみると、海外のサイトに解決方法を見つけました。

IE8 はどうやらベースとなるターゲットが親ウィンドウかなんかに指定された状態で、ダイアログがオープンされているようです。 html のヘッダー部分に、ベース・ターゲットを自分自身にするよう指定すれば良いみたいです。

ベースターゲットの指定
<base target="_self" />

PHP でファイルを生成しブラウザにダウンロードさせるような処理なのですが、IE8 だけエラーが出てダウンロードできないようでした。 色々と調べてみると「Cache-Control: no-cache」が出ていると起こるようですので、下記のようにして対応しました。 最初は「Content-Disposition」に「attachment」を付けるとダメだと書いてあるサイトがあって悩みましたが、どうやら関係無いようです。

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.urlencode($attachmentname));
header("Cache-Control: public");
header('Content-Length: '.strlen($dat));
echo $dat;

IE8 よ、XP と共に去れ

「オブジェクトでサポートされていないプロパティまたはメソッドです。」

この呪文の詠唱を IE が始めたら、とりあえずマウスぶん投げて甘いもんでも補給しましょう。 さて、今回は trim が原因なのですが、なんと IE8 は実装されていません。 このような基本的な、文字列操作が実装されていないなんて、はっきり言って思いもよりませんでした。 まさに(・・)です。

ならば、正規表現なんかを使って解決してもいいのですが、jQuery が使える状態なら、下記のようにすれば良いと思います。 少し前なら IE6 がー、とか言ってたけど、IE8 お前もなのか。。。 Microsoft は間違えなく、インターネットの発展の足を引っ張ってると思います。

IE8 で動かないコード
var after = before.trim();
jQuery での代替
var after = $.trim(before);

まさか、PDO のバグだったとは。

PostgreSQL に格納されたバイナリデータ(bytea)を PDO で取得しようとすると、文字列としてしか取得できないバグがあり、5.2.6 で報告されたのに、5.3.28 でも治っていないようです。 おかげで、急ぎのプロジェクトなのに、かなりの時間をロスしてしまいました。 通常、バイナリデータの取得は、以下のように書きますが、このバグにより「xffd8ffdb00430005030404040....」のような文字列が返ってきます。

$sth = $pgsql->prepare("select id,mime,img from t_image limit 1");
$sth->execute();
$sth->bindColumn('id', $id, PDO::PARAM_INT);
$sth->bindColumn('mime', $mime, PDO::PARAM_STR);
$sth->bindColumn('img', $img, PDO::PARAM_LOB);
if ($sth->fetch(PDO::FETCH_BOUND)) {
	header("Content-Type: {$mime}");
	fpassthru($img);
	exit;
}

PDO を使う限り解決策がないため、ネイティブ系の関数を使うか、文字列をバイナリ列に直すしか無いと思われます。 この文字列をバイナリ列に直すコードは、下記のようなものになります。

$sth = $pgsql->prepare("select id,mime,img from t_image limit 1");
$sth->execute();
$sth->bindColumn('id', $id, PDO::PARAM_INT);
$sth->bindColumn('mime', $mime, PDO::PARAM_STR);
$sth->bindColumn('img', $img, PDO::PARAM_LOB);
if ($sth->fetch(PDO::FETCH_BOUND)) {
	header("Content-Type: {$mime}");
	fgets($img,2);
	$data = fgets($img);
	echo pack('H*',$data);;
	exit;
}

文字列で返る以上、扱うデータ量は倍になりますし、pack という重めの関数を用いなければならないため、速度や効率面ではあまりよろしくありません。 ネイティブ系の関数で書ける場合は、そちらのほうがお勧めです。 なお、fgets($img,2); の部分は先頭に入る「x」の文字を捨てるためで、第2引数が「2」なのは、この関数が第2引数マイナス1バイトを読み込むという仕様のためです。 これに気づくのに、2時間ほど要してしまいました(^_^;)

PostgreSQL に接続中のユーザー名を取得する方法です。セッションユーザーは、データベースセッションを開始したユーザー、カレントユーザーは、現在の実行ユーザーとなります。スーパーユーザーでなければ、ユーザー変更できないので、通常は同じユーザーが入ります。

セッションユーザ名
select session_user;
現在の実行コンテキストのユーザ名
select current_user;

他にも、スキーマ名、IPアドレスなど様々な情報が取れますが、それらについてはこちらをご覧ください。ストアドプロシージャなどで活用すると、ログ取得などなど、色々と便利そうです。

Windows のコマンド窓で Linux コマンドが使いたい、という要求にストレートに答えてくれるコマンド集を見つけました。この用途だと Cygwin がありますがあんまりスマートじゃないですしおすし。Gow は他のとちがってインストーラも用意されていて、さくっと利用可能にできます。

Gow - The lightweight alternative to Cygwin
https://github.com/bmatzelle/gow/

インストールすると、下記のコマンド群が利用可能になります。パスも通してくれます。更に、フォルダのコンテキストメニューに Command Prompt Here というメニューが追加されます。

インストール先の bin ディレクトリの内容
awk.exe
basename.exe
bash.exe
bc.exe
bison.exe
bunzip2.exe
bzip2.dll
bzip2.exe
bzip2recover.exe
cat.exe
chgrp.exe
chmod.exe
chown.exe
chroot.exe
cksum.exe
clear.bat
cp.exe
csplit.exe
curl.exe
cut.exe
dc.exe
dd.exe
df.exe
diff.exe
diff3.exe
dirname.exe
dos2unix.exe
du.exe
egrep.exe
env.exe
expand.exe
expr.exe
factor.exe
fgrep.exe
flex.exe
fmt.exe
fold.exe
gawk.exe
gdbm3.dll
gfind.exe
gow.bat
gow.vbs
grep.exe
gsar.exe
gzip.exe
head.exe
history5.dll
hostid.exe
hostname.exe
id.exe
indent.exe
install.exe
join.exe
jwhois.exe
less.exe
lesskey.exe
libcurl.dll
libeay32.dll
libiconv2.dll
libidn-11.dll
libintl-2.dll
libintl3.dll
libssl32.dll
ln.exe
ls.exe
m4.exe
make.exe
md5sum.exe
mkdir.exe
mkfifo.exe
mknod.exe
msys-1.0.dll
msys-regex-1.dll
msys-termcap-0.dll
mv.exe
ncftp.exe
nl.exe
od.exe
pageant.exe
paste.exe
patch.exe
pathchk.exe
pcre3.dll
plink.exe
pr.exe
printenv.exe
printf.exe
pscp.exe
psftp.exe
putty.exe
puttygen.exe
pwd.exe
readline5.dll
regex2.dll
rm.exe
rmdir.exe
scp.bat
sdiff.exe
sed.exe
seq.exe
sftp.bat
sha1sum.exe
shar.exe
sleep.exe
sort.exe
split.exe
ssh.bat
ssleay32.dll
su.exe
sum.exe
sync.exe
tac.exe
tail.exe
tar.exe
tee.exe
test.exe
touch.exe
tr.exe
uname.exe
unexpand.exe
uniq.exe
unix2dos.exe
unlink.exe
unrar.exe
unrar3.dll
unshar.exe
uudecode.exe
uuencode.exe
vim.exe
wc.exe
wget.exe
whereis.bat
which.exe
whoami.exe
xargs.exe
yes.exe
zip.exe
zip32z64.dll

PHP->PDO->ODBC で Microsoft SQL Server 2005 に接続する場合、バイナリ型があるとメモリを大量に消費してしまうようです。例えば、問い合わせ結果に image型がある場合、2GBのメモリが要求されます。これは、image型の最大容量に等しいサイズです。試しに、image型を2つ持ったテーブルを select してみたところ、4GBのメモリを要求されました(´・ω・`)

Fatal error: Out of memory (allocated 524288) (tried to allocate 4294967295 bytes) in ...

以前のバージョンでは、テンプレートを元に新しい空間データベースを作成しましたが、PostgreSQL 9.1 の CREATE EXTENSION で機能拡張としてインストールする形になりました。このため、PostGIS 2.1 では従前のテンプレートが無く、代わりにデータベースを作成した後、下記のコマンドにより空間データベースを構築します。

create extension postgis;

他にも、経路探索を行う pgrouting、トポロジー型をサポートする postgis_topology などがあるようです。また、日本では使えませんが、ジオコーディング用の機能拡張も用意されています。これらも同様に、CREATE EXTENSION で必要に応じてインストールできます。

PostgreSQLのシステムテーブルから、存在するテーブルやビューの一覧を得ることができます。 下記、SQL文の結果で、スキーマ名(nspname)、テーブルやビューの名前など(relname)、オブジェクトの種類(relkind)が返ります。 relkind は、テーブル(r)、ビュー(v)になります。

select
  c.oid,
  n.nspname,
  c.relname,
  c.relkind
from
  pg_catalog.pg_class as c
    inner join pg_catalog.pg_namespace as n on (c.relnamespace=n.oid)

中小企業基盤整備機構のセーフティ共済ですが、掛け金はすべて損金に算入できますので、節税対策に利用できます。昔、利用していたときは100万くらいまでしかダメだったんですが、今は800万まで掛けられるようです。業績が良くて課税額が膨らみそうな時、この共済に契約して年払いでいっきに支払って損金にします。そのまま寝かせておいて、ここぞという期に解約すればよい訳です。当然、解約した期の収入になるので、計画的に役員報酬などを増額しておきます。ただ一点だけ、40ヶ月(掛け金の納付月数)前に解約すると全額戻りませんので、3年寝かせるつもりでやりましょう。安心の政府系ですし、使い勝手も良いと思います。

中小企業倒産防止共済(セーフティ共済)
http://www.smrj.go.jp/tkyosai/index.html