虎之助の徒然記

Googleフォームを使って、はてなブログで投票集計

 最近のお騒がせな人たちの人気投票をちょっとやってみたいと思い立って、前回の記事を投稿しました。この記事では、Googleフォームを使って投票を集計しています。今回は、前回の記事を事例にGoogleフォームでの投票集計について紹介したいと思います。

1. ブログに使える投票ツール

1.1 投票ツールのまとめ記事

 アンケート・投票に使えるツールのまとめ記事がありました。

 こちらの記事は、比較的最近のもので、こちらを中心にチェックしました。

 SurveyMonkey, Questant, CreativeSurvey, GoogleDrive(Googleフォーム)が挙げられ、比較表がでています。

1.2 投票ツールの種類

投票ツールは大きく分けて、次の2つになると思います。

  • Webサーバを管理向けツールを用いる。
     自分でサーバを管理できて、PHPなどを自由に使える場合に使えるツール。
  • 外部サービスを用いる。
    • 商用サービス
    • 無料サービス

この中で、はてなブログの場合、外部サービスを用いる必要があります。無料サービスでアカウント作成不要のものをと考えていましたが、どの投票サービスも投票内容の編集などがあるので、基本的にアカウントが必要のようです。考えてみれば、そうですね。

 新規アカウントが作成不要ということで、今回はGoogleフォームを使って投票箱を作成しました。

2. Googleフォームによる投票フォームの作成

2.1 Googleフォームとは?

 Googleフォームは、Google Appsの一つで、アンケートや問い合わせなどに使える回答収集サービスです。

特徴としては、

  • 回答結果は、Googleスプレッドシートに記録されます。
  • (スプレッドシートの機能で)ユーザーからの回答があったときに、メールを作成者に通知できます。
  • 回答に対する確認メールを簡単に送信できます。
  • 質問で画像とコメントを併記できます。
  • (Googleへのログインなしでは)重複回答を禁止できません。
  • 問い合わせやアンケート集計、人気投票などに使えます。
     このブログの「お問い合わせ」リンクもGoogleフォームを使って作成しています。

 重複回答を禁止できないというのは、人気投票に使う場合は痛いところですね。

2.2 使い方

 使い方は、以下のブログを見れば、ほとんどのことはできると思います。

 実際に、投票を使った記事を書きました。

 この記事をはてなブログに埋め込む際に苦労した点は、以下の通り。

  • チェックボックスの文が短文でないと、回答のページが見にくくなります。このため、画像を入れて、その下に説明を加えたかったのですが、出来ませんでした。
  • ブログに埋め込む際に、横幅が足りず、フレームに埋め込まない場合では、1行に2つのアイテムが入ったのですが、フレームに入れると、1行に1つのアイテムになってしまいました。やたらと縦長になってしまいます。
  • 縦長になってしまったので、幅を小さくして、その横に説明を加えました。
  • scrolling="no"のオプションを加えることで、スクロールバーを消すことができました。
 <iframe src="https://~自動生成されたURL~" scrolling="no" width="400" height="2300" (以降はそのまま)>読み込んでいます...</iframe>
  • 幅・高さの調整が面倒です。特に、スクロールバーを消した場合、高さの調整が面倒。
  • スマホだと配置が崩れるので、フレームに埋め込まないページで表示する必要があります。このとき、フレームの横に書いておいた説明が、無くなります。

2.3 チェックボックスの説明文を長文にした場合

 チェックボックスを長文にした場合のサンプルを、記事の最後に加えました。先のブログの投票・回答と比べて見てください。こちらの方が、ページの作成は楽ですが、投票結果のページが美しくありませんでした。

3. 他のツールも使ってみた

 この記事の執筆に当たって、二つばかり、アンケート・投票ツールを使ってみました。

3.1 Creative Survey

投票のサンプルです。


フレームを使わない場合は、こちら

  • 重複投票の禁止などが可能で、質問の分岐、デザインもいろいろでき、詳細なアンケートやテスト作成などにも使えそうです。
  • 商用で使うのには向いていると思いますが、個人ブログのライトユーザーにはちょっとヘビーです。
  • 画像とコメントを同時に表示することはできませんでした。
  • また、投票結果を公開することができません。

3.2 アンケートクレール

http://enq-maker.com/

投票のサンプルです。

f:id:toranosuke_blog:20161219122526p:plain

フレームを使わない場合は、こちら

  • テキストベースで簡単に作成できるアンケート集計・投票ツールです。
  • 基本的に個人向けのツール。
  • ユーザアカウントを作るというよりは、アンケート毎に電子メールアドレス、パスワードをつけるという管理をしています。
  • 操作に悩むことはなく、サクッと作ってしまうのには便利です。
  • IPアドレスによる二重回答防止、集計結果の公開などができます。
  • ホームページのお知らせにこんな案内があります。
2013/11/19
14日よりサーバーがダウンしておりました。経理上の不手際で、ホスティング会社へのサーバー料金の入金がされていなかったためです。ご利用者の皆様に大変なご迷惑をおかけしたこと、深くお詫びいたします。今後このようなことがないよう注意いたします。誠に申し訳ございませんでした。

 サービスの継続性は大いに不安があります。

(追記) 2016/12/19現在、サーバからの応答がありません。アンケートクレールの投票サンプルはサンプル画像に置き換えました。

4. まとめ

 はてなブログでのGoogleフォームを用いた投票集計について、実例を交えながら紹介しました。

 いろいろツールはあるようなのですが、個人ブログということやサービス運営会社の継続性・信頼性などを考えると、Googleフォームが一番お手軽で良さそうです。いくつも不便に感じるところはありますが、重複回答禁止機能を除けば、必要最小限の機能はあるのではないかと思います。投票やアンケートのある記事を書くことはあまりないと思いますが...。

 ブログという点では、連絡先として電子メールアドレスを公開するのは嫌なので、連絡手段として問い合わせ先フォームを作るのには向いているのではないかと思います。このブログの連絡先もGoogleフォームを使って作っています。

(2016/10/23)

関連記事

付録 チェックボックスの説明文を長文にした場合の例

投票結果はこちらから
スマホからの投票はこちらから(1行に2アイテムで表示されます)

 

【投票】危ない奴ら!こんな人が大統領や指導者だったら嫌だなぁ

 最近、ちょっと問題ありげな大統領・大統領候補、皇太子が話題になっていますね。話題の方々への投票箱を作ってみました。是非、投票してみてください。

投票結果はこちら

スマホからの投票はこちらから



















マイブームだった粛清は飽きたので、最近は核開発ゲームに熱中。お願いだから、核ミサイル撃たないで~。







過激な麻薬撲滅政策をヒトラーに例えて正当化。オバマ大統領への侮辱発言など話題に事欠きません。習近平さんの前でガム噛んでちゃ駄目だよ。







今が旬。メキシコ国境やら核武装解禁など自由奔放な発言でコアな支持者が大勢います。猥褻スキャンダルも物ともせず進撃中。大統領選が終わるとただの煩いスケベおやじに戻るでしょう。








まだまだ、知名度は低いですが、大穴です。王室パーティーで3番目の奥さんを裸で躍らせちゃったとか。女性用タンクトップと、ズリパンも、派手な入れ墨にマッチしています。









