錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

Android上でpukiwikiを稼働させる

PCにpukiwikiというWikipedia(を動かしているソフト)の親戚のようなソフトを入れて、個人的なメモ書きとして使用している。そこで、スマホでこのメモ書きをいつでもどこでも持ち歩いて見られたら大変便利だと思い立ち、Android上でpukiwikiを稼働できるかどうか調べてみた。
すると、KSWEB(Google Play)というアプリ(2.99ドル:5日間試用可)をインストールすると、簡単にpukiwikiの稼働に必要な環境が実現できることが分かった*1
結論として、pukiwikiを正常に動作させるためにはKSWEBのPHPバージョンは5.6.12を指定し、pukiwikiは1.5.0を使えばよいと分かった(Androidバージョン6.0にて動作確認)。以下に詳しい内容を記す。

(2019/1追記)
2019/1現在のKSWEB3.93はPHPのバージョンが7.2.3で、pukiwikiはやはりエラーが出て動かない(pukiwiki1.5.0にて確認)。KSWEBの設定画面でPHPのタブから「PHP Version」の右脇の「7.2.3」をタップすると、「External Pack」のダウンロードリンクがあるのでタップしてダウンロードの上、「+」ボタンから落としたファイルを指定する。するとPHPのバージョンを選べるようになるので、バージョン5.6.31を選択した上でKSWEBを一旦終了させて再度起動すると正常に動くようになる(Androidバージョン8.0にて動作確認)。

pukiwikiの最新のバージョンは記事作成時点(2017/9)で1.5.1だが、記事作成時点のKSWEBの最新バージョンである3.7.3(PHPバージョン7.1.5)でEUC-JP版のpukiwiki1.5.1を動かしたところエラーが出てページが表示されない(個別ページを表示しようとするとattach.inc.php内でT_STRING関連のエラーが発生した旨が表示される)。
手元のPCのPHPバージョン7.0.22の環境下ではEUC-JP版のpukiwiki1.5.1が正常に動作しているため、PHPのバージョンアップにより不具合が生じている可能性が考えられた(ただしpukiwiki公式サイト(回答の項目の一番下)ではPHP7.1への対応が明記されているので、また別の原因かもしれない)。
そこでPHPバージョンが5.6.12であるKSWEBバージョン3.4でpukiwiki1.5.1を動作させてみるが、今度はリンクがうまく処理されず、「最終更新」ページで更新されたページへのリンクがブラケットに囲まれて表示されたり、個別ページでリンク文字列を設定したリンクがURLしか表示されていなかったりする。ならばとpukiwikiをバージョン1.5.0に差し替えたところ、不具合は改善し正常な動作を確認できた。

KSWEBではMySQLも動作させることができるので、WordPressも動くと思われるので機会があれば試してみたい(Google Playのレビューコメントでは動作しているとのこと)。

参照サイト

*1:webサーバであるlighttpdPHPの他、MySQLやNginx,Apache,FTPサーバ機能なども用意されている。なお、KSWEBの他にもPHPが動くウェブサーバ機能を提供するアプリはあるようで、無料でもPHPが動くアプリがあるかもしれないし、Termuxでサーバ環境を用意することも可能かもしれないが未確認

AndroidでEmacsが動くなんて素敵すぎる!(非Root環境)


ガジェットブログの有名サイト「ひとりぶろぐ」に以下のエントリがあった。

そのブコメによると、Android上でDebianが動くという。

KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる!

昔の戦友を見ているみたいで胸が熱く、軽量な筐体と質の良いキーボードはうらやましい。しかし実用的にはDebian on Android+bluetoouhキーボードのほうがRAMも多いし快適かな。T699とかなら立ったままコーディングも可能。

2017/07/16 09:14

早速検索してみると、以下の記事が見つかったので真似してみた末にターミナル環境でEmacsが実用的に動くようになったので以下にそのメモ書きを残す。

AndroidでLinux!root化不要でAndroid上にGNU/Linux環境を構築する方法 – OTTAN.XYZ(消滅)
(追記)残念ながらページが消えてしまっていた。またGNURoot Debianは開発終了してしまったらしく、以下のアプリへの移行が案内されていた。後日検証してみたい。

(2017/10/21 追記)
同じくAndroidのターミナルアプリであるTermuxでは記事本文で挙げた日本語フォントの表示不具合が無いのでTermuxの利用をおすすめする(Termuxのリポジトリにmozcパッケージが存在しないのだけが残念だが)。
以下リンク先の記事でTermux上でのEmacs使用方法が紹介されている。
Android上でEmacsをまともに使うには | mhatta's mumbo jumbo
(2017/10/29 さらなる追記:簡単な使用メモとノウハウ)
フォントの拡大縮小はまさかのピンチ動作で可能。
画面左端をスワイプでメニューが出る。メニューでは仮想ターミナルの一覧表示と新たな仮想ターミナルを増やすことができ(キーボードからCtrl-Alt-Cでも可能)、キーボードからCtrl-Alt-Nを押すと次の仮想ターミナルへ移動することができる。
ターミナルのその他のショートカットキーは以下。

ショートカットキー 機能
C-A-P 前の仮想ターミナルへ移動
C-A-数字 指定した番号の仮想ターミナルを開く
C-A-+(プラス) フォントサイズを大きくする
C-A--(マイナス) フォントサイズを小さくする
C-A-M 右クリックメニューのようなものを出す
C-A-F フルスクリーン
C-A-R 現在の仮想ターミナルにセッション名を付ける
C-A-U ターミナルに表示されているURLを抽出してコピーもしくは開く
C-A-→ 仮想ターミナル(セッション)一覧を表示
C-A-← 仮想ターミナル(セッション)一覧を閉じる

現在の仮想ターミナルを閉じるにはC-A-Mからkill processする。
テキストを編集する際に端末からemacsclientするにはemacsでM-x server-startしておいて、別の仮想ターミナルからemacsclientを実行し、C-A-Nでemacsの仮想ターミナルへ移動すればよい。
余談だが、併せてPC-Android間でファイルの同期ができるadb-sync(google/adb-sync)の導入をお勧めしたい。Dropboxなどのクラウドストレージを利用してもよいが、クラウドに上げたくない私的な・内部的なファイルでは使いにくいのと、サイズの大きいファイルでもスピーディーに同期できる点でadb-syncが優れている。adb-syncコマンドはるびきちメルマガ(Emacsの鬼るびきちのココだけの話)より知った。大変便利。



導入方法

上の記事の通りGoogle Playから「GNURoot Debian」をインストールし、記事の説明の手順を終えた後にemacs24をインストールする。GUI環境が必要なら記事に紹介されているように「XServer XSDL」をインストールするが、手元の端末ではGUI環境は動作が重く操作もしにくいため動作確認を行なったのみで詳しい使い勝手は調べていない。
Debianのシステムは/sdcard/GNURoot以下にディレクトリが展開されている模様。

日本語表示

デフォルトだとターミナルで日本語は文字化けして表示されない。このためターミナルからemacs -nwコマンドで起動する端末emacs上でも日本語は文字化けする。これはGNURoot Debianの右上メニュー→設定→「デフォルトでUTF-8」をチェックすればよい。また~/.bashrcに以下を記載しておく。

export LANG="ja_JP.UTF-8"
export LANGUAGE="ja"

第256回 新春特別企画・Android上でUbuntu…ではなくDebianを使う:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

フォント表示

設定メニュー→テキスト→フォントサイズでフォントの大きさを変更できる。Emacsでの入力時に読みやすくするには20ポイントぐらいに設定する。.emacsでフォントを変更しても適用されないようだ。現在のAndroidスマートフォンで一般的な大きさである6インチ弱の端末の場合、ウインドウを分割するなら16ポイントが良い。端末は通常横向きで使用すると思われるが、20ポイントだと上下にウインドウを分割した際に各ウィンドウが2行ぐらいしか表示されない。

