2007年5月29日火曜日

メールの添付ファイルを削除して転送

※前のblogから記事を移動。元の公開日:2007/05/29(火) 22:40:21

---

自分宛のメールは携帯に転送してbiffの代わりにしているのだが、これに頼り切っているので何らかの拍子に転送漏れしたりするとひどいときは丸一日以上着信に気づけなかったりして困る。転送漏れの理由はたいてい添付ファイルが大きすぎて携帯の方のメールサーバで蹴られてしまったせいなので、メールのサイズがある程度より大きかったら添付ファイルを削除するようにした。

環境はこんな感じ。

受信 → postfix → maildrop → ISPのsmtp → 携帯
maildropでフィルタをかませて添付ファイルを削除する。
添付ファイル除去用のフィルタはここからもらってきた。

添付ファイル除去フィルタ(w-filter)
http://www.gomibako.com/w-filter/

消した後にちゃんと xxx という添付ファイルがついてました的なメモが残ってくれるのでありがたい。
.mailfilterの記述はこんな感じ。

MAILDIR=$HOME/Maildir
CELLULAR_PHONE="myname@career.example.com"
ATTACH_FILTER="$MAILDIR/w-filter.sh"
ATTACH_LIMIT_SIZE=500000
if ( $SIZE > $ATTACH_LIMIT_SIZE )
{
cc $MAILDIR/
xfilter "$ATTACH_FILTER"
to "!$CELLULAR_PHONE"
}
  • 携帯のメールサーバ的には3Mくらいまでは受け取ってくれるみたいだけど数百K程度でPCドキュメントビューアが開いてくれなくなるので制限は500Kにした。
  • xfilterの引数はダブルクォートで囲まないとエラーになる。
  • .mailfilterの記述にエラーがあった場合/var/log/mail.logあたりに行番号とともに出力される。

STLのstd::vector::clear()ではメモリが解放されない

※前のblogから記事を移動。元の公開日:2007/05/29(火) 22:40:21



---

vectorは、配列の伸長時に発生するnew、copyのコストをできるだけ避けるために、ある程度大きめのメモリを確保しておく実装になっているようです。
  • コンストラクタでは指定した長さ分のメモリが確保される

  • vectorが確保しているメモリ量(配列長)はcapacity()メソッドで確認できる

  • push_back()あるいはresize()等を行ったときにcapacityを超えた時、(多くの場合)それまでの2倍のメモリを確保する

    • 手元のVC++2005では1.5倍、gcc(g++) 4.1.2では2倍だった
  • clear()はデータ数を0にするだけでメモリは解放しない(capacityは変化しない)

  • resize(0)等としても同様

  • reserve()に現在のcapacityより小さい数字を与えた場合は何もしない

  • つまり、vectorが一度でも確保したメモリはオブジェクトが破壊されるまで解放されることはない(?)
stackのベースをvectorにしたりすると思わぬところでメモリオーバーしたりするので注意した方がいいようです。

2007年5月8日火曜日

zshのコマンドラインスタックをviモードで使うには

※前のblogから記事を移動。元の公開日:2007/05/08(火) 22:56:25

---

zshのコマンドラインスタック便利だ!
ESC-qと押せばよい。
という記述はよく見かけるのだが、これはemacsモード(bindkey -e)じゃないと使えない。
viモード(bindkey -v)で生活してる自分には使えず悲しい思いをしていたのだが、気が向いたのでviモードで使えるようにする方法を調べてみた。
setopt noflowcontrol
bindkey '^Q' push-line-or-edit

これでc-qでコマンドラインスタックが使えるようになる。
2行目がc-qにマップするコマンドで、1行目がc-q, c-sへのマップをできるようにするもの。他のキーにマップするなら1行目はいらない。

ちなみに、コマンドラインスタックは英語だとbuffer stack。