カテゴリー : 2009年 9月

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


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
        )
)

tips – アニメーション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