ウィンドウが非アクティブの時にタスクバーで点滅させる

.NET Framework のクラスライブラリではタスクバーでの明滅が提供されていない(Form.Activate() は非アクティブの時呼ぶとウィンドウが再前面になる)ため、Win32API の FlashWindow() を利用します。

using System.Windows.Forms;
using System.Runtime.InteropServices;
 
public class Form1 : Form {
    // 点滅用 Win32API のインポート
    [DllImport(“user32.dll”)]
    private static extern bool FlashWindow(IntPtr hwnd, bool bInvert);
    public static void FlashWindow(System.Windows.Forms.Form window) {
        FlashWindow(window.Handle, false);
    }
     
    // ウィンドウを点滅させる
    // (ウィンドウがアクティブな時は何もおこらない)
    private void ExecExample(){
        FlashWindow(this);
    }
}

 
参考:
FlashWindow(user32)(pinvoke.net)
Win32 APIやDLL関数を呼び出すには?(@IT)

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