Pythonの罠

まあ,考えてみれば当たり前なのですが,Cの,

for ( i=0; i<10; i++) {
    なんとかかんとか;
}

は,Pythonでは,

for i in range(0,10):
    なんとかかんとか

に置き換わります.

ただし,iの最終値を利用する場合,Cの例では,i == 10 になっているのに対して,Pythonの例では,i == 9 です.

for ループの中で条件によってループを抜け出す工夫をした場合,抜け出さないままループを完了した時,iの値が異なるわけです.

これを避けるには,

i = 0
while i < 10:
    なんとか
    条件によって分岐
    かんとか
    i += 1

としないといけません.

他の人が書いたCのソースをpythonにコンバートするような時には注意が必要です.

IMAPの保存メールいじりまとめ

IMAPクライアントで,サーバーのメールフォルダー・ファイルのメンテをその後もだらだらやっています.

いくつか解ってきたことがあります.

メールクライアントごとの状況

Thunderbird

不思議ですが,家庭内LAN経由でつないでいるMac, Windows PC, 仮想マシンのWindows, 仮想マシンのLinuxのいずれについても,破損が懸念されているメールボックスを読み込む間エラー表示が出続け,本来275通のはずなのですが,400を越えても読み込みを続けます.恐ろしいので,400〜500見当で,Thunderbirdを終了させています.

唯一,IMAPサーバーを動かしているLinuxマシンのコンソール(X.org + KDE 4.x)からは,問題なくつながり,正しいと思われる通数のメールを読み込み,表示します.

ただし,文字コードへのトーレランス(注)は,あまりないようで,古いメールのタイトルがいくつか化けています.

注: toleranceの最初の母音は[ou]と発音される長母音ですから,カタカナ表記的にはトーレランスとすべきです(例 totalはトタルでなくて,トータル,rotateは,ロテトじゃなくて,ローテートでしょう).そこで,マスコミがどう書こうが,当サイトでは”トー レランス”と標記します.

ここまで書いた後で解ったことは,サーバー以外で一台だけ,当該のメールボックスをThunderbirdで正常に読み込めるMacがありました.因果関係がますます解らなくなりました.

Apple Mail

エラーなくつながり,文字コードへのトーレランスも高いのですが,本文があるのに勝手に「このメールには本文がありません」という表示があったり,実際に本文が表示されなかったりします.

また,なぜか大きいメールボックスについては全通は表示されません.その規則性,何年前で切っているのか,何通で切っているのかも解りません.

ということで,メールボックスの操作は危険と判断しています.

iOS Mail(メール)

エラーなくつながり,文字コードへのトーレランスも高く,すべてのメールが表示され,本文がないこともありません.ネット越しにつながるクライアントで一番まともです.

ただし,階層構造になっているメールボックスをたたむことができず,全部展開されますから,いじるのは大変です.

結論

IMAPサーバーの動いているマシンのコンソールからThunderbirdを動かして,メールボックスをメンテナンスして,iOSのMail(メール)で,確認をするのがよさそう.

IMAPメールボックスの危機 (2)

Imapのサーバーのユーザーディレクトリーに保存されているファイルの名前はMIMEではなく、UTF-7だそうです。

で、それを変換するperlスクリプトを作りました。作ったと言っても当該のCPANモジュールを呼び出すだけですが。

ただし、これには罠があって、CPANモジュールのIMAP-UTF-7の説明には間違いがあります。

use Encode qw/encode decode/;

ではなくて、

use Encode::IMAPUTF7;

としないといけません。ずいぶん昔から指摘されているのに、直っていません^^;

スクリプト付けときます。GNU GPL 3.0 or laterっちゅうことで。

#!/usr/bin/perl
# imapdecode.pl
# by I Hieda (JE1SGH), 22 Apr 2016
# GNU GPL 3.0 or later

use Encode::IMAPUTF7;

$filename = @ARGV[0];

$outname=Encode::decode('IMAP-UTF-7',$filename);
binmode(STDOUT,":utf8");

print $filename," : ";
print $outname,"\n";

使い方としては、

 for i in `ls`; do imapdecode.pl $i; done

などとします。

IMAPメールボックスの危機

