A Django site.
6月 8, 2008
» muttを使い倒したい

しばらくkmailを使ってたけど、composerで日本語の自動折り返しができないとか、KDEアプリでuim-anthyの入力が変だとかで、muttに戻ることにした。kmailはKDEで完結できるのがよかったけど、もうがまんならん。muttも決して好きなMUAではないけど、他に選択肢がない(sylfeedが気に入らなかった理由は忘れた)。もう2度とmuttの設定をscratchからしたくないので書いておく。

基本方針は以下のとおり。

  • $HOME/Maildir
  • POP3にはfetchmail
  • MDAはmaildrop
  • MLは~/Maildir/list以下、サーバ関連のメッセージは~/Maildir/server以下にサブディレクトリを
  • spamは~/Maildir/spamに

まずはfetchmailとmaildropをインストール。

# portinstall fetchmail maildrop

muttのOPTIONSはこんな感じで指定した。

MUTT_CONFIGURE_ARGS=--with-homespool=Maildir
WITH_MUTT_NCURSES=yes
WITH_MUTT_GPGME=yes
WITH_MUTT_ASPELL=yes
WITH_MUTT_MAILDIR_MTIME_PATCH=yes
WITH_MUTT_SIDEBAR_PATCH=yes
WITHOUT_MUTT_IDN=yes
WITH_MUTT_SMTP=yes
WITH_MUTT_CYRUS_SASL2=yes

最小限の.fetchmailrcを書く。

# .fetchmailrc
poll pop3.example.org proto pop3 user "myname" password "secret" keep mda maildrop

keepを指定しておいて、取ってきたメッセージをサーバ上から削除しない。完全に移行できるめどがついたらkeepは削除してもよい。

.mailfilterにも最小限の設定を。

# minimal settings
MAILDIR="${HOME}/Maildir"
DEFAULT="${MAILDIR}"
SHELL="/bin/sh"

# enable logging
logfile $HOME/.maildroplog

# create directories if missing
`test -d "${MAILDIR}" || maildirmake "${MAILDIR}"`
`test -d "${MAILDIR}/spam" || maildirmake "${MAILDIR}/spam"`

これですべてのメッセージは~/MaildirにMaildir形式で配送される。filteringがうまくいかなかったりしてもrm -rf ~/Maildir && rm ~/.fetchids && fetchmailするだけ。filteringは後述。

テスト。

> fetchmail
1 messages (0 seen) for myname at pop3.example.org (3844 octets).
reading message myname@pop3.example.org:1 of 1 (3844 octets)... not flushed

.maildroplogを見たりやlsしてうまく配送されていることを確認。

Date: Sun Jun  8 12:38:33 2008
From: "Me" <myname@example.org>
Subj: test
File: /usr/home/myname/Maildir                                        (3844)

以前はMDAにprocmailやscmailを使った。でもやっぱりどっちも書式が気持ち悪い。maildropはshっぽくて、比較的わかりやすい。簡単な例。

if (/^Delivered-To: *auto@domain\.com$/)
    to Mail/auto

if (/^From: *boss@domain\.com/ \
    && /^Subject:.*[:wbreak:]project status[:wbreak:]/)
{
    cc "!john"
    to Mail/project
}

条件はpcre(一部の機能が使えないけど)で書ける。変数もshっぽく書ける。shellの実行はbacktickで。From:に(root|postmaster)@example.orgがマッチしたら、~/Maildir/server/$HOSTNAMEに振り分ける。また、ディレクトリが存在しなければ自動的に作成する。これでサーバが増えても問題なし。同様にMLも自動でディレクトリを作成して振り分ける。いちいちfilterを書いたり、mkdirしなくてよいので便利だ。

if ( /^From:.*(root|postmaster)@(\w+)\.example\.org/ )
{
    DIR=$MATCH2
    SUBDIR="server"
    `test -d "${MAILDIR}/${SUBDIR}" || mkdir "${MAILDIR}/${SUBDIR}"`
    `test -d "$MAILDIR/${SUBDIR}/${DIR}"`
    if ( $RETURNCODE != 0 )
    {
        log "creating ${MAILDIR}/${SUBDIR}/${DIR}..."
        `maildirmake "${MAILDIR}/${SUBDIR}/${DIR}"`
        if ( $RETURNCODE != 0 )
        {
            log "!!! failed to create ${MAILDIR}/${SUBDIR}/${DIR}"
        }
    }
    to Maildir/${SUBDIR}/${DIR}
}

