ランダムなデータを生成する

HotBits
 
任意長(2048 bytes まで)のランダムなバイトデータを生成してくれます。
出力は16進数、バイナリデータファイル、C 言語の unsigned char 配列のいずれかを選択できます。
 
参考:
Security: Salting MD5(5 1/2 blog) (English)

PHP で SHA-256 を使う

sha256,sha256_file関数を簡易実装している方がいました。
 
mhash()を利用すれば、さまざまなダイジェストが生成できるようです(ただし利用するには Mhash ライブラリを有効にする必要があります)。

$str = “あいうえお”;
$raw_hash = mhash(MHASH_SHA256, $str);
echo bin2hex($raw_hash);

 
もう一つの方法としてハッシュ拡張モジュールを利用する事もできます。

メールをパースするクラス

メールをハンドリングする上で、メールソースを解析するという処理を実装しようとしてクラスがないか探していて
Google で mail, email, parse, php, rfc822 とか検索していたのですがライセンス制限のないものが全然見付かりませんでした。
で、ふと PEAR を追ってみるとバッチリありました。
Mail_Mime でメールのエンコード、Mail_mimeDecode でメールのデコードが可能です。
 
Mail パッケージの Mail_mimeDecode を使うと次のようになります。

require_once(‘Mail/mimeDecode.php’);
$mail = ”;
// …
// ($mail にメールのソースを格納する処理)
// …
 
$params = array();
$params[‘include_bodies’] = true;
$params[‘decode_bodies’] = true;
$params[‘decode_headers’] = true;

$decoder = new Mail_mimeDecode($mail);
$structure = $decoder->decode($params);
var_dump($structure);

結果(一部省略. 文字コードは JIS):

object(stdClass)(5) {
  [“headers”]=>
  array(14) {
    [“from sender@example.org tue may 9 20”]=>
    string(10) “21:03 2006”
    [“return-path”]=>
    string(23) “<sender@example.org>”
    [“x-original-to”]=>
    string(14) “foo@example.com”
    [“delivered-to”]=>
    string(14) “foo@example.com”
    [“received”]=>
    array(3) { /* ..snip.. */ }
    [“date”]=>
    string(31) “Tue, 09 May 2006 20:20:59 +0900”
    [“from”]=>
    string(35) “”John” <sender@example.org>”
    [“to”]=>
    string(14) “foo@example.com”
    [“message-id”]=>
    string(45) “<114717365920816000001f81@example.org>“
    [“subject”]=>
    string(19) “テスト”
    [“x-mailer”]=>
    string(17) “Cybozu Office 6.5”
    [“mime-version”]=>
    string(3) “1.0”
    [“content-type”]=>
    string(31) “text/plain; charset=iso-2022-jp”
    [“content-transfer-encoding”]=>
    string(4) “7bit”
  }
  [“ctype_primary”]=>
  string(4) “text”
  [“ctype_secondary”]=>
  string(5) “plain”
  [“ctype_parameters”]=>
  array(1) {
    [“charset”]=>
    string(11) “iso-2022-jp”
  }
  [“body”]=>
  string(495) “Hello, world!!

}

 
文字コードについては一切感知していないのか mb_internal_encoding の値にかかわらず, charset で指定されている通り JIS (iso-2022-jp) でした。
 
From: や To: の解析には Mail_RFC822::parseAddressList() という便利なメソッドも存在します。

require_once ‘Mail/RFC822.php’;
// $structure は Mail_mimeDecode::decode() の結果
$from = Mail_RFC822::parseAddressList($structure->headers[‘from’]);
echo $from[0]->mailbox.’@’.$from[0]->host;
// 結果: sender@example.org

 
参考:
Mail_mimeDecode – メールデコードの例(pear.php.net)

Windows XP でのタイマー処理あれこれ

ちょっと変わった利用方法ですが..工夫次第でできることの例です。
ここでは sleep というコマンドを利用しますが、標準では sleep というコマンドが存在しないため、Cygwin をインストールしてパスを通すか、ここ(Nifty フォーラム)にあるように次のコードを sleep.bat として c:\windows あたりに保存してください。

@echo off
REM Sleep.bat [秒数]
set /a wtime=(%1+0)*1000
echo WScript.Sleep %wtime% > tmp.vbs
cscript //NoLogo tmp.vbs
del tmp.vbs
set wtime=

 
– スリープタイマーをかけて Windows を自動終了させる
→ 一定時間後に Windows を自動シャットダウンする(以下は2時間後の例/2時間=7200秒)
※管理者である必要があります

