Atlasのコア

うーん、いまいちAtlasとLiveGadgetの関係が理解しきれない。


papervision3d

Flash 8 および Flash 9 用の3Dエンジンだそうな。

デモとか見るとすごい。
MITライセンスで使えるとのことなので、公開が楽しみです。

個人的にはFlashがOpenGLをサポートしてくれると嬉しいのだけど…
なんかFlashはユーザの期待が高すぎるのか、開発力が足りてないのか、基本的に実装が後手に回っている気がする。
ニーズがあって、FlashDeveloperが無理をして、そのしばらくあとにFlashの仕様に取り込まれるという感じ?


全画面系Flashの閉じるボタン

いわゆるフローティングレイヤーにFlash載せて、ブラウザ上を動く何かとか作ったりするわけですが、Flash上の閉じるボタンを押した瞬間にFireFoxが音もなく落ちる現象発生。

FlashからはJavaScriptの関数を呼び出して、その関数が当該レイヤーと子であるFlash本体を消していて、とりあえずJS的にはこんなコード。

closeFlash: function() {
  Element.hide('test_div');
  Element.remove('test_swf');
 
  var so = new SWFObject("/swf/test.swf", "test_swf", "100%", "800px", "8", "#000000");
  with (so) {
    addParam("wmode", "transparent");
    addParam("allowScriptAccess", "always");
    write("test_div");
  }
}

あ、閉じたあと、またすぐ復旧できるようにFlashのオブジェクトを再作成しています。

Flash側でExternalInterfaceを使ってJSの関数を読んでいるのですが、どうやらその辺がくさい。
ExternalInterfaceは、戻り値を取るので、JS側の処理が終わると、Flashに制御が戻る。
しかしその時点でFlashのオブジェクトはすでに消されているので、行き場所がなくてブラウザが落ちる、ということでしょう。
IEは落ちないんですけどね。プラグインのアクセス方法とメモリの制御に関する違いか。

とりあえず、解決策として戻り値だけ先に返すようにした。
実際にオブジェクトを消去するのは、タイマーで少し遅延させてから。

closeFlash: function() {
  this.closeFlash2.callTimeout(200, this);
  return true;
},

closeFlash2: function() {
  Element.hide('test_div');
  Element.remove('test_swf');
 
  var so = new SWFObject("/swf/test.swf", "test_swf", "100%", "800px", "8", "#000000");
  with (so) {
    addParam("wmode", "transparent");
    addParam("allowScriptAccess", "always");
    write("test_div");
  }
}

prototype的な書き方で遅延処理を実行するために今回使ってみたのは以下。

便利だ。


Picasa2の表示モード

リモートデスクトップ用に色数減らすモードとかあったんですね。
確かに便利かも。

で、これをUltr@VNCで接続された時点で自動的に有効になるようにしたいのだけど…
どうしたものかな。

Ultr@VNCからPicasaのモードを変更させる方が現実的かな。


javascriptのカラーパレット

カラーパレットが必要になって少し探してみた。
prototypeとか使って、最近の流行りっぽく作ってるものを主に調査。

最近話題のDojo。しかしこれはちょっと…
見た目がイマイチ…

というワケで、見つけたのがこちら。

イケてる。
しかもクリエイティブコモンズライセンス。

簡単に組み込めるし超便利。

あー、そっか。背景を一色に塗りつぶして、PNGのアルファブレンディングで合成すれば明度・彩度のカラーチャートが作れるのね。
IE6、FF2.0、Opera9で正しく表示されることも確認。
色減らしたい場合も改造簡単そうだし。
これはJS上のグラフィックステクニックとして色々使えそう。


Array.prototype.findByTagName

prototype.jsをちょっと拡張。

Array.prototype.findByTagName = function(tagName) {
  return this.find(function(value, index) {
    return (value.tagName && value.tagName.toUpperCase() == tagName.toUpperCase());
  });
};

ノードリストから、特定のタグの最初の要素を返す。
直下の子ノードの中からある要素を探したりするのに使う。
こんな感じで。

var elem = $A(node.childNodes).findByTagName("DIV");

getElementsByTagNameだとツリー以下を全部検索してしまうのでね…


IMAPに移行したい症候群

xmailserverと連携でIMAP使えるようにできるらしい。
時間が取れたら導入してみよう。

でも良く考えたら、もうメールクライアントとかいらなくて、出来のいいWebメーラがあればいい気がしてきた。


OpenCVをPHPから使いたい

使いたい。使えるようにしたい。

とりあえず現状ただの妄想。

それともすでに何かいい感じのあれがあったりしますかね?


qooxdoo 0.6.3 リリース

リリース早いなー。

今回はクラス名の変更とかイベントハンドラ関係が変わったらしい。
あと、自動以降サポートツールが提供されてます。

Pythonで記述されたスクリプトで、jsファイルを0.6.2から0.6.3に対応するように変更してくれるようです。
ちょっとまだ未実験。


qx.ui.table.Tableのデータ変更とチェックボックス

qooxdoo 0.6.2でサンプルに入ってたtableをちょっと変更してチェックボックスの変更ができるようにしてみた。

基本的には qx.ui.table.SimpleTableModel を作成して、 setColumnEditable で目的の列を true に設定すれば、変更可能になる。
チェックボックス表示にしたい場合は、列の値にbool値を入れて、レンダラをセットすればOK。

setDataCellRenderer(2, new qx.ui.table.BooleanDataCellRenderer());

この状態で値を変更しようとセルをダブルクリックすると、セルにtrue/falseの文字列が出てきてしまうので、CheckBox 用の CellEditorFactory をセットしてやる必要がある。

setCellEditorFactory(2, new qx.ui.table.CheckBoxCellEditorFactory());

そんな感じでまとめたのが以下。
マウス操作だけでテーブル内のチェックボックスを編集可能。

// table model
var tableModel = new qx.ui.table.SimpleTableModel();
tableModel.setColumns([ "ID", "テキスト", "チェック" ]);
var rowData = [];
tableModel.setData(rowData);
tableModel.setColumnEditable(2, true);

// table
var table = new qx.ui.table.Table(tableModel);
with (table) {
  set({ width: '100%', height: '100%', border:qx.renderer.border.BorderPresets.getInstance().thinInset });
  setMetaColumnCounts([1, -1]);
  getSelectionModel().setSelectionMode(qx.ui.table.SelectionModel.SINGLE_SELECTION);
  getTableColumnModel().setDataCellRenderer(2, new qx.ui.table.BooleanDataCellRenderer());
  // CheckBox 用の CellEditorFactory をセット
  getTableColumnModel().setCellEditorFactory(2, new qx.ui.table.CheckBoxCellEditorFactory());
  setColumnWidth(0, 80);
  setColumnWidth(1, 200);
  setColumnWidth(2, 100);
};
HorizontalBoxLayout_1.add(table);

これで解決…と行きたかったのだが、どうにも、
セルをダブルクリックして編集可能状態に→シングルクリックでオン/オフ切り替え→確定
という手順を踏まないといけない…めんどい。
何とかならんものか。

あとついでにセルのデータが変更されたときに何かする方法。

table.get("tableModel").addEventListener("dataChanged", function(e) {
  var col = e.get("data")['firstColumn'];
  var row = e.get("data")['firstRow'];
  var value = e.get("target").getValue(col, row);
  …
});

範囲が必要な場合は lastRow と lastColumn も使える。