# spam
if ( /^Subject:.*\*\*\*SPAM\*\*\*/ )
{
    to Maildir/spam
}

filterを書いてfetchmail、logを確認を繰り返す。このfilterはfetchmailから呼ばれたときだけ適用されるので、すでに~/Maildirにあるメッセージを再度filterするにはmaildropを直接実行する必要がある。maildropは標準入力から読み込んだメッセージしか処理してくれないので、適当にshでwrapperを書く。

#!/bin/sh
# refile [ relative_directory_name ]

BASEDIR="$HOME/Maildir"
TARGET_DIR="$1"
if [ -z ${TARGET_DIR} ]; then
    MAILDIR="${BASEDIR}"
else
    MAILDIR="${BASEDIR}/${TARGET_DIR}"
fi

if [ ! -d ${MAILDIR}/new -o ! -d ${MAILDIR}/cur ]; then
    echo "${MAILDIR} is not Maildir" >&2
    exit 1
fi

FILES=`find ${MAILDIR}/new -type f`
for F in $FILES; do
    cat ${F} | maildrop && rm ${F}
    if [ $? -ne 0 ]; then
        exit 1
    fi
done
FILES=`find ${MAILDIR}/cur -type f`
for F in $FILES; do
    cat ${F} | maildrop && rm ${F}
    if [ $? -ne 0 ]; then
        exit 1
    fi
done

納得いくものができたらmuttの設定。muttrc(5)は死ぬほど設定項目があるので、$HOME/.muttディレクトリを作って.muttrcはその中のファイルをsourceすることにする。コメント書いておいても、長くなりすぎるとわけわからなくなる。

# .muttrc
source ~/.mutt/main.muttrc
source ~/.mutt/smtp.muttrc
source ~/.mutt/color.muttrc
source ~/.mutt/japanese.muttrc
source ~/.mutt/personal.muttrc
...

配色。何も設定しないと本当に何も表示されなくて焦った。

color hdrdefault red default
color quoted brightblue default
color signature red default
color indicator brightyellow red
color error brightred default
color status yellow blue
color tree magenta default  # the thread tree in the index menu
color tilde magenta default
color message brightcyan default
color markers brightcyan default
color attachment brightmagenta default
color search default green  # how to hilite search patterns in the pager
color header brightred default ^(From|Subject):
color body magenta default "(ftp|http|https)://[^ ]+"   # point out URLs
color body magenta default [-a-z_0-9.]+@[-a-z_0-9.]+    # e-mail addresses
color underline brightgreen default

Maildirの設定。

# Maildir
set mbox_type=Maildir
set folder="~/Maildir"
set mask="!^\\.[^.]"
set mbox="~/Maildir"
set spoolfile="~/Maildir"
mailboxes ! `\
 for file in ~/Maildir/server/*; do \
   box=$(basename "$file"); \
   if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \
       -a ! "$box" = '.subscriptions' ]; then \
     echo -n "\"+server/$box\" "; \
   fi; \
 done`
mailboxes `\
 for file in ~/Maildir/list/*; do \
   box=$(basename "$file"); \
   if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \
       -a ! "$box" = '.subscriptions' ]; then \
     echo -n "\"+list/$box\" "; \
   fi; \
 done`
mailboxes "+spam"
macro index c "<change-folder>?<toggle-mailboxes>" "open a different folder"
macro pager c "<change-folder>?<toggle-mailboxes>" "open a different folder"

mailboxesはshellで動的に設定している。~/Maildir/listと~/Maildir/server以下のfolderをshellで読み出している。”c”でfolderの移動ができる。

個人設定。~/.signatureに署名を書いておく。

# personal.muttrc
#
set hostname="my.host.example.org"
set realname="SurName FamilyName"
set from="myname@example.org"
set sig_dashes=yes
set signature="~/.signature"
# set signature="echo $USER |"

# my email address
alternates "myname@example.org|another@example.net"

