‘Analog Book Reader’のエントリ

Analog Book Readerを作ったときに一番最初に考えたのが,本を快適に読むためならPCを限界まで使ってしまえというものだった。具体的には,本を開いたら全ページをレンダリングしてメモリに持っておけば,高速にパラパラめくれるというもの。なんだけど,今のバージョンでは,数千ページの本を開くとメモリ不足になるので理想に合っていない。

この問題は最初のバージョンからずっと調べていたのだが,ようやく原因が分かった。Winrtのビルド時にCPUをAnyCPUでビルドしているからなのか。AnyCPUだと基本的に32bitアプリになるので,結局1GBくらいでOut of Memoryになる。ARM/x86/x64でバイナリを分けることで,物理メモリの限界まで使えるようになった。64bit OS限定だが,4000ページくらいの本でも開けて,ロードが終わればストレスなく4000ページをパラパラできる。画像のサイズと拡大率によるが,使用メモリは3GBくらい。

とりあえずここまでできた。縦書きとか禁則処理とか行末揃えとかカーニングとか考えないといけないことがたくさんある。なんだかTeXを自力で実装しているみたいになってきた。ていうかTeXってハイフネーション辞書持ってなかったっけ。どうやって実装しよう。

2014062801

何か急に「タイピング」というキーワードでアクセスしに来る人が増えた。と思って検索してみたら,Yahoo!で「タイピング」3番目だった。「物理シミュレータ」もいつの間にか2番目になっていた。ページランクが高くなったわけでもないのに何でだろう。「World Tester」はVectorの科学カテゴリトップだったり,紹介サイトからのリンク元からも結構アクセスがあって地味にページビューがある。

紹介するのが遅れたけど,タイピングサミットでも「Weather Typing」大会は今でも開かれていてとてもありがたい。

という感じで,新しく公開したソフトに注力している間も以前の作品は使われていて,メンテしたり機能追加したりしたいのだが,時間が足りない。何か面白いことを思いつけばやるかも,くらいになっている。

前に掲示板で「1ページ表示・2ページ表示の切替が欲しい」という要望があった。でちょっと前に解決策が思いついていたので実装してみた。「1ページずらす」メニューを作り,実行するとうまいことずらしてくれる。つまり,前のページを見ていって,タイトルまでいってしまったらタイトルが1ページ表示になるし,途中で横長のページがあればその次のページを独立させる。縦横混在の本で試してみたらまあまあうまくいったので,次のバージョンで入れる予定。


ついでに。このアプリの方針として,できるだけユーザには考えさせずに,自動的に最適な状態にしてあげるというのがある。ユーザが1ページずつ指定するとか,本ごとにあれこれ設定するとか,そういうのはやりたくない。設定画面をあえて用意してないのはそういう意味だったりもする。で,この要望をこの方針で再度考えた結果が「1ページずらす」メニュー。ちなみに機能はできるだけ少なくしたいので,「タイトルページあり/なし」機能は抹消する。「1ページずらす」があればいらないので。

会社で特許文献を読んでいてふと思ったんだけど,マルチモニタで本を読みたい。Analog Book Readerの最新版で画像をピン留めする機能を付けたんだけど,あれって,文書と図が別々のページにある,まさに特許文献みたいな本を想定している。でも,やっぱり紙に印刷して,綴じない状態で4ページくらい広げて読みたくなった。特許文献も,2台のPC使ってようやく読みやすくなった。ピン留め機能でもいいんだけどやっぱり画面が狭い。マルチモニタで4ページ表示,しかも2ページずつ別々の場所を表示できれば嬉しいのだが,Windows Storeで複数画面に大きく表示なんてできないし,どうにかできないかな。

Analog Book Reader公開から今日で3ヶ月が経過する。このアプリを公開するときに,ダウンロード数の目安を知りたくて検索したらYOMON8.NETさんの「Windowsストアアプリについて3ヵ月間のダウンロード数などを振り返ってみる」というページがあった。このページでは,「付箋タイル」というアプリの3ヶ月のダウンロード数とダウンロード数を確保する対策を書いてあってとても参考になった。てことで,私も3ヶ月のダウンロード状況を公開してみたい。次の誰かの参考になればってことで。

データ取得期間
2014/3/18~2014/6/14(89日間)
ストアカテゴリ
書籍 – 電子ブックリーダー
言語
日本語/英語
ダウンロード数
総ダウンロード数:2680
ページビュー:9077
コンバージョンレート:29%

