投稿者アーカイブ

Cache_Lite – lifeTime を場所によって変える時の注意点


PEAR の CacheLite を、短期キャッシュと長期キャッシュに分けて運用する場合、普通に automaticCleaningFactor を使っていると、思った通りに動作しなくなります。
 
automaticCleaningFactor は、現在設定されているlifeTimeを基準に、cache_dirの中の全ての古いファイルを掃除してしまいます。
 
save() で指定した group_id の古いファイル限定で掃除してくれれば融通がき くのですが、そもそも clean() の実装がそうはなっていない様子。
 
PEAR Bugにもこの問題が報告されていますが、現在のAPIを変えずに実装するのは困難として対応打ち切りになっています。
その代わり、解決案としてキャッシュの寿命別にフォルダ分けをする方法が紹介されていました。
 

Best practice then would appear to be that you create directories for each of your caches if you want to be using this autocleanfactor.
ここでの最良の習慣は、autocleanfactorを使う場合には(用途,寿命の違う)それぞれのキャッシュごとにディレクトリを分けて作る事です。

 
参考:
- non-specific automaticCleaningFactor(PEAR Bug)
- Cache_Lite(PEARマニュアル)

下部の検索バーで入力中に勝手にフォーカスが外れる


サーチエンジン用の検索バー(Search Bar/Ctrl-K)でなく、ページ内検索(Find Bar/Ctrl-F)のお話。
ある時からfirefox を使ってページ内検索すると、文字入力中に時々不意に検索バーがフォーカスを失ってページへのフォーカスに勝手に切り替わってしまうようになりました。
 
不便で悩んでいたのですが、どうやら「Fast Video Download (with SearchMenu)」アドオンが悪さをしているようで、この拡張を無効にしたところ無事元通りの動作になりました。
 
Fast Video Download の、文章をドラッグなどで選択した時に、選択文字列での検索コンテキストメニューを自動で出す機能(テレビマークのアイコンをクリック)が、検索バーの動作と干渉して発生しているようです。
 
追記:Mozilla Firefoxフォーラムでも同じ現象に悩んでいる方がいました。

The Find bar for finding text on a page has changed behavior and it is frustating to use
 (訳:ページ内文章の検索バーの動作が変わって使っていてイライラするようになりました)

解決コメントを見るとやはり原因は同じで、
Firefox 3.6 を入れることで Fast Video Download の動作が変わってしまったという書き込みがありました。

 (2010年3月21日19:01書き込み)dpn:
I disabled the plug-in called Fast Video Download. The problem is gone. I don’t know for sure if there is a connection.
 (訳:Fast Video Download というプラグインを無効にしたら、この問題は解決しました。関連はあるかどうかわかりませんが。

 (2010年3月21日19:10書き込み) Reg:
Yes, I see. Now I tried the same thing (disabled the Fast Video Download addon) and it seems to have fixed the problem here too. Strange though, since I had used the FVD addon without problem on the older firefox, and now it interferes even with the older firefox. Thanks for the info.
 (そうなんですか。同じ事(Fast Video Download アドオンを無効にする)を今やってみたら、こちらでも問題が解決したようです。でもおかしい事に、以前のバージョンのfirefoxではFVDアドオンを使っていても前はこのような問題は起きなかったのに、今では以前のバージョンのfirefoxにも干渉しているようです。情報ありがとうございます。

 (2010年3月21日 19:52 書き込み)Reg:
I have now completely uninstalled search menu and FVD addons, and also uninstalled firefox 3.6 (leaving personal profile information intact when given the choice by firefox uninstaller).
 サーチメニューとFVDアドオンを完全にアンインストールしてfirefox 3.6も(個人設定情報はアンインストーラの選択でで完全に残したままにして)アンインストールしてみました。
Then I downloaded older firefox 3.5.8 from the official mozilla firefox website and reinstalled the search and FVD addons on this older platform.
 (それから以前のfirefox 3.5.8 を公式mozilla firefox ウェブサイトからダウンロードして再インストールして、FVDアドオンをそこにインストールしました。)
Now everything is working again as prior to the firefox 3.6 upgrade. I will only upgrade to firefox 3.6 again if I’m sure all my addons will work properly.
 (それでfirefox3.6にアップグレードする前のままの状態で動いてくれるようになりました。firefox 3.6 にアップグレードするのは、私が使っているアドオンがちゃんと動いてくれるのを確認できてからにしようと思います。)

 
参考:
- Fast Video Download(with SearchMenu)
- The Find bar for finding text on a page has changed behavior and it is frustating to use(Mozillaフォーラム)

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 の 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 には規定されている。

参考リンク先に対策等も書いているので詳しくはそちらを参照してください。
参考:
UNIXの部屋 コマンド検索 xargs

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

tips – レコードをソートする


レコード…連想配列の配列…は、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
        )
)