AndroidのPDF対応電子書籍リーダーアプリレビュー

はじめに

PDFの技術書をAndroidタブレットで快適に読みたい。
フロー型の電子書籍であれば、スマートフォンでもそれなりに読みやすくできますが、PDFだとそうもいきません。6インチのスマホでページ全体を表示すると小さくて読めたものではありませんし、読める大きさまで拡大するとページの極一部しか表示範囲に入ってきません。10インチ以上であれば100%表示で問題無く読める大きさになりますが、普段の持ち運びの容易さを考えると8インチタブレットで可能な限り拡大して表示したい。

そういう視点で、以下のAndroid用のPDF対応電子書籍リーダーアプリをレビューしてみました。

電子書籍リーダーアプリに求める条件

電子書籍リーダーアプリに求める条件は以下の通りです。

  • PDFを読める
  • ページの拡大率と表示位置がページを送っても維持される
  • 目次、ブックマーク、検索といった基本機能が使いやすい
  • 背景色をセピアに変更できる

PDFを読める

今回のレビューの大前提です。

目次、ブックマーク、検索といった基本機能が使いやすい

おまけ機能程度にしかPDF対応していないリーダーアプリだと、そもそもこれらの機能がPDFで使えなかったりするので。

ページの拡大率と表示位置がページを送っても維持される

PDFを読むためのアプリとして重視するのはこの点です。

あくまでも筆者にとってはですが、8インチはPDFを読むには微妙な大きさで、ページ全体をそのまま表示すると少し文字が小さく感じられます。ページ外側の余白が表示されないところまで拡大すれば文字が程良い大きさになります。この読みやすい拡大率と表示位置をページ送りしても維持してくれないと、毎ページやるのは大変です。

背景色をセピアの変更できる

これは単純に好みの問題です。

レビュー

Acrobat Reader

Acrobat Readerは電子書籍リーダーアプリとはちょっと違いますが、PDFの本家ということで対象に加えています。

ページの拡大率と表示位置がページを送っても維持されるか

連続ページモードで表示することで何とか実現できます。

Acrobat Reader にはいくつかの表示モードがあります。

  • 単一ページ: 別のページに移ると拡大率がリセットされる
  • リーダー: レイアウトがかなり変わる。プログラムがちゃんと読めなくなるのでダメ
  • 連続ページ: 拡大率を維持したまま縦スクロールできる。ただし、縦スクロール中に横方向にずれがち
リーダーモード。微妙に残念な感じに表示が崩れる
拡大率100%の表示。8インチにとっては上下左右の余白がもったいない
上下がぎりぎり収まるところまで拡大。ちょっとの違いだが読みやすさが格段にアップ
連続ページモードでスクロール中に横方向に表示がずれたところ。横方向を固定できないのはストレス

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 折り畳まれた階層表示。項目をタップでページジャンプ。使いやすい
  • ブックマーク: ページ番号のみ表示。表示内容を変更することはできる
  • 検索: 検索結果の一覧表示無し。本文中のヒット箇所がハイライトされるので1個ずつ送っていく
目次
ブックマーク一覧
検索

背景色をセピアにできるか

  • できない

ReadEra

ページの拡大率と表示位置がページを送っても維持されるか

以下の設定にすることで、画面いっぱいにテキストを表示して縦スクロールで読めます。横方向にはスクロールしないのでほぼストレスフリーです。
ページ送り: 縦方向
ページ余白: オフ

ページ余白あり
ページ余白無し。横方向は固定で上下にスクロールするのみなので快適

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 小項目まで隠さずに全部表示する方式。わかりやすいが、大きく移動したいときなどは面倒
  • ブックマーク: ページ番号とブックマーク名。表示内容を編集できる
  • 検索: ヒットした箇所がハイライトされて一覧表示される。検索履歴も残る。とても使いやすい
目次。小項目を折りたたんだりはできない
ブックマーク一覧
検索結果の一覧表示

背景色をセピアにできるか

  • できる

SideBooks

ページの拡大率と表示位置がページを送っても維持されるか

SideBooks では「余白設定」という機能でページの表示範囲を設定することができるので、これを利用します。

上下左右の余白を削って表示する範囲を指定できる

余白無しの表示をした状態で、縦スクロールではなくページをめくるように横方向にページ送りできます。少し残念なのは、ページ送りのアニメーション(めくり、またはスライド)をオフにできないため、ページ送りのテンポが少し悪いことです。

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 小項目が折り畳まれて表示される方式。見やすい
  • ブックマーク: ページ名と冒頭の文章が一覧表示される
  • 検索: ページ数とキーワード前後の文章が表示される
