URL をデコードするスクリプト

urldecode.php:
#!/usr/local/bin/php -q
<?php
$in=fopen(‘php://stdin’, ‘r’);
$stat = fstat($in);
while(!feof($in)){
     $buf = fgets($in, 10240);
     echo mb_convert_encoding(urldecode($buf),’EUC_JP’, ‘UTF-8’);
}
?>

簡単なコードですが、

cat access_log | urldecode.php

とかしてやると、検索単語が見えるようになって便利。ただし、この用途のためだけに書いたので、UTF-8 以外の形式でマルチバイト文字列を含んでると結果が化けます。

ファイルへのアクセス状況を調べる

fstat, lsof, fuser などのコマンドを使うと、現在開かれている全てのファイルと開いているユーザ、プログラム、プロセス、読み書きのモードが調べられます。
fstat は FreeBSD の場合で、fuser は Linux の場合、lsof は Linux, BSD を含む UNIX 互換 OS で利用可能です。BSD でlsof を使う場合は、 ports/sysutils/lsof を入れます。lsof は機能が豊富なので、lsof の利用をお勧めします。

fstat:
fstat [-fmnv] [-p pid] [-u user] [-N system] [-M core] [file …]
 
fuser:
fuser [-a|-s|-c] [-4|-6] [-n space] [-k [-i] [-signal] ] [-muvf] name

fuser -l
fuser -V
 
lsof:
lsof [ -?abChlnNOPRstUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [
+|-D D ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [
+|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t] ] [ -S
[t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ — ]
[names]

たとえば、ログファイルを開いているプロセス, ファイルを調べるには

lsof +D /var/log

等とします。
デバッグや問題究明に便利です。
 
参考:
– LSOF設置及び使用ガイド

J2EE でどのフレームワークを使うか。またデザインとの分離について

F’s Garage:日記
なかなか難しいなと常々思っているので、こういうの読むと安心。個人的には,突っ込みしてる方と同じで JSP + EL + Beans が多めです。loop についてはカスタムタグか、そのまま埋め込みかどちらか。これを読んで、カスタムタグも Java コードも使わない Plain Old HTML Pages で書けるのが一番デザインの分離ができそうな気がしてます。
 
参考:
– Nirvana Wiki

エンターキーで入力欄を移動する

事務入力とかでよくある機能です。TabIndex 属性に指定した順番で移動します。
IE のみ対応してます。
onKeyDown でキーコード(Event.keyCode)を書き換えているのがミソです。

<html><head>
<script type=”text/javascript”>
<!–
    function onKeyDown(){
         if(event.keyCode == 13){ event.keyCode = 9; }
    }
// –></script>
</head>
<body>
    <form>
        <input type=”text” value=”abc” onKeyDown=”onKeyDown();” tabIndex=”1″>
        <input type=”text” value=”def” onKeyDown=”onKeyDown();” tabIndex=”2″>
        <input type=”text” value=”ghi” onKeyDown=”onKeyDown();” tabIndex=”3″>
        <input type=”text” value=”jkl” onKeyDown=”onKeyDown();” tabIndex=”4″>
    </form>
</body>
</html>

C# で Java と同等のアクセス制限をかける

Java プログラマが C# を学ぶ際のメモその2。
 
– Java
public: どこからでもアクセス可
protected: 自クラス内と子孫クラス、または同一パッケージ内であればアクセス可(default 権限も兼用)。
default: 同一パッケージ内からのみアクセス可。アクセス修飾子を省略した場合のデフォルト。
private: 自クラス内からのみアクセス可。
 
– C#
public: どこからでもアクセス可(入れ子 enum,interface のデフォルト)。
protected internal: 同一アセンブリ(DLL ファイル, EXE ファイル等)内と子孫からアクセス可。
internal: 同一アセンブリ内からのみアクセス可(名前空間直下で宣言したコンテナのデフォルト)。
protected: 自コンテナ(クラス等)内と子孫からのみアクセス可。(Java と違い同一名前空間は不可)
private: 自コンテナのみからアクセス可(入れ子 class, struct のデフォルト)。
 
注意すべきは、protected の動作の違いと、default(Java) と internal(C#) の制限範囲の違いです。
Java では、パッケージレベルでの制限が可能ですが、言語で制限をかけただけだと外部ファイルからのパッケージへの侵入が可能です。
これを防ぐには JAR を作る時にシーリング機構を利用すれば、そのパッケージの利用者の侵入を制限することができます。
マニフェストの不正な書き換えを防ぐにはJARへの署名機能等を使えばよさそうです。
 
C# では、アセンブリ(プログラム, ライブラリ)単位でのアクセス制限が可能で、名前空間単位では制限できません。アクセス制限がソースファイル単位ではないことに注意してください。
参考:
C# プログラマーズリファレンス – アクセシビリティレベル
JARマニフェストのメイン属性
– JavaHouse Brewers 19189 – Package Joining Attack(JDK1.2 での話)

パケットキャプチャツール

昔(2年ほど前)使っていて、機能的にも優秀で使いやすかったものなのですが、
名前を度忘れしていて今日やっと思い出しました orz.
 
Wireshark
(Etherealから改称)
ネットワークに実際に流れている中身をキャプチャして、GUI で見ることができるオープンソースなパケットキャプチャツールです。
Ethereal, Wireshark の Windows での動作には WinPcap が必要です。
 
Windows の他に、Linux 等さまざまな環境で動作します。
 
追記:
(2006-07-27) Ethereal は Wireshark として更新されるようになりました
参考:
Ethereal(イーサリアル)の日本語解説サイト
Wireshark

sh での変数とワイルドカードの落とし穴

sh, bash, csh, zshのようなシェルでは

echo *.sh

などというように、ワイルドカードでファイル一覧を取得することができます。
シェルで使えるワイルドカードはアスタリスク(*)、クエスチョンマーク(?)の2種類で、それぞれ、0文字以上の任意の文字列、1文字の任意の文字(英数記号など)を表します。

ワイルドカード文字を、ワイルドカードとしてではなくただの * や ? という1つの文字として扱いたい場合は、次のようにクオート記号で囲むか、エスケープします。

echo &quot;*.sh&quot;
echo &quot;What&#039;s up?&quot;

# 結果
# *.sh
# What&#039;s up? 
# が表示される

ここに変数が関係してくると、少し厄介なことになります。

# 間違った例
foo=&quot;SELECT * FROM table&quot;
echo $foo

この結果は、

SELECT * FROM table

と表示されるかと思いきや、アスタリスクがワイルドカードとして展開されてしまうため、

SELECT FROM table

とアスタリスクが消える、または、現在の作業フォルダのファイル一覧が展開されて、

SELECT bin boot home root var FROM table

のように意図しない結果になってしまいます。

これはかなり怖いことで、この動きにより、最悪致命的なセキュリティホールや、データ消失につながる場合があります。

これを回避するためには, ワイルドカード文字を含む変数の参照時は常にダブルクオート/シングルクオートの中で参照するというテクニックを使います。

# 正しい例
foo=&quot;SELECT * FROM table&quot;
echo &quot;$foo&quot;

この結果は、期待通り

SELECT * FROM table

となります。

多段になってもこの動きは変わりません。

foo=&quot;SELECT * FROM table&quot;
boo=&quot;$foo&quot;
echo &quot;$boo&quot;
# foo, boo 両方の参照をダブルクォートでくくっていることに注意

この結果も、期待通り

SELECT * FROM table

となります。ここで

echo $boo

としていると、やはり変数展開されてしまうため、注意しましょう。
お約束として、変数を参照するときで、変数に記号が入る可能性がある場合は必ずダブルクオートで囲む癖をつけると、こういう間違いがなくなるので幸せになれます。

おまけ

一歩踏み込んだ例として、変数の遅延展開の例を紹介します。

export table=book # 1
# ↑これは全く利用されない
text=&#039;SELECT * FROM ${table}&#039; # 2
# ↑シングルクオートなので、textに入る時点ではtableが展開されない。

export table=member # 3
# ↑これが利用される。子プロセスで参照できるよう export している
query=$(sh -c &quot;echo \&quot;$text\&quot;&quot;) #4
# ↑ここでtableの中身が展開されます。* の展開を防ぐため $text をダブルクォートで囲んでいることに注意
echo &quot;$query&quot; # 5

この結果は、

SELECT * FROM member

と出力されます。
処理の流れは以下のとおりです。

1: table 変数に book をセット
2: text 変数に SELECT * FROM ${table} をセット(table変数の中身はここでは見ない)
3: table 変数の内容を member に書き換え
4:

sh -c "echo \"$text\""

を実行、shが立ち上がり、

echo "SELECT * FROM ${table}"

を実行する。(ここでtableが初めて展開される)
query 変数に、echo が出力した SELECT * FROM member をセットする。(ここでは変数代入だけで画面には出力されない)
5: query 変数の内容、SELECT * FROM member を表示する

あまりやらないですが、こういう複雑な処理でも期待通り動作するのは、適切にクオートしているおかげですね。