Poderosa
http://ja.poderosa.org/
タブ式 GUI、プラグインで拡張可能な端末らしいです。
あちこちに何本もコネクション張るので、タブなのは便利そうです。
なお、動作には .NET Framework 2.0 を必要とします。
投稿者: editor
無償で使える VMWare Player
PEAR – DB から MDB2 への移行
This package been superseded by MDB2 but is still maintained for bugs and security fixes
(意訳: このパッケージの代わりに MDB2 が使われるようになりましたが、バグ、セキュリティの修正はまだ続けられています)
とあったので、PEAR::DB から PEAR::MDB2 への移行について書かれているサイトをメモしておきます。
DB to MDB2 migration
参考/情報元:
– PEAR::MDB2
– MDB2 Homepage
PHP で HTTP 認証情報を取得する
HTTP 認証に成功した上でスクリプトにアクセスした場合、
$_SERVER[‘PHP_AUTH_USER’]
に HTTP 認証した時のログインユーザ名が格納されます。
認証に失敗した、あるいは認証が行われていない場合は空になるため、
この変数を調べることでログイン状態を調べることが可能です。
参考:
– PHP による HTTP 認証(公式マニュアル)
Flash の IE 仕様変更対応のための汎用 JavaScript クラス
<object> が自動でアクティブ化しなくなった([2006-04-18] 参照)対策には
SWFObject (旧 FlashObject )を使うと楽に対応できます。
<script type=”text/javascript” src=”../js/swfobject.js”></script>
<!– 略 –>
<div id=”flashcontent”></div>
<script type=”text/javascript”><!–
// SWFObject(filepath, id, width, height, version, bgcolor)
var so = new SWFObject(“main.swf”, “foo”, 960, 640, “6”, “#FFFFFF”);
so.write(“flashcontent”); // id=flashcontent に対して書き出し
// 今回の肝はここまで。
//–></script><noscript>
<!– JavaScript OFF の時は既存の object, embed タグを表示 –>
<object classid=”clsid:d27cdb6e-ae6d-11cf-96b8-444553540000″
codebase=”http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0″
width=”960″ height=”640″ id=”foo” align=”middle”>
<param name=”movie” value=”main.swf”><param name=”bgcolor” value=”#FFFFFF”>
<embed src=”main.swf” loop=”false” menu=”false” quality=”high” bgcolor=”#FFFFFF”
width=”960″ height=”640″ name=”foo” align=”middle”
type=”application/x-shockwave-flash”
pluginspage=”http://www.macromedia.com/go/getflashplayer”>
</object>
</noscript>
なお、SWFObject は MIT ライセンスで公開されているため、制限なく利用が可能です。
参考:
– SWFObjectのドキュメントを日本語に翻訳してみたよ
– SWFObject(公式 / 上の原文)
RDBMS で任意のレコードが、指定した条件、順序の時に何番目になるかを調べる SQL 文について
SELECT * FROM a_table WHERE condition ORDER BY a, b DESC, c
の場合は、ID の a,b,c の値をそれぞれ an, bn, cn とした時、
前からの位置 n
{n| 0 <= n < (SELECT COUNT(*) FROM a_table)}は
SELECT COUNT(*) AS n FROM a_table WHERE
condition AND
(
(a < an) OR
(a = an AND b > bn) OR
(a = an AND b = bn AND c < AS cn )
) — … (A)
の結果となる。
例:
NO: 0 1 2 3 4 5 6 7 8 9 10 11
ID: 0 1 3 5 7 9 10 11 15 20 21 23
a: 1 1 1 1 2 2 2 2 3 3 3 3
b: 4 4 2 0 3 2 1 1 4 3 3 3
c: 0 1 0 2 3 3 2 3 2 3 3 4
テーブルの内容が上記の NO を除いた ID, a, b, c を属性として持ち
検体の ID が 10 の時
a < an を満たす要素は an == 2 なので 4 個 ..(1)
a = an AND b > n を満たす要素は bn == 1 なので 2 個 ..(2)
a = an AND b = bn AND c < AS cn を満たす要素は cn == 2 なので 0 個 ..(3)
全ての計算は排他なので (A) の結果は (1)+(2)+(3) = 6
これは 0 番目から数えた時の 位置 NO に一致する。
PHP_Error とエラー処理
PEAR を利用しているとよく
$res = $conn->query(“SELECT no_such_field FROM a_table”);
if(PEAR::isError($res)){ // DB::isError($res) も同じ
die($res->getMessage()); // エラー表示して終了
}
という表記をしますが、全ての PEAR パッケージについて統一的にエラー処理したい場合は PEAR::setErrorHandling() というメソッドが有用です。
たとえば、次のコードは上のものと同様の結果になります。
// PEAR_ERROR_DIE: PEAR_Error がインスタンス化されたら getMessage() を出力して終了するようにする。
PEAR::setErrorHandling(PEAR_ERROR_DIE);
// あとは普通に実行
$res = $conn->query(“SELECT no_such_field FROM a_table”);
// ※ここでエラー処理は不要!
詳細なエラー処理を行いたい場合は PEAR_ERROR_CALLBACK を利用します。
// 例1:
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, “var_dump”);
// エラー発生時に
// if(PEAR::isError($res)){ var_dump($res); }
// とするのと等価
// 例2:
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, “error_exit”);
function error_exit($pear_err){
die($pear_err->getMessage().”:”.$pear_getDebugInfo());
}
// エラー発生時にユーザ定義関数 error_exit を呼び出すのと等価
static に呼ばずインスタンスメソッドとして setErrroHandling をコールした場合、そのインスタンスについてのみ、ハンドリングします。
参考:
– PEAR 基底クラス – はじめに
タイムスタンプでマイクロ秒ではなく整数秒を利用する
PostgreSQL では
SELECT CURRENT_TIMESTAMP
SELECT now()
などとすると、
2006-08-02 22:14:42.642554
のように、小数点以下の秒数まで表示してくれます。
これはこれでいいのですが、小数点秒を扱う必要のないケースもあります。
その場合は、timestamp(0) 型として扱うことで小数点以下を四捨五入します。
SELECT CAST(CURRENT_TIMESTAMP AS timestamp(0))
のようにすると、先程の結果は次のようになります。
2006-08-02 22:14:43
テーブルの場合も、
CREATE TABLE foo (
created_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
から
CREATE TABLE foo (
created_on timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP
);
のようにすることで、整数秒として保存するようになります。
トランザクションでロールバックされない処理
BEGIN
— 任意の処理 ..(A)
ROLLBACK
とすれば、(A)で何をしてもロールバックしてくれるものだと思っていたらそれは勘違いのようです。
たとえばシーケンスなど
create sequence seq;
BEGIN;
SELECT nextval(‘seq’); — (B)
SELECT nextval(‘seq’); — (C)
ROLLBACK;
SELECT nextval(‘seq’); — (D)
としても (B) == (D) にはならず、BEGIN, ROLLBACK で囲まなかった場合と同じになります。
PGSQL-JP ML によると
– http://www.drive.ne.jp/iMA/showmail.pl?pgsql-jp=3098
素人的な考えだと、transaction 内での処理なんだから、値を戻して
くれてもよさそうなものなのに、と思うのですが。。#Oracle でも sequence は戻らないと聞いたので、出来ないのが普通
#なのかなあ?
他にも戻らないものとしては、
create table
create index
create sequence
があります(他にもあるかも)。商用DBでも多分同じです。
公式 PGSQL ML の引用
It’s normal behaviour.
Sequences are locked only for duration of nextval call, not for
transaction! So, one sequence may be used simultaneously
by many transactions. No way to rollback sequence changes.
意訳: シーケンスのロックは nextval 呼び出しについてのロックであり、トランザクションのためのロックではありません。一つのシーケンスが同時に複数のトランザクションで利用されうるため、シーケンスの変更をロールバックする方法は存在しません。
ということですが、単純に、一つのテーブルで serial (bigserial)として利用していて、他で nextval が呼ばれないことをシステム的に保証していれば、テーブルロックを使い、ROLLBACK 時にシーケンスを元に戻してやれば、一応実現は可能かなと思います。
GD でマスク処理
ふと、ImageLayerEffect() という関数を見付けたのですが、情報がなかったため、使い方を書いておきます。
User Contributed Notes より..
bool imagelayereffect ( resource image, int effect )
この関数は全ての描画関数の処理に影響を与えるという点で、既存の関数 ImageAlphaBlending() と似ています。(以下に示す)エフェクトモードを切替えることで既存の関数の機能を拡張できます。
effect には以下のうちいずれか一つを指定します。
IMG_EFFECT_REPLACE
ピクセル置換を利用します(ImageAlphaBlending(FALSE) と同等)
IMG_EFFECT_NORMAL
通常のピクセルブレンディングを利用します(ImageAlphaBlending(TRUE) と同等)
IMG_EFFECT_OVERLAY
オーバーレイルーチンを利用します。オーバーレイは、黒い下地のピクセルは黒のまま、白い下地のピクセルは白のままですが、グレーの下地のピクセルに対しては上に乗るピクセルの色をとります。
当然気になるのは、IMG_EFFECT_OVERLAY です。
説明にある下地のピクセル(background pixels)というのは、たとえば imagecopy() を使う時の、コピー先の画像のそれぞれのピクセル、上に乗るピクセル(foreground pixels)というのはコピー元の画像のそれそれのピクセルにあたります。
下地がグレー(0x7F7F7F)の時は上に乗る色、
RGB のそれぞれが 0 に近付くほど、上に乗る色のそれぞれの色を暗くし、0になると元の色によらず 0 になります。つまり全てが0になると真黒(0x000000)になります。
同様に FF に近付くほど、元の色が明るくなり全てが FF になると真っ白(0xFFFFFF)になるようです。
例: 画像の任意の部分を黒に塗りつぶす
$im = imagecreatefromjpeg(“sample.jpg”); // 任意の元画像
// 画像サイズ
$w = imagesx($im);
$h = imagesy($im);
// 非透過
$c_visible = 0x007F7F7F;
// 背景(黒)
$c_bg = 0x00000000;
// 中央に円のあるマスクを作成
$im_mask = imagecreatetruecolor($w,$h);
imageFilledRectangle($im_mask, 0,0, $w,$h, $c_bg);
imageFilledEllipse ($im_mask, $w/2,$h/2, $w,$h, $c_visible);
// コピー先のエフェクトモードを変更(デフォルトは IMG_EFFECT_NORMAL)
imagelayereffect($im_mask, IMG_EFFECT_OVERLAY);
// 元画像にマスクを適用(結果はマスクに上書き)
imagecopy($im_mask, $im, 0,0, 0,0, $w,$h);
imagedestroy($im);
// マスク結果を出力
imagepng($im_mask);
imagedestroy($im_mask);
非透過とある部分を、 たとえば 0x00FF007F にすると、非透過部分のそれぞれのピクセルに対し、R 要素を FF, G 要素を 0, B 要素をそのままで出力します。
また、α値も組合せることが可能です。
例:画像の任意の部分を透過する
$im = imagecreatefromjpeg(“sample.jpg”); // 任意の元画像
// 画像サイズ
$w = imagesx($im);
$h = imagesy($im);
// 非透過
$c_visible = 0x007F7F7F;
// 背景(透過)
$c_bg = 0x7F7F7F7F;
// 中央に円のあるマスクを作成
$im_mask = imagecreatetruecolor($w,$h);
imagelayereffect($im_mask, IMG_EFFECT_REPLACE); // 透過色塗りのため上書きモードに変更。
imageFilledRectangle($im_mask, 0,0, $w,$h, $c_bg);
imageFilledEllipse ($im_mask, $w/2,$h/2, $w,$h, $c_visible);
imagelayereffect($im_mask, IMG_EFFECT_NORMAL); // 透過色を透過するため通常モードに戻す。
// コピー先のエフェクトモードを変更(デフォルトは IMG_EFFECT_NORMAL)
imagelayereffect($im_mask, IMG_EFFECT_OVERLAY);
// 元画像にマスクを適用(結果はマスクに上書き)
imagecopy($im_mask, $im, 0,0, 0,0, $w,$h);
// 透過色を保存する設定
imagesavealpha($im_mask, true);
imagepng($im_mask);
imagedestroy($im);