日本語まわりの設定。

# japanese.muttrc

# enable charset for your terminal
set charset="euc-jp"
set send_charset="us-ascii:iso-2022-jp:utf-8"
set assumed_charset="iso-2022-jp:euc-jp:shift_jis:utf-8"
set attach_charset="iso-2022-jp:euc-jp:shift_jis:utf-8"

# if you'd like to search Japanese text in headers and attachements
set thorough_search=yes
# save MIME B encoded attachements (i.e. file name contains Japanese)
set rfc2047_parameters=yes

set forward_decode=yes
set mime_forward_decode=no

# vim:ft=muttrc

SMTP関係。

# smtp.muttrc

set smtp_url="smtp://localhost:1025"

# if your MSA requires authentication...
# set smtp_authenticators="digest-md5:cram-md5"
# set smtp_pass "password"

# if the MSA supports STARTTLS...
# set ssl_starttls=yes
# vim:ft=muttrc

PGP関係。コマンドとかはmutt付属の設定をsourceしてお茶を濁す。gpg_agentはあらかじめkeychain出も使って設定しておくこと。

# pgp.muttrc
source /usr/local/share/examples/mutt/gpg.rc
set pgp_verify_sig=yes

# use gpg_agent
set pgp_use_gpg_agent=yes

# sign messages by default
set crypt_autosign=yes
set pgp_good_sign="^gpgv?: Good signature from "

# always sign and encrypt reply to signed/encrypted message
set pgp_replyencrypt=yes
set pgp_replysignencrypted=yes

header関係。

# header.muttrc

set header=yes
set user_agent=no
set use_envelope_from=yes
set edit_headers=yes

# do not display all headers
ignore *
# but these...
unignore date from to cc reply-to subject x-mailer user-agent

#hdr_order date from subject to cc
my_hdr X-Mailer: mutt

muttにはscoreをメッセージに付加することができる。このスコアによってソートしたり、タグをつけたメッセージにまとめて処理を行う、といったことが可能。

# GPG encrypted/signed messages
score "~G" 100
score "~g" 5

# if Subject contains "ports"
score "~s ports" 50

# from openbsd.org/freebsd.org
score "~f openbsd.org" 50
score "~f freebsd.org" 50

# messages to me
# see also "alternates"
score "~p" 10

こうしたみょーなパターン(~f)はmuttrc(5)のPATTERNSにあるものが使える。これだけだとあまり大したことはないけど、後述するfolder-hookと組み合わせると強力な処理が可能になる。

ML関係。subscribeしているかどうかで挙動が変えられる(通常は”r”でreplyだけど、subscribeしているlistのfolderでは必ずlistに返信する、とか)。

# list.muttrc

# subscribed lists
subscribe   (ports|misc|tech)@openbsd\.org
# hook.muttrc

#
# - generic list hook
#   * hide massage size in index_format
#   * mark messages older than a week for deletion
#   * reply to list
#
folder-hook list '\
    set index_format="%X %4C %Z %{%b %d} %-15.15L (score:%3N) %s" ;\
    set score ;\
    set sort=threads ;\
    score "~d <7d" 10 ;\
    set score_threshold_delete=0 ;\
    bind index r list-reply ;\
    bind pager r list-reply ;\
'

#
# - spam
#   * all messages get deleted after inspection.
#
folder-hook ^=spam$ '\
        set index_format="%Z %[%d %b %H:%M]  %-60.60s  %35.35F" ;\
        set sort=subject ;\
        ignore * ;\
        set pager_index_lines=8 ;\
        set score ;\
        set score_threshold_delete=0 ;\
        set weed=no ;\
'

folder-hook server '\
    set score ;\
    score "~d <14d" 10 ;\
    set score_threshold_delete=0 ;\
'

hookはfolderによって挙動を変えるための設定。”=list”以下にあるfolderで表示を変えて(index_format)、1週間以内のメッセージにscoreを加算し、返信はlistにする。これで、1週間を過ぎたメッセージは自動的に削除される(この機能がmuttに再度乗り換えるきっかけになった)。”=spam” folderのメッセージはfolderを確認した後にすべて削除する。

# hook.muttrc

