FreeBSD 7.2Rにアップグレード

May 5th, 2009

FreeBSD 7.2-RELEASEが公開されたので、7.1Rの方からアップグレードしてみました。

今回も、csup(1)を使ってソースを同期し、再構築。行った手順は、

の時と、ほぼ同じ。

構築前、mergemaster -pを実行した際、

*** You have the deprecated 'nodev' option in /etc/fstab.
    This can prevent the filesystem from being mounted on reboot.
    Please update your fstab before continuing.
    See fstab(5) for more information.

のように言われて、処理が中断された。

/etc/fstabを確認してみると、CD-ROMの箇所にnodevのmount オプションが残っていた。FreeBSD 5以降、devfsの導入に伴って、このオプションは無視されるようになっていたけど、FreeBSD 7では、このオプションがあると、マウントに失敗するらしい(最近、このデバイスは使う機会がなかったので見落としていた…)。

fstab(5) ファイル(/etc/fstab)から、該当のオプションを削除し、作業を続行。

アップグレードを完了後、make check-oldを実行してみたけど、

>>> Checking for old files
/usr/share/man/man8/adding_user.8.gz
/usr/include/hesiod.h
>>> Checking for old libraries
>>> Checking for old directories
To remove old files and directories run 'make delete-old'.
To remove old libraries run 'make delete-old-libs'.

と、FreeBSD 6.3から7.1にアップグレードした時に比べて大幅な変更はなさそう。今回は、portsの再構築はしなくてもよいかな?

workerで動くApache 2.2.11に@ARGVがうまく渡されない

March 22nd, 2009

いつのころからか、Another HTML Lintで、URLを入れて外部のサイトのHTMLの文法をチェックしようとすると、Internal Server Errorが出る。

エラーログを確認してみると、

malformed header from script. Bad header=  Another HTML-lint gateway sc: htmllint.cgi

のような表示。

どうやら、HTTPのヘッダが正しく出力されていない模様。

Another HTML Lintのportの方には、変更は行われていないようだし、Apache辺りが原因だと思っていたところ、先日、

のレポートを見付けたので、現在使用しているworkerのApache 2.2.11に以下のパッチを適用してみた。

--- ./modules/generators/mod_cgid.c.org 2008-08-16 07:08:05.000000000 +0900
+++ ./modules/generators/mod_cgid.c     2009-03-22 18:42:30.000000000 +0900
@@ -203,7 +203,7 @@
     char *w;
     int idx = 0;

