追加機能とバグフィックスが一段落したので,ePub対応の開発を再開。とはいえ,ePub対応するとどのくらいの電子書籍をカバーできるんだろう。Kindleとか有償サービスのクライアントを作れればいいんだけどそれはできないわけで。

本来は,電子書籍サービスと電子書籍リーダーは分離されているべきだろう。つまり,有償の電子書籍サービスがあってそれぞれ別々に魅力的なコンテンツを売っていて,でも電子書籍リーダーはユーザが自由に選べるという世界。現状は,電子書籍サービス毎に専用のリーダーがあって,この本はこのサービスで買えるからこのリーダを使う,別の本は別のサービスでしか買えないから別のリーダーを使う,ってことになる。サービスを使う側にとっては,本ごとに使い勝手が違うんでイライラする。サービスを作る側にとっても,魅力的な本を売りたいだけなのに不慣れなアプリ開発をしなければならないのでめんどくさいはず。

著作権があるので完全に自由にはできない前提で。似たような話として,地デジの視聴ソフトは,良くも悪くもB-CASがあるので,コンテンツ(番組)とアプリ(視聴ソフト)が分かれている。なので見たい番組を気に入ったソフトで見られる。これと同じような仕組みがあればいいのか,またはもうそんなやり方は古くて,コンテンツは月額料金だけで配ってしまって,ダウンロード数に応じて著作者に還元する方式がいいのか,いずれにしても根本から変えていく必要があるだろう。

Analog Book Readerは,それをふまえて,フリーソフト作者にできることって何かないかなあ,みたいなことを考えつつ作っているわけです。

Analog Book Reader Ver1.2.1でRARファイル対応した。その中で,NuGetからSharpCompressというライブラリを使った。これはC#で作られたオープンソースのアーカイバライブラリ。RAR/7Zip/Zip/Tar/GZip/BZip2に対応しててなかなか素晴らしいライブラリ。標準のPDFライブラリと近い使い方ができるので割とすぐに取り込むことができた。あと1行足すと7zにも対応できるのだが,今の使い方だとページ表示に時間がかかるようだったので入れていない。RARファイルはPDFより少し遅く感じるが,十分実用範囲。

さて,SharpCompressはシーケンシャルアクセスのReader系APIと,ランダムアクセスのArchive系APIを持っている。Analog Book Readerは開いたページを優先的に開くので,ランダムアクセスAPIを使った。しかし,RarArchive.Openはまだパスワードに対応していないようで,RARのパスワード対応はまだ先になるだろう。GitHubの最新のソースでは対応しているっぽいけどwinrt用のブランチはまだっぽかった。

パスワード付きPDFは,次のバージョンでサポート予定。パスワード付きZipはどうしようかな。winrt標準のZipArchiveはパスワード対応していないけど,SharpCompressのZipArchiveはパスワード対応している。でもいろいろ考えるとできるだけ標準クラスを使ってた方がいいだろうな。

Analog Book Reader Ver1.2.1審査合格。日曜日なのにMSの人対応してるんですね。ということで,未サポートの本が複数登録されている場合に起動エラーになる件を修正。次のストア更新のタイミングで公開されるはず。

今回は条件が限られていて,さらにコメントでバグ報告をしてもらえて助かった。何も反応がないと,私も発見できなくて,最悪誰も起動できないまま忘れさられていってしまうわけで。Windows Storeコメントでも掲示板でもメールでもTwitterでも,バグ報告は歓迎です。


ついでにRARファイル対応もリリースした。実はパスワードPDF対応したりキーボードでの拡大縮小とかも既に対応してるんだけど,まだあんまりテストできてないのでこれは次バージョン。

掲示板にも書いたけど,Ver1.2でいろいろテストして,起動時のエラーの原因ぽいものは分かった。ここには技術的な話を書く。

原因は,Ver1.2で追加したエラーログ。ファイルが開けない場合などはデバッグログを出すようにしていたが,Ver1.2ではRelease版のときだけファイル出力するように変更した。しかし,大量のエラーログが出た場合に排他制御がうまくいかず,UnauthorizedAccessExceptionエラー(Access Denied)が出るようになっていた。起動時にパスワードPDFなどがたくさん登録されているとエラーになりやすくなる。

await FileIO.AppendTextAsync(logFile, message);

awaitがついているので単純にlockかけることはできない。なので,メッセージをキューに入れて,タスクから一定時間毎にキューの内容を出力するのが正攻法か。とりあえず今回はエラーログは封印して出さないように修正しておく。

アメリカはこれから週末なので,今からストアに申請しても,公開されるのは日本時間の来週の火曜日以降だろう。