目次
ブックマーク一覧
検索結果の一覧表示

背景色をセピアにできるか

  • できない(アプリケーションとしての背景色は変更できるが、PDF表示部分の色を変更できない)

Xodo

ページの拡大率と表示位置がページを送っても維持されるか

表示モードの選択で、単一ページ、垂直方向のスクロールをオンにすることで、拡大率を維持したま縦スクロールできます。Acrobat Reader と違って、縦スクロール中は横方向にスクロールしないようになってるので、ストレス無くページを送れます。さらに、縦スクロール中でなければ普通に横スクロールもできるといううまいUIになっています。

表示モードとして、単一ページ・垂直方向のスクロールを選択

また、Xodo にはページのトリミングという機能があり、ページの表示部分を指定できます(自動認識させるモードもあります)。ページのトリミングを適用した状態で縦スクロールをオフにすると、拡大率を維持したまま横方向にページ送りすることもできます。個人的には縦スクロールよりもアニメーション無しの横方向のページ送りの方が好きなので、この状態はかなり使い勝手が良いと感じました。

ページのトリミング

目次、ブックマーク、検索といった基本機能が使いやすいか

  • 目次: 小項目が折り畳まれて表示される方式
  • ブックマーク: ページ番号のみ表示。表示内容を変更することはできる
  • 検索: 検索結果の一覧表示無し。本文中のヒット箇所がハイライトされるので1個ずつ送っていく
目次
ブックマーク一覧
検索

背景色をセピアにできるか

  • できる

まとめ

最初に挙げた条件を満たして最も使いやすいと感じたのは Xodo のページトリミング+横方向ページ送りでした。次点が SideBooks の余白設定+横方向ページ送りとReadEraの拡大率固定+縦スクロールでした。

どのアプリも、目次・ブックマーク・検索といった基本的な機能はきちんと抑えられていて、これらの使い勝手に大きな差はありませんでした。

同じ電子書籍リーダーというくくりの中でも作り手によってアプリの個性は違ってくるもので、自分の重視する機能に焦点を当ててアプリの使い勝手を比べるのはとても面白い体験でした。

大阪でスペシャルティコーヒーが飲めるおすすめカフェ3選

コーヒーを愛してやまない私が、大阪で美味しいスペシャルティコーヒーが飲めるカフェを紹介します。

タイミング悪いと混んで入れないかもしれませんが、もし、行ったことないがなら、是非一度立ち寄ってみて欲しいカフェです!

①ブルックリン ロースティング カンパニー北浜

最初にご紹介するカフェは「ブルックリン ロースティング カンパニー北浜」です。大阪メトロ「淀屋橋駅」または「北浜駅」から徒歩5分ぐらいのところにあります。

MAP: https://goo.gl/maps/Xmp7q7L7HT2y4tTL6


こちらは川沿いにあり、テラス席はとても開放的。
クッキーを求めてかスズメもたまによってきたり、時折通る水上バスのお客さんが手を振ってきたりします。

お花屋さんも併設されてオーガニックな感じです。

②タカムラワイン&コーヒーロースターズ

続いて紹介するのは、「タカムラワイン&コーヒーロースターズ」。
大阪メトロ「肥後橋」から徒歩10分ぐらいのところにあります。

MAP: https://goo.gl/maps/3KDpDQXvMyVDTGqj6

私がフルーティなコーヒーを初めて飲んだお店です。
こちらは、様々なスペシャルティコーヒーからお好きな豆を選んで飲むことができます。
中にはカップオブエクセレンスで上位に選ばれたコーヒーも。

客席もアンティークな感じです。

2階にも広い空間が広がっており、テーブル席でゆったりできます。

お店の名前の通りワインの種類も豊富です。

③Unir(ウニール)

最後に紹介するのは「Unir(ウニール)」です。
阪急百貨店の9階にあります。

MAP:https://goo.gl/maps/hExnSgvcoz1tPgKB8

美味しいスペシャルティコーヒーが飲めるのは当然なのですが、他ではなかなか飲めないアレンンジコーヒーがあります。

その一つで、私の一番のオススメが「シェカラート」です。
が…しかし…コロナの影響で、紙、プラスチックカップで提供できるもの以外は販売を中止しているようです。
コーヒーの香りが弾ける体験が衝撃的だったので、復活したら一度飲んでいただきたいです。