日本語入力

ddskkをインストールするとEmacsskkによる日本語入力が可能となるが、漢字変換をしてskk辞書を学習させているとEmacsの終了時にモードラインに「cannot set file date」と出て終了できない(Androidシステム上でのファイルパーミッション設定(変更不能)が原因か)。
仕方が無いのでCtrl+Shift+Nで別ウィンドウを作成しemacsプロセスを強制終了させることで対処する(.skk-jisyoは正常に保存されている模様)。別の端末ウィンドウに移動するごとにAndroidの日本語入力がオンになってしまい、コマンドを入力するには漢字変換キーを2回押ししなければならないのは煩わしいところ。


SKKによる日本語入力の様子。1行目と5行目で漢字変換により画面描画が乱れ入力位置直前の1文字が消えてしまっている。Ctrl-lで画面を再描画することで正しく表示されるが煩わしい。

  • Mozcの利用

以上に挙げたSKK利用による不具合を回避すべく、代替案としてmozcを利用しようとemacs-mozcパッケージをインストールしてみる。C-\でmozcが起動でき快適に入力ができる。


Mozcによる日本語入力の様子。三点リーダ(…)の箇所で画面描画が乱れ三点リーダの直後にアンダースコアが入って見えるが、アンダースコアを消そうとすると実際には三点リーダが削除されてしまう。この他、長い文章を入力した際に長い変換候補の表示によって画面描画の乱れが発生し、カーソル位置と思っている箇所への文字入力や文字削除が位置ずれして反映されてしまうこともあり煩わしい。

ただ予測候補への変更でTabやC-iを押すとカタカナに代わってしまい予測変換ができない。GUI上のEmacsだと正常にTabで選択できたのでコンソールだけダメである模様。色々と試行錯誤したが上手く行かず諦めた。また上記に挙げた予測候補が表示されるときに画面が乱れ、カーソル位置が入力位置と異なる位置に移動したかのように見える不具合については、mozc-popupというmozcの予測候補の表示方法を変更するパッケージがあり、それを利用すると改善するとの情報があった。試行錯誤した内容とmozc-popupの設定については以下の囲みを参照。

  • 試行錯誤

JapaneseEnvironment/Mozc - Debian Wikiによると、mozc-utils-guiからキーバインドを変更できるとのことだがGUI環境でmozc設定ツールを起動してもウィンドウは表示されるものの設定項目の内容が表示されない。
emacs-mozc を動かすための設定(emacs 設定編) - NTEmacs @ ウィキ - アットウィキの「8) (「サーバ準備編」利用の場合) mozc のキーバインドを設定する。」 にて他のOSの設定を~/.mozc ディレクトリにコピーすればよいとされているが、その通り実行しても設定が適用されない。

  • mozc-popupの設定

mozc-popupを入れるためのパッケージシステムの設定はbind-key.el : define-keyを直接書くのは時代遅れ!Emacsの重鎮が行っているスタイリッシュキー割り当て管理術!- るびきち「新生日刊Emacs」の説明を参照。これを設定してmozc-popupを入れてみたが「Tabキーで選択」という候補選択の案内表示はされるもののTabを押してもカタカナになってしまうのは変わらず。しかし画面の乱れは無くなり快適な日本語入力が可能となった。ただ、そもそもAndroidIMEを使えば予測変換は可能なので、場合によってはAndroidIMEを使って入力した方が楽かもしれない。

mozc-popupによる日本語入力の様子。画面描画が乱れることなく入力ができる。

キー入力

  • メタキー(M-)の有効化

メタキー(M-)を有効にするためGNURoot Debianの右上メニュー→設定→「ALTキーでESCを送出」にチェックを入れる。

  • マーク(C-SPC)が利かない問題の対応

マーク(C-SPC:set-mark-command)が効かない問題がある。.emacsのglobal-set-keyで「C-\ 」のように記述してもダメ。以下のリンク先でコメントされているように、ターミナルの種類によってCtrl+スペースおよびアスタリスクの組み合わせがキーコードとして動作しない模様。

If you're running Emacs in a terminal, then C-SPC and C-8 are unlikely to send what you want them to.
windows 8 - Why can't I set mark on emacs? - Stack Overflow

I tried setting set-mark-command to Ctrl-x-g which fixes the problem
emacs Ctrl-SPC default mark key-binding not working · Issue #583 · Microsoft/BashOnWindows · GitHub

対策として、~/.emacsでマーク(C-SPC:set-mark-command)を以下のようにAlt+@の組み合わせに変更したところ動作した(本来ならより近いキーバインドであるAlt-Spaceを使いたかったが、Alt-SpaceはAndroild上でIMEのオン/オフにバインドされているため)。

