アップデータ1.1 マニュアル 目次

  • updaterとは何か
  • 特徴
  • どうやって使うものか?
  • サーバセットアップの詳細
  • ローカルセットアップの詳細
  • ユーザー設定の詳細
  • 技術的な詳細
  • ライセンス
  • 免責
  • 連絡先
  • 履歴
  • updaterとはなにか?

    私は同人ゲームを作っています。

    コミケと言われるイベントで、自分の作ったゲームをCD-Rに焼いて 売っているのですが、発売後にアレなバグや文章の誤植が見つかることなど 日常茶飯事です(本当はそれじゃダメなのだがー)。

    そんな時は、ゲームのパッチを配布します。 でも、いちいち「パッチを作りましたからダウンロードして下さい」と 告知するのも面倒なものです。 買った人が、必ず告知を見てくれるとも限りませんし。

    WindowsUpdateみたいに、自動的にアップデートかけてくれる プログラムがあったら便利なのになあ、と私は思いました。

    探してみてもそれらしい物は無かったので、 この「updater.exe」を作りました。

    そんなわけで、これは主にWindows用のゲームパッケージを想定した ネットワークアップデートプログラムです。

    一度わかってしまえば、プログラムの使い方自体はとても簡単です。 ただ、手順が少々ややこしいということと、 元々の自分のゲームのファイル、updaterのために作る設定ファイル、 updaterに指示して作らせるファイル、updater自身が勝手に作るファイルなど 色々なファイルが入り乱れるせいで、説明をよく読まないと混乱するかも知れません。

    必要なことはみんなこのドキュメントに書いてあります。 わからなくなったら一度手を止めて、 お茶でも飲みながらゆっくり読み直してみましょう。

    特徴

  • Webサーバにパッチを置くだけでよく、特別なサーバが要らない
  • proxy対応
  • 全てのファイルのダウンロードが完了するまでファイルの置き換えをしないので、途中でキャンセルしても安全
  • ダウンロードしたファイルが壊れてないか、md5でチェックしている
  • どうやって使うものか?

    updaterの動作原理は簡単です。

    サーバに置いた最新のファイルと、自分のマシンのファイルのバージョンを 比較して、サーバのファイルが自分のマシンのファイルより新しければ、 サーバからファイルをダウンロードして置き換えるという、それだけです。

    updaterでは、サーバフォルダはWebサーバ上に置くことになっています。 標準的なWebページを持っていれば、誰でもネットワークアップデート可能な 環境を構築できるのです。

    このupdaterのアーカイブには、 updaterの動作を簡単に体験するための、 テスト用のフォルダがあります。

    このフォルダの中身は、まだ完全ではありません。 順を追ってセットアップしてもらうことで、 実際のアップデートの手順を体験できるようになっています。

    さて、それでは順を追って学んで行ってみましょう。

    「test/down」を開いてみてください。

    こちらは、サーバからファイルをダウンロードする側になる 予定のローカルフォルダです。

    ローカルフォルダには4つのファイルがあります。 sample.txtが、アップデート対象になるファイル、 updater.define.txtがアップデータの動作を指示する定義ファイル、 updater.exeがアップデータ自身のプログラム、 hello.exeがアップデートが終了後に実行される プログラム本体です。


    「test/up」を開いてみてください。

    こちらは、サーバにアップする予定の サーバフォルダです。

    サーバフォルダには2つのファイルがあります。 sample.txtがこれからアップデートする新しいファイル、 updater.exeがアップデータ自身のプログラムです。

    sample.txtの中身はこのようになっています。 まだバージョンアップする前のファイルです。

    sample.txtの中身はこのようになっています。 これからバージョンアップする予定の新しいファイルです。

    きちんとアップデートが行われるのを確認するために、 適当に書換えてセーブしてみて下さい。

    セーブが終わったら、 sample.txtをupdater.exeへドラッグ&ドロップします。

    すると、このようにダイアログが表示され、

    新しくupdater.filelist.txtという ファイルが作られます。 これはupdater.exeが作ったファイルで、 sample.txtのファイルサイズ、チェックサムなどの 情報が記録されています。

    ここまでで、サーバ用のセットアップは完了です。 ftpなどを使って、upフォルダの中身を全部、適当な Webサーバにアップロードしてやりましょう。 (この時、updater.exeまで一緒にアップロードする必要は ないのですが、アップロードして害があるわけでもありません)

    後で、ローカルのupdater側の設定ファイルで、 アップロードしたフォルダのURLを指定してやる必要があるので、 きちんとメモを取っておきましょう。 今回は仮に http://www.mysite.desu/updater/up/ というURLに アップロードしたことにしておきます。

    サーバ側のセットアップが終わったので、 ローカルフォルダに戻ります。 次はupdaterの設定ファイルであるupdater.define.txtを開いてみましょう。

    ファイルの先頭に、サーバフォルダのURLを書く欄があります。 この部分を、自分がアップロードしたサーバフォルダのURLに書換えてセーブします。 今回は http://www.mysite.desu/updater/up/ にアップロードしたので、 そのURLを書き込みます

    準備が完了したら、いよいよupdater.exeをダブルクリックしましょう。 ネットワークアップデートが開始されます。

    updaterが、ネットワークアップデートをオンにするか聞いて 来るので、「はい」と答えてください。

    次に、ネットワークの設定を行います。 proxy経由でWebに接続する人は、 ここで適切な設定を行ってください。

    ネットワーク設定のダイアログが表示されるのは 最初の1回だけです。 これ以降、updaterは自動的に初回の設定で ネットワークへ接続しに行きます。

    アップデートを開始すると、updaterは updater.define.txtで指定したURLから updater.filelist.txtをダウンロードします。

    その情報を元に、更新する必要があるファイルを検出すると、 このように更新予定ファイルの一覧が表示されます。

    ここで「OK」を押すと、実際にファイルのダウンロード が行なわれます。

    アップデートが完了しました。 アップデータはメインプログラムである hello.exeを起動します。

    sample.txtを開いてみると、 きちんとバージョンアップしているのがわかります。

    サーバセットアップの詳細

    『どうやって使うものか?』で解説したように、 updater.exeに新規のファイルをドラッグ&ドロップする ことで、サーバ側に置くファイルリスト『updater.filelist.txt』を作成 します。

    updater.filelist.txtの具体的な中身は、次のようになっています。

    sample.txt,sample.txt,,146,511c07c422ed32c721088b7b853b0d28
    

    いくつかの要素が、カンマ区切りで並んでいます。

    1列目がサーバ側に置かれたファイル名、 2列目がローカル側でそのファイルに対応するファイル名、 3列目はとりあえず飛ばして、 4列目がこのファイルのサイズ、 5列目がこのファイルのチェックサムです。

    すでにupdater.filelist.txtが存在する時に、updater.exeに新しいファイルを ドラッグ&ドロップすると、ファイルリストの末尾に新しいファイルの情報が 追加されます。 また、すでに存在するファイルの新しいバージョンをupdater.exeにドラッグ&ドロップ すると、そのファイルのチェックサムが更新されます。

    3行目のフィールドには、「ファイル情報テキスト」を指定することができます。 例えば、「sample_detail.txt」という名前で、次のような中身のファイルを 作ります。

    updater.filelist.txtの3列目の項目に、次のようにこの 「ファイル情報テキスト」のファイル名を指定します。

    sample.txt,sample.txt,sample_detail.txt,146,511c07c422ed32c721088b7b853b0d28
    

    この「ファイル情報テキスト」も、その他のファイルと一緒にサーバにアップ ロードしてやり、その上でアップデートをかけると、 これからダウンロードしようとしているファイルの詳細情報を表示 させてやることができます。

    ローカルセットアップの詳細

    『どうやって使うものか?』でアップデートを完了した後、 ローカルフォルダの中身は次のようになっています。

    updater.confは、updater.exeが自動的に作るファイルで、 ユーザー設定を記録するために使われています。

    updater.filelist.txtはサーバ上に置いたファイルリストの写しです。 updater.exeは起動する度に、サーバ上の最新のファイルリストを見に行き、 ローカルのファイルリストと比較することで、アップデートの必要があるかどうかを判断します。

    updater.define.txt は、以前少し触れたようにupdater.exeの動作を指定する設定ファイルです。 では、その詳しい内容を説明していきましょう。

    # アップデートファイルを置いてあるURL
    url:  http://www.mysite.desu/updater/up/
    
    # ウィンドウのタイトルバーに表示するキャプション
    caption:  アップデータテスト
    
    # アップデート終了後に起動する実行ファイルの名前
    exec:     hello.exe
    
    # 初回起動時に表示するメッセージ
    first_launch:
    当プログラムはネットワーク経由で
    パッチをダウンロードする機能を持っています。
    
    この機能をオンにすると、最新のパッチが自動的に
    ダウンロードされ、常に最新の状態に保たれます。
    
    ネットワークアップデート機能をオンにしますか?
    (後からオンにする事も出来ます)
    

    設定ファイル中の「#」より後ろの部分はコメントと看倣して無視されます。 まずは、URL指定の部分に注目して下さい。

    # アップデートファイルを置いてあるURL
    url:  http://www.mysite.desu/updater/up/
    

    この欄では、アップデートファイルを置いてあるサーバ側のフォルダのURLを指定します。 『http://www.mysite.desu:80/updater/up/』のようにポートを明示的に指定する書き方も可能です。

    httpsには対応していません。

    URLを複数指定するとと、updaterはその中からどのサーバに繋ぎに行くかをランダムで決定します。 これにより、原始的な負荷分散を実現することが出来ます。

    # ウィンドウのタイトルバーに表示するキャプション
    caption:  アップデータテスト
    

    この欄では、updaterのウィンドウのタイトルバーに表示する キャプションを指定します。

    # アップデート終了後に起動する実行ファイルの名前
    exec:     hello.exe
    

    この欄では、updaterの実行後に起動する特定の実行ファイルの名前を指定します。 ゲームの場合なら、ゲーム本体のプログラムをここで指定するわけです。

    この欄は省略することも可能です。 その場合、updaterはアップデート動作のみを行ってただちに終了するようになります。

    # 初回起動時に表示するメッセージ
    first_launch:
    当プログラムはネットワーク経由で
    パッチをダウンロードする機能を持っています。
    
    この機能をオンにすると、最新のパッチが自動的に
    ダウンロードされ、常に最新の状態に保たれます。
    
    ネットワークアップデート機能をオンにしますか?
    (後からオンにする事も出来ます)
    

    この欄では、updaterの初回起動時にダイアログに表示するメッセージを定義します。 ここを書換えれば、好きなメッセージをユーザー宛に表示することができます。

    ユーザー設定の詳細

    updaterでは、ネットワーク接続を行うかどうかといったいくつかの設定を、 ユーザー(この場合、ゲームを買って実際にネットからパッチをダウンロードする 人のこと)が行うことができるようになっています。

    ユーザー設定ダイアログを開くには、updaterに次のようなオプションをつけて コマンドラインから起動するか、

    updater.exe -setup
    

    次のようにupdater.exeショートカットを作ってその引数に「-setup」オプションを指定して やるかのどちらかを行います。

    ユーザー設定ダイアログでは、 updaterを起動する度に自動更新を行うかどうかと、 サーバに接続する際にプロクシを通すかどうかを設定できます。

    「直ちに更新」するをクリックすると、 自動更新の設定に関係なく、ただちにアップデートを実行することが出来ます。

    技術的な詳細

    コンパイル

    このプログラムは ruby-mswin32VisualuRubyExerbを使って作られています。

    ソースからupdaterをコンパイルするには、これらのプログラムをインストールして srcフォルダでmakeを実行してください。

    cygwinなどをインストールしておらず、makeが無い場合は、Makefileに書いてある 内容から必要なコマンドラインを適当に類推してやって下さい。

    アップデートの制限

    実行中のファイルは自分自身を書換えられないという Windowsの制限から、updater.exeは自分自身をアップデートすることが出来ません。

    セキュリティの観点から、updaterには updater.exeの存在するフォルダの下位フォルダにしかファイルをダウンロードできない という制限があります。 それ以外のフォルダへ(例えば絶対パスでc:/WINNTへ直接)ダウンロードさせようとする 指定をサーバ側のファイルリストに見つけると、updaterは警告を表示した後に ただちに終了します。

    updaterには、差分ダウンロードの仕組みなどは無く、 ローカルのファイルとサーバのファイルの実際の差異がわずかしか無くても サーバ側のファイルを全てダウンロードしてしまいます。 ゲームプログラムに、小さいサイズのパッチ作成を支援する仕組みが ある場合は、積極的にそれを活用しましょう。

    updaterは、ファイルの更新、または追加しか行うことが出来ず、 ローカルのファイルの削除をさせることはできません。

    アップデートの手順

    updaterのアップデートの具体的な手順は以下のようになっています。

  • サーバ側のファイリリストを入手、ローカルのファイリリストと照合
  • テンポラリフォルダを作成、アップデートの必要なファイルを全てそこへダウンロード
  • ダウンロードしたファイルのチェックサムを調べる
  • 全てのファイルが正しくダウンロード出来ていたら、テンポラリフォルダから正規のフォルダへファイルを移動する
  • テンポラリフォルダを削除する
  • サーバ側にupdater.filelist.txtが見つからない時は、 単にアップデート対象が1つも無いと判定され、 特にエラーにはなりません。

    ローカルのファイルが古いファイルかどうかと言う判定は、 サーバのファイルリストとローカルのファイルリストの比較のみで行っています。 いちいちローカルのファイルのチェックサムを取ったりはしていません。 つまり、updater.filelist.txtを削除してからアップデートをかけると、 全てのアップデートファイルをダウンロードし直すことになります。

    サーバ負荷への注意

    パッチの一斉配布を始める時には、サーバに予想外の負荷がかかりがちです。 自分のサーバが、パッチ配布のアクセスに耐えられるか事前にきちんと見積っておきましょう。

    ライセンス

    本プログラムは、修正BSDライセンスに従って配布します。

    Copyright (C) 2005 Okada Jun All rights reserved.
    
    Redistribution and use in source and binary forms, with or without 
    modification, are permitted provided that the following conditions are 
    met: 
    
    1. Redistributions of source code must retain the above copyright 
       notice, this list of conditions and the following disclaimer 
       as the first lines of this file unmodified.
    
    2. Redistributions in  binary form must reproduce the above copyright 
       notice, this list of conditions and the following disclaimer in the 
      documentation and/or other materials provided with the distribution. 
    
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
    DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 
    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
    POSSIBILITY OF SUCH DAMAGE.
    

    このライセンスは、 ソース/バイナリの如何に関わらず、 著作権表示、本条件書および責任限定規定をパッケージに含める限り、 再配布を認めるという代物です。

    上記の条件を守っている限り、改変したソースを公開せずに商用目的に 使う事も可能です。

    これとは別に、このプログラムを作成するのに使ったExerbには、 以下のようなライセンス規定があります。

    Exerbによって生成された実行形式ファイルを配布する場合、下記のいずれかを
    行う必要があります。
    
    * Ruby本体のソースコードを同梱する。
    * Ruby本体のソースコードの入手先をドキュメント等に記載する。
    
    そこで、私がこのアップデータを同梱したゲームを配布する時は、以下の一文を ドキュメントに記載しています。
    当ゲームのネットワークアップデータは、RubyスクリプトをExerbでexe化する形で作られています。 
    
    http://www.ruby-lang.org/
    http://exerb.sourceforge.jp/
    
    まとめると、このupdater.exeを同梱したパッケージを配布する時には以下の条件を 満たす必要があることになります。
  • 上記の、このupdater.exe自身のライセンス条項をどこかに記載する
  • rubyの入手先をどこかに記載する
  • 免責

    ライセンスでも記載してありますが、 このプログラムを使用して負ったいかなる損害に対しても私は責任を負いません。 あくまで無保証である事を理解した上でお使いください。

    ネットワークアップデータでプログラムを配布する事は、 ユーザーのHDDに対して責任を負うことだと理解して下さい。 もし、あなたのWebサーバがクラックされて、 ウイルスやトロイの木馬を仕込んで改変されたプログラムが アップデートフォルダに置かれても、ユーザにはそれを直ちに識別する 術は無いのです。

    ネットワークアップデータを配布する以上、 Webサーバのパスワードにわかりやすい文字列を使ったりしない、 定期的にパスワードを変えるといった、基本的なセキュリティ対策はしっかり行ないましょう。 あなたがサーバ管理者であるならば、常に最新のセキュリティパッチを当てるのを忘れないように。

    連絡先

    ゆん(岡田潤)
    http://www.nekome.net/
    yun@nekome.net

    更新履歴

    2005/5/4
    バージョン1.1リリース
    httpリダイレクト(301,302,303)に対応(patch提供sugi氏)
    exerb3.3.1でのビルドに対応(patch提供sugi氏)
    2005/1/2
    ファーストリリース