本日いただいたのはコーヒートニック。
エスプレッソをトニックウォーターで割った、夏にピッタリの爽やかなコーヒーです。

いかがでしょうか?今回は大阪にあるオススメのカフェを3つ紹介しました。
是非、参考にしてみてください。

頭痛との付き合い

昔から頭痛がひどく、鎮痛剤を手放せない生活をしています。
症状が重い時は嘔吐したり、目玉をえぐり出して交換できたらいいのにって思ったり、壁に頭をゴンゴンぶつけて気を紛らわせたりといったホラーな感じになったりします。

市販の鎮痛剤でやり過ごしていたんですが、先日脳神経外科へ行ってみたところレントゲンとMRI検査の結果

「体に異常はありません、健康です。おそらく片頭痛と思われます。」

との診断結果でした。

そして片頭痛用の薬を処方していただいたのですが、その際アドバイスをいただきました。
・痛くなってからだと効かなくなるので、我慢せず本格的に痛くなる前に飲むように

これは本当に大事な事で、痛みが強くなってからだと強い薬を使っても効果がでにくくなるそうです。

処方していただいたお薬

・ロキソプロフェンNa錠
 普通の鎮痛剤で、市販のロキソニンと同じ
 他の2種類よりは弱めの薬で普段用

・リザトリプタンOD錠「ファイザー」
 片頭痛治療薬で、強い薬なので乱用はダメ
 ラムネみたいで水がなくても飲めるしマズくもない
 ロキソプロフェンNa錠との併用は可
 ひと月で処方される数に制限がある

・イミグラン点鼻液
 片頭痛治療薬で、強い薬なので乱用はダメ
 鼻から吸うタイプで、見た目やばそうに見える
 口に流れると恐ろしく苦い。本当に苦い
 吸収されるのが早く、他よりも即効性があるらしい
 ロキソプロフェンNa錠との併用は可
 ひと月で処方される数に制限がある

最後に
・頭痛は脳神経外科へ
 MRI検査費用は高いのでお財布に余裕を持っていく
・体が健康でも頭痛は起こる
・片頭痛という診断を受けるだけでも気持ちは少し楽になる
・頭痛は我慢せず、痛みが強くなる前に薬を飲む
・専用の薬はやはりよく効く
・薬は用法・容量を守り正しく使用する
 

Solrのパッケージ管理機能がクラスタレベルのプラグインに対応しました

はじめに

以前の記事で紹介したパッケージ管理機能ではコレクションレベルのプラグインを管理できました。Solr 8.6 でクラスタレベルのプラグインにも対応しました。クラスタレベルのプラグインとは、クラスタを構成するノード毎に1個だけインスタンスを作るプラグインです。

リファレンスの説明だけでは分かりにくいところもあったので、使い方をまとめてみました。

リポジトリ登録まで

リポジトリを作成して Solr に登録 → インストール →デプロイという流れは同じなので、リポジトリ作成の詳細は前回の記事を参照してください。

プラグインのコード

プラグインが提供する API のエンドポイントに関する情報をアノテーションで記述するところがミソです。path の指定の中で $path-prefix という変数が参照されていますが、これは後述のリポジトリ定義(repository.json)で定義されます。

リポジトリ定義

クラスタレベルをサポートするにあたって type フィールドが追加されたようです。指定しない場合は collection になるので、クラスタレベルの場合は type: cluster を指定しなければうまくデプロイできません。

コレクションレベルのときと大きく異なるのは setup-command と uninstall-command です。それぞれ、以下の API リクエストに対応しています。

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "add": {
  "name":"myplugin",
  "class": "myplugin:jp.co.splout.solr.plugins.MyPlugin",
  "path-prefix" : "splout",
  "version": "1.0.0"
  }
}' http://localhost:8983/api/cluster/plugin

curl -X POST -H 'Content-type:application/json' --data-binary '
{
  "remove": "myplugin"
}' http://localhost:8983/api/cluster/plugin

verify-command をどう定義すべきかよく分からなかったので省略してありますが、これでも動くようです。

リポジトリ登録

$ bin/solr package add-repo MyPlugin http://localhost/solr/repo1
$ bin/solr package list-available 
Available packages:
-----
myplugin 		Cluster Level Plugin Example
	Version: 1.0.0
	Version: 1.1.0

インストール

-cluster オプションを指定します。

$ bin/solr package install myplugin:1.0.0 -cluster
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":56}}
myplugin installed.
$ bin/solr package install myplugin:1.1.0 -cluster
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":5}}
myplugin installed.

