2006 年 8 月 11 日 20 時 27 分

エクスポータとしての設計


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


エクスポータという名前が付く以上、
データを何かしらの形でエクスポートしなければならない。

開発者にとっては、XML で出力すれば便利だろう。
XSLT なり DOM なり使って自由に操れるので。

でも、人が読むバックアップ用途としてみると、
XML なんて吐かれても使えねぇ。利用者としては
エクスポートした後も簡単に読めるようにしたい。

さて、どうしようか。

まず、1 日記 1 ファイルとすることにしよう。
俺みたいにアホ程日記を書いてると、
すべての日記を連結したサイズは馬鹿にならないからだ。

そして、出力形式に関しては HTML/XML を採用する。
全ての HTML/XML 吐かせるのは無駄になるので、
あらかじめテンプレートを外部に用意しておき、
テンプレートの中の決められた部分に、
日記のタイトルや本文が埋め込まれて出力されるようにする。

例えば、以下のようにテンプレートを作っておく。

<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$title</h1>
<p>$date</p>
<p>$body</p>
</body>
</html>

$title などが実際の内容に置き換わるってわけだ。

さて、この場合スクリプトは引数を受け取って処理する必要がある。
コマンドラインのパラメータについても決めておこう。

WScript には引数を自動的に処理してくれる仕組みがある。
WScript は Windows 流の引数を扱うので、
名前つき引数 / で始まり、値は:の後に続けて入力する。

    /user:メールアドレス
    /password:パスワード
    /template:テンプレートファイル名(省略可能)
    出力フォルダ

こんなものかな。

出力フォルダは名前のない引数で直接指定する。
名前のない引数は、基本的に省略せず、
コマンドにとって主要な情報を渡す用途として利用する。
「エクスポート」コマンドなので、「出力先」が主要引数だ。

そして、メールアドレスとパスワード、テンプレートは、
名前つき引数を使って入力させることにしよう。

名前つき引数は、一般的には省略可能な引数だ。
テンプレートを省略した場合は既定のものを使う。

今のところは Cookie の管理をしていないので、
メールアドレスとパスワードは省略できないのだが、
まあ、名前つき引数にしておくことにしよう。
名前のない引数が増えると分かりにくくなるしね。

では、引数の処理を行うコードを書いてみる。

========== Main.js ==========

function showErrorAndExit(message) {
    WScript.StdErr.WriteLine(message);
    WScript.Quit(1);
}

function main() {

    // 名前なし引数
    var unnamed = WScript.Arguments.Unnamed;

    // 名前つき引数
    var named = WScript.Arguments.Named;

    // /? でヘルプ
    if (named.Exists("?")) {
        WScript.Arguments.ShowUsage();
        WScript.Quit();
    }

    // 引数チェック

    if (unnamed.length < 1 || unnamed.Item(0) == undefined
            || unnamed.Item(0).length == 0) {
        showErrorAndExit("エクスポート先のフォルダが指定されていません。");
    }
    var folder = unnamed.Item(0);

    if (!named.Exists("user") || named.Item("user") == undefined
            || named.Item("user").length == 0) {
        showErrorAndExit("メールアドレスが指定されていません。");
    }
    var user = named.Item("user");

    if (!named.Exists("password") || named.Item("password") == undefined
            || named.Item("password").length == 0) {
        showErrorAndExit("パスワードが指定されていません。");
    }
    var password = named.Item("password");
   
    var template = "default.html";
    if (named.Exists("template")) {
        template = named.Item("template");
        if (template == undefined || template.length == 0) {
            showErrorAndExit("テンプレートのファイル名が指定されていません。");
        }
    }
   
    WScript.Echo("user: " + user);
    WScript.Echo("password: " + password);
    WScript.Echo("template: " + template);
    WScript.Echo("folder: " + folder);
   
}

main();

========== end of Main.js ==========

これで、以下のようにコマンドを実行できる。

$ MixiExporter.wsf my-diary /user:mail /password:foo

user: mail
password: foo
template: default.html
folder: my-diary

一般的にWindows のコマンドは、/? でヘルプが出るが、
wsf はコマンドのヘルプを表示するための、
特別なサポート構文がある。

========== MixiExporter.wsf ==========

<?xml version="1.0"  encoding="shift-jis" ?>
<job>
    <runtime>
        <description>mixi の日記をエクスポートします。</description>
        <example>利用例: MixiExporter.wsf "my-backup" /user:mailbox@example.com /password:foobar</example>
        <unnamed
            name="folder"
            helpstring="エクスポート先のフォルダ。"
            many="false"
            required="1"
        />
        <named
            name="user"
            helpstring="mixi アカウントのメールアドレス。"
            type="string"
            required="true"
        />
        <named
            name="password"
            helpstring="mixi アカウントのパスワード。"
            type="string"
            required="true"
        />
        <named
            name="template"
            helpstring="出力に使用するテンプレートのファイル名。"
            type="string"
            required="false"
        />
    </runtime>

    <script language="javascript" src="./lib/XMLHttpRequest.js" />
    <script language="javascript" src="./lib/HttpUtil.js" />
    <script language="javascript" src="./lib/MixiError.js" />
    <script language="javascript" src="./lib/MixiSession.js" />
    <script language="javascript" src="./lib/MixiDiaryEntry.js" />
    <script language="javascript" src="./lib/MixiDiary.js" />
    <script language="javascript" src="./Main.js" />

</job>

========== end of MixiExporter.wsf ==========

こういう風にタグを書いておけば、
WScript.Arguments.ShowUsage() を呼び出すことで、
wsf の内容に基づいて、標準出力にヘルプが表示される。

$ MixiExporter.wsf /?

Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

mixi の日記をエクスポートします。
使い方 : MixiExporter.wsf folder /user:値 /password:値 [/template:値]

オプション :

folder  : エクスポート先のフォルダ。
user    : mixi アカウントのメールアドレス。
password : mixi アカウントのパスワード。
template : 出力に使用するテンプレートのファイル名。
利用例: MixiExporter.wsf "my-backup" /user:mailbox@example.com /password:foobar

よし、外枠は整った。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.