比較相手が強すぎて存在感がありません。残念ながら、過去の人です。









英国王室の若きホープ。浮名を馳せて、裸写真もとられちゃったけど、まだまだ他の候補には水を開けられています。

 はてなブログで投票ボックスが作れるとは思いませんでしたが、Googleフォームで、一応、できました。

(2016/10/23)

関連記事

自炊して本棚を捨てる (3) 実践編

 今回の記事では、実際に自炊により大量の書籍を電子化する際に、気がついたことをまとめます. 大量に処理をしていくと、いろいろとコツが分かってきたり、問題がでてきますね。

1. 本を裁断する

1.1 挟んであるものを取り除く

 基本的なことですが、栞や栞紐は取り除いておかないといけません。パラパラと何回も捲って確実にとります。取り除きそびれるのが、レシートだったりします。レシートをとっておく習慣があるためか、意外と多いので、裁断後に裁断面側からもパラパラ捲りをして確実にとります。

f:id:toranosuke_blog:20160529000437j:plain:w300
ぱらぱらと捲る
f:id:toranosuke_blog:20160529000850j:plain:w300
栞紐も取り除く

1.2 裁断の位置決め

 購入した裁断機DURODEX/200DX*1には、カットラインを示すライトがついています。このカットラインを使って、裁断位置を決め、ガイドを設定しますが、横から覗いてみないと、どこが切れるのかわかりにくいので、位置決めは、軽く刃で本の上に跡をつけて、調整することが多いです。一冊ごとに調整するのは面倒なので、いまは文庫本サイズの本だけを電子化しています。幸い文庫本は製本が均一で、一冊ごとに微調整する必要はありませんので、次々に裁断できました。

f:id:toranosuke_blog:20160529001922j:plain:w300
カットラインライトでの位置決めは結構難しい。

1.3 切り込む深さ

 背表紙の糊が余裕を持って切り捨てておかないと、スキャンの際に重送したり、詰まって大変です。かと言って、深く切り込みすぎると、今度は文字が切れてしまいます。

 文庫本の場合、背表紙側の7mm前後の深さ裁断すれば、ほとんど糊の部分が入り込むことはありませんでした(糊が残ってしまったのは、200-300冊の文庫本をスキャンした段階でわずか1冊)。大手の出版社であれば、ほとんど同じように製本されていて、本の大きさもあまりばらついていないことが大きいのかと思います。裁断機のガイドを変更せず切断しています。

 これに対して、単行本は、サイズもいろいろでなので、文庫本に比べるとずっと面倒です。表紙や裏表紙に深く糊付けしてあることが多いですが、これは注意していれば手で剥がすなり、ハサミで切り直すなどすればよいのですが、困るのは、50ページおきぐらいに深く糊を入れている製本。スキャン中に重送して気がつくので、そういう製本の場合には、見つけ出して、ハサミで別途切り離しています。

f:id:toranosuke_blog:20160529002741j:plain:w300
切り取った部分を裁断面を左側、背表紙を右側にして並べてみる。
大手出版社のサイズは揃っている。

 

1.4 裁断機の切れ味

 やはり裁断機は、切れ味がよい刃で、綺麗に切れるのに越したことはありません。当初、古い別の裁断機を使っていたのですが、どうも刃がなまっていたようで、購入した新品の裁断機とはまるで違います。どこがどう違うかというと、新しい刃では軽く切れるということもありますが、もっとも問題なのは、古い刃では、本を垂直に切ることができずに、斜めに切ってしまうことが多くなることです。

 例えば、図1は裁断した面を横からみたところですが、斜めにずれてしまうと、図2のように深くきりこんでしまいます。運が悪いと、文字領域にまで食い込んで、1冊だめにしてしまいます。

 また、古い裁断機を使っていたときには、本の幅方向のずれも大きくて、スキャンした画像が少し斜めになってしまうことが多々ありました。新しい裁断機を使うようになってから、スキャン画像が斜めになることも少なくなくなっています。

f:id:toranosuke_blog:20160529004335j:plain:w200
切り込みがずれる
f:id:toranosuke_blog:20160529004418j:plain:w200
もう少しで裁断が深いと文字が切れる

2. スキャンする

2.1 排紙トレイで紙詰まり多発

 キャノンのスキャナDR-C240*2固有の問題だと思いますが、排紙のトレイで頻繁に紙が詰まります。原稿の長さの調整のため、紙受け用のストッパが可動式になっており、その段差で紙が引っかかります。当初は、最初の一枚だけ手で押さえて紙詰まりしないようにしていましたが、面倒になったので、テープで塞ぐことにしました。これで紙詰まりは激減しました。

f:id:toranosuke_blog:20160803133535j:plain:w200
紙詰まり
f:id:toranosuke_blog:20160803133539j:plain:w200
段差部分をテープで塞ぐ

2.2 重送検知はほぼ完璧、でも重送すると悲惨

 キャノンのDR-C240を使っていますが、重送はほぼ完璧に検知します。いまのところ、検知漏れはなかったのではないかと思います。でも、重送しないというわけではなく、重送します。重送の原因は、次の2つでしょうか。

  • (単純に)2枚の原稿が重なって紙送りされる。
  • 糊などにより2枚につながっている原稿を紙送りしている。

 単純に2枚の原稿が紙送りされることはほどんどありません(極まれにある)が、糊などで繋がったりしていて、裁断が悪いと、頻繁に重送します。このパターンの重送は、原稿がくちゃくちゃになって、運が悪いと切れてしまいます。ただ、原稿がくちゃくちゃになっても、その皺がスキャン画像で目立って残るようなことはないのが、救いです。

 一回、重送が生じると、原稿を入れなおしたり、ページの初期値を変更したりするなど、かなり時間のロスになります。

2.4 ローラーの交換時期

 500冊ぐらいスキャンしたあたりから、急に給紙の不具合が多くなりました。、マニュアル*3に従って、メインのローラーを湿った布でゴシゴシとお掃除。はじめは、富士通のクリーナ*4とキムワイプ*5で丁寧に掃除していたのですが、良くならないので、マニュアルを読んでみたら(汗)、水を含ませた布で掃除するということなので、ゴシゴシやっています。

 最近(約650冊をスキャン)では10-20冊に一回はメンテナンスを入れないと、ローラーが空回りして、給紙できないような状態になってしまいました。よくよくみると、ローラーの溝が薄くなっています。1冊300ページとして、650 books * 300 pages/book = 195,000 pages。交換目安は20万枚とあるので*6、ちょうど、そろそろ交換時期でしょうかね。交換ローラーキットは、アマゾン価格*7で8,072円(8/3現在)、高い。もう少し延命させよう...(目の粗いヤスリでごりごり削れば、溝ができるような気がするのだけど、そのうちやってみるつもり。カッターでは弾性がありすぎてダメだったので、やはりダメかも。)。

(追記) 1本目のローラは700冊ぐらいまで使って、2本目を購入しました。2本目は300冊ぐらいで不具合が発生しだしました。埃を被った本をスキャンすることが多かったからでしょうかね。

f:id:toranosuke_blog:20160529012223p:plain:w300
ローラーのクリーニング。
f:id:toranosuke_blog:20160529005817j:plain:w300
内側の左3本、右2本の接触面の溝がなくなり始めている。

