携帯電話に登録された住所録をOutlookに登録する


携帯電話に登録された住所録をiPhoneに移動する


 携帯電話に登録されている住所録を、iPhoneに移動させるにはどうしたらよいでしょうか?

 私は、携帯電話に登録されている住所録をOutlookに登録することで対応しました。以下はその手順です。


住所録の形式を知る


 連絡先を管理する色々なソフトウェアがありますが、連絡先はvCard形式と呼ばれる標準フォーマットで保存されることが多いです。

 Wikipediaによると「vCardは電子名刺の標準規格フォーマット。項目として名前、住所、電話番号、URL、企業ロゴのほか、写真や音声などを含むことも出来る。」と説明されています。Wikipediaにサンプルがありましたので、以下に掲載しておきます。

BEGIN:VCARD
VERSION:2.1
N:Gump;Forrest
FN:Forrest Gump
ORG:Gump Shrimp Co.
TITLE:Shrimp Man
TEL;WORK;VOICE:(111) 555-1212
TEL;HOME;VOICE:(404) 555-1212
ADR;WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:100 Waters Edge=0D=0ABaytown, LA 30314=0D=0AUnited  States of America
ADR;HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America
LABEL;HOME;ENCODING=QUOTED-PRINTABLE:42 Plantation St.=0D=0ABaytown, LA 30314=0D=0AUnited  States of America
EMAIL;PREF;INTERNET:forrestgump@walladalla.com
REV:20080424T195243Z
END:VCARD
 上記の例で分かるとおり、vCard形式のデータは「BEGIN:VCARD」で始まり、「END:VCARD」で終わるデータです。

1個のファイルの中に格納されている連絡先は、1件、それとも複数件


 Outlookでは1つのファイルに1個の連絡先が格納されている形式のファイルを扱います。一方携帯電話などのバックアップに使われる形式としては、1つのファイルに複数の連絡先が格納されています。そのため携帯電話のバックアップのデータをOutlookに登録するときは、1つのファイルに1個の連絡先が書かれている形式に変換してあげないといけません。

(ソフトウェア工学的に良くない)プログラム


 先ほど述べたように、vCard形式のデータは「BEGIN:VCARD」で始まり、「END:VCARD」で終わるデータです。ですので、この区切り文字を使って、複数ファイルに切り出してあげれば良いです。
#!/usr/bin/perl

$i = 1;
while ( <> ) {
    $line = $_;
    if ( $line =‾ m/BEGIN:VCARD/ ) {
        open OUT, ">vcard" . $i . ".vcf";
        $i = $i + 1;
        print OUT $line;
    } elsif ( $line =‾ m/END:VCARD/ ) {
        print OUT $line;
        close OUT;
    } else {
        print OUT $line;
    }
}
上記のプログラムをsplitという名前で保存したとしたとき、使い方は以下のとおりです
./split [vcardファイル名]
コマンドを実行すると「vcard???.vcf」という名前のファイルが、登録されている連絡先の数だけ作成されます。

(ソフトウェア工学的に正しい)プログラム


 先に示したプログラムはソフトウェア工学的に良くないです。入力データの形式とプログラムの形式が一致していないと、保守性の高いプログラムにはなりません。

 今回の入力データは、「BEGIN:VCARD 〜 END:VCARD」というデータが複数回現れます。そのため、「BEGIN:VCARD 〜 END:VCARD」を扱うループを内側のループとし、この内側のループが複数回処理するための外側のループとで、2重ループになっていないといけません。

#!/usr/bin/perl

$i = 1;                 # ファイル名に使う番号
while ( <> ) {
    $line = $_;
    if ( $line =‾ m/BEGIN:VCARD/ ) {
        open OUT, ">vcard" . $i . ".vcf";
        $i = $i + 1;
        print OUT $line;
        while ( <> ) {
                $line = _;
                print OUT $line;
                if ( $line =‾ m/END:VCARD/ ) {
                        last;
                }
        }
        close OUT;
    }
}

 使い方は、先ほどとのプログラムと同じです。


Outlookに登録


 Outlookに登録するのは簡単です。今回のプログラムを使って作られたファイルをまとめて範囲指定して、outlookにドラック&ドロップします。

 すると、登録用のサブウィンドウが連絡先の数だけ開きます。

 後は登録ボタン(OKボタン)を押せばよいのですが、これはエンターキーを押し続けることで、順番に全ての連絡先が登録され、ウィンドウも閉じられます。


閑話休題


何故正しくないプログラムなのか

 1個目のプログラムは2個の状態を持っています。2個の状態とは、「ファイルが開かれている状態」と「ファイルが閉じている状態」です。状態を表すために、フラグ変数などを使ったりしますが、今回はそのような変数は使っていません。入力データが正しい状況しか考慮していないので、状態変数を必要としていないだけで、本来ならばファイルが閉じているか開いているかを示す状態が必要になるでしょう。

 入力データを処理している箇所(処理している内容)が、プログラムの構造に反映されず、状態(変数の値など)に反映されていると、プログラムは非常に読みにくくなってしまいます。また、変更に弱いプログラムになってしまいます。

何故正しくないプログラムを書いてしまうのか?
   多くの人がこのようなソフトウェア工学的に正しくないプログラムを書いてしまいます。何故人はこのようなプログラムを書いてしまうのかは非常に興味深いです。人々が失敗する理由も考えておきたいと思っています。