ただ,すでにSharpCompressというライブラリを取り込んでrar対応してしまったので,バグFixと一緒にrar対応も入ってしまう予定。

とりあえず職場の人にLenovoとSurfaceRTのテストを頼んでみた。それで何もなければWindows Dev Centerにダンプが出るのを期待して待つか。で,他のマシンで試していて気付いたけど,ホイール無しマウスだと拡大縮小できなくて使えないですね。キーボードでできるようにするか拡大ボタンが必要か。

そしてよさそうなrarライブラリがあるっぽいので週末試してみよう。

Windowsストア提出後,40分で公開された。早すぎる。ということでAnalog Book Reader Ver1.2公開。変更点はこのページの後ろに書いておいた。

で,今回本棚の画像をキャッシュして,本を追加して一回表示した後は一瞬で表示できるように変えたのだが,コメントで落ちるようになったという方がいますね。自分のところでは数百個追加したり追加中に削除してを繰り返すテストをして大丈夫だったのだが,ハードウェアによるのだろうか。100個でも数MB~数十MBの消費なのでメモリやディスク不足ではないと思うし。

Windows Storeのコメントに返信する機能があればいいんだけど,現状追加情報をもらう手段すら存在しない。自分で自分のアプリにレビューすればいいのかな。とりあえず他にこういう症状が出る方がいたら教えて欲しいです。できればどのPCを使っているかも一緒に。

Analog Book Reader Ver1.2をWindows Storeに提出。うまくいけば今週中にストアに並ぶはず。アイコンとかストアの説明文なんかも改善したので,日本以外のダウンロード数も増えてくれるといいなあ。

Analog Book Reader Ver 1.2完成。あとはスクリーンショットとか作りながら,しばらく使ってみて問題なければMicrosoftに送ろう。

Analog Book Readerテスト中だが,順調にバグを見つけてるので来週中くらいには公開できるか?

日本のWindowsストアでは,書籍カテゴリの無料トップ6~7くらいで安定しているが,実際はダウンロード数はだいぶ下がっている。日本のWindows 8.1ユーザでPDFを見たい人だとこれ以上は難しいのかな。海外ダウンロードを増やしたいんだけど,まずはストアのスクリーンショットとかで目立つようにするのがいいのかなあ。

2chのSurfaceスレでAnalog Book Readerの名前が出ていたので反応してみる。Analog Book Readerは,大々的には言ってないけど漫画ビューアとしても使える。あまり売りとして言ってないのは以下の理由。

  • 漫画ビューアには漫画ビューア独特の要求がたくさんあって,その辺に対応していない。rar対応もそうだし,各種補正とか,本気で対応するなら最低限そういう要求に応えないと漫画対応は名乗れない
  • Analog Book Readerはどちらかというとページ数が多くて1ページ読むのに時間がかかる本であるほど良さが分かるアプリだと思っているので,漫画を読んでも多分そんなに嬉しくない

ただ,Windows Storeには漫画を読むのによいアプリがあまりないという話っぽいので,漫画的な機能を付けていくのもアリかなあ,とは思う。要求をリサーチするために,次のバージョンで漫画とかコミックを試しにキーワードに入れてみるかなぁ。

ていうかアイデアリストが既に20を超えていて,いくらやっても追いつかないのが正直なところ。Analog Book Readerの強みを考えるとe-pubの方が優先度高いだろうし。

そういえば誤解を生みそうな表現だったので補足。次バージョンで選択機能をサポートするっていっても文字を選択する機能はまだサポートできないので,あくまで画像として選択できるというもの。選択してどうするかというと・・・リリースしてから書こう。

Analog Book Reader 1.2用の修正は完了。ページ見開きについては,とりあえず偶数奇数で見開きを読み込んで,確定した時点で更新するようにした。んだけど今回のバージョンはかなりいろいろ変えたのでテストに時間がかかりそう。

Googleでルービックキューブが遊べるようになっていたので1時間遊んでみた。キューブの回し方がすごく難しいのと解き方を忘れていたので大変だったが,195回の10:42でクリア。10年くらい前に解き方を覚えたときは4分くらいで揃えていた記憶がある。その後,物理シミュレータ作ったときにルービックキューブをPC上で操作するのを作ろうとしたが,とてもじゃないけど操作しづらそうなので諦めた。Googleの力を持ってしてもこのくらいのUIが限界か。パワーグローブとGoogleグラスが欲しい。

新しい機能は実装完了。範囲選択。自分は欲しいと思うけど,他の人が欲しいかは謎。とりあえずあとは保留していた見開き改善をやったらVersion 1.2かな。やっぱり自宅にいると作業がはかどる。本を読む時間が減って本末転倒という説もあるけど。。。