# - generic list hook
#   * hide massage size in index_format
#   * mark messages older than a week for deletion
#   * reply to list
#
folder-hook "=list" '\
    set index_format="%X %4C %Z %{%b %d} %-15.15L (score:%3N) %s" ;\
    set score ;\
    unscore *;\
    set sort=threads ;\
    score "~d <7d" 10 ;\
    set score_threshold_delete=0 ;\
    bind index r list-reply ;\
    bind pager r list-reply ;\
'

#
# - spam
#   * all messages get deleted after inspection.
#
folder-hook "=spam$" '\
        set index_format="%Z %[%d %b %H:%M]  %-60.60s  %35.35F" ;\
        set sort=subject ;\
        ignore * ;\
        unscore * ;\
        set pager_index_lines=8 ;\
        set score ;\
        set score_threshold_delete=0 ;\
        set weed=no ;\
'

いやー、muttって面倒。続く(かも)。

5月 24, 2008
» OpenSolaris 2008.05 リリース記念セミナーに行ってきた

ちょっとした縁で神宮前までイベントを見物に。以前はSolarisをLinuxにreplaceするのが仕事のひとつだっただけに、なんとなく後ろめたい。それなりにスーツでないひともいたので一安心したけど。参加者は70人近くだったそうな。

Sunの社員によるプレゼンが2つに、ユーザによるプレゼンが2つ。印象的だったのは「開発モデルがウォーターフォールからアジャイルになった」という説明を(FOSSなひと相手なら一言で終わってしまうだろうに)がんばってわかりやすく説明してて、Sunのオープン化戦略を社内や社外にどれだけの労力を割いて説明したのだろうか、大変だったろうな、とか思った。外資だとそうでもないのかな。Solarisというのを抜きにして、1FOSSプロジェクトのプレゼンとして見ると、おーっていう特色が出せていなかったんじゃないかな。わくわく感がないというか。意外に(失礼)レイヤーの低いテクニカルな話題もあったので、自分がJavaな人たちに感じる「あの」違和感はなかったけどね。楽天のカンファレンスで聞かされたような、もっと抽象的な営業トークでも聞かせられるのかとか思っていただけに、これはよかった。知らなかったんだけど、kernelでサーバとしてCIFS喋るようになったのね。kernelにあんなプロトコルを突っ込む発想に驚いたよ。

ZFSがメモリ食いなのはFreeBSDだけの問題でなくて、minimum 2GとはいわないけどOpenSolarisでも結構きつい、らしい。「でも、laptopでは512Mでも使ってます」とのこと。パッケージの総数はだいたい1000、2000のオーダー。「多いでしょ」とか言ってたので、FreeBSDは18,000超えてますよ、と教えてあげた。少ないと言われてるOpenBSDでも5,000近くあるしね。apt-getをベースにpythonで書き直したそうなので、apt-getでできることはだいたいできるのかな。「パッケージを作る側からすると、以前のSolarisのパッケージシステムはRPM以下」と耳にしたので、どう改善されたのかあとで調べてみよう。外から見た感じだと、ソースをオープンにしたメリットはまだまだ享受できていないように見える。メンテナーの権限をユーザにどう移譲するか、どうサポートしていくのか、officialとunofficialなリポジトリをどうまとめていくのか、いろいろと課題は多そう。「まだ、Sunは固いイメージがある」なんて言ったけど、どこぞの国のどこぞの上場企業と比較したら、ずいぶんやわらかい。でも、まだ模索中な部分が多いみたい。それから、SunというくくりだけではないFOSSなテクニカルカンファレンスってのはおもしろいと思います。

3年ほど前にアナウンスされたけど死んでしまったGentoo/OpenSolarisが生き返るなら、生活環境に使ってみてもいいかな。中古のSPARCでも買ってくるか。

10月 7, 2007
» OSC 2007 Tokyo/Fallでお話してきました

OSC 2007でお話してきました。

おかげさまで、定員も無事埋まって盛況に終わりました。参加していただいた皆様、ありがとうございました。今回は、いちユーザとしての視点からお話させていただきました。OpenBSDを使うにあたって、知っておくと役立つ知識、知られざるその機能、セキュリティに対する姿勢なども紹介しました。なにか騒ぎが起きたときに注目をあつめることの多いプロジェクトですが、等身大のプロジェクトの実像を伝えることができたのではないかと思います。

