.htaccess で PHP の表示言語を切り替える

php_value, php_flag を使って自動文字コード変換をする tips です。
  
.htaccess:

# ソースの文字コード(SJIS, EUC-JP, UTF-8 など mb_convert_encoding()で指定する書式)
php_value mbstring.internal_encoding UTF-8
# ヘッダで表明する出力文字コード(Shift_JIS, EUC-JP, UTF-8 など Content-Type で指定する書式)
php_value default_charset Shift_JIS
# 変換に使う出力文字コード(mb_convert_encoding()で指定する書式)
php_value mbstring.http_output SJIS
# 変換文字コードが属する言語
php_value mbstring.language Japanese
# フォームなどの入力文字コードは自動判別させる
php_value mbstring.http_input auto
# 入力の自動変換を有効化(Off で無効化)
php_flag mbstring.encoding_translation On
# 出力の自動変換を有効化(空値で無効化)
php_value output_handler mb_output_handler

なお、動作には

1.CGI モードではなく PHP-CLIモードで動いていること
2. httpd.conf で AllowOverride Options または AllowOverride All など Options の変更ができるように設定されていること。

が必要です。


ちなみに余談ですが、同じことを .htaccess なしでやろうとした場合は次のようになります。

<?php
// 自動変換処理
mb_language(“Japanese”);
// ソース文字コード
mb_internal_encoding(“UTF-8”);
// 出力文字コード
mb_http_output(“SJIS”);
header(“Content-Type:text/html;charset=Shift_JIS”);
 
// mb_output_handler で出力をフィルタリング
ob_start(“mb_output_handler”);
register_shutdown_function(‘ob_end_flush’);
 
// 入力をフィルタリング
// (mb_convert_encoding($value, mb_internal_encoding(), “auto, UTF-8”);
// を使い、 $_REQUEST, $_GET, $_POST, $_COOKIE など入力変数を変換すればエミュレートできるが
// 長くなるので省略)
 
// —————————–
// あとは普通の処理
 
echo “はろーわーるど\n”;

参考:
AllowOverride ディレクティブ(Apache 2.2 リファレンス)
PHP 出力制御関数(php.net)

AllowOverride が効かない

<Directory ~ “^/path/to/(htdocs|secure)/”>
AllowOverride All
</Directory>

こういう設定で、 AllowOverride All してるのに .htaccess が無視されていておかしいなと首を傾げていたところ、マニュアルを見て納得。

AllowOverride ディレクティブ:
(中略)
<Directory> セクションでのみ使用可能
AllowOverride は正規表現無しの<Directory> セクションでのみ有効で、<Location> や <DirectoryMatch> や <Files> セクションでは無効です。

なーるほど…。
ただ複数書くのが面倒、っていう理由で正規表現形式にしていたので、<Directory> を複数に分けて解決。

トラブルシューティング – portsdb.rb で cross-thread violation on rb_gc()

ある日 portversion と portupgrade で ports をアップデートしようとしたところ、portsdb.rb で次のようなエラーが出るようになり portupgrade 関係のプログラムがまったく動作しなくなってしまった。

/usr/local/lib/ruby/site_ruby/1.8/portsdb.rb:116:[BUG] cross-thread violation on rb_gc()
ruby 1.8.6 (2007-09-24) [i386-freebsd7]
 
SIGABRT (Abort trap: 6)

ちなみに環境は FreeBSD 7.0 + ruby_1.8.6_p111_2,1。
ports から ruby, portupgrade 入れなおしても
ソースを辿ったところ, libpthread が有効になっている時のみこのエラーが出るようになっているということが判明したため、

# cd /usr/ports/lang/ruby18
# make config

で LIB_PTHREAD を無効化した上で make install しなおしたところ無事解決しました。

tips – 色々なプロトコルをネットワークドライブに使う

