ExtJS GridPanel の cellclick イベントを使う

マニュアルどおりでうまくいかなかったのでメモ。
ExtJS 3.1 で動作確認。

var grid = new Ext.grid.GridPanel({
  // 中略
  listeners: {
      cellclick: function( grid, rowIndex, columnIndex, e) {
        var record = grid.getStore().getAt(rowIndex); // rowIndex番目のレコード取得
        var fieldName = grid.getColumnModel().getColumnId(columnIndex); // columnIndex番目のフィールド名取得
        var data = record.get(fieldName); // 指定座標のセルの内容を取得。
        alert(data); // 表示。
      }
  }
});

参考:
ExtJS GridPanel

HTTP – Locationヘッダには相対URLを使ってはいけない

HTTP の仕様(RFC2616)では、 Location ヘッダは絶対URIでなければならないと今更知りました。
Hypertext Transfer Protocol — HTTP/1.1(日本語) 14.30:

Location = “Location” “:” absoluteURI

ちなみに絶対URI(absolute URI)とはRFC2396によるとスキームから始まるURIのみを指します。
スラッシュ(“/”)から始まる URL が絶対URLと言われることがありますが、正確には絶対パス(absolute path)指定の相対URLであり、絶対URLではありません。

absoluteURI = scheme “:” ( hier_part | opaque_part )
hier_part = ( net_path | abs_path ) [ “?” query ]
relativeURI = ( net_path | abs_path | rel_path ) [ “?” query ]
net_path = “//” authority [ abs_path ]
abs_path = “/” path_segments

 
ただ、ほとんどのブラウザで相対URLへのロケーションを寛容に解釈してくれます。
lynx では警告が出るようですが、一般向けには携帯でさえ(mova など余程古いものを除けば)意図通りにリダイレクトしてくれるようになり、仕様違いでも問題がほぼなくなってしまいました。
 
相対URLが便利なのも事実。なのでもしかしたら HTTP 2.0 ができるときには相対URI可、なんてことになるかもしれませんね。

SWFObject – IE で Flash から fscommand が実行できない対策

IE で Flash ムービー(foo.swfなど)を innerHTMLなどで動的に埋め込むと, VBスクリプトでイベントを取れなくなるのが原因のようです。
 
対策は、SWFObject FAQに書かれているように

5.なぜ動的なパブリッシュを行うとインターネットエクスプローラーで fscommand が動かなくなるのか。
Adobe は fscommand をインターネットエクスプローラーで動作させるため、
FSCommand 呼び出しを受け取り JavaScript に転送するための VBScript を追加するように推奨しています。
ですが SWFObject の動的なパブリッシュメソッドで行っているように、
innerHTMLや outerHTML などを使って Flashムービーを挿入する場合には VBScript は全く動作しません。
 
運がいいことに、VBScript の代わりに JavaScript を使っても fscommand の呼び出しを受け取る方法があります。
このちょっと下にあるコードではプロプライエタリ(訳注:専用の?)属性(を、あなたのコードをおかしくさせないために、さらに条件分岐コメントで括ったもの)を使っています。
 
例として、下のVBScriptは、

<SCRIPT LANGUAGE=VBScript>
on error resume next
Sub myCom_FSCommand(ByVal command, ByVal args)
  call myCom_DoFSCommand(command, args)
end sub
</SCRIPT>

次のように置き換えることが可能です。

<!–[if IE]>
<script type=”text/javascript” event=”FSCommand(command,args)” for=”myCom”>
  myCom_DoFSCommand(command, args);
</script>
<![endif]–>

 
注意:Flash 8 以上でパブリッシュしている場合、JavaScript – ActionScript間の通信には fscommand() を利用するよりも ExternalInterface が推奨されています。
 
コードの例は SWFObject のテストスイートでも見つけることができます。

参考:
FlashとJavaScriptの連携
SWFObject v2.0 ドキュメント日本語訳
Why doesn’t fscommand work in Internet Explorer with dynamic publishing ?(SWFObject FAQ)
ExternalInterface(ActionScript 3.0 コンポーネントリファレンスガイド)

