makexmldocomomap の出力を PEAR の Net_UserAgent_Mobile で使えるようにするパッチ

単純に makexmldocomomap を実行すると <terminal … modeil=”SH902I” … > のように出力されたのですが、PEAR では <SH902I … >という形式を期待していて、そのまま DoCoMoMap.xml に適用すると動作しなくなったため次のように書き換えました。(Net_UserAgent_Mobile 0.27.0 で確認 cpan のほうは失念)
 
$ diff /usr/local/bin/makexmldocomomap{.bak,}

 21,22c21,22
 < push @{$map{terminal}}, {
 < model => uc($model),
 —
 > push @{$map{uc($model)}}, {
 > width => $width,

また、出力時にiモード HTML シミュレータの情報が書かれていないため、エミュレータでも利用するためには

  <ISIM0301 color=”1″ depth=”262144″ height=”320″ width=”240″ />
  <ISIM70 color=”1″ depth=”4096″ height=”182″ width=”163″ />

としてエミュレータの端末情報を指定する必要があります。
 
メモ:
SO902iWP+ 端末が

<SO902IWP+ color=”1″ depth=”262144″ height=”256″ width=”240″ />

となり、XML 的にエラーで次要素以降が読まれなくなるのは何か対処法あるんでしょうか。。
# 現在一番下に移すことで回避中。もちろんこれでは SO902i WP+ 自体は対応されないでしょうね(いろいろ未確認)。

関数, メソッドを動的に実行する

C の関数ポインタや、Java のリフレクションのように任意の関数、メソッドを呼び出すには次のようにします。

<?php
function greet(){ echo “Hello world!”;}
 
// 変数に () を付ける記法(関数のみ可)
echo “0: “;
$func=”greet”;
$func();
 
// call_user_func() を使った関数よびだし
echo “\n1: “;
$func=”greet”;
call_user_func($func);
 
// call_user_func() を使った静的メソッドよびだし
echo “\n2: “;
class Foo{
   function doit(){
      echo “static method called”;
   }
}
$method=array(“Foo”, “doit”);
call_user_func($method);
 
// call_user_func() を使った非静的メソッドよびだし
echo “\n3: “;
class Foo2{
  var $name;
  function Foo2($name){
    $this->name = $name;
  }
  function doit(){
    echo “non static method called (“.$this->name.”)”;
  }
}
$o=new Foo2(“abc”);
$method=array($o, “doit”);
call_user_func($method);
 
echo “\n”;
?>

上のコードを実行すると結果は次のようになります。

0: Hello world!
1: Hello world!
2: static method called
3: non static method called (abc)

参考:
call_user_func()

ハードディスクの中身を誤って消した場合のファイル復旧方法

http://opentechpress.jp/article.pl?sid=06/09/09/1417236&from=rss
 
PhotoRec というツールを使ってファイル復元を行う方法を書いている。Windows (9x,Dos,NT,XP), Linux, Mac OS X で利用可能。
参考:
– Windows で PhotoRec
 http://oss.moongift.jp/review/i-1587.html

IE でブラウザごと Flash を終了すると以後 IE で特定サイトが見られなくなる

具体的には Flash Player 7,8 9, Windows IE 6.0 を使い、
(loadMovie などで)ネットワーク通信中の Flash を IE ごと閉じる、という動作を一定回数(あるいは同一 Flash で一定本数アクセス中に)すると、閉じた Flash がアクセスしていたサーバについて、その Flash と同じプロセスの Win IE から一切アクセスできなくなる。
というもの。
 
netstat で見てみると、Flash を通信中に IE ごと閉じると、IE で使えるサーバとプロセスのコネクション本数(デフォルト2本)分、該当サーバに対して CLOSE_WAIT 状態で残っていました。
 
ここから推測するに、コネクションを使い切って止まっているのが原因のようです。
 
参考:
FLASH-JP.COM フォーラム
Flashcoders – IE: close_wait

シェルの for ループで for file in $filelist とした時の問題と対策

複数のファイルに対する処理を for ループで行うと

for file in file1 file2 ‘file3 abc’; do
  ls $file
done

のように書け、

file1
file2
file3 abc

のような結果になりますが、
ユーザが指定したファイル群に対して処理をしたいとき、for ループで次のようにすると

$filelist=”
file1
file2
‘file3 abc’

for file in $filelist; do
  ls $file
done

とすると、

file1
file2
‘file3
abc’

となってしまいます。
 
この対策として . でスペースを置換するアドホックな対応をしてみました。

filelist=”
file1
file2
‘file3 abc’

for file in ` echo “$filelist” | sed -e ‘s/\\./\\\\./g’ -e ‘s/ /./g ‘`; do # 既存の “.” は “\.” に, ” ” は “.” に置換
    file=`echo “${file}” | sed -e ‘s/\\./ /g’ -e ‘s/\\\\././g’` # 置換を元に戻す
    ls “$file” # “” で囲むのは必須
done

結果:

file1
file2
file3 abc

 
他にいい方法があれば是非御連絡を m(. .)m

画像の伸縮

1. 単純に -resize を使った場合、アスペクト比を維持する。

convert from.png -resize 600×100 to.png

結果: from.png が 1000×1000 の場合、 100×100 に変換される
 
2. サイズ指定の最後に ! を付与すると、アスペクト比を無視する。

convert from.png -resize 600×100\! to.png

結果: 元のピクセルサイズによらず、600×100 になる。
 
などなど。
 
なお、単純に伸縮するだけでフィルタ処理( -filter, -support)をしないなら、-scale のほうが速いようです。

convert from.png -scale 600×100\! to.png

 
参考:
ブログの木村研 – ImageMagick Tips#03 オプションでさらに便利に
ImageMagick – Command-line Options#resize

権限があっても削除/変更不可能にする

Linux なら chattr, FreeBSD なら chflags を使うことで、 root 権限でも rm -f で削除不可にすることが可能です。
たとえば /bin ディレクトリ以下すべてを削除不可能にするには

# Linux
chattr +i /bin

 

# BSD
chflags schg /bin/* /bin

 
とすれば削除できなくなります。
 
参考:
http://www.linux.or.jp/JF/JFdocs/Chroot-BIND-HOWTO-2.html
UNIX の部屋 chflags
FreeBSD memo – jail の作り方
MANPAGE of chflags