最近は便利な世の中になったもので、色々なストレージサービスが増えてきましたね。
エクスプローラの「ネットワークドライブの割り当て」機能を使うとネットワークごしのドライブでも “Z:\foo.txt” など仮想のドライブとして認識できるため、ファイルの編集、作成、削除など、ほとんどのアプリケーションでの操作がまるでローカルHDDのように扱えるようになります。そこで、色々なネットワークストレージをネットワークドライブ化できるソフトウェア/方法についてまとめてみました。
 


– Gmail をネットワークドライブ化
Gmail Drive shell extension
エクスプローラのシェル拡張として動作するようです。
日本語での解説は「臨機応変? – Gmailをネットワークドライブとして使ってみる」が参考になります。


– FTP をネットワークドライブ化
Novell NetDrive というフリーソフトを使うと FTP, WebDAV プロトコルが使えるサーバをネットワークドライブにできます。ライセンスを他社に譲渡し、WebDriveという有償の製品になったため、開発元の novell.com からはダウンロードできなくなっていますが、サーチエンジンで検索すると見つかります。一応うちにも置いておきます。
 
ミラー:netdrive.exe をダウンロード
 
なお、Windows Vista の場合は NetDrive が非対応のため WebDrive を使う必要があります。
ネットワークドライブではなく “ftp://username:password@hostname/path”の形式ならばエクスプローラ標準でフォルダのように仮想的に扱うことができますが、当然ですが、こちらはFTP対応していないアプリケーションからはアクセスできません。


– WebDAV をネットワークドライブ化
前述の NetDrive, WebDrive が WebDAV に対応しています。
また、Windows Vista の場合は標準で対応しているようです。


– Amazon S3(Simple Storage Service) をネットワークドライブ化
Amazon S3 は Amazon が提供する 1GB あたり 15セントで使えるネットワークストレージサービス。容量制限はありません。
 
Jungle Diskというシェアウェアでネットワークドライブ化できます。
また、前述の WebDrive も Amazon S3 に対応しているようです。


– SFTP,SCP, Frontpage server をネットワークドライブ化
前述の WebDrive がこれらに対応しています。


– Xdrive をネットワークドライブ化
AOL が提供している Xdrive というフリーのストレージサービス。
1アカウントあたり 5GB のストレージを無料で利用できます。
Downloads から Xdrive Desktop をダウンロードすればネットワークドライブ化できそう。


– Windows Live SkyDrive をネットワークドライブ化
Microsoft が提供する Windows Live SkyDrive というフリーのストレージサービス。
hotmail のアカウントごとに 5GB のストレージが無料で利用できます。
今のところは無理そう。

スパムフィルタの適用実績を調べる

Postfix の main.cf で

smtpd_client_restrictions =
    reject_rbl_client bl.spamcop.net,
    # 中略…
    permit

のように複数のブラックリストデータベース(MAPS RBL)を設定していて、実際どれが使われているのか判断したい場合、以下のようにして実際に何件のメールについてブロックが適用されたか調べられます。
 

$ cat /var/log/maillog | perl -ne ‘if(/blocked using (.+?);/){print $1.”\n”;}’ | sort | uniq -c

結果例:

$ cat /var/log/maillog | perl -ne ‘if(/blocked using (.+?);/){print $1.”\n”;}’ | sort | uniq -c
  45 bl.spamcop.net
   4 list.dsbl.org
   7 sbl-xbl.spamhaus.org

パーティション暗号化(gbde, geli)

http://hsdiary.blogspot.com/2007/03/comparison-of-gbde-and-geli.html

FreeBSD では FreeBSD 5 から使える gbde (GEOM bde)と、FreeBSD 6 から追加された geli (GEOM eli) の二つの暗号化されたファイルシステムが提供されていますが、geli のほうが圧倒的にパフォーマンスが上らしい。

geli を利用できるようにするには、/boot/loader.conf に以下の行を追加するのが簡単です。

geom_eli_load=”YES” # gbde の場合は geom_bde_load=”YES”

一時的なものでいいのであればもちろん

root# kldload geom_eli

でロードできます。

参考:
geli(8)
mdconfig の使い方色々
GEOM_ELI を PGPDisk や TrueCrypt のように使う方法。

