更新の自動チェックとアップデートを有効にする
2012.2 の日本語版では自動更新チェックを無効化し、独自にサーバーを立てることは今後の検討課題とします。
自動アップデートサーバーを独自に立てることについて調査をしたので記録しておきます。
versionInfo.py の updateVersionType を下記のように書き換えるとNVDAメニュー「ヘルプ」に「更新を確認」が出てきます。
NVDAのパッチ:
=== modified file 'source/config/__init__.py' --- source/config/__init__.py 2013-04-04 03:16:46 +0000 +++ source/config/__init__.py 2013-04-04 09:06:53 +0000 @@ -193,7 +193,7 @@ enabled = boolean(default=true) [update] - autoCheck = boolean(default=false) # nvdajp + autoCheck = boolean(default=true) # nvdajp [inputComposition] autoReportAllCandidates = boolean(default=False) # nvdajp === modified file 'source/updateCheck.py' --- source/updateCheck.py 2012-12-10 00:21:55 +0000 +++ source/updateCheck.py 2013-04-04 09:03:23 +0000 @@ -30,7 +30,8 @@ import shellapi #: The URL to use for update checks. -CHECK_URL = "http://www.nvda-project.org/updateCheck" +#CHECK_URL = "http://www.nvda-project.org/updateCheck" +CHECK_URL = "http://localhost:8080/nvdajp/updateCheck.php" #: The time to wait between checks. CHECK_INTERVAL = 86400 # 1 day #: The time to wait before retrying a failed check. === modified file 'source/versionInfo.py' --- source/versionInfo.py 2013-03-05 07:56:06 +0000 +++ source/versionInfo.py 2013-04-04 09:34:31 +0000 @@ -32,7 +32,7 @@ longName=_("NonVisual Desktop Access") version="2013.1dev" publisher="unknown" -updateVersionType=None +updateVersionType="jpdev" try: from _buildVersion import version, publisher, updateVersionType except ImportError:
HTTP のクエリー例:
GET /nvdajp/updateCheck.php?language=ja_JP&autoCheck=False&x64=True&installed=False&version=bzr-jp2013.1-5992&versionType=jpdev&osVersion=6.2.9200+ HTTP/1.0" 200 126 "-" "Python-urllib/1.17"
ためしにPHPで書いたサーバーの例。レスポンスの最後に空行が入るとエラーになるので、あえて php ブロックの終了マークを省略しています。
<?php header('Content-type: text/plain'); echo "version: jpdev130404" . PHP_EOL; echo "launcherUrl: http://localhost:8080/nvdajp/download1.php http://localhost:8080/nvdajp/download2.php" . PHP_EOL;
header だけで body が空のときは「更新はありません」になります。
上記の2行(レコードは改行で区切る、属性名と値は ": " で区切る)が存在すると「NVDAバージョン jpdev130404 が利用可能です」というメッセージと「更新をダウンロード(D)」ボタンが表示されます。片方しかないとエラーになるようです。
launcherUrl はスペース区切りで exe ファイルを取得できるURLを並べます。
なお、ポータブル環境で実行すると、launcherUrl の先頭要素を os.startfile() で実行しているようです。
インストール環境の場合は launcherUrl の要素を先頭から順番に fetch して、失敗したら次の要素を fetch します。 ダウンロードに成功したら、取得したファイルを ShellExecute() API を使って "--install -m" オプションで実行します。
アップデートサーバーの仕様案:
ロジック:
2013年7月に www.nvda.jp を Amazon EC2 に移したので、アップデートサーバーの運用について再検討をしたいと思います。
2013.3jp から運用を開始して、2014.1jp をリリースしたときに自動通知されるようになる、というのがスケジュール案です。
日本語チーム内でテストのために配布するリリース候補、ベータ版、テスト版は自動通知の対象としない、または自動通知機能のテストのために使うことにして、運用を単純化したいと思います。
自動更新のテストをするだけのためのスナップショットを作りました。
特にテストを呼びかけるわけではありませんが、いちおう公開します。
https://dl.dropboxusercontent.com/u/62564469/nvda_jpupd130921a.exe
電子署名をしないでインストールしても不具合が少ない環境ということで、現在は Windows XP でしかテストしていません。
このバイナリをインストールして、ALT+Ctrl+N などで実行すると http://www.nvda.jp/updateCheck/ にアクセスします。
サーバー側はまだバージョン比較のロジックを実装していないので、常に jpnext130920 のバージョン番号とダウンロードURLを返します。
なお、過去に NVDA 日本語版がインストールされていた環境では、一般設定「更新の自動チェックとNVDAのアップデート」がオフになっているので、オンにする必要があります。
現時点では、アップデートが完了すると jpnext130920 になり、これは自動更新機能を無効にしてあるので、それ以上は自動更新されません。
本チケットで4月5日に書いたことに加えて、わかったことを書いておきます。
以上のことから、アップデートサーバーが稼働したら、sourceforge.jp にリダイレクトしてダウンロード数を数えてもらうことが(現状の実装では)できないので、アップデートサーバー自身でダウンロード数をカウントするのがよさそうです。
ソースファイルのブランチは下記です:
To ssh://git@bitbucket.org/nvdajp/nvdajp.git ca4e0b4..a76b9a7 ti28159 -> ti28159
簡単ですがバージョン比較ロジックを書いてみました。
現状は jpnext130920 以外のバージョンがきたら jpnext130920 のダウンロードを案内する処理になっています。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git a76b9a7..31bdada ti28159 -> ti28159
以下 curl で実験したログ:
> curl -i "http://www.nvda.jp/updateCheck/?language=ja_JP&autoCheck=False&x64=True&installed=False&version=jpnext130919&versionType=jpdev&osVersion=6.2.9200" HTTP/1.1 200 OK Date: Sun, 22 Sep 2013 03:54:24 GMT Server: Apache Content-Length: 102 Connection: close Content-Type: text/plain; charset=UTF-8 version: jpnext130920 launcherUrl: https://dl.dropboxusercontent.com/u/62564469/nvda_jpnext130920.exe
ユーザーが最新バージョンの場合:
> curl -i "http://www.nvda.jp/updateCheck/?language=ja_JP&autoCheck=False&x64=True&installed=False&version=jpnext130920&versionType=jpdev&osVersion=6.2.9200" HTTP/1.1 200 OK Date: Sun, 22 Sep 2013 03:54:38 GMT Server: Apache Content-Length: 0 Connection: close Content-Type: text/plain; charset=UTF-8
日本語テスト版 jpnext を自動更新の対象にしました。
現時点では以下の2つのバージョン
https://dl.dropboxusercontent.com/u/62564469/nvda_jpupd130921a.exe
https://dl.dropboxusercontent.com/u/62564469/nvda_jpnext130925.exe
から、バージョン jpnext130925a
https://dl.dropboxusercontent.com/u/62564469/nvda_jpnext130925a.exe
にアップデートされます。
現時点で Windows 8 で「ポータブル版」を c:\nvdajp に作り、アップデートすると以下が起きます:
本家のアップデートクライアントの実装で、一度アップデートをチェックすると、しばらく(おそらく24時間)次のチェックを行いません。
jpnext130925a には、ブランチ ti28159 に加えて、以下がマージされています:
updateCheck.py の独自拡張で使うかも知れない実験コードを書きました。
たぶん本家はこういう処理をサーバーサイドでやっていると思います。
import urllib2 import re from urlparse import urlparse def nvdajp_urlopen(url): while True: remote = urllib2.urlopen(url) ct = remote.headers["content-type"].lower() #print remote.code #print remote.geturl() #print ct if remote.code == 200 and ct in ( 'application/octet-stream', 'application/x-msdos-program', 'application/x-msdownload'): return remote elif ct == "text/html; charset=utf-8": o = urlparse(remote.geturl()) newUrl = None for line in remote: line = line.rstrip() mo = re.match(r'.*<meta http-equiv="refresh" content="1; url=([^"]+)">.*', line) if mo: newUrl = o[0] + '://' + o[1] + mo.group(1).replace('&', '&') break if not newUrl: raise RuntimeError("Download failed") url = newUrl else: raise RuntimeError("Download failed") url = "http://i.nvda.jp" remote = nvdajp_urlopen(url) print remote.geturl()
2013.3jp のファイル公開およびサーバー設定を終えたので、下記のテストを行いました。
Windows 7 32ビットをネットワークのない状態にして nvda_jpbeta131127.exe をクリーンインストール(ログオン画面での使用はなし)する。
ネットワークを有効にして NVDA を起動すると、「NVDAバージョン2013.3jpが利用可能です」が出る。
「更新をダウンロードしてアップデートする」を選ぶ。
ここで「寄付」を押すと日本語チームの寄付ページが開く。
続行すると 2013.3jp がダウンロードされる。サーバーのせいか環境のせいかわからないが、ダウンロードに約5分かかった。
ダウンロードが終わると「NVDAを更新中」(インストーラーの実行)になる。
ユーザーアカウント制御で「はい」を選んで先に進む。
1分くらいで更新が完了し、2013.3jp が起動して「ようこそ画面」が開く。
ログを見た限りでは特に異常はない。
上記、確認できたので、本チケットはクローズして、2013.3jp リリースに関する作業は完了とします。
今後の課題は、アップデートチェックのトラフィックの統計を取ることです。
本家 2012.2 では updateCheck 機能が追加されます。
クライアントの処理が updateCheck.py に実装されています。
ユーザー側の実行環境とバージョン情報を受け取って、最新版へのアップデートが可能かどうかを返答するサーバーの機能が www.nvda-project.org/updateCheck に実装されています。(動作しているかどうかは未確認です)
nvdajp を本家と独立に公開・配布するならば updateCheck を無効化するか、サーバーを日本独自に構築・運用することが望ましいです。
NVDAユーザ会広島 nvda.jp が運用してはという提案があります。