コマンド引数の文字数制限 – Argument list too long

UNIX系OSで実行するコマンドの最大の長さは execve(2) の制限に依存するそうです。

プログラムの実行引数の制限については、長さの制限は OS によって異なり、FreeBSD では 64KB、Linux のあるディストリビューションでは 128KB、SunOS4〜Solaris は 1MB、HP-UX 10.20 までは 20KB (パッチを当てれば 2MB)、HP-UX 11.x 以降は 2MB です。

この値は伝統的に ARG_MAX というマクロ定数で定義されているため、使っている UNIX, Linux, Mac OS X の ARG_MAX を調べたい場合は /usr/include を ARG_MAX で grep するか、getconf コマンドを使って

% getconf ARG_MAX

結果:

65536

とすることで調べることができます。

FreeBSD なら sysctl で

% sysctl -A kern.argmax

結果:

kern.argmax: 65536

としてもいいです。
なお、ARG_MAX は 4096 以上であるべき、と POSIX には規定されています。

2017年2月現在のコマンドライン最大文字数の参考値が知りたくて、
手元のマシンいくつかで試してみました。

  • CentOS release 6.8 (Final / さくらのVPS) … 2621440文字

  • Scientific Linux release 6.2 (Carbon / さくらのVPS) … 2621440文字

  • Mac OS X Sierra (Macbook Pro 2015) … 262144文字

  • Debian(Jessie / さくらのクラウド) … 2097152文字

最低でも20万文字ということで、あまり気にする機会はなさそうですが、
もし大量のファイルを扱う場合などにArgument list too longエラーがでたときは、
以下のように xargs などを使うとARG_MAXの制限を回避できます。

grep foo /path/to/too-many-files/*

たとえばこのように、ワイルドカードでエラーが出てしまう場合、

echo /path/to/too-many-files/* | xargs grep foo

のように echo と xargs を組み合わせるとエラーなく動作します。

なぜこれならエラーにならないかというと、echoはプログラムではなくシェルの内部コマンドなので文字数制限(ARG_MAXの制限)を受けないためです。

また、xargsはARG_MAXの値を把握しているので、引数がARG_MAXを超えそうになると、自動的に複数回に分割して実行してくれるため、ARG_MAXの問題を回避することができます。

Thunderbird – 「セキュリティエラー ドメイン名が一致しません」対策

TSL 接続で POP 受信しようとした証明書エラーが出る場合、
下のアドオンを入れると便利です。
 
Remember Mismatched Domains

「ドメイン名の不一致」と「サーバ証明書の期限切れ」のセキュリティ警告ダイアログに「このドメインのための証明書について今後は警告しない」というチェックボックスを追加し、次回以降、警告を非表示にできます。

 
本来は正規に取得した証明書を使うべきなのですが、わざわざPOPアクセスドメイン(pop.example.com)のために証明書を買えない状況や、そもそもメインドメイン(example.com)の証明書がオレオレだったりする場合もあるわけで。。
 
ご参考までに。
 
– 参考:
セキュリティエラー:ドメイン名が一致しません(mozillaZine)

ランダムポートは個人を特定しやすくなる、ということ

P2P の実用性について書かれている高木さんの記事が面白かった。
 
ドワンゴ勉強会でお話ししたこと
 
その中で得に気になったのは、匿名性のためにはランダムポートでなく固定ポートで待ち受けるべき、という話です。
 
待ち受けるポートをランダムにすると、ポート単位規制の回避、接続ポートを知らない不特定のクライアントからのアクセス防止といったメリットがある反面、ユーザの少ないネットワークにおいてIPが変わってもポート番号でユーザを結びつけて追跡されうるデメリットがあるとのこと。実際、氏は「ダウンロード違法化反対家の知られるべき実像(高木博光@自宅の日記)」にてこの手法で追跡を行っている。
 
ユーザの匿名性・安全性を考えた対応が、逆にユーザの追跡を容易にさせてしまうというのが皮肉です。

_except_handler4_common が msvcrt.dll から見つかりませんでした

ある日メッセンジャーを立ち上げようとしたところいきなり次の警告ダイアログが出るようになった。


———————–
MsnMsgr.Exe – エントリ ポイントが見つかりません


———————–
プロシージャ エントリ ポイント _except_handler4_common がダイナミック リンク ライブラリ msvcrt.dll から見つかりませんでした。


———————–

OKを押して閉じると問題なくそのまま利用でき, Firefox 3.5 を起動しようとしても同じダイアログがでる。支障がないとはいえ毎回ダイアログがでるのは鬱陶しいので調べてみたところ、Windows Vista 以降にしかないはずの dwmapi.dll が Windows XP 環境にあると発生するらしい。
 

C:\windows\system32\dwmapi.dll

を適当にリネームしたところダイアログが出なくなったのでそのまま削除して問題解決。
 
参考:
msvcrt.dll error message when starting Firefox 3.5

PHPでDBレコードをソートする

レコード…連想配列の配列…は、MDB::fetchAll() や DB::getAll() の結果の書式で見られるように一般的なデータ構造書式です。
たまにはコードを上げてみよう、ということで汎用関数としてレコードソート関数を作ってみました。実装コードおよびサンプルは下のほうにあります。
特に著作権等は主張しませんのでご自由にお使いください。
 
書式:

int sort_records(&$records, $key, $descent = false);


実装コード:

/**
 * DBなどのレコードを任意のキーでソートする。
 * PHP 4.4.9, PHP 5.2.8 で動作確認。
 *
 * @author ecoop.net
 * @access public
 * @param array &$records DBなどレコードの配列
 * @param string $key ソートの基準にするカラムの名前。省略時は第一カラムでソート。
 * @param boolean $descent true なら降順で結果を返す。省略時は false
 * @return bool 成功なら true を返す
 */