jail が起動できない

rc.conf に設定を追加して /etc/rc.d/jail restart したところ

jail: getpwnam: root: No such file or directory

と出て起動できなかった。
 
/etc/passwd などアカウント関係のファイルが欠落しているのが原因。
 

# cp /etc/master.passwd /etc/group /path/to/jail/etc/

と、まずどこかから設定をコピーをして必要なアカウントだけ取捨選択した上で

pwd_mkdb -p -d /path/to/jail/etc /path/to/jail/etc/master.passwd

を実行して jail の /etc/passwd を作成してやれば解決です。

pf でルーティング

FreeBSD で pf を使ってルータを作るメモ。
 
目的:
ネットワークインターフェイスが二つあり、それぞれのインターフェイスに外部ネットワーク、内部ネットワークとして割り当てるとする。
内部→外部の通信は IP マスカレード(NAPT)で透過的に通信できるようにし、外部→内部の通信は特定のポートのみ NAT でサーバにマッピングする。
 
適用例:
A. FreeBSD をルータとして動作させる。
B. (応用) jail を仮想プライベートネットワークに入れ、外への通信を制御する。
 


設定方法(A):
…外部ネットワークインターフェイスを fxp0, 内部ネットワークインターフェイスを fxp1 としてルータとして設定する場合
/etc/rc.conf:

defaultrouter=”192.168.1.1″ # 外部のデフォルトゲートウェイ
 
# 外部インターフェイス
ifconfig_fxp0=”inet 192.168.1.2 192.168.1.255 netmask 255.255.255.0″
# 内部インターフェイス
ifconfig_fxp1=”inet 10.0.0.1 10.0.0.255 netmask 255.255.255.0″
 
# pf を有効化
pf_enable=YES
pf_rules=”/etc/pf.conf”
pf_flags=””
pflog_enable=”YES”
pflog_logfile=”/var/log/pflog”
pflog_flags=””

/etc/pf.conf:

# 外部ネットワークインターフェイス
ext_if=”fxp0″
# 内部ネットワークインターフェイス
int_if=”fxp1″
####
 
table <private> const { 10.0.0/24 }
 
# IP マスカレード
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)
 
# NAT 設定。外からの http(80), https(443) は内部の 10.0.0.5 に、smtp(25) は内部の 10.0.0.6 に割り当て
rdr pass on $ext_if proto tcp from any to ($ext_if) port {80, 443} -> 10.0.0.5
rdr pass on $ext_if proto tcp from any to ($ext_if) port 25 -> 10.0.0.6
 
# パケットフィルタ: 説明を簡単にするため全許可に。
pass in quick all
pass out quick all

 


設定方法(B):
…外部ネットワークインターフェイスを fxp0, 内部ネットワークインターフェイスを lo1 (ループバック) として jail を内部ネットワークインターフェイスで管理する場合。
/etc/rc.conf:

defaultrouter=”192.168.1.1″ # 外部のデフォルトゲートウェイ
 
# 外部インターフェイス
ifconfig_fxp0=”inet 192.168.1.2 192.168.1.255 netmask 255.255.255.0″
# 内部インターフェイス
ifconfig_lo1=”inet 10.0.0.1 10.0.0.255 netmask 255.255.255.0″
ifconfig_lo1_alias=”inet 10.0.0.2″
ifconfig_lo1_alias=”inet 10.0.0.3″
ifconfig_lo1_alias=”inet 10.0.0.4″
ifconfig_lo1_alias=”inet 10.0.0.5″
ifconfig_lo1_alias=”inet 10.0.0.6″
# : 以下略
 
# pf を有効化
pf_enable=YES
pf_rules=”/etc/pf.conf”
pf_flags=””
pflog_enable=”YES”
pflog_logfile=”/var/log/pflog”
pflog_flags=””
 