(global-set-kay [?\M-@] 'set-mark-command)

所感

いつでもどこでも手元のスマホEmacs環境があるのは素晴らしい。
後はunisonによるPCとのファイル同期ができれば完璧だが、unison自体はインストールできるものの、AndroidでRoot権限を取得しないとファイルのパーミッションを変更できないことからunisonでの同期時にエラーが出てしまう(sshでの公開鍵パスフレーズなしログインも~/.sshやauthorized_keysファイルのパーミッションを適切に設定できないためか不可能)*1。unisonの実行時に-ignorelocksオプション(Reference Guide / Preferences - Unison File Synchronizer / User Manual and Reference Guide)を付ければエラーは回避可能だが、編集したファイルの同期に不具合が出る可能性がある以上、実用には不安が残る。Androidがユーザー領域のファイルについては非Root環境でもパーミッションの変更を認めてくれればよいのだが…。
(追記)

何度か試してみたところPC→Androidへの同期は問題無く行なわれるが、逆方向であるAndroid→PCへの同期にてOcamlのバージョンが異なる旨のエラーが表示されて同期できなかった(PCとAndroidでUnisonのバージョンはマイナーバージョン番号まで一致している)。これを解決するにはPC側でAndroidのUnisonのコンパイルに使われたのと同じバージョンのOcamlをビルド・インストールしてUnisonをビルドすることになる(あるいはAndroidをRoot化してPCと同じバージョンのOcamlをビルド・インストールしてUnisonをビルドするか)。既にデスクトップPCでは他のノートPCとのUnison同期を行なっているため、しばらく先の課題としたい。

その他

  • org-modeの見出しを見やすい色にする

デフォルトだとorg-modeでトップレベルの見出しの色が見えにくい。~/.emacsに以下を追記すれば黄色になる。

(custom-theme-set-faces 'user `(org-level-1 ((t (:foreground "yellow")))))

themes - customize colors of level in org-mode - Emacs Stack Exchange

  • 端末へのペースト

ターミナルの画面を長押しするとテキスト編集ダイアログが出てクリップボードの中身を貼り付けられる。

  • GUI環境ではAlt+Tabでの切り替えができない

GUI環境ではAlt+Tabでの切り替えがAndroidのアプリ切り替えに取られてタスク切り替えができず、極小のカーソルを画面タッチで動かしてウィンドウを切り替えしなければならず、複数アプリを切り替えての使用には実用上難点がある。Bluetoothマウスを使用するかホットキーによるタスクスイッチを設定すれば良いのかもしれない。

  • Vysor経由時はCtrlが入力できない

PCからAndroidを操作できるVysorを使用した場合にCtrlが入力できない問題がある。Bluetoothキーボードからなら問題なくCtrlが入力できる。

Google Playで配布されているEmacsアプリ。存在は知っていたがレビューの評価が良くないのと更新が止まったままのようなので試していない。最終アップデートは2012年8月23日となっている。

android debain」で検索するとまずヒットしてくるアプリだが、以下のアプリ説明文の通り、手元の端末のAndroid 6.0には対応していなかった(アプリ制作者が新しいスマートフォンを購入するまではアップデートの予定が無い模様)。

Android 6.0 Marshmallow is not supported!

本家Emacswiki。最初の項目にTermuxが書いてあった。

*1:sshpassコマンドを使うことでパスワード入力を省略することが可能。sshpass -p password unison hoge.prfのように記述する sshコマンドでパスワードをオプションとして入力出来るようにする『sshpass』 | 俺的備忘録 〜なんかいろいろ〜

xyzzyのbuffer-opposite(現在のバッファを反対側のウィンドウにも表示)をEmacsでも使う

WindowsEmacsenであるxyzzylispで「現在のバッファを(表示位置もそのままに)分割した反対側のウィンドウにも表示する」というコードをどこかで拾ったが、これが「現在の表示位置をそのままにして文書の別のところを見に行きたい」という際に通常だとウィンドウが分割されている場合「C-x 1 C-x 2」とする必要があるところを簡単に切り替えができて便利なためEmacsでも使えないかと常々思ってきた。ある時久し振りにxyzzyを使う機会があったため、試しにxyzzyの設定ファイルであるsiteinit.lからコードをコピーして.emacsにペーストしたところ問題なく動作した。どこかで拾ったこのコードはbuffer-oppositeで検索しても見つからないためここで共有しておきたいと思う。
elispは知らないが、改めて見てみるとやっていることは他のウィンドウを消してウィンドウを分割するというシンプルな内容のようだ。以下ではC-c bをキーバインドに設定している。

;; buffer-opposite 現在のバッファを分割した反対側のウィンドウにも表示する
(defun buffer-opposite()
  (interactive)
  (delete-other-windows)
 (split-window))
(global-set-key (kbd "C-c b") ' buffer-opposite) ;キーバインドをC-c bとする

以下は実際の操作画面。emacs-w3m日本語版のinfo画面を表示した状態からC-c bでウィンドウを2分割させ、別ウィンドウに移動してスクロールさせた後にC-c bで元のウィンドウに同じ位置を表示させている。

web年賀状サービスの比較(ウェブポについて詳しくレビュー)

web上で年賀状の投函までしてくれるサービスを自分で調べた範囲でのメモ。タイトルのように比較というよりは、昨年まで使っていたポスコミからウェブポに乗り換えてウェブポを調べたメモというところだが、この時期ある程度は役に立つかもしれない。

  • ウェブポ - 年賀状のぜんぶをオンラインで

    富士フイルムイメージングシステムズ株式会社による日本郵便と連携している年賀状特化サービス。住所不明でもメアドやSNSアカウントのみで送れるサービスあり。

    印刷料金は2016年現在下に挙げるポスコミより1枚8円安く、1枚の印刷料金が税込78円(2016年現在)。「さらに割引」マークの付いたデザインについては10枚以上の注文でさらに10%以上の値引きとなり税込70円以下となる。

    (サイトより大口割引について引用)

     ご注文枚数 	割引率 	割引後の印刷料金
     100枚以上 	35%割引 	50円/枚
     50枚以上 	30%割引 	54円/枚
     10枚以上 	10%割引 	70円/枚
     ※ 大口割引は、1注文あたりの注文枚数に応じて上記割引率を適用いたします。
    

    はがきのデザインに「さらに割引」マークが付いていれば別のデザインでも1注文単位で割引される(たとえば「さらに割引」マークの付いたAデザインを7枚、「さらに割引」マークの付いたBデザインを3枚注文すると10枚以上としてカウントされ大口割引の対象となる)。

    はがき1枚ごとに自由なあいさつ文設定が可能。はがきのデザインによって差出人の印刷位置が表に固定され裏面に印刷できないものもある。はがき裏面の自由な内容を記載できる挨拶文用の枠領域はサイズを変更したり位置を移動したりできる。

    また送り先ごとにデザインを変更することもできる。分かりにくいがあいさつ文の設定画面(「個別のあいさつ文の入力」)まで進み、プレビュー画面の下にある「デザインを変更」というボタンを押すと個別にデザインを選択することができる。ただ送り先が多いと一つ一つの宛先に対してデザインの変更操作を繰り返すのがかなり面倒になってくる(デザインごとに注文を分ければいいがそうすると割引は適用されない)。宛先をグループ分けする機能で一括して選択できるようにして欲しいところだ。

    はがきデザインの制限事項として、最初のデザイン選択で差出人を裏面に表示した場合は送り先ごとにデザインを変更することはできないという点、注文の中に差出人の印刷位置が表面で固定されているデザインがあると差出人の印刷位置を裏にできるデザインでも裏面に差出人を表示する指定ができなくなるという点がある。

    アドレス帳ではそれぞれの人に対する毎年の年賀状の差し出し状況(注文したかどうか)の履歴を確認することができる。

    サイトはFLASHを用いた設計であるため、各操作は基本的にマウスで行なわなくてはならないのがやや難点である。かなりの量に及ぶデザインの閲覧や、はがきデザインの編集に伴なう操作の繰り返しをマウス操作でこなすのは大分くたびれるものがある。

    はがきデザインはポスコミと比べてみると共通のものがちらほらあり、共通のデザインソースがあるものと思われる。

    (2017/12追記)

    2017年も印刷料金や大口割引制度は昨年と変更なく利用できる。

    さらにインターフェイスが直観的に使いやすくなった。はがきデザインを決めた後で宛先を選択する際に、既に作成したはがきがカートに入っている宛先は「カートに追加済み」の表示が付き大変便利。プレビュー画面でのデザイン変更はできなくなったが、デザインごとに注文を分けても、大口注文による割引が適用されるようになったため問題なし。

    不満点としては、はがき裏面のデザインで挨拶文や差出人の文字が縁取りされないため、はがきデザインが黒っぽいと挨拶文や差出人の文字が背景に埋もれてしまう点がありフォントに縁取りの指定が欲しいところ(2015年まで利用していたポスコミでは文字の縁取り指定ができた)。また、各はがきデザインを選択する際にタブキーでフォーカスを移して選択できないため、デザインを選んで回るのにマウスオンリーで操作しなくてはならずくたびれるのも昨年と変わらず。通常のHTMLによるページも用意してくれればありがたいが、この辺は一般的な要望ではないので難しいか。スマホアプリ版も作成された模様(未使用)。


  • ネットで年賀状™2015 / スマホで年賀状™ - ネットやスマホで年賀状を印刷・配送

    日本郵便と連携したオンライン年賀はがき作成・発送サービスサイト。宛名スキャン機能の手軽さや洒落たデザインでスマホオンリーの若年世代を取り込めそう。個人的にははがきデザインが趣味に合わない感じか。

  • Digital Post|次世代デジタル郵便サービス

    年賀状だけでなく、グリーティングカードも対応している。発送は2営業日後となる(1日申し込みなら3日)。

  • So-net オンライン ハガキ作成 | So-net

    ポスコミのサービスを看板だけso-netにしたもののようだが年賀状キャンペーンが15%引きで本家(10%引き)より安い(印刷料金 通常税込86円/枚のところ税込73円/枚)。以前は私製はがきのみだったが、今年確認したところ「お年玉付き年賀はがき(無地)」と私製はがきが選べるようになっていた。キャンペーン時以外での印刷代はポスコミと同じ。支払方法が「So-net ユーザーIDによる決済」となりSo-netユーザIDの取得が必要。

    (2017/12追記)

    印刷料金は2017年も昨年と同じ。年賀状キャンペーンの15%引きも昨年同様で1枚から適用となるが大口割引制度は無い。


  • ネットで年賀状の印刷~郵送までできるポスコミ

    非常に便利で数年利用し続けていた挨拶状投函・配達サービス。ただ買い物かごに入れた後にその注文に対して宛先の追加*1や削除*2ができなかったり、宛先をまとめて選んだ際個別に挨拶文を指定できないのが今一つ不便に感じていて、今回ウェブポへの移行に踏み切った。

    印刷料金は税込86円/枚(2016年現在)で、2016年は年賀状キャンペーン値引きはなく、サイト内のどこかにあるクーポンコードを見つけた場合のみ10%引きとなっていた(印刷料金 税込78円/枚)。

    (2017/12追記)

    印刷料金は2017年も昨年と同じ。大口割引は50枚から(15%OFF)となる。ウェブポは100枚以上で35%割引の50円/枚となるが、ポスコミでは300枚以上で30%割引の60円となり値引率はややウェブポに譲る(ただし、宛名印刷料金や基本料金を取られる従来の年賀状印刷サービスと比較すると大幅に安価で済む)。今年は年賀状キャンペーン値引きによる値引きは無く、買い物カゴのクーポンコード入力によるポイント(1年間有効)での還元となっている模様。

    UIが普通のウェブページなので、好みのはがきデザインを探す際にはがきデザイン詳細画面で「次へ」を押すとどんどん次のはがきデザインを見ていけるのでデザインを選ぶのが楽。


*1:注文した内容のデザインを新たな注文に再利用することはできる

*2:1注文全体をキャンセルして注文し直すことになる

複数pdfを横断検索する方法の検討

裁断してpdf(+OCR)化した本が大分多くなってきて、これらの書籍の中から特定の単語を検索したいということや、あのフレーズはどの本で読んだのだったかを調べたいということが時々起こるようになってきた。

複数pdfを横断した全文検索をするにはAdobe Readerの検索機能を使うのが簡単だが、毎回1から検索を行うため、検索した結果が表示されるまでファイル数が多いと時間がかかる難点がある。このため、Google検索のようにあらかじめ検索インデックスを作成して素早く検索できる方法を検討した。環境はUbuntu16.04 LTS。

結論

デスクトップ検索ソフトRecollを使う(WindowsMacにも対応している)。
検索サーバによる方法(Fess, HyperEstraier)はうまく行かなかった。

デスクトップ検索ソフトによる方法

後述する検索エンジンによる方法がうまく行かなかったため、デスクトップ検索ソフトについて調べてみた。調べてみるとBeagleというソフトがあるようだが、長く更新が止まっているらしい。その代わりにRecollというソフトがあるようなので試してみることにした。

RecollはUbuntu16では標準リポジトリに登録されているため、端末から簡単にインストールできる。WindowsMacの場合は、文末の関連サイトのRecoll公式サイトからダウンロードする。

sudo apt-get install recoll

pdfのファイル数が2000ほどあり、インデックスを作成するのに30分程度を時間を要した。検索してみると、後述の検索サーバによる方法で使ったFessでもHyperEstraierでも拾われなかったpdfが検索結果に表示されることが確認できた。その上、Openをクリックすると検索文字列を検索した状態でドキュメントビューアのEvinceが開いてくれて大変便利である。求めていたものはすぐ近くにあったのだった。


端末から検索する

RecollはGUIを使わずに、端末から検索することもできる。端末に慣れている場合は、こちらも便利。

  • 「ほげ」を検索する

    recoll -t -A -p 999 -q 'ほげ'
    # (結果)
    :3:common/rclinit.cpp:360::Recoll 1.28.5 + Xapian 1.2.22 [/home/username/.recoll]
    Recoll query: (ほげ)
    30 results
    application/pdf [file:///pass/to/pdffilename.pdf]       [pdffilename]  xxxxxxxx        bytes   
    SNIPPETS  # <--------------------------
    6 :  社で課長ほげ山君急で 
    6 :  いよ > < ほげ山君でも、ほげ山君は、 
    # ---(中略)---
    73 :  layout 1 6 html ほげ山君、お疲れ様ほげ山君の作 
    74 :  るよ課長ほげ山君 muchas gracias 
    /SNIPPETS # <--------------------------
    

    上記の「SNIPPETS」〜「/SNIPPETS」で挟まれた部分(「<--------------------------」)が、検索した文字列がヒットしたところ。
    複数の文書でヒットすれば、その数だけ「SNIPPETS」〜「/SNIPPETS」が繰り返し表示される。左端はヒットした箇所のpdfページ番号。
    1行目のコマンドにオプションで指定している「-p 999」は、1つの文書の中で「ヒットしたところを何ヶ所表示するか」の上限を指定しているもので、このため「999」という大きな数値にしている。GUIから検索した場合は「-p 7」に指定されている模様(=結果が7ヶ所まで表示される)。
    この項目を読んでいる人にはおそらく説明の必要がないことだが、ヒット数が多過ぎて画面が流れてしまう場合は、以下のように検索結果をlessコマンドに渡せばよい(「q」でlessの画面から抜けることができる)。

    recoll -t -A -p 999 -q 'ほげ' | less
    

  • AND検索
    検索文字列を並べる。

    recoll -t -A -p 999 -q 'ほげ' 'ふが'
    

  • OR検索
    「OR」を挟んで検索文字列を並べる。

    recoll -t -A -p 999 -q 'ほげ' OR 'ふが'
    

  • 検索してヒットした箇所の前後3行を表示する

    recoll -d -t -A -p 999 -q 'ほげ' | grep -n -A 3 -B 3 'ほげ' | less
    # (結果)
    :3:common/rclinit.cpp:360::Recoll 1.28.5 + Xapian 1.2.22 [/home/username/.recoll]
    Recoll query: (ほげ)
    30 results
    application/pdf [file:///pass/to/pdffilename.pdf]       [pdffilename]  xxxxxxxx        bytes   
    4-SNIPPETS
    5:6 :  社で課長ほげ山君急で 
    6 :  いよ > < ほげ山君でも、ほげ山君は、 
    # ---(中略)---
    73 :  layout 1 6 html ほげ山君、お疲れ様ほげ山君の作 
    74 :  るよ課長ほげ山君 muchas gracias 
    15-/SNIPPETS
    16-
    17- 
    --
    52-
    53-課長
    54-
    55:ほげ山君。急で悪いんだけど、
    56-
    57-え!?
    58-
    --
    # ---(後略)---
    

    すでに説明した通り「SNIPPETS」〜「/SNIPPETS」で挟まれた部分が、検索した文字列がヒットしたところだが、この結果の表示はヒットした前後のごく狭い範囲しか表示されないので文章の内容が把握しにくい。
    このため、文書全体を「-d」オプションで出力したものをgrepに渡して検索文字列にヒットした部分の前後の行まで表示させるようにしたもの(「/SNIPPETS」の後ろに表示されている)。
    1文書内でヒット数が多過ぎる場合は、「SNIPPETS」〜「/SNIPPETS」が表示されないことがあるが、実用上問題はないだろう。

  • 最初にヒットした1つの文書だけ、結果を表示する

    recoll -n 1 -t -A -p 999 -q 'ほげ'
    

    一応こういうオプションがあるということで挙げたものなので、この項目は読み飛ばしてもいい。説明すると、「-n」は「ヒットした文書をいくつまで表示するか」の上限を指定できるもので、「-n 1」で指定すると、最初にヒットした1つ目の文書の検索結果だけが表示される。デフォルトはn=0で上限なしとなっている。あまり「いくつまで」と制限するような用途が思い付かない。

  • 検索結果に検索した文字列が含まれていない
    ヒットしたから検索結果が表示されているはずなのに、検索した文字列が結果に含まれていない場合がある。これは検索文字列が自動で分割されているため。
    以下は「後方互換性」が「後方」と「互換」と「性」のフレーズに分けられ、文章中の「性」の文字列にヒットした扱いになっているもの。
    フレーズに分割させずに検索する方法は不明だが、上に挙げたように「-d」オプションで出力したものをgrepで絞り込んだ結果を確認すれば、実用上問題はないだろう。

    recoll -t -A -p 999 -q '後方互換性'
    Recoll query: (10 * (後方 PHRASE 5 互換 PHRASE 5))
    36 results
    application/pdf [file:///pass/to/pdffilename.pdf]       [pdffilename]  xxxxxxxx        bytes   
    SNIPPETS
    8 :  相互運用性をナチュ 
    8 :  との親和性向スの操 
    8 :  認識操作性を提エー 
    # ---(後略)---
    

検索サーバによる方法

先日ブラウザ閲覧履歴内全文検索環境を構築した際に検討したFessもしくはHyperEstraierを使うことを考えた。

  • Fess
    まず検索に柔軟性があるFessを検討した(エントリ作成時点で最新バージョンの10.2を使用)。検索しようとするpdfのファイルサイズが書籍であることから100MB以上と大きく、デフォルトではこれらのファイルはクロールされないためContents lentghを増加させたり、クローラに割り当てるメモリ量を増やす必要があった。
    これらの設定を行なったが、クローラへの割り当てメモリを1GB以上に設定しても実際には1GB以上割り当てされず、クロール中にメモリの使用量が増えていき割り当てたメモリの上限に達してメモリに空きが無くなるのが原因なのか、ログファイル(/opt/fess/logs/fess-crawler.log)に以下のようなエラーが記録されて、エラーが起きた際のpdfファイルはその内容がインデックスに登録されなかった。

    (/opt/fess/logs/fess-crawler.log)
    [Crawler-20161112211806-1-1] INFO  Could not serialize object
    

    OCR処理を掛けたソフトウェアは読み取りした全てのpdfで同じものを使用しているため、pdf側の問題は考えにくかった。なおPDF作成ツール(PDF Producer)はAdobe PDF Scan Library 2.2でPDF Versionは1.3(Acrobat 4.x)。pdfboxのバージョンを上げることで改善するのかもしれないが未検証。
    なお、Fessのマニュアルは公式サイトに古いバージョンのものも残されており、これがGoogle検索で引っ掛かってくるため混乱の元となった*1。バージョン10はバージョン9とは設定ファイルや設定の方法が変化しているので注意。

  • HyperEstraier
    次にwwwoffleとの連携でも使用しているHyperEstraierを検討した(バージョン:1.4.13-14ubuntu2)。手順に従って設定し、インデックスを作成するとこちらはエラー無く終了した。しかしHyperEstraierのWebインターフェースの検索フォームからファイルパスを指定して検索してみると、特定のいくつかのpdfが検索されない。調べてみるとインデックスには登録されているが検索結果から[detail]のリンクを確認してみるとテキスト内容が文字化けしていた。インデックスを作成する際に文字コードは自動認識するがこれがうまく行っていなかったようである。このため入力文字コードOCR読み取りした環境であるWindowsに合わせ、CP932を指定して再度インデックスを作成したところ、今度はうまく行ったがサブディレクトリに入っていたWebからダウンロードしたpdfの検索結果が文字化けすることになってしまった。これを防ぐにはOCR処理を掛けたpdfだけを特定して任意のディレクトリに隔離した上でインデックスを作る必要があるが大分面倒な作業になりそうだった。そのほか、インデックスを作る際に検索結果のタイトルの文字化けを防ぐため出力文字コードの指定が必要なのと、検索結果のタイトルが必ずしもpdfのファイル名にならない場合があった。

関連サイト

*1:表示されているページが古いバージョンのマニュアルでもタイトルバーには「Fess 10.2ドキュメント」と表示されるのも紛らわしい

ブラウザ閲覧履歴内全文検索方法についての調査

(2022/10/11)「Firefoxの閲覧履歴からキャッシュを取得・HyperEstraierのデータベースを更新する」を追記
(2020/5/8)「SSL通信の設定について」にSSL通信のキャッシュ・データベース登録について追記

ふとしたときに、ネットのどこかで読んだ文章を読み返したいが、一体どこで読んだのかどうしても思い出せず、閲覧履歴をしらみつぶしに当たっても全く見つけられずに歯痒い思いをすることがある。これを何とかしたいと常々思ってきたため、その解決方法を調べてみた。環境はUbuntu16.04 LTS。


結論

wwwoffleとHyper Estraierで実現できた。以下は解決方法を検討したところから。

ブラウザの拡張機能などでの対応

Chromeでは履歴内を全文検索する拡張機能が存在するが、Firefoxのアドオンは使い勝手が良くない。また複数のブラウザを使い分けていると、ブラウザ別に検索しなければならなくなるのがやや面倒。

  • Firefox
    CacheViewerというアドオンで閲覧キャッシュの全文検索が可能だが、ブラウザのキャッシュサイズを最大(1024MB)に設定していると途方もなく動作が重くなり、実用上支障が大きい。他に同じようなアドオンとしてCacheSearchや、閲覧したページを全てローカルに保存するSloggerといったアドオンがあったようだが、現行のFirefoxでは使えなかったり公開停止となっている模様。
  • Chrome
    Falconという拡張機能で実現されているらしい。ただし調べ物は主にFirefoxで行うことが多いため使い勝手については検証していない。
  • 風博士
    ブラウザそのものに履歴内全文検索の機能が付いているらしい。ただし以下同文。
  • Opera
    Operaもブラウザ自体に全文検索機能が付いていた模様。寡聞にして知らなかった。しかも2008年からであるらしい()。ただし以下同じ。

キャッシュサーバの調査

  • polipo
    簡単に導入でき、ウェブ閲覧を高速化できることで有名になったローカルキャッシュサーバ。キャッシュファイルが平文ではないため、全文検索は不可能。
  • squid
    企業などでも使われるという、polipoより大規模なキャッシュサーバ。キャッシュファイルが平文ではないため、全文検索は不可能。ウェブ検索結果ではnamazuとの組み合わせに触れているページがあるので、昔の古いバージョンは平文だったのかもしれない。
  • wwwoffle
    キャッシュファイルが平文。これが使える。ただしubuntuではパッケージ化されていないため、ソースからコンパイルする必要がある。インストール方法は参照サイトを参照。

検索エンジン

  • Fess
    全文検索サーバ。公式サイトで「5分で簡単に構築可能な全文検索サーバー」と説明されている通り簡単にできそう。Elasticsearchを検索エンジンとして利用しており、Elasticsearchは完全ヒットでなくても検索結果を拾ってくれる利点があるとのこと()。
    使ってみたところ、設定が悪いせいか検索結果から元URLにダイレクトに飛べなかったため、惜しくも選外とした。→(追記)「パスマッピング」で可能かもしれないが試していない。
  • Hyper Estraier
    全文検索システム。wwwoffleのキャッシュファイルを処理することで検索結果から元URLにダイレクトに飛ぶことができる! これが良さそう。設定方法は公式サイトに掲載されている。参照サイトを参照。また、wwwoffleにはHyper Estraierが同梱されているので、別途用意しなくていい
    →(訂正)Hyper Estraierの検索用のウェブページとスクリプトが同梱されているだけで、データベース作成用の実行ファイルは入っておらず、hyperestraierそのものは別途インストールが必要だったので訂正しておく。Ubuntuは標準リポジトリにパッケージが用意されているので、apt-get install hyperestraierでインストールできた。
  • Namazu
    全文検索システム。かなり昔にNamazuを使ったローカルwiki全文検索+検索結果からの元URLジャンプを設定した記憶があるが、検索性能的にHyper Estraierに優位性があるようなので()今回は使用しない。

SSL通信の設定について

SSL通信をキャッシュする

昨今はサイト全体でhttpsでの通信を行なうサイトが一般的となっているが、wwwoffleはデフォルトではhttp通信しかキャッシュできず有用性が低いため、httpsで通信するページでもキャッシュできるように変更する。

コンパイルオプション・設定ファイルの変更

https通信のキャッシュに対応するには、wwwoffleをコンパイルする際に--with-gnutlsオプションを付けておく必要がある。

./configure --with-gnutls

設定ファイル(wwwoffle.conf)は、「SSLOptions」で以下の項目を追記する。

SSLOptions
{
enable-caching = yes
allow-cache = *:443
}
ブラウザの設定

(2022/10/11追記)

後述する通り、Firefoxのプロキシにwwwoffleを設定することができなくなり、この項目は実施する必要がなくなったため読み飛ばしてほしい。以下は記録として残しておく。

そして、「(wwwoffleキャッシュディレクトリ)/certificates/root/root-key.pem」のファイルが既に存在している場合、パーミッションが777になっているとうまく行かないので一旦ファイルを削除して、wwwoffleを再起動して同ファイルを再度作成させておく。
次に、「http://(サーバ):(wwwoffleポート番号)/certificates/root」のURLをブラウザで開き、[Download Certificate]から証明書をブラウザにインストールする。
「証明書の信頼性を設定してください」のダイアログで「ウェブサイトの識別に使用する」にチェックを入れると、httpsページもキャッシュすることができるようになる。

注意する点として、オンラインバンクのような機微情報を扱うサイトについては、通信内容をキャッシュしないよう「disallow-cache =」にオンラインバンクのサイトを登録する必要がある。
手元の環境では、設定が悪いのかもしれないが、Amazonや日経など一部のページでスタイルシートを読み込まなかったり、twitterなどでページが全く表示されなかったりといった不具合があった。そうしたサイトはブラウザ設定の「プロキシなしで接続」リストに記述して、wwwoffleを介さずにアクセスするようにした。

SSL通信のキャッシュをHyper Estraierデータベースに登録する

Hyper Estraierのestwolefindコマンド(/usr/bin/estwolefind)がデータベース作成の対象とするディレクトリは、estwolefindコマンドの中でwwwoffleキャッシュディレクトリ(/var/spool/wwwoffle)の下にあるhttpディレクトリが指定されていて、httpsでアクセスしたページはHyper Estraierのインデックス対象とならない。

そこで、estwolefindコマンドをコピーしてestwolefind-httpsのように別の名前を付け、ファイルの中身の'http'を'https'で全置換した上で実行すれば、httpsでアクセスしたページもHyper Estraierのインデックスに追加することができる。

Firefoxの閲覧履歴からキャッシュを取得・HyperEstraierのデータベースを更新する

(2022/10/11追記・2022/10/13 スクリプトを修正(「2. wwwoffleへ昨日の閲覧履歴を取り込む」の箇所))

上で書いた通り「証明書問題の発生」の不具合が発生したため、セキュリティ期限切れのFirefoxを使い続けるのも良くないので、重い腰を上げて対応することにした。

wwwoffleはブラウザのプロキシに設定する以外にも、端末からコマンドを実行することでウェブページのキャッシュを取得できる。ブラウザの閲覧履歴を取得して、そのURLをwwwoffleコマンドに指定してページを読み込ませてやれば、ブラウザのプロキシにwwwoffleを指定する必要がなく、証明書問題を回避することができる。

wwwoffleを使う目的は、ブラウザの閲覧履歴に登録されたページを全文検索(するためにキャッシュを取得)することであってオフラインモードの利用ではないので、プロキシに設定できなくても問題はない。

以下のスクリプトを/etc/cron.dailyに置いておけば(パーミッションを755にするのを忘れずに)、一日に一回、昨日の閲覧履歴がwwwoffleにキャッシュされ、hyperestraierのインデックスに登録されるようになる。
スクリプト3行目cpコマンドの「user-name-here」の箇所はユーザー名に、「profile-name-here」は、Firefoxで使用しているプロファイル名に置き換えること。

#!/bin/bash
## 1. Firefoxのデータベースから閲覧履歴をファイルに書き出し
cp /home/user-name-here/.mozilla/firefox/profile-name-here/places.sqlite /tmp
sqlite3 /tmp/places.sqlite "SELECT datetime(a.visit_date/1000000,'unixepoch','+9 hours') AS visit_date, b.url FROM moz_historyvisits AS a JOIN moz_places AS b ON a.place_id=b.id WHERE 1 ORDER BY a.visit_date ASC" > /tmp/sqlite3-firefox-history.txt
sqlite3 /tmp/places.sqlite '.exit'
rm /tmp/places.sqlite

## 2. wwwoffleへ昨日の閲覧履歴を取り込む
# 昨日の日付を取得
yesterday=`date --date '1 day ago' "+%Y-%m-%d"`

# grepで昨日の履歴を抽出し、wwwoffleで取り込めるようURLだけにして、localhostやローカルファイルの履歴は削除してファイルに出力
grep "$yesterday.*" /tmp/sqlite3-firefox-history.txt | sed -e "s/$yesterday.*|//g" | sed -e '/.*localhost.*/D' | sed -e '/^file:*/D' > /tmp/sqlite3-firefox-history-${yesterday}.txt

# wwwoffleに昨日の履歴を取り込む
while read LINE
do
    wwwoffle -d 0 $LINE
done < /tmp/sqlite3-firefox-history-${yesterday}.txt

# 一時ファイルを削除
rm /tmp/sqlite3-firefox-history-${yesterday}.txt
rm /tmp/sqlite3-firefox-history.txt

## 3. hyperestraierのインデックスを更新
# データベースをコピー
cp -aRpv /var/spool/wwwoffle/search/hyperestraier/db /var/spool/wwwoffle/search/hyperestraier/db-tmp
# コピーしたデータベースのインデックスを更新
estwolefind /var/spool/wwwoffle | estcmd gather -cl -fm -il ja -bc -px @uri -px _lfile -sd -cm /var/spool/wwwoffle/search/hyperestraier/db-tmp -
# コピー元のデータベースを削除
rm -rf /var/spool/wwwoffle/search/hyperestraier/db
# コピーしたデータベースを、元のデータベースのディレクトリ名に変更
mv /var/spool/wwwoffle/search/hyperestraier/db-tmp /var/spool/wwwoffle/search/hyperestraier/db

本来はデータベースから閲覧履歴を出力する段階で、昨日の日付に絞って出力した方がよいのだろうが、sqlite3の使用法を調べるのが面倒だったので、出力したファイルの方から昨日の履歴を取り出すことにした。
「wwwoffleに昨日の履歴を取り込む」の箇所は、URLリンクを記述したhtmlファイルを出力して以下のようにしても履歴を取り込むことができるのだが、コアダンプを出力して処理が停止しまうことがあったため、一行ずつ読み込むことにした。

wwwoffle -d 0 /tmp/sqlite3-firefox-history-${yesterday}.html

問題なく動作しているのが確認でき、晴れて最新版のFirefoxを使うことができるようになった。
運用開始から6年が過ぎ、閲覧キャッシュは50Gを超え(画像等は設定で除外している)、インデックスの更新に半日がかかるようになってしまった。

wwwoffleをプロキシに指定することができていた古いバージョンのFirefox ESR版(firefox-esr(91.11.0esr))は更新しないままにしておき、wwwoffleのオフラインモード(「wwwoffle -off」)を使って、消えてしまったウェブサイトを(wwwoffleのキャッシュに残っている場合に)閲覧する用途として使うことにしたい。

その他

  • 検索しても新しいページがヒットしない場合
    端末から「wwwoffle -status」を実行して「State : offline」になっていればキャッシュを取得しない状態なので「wwwoffle -online」でオンラインにすればキャッシュの取得が実行される。後はHyper Estraierでインデックスを更新してやればよい。
  • Hyper Estraierの検索結果画面の初期状態でフォームにフォーカスを当てない設定
    一般的な話ではないが、FirefoxアドオンVimperatorやChrome拡張Vimium(いずれもキーボードオンリーでブラウザを操作するブラウザ拡張)を使っていて、マウスを使わずにブラウザを操作している場合に、Hyper Estraierの検索結果のページ表示直後の状態だと入力フォームにフォーカスが当たっていて、いちいちEscを押してフォーム入力状態を抜けなくてはならないのが煩わしく感じる。
    これを解決するため、estseek.tmplの295行目を以下のように修正した。この修正をしても、「検索前」の画面では初期状態として入力フォームにフォーカスが当たるままとなるので面倒はない(余談として、元のコードで「#」を数えている箇所があるが、なぜ「#」を数えているのかは分からなかった)。

    <script type="text/javascript">function startup(){
    if((document.location + "").indexOf("phrase") != -1) return; // ←修正
    //  if((document.location + "").indexOf("#") != -1) return;    // ←元
    var elem = document.getElementById("phrase");
    if(elem) elem.focus();
    }
    

課題点など

  • 他の端末から利用する際の不具合
    ローカルネットワークの別のPCからwwwoffleのキャッシュサーバを利用しようとすると著しく反応が遅いが原因不明。時おりローカルホストからのアクセスでも反応が遅いことがあった(→ローカルホストからの反応が遅いのはwwwoffleやpolipoの再起動で改善した)。

    また、スマホやタブレット端末のプロキシにwwwoffleを設定してhttpsのページを閲覧しようとしたところ、iPhoneの場合、Safariでは警告が出て閲覧できたりできなかったり、Firefoxは警告が出て閲覧不能、はてなブックマークアプリも閲覧不能だった。Androidの場合は証明書を入れても閲覧できなかった。このためスマホやタブレットからの利用は断念した。これらは以下の項目と同様に、スマートフォンがwwwoffleの証明書を受け付けないのが原因であると思われる。

  • Chromeから利用する際の不具合
    Chromeで使う際、オプションの「--proxy-pac-url=」で自動プロキシ設定を指定しているが、どうもwwwoffleに接続していないような気がする。Firefoxをメインで使っているのであまり気にしていないが、Chromeを使う場合は検討が必要かもしれない。
    (追記)
    結論としては、現状Chromeからwwwoffleを使うことはできない。
    理由としては、wwwoffleの証明書がChromeの様式と合わないことが原因らしい。
    以下は詳しい内容。

    chrome72ぐらいからproxy-pac-urlにfile://プロトコルを受け付けなくなったらしく、webサーバの公開ディレクトリにproxy.cfgを置いて、http://で記述してやれば接続できる。

    At some point (around Chrome 77 it seems), Chrome stopped accepting file:// URLs for --proxy-pac-url.

    you are probably better either installing a browser plugin that lets you define PAC settings, or use an http(s) PAC file.

    ただし、Chromeでは以下のエラーが出てwwwoffleの自己署名証明書が受け付けられなかった。

    この接続ではプライバシーが保護されません
    yahoo.co.jp では、悪意のあるユーザーによって、パスワード、メッセージ、クレジット カードなどの情報が盗まれる可能性があります。詳細
    NET::ERR_CERT_COMMON_NAME_INVALID
    このサーバーが yahoo.co.jp であることを確認できませんでした。このサーバーのセキュリティ証明書で SAN(サブジェクトの別名)が指定されていません。設定が不適切であるか、悪意のあるユーザーによって接続が妨害されている可能性があります。


    これは、Chromeの仕様変更により、ドメイン名のチェックにSANを使用するようになったからとのこと。

    ローカル環境でhttpsを実現するために、オレオレ(自己署名)SSL証明書を作成したのですがchromeではNET::ERR_CERT_COMMON_NAME_INVALIDとなってしまいました。
    Chromeの仕様変更により、ドメイン名のチェックをCommon Name(通称CN)ではなくSubject Alternative Names(通称SAN)を参考にする様になったためだそうです。


所要時間

調査・設定には10時間を所要した。だが、「自分にパーソナライズされた(閲覧履歴内の)ウェブ全文検索」という利便性は代えがたいものになるだろう。

参照サイト

Ubuntu16.04 LTSを自作PC(Skylake世代)にインストール

※↑ もくじジェネレータ for はてダ(一部改変) で自動生成

インストールの経緯

マザーボードを変えるなどして永らく使用していた自作PCが突然フリーズしたりPOST画面で止まるなどといった症状が頻発するようになった。これまではPC内部のダスター清掃を行って改善していたが、ここに至って症状の改善がみられずマザーボードの寿命と考えられたため、今回自作PCを新規に作成の上OSも最近のUbuntuに更新することにした。

バージョン選択

安定使用を考えたいことから、当初Ubutu14.04LTSの導入を考えたが現行のSkylake世代に対応しているのはUbuntu16.04 LTSからである模様*1。試しにUbuntu14.04LTSをインストールしたところ、GPUの能力が引き出せず最低限のグラフィック描画能力となってしまい、また音も鳴らない。このためUbuntu16.04LTS以外に選択の余地はないと考えられた。

インストール

  • UEFIインストールについて
  • インストールの最中に「UEFIインストールを強行しますか」と出るが「戻る」を選択してUEFIインストールは行なわないこととした。UEFIインストールすると、GPTパーティションとなって、このディスクから起動する際に、従来のGRUB時代のシステムが起動メニューに表示されず起動できなくなってしまうため。
    UEFIインストールするメリットとしては起動システムに2TB以上のパーティションが設定できる点。起動システム以外の(データ用などの)ストレージについては従来のGRUBインストールでも2TB以上のパーティションが設定できる。

UI関連

デスクトップ環境はデフォルトのUnityのまま。Ubuntu11.10でUnityが導入され使い始めた当初は違和感があったが、長く使い続けるにつれ特に不満を感じなくなった。

  • ハイコントラストテーマの適用
    標準のテーマは白っぽくて目が痛いので、配色がハイコントラストのテーマを使用したいが、システム設定→外観→テーマを確認してみると、「黒」地に「白」ハイコントラストの配色が存在しない。そこでUbuntu12.04で使用していたハイコントラストのテーマを流用することにする。
    Ubutu12.04の/usr/share/themes/HighContrastInverseと/usr/share/icons/HighContrastInverseを、16.04の/usr/share/themes/と/usr/share/icons/にそれぞれコピーし、gnome-tweak-toolパッケージを入れて概観→テーマ→GTK+で「HighContrastInverse」を指定することで、ハイコントラストのテーマが適用される。

    (追記 2020/6/1)
    ハイコントラストのテーマを適用すると、Firefox Quantumでリンクの配色が変更できなくなる。未訪問が白、訪問済が緑で固定となって、未訪問の場合にリンクかどうかが分かりにくくなる。配色を変更するには、userContent.cssまたは拡張機能Stylishを使って、スタイルシートから設定する必要がある。
    userContent.cssの設定についてはユーザスタイルシートによるカスタマイズ(1) - えむもじらを参照。
    cssについては以下のように設定する。

    a:link {
    color: green !important;
    }
    a:visited {
    color: red !important;
    }
    


  • 半透明化
    compizconfig-settings-manager,compiz-pluginsパッケージをインストールし、compizconfig-settings-managerを「ccsm」で起動、アクセシビリティ→不透明度・明度・彩度を選び、不透明度タブのWindow Specific Settingsからウィンドウにany,ウィンドウの値に80のように設定する。ウィンドウを指定して透明度を変えたい場合はウィンドウクラスを調べ、ウィンドウにclass=Firefoxのように指定する。ウィンドウクラスを調べるにはwmctrlパッケージをインストールし、端末からwmctrl -xlを実行する。ウィンドウの値は下げるほど透明に近くなる。決してウィンドウにanyを指定したままウィンドウの値を0にしてはいけない(何も見えなくなる)。

  • オーバーレイスクロールバーの無効化
    オーバーレイスクロールバーはどうも使い勝手が悪く感じる。以下を実行することで無効化できるとのこと。

     gsettings set com.canonical.desktop.interface scrollbar-mode normal
    


  • タスク切り替え
    タスク切り替えでアプリ毎にウィンドウがまとめられてしまい、2つ以上のウィンドウを持つアプリの場合にウィンドウ切り替えがクイックにできないのが不便。
    ccsm→ウインドウマネジメント→Static Application Switcher(or アプリケーションスイッチャー)を有効にすると、アプリが同じでも通常通りにウィンドウ単位での切り替えが可能になる。

キーカスタマイズ

何はともあれキーカスタマイズ。

  • キーバインド変更(Emacsキーバインド)
  • UIをEmacsキーバインドで操作できるようにする。 gconf-editor→/desktop/gnome/interface/gtk_key_themeをEmacsにする。
  • xkbで無変換キーをALTに設定
    キーカスタマイズと言えばxmodmapだったが、Ubuntu16.04では入力システムがiBusに変わったためにxmodmapがうまく動作しないらしく、Ubuntu16.04で任意のキーの入れ替え - 仙豆のレシピにて、xmodmapでキーの入れ替えを設定しても日本語入力のON/OFFを一度でもするとxmodmapで設定したものが消えるという不具合が報告されていた。
    また、xkbでキーバインドを変更する – Happy My Lifeによると「Xmodmapは事実上の廃止状態で、Ubuntu 13.10以降ではxkbを利用するのが正攻法」とのことで設定方法が示されていた。以下サイトより引用。

    1. ~/.xkb/keymapフォルダにベースとなる設定ファイルを格納
    2. ~/.xkb/symbolsフォルダに変更するキーバインドを定義したファイルを格納
    3. 起動時に設定が反映されるように設定

    紹介の手順に従って~/.xkb/keymap/以下にベースのファイルを作成し、「無変換」を「右ALT」にしたいので~/.xkb/symbols/(適当な名前のファイル)を以下のように設定した。

    partial modifier_keys
    xkb_symbols "swapkeys" {
      replace key <MUHE> { [ Alt_R ] };
    };
    


    • 副作用1(タスクスワップの不具合)
    • 当初、置き換えキーに左ALT(Alt_L)を指定したところ、Alt+Tabでタスクを切り替えするときにALTを離しても押したままの状態になって、再度ALTを押し直さないとタスク切り替えのポップアップウィンドウが消えないという煩わしい状態になった。この不具合は、xkbでの置き換えキーを右ALT(Alt_R)に指定することで改善した。
    • 副作用2(EmacsとUnityのHUD)
    • EmacsでAlt-vを(上記xkbのカスタマイズで「無変換-v」)押してPageUpした際に、すぐAltから手を離すとUnityのコマンド入力のHUDが表示されるという煩わしい状態になった。ランチャーにはGnome doといったランチャーアプリやコマンドラインを使うので、システム設定→キーボード→ショートカット→Launchers→「HUDを表示するキー」を無効に変更した。この不具合は上述のxkbによるキーカスタマイズをしていなければ発生しない。 以下の「ワンショットモディファイヤの実現」で使用している、「窓使いの憂鬱」を使ってもxkbと同様のキーカスタマイズが可能だと思われるが試していない。
  • 窓使いの憂鬱でワンショットモディファイヤを実現
    ワンショットモディファイヤとは、「そのキーを単体で押す(正確には押して離す)とそのキー本来の働きをするが、他のキーと組み合わせて押すとモディファイヤキーとして働く」という機能で、モディファイヤキーとはCtrl・Shift・Altキーのこと。日本語入力にSKKを使用しているユーザーはShiftキーを頻繁に押すことになるため、この機能は是非導入しておきたい。
    Ubuntuでワンショットモディファイヤを実現するには、「私家版窓使いの憂鬱(Linux対応版)」を使うと簡単に実現できそうである。Ubuntu 14.04にMozcと窓使いの憂鬱をインストールする - Symfowareで、Ubuntu14以降で「私家版窓使いの憂鬱(Linux対応版)」を使う方法と自動起動させる設定が紹介されている。Ubuntu16でもこの方法で動作するので適用する。
    リンク先の手順の通り窓使いの憂鬱をダウンロードして、以下を実行する。

    ./configure --with-boost-libdir=/usr/lib/x86_64-linux-gnu/
    

    makeに失敗するが、msgstream.hの「setp」を「this->setp」で全置換すればmakeが通るとのこと。
    セミコロンをShiftキーのワンショットモディファイヤとするには、~/.mayuに以下のように記述する。

    include "109.mayu"
    keymap Global
    mod shift += !!Semicolon
    


  • iBusでのxkbカスタマイズの無効化問題
    iBusでは入力メソッドを切り替えると.xmodmapや.xkbが無効になってしまう不具合がある。
    今回はiBusを呼び出す際のシェルスクリプトで対応した(以下の「日本語入力」中「iBusの改悪について」を参照)が、この不具合への対応がUbuntu 15.04: キーボードのカスタマイズ設定 - 児童小銃Ubuntu 16.04: キーボードのカスタマイズ設定 - 児童小銃)で紹介されていたので、再設定が必要になったときに確認してみたい。

日本語入力

    日本語入力には慣れ親しんだSKKを使用したい。
  • 入力メソッドにscimが使えない
  • 長年愛用してきたインプットメソッドのscimだったが、Ubuntu16では直接入力モードに入ることができない不具合があり使えなかった。同様にfcitxもうまく入力ができなかったのでiBusを使うこととした。
  • 使いにくいiBusをカスタマイズ
  • これまで使ったことの無かったiBusというインプットメソッドだが、Ubuntu16.04でインストールできるiBus1.5では「IMEの直接入力と日本語入力の切り替え」という概念が無くなり、「IMEの種類そのものを切り替える」という考え方になったとのことで、従来のような「日本語入力のオン/オフ」という操作が存在しない。
    標準のままだと日本語入力と直接入力との切り替えに支障があるようで、グローバルホットキーにシェルスクリプトを設定することで対応する方法がiBus1.5でも快適にIMEをON・OFFする 〜VimやVimperatorを念頭に〜 | PCと遊ぶ日々の記録に紹介されていた。
    これを参照して変換キーと無変換キーに、以下の内容のシェルスクリプトを設定することで対応することとした。また、iBusで入力メソッドを切り替えると.xkbの設定が無効になる不具合もあったため、IMEのオンオフを切り替えるたびに設定し直すようにした(2行目)。
    imeon.sh(変換キーに設定)

    ibus engine skk # ibus-skkの有効なキーボードレイアウトを選択
    xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY # xkb設定を再読み込み
    

    imeoff.sh(無変換キーに設定)

    ibus engine xkb:jp::jpn  # 日本語変換が有効でない日本語レイアウトを選択
    xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY # xkb設定を再読み込み
    

  • アプリケーションごとにIMEの状態を保持する
    iBusIMEの状態がすべてのアプリで共有され、アプリごとにIMEの状態を保持してくれない。これでは不便。
    システム設定→テキスト入力→使用する入力ソースに「日本語(SKK)(IBus)」「日本語」のように登録しておき、「ウィンドウごとに異なるソースを使用する」→「新しいウィンドウでは現在の入力ソースを使用する」を選んでおく。これによりウィンドウ別で「IMEの状態を保持」することができる。
    IMEの状態をオフにしておきたいアプリ(Emacsなど)では「次のソースへ切り替え」に指定したショートカットキーを押して入力ソースを「日本語」にする。が、面倒なのでwmctrlでactivateにした上で、上のimeoff.shを呼び出すグローバルホットキーを設定している。

アプリ

参照サイト

記事中の情報は以下のサイトなどから得た。