ページ見開きが難しい。のでとりあえず新しい機能を入れたりしている。四隅にスクロールするボタンとか,謎の選択機能とか,本が見つからない場合は本棚画面でダイアログを出すようにしたり。使い勝手を評価してもらうために試し公開してみたいけど,MS審査がいるからどうしても気軽に公開できない。

次バージョンに向けてとりあえず軽い修正をいくつかした。

  • スナップ表示でUIが崩れる問題の修正
  • ヘルプ画面でページ移動ができる問題の修正
  • デスクトップからのPDF/Zip関連づけ起動
  • 本サムネイルのデザインを変えて,ページ数を表示できるようにする
  • 本を選択したらメニューが自動的に出るようにする
  • Deleteキーで本を削除できるようにする
  • 右開きの場合,ブックマークは右側に置くようにする

あとはファイルがないときの処理と見開きの処理ができたら一旦公開かな。

しばらく開発してなかったので思い出すために軽くライブタイル対応してみた。ワイドと大の2種類のライブタイル対応をしたかったのだが,検索しても複数のサイズに対応させるやり方を書いたものがなく,最終的にQuickstart: Sending a tile updateを参考にした。テンプレートを2つ作って,最初のテンプレートの「visual」にもう一つのテンプレートの「binding」を追加すればOK。

ライブタイル対応で各本のサムネイルをキャッシュするようにしたので,本棚表示する時のサムネイル表示を速くしてみた。一応たくさん本があっても快適にはなった。

いろいろ使っていて,バグを発見。Analog Book Readerでファイルを開いて,一旦デスクトップを表示してからもう一度開くと,カーソルキーがきかなくなる。デバッガを使っていると再現しないので今まで気付かなかった。OnNavigatedToでWindow.Current.CoreWindow.KeyDownイベントを登録してOnNavigatedFromで解除しているのだが,デスクトップを表示するとOnNavigatedToなしでOnNavigatedFromが呼ばれるので,KeyDownイベントが解除されてしまっていた。NavigationModeを見て,本棚に戻るときだけ解除するようにして解決した。

先週ぱじさんにアメリカのナイスお土産を持って行ったときに,Kindleを使った漫画の読み方を見せてもらった。そういう使い勝手なのか。コメントでもらった,次のページへのスクロールが欲しいって言っていた意味がようやく分かった。Kindleは一度に見えるのが1/4くらいとすると,次のページに進むと,見えていない部分にスクロールするのか。Analog Book Readerではどうしようかな。

Kindle自体はZom-Bを買ってAndroidで読んでいるが,小説だと単純に次のページにいくだけなのでこれだけだと思っていた。

ようやくいつもの環境に戻ってきた。3週間長かった。開発再開。

アメリカから帰国。これでやっと開発に戻れる,なんだけどゴールデンウィークで実家へ帰るので,もうしばらくSurfaceのまま。来週からはちゃんとした開発環境に戻れるはず。

カナダからアメリカへ移動して週末。現地在住の日本人に案内してもらいつつシリコンバレーへ。といってもGoogleとかFacebookとかの本社をただ見ても、ってことでコンピュータ歴史博物館(Computer History Museum)へ行ってもらった。ここはちょっと前にMS-DOSのソースコードをWebで公開してて知ったのだが、実際の博物館だったんですね。

博物館の中はかなり広いが、20の区画にいろんな展示があり、プログラマは飽きない。お昼ご飯も含めて6時間くらいいたような。最初は計算尺、タイガー計算機、そろばんなどから始まり、パンチカード、ENIAC、UNIVAC、EDSAC、DECのVAX、Cray-1など聞いたことはあるけど実物は見たことがない実機の展示、IBM 1401で実際にパンチカードを入力してプリンタに出力するところのデモ、Apple-IやDeepBlue、虫が入ってバグの元ネタとなったコンピュータ、ロボットやゲーム展示コーナーとか、ギークグッズのお土産コーナーとか盛りだくさんだった。

2014041901

少しずつWindowsストアのコメントが増えていっている。評価がばらけているところもなかなか面白い。既存の電子書籍リーダーの常識的なところを割と無視しているので、ぴったり使い方が当てはまればいい評価になるし、当てはまらなければ何コレ?的な感じだと思う。掲示板にも書いたが、ダメなところを言ってもらえると参考になるので、そういう意見は歓迎。