-    if (ap_strchr_c(args, '=')) {
+    if (!(*args) || ap_strchr_c(args, '=')) {
         numwords = 0;
     }
     else {

どうやら、正解。@ARGVがうまく渡されていなかった模様。

ユーザごとにAUTH先のSMTPサーバを切替えてメール送信

February 16th, 2008

前置き

今まで頻繁に来ていたトラックバックがあったことを知らせる通知メールが最近は来ていないな、と思っていたら、どうやら、現在利用しているISP*1でも本格的にOP25Bの制限が始まっていたらしい…。

メールのログに、

stat=Deferred: Operation timed out with XXX.XXX.XXX

と延々と記録されている。

といっても、OP25Bの初期の何年か前、こちらのサーバから携帯電話のメールサーバに宛ててメールが送信できなくなってしまったので、その頃、開始したGoogleのホスティングサービスを利用して、独自ドメインのメールはGMail上で送受信するように切替えていたので、通常使用の分には問題なかったんだけど。

ただ例外として、ブログのトラックバックやコメント等があった時の通知メールは、こちらのサーバから外部に出すようにしていた(大抵、海外からのトラックバックスパムやコメントスパムが発生原因で、あまり好ましいものとは言えないんだけど、一応…)。

しかし、放っておいても問題の解決にはならないので、調べてみたところ、

に、SMTP-AUTHの設定を解説されているサイトがあった。

ただ、プロバイダの制約上、一つのアカウントに登録できるメールアドレスは、5つまでだそうなので、プロバイダ固有のものを除くと、独自ドメインのものは最大で4つまでとなってしまう(全部、それに割り当てても良ければの話。しかも、どのメールも同一ユーザでの認証が必要)。

ちょっと、これでは都合が悪いので、あれこれ模索してみていたところ、上記GMailのメールサーバでも、独自ドメインのアドレスで送受信できる事が判明*2。Googleの解説の

では、Gmail のユーザー名 (@gmail.com を含む)と記述されていたから、今まで、メールアドレスは、gmail.comのドメインのものじゃないと駄目だと思っていたけど。

以下、Googleのサービスを利用して、ユーザごとに認証を切替えて、メールを送信する方法について書いてみました。

  • *1 現在、Yahoo!BBの回線を使用しています。
  • *2 Googleでは、一つのドメインに対し、25個までのアカウントを作成することができる(無料版の場合)

SMTP AUTH対応のSendmailの構築

というわけで、外部に向けて送信するため、SMTP-AUTH対応のsendmailを構築。

まず、portsからsecurity/cyrus-sasl2をインストールして、/etc/make.confに、

SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2

を記述し、

# cd /usr/src/lib/libsm
# make obj && make depend && make
# cd /usr/src/lib/libsmutil
# make obj && make depend && make
# cd /usr/src/usr.sbin/sendmail
# make obj && make depend && make && make install

でsendmailを再構築。

設定

次に、/etc/mail/以下の設定ファイルの記述。

通常、SMART_HOSTを使うと思うけど、そうすると送信サーバが固定されてしまうので、複数のアカウントを使い分けている場合には不便。

smarttabe.m4の利用

そこで、ここでは、ユーザごとに送信先を選べるように、smarttableを使うことにする。

まず、SorceForge.netから、open-sendmailのソースファイルを取ってきて、

# tar zxf open-sendmail-2007-09-25.tar.gz
# cp -p ./cf/feature/anfi/smarttable.m4 /usr/share/sendmail/cf/feature/

と展開し、smarttable.m4をコピー。

FQDN.mcの作成

/etc/mail/内で、makeを実行して作成される/etc/mail/[FQDN].mcに、

FEATURE(`smarttable')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
FEATURE(`authinfo', DATABASE_MAP_TYPE MAIL_SETTINGS_DIR`authinfo')dnl

MASQUERADE_AS(`_domain_name')dnl
FEATURE(masquerade_envelope)dnl

を記述する(GMailの場合、587番ポートはSTARTTSLでTSL接続、465番ポートを使用した場合は最初からSSL接続。後段は、FromReturn-Pathの記述)。

認証ファイルの作成

次にSMTP AUTHを行うための設定。/etc/mail/authinfoを作成し、

AuthInfo:user1.smtp-gmail "U:Acount1@example.com" "P:Password1" "M:LOGIN PLAIN"
AuthInfo:user2.smtp-gmail "U:Acount2@example.com" "P:Password2" "M:LOGIN PLAIN"

等と各SMTPサーバ*3に対応するユーザ名とパスワード等を記述*4した後、

# cd /etc/mail
# makemap hash authinfo.db < authinfo
# chmod 640 authinfo*
# chgrp smmsp authinfo.db

を実行して、ハッシュのデータベースを作成し、パーミッション等を適切なものに変える。

  • *3 同一の送信先に、複数のアカウントを割り当てて認証データベースを作成できないので、ここではアカウントごとに架空の送信サーバを指定して、ローカルのDNSで名前解決させることにしています。
  • *4 Sendmail cf/README - SMTP AUTH参照。
ユーザごとの送信先

/etc/mail/smarttableを作成し、

localuser1@host.local.domain    user1.smtp-gmail
localuser2@host.local.domain    user2.smtp-gmail

等と記述し、ローカルのユーザと送信先を対応させて、

# makemap hash /etc/mail/smarttable.db < /etc/mail/smarttable

とデータベースファイルを作成。

DNSの設定

ローカルのDNSのzoneファイルには、

*.smtp-gmail    IN      CNAME   smtp.gmail.com.

を追加して、名前解決できるようにし、namedを再起動。

設定の終了、sendmailの再起動

ローカル宛てのメールは、上記の設定を反映させる必要もないので、[FQDN].submit.mcに、

dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
DAEMON_OPTIONS(`Name=NoMTA, Addr=127.0.0.1, M=EA')dnl
FEATURE(`msp', `[127.0.0.1]')dnl

を追加。

# make install restart

で、/etc/mail/sendmail*.cfを構築して、sendmailを再起動。

備考

以上の設定で、目的は果たせたようです。

なお、上記の設定は、ほとんど、

を参考にしたものです。

更新履歴 2008/02/14

February 14th, 2008

の更新が来ていたので、ソースを同期して、カーネルを更新&再起動。

結果、

# uname -r
6.3-RELEASE-p1

に。

onclick メモ

February 11th, 2008

Another HTML Lintで、HTMLの文法をチェックすると、onclick属性を指定した場合、同時にonkeypress属性を指定していないと、

onclick 属性を使うときは onkeypress 属性も指定しましょう。 → 解説 150

と怒られる。

この解説には、

スクリプトのイベント処理では、装置非依存性を確保するために、次の属性は対で使用するように、アクセス指針技術文書4.12.2(J)で薦められています。

onmousedown+onkeydown
onmouseup+onkeyup
onclick+onkeypress

とあり、根拠の文書にも、

  1. Otherwise, if you must use device-dependent attributes, provide redundant input mechanisms (i.e., specify two handlers for the same element):
    • Use "onmousedown" with "onkeydown".
    • Use "onmouseup" with "onkeyup"
    • Use "onclick" with "onkeypress"

    Note that there is no keyboard equivalent to double-clicking ("ondblclick") in HTML 4.01.

そう書いてある。

だから、今までonclick属性を指定した時、無批判に、なるべくonkeypress属性も指定することにしていた(基本的に、PCしか閲覧環境を想定していないけど。しかし、そうすると、TABを押してフォーカスを移そうとした場合でも、KeyPressイベントが発生してしまい、特定のキーコードが押された場合には無視するようにフィルタをかける必要がある)。

しかし、先日、JavaScript 第5版を読んでいると、p.408頁に、

「mouse」や「key」という言葉が含まれるイベントは、名前からわかるように、デバイス依存イベントです。これらのイベントを使う場合は、マウスでもキーボードでも操作できるように、両方のイベントハンドラを使用するようにしてください。onclickイベントはデバイス独立イベントと考えられることに注意してください。フォームコントロールやハイパーリンクをキーボードで操作した場合でも、このイベントが発生します。したがって、マウスに依存したイベントではありません。

と書いてあった。

試しに、

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP">
<head>
<title>click events test</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-script-type" content="text/javascript" />
</head>
<body id="top">
<form action="#top">
<p><input tabindex="1" type="submit" onclick="alert('form clicked'); return false;" /></p>
</form>
<p><a tabindex="2" href="#top" onclick="alert('link clicked'); return false;">link</a></p>
</body>
</html>

というサンプルを書いて*1、手元の環境で実験してみたら、

 Form itemLink item
EnterSpaceEnterSpace
○はイベント発生、×は発生しない
Firefox 2.0.0.12×
Opera 9.25×
Konqueror 3.5.8×
IE6×

という結果に。

確かに、Enterキーを押した場合では、フォームコントロールでもリンクでも、クリックイベントが発生している。

(もちろん、上記サンプルは、Another HTML Lintでは減点されるんだけど)

  • *1 tabindex属性をつけているのは、Operaだと、なぜかそうしないと、TABキーを押した時、リンク部分にフォーカスが移らなかったため。

IEs4Linuxを使ってみた

January 31st, 2008

最近よく耳にする、最小の構成のIE6(もしくは、5.5 or 5)のインストールを自動化するスクリプトIEs4Linuxを使って、FreeBSD上のwineでIE6を動かしてみました。

使用したwineのバージョンは、portsから導入したwine-0.9.54,1です(この他、IEのインストールの際、archives/cabextractが必要になるので事前に導入)。

まずは、IEs4Linuxのダウンロードと展開。

> wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
> tar zxf ./ies4linux-latest.tar.gz

便宜上、Linuxエミュレータのbashから、スクリプトを起動して、IEをインストール。

> env LANG=C /compat/linux/bin/bash
> cd ./ies4linux-2.99.0/
> ./ies4linux --no-gui --no-color
> exit

上記では、IE6とFlash9がインストールされます。

以降は、${HOME}/bin/にIEの起動スクリプトがインストールされるので、それを使って、通常のシェルから、IEを起動できます。

Read more »

portupgrade-devel - PortDirError

January 30th, 2008

先日、ports-mgmt/portupgrade-devel2.3.1から2.4.0のバージョンに更新されていた。

しかし、前バージョンportupgradeを使って、新しいものに更新しようとしても何故か失敗する。

結局、pkg_deleteで古いものを一旦削除し、make installで新しいportupgradeをインストールし直すという方法を取った。

ところが、新しく導入したportupgradeを使って、

portupgrade -aRr

と他のportsを更新しようとしても、最初の

[Gathering depends for portdir/portname ....done]

の後、失敗する。

  • /usr/ports/INDEX-*.db
  • /var/db/pkg/pkgdb.db

のデータベースファイルを作り直してみても、症状は同じ。

ログをよく見てみると、

** Port directory not found: databases/grass-i18n
/usr/local/sbin/portupgrade:1349:in `get_pkgname': port directory error (PortDirError)

という風にエラーが開始している。

確かだいぶ前にjapanese/ipa-ttfontsのTrueTypeフォントを入れた時、依存関係から、databases/grass-i18nも一緒に入って来た。

調べてみると、ipa-ttfontsは、現在もう、grass-i18nには依存してないようなので、grass-i18nの方をアンインストール(grass-i18nは、databases/grassにマージされて現在、portsディレクトリには存在していない)

今度は、新しいportupgradeでも、他のportsを更新できるようになりました。


[追記] これを書き終わった頃に、portupgrade-devel2.4.1のバージョンに更新されていました。A bugs fix releaseだそうです。

FreeBSD 6.3-RELEASEに更新

January 18th, 2008

FreeBSD 6.3-RELEASEが出てきたようなので、今まで使っていたFreeBSD 6.2Rから更新してみました。

行った手順は、

の時とほぼ同じ。

こちらの環境では、特に問題もなく、移行できたようです。

終了後、make check-oldを実行してみたら、

>>> Checking for old files
/usr/share/info/bzip2.info.gz
/etc/namedb/PROTO.localhost-v6.rev
/etc/namedb/PROTO.localhost.rev
/etc/namedb/make-localhost
/usr/share/examples/netgraph/bluetooth/rc.bluetooth
/usr/share/man/man4/kame.4.gz
/usr/share/man/man3/archive_write_prepare.3.gz
>>> Checking for old libraries
>>> Checking for old directories
To remove old files and directories run 'make delete-old'.
To remove old libraries run 'make delete-old-libs'.

と表示されたので、不要ファイルを削除。

更新履歴 2008/01/15

January 15th, 2008

の更新が来ていたので、適用した。

結果、

# uname -r
6.2-RELEASE-p10

に。

更新履歴 2007/11/30

November 30th, 2007

の更新が来ていたので、ソースを同期して、カーネルを構築しなおした。

結果、

# uname -r
6.2-RELEASE-p9

に。

RELENG_6_3のタグもうたれていたので、これで更新しようかとも思ってはみたものの、今回は保留。

Apache 2.2.6

September 23rd, 2007

www/apache22のportが、Apache 2.2.6のバージョンのものにアップデートされていたので更新。

ビルド前、make configが実行されるようで、OPTIONS メニューが立ち上がるようになったらしい。

こちらの環境では、pkgtools.conf内に、

MAKE_ARGS = {
  'www/apache22' => [
                     'WITH_MPM=worker',
                    ],
}

といったように記述してある。

workerでは、デフォルトでONになっているmod_cgiが構築されないので、メニューの最後の方にあるmod_cgidの方を有効にしてビルドした。

b2evolution 1.10.2

August 20th, 2007

久しぶりの更新。

このブログで使用しているb2evolutionというブログツールが1.10.2に更新されていたのでアップグレード。

Firefoxで見ると、ブログが文字化けする問題は、直っていなかったようなので、前回と同様に、

--- inc/MODEL/settings/_locale.funcs.php~       Sat Mar 10 23:15:16 2007
+++ inc/MODEL/settings/_locale.funcs.php        Wed Apr  4 21:43:40 2007
@@ -869,7 +869,7 @@
        if( ! empty($force_io_charset_if_accepted) )
        { // we want to force a specific charset:
                if( ! isset($_SERVER['HTTP_ACCEPT_CHARSET']) // all allowed
-                       || preg_match( '~\b(\*|'.$force_io_charset_if_accepted.')\b~', $_SERVER['HTTP_ACCEPT_CHARSET'] ) )
+                       || preg_match( '~\b(\*|'.$force_io_charset_if_accepted.')\b~i', $_SERVER['HTTP_ACCEPT_CHARSET'] ) )

                {
                        $req_io_charset = $force_io_charset_if_accepted; // pretend that the first one has been requested
                }

の修正をした。

また、これはいつもやっていることだけど、スタブファイルに勝手に.phpのsufixを付けて欲しくないので、

--- inc/MODEL/collections/_blog.class.php~      Sat May 26 02:44:38 2007
+++ inc/MODEL/collections/_blog.class.php       Thu Aug 16 17:12:06 2007
@@ -504,7 +504,7 @@
                                { // We want to force the dynamic page but the URL is not explicitly dynamic
                                        // This is needed when a static page is taking control of domain.com/stub and we want an explicit link to the LATEST content, which can only be gotten at domain.com/stub.php
                                        // fp> This creates a small problem with empty stubs (domain.com/.php). This should be fixed by using a fourth blog_access_type: default, index.php, stub, *default_stub* . Consequence: require the stub fied on blog properties form when stub mode is selected
-                                       $blogurl .= '.php';
+                                 //                                    $blogurl .= '.php';
                                }
                                return $blogurl;

も修正。

b2evolution 1.9.3

April 4th, 2007

ここのブログで利用しているb2evolutionというブログツールが

ということなので、アップグレード。

1.9.2のバージョンに更新した時、IE等のブラウザで閲覧した場合は問題なかったのだが、何故かFirefoxで閲覧した場合、ゲストユーザ(一般ユーザ)になって、ここのブログを閲覧すると文字化けして読めなくなっていた。

一応、応急措置として、conf/_locale.phpを

$force_io_charset_if_accepted = 'UTF-8';

と直して、こちらの環境では問題は解決したように見えたのだが、その後も、Firefoxだと文字化けするとのコメントをいくつか頂いていた。

こちらの環境では、FirefoxのPreferenceから、Content→Advancedのダイアログで、Default Character EncodingをUTF-8に設定していた。

これだと、

HTTP_ACCEPT_CHARSETUTF-8,*

として、リクエストヘッダがサーバ側に送られるようです。

しかし、Firefoxのデフォルトの設定では、

HTTP_ACCEPT_CHARSETISO-8859-1,utf-8;q=0.7,*;q=0.7

となっている。

b2evolutionはクライアントに応じて出力する文字を切替えてくれるらしいのだが、どうやら、UTF-8utf-8の大文字と小文字の違いを処理できずに問題が生じていた模様・・。

とりあえず、conf/_locale.phpは、

$force_io_charset_if_accepted = 'utf-8';

としておき、ケースの違いで問題が起こらないように、

--- inc/MODEL/settings/_locale.funcs.php~       Sat Mar 10 23:15:16 2007
+++ inc/MODEL/settings/_locale.funcs.php        Wed Apr  4 21:43:40 2007
@@ -869,7 +869,7 @@
        if( ! empty($force_io_charset_if_accepted) )
        { // we want to force a specific charset:
                if( ! isset($_SERVER['HTTP_ACCEPT_CHARSET']) // all allowed
-                       || preg_match( '~\b(\*|'.$force_io_charset_if_accepted.')\b~', $_SERVER['HTTP_ACCEPT_CHARSET'] ) )
+                       || preg_match( '~\b(\*|'.$force_io_charset_if_accepted.')\b~i', $_SERVER['HTTP_ACCEPT_CHARSET'] ) )
                {
                        $req_io_charset = $force_io_charset_if_accepted; // pretend that the first one has been requested
                }

として見ることにする。

PHP 5.2.1

February 11th, 2007

portsの方のlang/php5が、PHP 5.2.1になっていた(今まで、5.2.0を使用していた)。

その他のportsも含めて更新したかったので、

# portupgrade -aRr

としたところ、途中、なぜか、

cd: can't cd to /usr/ports/databases/pecl-PDO

と表示され、php5-extensions等のいくつかのportsの更新に失敗。

どうやら、

にあるように、こちらの方で以前からインストールしてあったpecl-PDOが、php5-pdoに変更された事が原因らしい(typo?)。

そこで、一旦、

# pkg_delete -f /var/db/pkg/pecl-PDO-1.0.3

と古いのを削除してから、再度、

# portupgrade -aRr

を実行したところ、うまく行った。

追記

修正されました。

更新履歴 2007/02/10

February 10th, 2007

ソースをcsup(1)したら、

の更新が来ていたのでアップデート。

上記に書いてある通り、

# cd /usr/src/lib/bind
# make obj && make depend && make && make install
# cd /usr/src/usr.sbin/named
# make obj && make depend && make && make install

としてから、

# /etc/rc.d/named restart

とbindを再起動した。