UPDATE: スライドを公開しました。

今回の会場は蒲田の産業プラザで、展示会場も広く、各ブースをのぞいて回るにはとてもいい会場でした。ネットワークは、ルータがしょぼくてNATのセッションテーブルの奪い合いだったようです。セミナーには参加せずにブースを回っていたので、そのなかでもおもろかったものをいくつか。

いわゆるSecure OSの現状をSecure OSユーザ会(リンクはここでいいのかな)のひととお話したのですが、やはり普及に限界を感じているのは同様でした。SELinuxがdefaultで有効になったdistributionもあるのになかなか使ってもらえないとか、使っているひとたちの声が反映されていないまま進む開発とか、課題は認識されているらしかった。ベンダー視点の文書だけでなく、使っている人たちの声をまとめてほしいと伝えたところ、興味をもっていただけたので、そのうち何か出てくるかもしれません。

HinemosのCVS公開してほしいとか、開発者向けの文書を公開してほしいとか頼んでみたのですが、大人の事情でむずかしいそうで。これだと、ソースを公開するメリットは半減だと思うんだけど。もったいない。今のところNagiosとかを置き換えるには至っていないので、しばらく様子見で。

NRIのOpenStandiaのサポート対象になるための条件は、社内で面倒見られるか、外で面倒見ることができる、だそうで。ふむふむ。

matsuu氏にタイル型window managerの利点を説明してもらったのだけど、よくわからず。2枚ディスプレイがあれば満足しているし。口では説明しにくいとのことだったので、動画で説明しろと依頼。そのうちキャプチャしてくれることでしょう。

終わった後はてきとーにGentooJPのひとと飲み会。何をしゃべったのかあまり覚えていませんが、楽しいひとときでした。

7月 2, 2007
» OSCはカンファレンスなのか

OSC2007 Hokkaido に絶望した

一方、OSC 2007 Hokkaido はあれだけ楽しんだのに、絶望した。だいたい、あれは Conference とは言えないシロモノであった。Meeting とか、同好会とか、同人会とかその手のものである。8万円も出してわざわざ来るような会ではなかった。絶望した。

自分もOSCにここ数年出させていただいていて、好きなことをやったりしゃべったりしていて、活用させてもらっている。利用させてもらっている以上、絶望はしていないのだけど、確かにいまいちだなー、と思う点はいくつかある。

まずなにより、おもしろい話ができるひとがいたとしても、そのひとをOSCに招待したいとは思わない。自分は大した知名度があるわけでもないし、招待されるほどのネタを持っていないから、手を上げさえすれば枠と場所を提供してくれるOSCはありがたい。でも、面白いネタを持っていて知名度もあるひとなら、わざわざあの会場に招かれなくてもねぇ。そこで話すメリットがないとむずかしいだろうと思う。スピーカーには控え室が必要というのもごもっとも。会場で運営者のひとに案内されたり、声かけられたこともないし。

それから、展示会場がいまいちしまらない。会場である教室の入口をくぐる際のなんとも言えない気まずさはどうにかならんものか。やっぱり、広い場所のあちこちにブースがあるなんとかエキスポっぽい会場のほうが、ぶらぶらと気楽に回れていい。長テーブル1つ2つっていうスペースも狭苦しいし、そこに個人の荷物やらなんやら積み重なって見苦しいしね。

カンファレンスに参加する意義の半分くらいは、そこでの出会いとか受け取るモチベーションだと信じているのだけど、OSCでエネルギーを受け取った記憶ってあんまりない。トークとトークがつまっていて時間の余裕もないし、話し込める場所もないしね。それから、横のひろがりを促進するには、主催者がcatalyst的な役割を果たすことが重要。これはdragos氏に教えてもらった。

おそらく、localなコミュニティに場を提供していると考えるべきなのだと思う。カンファレンスではなくて。そういう視点からいえば、まぁそれなりに意義も成果もあるんではないでしょうか。ただ、カンファレンスと名乗るには会場や運営方法に改善点はあるですね。

ま、自分にはアウトプットの場所なのでインプットは期待していないんですけど。