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(公式 / 上の原文)

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 基底クラス – はじめに

IE で PNG-24 が透過されない

IE6 でアルファチャンネルで透過している PNG を単純に<img>で表示させるとαチャンネルが無視されるという仕様のようです。
この対策を調べたところ、filter を使った解決方法がありました。
 
ieでPNGを表示させる
 
ここを参考に IE の時のみ

<img src=”blank.gif” style=”filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’<画像のURL>’,sizingmethod=image);”>

のように、空画像へのフィルタとして実体画像を指定することで表示できました。

AS3 を試す

http://www.dango-itimi.com/blog/archives/2006/000897.html
にあるように、Flash9 AS3 ではクライアントでの画像生成(BMP,JPG,PNG)など、バイト列を直接操作できます。来春リリースだそうです。
 
Flash9 AS3 previewから開発環境がダウンロードできます(利用には Flash8 のライセンスが必要)
 
また、Flash9 Player は既にリリース済みです。
参考:
– PNGEncoder
– JPEGEncoder
ActionScript3.0 Tutorial
AS3.0 の記述の基本

LoadVars – 外部テキスト読み込みクラス

– Loadvars(livedocs)
 
例1:

var user = new LoadVars();
user.onLoad = function(success){
  if(success){
    trace(“名前: ” + this.name);
    trace(“年齢: ” + this.age);
    trace(“職業: ” + this.job);
    play(); // 読み終ったら次のフレームに。
  }else{
    trace(“失敗”);
    return;
  }
}
user.load(“user.txt”); // 中身は name=John&age=24&job=Fireman とする
stop();

例2(任意書式のテキストデータを読む):
CSV データ等を読む場合は LoadVars.onData() を使います。

var mesLoader = new LoadVars();
_global.message = ”;
mesLoader.onData = function(src){
   if(src == undefined){
      trace(“失敗”);
      return;
   }
   _global.message = src;
   play();
}
mesLoader.load(“message.txt”); // 中身は Hello, world! など任意。
stop();

参考:
– LoadVarsでテキストファイルを読み込む

Ethereal,Tethereal が FreeBSD の ports から消えてた

ローカルの ports で探してみて、net/ethereal にあったはずの Ethereal が見付からなくてアレッ!?と思って公式の cvsweb をあたって見たところ
次のように書いてました。
 
http://www.jp.freebsd.org/cgi/cvsweb.cgi/ports/net/ethereal/Attic/Makefile?hideattic=0

FILE REMOVED
 
Add wireshark and tshark after repocopies from ethereal and tethereal
respectively. Wireshark is a rename of ethereal after the principal
developer moved companies and lost the Ethereal copyright.
 
Messenger, don’t shoot!
 
Now the ethereal binary is called wireshark, the tethereal binary is
called tshark, and idl2eth is now idl2wrs. All other binaries have
kept the same name.
 
In addition to this name change, I have also changed the PREFIX from X11BASE
to LOCALBASE.

 
Ethereal(CUI 版: TEthereal) は主要な開発者が会社を辞めて商標権を失って wireshark(CUI 版: tshark) という別の名前で存続する事になった、ということです。
 
ということで ports を改めて見ると、 net/wireshark, net/wireshark-lite, net/tshark, net/tshark-lite が増えてました。
 
Wireshark の公式サイトは http://wireshark.org/ で、
現在、Ethereal 0.99 から更新された Wireshark 0.99.2 がリリースされています。
 
参考:
「Ethereal」は「Wireshark」に飲み込まれるのか?(ITpro)
Wireshark 公式サイト
Ethereal 公式サイト

WireShark – TCP の生のデータを保存する

Follow TCP Stream を使えば生の TCP ストリームデータを取得可能です。
 
例えば、HTTP で画像を取得して、その画像をファイルとして保存したい場合は
次のようにします。
 
1. HTTP/1.1 200 OK などの HTTP レスポンスパケットを選んで右クリック→Follow TCP Stream を選択
2. Follow TCP stream ウィンドウが開いたら、右下の Raw をチェック
3. Save As をボタンをクリック
4. 保存先を指定して保存(保存例: http_gif.dat|rs/http_gif.dat)
5. バイナリエディタを開き、0D 0A 0D 0A 以前(HTTP Header)を削除し、拡張子変更(変更例: 画像)
 
追記:
(2006-07-27)同日の別トピックに書きましたが、Ethereal は複製版が Wireshark として独立し、そちらが更新されています。

αチャンネルを画像から取り出す

convert drawn.png -channel matte -separate +matte matte.png

これで、drawn.png のαチャンネル(透過度)だけをモノクロで取得した画像を得ることができます。
参考:
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/channels/#matte
情報元:
http://blawat2015.no-ip.com/~mieki256/diary/0623.html

ImageMagick の convert で半透明な PNG を扱う

PNG はRGBとともにα値を保持しているので、半透明色というのも指定することが可能です。

# a.gif の白(#FFFFFF)を半透明(50%=0x80)にし、b.png として保存(入力の形式は任意ですが、出力は png 必須です)。
convert a.gif -fill “#FFFFFF80” -opaque “#FFFFFF00” b.png
# 半透明になったか確認のため背景画像 bg.jpg の上に b.png を重ね、
# c.jpg として保存する(背景、出力の画像形式は任意です)。
convert -compose over bg.jpg b.png c.jpg

参考:
– convert コマンドのオプションについては「指定した色を別の色に置き換える
」を参照。
– PNGについては JEvaHz Messages 1320-1331 を参考にしました。

PNGの透明化は大別して2種類の指定方法があり、色深度などにより厳密には
4種類のフォーマットがあります。
 
1.αチャンネルを用いる場合(Color type = 4 or 6)
  (8bit,16bit grayscale / 24bit,48bit color)
 RGB値もしくはgrayscale値に加え、ピクセル毎にα値(透明度)を保持。
 α値の深度は色深度と同じ。
 
2.tRNS(=transparency) chunkを用いる場合
  a.1,2,4,8bit indexed colorの場合(Color type = 3)
   個々のカラーに対し、8bitの深度の透明度を指定できる。
  b.1,2,4,8,16bit grayscale の場合 (Color type = 0)
   ある一つのgrayscale levelに対し、1bitの深度の透明度を指定できる。
  c.24/48bit colorの場合(Color type = 2)
   ある一つの色に対し、1bitの深度の透明度を指定できる。
 
(中略)
 
また、PNGの仕様によると透明化は必須ではないらしいので、
実装にばらつきがでるのはやむを得ないでしょう。
部分的な対応もOKだそうで…。

PNG Programming Resources