Kindle Paperwhite マンガモデルは電子読書ガチ勢にはそこそこおすすめ
プライムデーで、キャンペーン情報なしモデルが10,980円になってたのを買ってしまったので感想。不満も多いが、すでにメインの読書端末になってしまっている。
じゃあおすすめなのかと言うと、せいぜいガチ勢にはそこそこおすすめ、くらいかなあと。一般人や、ましてや初心者にはおすすめできない。そういう人はまずKindle Fireとかから手を出した方が腐らせにくいと思う。
自分はもう何年も電子書籍メインで読書してて、ばらつきはあるけど概ね年に漫画500冊~、文字だけの本50冊~くらい読む感じ。9インチ級のタブレットと、5インチ級のスマホで読んでいた。
Kindle Paperwhite マンガモデルがもたらした読書体験
まずとにかくサイズがちょうどよかった。文庫本サイズで、その気になればじっさいの文庫本と同じくらいの文字数を表示することもできる。漫画を読む場合も、文庫の漫画本くらいのイメージ。
かつ、このサイズでありながらスマホなどよりは見やすい。紙と比べるとさすがにつらいが。
最後が、読書(ほぼ)専用の端末なので読書に専念できるってあたり。スマホだとどうしても本以外のものを開いちゃうし。
ということでこれという決め手があるわけではないんだよね。
Kindle Paperwhiteの欠点
これがもうたくさんあって……。
- ハードウェア起因のもの。
- ソフトウェア起因のもの。
- ページ遷移時に全画面反転する。まあこれはわかっていたことだし、むしろ文字だけの本だと反転しない場合が多くて、予想よりはよかった。
- 特に漫画で、残像がかなり残って気になる場合がある。
- ダウンロード直後にもどこまで読んでいるかのパーセント表示が出るため、読み終わった本と、再読のためにダウンロードした本の区別がつかない。
- 位置No.での移動時、左下に表示していないと現在の位置No.がわからない。
- スリープ周りの設定ができない。10分経ったらスリープするデフォルトの挙動か、隠しコマンドによる、自動でスリープせず手動スリープも無効になる(!)挙動かの二択だが、どちらもつらい。指定した時間が経ったらバックライトだけオフにするという設定が欲しかった。
それでもメインに使う理由
自分にとってサイズや視認性がちょうどよく、読書専用というところも合っていて、かつモノクロなところや、各種欠点は一応許容範囲内だったから、というところか。
だから最初に書いたように一般人や初心者にはおすすめできないし、ガチ勢でも、各種欠点のうち一つでも許容できない人にはつらそう。
ただまあ、読書を捗らせることに全力をかける人には、一応選択肢としてありじゃないかなあと。もっともお金ある人はOasis買った方がいいかも。
フェアじゃないので、細かい美点も
- 高速ページめくりは確かに便利。ただこれ、アプリでも実装できるよね。
- 脚注をその場でプレビューできるのも便利。ただこれも略。
- サンプルを読んでる途中に購入すると、読んでる位置をそのままで読み続けられる。これもアプリではできなかったはず。
- 電池がそこそこ持つ。1日2、3時間、機内モードオフで、バックライトの明るさは主に中くらいで読んで、満充電からバッテリー警告出るまで1週間持った。
次買うなら
- 反転・残像などを許容範囲に調整して、
- 持ちやすくなって、
- スリープの設定くらいできるようになったら、
買い替えてもいいかも。この辺がどうにもならないようなら、故障しても7インチタブレットとか選んじゃいそう。
結論
なんかだいぶけなしてる感じになっちゃったけど、ごちゃごちゃ言いつつも完全にメインの読書端末になっちゃってるので、そういうことです。
Linuxbrewでgccが入っている状況で、外側にあるライブラリを使ってビルドしたかった
Linuxbrewを使っててちょっとはまることがあった。
- Linuxbrewが入っていて、Linuxbrewでgccその他ビルド関連ツールが入っている。
- Linuxbrew関係のパスが通っており、
gcc
などはLinuxbrew以下のものが使われる。 - Linuxbrewの外、
/usr/local/lib
にライブラリがある。 - 3のライブラリを使ってプログラムをビルドしたい。
具体的にはcmigemoを使って、migemoを有効にしてVimをビルドしようとした。
まず普通にやるとLinuxbrewのgcc(というかld)が、cmigemoを見つけてくれなかったようで、以下のようなエラーが出た。
/home/linuxbrew/.linuxbrew/bin/ld: cannot find -lmigemo
これは当たり前っちゃ当たり前。Linuxbrewのgcc
は同じくLinuxbrew内のld
使ってて、そっちにはcmigemoは登録されてなかったので。
ということでとりあえずLinuxbrewのld
からcmigemoというか、/usr/local/lib
内のライブラリを使えるようにしようとした。Linuxbrew内のld.so.conf
に/usr/local/lib
のパスを追加した上でldconfig
. これでldconfig -p
などすると、cmigemo
(というかlibmigemo.so
)が見えるようになった。
だがこれでもビルドできなかった。
未だに原因はよくわかってないんだけど、試行錯誤の上、最終的には以下のように対応して、とりあえずビルドできた。
- cmigemoを手動でLinuxbrew以下に入れた。
./configure --prefix=/home/linuxbrew/.linuxbrew/Cellar/cmigemo/0
みたいな感じ。 brew link cmigemo
でシンボリック・リンク作った。
ただこれは、Linuxbrew下に手動で突っ込むというのがイケてないのであまりやらない方がよさそう。もうちょっとマシな方法としては、
- そもそもcmigemoやVim用のFormula書いちゃって、ぜんぶLinuxbrew任せにできるようにする。
- そこまではしなくても、
brew diy
くらいは使っといた方がいいかも。ここの記事が参考になる。- https://qiita.com/z80oolong/items/dd3b8e5024c36df9b35b#brew-diy-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
- ただ、この記事の著者自身が言ってるように、やっぱりFormula書けるなら書いた方がいいかと。
- Linuxbrewのパスは使わないときは通さずにしておいて、無関係のものはシステムのgccでビルドする。
- これするとLinuxbrewの意味があまりない気がするのがネック。
なおそもそも元ネタのHomebrewは、/usr/local
下にぜんぶ突っ込むっぽく、そのせいで問題になってないのではないかと思うんだけど、ではなんでLinuxbrewはそうしないのだろう。その辺がまずわかってない。
とりあえずLinuxbrewいろいろ難しい。日本語での情報少ないのもつらい。
日記
案件Aが終わって、案件Bが中断して、みたいな感じで絶賛無職中。仕方ないので久々にお仕事探ししてる。
こんなところで募集しても意味ないと思うけど一応募集しとくと、フルリモートでやってる自営プログラマです。Perl, PHPがちょっとできます。別に言語にこだわりないし環境にこだわりないしやることにこだわりないので、合法的な仕事なら条件面で折り合えばなんでもやります。お仕事ください。
それはいいとして。
やることはあるけど暇っちゃ暇なんで、働き方の見直しなんかもしてて。去年後半くらいからかな? に、やれるだけやるみたいな働き方から、週の労働時間を20時間に固定する形に変更してみたんだけど、それでもまだ長いなあとか思うこともあって。
で、最近読んだ「シリコンバレー式 よい休息」って本の影響なんかもあって働き方をまたちょっと変えてみようと思った。この本タイトルはアレだけど割といい本なんで、みんな読もう。
新しい働き方は、午前と夕方に1時間半~2時間くらいを1回ずつ、あと午後に軽めの、主にメール対応など事務処理や、勉強に使う時間を1時間の、計4~5時間を1日に。
それを週4日くらい働く感じでどうかなー、とか。
いい感じだったら今度もっと詳しくブログに書くかも。
Linuxbrewに日本語のロケールを入れる
tmuxはデフォルトではUnicodeの曖昧な文字幅に対応していないので、パッチを入れるかあきらめるかで対処しなければならなかったのだが、最近はLinuxbrewというMacのHomebrew互換のパッケージマネージャ用にパッチ済みのtmuxの設定(Formula)を用意してくれている人がいるようだ。
最高なのでそれを使わせてもらおうとLinuxbrewを入れるところから始めたら、ロケール周りではまった。
tmuxは変なロケールで起動しようとすると、フォールバックなどせず以下のようなメッセージを出して落ちる。
tmux: invalid LC_ALL, LC_CTYPE or LANG
Linuxbrewで、こちらのFormulaを使ってtmuxを入れると、なぜかこの問題が起きる。試しにlocaleを実行して確認してみると、以下のような警告が出た。
locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=ja_JP.UTF-8 LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_PAPER="ja_JP.UTF-8" LC_NAME="ja_JP.UTF-8" LC_ADDRESS="ja_JP.UTF-8" LC_TELEPHONE="ja_JP.UTF-8" LC_MEASUREMENT="ja_JP.UTF-8" LC_IDENTIFICATION="ja_JP.UTF-8" LC_ALL=
結論から言うと、システムではja_JP.UTF-8が存在するが、Linuxbrewで入ったglibc周りでは存在しないということだった。
Linuxbrewでは、glibcが入るときにロケールを無視するらしい。詳しくはわからないのだが、どうもLinuxbrewは環境変数をフィルタリングするらしい。
以下のようにして、glibcインストール後のlocaledefなどの処理を再実行すると必要なロケールが入る。
HOMEBREW_NO_ENV_FILTERING=1 brew postinstall glibc
なおこの機能にはちょっとしたバグがあり、環境変数から雑にcharmap, localeの名前を取得しているため、ja_JP.utf8のような設定になっていると上記のコマンドがエラーになる。
この場合は、ロケールを再設定する。あるいは以下のようにlocaledefを手動で実行してもいいかもしれない。
localedef -i ja_JP -f UTF-8 ja_JP.utf8
ちなみに入れたパッチ済みtmuxはこちら。便利。あとLinuxbrewもバグったところ以外は便利な感じなので今後もいろいろ使ってみたい。
Test::DifferencesでUTF-8文字列をエスケープせずに出力する方法
ドキュメントに書いてある、 Text::Diff
の設定をどうこうする方法では駄目だったのでいろいろ調べた感じ、以下のようにすれば行けた。
use strict; use warnings; use utf8; use Data::Dumper; { package Data::Dumper; our $Useperl = 1; no warnings 'redefine'; sub qquote { shift; } } use Term::Encoding qw(term_encoding); use Test::More; { my $builder = Test::More->builder; my $term_encoding = term_encoding; binmode $builder->output, ":encoding($term_encoding)"; binmode $builder->failure_output, ":encoding($term_encoding)"; binmode $builder->todo_output, ":encoding($term_encoding)"; } use Text::Diff::Config; $Text::Diff::Config::Output_Unicode = 1; use Test::Differences; eq_or_diff 'あいうえお', 'かきくけこ'; done_testing;
Data::Dumperがまず問題
Test::Differences
では内部的に Data::Dumper
を使用しており、そこで確実にエスケープされてしまうので、まずはその対処をしなければならない。
これはまともな方法ではどうにもならないので、以下のページを参考に qquote()
をハックする方法で対処した。
Data::DumperでUTF-8フラグつき文字列をエスケープさせないようにするには - ku
Test::Moreの出力をなんとかしないと、 Wide character in print...
が出ます
これはいつものアレ。最近 Test::More
も中身が Test2
になったりしてるみたいでよくわからないが、まだこのやり方でとりあえず通用した。
Test::Moreでマルチバイト文字列を出力する可能性がある場合。 - 遠い叫び
Text::Diffの設定をなんとかする
$Text::Diff::Config::Output_Unicode
を真にするだけ。なおこの設定、table_diff
以外では不要なので、 unified_diff
とかを使う場合はなくてもよい。
Test::Differences使わない方がいいんじゃないか説
あまりちゃんとメンテされてない感じだし、使わなくて済むならそうした方がいいかも。今は似たようなのでもっといいのあるんじゃない?
use_okがprove -lで実行すると通るのにperl -Ilibで実行すると通らなかった話
use Test::More; use_ok 'Foo::Bar'; done_testing;
みたいなテストを実行するとき、まあ普通は prove -l
する。1アサートごとの結果を見たい場合も prove -lv
とかでいいんだけど、このときは忘れてて perl -Ilib
で実行した。
上のようなテストだと通るんだけど、今回下のようなテストになってて通らなかった。
use File::Basename qw(dirname); use Test::More; chdir dirname __FILE__; use_ok 'Foo::Bar'; done_testing;
こうして最低限のコードにするとわかりやすいんだけど、 'lib'
の指し示す先が変わってしまうので通らないわけだ。
ただそうなると、なぜ prove -l
では通るのか?
軽く App::Prove
を読んでみると、 'lib'
を絶対パスにして処理していたのでそのせいで chdir
の影響を受けなかったっぽい。
(当然 lib/Foo/Bar.pm
は存在し、かつ use
できる前提)
今日はたまたまそれほど解決にそれほど時間かからなかったからいいけど、勘でデバッグするのって駄目だよなあ。バグ見つけたらとにかく二分探索しつつ問題の最小化していかないと。そういう癖つけないと。
ansible-lintのルールに関するメモ
ansible-lintを使ってみているのだが、ルールの一部がよくわからなかったりしたので調べて簡単にまとめてみた。
- ANSIBLE0002: Trailing whitespace
- ANSIBLE0004: Git checkouts must contain explicit version
- ANSIBLE0005: Mercurial checkouts must contain explicit revision
- ANSIBLE0006: Using command rather than module
- ANSIBLE0007: Using command rather than an argument to e.g. file
- ANSIBLE0008: Deprecated sudo
- ANSIBLE0009: Octal file permissions must contain leading zero
- ANSIBLE0010: Package installs should not use latest
- ANSIBLE0011: All tasks should be named
- ANSIBLE0012: Commands should not change things if nothing needs doing
- ANSIBLE0013: Use shell only when shell functionality is required
- ANSIBLE0014: Environment variables don't work as part of command
- ANSIBLE0015: Using bare variables is deprecated
- ANSIBLE0016: Tasks that run when changed should likely be handlers
- ANSIBLE0017: become_user requires become to work as expected
- ANSIBLE0018: Deprecated always_run
ANSIBLE0002: Trailing whitespace
これはほんとそのまんま。いずれかの行の末尾に空白があれば警告が出る。
ANSIBLE0004: Git checkouts must contain explicit version
git
モジュールでversion
を指定しなかったり、HEAD
に指定したりすると警告が出る。
ANSIBLE0005: Mercurial checkouts must contain explicit revision
ANSIBLE0004のhg
版。revision
を指定しなかったり、default
に指定したりすると警告が出る。
ANSIBLE0006: Using command rather than module
git
, curl
, service
その他、Ansibleモジュールが使えるところでcommand
, shell
を直接叩いてると警告が出る。
ANSIBLE0007: Using command rather than an argument to e.g. file
chmod
, mkdir
, rm
その他、file
モジュールの引数でできることでcommand
, shell
を直接叩いていると警告が出る。
ANSIBLE0008: Deprecated sudo
become
, become_user
でなくsudo
, sudo_user
を使っていると警告が出る。
ANSIBLE0009: Octal file permissions must contain leading zero
file
モジュールなどでmode
の指定時に0666
のような表記ではなく666
のような表記をしていると警告が出る。
ANSIBLE0010: Package installs should not use latest
ANSIBLE0004のパッケージ管理システム版。state
にlatest
を指定していると警告が出る。ANSIBLE0004などでは未指定の場合も警告が出るが、yum
などのstate
はデフォルトがlatest
ではなくpresent
なので、未指定の場合は警告が出ない。
ANSIBLE0011: All tasks should be named
すべてのタスクにname
をつけろというルール。そこは問題ないのだがこのルールバグってて、yum
のように引数にname
があるものだと、偽陰性になってしまう……。
ANSIBLE0012: Commands should not change things if nothing needs doing
command
, shell
などがwhen
, creates
などで条件つき実行になっていない場合警告される。
ANSIBLE0013: Use shell only when shell functionality is required
パイプやリダイレクトなどを使うわけでもないのにshell
を使ってると警告される。
ANSIBLE0014: Environment variables don't work as part of command
command
, shell
のコマンド内でPATH+=XXX command
みたいなのはできないよ、という警告だと思うのだが自信がない……。
ANSIBLE0015: Using bare variables is deprecated
{{ var }}
形式じゃない生の変数を使った場合に警告される。この「生の変数」を俺はそもそも知らなかったんだが、以下みたいな感じらしい。
--- - tasks: - name: example for "Using bare variables is deprecated" rule yum: name: item with_items: items
ANSIBLE0016: Tasks that run when changed should likely be handlers
when: result.changed
みたいなことやるなら普通にhandlers
使えば変更あった場合のタスク実行できるからそうしよう、みたいなルール。
ANSIBLE0017: become_user requires become to work as expected
become
なしでbecome_user
してると警告される。
ANSIBLE0018: Deprecated always_run
always_run
を使っていると警告される。check_mode
が代替とのこと。