注意(主に自分宛, 2024/10/30): 当記事執筆当時,IMAPサーバーはUW-IMAPでしたが,その後dovecotに変更したので,当記事の内容は現在は全く意味をなしません.

自分のメールの管理は、昔からIMAPサーバーを立ち上げてやっています。これは個人営業のクラウドのようなもので、サーバーにアクセスできる限り、自宅LANからも外部からも、パソコン、iPhone、iPadなどで保存したメールすべてを同様にアクセスできます。どこからでも同じように閲覧・保存・操作ができるということで、年々メールが溜まっていくわけです。

とは言えメールに関してはパソコンのトラブル、サーバーのトラブルなどで完全消失したことが過去には何度もあり、現在残っている最古のメールは2002年11月です。

人によっては数百通のメールがありますが、文字コードの破損などで、メールボックスの構造が壊れているというか、ほつれつつあるところがあります。

クライアントの種類、接続の状況によって、正常だったり、異常だったりします。と言うことで完全に壊れている、というより「ほつれている」状態です。たぶん、文字コードのハンドリングが完璧でないクライアントでいじったりしたのが、ほつれをひどくしている原因だと思います。

あんまりいじるとさらにひどくなりそうなので、そっとしておくことにしますが、うっかり削除したり、どうしようもないほど回復不能になったフォルダーの回復法をメモっときます。

  1. Thunderbirdを使う。Local Foldersの場所をAccount settingで確認しておく。
  2. バックアップがあることを確認した上で、当該のフォルダーを削除して、Thunderbirdはいったん終了。
  3. 壊れたメールボックス(フォルダー)の場所(path)を特定して、バックアップツール(Time MachineやRetrospect)からそれに対応するファイルを探し出す。
  4. 復活させたいフォルダーのファイル、”フォルダー名”と”フォルダー名.msf”を安全なところに復活させる。
  5. その二つのフォルダーを1でみつけたフォルダーにコピーする。
  6. Thunderbirdを起動して、Local Foldersにある復活させたフォルダーの中身を確認して、IMAPサーバーにコピーする。

不可視フォルダーや、pathなどについては、省略^^; たぶん、解る人にはヒントになると思います(たぶん^^; おそらく^^;; )。

気をつけなければいけないのは、Thunderbirdでフォルダーの中身をぶっ壊した場合、Thunderbirdで同じフォルダーを復活させてもその後の処理はかなり危険と言うことです。

Thunderbirdは、どうも、この件に関してはかなり劣悪です。Apple Mailはまだましですが、バックアップから復活させたメールボックスファイルをインポートする方法が解らないので、今回は使い(使え)ませんでした。

また、GMailにIMAPでいったん上げて、GMailのWeb UIでいじるのは良い具合です。ただし、また、自営のIMAPサーバーに戻す時にトラブったりしますが。

メールクライアントからは、同じフォルダー内にあるというイメージ。IMAPサーバー的には、一つのメールボックスファイルとなっている。

固定電話やめるつもり

まだ,次のプロバイダー更新の時なので,3年先になりますが.

今回のプロバイダー切り替えでは,2月半ばに新しいプロバイダーが開通し,古いプロバイダーを2月末までで解約したかったんですが,光電話の切り替えが3月にずれ込んでしまいました.

新旧プロバイダーに確認したら,光電話の切り替えまで旧プロバイダーとの契約を続けないと,番号が引き継がれない,と言うのです.

2月の新プロバイダー月額料金は,無料でしたが,3月からは課金されますので,結局3月は,使ってもいない旧プロバイダーにも1か月分取られ,二重に支払うことになってしまいました.

まったく,電話番号を人質にした,ぼったくり行為です.

実はわが家の電話番号は,市外局番が4桁だった時,市内局番以下が,

○○-○△△△

という,非常に覚えやすいものでした.それへのこだわりもあり,また,家の電話番号を変えると後々面倒と思ったので,6,000円からのプロバイダー代をどぶに捨てることになりました.

たぶん3年後になると思われる次回のプロバイダー変更は,ちょうど定年を迎える時でもあり,その時には「電話番号を変える」と,家人に宣言しました.しかし,もう固定電話は要らないんじゃないかと思っています.本音としては,次回は固定電話は解約してしまうつもりでいます.

現在はその頭に○でも△でもない数字が一桁付きますが^^;