2014061701

青が日本からのダウンロードで,オレンジが日本以外。公開一週間くらいで新着トップになり,急激にダウンロード数が上がった。書籍の人気トップ(無料)で3位くらいまでいって,一ヶ月くらいで落ち着いた。その後,緩やかにダウンロード数が落ちていって,現在は人気トップ(無料)で10位,カテゴリ全体で50~60位くらいか。

ただ,それは日本のマーケットだけで,日本以外ではまだまだ。そこで,リリース4でストアに載るアイコンを少しきれいにして,紹介文の英語をシンプルにした。その結果かどうか,だんだん日本以外のダウンロードが上がってきているっていう状況。アメリカを始めとしていくつかの国でコメントや星をもらっているのでそれなりに使ってくれている人もいるのかな?

全体的には付箋タイルと似た感じか。コンバージョンレートは29%でも高いと感じていたが,付箋タイルは36%となっているのでこれでも低いのかな? まあWindows 8.1にしか対応してないので,そんなものといえばそんなものかも。

ところで「Average App usage per day」って,単位は何なんだろう。200~400分とか出るんだけど,平均値にしては多すぎるし…。

土日でEPUBの実装を少し進めた。EPUB自体はzipなのでzipライブラリで読み込める。中身のメタファイルを解析して,XHTMLはXMLライブラリで読める。と思ったら,XHTMLは要素の中にテキストと要素が混在しているため,winrtのElementsではうまく読み込めない。Elements.Valueでは混在した要素のテキストだけが抽出されてしまう。結局DescendantNodesで細かいノードを一つ一つ解析するようにした。

CSSは既に解析する処理を実装済み。オートマトンに要素階層を与えるとスタイルが返ってくるイメージ。多分遅いので改善することになるだろうけど。

あとは画像系はそのまま読み込めるとして,SVGはどうしよう。winrtでは標準で読めないので,WebViewを経由するか,NuGetでライブラリ探してくるか。

動画やJavaScriptはサポートしないとして,そんなものかな。

あとはXAML to HTML Conversion Demoが参考になりそう。標準のXMLパーサーじゃなくてHTMLパーサーを自作しているけど,おそらくXHTMLじゃないからかな。EPUB3.0だけを考えるならXHTMLだけなので,そこまでやらなくてもいいだろう。


なんかEPUBサポートまであと半年くらいかかりそう。winrtでWebKitが使えれば楽なんだろうけど。EPUB以外の改善もあるので,ある程度のところでそっちを先にリリースするかな。今考えているのは以下。

  • パスワードPDF
  • キーボードでの拡大縮小
  • キーボードでのコーナースクロール
  • 「タイトルページの独立」メニューを「見開きを1ページずらす」メニューに変更
  • 関連づけで開いたときに,右開き,左開きを,前回開いた本に合わせる

他にもこの日記にタグとかコメントとか付けられるようにしたいとかいろいろあって,時間が足りなさすぎる。

たまにPowerPointの資料をPDFにしてAnalog Book Readerでプレゼンすることがある。まあ拡大縮小とペン機能を使うだけなので普通のPowerPointでもいいんだけど。で1つバグを発見したのだが、2ページの本の場合、拡大縮小しても解像度が調整されない。この原因は結構深くて、欲しいイベントが欲しいタイミングでやってこないのが根本原因で、そのせいで、起動時に最後のページを開いた場合に解像度調整ができなくなるというのが二次原因。対策案はまだないが、2ページの本はあまりないから急がなくても大丈夫かな。

追加機能とバグフィックスが一段落したので,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用の修正は完了。ページ見開きについては,とりあえず偶数奇数で見開きを読み込んで,確定した時点で更新するようにした。んだけど今回のバージョンはかなりいろいろ変えたのでテストに時間がかかりそう。

新しい機能は実装完了。範囲選択。自分は欲しいと思うけど,他の人が欲しいかは謎。とりあえずあとは保留していた見開き改善をやったら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で読んでいるが,小説だと単純に次のページにいくだけなのでこれだけだと思っていた。

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

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

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

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

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

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に変えたってことですね。とりあえずこれだけでもだいぶ改善されて,ロード中にパラパラめくる分にはそんなに待たないようになった。

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

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