2.5 ページ番号の変更

 重送などが発生して、ページ番号の初期値の変更すると、もとに戻すのを忘れて、次のスキャンで番号がずれてしまうということがまま発生します。こんなときには、awkコマンドを使って、番号の振替を行っています。書いたら長くなってしまったので、記事の最後で説明します。

3. スキャンデータの後処理

3.1 スキャンした 画像をチェックする。

 CapturePerfectの表示スピードが高速なので、これを使って2ページ単位に表示して原稿チェックしています。原稿チェックといっても、1秒あたり数回クリックして(6-8pages/secぐらい?)のスピードでチェックしているので、ジャムったときのページなどをチェックしているだけです。ページの抜けなどは、原稿のページ数とスキャン数の一致で確認しています。

3.2 zipファイル化する。

 何冊かスキャンしたところで、前回紹介したpage2book.cshを使ってまとめてzipファイルします。

3.3 ジャンル分けして保存する。

 次に、zip化したファイルをジャンル分けして、保存します。たくさんの本があると、これもかなり面倒なので、スクリプトで実行するようにしました。現在は、オリジナル画像を2箇所、圧縮ファイルを1箇所(google drive)に保存しています。

4. おわりに

 現在、1000冊程度電子化しましたが、実際に大量に電子化すると、裁断とローラーの耐久性が重要という印象です。本棚で2-3台分ぐらいは電子化しているはずですが、次から次へと本がでてきて、本棚を捨てる状況にないです。タイトルにある「本棚を捨てる!」という宣言は、当面実行できそうにありません(涙)。

(2016/8/3)

関連記事

ROOM

楽天ROOMに自炊関連の商品をまとめています(随時更新)。

Appendix: awkを使った連番ファイル名の変更

 ここでは、awkコマンドを使って、連番のファイル名を変更する方法について説明します。

例えば、

page_005.jpg
page_006.jpg
page_007.jpg
   :

page_001.jpg
page_002.jpg
page_003.jpg
   :

に変更する場合には、

ls -1 page_*.jpg | awk 'BEGIN{n=1;}{printf("mv -i %s page_%03d.jpg\n",$1,n);n++;}'

とすると、

mv -i page_005.jpg page_001.jpg
mv -i page_006.jpg page_002.jpg
mv -i page_007.jpg page_003.jpg
   :

となります。これをシェルで実行することで、ファイル名の変更を行っています。

ls -1 page_*.jpg | awk 'BEGIN{n=1;}{printf("mv -i %s page_%03d.jpg\n",$1,n);n++;}' | csh

ファイル番号を減じる場合にはこれでいいのですが、増加させる場合、例えば、

mv -i page_005.jpg page_006.jpg
mv -i page_006.jpg page_007.jpg
mv -i page_007.jpg page_008.jpg

では、最初のmvが既にあるpage_006.jpgを上書きしようとするので、確認のメッセージがでます("-i"オプションをつけないと、上書きされて、悲惨なことになります)。このような場合は、sortコマンドを使って、処理の順番を逆順にします。

ls -1 page_*.jpg | awk 'BEGIN{n=6;}{printf("mv -i %s page_%03d.jpg\n",$1,n);n++;}' | sort -r | csh

タイプ量が多いのですが、別途スクリプトを書くほどではないので、いつもこんな感じで連番のファイル名を変更しています。

"page_"の部分を"book_"のように変更する場合も、同じようにawkを使って変更できますが、sedを使うともう少しシンプルにできます。

ls -1 page_*.jpg | awk '{printf("mv -i %s %s\n",$1,$1)}' | sed s/page/book/2 | csh

*1:

DURODEX 自炊裁断機 ブラック 200DX

DURODEX 自炊裁断機 ブラック 200DX

*2:

Canon キヤノン ドキュメントスキャナ imageFORMULA DR-C240

Canon キヤノン ドキュメントスキャナ imageFORMULA DR-C240

*3:キャノンのページ:DR-C240ユーザーマニュアル(機能詳細編), 70ページ

*4:

富士通 クリーナF1 FI-C100CF1

富士通 クリーナF1 FI-C100CF1

*5:

キムワイプ 12×21.5cm /1箱(200枚入) S-200

キムワイプ 12×21.5cm /1箱(200枚入) S-200

*6:キャノンのページ:DR-C240交換ローラー オプション・消耗品

*7:

Canon キヤノン DR-M160?/M160/C240用交換ローラーキット

Canon キヤノン DR-M160?/M160/C240用交換ローラーキット

Raspberry Pi3でサーバを構築する (2) RAID1ディスクの構築

 今回の記事では、前回、設置した4台のハードディスクを2組のRAID1ディスクに構成にします。raspberry pi特有なのか、外付けHDDでRAIDを組む場合に起こるのか、いくつか問題が発生しましたので、その問題解決を含めて、説明していきます。

1. RAIDディスク構築の流れ

 RAIDディスク構築の大まかな流れは、以下の通りです。

  • RAIDに用いるディスクにRAID用のパーティションを作成する。
  • それぞれのパーティションを用いて、RAIDディスクを構成する。
  • RAIDディスクに ファイルシステムを作成する。
  • マウントする(必要に応じて、自動マウントするように設定する)。

 今回は、2台のRAIDディスクを作成するので、まず1台目のRAIDを上記の流れに従って設定した後に、2台目を1台目と同様に設定します。

 以下では、流れに沿ってそれぞれ説明します。

2. RAID用パーティションの作成

2.1 ディスクの確認

 まずは、4台あるディスクがちゃんと認識されているか確認します。

$ lsusb
Bus 001 Device 021: ID 1bcf:0c31 Sunplus Innovation Technology Inc. SPIF30x Serial-ATA bridge
Bus 001 Device 020: ID 1bcf:0c31 Sunplus Innovation Technology Inc. SPIF30x Serial-ATA bridge
Bus 001 Device 019: ID 174c:55aa ASMedia Technology Inc. ASMedia 2105 SATA bridge
Bus 001 Device 017: ID 174c:55aa ASMedia Technology Inc. ASMedia 2105 SATA bridge
Bus 001 Device 016: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub
Bus 001 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ ls /dev/sd*
/dev/sda  /dev/sdb  /dev/sdc  /dev/sdd

 上の4つがHDDなのですが、4つもあるとどれとどれが対応するのか区別ができないので(*)、まず2つのHDDを用いて1つのRAIDディスクを構成することにしました。はじめに、USB2.0のHDDを外したところ、ASMediaが/dev/sda,/dev/sdbとして残りました。これがUSB3.0のHDDです。残りが、SunplusがUSB2.0のHDDとなります。

  *: lsusbやhdparmでは特定できませんでした。どうすれば良かったんだっけ?

2.2 パーティションの作成

 fdiskやparted、gpartedなどで、パーティションテーブルを編集できます。ここでは、fdiskとpartedでの作成例を示します。実際にはfdiskで作成しました。

 昔は、fdiskでは2TB超のHDDを取り扱えない場合があったので、partedを使う必要がありましたが、最近はどうなんでしょう。

 (追記:2016/6/6) 2TB超の場合、gdiskを使うようです。パーティションテーブルの編集には、これまでpartedを使っていましたが、次の機会にはgdiskを使ってみようと思います。