今日ついたコメントだと、見開きでスキャンした本を縦置きで表示したときに、画面タップすると2ページ進んでしまうので使いづらいというもの。なるほど確かに。自分の環境は横置きメインで気づきにくいので、参考になった。他にも、ペン色は操作を複雑にしたくないのであえて黄色一色にしていたのだが、変えられるようにしたいというのが2票目なので、需要がありそうとか。

Analog Book Reader要望集を作ったので、進捗が知りたい方は見てください。

新しいバージョンがWindowsストアに登録された。ファイル読み込み中にページ移動しても一瞬でページが表示されるようにして、サムネイルも現在ページに近い順に読み込むようにしたので、体感的にはだいぶ改善されているはず。あとファイルを大量に登録しているときに、サムネイルを読み込んでから表示していたのを、表示してから少しずつ読み込むようにした。これで起動時に遅いのも改善される。

後は、どのページが見開きなのかという情報と、サムネイルそのものをキャッシュするようにすればかなり快適になると思うが、それはまた今度。

今日から出張で、とりあえずカナダに到着。

Surface Pro 2があるので、十分開発も可能。

MSから回答。なんか障害だったらしくて今は大丈夫とのこと。見てみると,アプリケーションクラッシュのようだ。レポートには,いくつかの情報ファイルが含まれていて,一番重要なのがdmpファイル。このファイルをVisual StudioかDebugging Tools for Windowsで開いて,クラッシュの原因を調べる。今までのWindowsアプリだと,アプリケーションのpdbがあればどこで落ちたかがすぐに分かったのだが,winrtではなかなか難しい。言語レイヤーがいくつかあって,async/awaitでスレッド実行シーケンスが複雑になり,何重にも例外がラッピングされている。

普通に解析するのはかなり大変なので,Defrag ToolsのOneDriveで配っているPDEというツールを使うと,「!pde.dse」コマンド一発でコアな部分のスタックトレースまで表示してくれる。で,今回の場合,それでもユーザコードのココ,っていうのは出てこなくて,winrtの中で落ちてたりするので100%これが原因ってのは分からない。

とりあえず何かのボタンを押し終わったときに落ちていたのが分かったので,全てのボタンの動作をテストした。結果,ボタンの二重押しとかロード中にボタンを押したりしたときに落ちることが分かったので対策した。

Windows Storeから新しいバージョンがリジェクトされた。のはいいのだが,詳細を見ると

Overall result: in progress
Report generated at 1/1/0001 12:00 AM UTC

となってそのまま半日くらい変わらなかった。ので,サポートの認証ステータスのリンクから質問してみた。

Analog Book ReaderのWindows Storeのコメントで,「統計画面にスペルミスがある」というのと「遅くて使えない」というのをもらった。

遅いというのは他の人からも指摘されていて,改めてチューニングを考えてみた。今までは,ファイルロード中,最初から読み込んでいくのと平行して,画面に表示しようとしたページを優先で表示するようにしていた。それはいいのだが,ページをパラパラやっていると,読み込み待ちのページが増えていって,結局表示されるのがずいぶん後になってしまっていた。なので,今表示しようとしたページを最優先で表示するようにしてみた。専門用語で言うとFIFOからLIFOに変えたってことですね。とりあえずこれだけでもだいぶ改善されて,ロード中にパラパラめくる分にはそんなに待たないようになった。

あとは見開きの決定をもっと早くできればよいのだが,見開き計算結果をキャッシュするしかないだろうな。ここは慎重にやらないとバグりそうなのでもう少し後で。

ストアに提出したので,まもなくダウンロードできるようになるはず。

CSSのセレクタを実装中。結構ルールが複雑なのでオートマトン化を検討中。でもHTML内にある全ての要素をCSSの数十のルールと全てマッチングをとるというのはなかなかヘビーな気がする。ブラウザの実装ってどうやってるんだろう。

ある環境で,どうやってもWindowsストアにつながらないなあ,と思って調べてみたら,ローカルプロキシのせいだった。その環境では,いろいろあってローカルPCにWebプロキシをたててそれ経由でWebにアクセスしているのだが,Windowsストアはローカルプロキシ経由では見られないようになっているらしい。となりのPCにプロキシたてることで解決したけど,なんのためなんでしょうね。

Windows 8.1 Updateがでたよ,と聞いたので早速アップデート。いきなりタスクバーにストアアプリが表示されて違和感が。Analog Book Readerはとりあえず問題ないが,アイコンがなんかちっちゃい。

2014040301

で,今後はスタートメニューが付いてストアアプリをウィンドウで動かせるようになるという話ですか。スタートメニューはもう使うことないからいらないんですが。ストアアプリをウィンドウで動かせるのは多分やると思ってたし期待していたので嬉しい。これでデスクトップアプリに移植しなくてよくなる。