####
### Jail の設定 ###
jail_enable=”YES”
jail_list=”j1 j2 j3″ # 立ち上げる jail の名前のリスト
jail_set_hostname_allow=”NO”
jail_sysvipc_allow=”YES”
## jail_list で設定した jail インスタンスそれぞれについて設定 ##
# j1:
jail_j1_rootdir=”/var/jail/j1″
jail_j1_hostname=”jail_1″
jail_j1_ip=”10.0.0.2″
jail_j1_exec_start=”/bin/sh /etc/rc”
jail_j1_exec_stop=”/bin/sh /bin/rc.shutdown”
jail_j1_devfs_enable=”YES”
jail_j1_fdescfs_enable=”NO”
jail_j1_procfs_enable=”YES”
jail_j1_mount_enable=”NO”
# j2, j3 も同様に。

/etc/pf.conf:

# 外部ネットワークインターフェイス
ext_if=”fxp0″
# 内部ネットワークインターフェイス
int_if=”lo1″
####
# 以下 設定方法 A とまったく同じ
table <private> const { 10.0.0/24 }
 
# IP マスカレード
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)
 
# NAT 設定。外からの http(80), https(443) は内部の 10.0.0.5 に、smtp(25) は内部の 10.0.0.6 に割り当て
rdr pass on $ext_if proto tcp from any to ($ext_if) port {80, 443} -> 10.0.0.5
rdr pass on $ext_if proto tcp from any to ($ext_if) port 25 -> 10.0.0.6
 
# パケットフィルタ: 説明を簡単にするため全許可に。
pass in quick all
pass out quick all

 


参考:
FreeBSDでPacketFilter(pf)を使う

フリーで使えるフォント集

【英字フォント】
1001 Free Fonts
 
細かい利用条件などはそれぞれのフォントによって異なるようで各フォント付属の readme.txt 参照とのことですが、ほとんどのフォントが無償で商用でも自由に使えるようです。
 
misprinted type 3.0


【日本語フォント】
8*8ドット日本語フォント「美咲フォント」
 
フォントブログフリー日本語フォント配布サイトリンク
 
漢字が使える日本語フォント 無料ダウンロード46種類

PHP の 5.2.5 が mysql 5.1.23-rc と非互換な件

先日 PHP 5.2.5 をビルドしようとしたところ

/usr/src/php-5.2.5/ext/mysqli/mysqli_api.c: In function
‘zif_mysqli_change_user’:
/usr/src/php-5.2.5/ext/mysqli/mysqli_api.c:420: error: ‘NET’ has no
member named ‘last_errno’
/usr/src/php-5.2.5/ext/mysqli/mysqli_api.c:420: error: ‘NET’ has no
member named ‘last_errno’
/usr/src/php-5.2.5/ext/mysqli/mysqli_api.c:420: error: ‘NET’ has no
member named ‘last_error’
/usr/src/php-5.2.5/ext/mysqli/mysqli_api.c: In function
‘zif_mysqli_kill’:
 
以下略

というエラーが出てコンパイルができなかった。
調べたら php bug に投稿がありました。
 
http://bugs.php.net/bug.php?id=44137
 
5.1.22-rc ならいけるのに MySQL 5.1.23-rc だとダメらしい。
そして開発チームの回答。

[18 Feb 7:41pm UTC] [email protected]

A little more info: we are discussing this internally at MySQL. Its
possible that the change which has caused this (unintended) problem will
be reverted soon.
 
[24 Feb 1:01am UTC] [email protected]
 
And it’s not PHP problem but Mysql problem since they broke the BC in
their libs/headers. 🙂
 
[24 Feb 1:03am UTC] [email protected]
 
And please, in the future don’t report bugs caused by some 3rd party
library here which isn’t even released as stable yet.

曰く、
「mysql が悪い。こんな(不本意な)問題を引き起こしてくれる変更は mysql 開発側がじきに元に戻してくれるかもしれないからそれを待て。
そもそもサードパーティのライブラリに安定リリース版じゃないのを使ってるのはサポート外だから報告しないでね」
っていうことだそうで。
 
…とはいっても、FreeBSD ports の databases/mysql51-client (実体は mysql51-server) が 5.1.23-rc なのが悩ましいところです。