2.2.1 fdiskを使う場合

 fdiskの場合、最短「n→(default)→t→fd→w」だけのキー入力なので、簡単です。

$sudo fdisk /dev/sda

Command (m for help): n
Partition type
p   primary (0 primary, 0 extended, 4 free)
e   extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (1-4, default 1):
First sector (2048-3907029167, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-3907029167, default 3907029167):

Created a new partition 1 of type 'Linux' and of size 1.8 TiB.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): L

0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs
e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1 80  Old Minix
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
2.2.2 partedを使う場合

 partedを使う場合には、以下のようになります。

$ sudo parted /dev/sda
(parted) mklabel msdos
(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 0
End? -1s
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I
(parted) set 1 raid on
(parted) p
Model: ST2000LM 003 HN-M201RAD (scsi)
Disk /dev/sdb: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start  End     Size    Type     File system  Flags
1      512B   2000GB  2000GB  primary  ext4         raid, lba

(parted) quit

 RAIDで使うので、file system typeを指定する必要はないような気がしますが、いつも使っているext4を指定しています。

3. RAID1デバイスの作成

 /dev/sda,/dev/sdbのパーティションを作成したら、次にRAIDデバイスを構成します。

3.1 mdadmのインストール

 RAIDディスクを構築・管理するmdadmをインストールします。

$ sudo apt-get install mdadm

 インストールの途中、起動時にアレイを開始するか聞かれましたが、"none"と回答しました。本当のサーバ機なら、"all"のままでいいと思いますが、ときどき外付けHDDを外したりするのではないかと思ったので、"none"にしました (*) 。ubuntuでは聞かれない質問でしたので、ちょっと困惑。

  *: 最終的には、"all"にしました。"none"のまま自動マウントを設定すると、ラズパイの起動が途中で停止して、自動マウントが設定できなかったのです。やはり、自動マウントできる方が便利なので、"all"に変更しました。但し、"auto"でもRAIDにトラブルが発生した場合には、やはり停止します。途中停止した場合には、コンソールでrootになって、emacsやnanoで/etc/fstabを編集し、RAIDディスクをマウントしないようにすれば、起動できるようになりましたが、ディスプレイ・キーボードなしだとこれができないので、この場合、"none"にして、手動でRAIDを起動した方がよいかもしれません(ディスプレイ・キーボードなしの私の初代ラズパイサーバは、起動がストップして困ったことはありません。fstabのディスクマウントのエラー時の処理の仕様が変わったのでしょうかね)。

 (追記:2016/6/6) 初代ラズパイはwheezy、ラズパイ3はjessieですが、jessieではマウント時の取り扱いに変更があり、リムーバブルドライブのマウントオプションはnoauto(自動マウントしない)かnofail(マウント失敗してもbootは継続する)を付けるようにする方がよいとのこと*1。起動が途中停止してしまうのは、この違いでしょうかね。

 (追記:2016/6/9) RAIDのresync/recovery完了後の検証ですが、後述のrootdelay=10の設定後は、"none"でも"all"でも、どちらでも自動マウントができました。"none"でも起動完了後にはRAIDはアクティブになっていたので、"none"だからといって、RAIDデバイスが起動されないということではないようです。

f:id:toranosuke_blog:20160606003847p:plain
mdadmのインストール時の問い合わせ。

f:id:toranosuke_blog:20160606084109j:plain
"none"で自動マウントを設定すると、RAIDが起動していない状態でディスクをマウントしようとする。タイムアウトするまで待って、その後、起動が途中停止する(sshではアクセスできない)。

3.2 RAIDデバイスの作成

 mdadmを使って、RAIDデバイス/dev/md0を構成しました。

$ sudo mdadm --create --auto=yes /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

/bootは入れられないよ、と警告がでますが、/bootは入れないのでyesを回答。

これで、/dev/md0というRAID1デバイスが構成されます。

$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
1953382464 blocks super 1.2 [2/2] [UU]
[>....................]  resync =  0.8% (16852864/1953382464) finish=1635.4min speed=19734K/sec
bitmap: 15/15 pages [60KB], 65536KB chunk

unused devices: 

 最後に以下のコマンドの結果を /etc/mdadm/mdadm.confに追加し、デバイスの構成情報を保存します。

$ mdadm --examine --scan 
ARRAY /dev/md/0  metadata=1.2 UUID=15735a52:1da65294:0a996f65:f5bbe070 name=raspi3:0

4. RAIDデバイスのマウント

4.1 パーティション、ファイルシステムの作成

 作成したRAIDデバイスにパーティション、ファイルシステムを作成し、マウントできるようにします。ファイルシステムはext4で作成しました。

$ sudo fdisk /dev/md0
$ sudo mkfs -t ext4 /dev/md0p1
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 488345360 4k blocks and 122093568 inodes
Filesystem UUID: 4dd6b454-33a5-4746-b86a-9e71ef1e5bda
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

4.2 マウントの設定

4.2.1 mdadmのインストールで、boot時のRAID起動を"none"にした場合

 この場合、起動時にmd0にアクセスできませんので、起動完了後に以下を実行します。

$ sudo mdadm --assemble /dev/md0 
  (あるいは sudo mdadm --assemble --scan この場合、全てのRAIDディスクがアクティブになる)
$ sudo mount /dev/md0p1 /mnt/raspi3-u3/

 ラズパイ本体を再起動、動作確認をして設定完了です。

4.2.2 mdadmのインストールで、boot時のRAID起動を"all"にした場合

 まず、blkidで/dev/md0p1のUUIDを調べます。

$ sudo blkid /dev/md0p1
/dev/md0p1: UUID="4dd6b454-33a5-4746-b86a-9e71ef1e5bda" TYPE="ext4" PARTUUID="fe3a90ec-01"

このUUIDを用いて、以下の行を/etc/fstabに追加し、自動的にマウントするようにします。マウントポイントは、/mnt/raspi3-u3にしています。

UUID=4dd6b454-33a5-4746-b86a-9e71ef1e5bda /mnt/raspi3-u3 ext4 defaults,nofail 0 0

 注:nofailにより、自動マウント失敗した場合でも、bootが停止しない*2

マウントして、fstabの設定を確認します。

$ sudo mount -a
$ df
ファイルシス                   1K-ブロック     使用     使用可 使用% マウント位置
/dev/root                         61874300 13033784   46271248   22% /
devtmpfs                            469688        0     469688    0% /dev
tmpfs                               474004        0     474004    0% /dev/shm
tmpfs                               474004     6644     467360    2% /run
tmpfs                                 5120        4       5116    1% /run/lock
tmpfs                               474004        0     474004    0% /sys/fs/cgroup
/dev/mmcblk0p1                       61384    20376      41008   34% /boot
tmpfs                                94804        0      94804    0% /run/user/1000
tmpfs                                94804        0      94804    0% /run/user/109
tmpfs                                94804        4      94800    1% /run/user/1002
/dev/md0p1                      1922598776    68956 1824844364    1% /mnt/raspi3-u3

 自動的にマウントしたい場合には、"none"ではなく、"all"を選択し、RAIDを起動させておく必要がありますが、既にnoneを選択している場合には、dpkg-reconfigureで"all"に再設定できます(dpkg-reconfigureでは、他に、定期的な冗長性のチェックや監視デーモンの起動、メールの通知先の設定もできます)。

$ sudo dpkg-reconfigure mdadm

 再起動して、特に問題がなければ、RAIDディスクの設定は終了です。

 問題がありました...。通常であれば、再起動して問題なく動作するはずですが、正常に起動しませんでした。コンソールメッセージを見ていると、RAIDのアクティブ化に失敗している模様。いろいろ調べたところ、外付けディスクの起動を待つ必要があるようなので、bootを遅延させることで、解決できました。 bootの遅延は、/boot/cmdline.txtの既存行に以下のように"rootdelay=10"を追加しました*3

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootdelay=10 rootwait

以上で、1台目のRAID1ディスクの完成です。

5. 2台目のRAIDディスクの構築

 2台目のRAIDディスクも1台目と同様に設定を行います。

5.1 デバイス名の確認

 1台目のRAID1ディスクが接続している状態で、既存のHDDのデバイス名を確認します。

$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdb1

 次に、2台目のHDDを接続し、デバイス名を確認します。

$ ls /dev/sd*
/dev/sdc  /dev/sdd  /dev/sdd1  /dev/sde

 あれれ、...。/dev/sda,/dev/sdbが消えている。HDDを3台しか認識していない。その後、いろいろやってみましたが、(リビルド中でHDDの電力消費が多いため?)1つのハブではデバイスの認識が不安定になっているようなので、もう1つハブを加えて、配線し直しました。

$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdc  /dev/sdc1  /dev/sdd

 /dev/sda1, /dev/sdc1が1台目RAIDディスク、/dev/sdb,/dev/sddがUSB2.0のHDDです。同じHDDケース、同じ内蔵HDDだと、さらに混乱するので、hdparmで予めHDDのシリアル番号を調べておいた方がよいかもしれません。

$ sudo hdparm -I /dev/sdb | grep Serial\ Number
Serial Number:      S321J9AF907896
$ sudo hdparm -I /dev/sdd | grep Serial\ Number
Serial Number:      S321J9AF907882

5.2 2台目のRAIDディスクの設定

 デバイス名が確認できたら、あとは1台目のRAIDディスクと同様に設定を行います。

$ sudo fdisk /dev/sdb  (Linux raid autodetectで作成)
$ sudo fdisk /dev/sdd  (Linux raid autodetectで作成)
$ sudo mdadm --create --auto=yes /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1
$ sudo mdadm --examine --scan  (md1に対応する記述を/etc/mdadm/mdadm.confに追加)
$ sudo fdisk /dev/md1
$ sudo mkfs -t ext4 /dev/md1p1

---手動マウントの場合---
$ sudo mount /dev/md1p1 /mnt/raspi3-u2

---自動マウントの場合---
$ sudo blkid  /dev/md1p1 (出力されるUUIDを用いて /etc/fstabを編集)
$ sudo mount  -a

 再起動して期待通りの動作をしているか、確認します。2台ともに正常動作していれば、RAIDディスクの設定は完了です。

5.3 RAIDの同期時間

 最後に、同期の完了時間を確認してみました。

$ cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb1[0] sdd1[1]
      1953382464 blocks super 1.2 [2/2] [UU]
      [=>...................]  resync =  7.3% (143416704/1953382464) finish=2875.6min speed=10489K/sec
      bitmap: 14/15 pages [56KB], 65536KB chunk

md0 : active raid1 sda1[0] sdc1[1]
      1953382464 blocks super 1.2 [2/1] [_U]
      [==>..................]  recovery = 13.8% (269767488/1953382464) finish=2728.5min speed=10283K/sec
      bitmap: 13/15 pages [52KB], 65536KB chunk

unused devices: 

finishするのに、約2800min、まるまる2日かかります。RAIDが1台だけだと、1日程度だったので、約2倍になってしまいました。USBの転送速度がネックになっているのでしょうかね。

 md0の"recovery"は、ご愛敬。いろいろやっているうちに、修復することになってしまいました。

6. おわりに

 今回は、raspberry pi3でのRAID1ディスクの構築についてまとめました。ubuntu+内蔵HDDで構成する場合と違って、多少苦労しました。特に、起動を遅延させること、ハブの給電不足の解消のところでハマりました。2つハブが必要になったり、最近2TBでは窮屈だったりしているので、初代ラズパイとの兼ね合いでHDD3台の4TBのRAID5ディスクに構成し直すかもしれません。

 次回は、samba、nfsなどを使ったファイル共有についてまとめる予定です。

(2016/6/6)

(追記:2016/6/9)

ラズパイ3でのRAID設定の注意点をまとめると、

 - HDDの起動を待つため、bootを遅延させる(/boot/cmdline.txtにrootdelay=10を追加)。
 - 自動マウント失敗での起動停止を避けるなら、/etc/fstabでnofailを追加する。

 boot時のRAID起動設定の"none","all"は、少なくともRAIDが正常な状態では、自動マウントを含めて違いはないように見えます。

参考文献

関連記事

*1:http://qiita.com/Cinosura/items/6ab435331ea2b3671a1d

*2:https://www.debian.org/releases/jessie/i386/release-notes/ch-information.ja.html#systemd-auto-mounts-incompat

*3:http://blog.drewwithers.com/2013/11/raspberry-pi-usb-raid1-root-partition.html
このブログの記事はRAIDブートの方法ですが、SSDブートにも応用できそうですね。後々、問題が生じそうなので、やりませんけど...。

Raspberry Pi3でサーバを構築する (1) ハードディスクの設置

 今回からは、Raspberry Pi3を用いたファイルサーバの構築についてまとめようと思います。初代ラズパイでは、nfsサーバ、sambaサーバ、DLNAサーバを立ち上げていたので、まずは、この3つのサービスを実現したいと思います。

 今回の記事では、ハードディスクの設置についてまとめます。

1. ハードディスクの用意

 2.5インチの2TBハードディスクを4台使って、RAID1ディスクを2つ作ります。1つ目のRAIDディスクがマスター、2つ目がそのバックアップ用のRAIDディスク。豪華です(笑)。全部で8TBのハードディスクがありますが、RAID1とそのバックアップに使うので、実質的には、2TBの容量です。ハードディスクは故障するものなので、贅沢構成にしています。初代ラズパイのサーバも合流する予定なので、そのときは初代ラズパイ側をバックアップ用にするつもりです。 

1.1 内蔵HDD

 内蔵ハードディスクよりも外付けのポータブルHDDの方が安いという逆転現象がよく起こりますが、昔買ったものが余っていたので、内蔵ハードディスクを利用しました。また、ディスク障害が起こったときに、ディスクケースであれば、中身だけの交換、SATA/USBインタフェースに変更がないので、トラブルも少ないように思います。

 ディスクは、価格コム最安値圏のSeagate(Samsung)の内蔵ハードディスクST2000LM003を使いました(12,9400円@amazon,2016/6/4)。

 頑張れ日本ということで、同じく最安値圏の東芝の2TB HDD(MQ01ABB200)を使ったこともあるのですが、すぐに壊れてしまったので、それ以降使っていません。それに15㎜厚なので、ハードディスクケースもなかなか適合するものがないかも。

1.2 ハードディスクケース

  ラズパイのUSBは2.0なので、USB3.0を使う必要はありませんが、今回は、玄人志向の昔買ったGW2.5BM-SU3/BK(2163円,USB3.0)と、新規購入したGW2.5SC-SU2(731円,USB2.0)を使いました。本体側のUSBケーブルが2本に分岐している補助電源が必要なタイプです。USB2.0のハードディスクケースの方は、延長ケーブルが2本差しになっているだけなので、1本でも動作するのではないかと思います。ハードディスクケースは、相性があるようなので、動作実績があるものを選んだ方がよいでしょう、というかハマった*1

2. バスパワー接続の検討

 ラズパイには4つのUSBポートがあります。できれば、セルフパワーのUSBハブなどを繋げてケーブルを増やしたくはない。初代ラズパイでは、USBポートから電源を取ると、不安定になるので、USBハブは必須でしたが、ラズパイ3では大丈夫だろうか。普通に考えて、HDDを4つも繋げるのは、無謀でシステムの不安定化につながりそうだけど、ちょっとチャレンジしてみました。

2.1 消費電力の計測

 まずは、ラズパイ本体の消費電力を計測しました。消費電力の計測には、ルートアールの電圧・電流チェッカーRT-USBVATMを用いました。測定範囲は、0~3.3Aまでなので、今回使った電源アダプタの電力量(5.2V*2.4A)は、計測範囲内です。

 ラズパイ単独の消費電力は、Logicoolの無線キーボードが付いた状態で、以下のようなものでした。

  • 起動時: (5V程度) / 0.28-0.47A
  • 何もしていない状態: 4.92V / 0.32A
  • YouTube再生時(CPU50%): 4.85V / 0.45A
  • 行列計算によりCPU負荷100%: 4.72V / 0.72A
  • 何もしていない状態で、USB3.0のHDD(GW25BM-SU3)を接続: 4.63V / 0.55A

 負荷を増やすと、電圧が5Vから4.7Vと低下していきます。なんか雲行きが怪しい。 それに、HDDを接続すると、マシンが不安定になってしまいました。ますます怪しい。

f:id:toranosuke_blog:20160604083129j:plain:w250
USB電流チェッカーでの計測値は5.04V*0.30A(Logicoolドングル無し)。

大きい方は、ワットチェッカー*2。USBでは5V*0.3A=1.5Wであったが、ACアダプターを込みにしたワットチェッカーの計測値では3Wとなっている。

2.2 USB最大電流の設定変更

 いろいろ調べると、ラズパイのUSBは最大電流0.6Aに制限されているそうです。この制限を1.2Aにしてポータブルハードディスクを接続するようなので、試してみました。最大電流1.2Aに変更するには、/boot/config.txtに以下の一行を追加します。但し、1.2Aは各ポートの最大電流ではなく、全体での値。

max_usb_current=1

safe_mode_gpio=4も併せて書く例がよくでていますが、safe_mode_gpio=4とmax_usb_current=1は同じで、片方だけ書いておけばよいとのこと*3。最大電流を1.2Aにしても、やはり動作せず。

 USB2.0のポータブルHDDでは、USB2.0規格の5V-0.5A以下で動くように作られているはずなので、USB2.0のGW2.5SC-SU2やUSB2.0ケーブルが1本だけのHDDケース(CenturyシンプルBOX2.5SATA)を接続しましたが、これも駄目でした。

 バスパワーはやはり無理ということで諦め、セルフパワーのハブ経由で接続することにしました。もともと4台は無理だろうと思いましたが、1台も動かないのは寂しいです。何がいけないのだろうか。

(追記:2016/6/5) SL2000LM003のカタログ*4を見ると、"spin-up current(max): 1000mA"とありました。SATA/USBのインタフェース部分の消費電力は不明ですが、Logicoolのドングル付きではトータルで1.2Aは超えそうです。必要な電流量が多くて、ディスクのスピンアップができないということが原因でしょかね。確かにディスクは回転していません。

3. ハードディスクの設置

 バスパワーでは駄目だったので、セルフパワーのハブを用いてハードディスク4台を接続しました。

3.1 セルフパワーのUSBハブ

 使ったUSBハブは、Bufalloの7ポートのUSBハブ。4台のHDDがそれぞれUSBコネクタを2本持っているので、本当は8ポート必要なのですが、1台だけは、USBケーブル1本だけで接続しています。4台接続でUSBハブのACアダプターのワット数を計測すると、10Wの消費電力でした。ラズパイへの4台接続はどう考えても無理ですね。

(追記)
 Bufflaoの7ポートハブでは、4台のHDDを繋げると不安定だったので、7ポートハブを2台使って配線し直しました(次の記事(RAID1ディスクの構築))。もう少し容量の大きいハブを使えば、1つでも安定して動作したかもしれません。

3.2 ラックへの設置

 100円ショップで買ってきたラックに設置・配線しました。写真で示すように背面はケーブルだらけのスパゲッティ状態、悲惨です。ケーブル長をちょうどのものに合わせて結束すればいいのですけど、そこまでするのは面倒です。仮置きの状態ですが、ハードディスクは縦置きにしました。3.5インチHDDを隙間なしに積み上げて、熱でやられてしまった経験があるので、どうも横置きには抵抗があります。それでも、横置きで積み上げると固定が楽なので、変更するかもしれません。

 下段のミニパソコン用に設置した自作のファンの空気流がHDDにも流れるようになっているので、現状の設置では熱問題は発生しないと思います。

f:id:toranosuke_blog:20160604093429j:plain:w600
ラックに設置したラズパイと4台のハードディスク。
下段に置いてある白いマシンは、中華製の4K出力可能なWindowsパソコンVOYO V3*5
(Cherry Trail X7-Z8700, 4GB-RAM, 128GB-SSD)


f:id:toranosuke_blog:20160604092327j:plain:w600
裏は、ケーブルだらけ。

4. おわりに

 今回の記事では、ハードディスクの設置までを書きました。次回は、RAID1ディスクの設定についてまとめる予定です。

2016/6/4

次の記事

関連記事

*1:価格コム売れ筋の玄人志向GW2.5CR-U3(886円,USB3.0)を新規に4台購入しましたが、動作せず。私の持っている外付けHDDケースでは、これだけが動作しませんでした(涙)。

*2:

*3:https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=105502

*4:http://www.seagate.com/www-content/support-content/samsung/internal-products/spinpoint-m-series/en-us/samsung-m9t-internal-ds.pdf

*5:


emacs-w3mでmarkdown原稿をプレビューする

 今回は、emacs-w3mを使ってmarkdown形式の原稿をemacs内でプレビューする方法を紹介します。

 以前の記事 で、markdown-mode.elを用いてMarkdown形式の文章をemacsで書く 方法について説明しましたが、その続編です。markdown-mode.elでのプレビュー では外部のブラウザ(firefox)を必要としてましたが、今回はブラウザとして emacs-w3mを用いることで、emacs内でプレビューできるようにします。

1. emacs-w3mのインストール

 動作確認は、いま記事を書いているraspberry pi(raspbian)で行いましたが、 ubuntuでも同様に動作すると思います。

$ apt-cache search markdown-mode
emacs-goodies-el - Miscellaneous add-ons for Emacs
$ apt-cache show emacs-goodies-el | grep markdown-mode
markdown-mode - major mode for editing Markdown files;
$ sudo apt-get install markdown emacs-goodies-el
$ apt-cache search emacs-w3m
w3m-el - simple Emacs interface of w3m
w3m-el-snapshot - simple Emacs interface of w3m (development version)
$ sudo apt-get install w3m-el

2. .emacsの編集

 .emacsに以下の行を追加します。コメントアウトしている部分は必須ではありませんので、お好みで。

(require 'markdown-mode)
;;(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
;;(define-key markdown-mode-map (kbd "\C-c \C-c \C-e") 'markdown-export)
(require 'w3m)
(define-key markdown-mode-map (kbd "\C-c \C-c \C-v")
  (lambda ()
    (interactive)
    (setq html-file-name (concat (file-name-sans-extension (buffer-file-name)) ".html"))
    (markdown-export html-file-name)
    (if (one-window-p) (split-window))
    (other-window 1)
    (w3m-find-file html-file-name)))

3. 使い方

  • プレビュー: "C-c C-c C-v" で編集中のmarkdown原稿(例えば、foo.md)をhtml(foo.html)に変換 し、markdown原稿とプレビュー(foo.html)を2分割で表示します。このとき、フォーカスは、w3m側に移ります。

    このコマンドでは、1画面しか なければ、新たに画面を分割します。但し、画面が縦長・横長に拘わらず上下分割してし まいます。左右分割したい場合には、"C-x 3"や"C-x C-b"など適当なコマンド を打って、予め左右に分割しておくと、左右プレビューができます。

  • リロード:原稿を編集した場合には、markdown-exportを実行して、htmlファ イル(foo.html)を更新し、w3m画面の"r"キーでリロードします。

    markdown-exportは、デフォールトでは、"\C-c \C-c e"にアサインされてい ますが、"C-c C-c C-v"でも実行するので、どちらを使っても構いません。

    (追記:2016/5/23) (split-window-right)と変更すれば左右分割、(w3m-reload-this-page)を追加すれば自動リロード、最後にもう一度(other-window 1)の追加でフォーカスをmarkdown側に戻すことができました。これで、"C-c C-c C-v"のキー操作だけで、原稿のプレビューができます。記事の最後に更新版の.emacsを記載します。

f:id:toranosuke_blog:20160604010144p:plain
左がMarkdown原稿、右がプレビュー。(TeraTermでラズパイにアクセス)

4. おわりに

 これで、記事の執筆中にホームポジションから手を離す必要がなくなりました。原稿とプレビューがほぼ横に並ぶでの、見やすいです。画面もfirefoxより綺麗かな。

(2016/5/22)

参考文献

関連記事

(追記:2016/5/23) ubuntu15.10でも動作確認できました。
(追記:2016/5/23) 左右分割指定、w3mのリロードを追加した.emacsの記述は以下の通り。
(追記:2016/5/28) 更新時のカーソル位置が文頭ではなく、現在の位置になるように修正。w3mモードでのbuffer-file-nameはnil、markdownモードなどではファイル名(foo.md)が設定されることを利用して、新規ロードとリロードの条件分岐をしています。このコードでは、other-windowのbuffer-file-nameがnil(例えば、"Bullfer List")だと、リロードできずにエラーします(Can't reload this page)。どうすればよいのでしょうね?
(追記:2016/5/29) get-bufferを利用しました。"*w3m*"バッファがあればリロードし、無ければ新たにファイルを読み込みます。

(require 'markdown-mode)
;;(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
;;(define-key markdown-mode-map (kbd "\C-c \C-c \C-e") 'markdown-export)
(require 'w3m)
(define-key markdown-mode-map (kbd "\C-c \C-c \C-v")
  (lambda ()
    (interactive)
    (setq html-file-name (concat (file-name-sans-extension (buffer-file-name)) ".html"))
    (markdown-export html-file-name)
    (if (one-window-p) (split-window-right))
    (other-window 1)

    ;; (2016/05/23)
    ;; (w3m-find-file html-file-name)

    ;; (2016/05/28)
    ;; (if (buffer-file-name) (w3m-find-file html-file-name) (w3m-reload-this-page))

    ;; (2016/05/29)
    (if (get-buffer "*w3m*")
        (prog2 (switch-to-buffer "*w3m*") (w3m-reload-this-page)) (w3m-find-file html-file-name))

    (other-window 1)))

自炊して本棚を捨てる (2) ソフトウェア編

 前回は、自炊のために用意した機器について説明しましたが、今回は、利用したソフトウェアを中心にまとめました。

 自炊本を読めるようになるまでの電子書籍化のステップは、以下の通り。

  1. Windows10上で本を高画質スキャンする。
  2. Ubuntu上で、高画質スキャンしたデータを高圧縮率で再圧縮する。
  3. 読書用に画像を1つのファイルにアーカイブする。
  4. MicroSDに保存して、タブレットで自炊本を読む。

以下では、スキャナソフトや再圧縮の方法について説明します。

1. スキャン用ソフトウェア: CapturePerfect (on Windows10)

 スキャナには、CaptureOnTouchとCapturePerfectというソフトが付属していました。CaptureOnTouchは、GoogleドライブやDropboxなどにも保存でき便利そうですが、CapturePerfectの方がスキャン条件の設定が詳細にできるので、CapturePerfectを使いました。

1.1 設定画面

 CapturePerfectは、以下の設定画面からいろいろ設定できるようになっています。

f:id:toranosuke_blog:20160520003737p:plain:w400
CapturePerfectの設定画面。
「スキャン(S)」→「スキャナの設定(S)...」から設定変更できます。

1.2 設定パラメータ

 ほとんどはデフォールトの設定のままで使っていますが、デフォールト値から変更したパラメータは、以下の項目です。

[基本]

  • カラーモード(M):「256階調グレー」「24ビットカラー」「自動で検知する」を適宜利用
  • 解像度(R): 300dpi。当初600dpiの利用でしたが、あまりにも遅いので300dpiに変更。
  • 読み取り面(S): 「両面」「片面」「白紙をスキップする」を適宜利用
  • 傾きを自動で補正する(L): 「搬送時の原稿の傾きを補正する(F)」。「画像 の傾きを補正する(C)」は挿絵などでときどき誤検知して、へんてこな補正 がかかってしまいます。

[画像処理]

  • 背景スムージング(A): 有効
  • 裏写り/地色除去(C): 除去レベルは4。黄ばんだ原稿ではときどき5に変更。
  • 影消し(S): 有効

[その他]

  • JPEG保存時の圧縮率(C): 85 (75でも十分高画質ですが念の為)。普段使い用のファイルは再圧縮します。

この設定では、黄ばんだ原稿の地色が除去できなかったり、フォント幅が細くなりすぎたりします。綺麗にスキャンするのであれば、原稿毎に調整した方がよいと思いますが、面倒なので、やっていません。

2. 画像の再圧縮とアーカイブ (on Ubuntu)

 画像の再圧縮とzipファイルへのアーカイブは、Linux(Ubuntu)で行いました。

2.1 VirtualBoxを用いたUbuntu環境

 画像の再圧縮・アーカイブは、ubuntu15.10で行いました。ubuntuは、Windows10上の仮想PCで、仮想化にはVirtualBoxを使いました。VirtualBoxでWindows側との共有フォルダの設定をしておくことで、Windows側のファイルをubuntu側で取り扱うことができます。

f:id:toranosuke_blog:20160520010700p:plain:w400
VirtualBoxの共有フォルダの設定。

上の例では、Windows側のC:\Users\toshi\homeを/media/sf_win10にマウントします。 /media/sf_win10/は、owner:root、group:vboxsfなので、/etc/groupを編集して、ユーザにアクセス権を設定します(*1)。

drwxrwx--- 1 root vboxsf 4096 5月 19 21:20 sf_win10

(*1) /media/sf_win10のファイル属性は変更できない仕様のようです。

2.2 インストールするパッケージ

 ubuntu上で用いるコマンドは、convert, zip, csh です。必要であれば、以下のパッケージをインストールします。

$ sudo apt-get install imagemagick zip tcsh

imagemagickはconvertコマンドが入っているパッケージです。

2.3 画像の再圧縮: convert

 JPEGの設定が高画質(Q=85)で設定しているとファイルサイズが大きいので、convertコマンドを用いて高圧縮率で再圧縮します。

$ convert foo_org.jpg -quality 20 foo_q20.jpg

 例えば、以下の文字中心の画像(Q=85)をQ=5,8,10,15,20,30,50で再圧縮すると、画質やデータサイズは、以下のように変わります。拡大すると画質の劣化はわかりますが、1920x1200画素の7インチ端末(MediaPad X1)では、Q=20ぐらいまではほとんど劣化は分かりません。再圧縮では、画質の劣化とデータサイズを考慮してQ=20に設定しました。

f:id:toranosuke_blog:20160520012947j:plain:w300
文字中心の画像(Q=85)

f:id:toranosuke_blog:20160520014414p:plain:w150 f:id:toranosuke_blog:20160520014423p:plain:w150 f:id:toranosuke_blog:20160520014436p:plain:w150 f:id:toranosuke_blog:20160520014444p:plain:w150
q=85 (306KB) q=50 (174KB) q=30 (133KB) q=20 (105KB)
f:id:toranosuke_blog:20160520014450p:plain:w150 f:id:toranosuke_blog:20160520014457p:plain:w150 f:id:toranosuke_blog:20160520014502p:plain:w150 f:id:toranosuke_blog:20160520014509p:plain:w150
q=15 (91KB) q=10 (73KB) q=8 (64KB) q=5 (48KB)
圧縮率を変更した場合の画質の変化。
f:id:toranosuke_blog:20160520015803p:plain:w150
600dpi、Q=100でスキャンした画像(1,848KB)

2.3 アーカイバ: zip

 次にページ毎のファイルを1つのファイルにアーカイブします。

 自炊のためのファイル形式としては、pdf形式とzip形式が候補となります。どちらの形式でもスマホ•タブレットの優れたビュアーがありますが、pdfは一旦変換してしまうと、その後にページ単位に取り扱いたい場合に面倒になるので、zip形式で保存することにしました。

 zipコマンドは、次のように使います。

$ zip book.zip page_001.jpg page_002.jpg page_003.jpg

 page_001.jpg, page_002.jpg, page_003.jpg は、ページ単位の画像のファイル名です。大量のファイルがあるので、実際には、アスタリスク(*)を用いて、次のように利用します。

$ zip book.zip page_*.jpg

2.4 画像圧縮とアーカイブのためのシェルスクリプト

 次のような自作のcshスクリプト(page2book.csh)を使って、一連の処理を実行しています。まず、本のスキャンされたページ単位のJPEGファイル(page_001.jpg,page_002.jpg)は、1つのディレクトリ(book1)の下に保存します。ディレクトリ名やページのファイル名は任意で構いません。但し、ページのファイル名は、"ls page_*.jpg"で順番に並ぶように命名する必要があります。

 使い方は、例えば2冊の本をアーカイブするのであれば、次のように実行します。

$ page2book.csh book1/ book2/

結果は、オリジナルの高画質ファイルは、ディレクトリorg/以下に、book1_org.zip, book2_org.zipで保存され、圧縮されたファイルは、ディレクトリq20/以下に、book1_q20.zip, book2_q20.zipとなります。オリジナルの*_org.zipファイルにオリジナルデータは保存されているので、book1/, book2/以下のデータは削除して構いません。

#!/bin/csh
# usage: pages2book.csh book1/ [ book2/ book3/ ... ]
#   book1's pages (e.g. page_001.jpg,page_002.jpg...) should be saved in a directory "book1/".
#   do the same with book2, book3, ..
#
# process:
#  - book1's original pages are moved to book1/org/, and zip to ./org/book1_org.zip
#  - book1's compress pages are saved to book1/q20/, and zip to ./q20/book1_q20.zip

set q = 20
set cdir = `pwd`

# make output directories
if !( -e $cdir/org/ ) mkdir -p $cdir/org/
if !( -e $cdir/q20/ ) mkdir -p $cdir/q{$q}/

foreach x ( $* )

  set bname = `basename $x`

  if !( -e $x/org/ ) mkdir -p $x/org/
  if !( -e $x/q{$q}/ ) mkdir -p $x/q{$q}/

  #---------------------------------
  pushd $x/org/

  # move original scan pages to "org/"
  mv -i ../*.jpg .

  # archive pages by zip
  zip ../{$bname}_org.zip *.jpg

  #---------------------------------
  cd ../q{$q}/

  #  re-compress scanned pages by quality=20 for example
  foreach y ( ../org/*.jpg )
    set a = $y:r
    set b = $a:t
    echo "convert $y -quality $q $b.jpg"
    convert $y -quality $q $b.jpg
  end

  zip ../${bname}_q{$q}.zip *.jpg

  # show files
  cd ../
  
  ls -al *.zip

  mv -i ${bname}_org.zip $cdir/org/
  mv -i ${bname}_q{$q}.zip $cdir/q{$q}/

  popd

end

exit

3. タブレット端末で読む

3.1 MicroSDへの保存

 2015年に購入したMediaPad X1(7インチ、1920x1200画素)にMicroSD 64GBを入れて使っています。MicroSDはexFatでフォーマットされていましたが、MediaPad X1では、exFATフォーマットを認識しないようでしたので、ntfsにフォーマットし直して利用しました。

toranosuke.hatenablog.com

 スキャンした本は 、rsync を用いてMicroSDに同期。

MicroSDがWindows側のドライブ(ここではFドライブ)をVirtualBoxの共有フォルダ機能を使ってマウントして、以下のコマンドを使います。

$ rsync -av --delete /home/tora/books/ /media/sf_F_DRIVE/books/

ファイルは、Googleドライブにも保存しているので、Googleドライブ経由でダウンロードできますが、いまのところほとんど使っていません。

3.2 PerfectViewer (on Android)

 ビュアーは、Androidの自炊ビュアーの定番PerfectViewerを利用しています。秀逸なソフトです。

f:id:toranosuke_blog:20160520141034j:plain:w300

PerfectViewerでは、ディレクトリの階層構造も保つので、ディレクトリをうまく整理しておけば、楽に本にアクセスできます。

おわりに

 これで一通り、ソフトウェアは使えるようになります。

 次回は、実際に自炊したときに生じた問題点などについて書きたいと思います。

2016/5/20

関連記事

ROOM

楽天ROOMに自炊関連の商品をまとめています(随時更新)。