sleep 7200 && shutdown -s

 
– 朝になったら目覚しがわりの音楽を再生する
→ 一定時間後に音楽 morning.mp3 を再生する(以下は8時間20分後の例)
※ .mp3 が再生ソフトに関連づけされていて、カレントディレクトリに morning.mp3 があることが前提。

sleep 30000 && morning.mp3

 
追記:
(2006-05-10) sleep について加筆修正しました。

MySQLコーディング標準

MySQL は Java やその他の言語みたいにコーディングの規則が決まっていません。
決まっていないとバラバラになって困ったりするのでずっと探しているのですが、いっこうに見付からないため、それなりの理由があって実践している命名規則についてまとめがわりにメモしておきます。
– テーブル名、カラム名は全て小文字にし、単語はアンダースコア(_)で区切る。

user_detail.name

– カラム型とその修飾子は小文字にする。

int, text, unsigned, auto_increment, default

– その他の SQL の識別子(SELECT, UPDATE, INSERT, WHERE, IS, AS, NOT, NULL など)は全て大文字にする。

SELECT COUNT(*) FROM foo WHERE name = ‘John’;

 
テーブル名やカラムを小文字とアンダースコアの組合せに統一するのは、プラットフォームによって非互換になるのを防ぐというシンプルな理由からです。
また、その他については SHOW CREATE TABLE クエリや、mysqldump で出力されるクエリの記法に則っています。テーブル名やカラムを大文字でなく小文字にすることで、MySQL のシグネチャと、カラム,テーブル名との区別がつけられます。
 
参考:
MySQL naming standards(thescripts.com フォーラム)

脆弱正診断ツール

Nessus
脆弱性管理用のサーバ/検査を実行するクライアントの対で動作し、外部の任意のホストの脆弱性を診断できるツール。
Nessus サーバは Linux/BSD 等でしか動作しませんが、クライアントは Windows 版もあります。
なかなか便利です。
構築したサーバにうっかり脆弱性があったら洒落になりませんし。

Linux でバイナリ処理をする

標準で入っている od というプログラムでバイナリダンプが可能です。

$ # /bin/sh を 2 バイト単位で 10 進ダンプする
$ od /bin/sh
$ # /bin/sh を 1 バイトずつ 16 進ダンプする
$ od -t xC /bin/sh
$ # /bin/sh を、1 バイトずつ 16 進ダンプし、同時に ASCII 文字でも確認する
$ od -t xCa /bin/sh

また、任意の ASCII コードを出力するのに、echo を利用することできます。

$ # 0x50 0x51 0x52 の文字(‘P’,’Q’,’R’)を、末尾に改行なしで出力する。
$ echo -en ‘\x50\x51\x52’
# Hello と改行つきで出力する。
$ echo -e ‘\x48\x65\x6C\x6C\x6F’

その他バイナリエディタ関係:
hex(ports: japanese/hex)
日本語文字列対応のバイナリダンプツール。
HexEdit(ports: editors/hexedit)
Emacs ライクなバイナリエディタツール。
Emacs の Hexl モードを使う
hi
vi ライクなバイナリエディタ。
参考:
Manpage of OD
Manpage of ECHO

.htaccess で php.ini の設定を上書きする

php_value (mod_php が提供するディレクティブ) を使う事で、 .htaccess で php.ini での設定を上書きすることが可能です。
これにより、Web サービス単位で php.ini でできる設定を使い分けるということが可能になります。

php_value output_handler mb_output_handler
php_value mbstring.language Japanese
php_value mbstring.internal_encoding SJIS
php_value mbstring.http_input auto
php_value mbstring.http_output SJIS
php_flag mbstring.encoding_translation On

ただし、mb_output_handler を利用する場合は、php.ini で指定してしまうと、.htaccess での設定を中途半端に反映するため文字化けする可能性があるため、php.ini の output_handler はデフォルト値のままにしておくほうがいいでしょう(この説明について間違っていれば指摘お願いします)。

output_handler =

 
参考:
【 ほでなすPHP 】 PHPのインストール -> 「.htaccess」ファイルでの設定
Re: .htaccessにてphp_value が設定できないパラメータがある(PHP-Users)
設定の際の注意。E_* (E_ALL など)を利用する際は定数ではなく対応する定数の値(2047など)で指定しましょう。