function sort_records(&$records, $key = null, $descent = false){
  if(!$records || !is_array($records)){ return false; }
   
  // $key が省略された場合は第一レコードの第一カラムを名前を取得
  if(is_null($key)){
    $t = array_values($records);
    $t = array_keys($t[0]);
    if(!$t){ return false; }
    $key = $t[0];
  }
  // —-
  $map = array();
  foreach($records as $i => $v){
    if(!is_array($v) || !isset($v[$key])){ return false; }
    $map[$v[$key] .’_’. $i] = $v;
  }
  
  if($descent){
    $res = krsort($map);
  }else{
    $res = ksort($map);
  }
  $records = array_values($map);
  return $res;
}

利用例:

// 元データ
$records = array(
array(‘age’ => 24, ‘name’=>’john’),
        array(‘age’ => 33, ‘name’=>’george’),
        array(‘age’ => 56, ‘name’=>’bill’),
        array(‘age’ => 50, ‘name’=>’steven’),
);
// name カラムでソート
sort_records($records, ‘name’);
print_r($records);

結果:

Array
(
    [0] => Array
        (
            [age] => 56
            [name] => bill
        )
    [1] => Array
        (
            [age] => 33
            [name] => george
        )
    [2] => Array
        (
            [age] => 24
            [name] => john
        )
    [3] => Array
        (
            [age] => 50
            [name] => steven
        )
)

ImageMagickでコマンドラインからアニメーションGIF 1フレーム目を抽出, PNG画像から透過をはずす

– GIF アニメの1フレーム目のみを取り出す(出力はpngでもjpgでも可)

convert from.gif[0] -coalesce to.gif

 
– 透過 PNG 画像のアルファチャネルを除去する
透過を完全になくす時は PNG24 で出力します。
PNG8(パレットモード)にしないのは, PNG8 は GIF と同様パレットの1色を透過色として使うためです。

convert from.png png24:to.png

FireMobileSimplator 1.1.9 リリース

FireMobileSimulator更新されていました。
ホスト限定で有効にできるようになり、ますます便利になりましたが、ソースコードを追ってみたところこのリリースノートで明言されていない隠された機能がありました。
 
この設定、実は正規表現なんですね。

^example\.com$

のようにホスト名が完全一致するときだけ有効にしたり、

^mobile\.

のように mobile. から始まる全てのホストで有効にする、などかなり自由に設定ができます。