$ bin/solr package list-installed
Installed packages:
-----
{
  "name":"myplugin",
  "version":"1.0.0"}
{
  "name":"myplugin",
  "version":"1.1.0"}

デプロイ

ここでも -cluster オプションを指定します。

$ bin/solr package deploy myplugin:1.0.0 -cluster
Executing {"add":{"name":"myplugin","class":"myplugin:jp.co.splout.solr.plugins.MyPlugin","path-prefix":"splout","version":"1.0.0"}} for path:/api/cluster/plugin
Execute this command. (If you choose no, you can manually deploy/undeploy this plugin later) (y/n): 
y
1 cluster level plugins setup.
Deployed on [] and verified package: myplugin, version: 1.0.0
Deployment successful

clusterprops.json

クラスタレベルでデプロイされたプラグインの情報は、ZooKeeper に置かれた clusterprops.json から読み出せます。

$ curl http://localhost:8983/api/cluster/zk/data/clusterprops.json
{"plugin":{"myplugin":{
      "name":"myplugin",
      "class":"myplugin:jp.co.splout.solr.plugins.MyPlugin",
      "version":"1.0.0",
      "path-prefix":"splout"}}}

プラグインのAPI呼び出し

ソースコードでエンドポイントのパスを “/$path-prefix/myplugin” と定義しました。repository.json で path-prefix を “splout” と定義したので、このプラグインの API は以下のように呼び出せます。

$ curl http://localhost:8983/api/splout/myplugin
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "myplugin.version":"1.0.0"}

アップデート

–update -cluster オプションを指定して deploy を実行します。

$ bin/solr package deploy myplugin:1.1.0 --update -cluster
Updating this plugin: org.apache.solr.client.solrj.request.beans.PluginMeta@aa370c48
Posting {"update": {
  "name":"myplugin",
  "class":"myplugin:jp.co.splout.solr.plugins.MyPlugin",
  "version":"1.1.0",
  "path-prefix":"splout"}} to /api/cluster/plugin
1 cluster level plugins updated.
Deployed on [] and verified package: myplugin, version: 1.1.0
Deployment successful

動作確認します。

$ curl http://localhost:8983/api/splout/myplugin
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "myplugin.version":"1.1.0"}

「AirPods Pro」と「M3IETW2」を買った結果

Web会議や夜中近くのゲームで煩くならないようにBluetoohのイヤホンを購入しました。その過程で単純にBluetoohに対応ってだけ見ると失敗してしまうとわかったのでこちらにまとめました。

無線イヤホン

長くなるので最初に結論

  • Bluetoohはイヤホンである受信側と音を出す側の送信側のコーデックが一致していないと使えない
  • コーデックにはSBC < AAC < AptX < AptxLLなど他にも色々(音質はAptX > AptXLL)
  • PCやゲーム機など自前で送信する部分を持っていない場合はBlutoohのオーディオトランスミッターが必要

最初に購入したのはアクティブノイズキャンセリング目当てで「AirPods Pro」
対応コーデックはAAC

実際使ってみると設定なども簡単でアクティブノイズキャンセリングも評判通り世界が変わるレベルで音が聞こえない。ただゲームだとワンテンポずれて音が聞こえるので微妙、音ゲーは無理。他に家の中とかだとPCの動作音とかは小さくはあるが聞こえるので完全というわけではない(それでもほとんどは聞こえないレベル)
iPhoneの音楽再生だけとかリモートワークぐらいであれば設定も簡単なのでオススメ

次は対応コーデックや音質も気にして「MOMENTUM True Wireless 2」
対応コーデックはAptX

設定はAirPods Proに比べるとトランスミッターも原因ではあるが面倒・・・ただ一回設定したらあとはつけるだけなのであまり変わらない。音質はよく音ズレについては少し気になる程度でそこまで問題はないがゲーム目当てだとAptXLL対応の方を買えばよかったかも

数ヶ月立った結果

個人的にはノイズキャンセラー目当てでSonyの「WF-1000XM3」とAptXLL対応のイヤホンを別々で買った方が良かったかと後悔しましたが・・・数ヶ月経過した今振り返ってみると圧倒的に使ってる機会が少ない!
外:ドラクエウォークをいつもつけてるので不要
内でゲーム:夜中近くにゲームをすること自体がなくなったので不要
たまにWeb会議で使うぐらい・・・
完全にお荷物になっているわけではないが結果的にもっと安めのやつでも問題なかったかも