POSTD PRODUCED BY NIJIBOX

POSTD PRODUCED BY NIJIBOX

ニジボックスが運営する
エンジニアに向けた
キュレーションメディア

Tom Buckley-Houston

本記事は、原著者の許諾のもとに翻訳・掲載しております。

もしラップトップのディスプレイが壊れたら、文句を言いつつもお金を出して修理してもらうのが普通でしょう。修理用のパーツが届くまでの間は、外付けディスプレイでしのぐのでしょう。面倒ではあるけれど、それで作業が止まってしまうわけではありません。でも、いちばん近い町までバスで2日かかるうえに、貴重品を安心して送れるサービスも整っていない場所にいるとしたらどうでしょう?私の置かれた状況がまさにそれでした。インド北部のラダック、ヒマラヤに囲まれたところでそんな目にあったのです。私がここに来たのは、日々の仕事から離れて執筆に専念するためでした。執筆にはコンピュータが欠かせません。でも、日々の生活はそれほどコンピュータに依存していなかったので、ハッカーらしい解決策をゆっくり考えてみました。

私のハックのポイントは、スマホを「モニター」として使ったことです。VNCやXのポートフォワーディングで映像出力を直接流すという意味ではありません。もちろん、時にはそれらの手法を使うこともありましたけどね。スマホをVNCなどのインターフェイスとして使うというよりは、ラップトップのキーボードでスマホ側のアプリ操作することのほうが多かったと思います。Termuxを使ってラップトップにSSHで入ったり、ChromeやGmailやWhatsappを使ったりしたのです。すべてを完全に掌握するまでには数日かかりました。でも、執筆を無事再開できたうえにGithubに Pull Requestを送る こともできました。あなたが現時点で何も不自由していなかったとしても、私のハックから何かを得られるのではないでしょうか。

また、きわめて貧弱なインターネット環境での私の執筆スタイルについても説明します。これはディスプレイが壊れた件とはまったく無関係ですが、これらのハックを私が日々どんなふうに使っているかを紹介できるでしょう。

私はLinuxとAndroidを使っているので、ここで紹介する内容の中にはWindowsやMacやiOSでは使えないものもあるかもしれません。しかし、全体的な考え方はどこでもあてはまるものです。私の環境について説明しておきましょう。スマートフォンはSonyのZ3 Compact、そしてラップトップはDellのXPS 13(2015年モデル)です。Z3 Compactはroot化していますがROMは書き換えていません。XPS 13にはArch Linuxを入れています。

はじめの一歩

映画『オデッセイ』のマット・デイモンもそうでしたが、最初は右も左もわからない状態です。はじめの一歩を踏み出すにはとても時間がかかり、痛みを伴う可能性があります。

スマホ側からラップトップにSSHで接続できれば理想的なのですが、あらかじめそんな設定をしている人はまずいないでしょう。幸い、自動化されているところもあります。たとえば、スマホのテザリング機能をオンにしたら、ラップトップが自動的に接続するようになっているかもしれません。仮にそうしていなかったとしても、USB経由でのテザリングを使えば、ラップトップ側のOSのDHCPクライアントが自動接続してくれるはずです。それでも、 大きな 障害が二つ残ります。ラップトップにSSHデーモンをインストールすることと、ラップトップのIPアドレスを取得することです。

ここでは、OSのブートプロセスについての記憶だけが頼りになります。皆さんもきっと、デスクトップが真っ黒になってしまったことが一度はありますよね?Grubのブートメニューで上矢印キーを押し、ちょっと待ってからユーザー名とパスワードを入力すれば、デスクトップにたどり着けるということを私は知っていました。さらに幸運なことに、画面上部の2行ぶんくらいだけはディスプレイが生き残っていたのです。生き残っているとはいっても、表示が自動的に更新されるわけではありません。物理的に力を加えてディスプレイをひねってやらないと、表示は更新されませんでした。私は次に、Alt+スペースを押しました。ターミナルを立ち上げるショートカットです。マウスカーソルやコマンドプロンプトは見えませんでしたが、Enterキーを何度か押してプロンプトを表示させ、何が起こっているのかを隙間から確認できるようにしました。

USB経由のテザリングの自動接続でインターネットにはつながっていたので、次に sudo pacman -S openssh (もちろん、最初のsudoのときにはパスワードを入力しないといけません)とタイプしてから sudo systemctl enable sshd && sudo systemctl start sshd としました。成功です。他に何も問題は出ませんでした。これらのコマンドは、システムによって異なるかもしれません。

ちょっとしたヒント:Linuxの場合なら、画面が真っ暗になったときには(Ctrl+Alt+F1などの)VTを使うほうがいいでしょう。これなら、ログインしたらすぐにプロンプトが現れます。つまり、デスクトップが読み込まれるのを待たずに、すぐopensshなどのインストールを始められるということです(Hacker Newsで kbaker からいただいた案です)。あるいは、OSに用意されているであろうコマンド実行用ショートカットも使えます。たいていのLinuxはAlt+F2でテキスト入力欄が現れて、たとえば xterm などとタイプすればそれを起動できます。OS XならAlt+スペースです。ターミナルアプリを起動した直後には、コマンドプロンプト上にフォーカスがあるものと推測できます。私の知る限り、OS XにはSSHデーモンが標準でインストールされています。 sudo systemsetup -setremotelogin on とタイプするだけで起動できるでしょう( @notpeter から教わりました)。

こういうこともあるので、新しいラップトップを手に入れたらまずはSSHデーモンを入れて、強力なパスワードを設定しておくことを強くお勧めします。Webサーバーにはまず間違いなくSSHデーモンがはいっているでしょう。ラップトップよりもよっぽどインターネット上にさらされているWebサーバーでもそうなのですから、ラップトップにSSHデーモンを入れてもセキュリティ上のリスクはそんなに大きくなりません。ただし、強力な認証方式を使うのが前提です。鍵交換方式の認証がベストでしょう。

さあ、次はラップトップのIPアドレスを調べる番です。 ifconfig とタイプしてEnterキーを押し続けることで、 inet 192.168.42.177 netmask 255.255.255.0 broadcast 192.168.42.255 という行を読み取ることができました(最初のアドレスがこのラップトップのIPアドレスで、私の場合は192.168.42.177でした)。後から気づいたのですが、root化したAndroid機があるのだから、こんなことをしなくても単に /data/misc/dhcp/dnsmasq.leases を見るだけでよかったのです。Androidをroot化するのは簡単で、よっぽどのことがない限りは King Root というアプリでroot化できます。さらに別の方法もあります(Hacker Newsで sujay_m からいただいた案です)。この方法はクロスプラットフォームであるというメリットがあります。IPアドレスは使わずに、 Avahi でローカルネットワークドメインを作るのです。これをラップトップにインストールすれば、 HOSTNAME.local でアクセスできるようになります(HOSTNAMEの部分は、ラップトップの hostname で置き換えます)。

ここまでが重要です。SSHサーバーを実行してIPアドレスを取得することができなければ、おそらくディスプレイを修理する以外に手はないでしょう。あとは、SSHクライアントに接続情報を教えてやるだけです。デフォルトのポートは 22 なので、私の場合は ssh://192.168.42.177:22 でした。

SSHクライアント

SSHははじめの一歩に欠かせないものですが、現時点で私が最も多用するアプリでもあります。後でお話しますが、私の作業時間の大半は neovim を使った執筆だし、リモートサーバー上でのWebブラウズには elinks を使っています。Androidで動くSSHクライアントならどれでも、ラップトップ上でのsudo作業くらいなら問題なくこなせるでしょう。でも、長い目で見て日常作業に使うことを考えると、その使い勝手はアプリによって大きく異なります。

少なくとも二種類のSSHクライアントを入れておくことをお勧めします。後でお話しますが、ラップトップのキーボードをスマホの入力に使おうと試行錯誤していたときに、標準入力がフリーズしてしまうことが何度かありました。そんなときにプロセスを殺すには、別のSSHクライアントでラップトップにログインするしかありません。

AndroidのSSHクライアントをいろいろ試してみましたが、完璧なものは見つかりませんでした。いま私が常用しているのはTermuxで、ときどきConnectbotを使うこともあります。それ以外も含めて注目すべきSSHクライアントをまとめました。私の使用経験が少ないものから順に並べています。

Juice SSH

ディスプレイが壊れた当時に私が知っていたアプリがこれでした。リモートのクラウドサーバーにアクセスするために使っていたのです。使い勝手がよくて特に不満はなかったのですが、常用するとなると大きな弱点がありました。環境変数XTERMを設定できないのです。つまり、ターミナルの色数が制限されてしまうということです。 XTERM=xterm-256colorXTERM=screen-256color よりも劣る環境なんて我慢できません。

後述しますが、今の私のお気に入りであるTermuxと同じく、Juice SSHも mosh に対応しています。これはSSHを改良したプロトコルで、ネットワーク接続が不安定な場合に使えるものです。

Server Auditor

モダンな見た目でUIも洗練されており、使いやすくなっています。すばらしいアプリです。ただ、重大な問題がひとつあります。Altキーと他のキーの組み合わせに対応していないのです。これは、 neovimtmux (ひとつのターミナル内で複数のターミナルを扱うソフトウェア)などを使う場合に致命的です。

さらに、UTF-8文字の文字幅を正しく伝えてくれないのです(不思議なことに、ここで挙げたSSHクライアントの大半が同じ問題を抱えています)。まあこれはそんなに問題にはならないでしょう。 powerlinevim-airline などを使えばいいのです。

tmuxとpowerline、neovimとvim-airlineを使ってこの記事を編集しているところ

tmuxとpowerline、neovimとvim-airlineを使ってこの記事を編集しているところ

ターミナル上で長い時間をすごす人にとって、ステータスラインはとても便利です。現在時刻やバッテリーの残量だけでなく、tmuxなら実行中のプロセスやターミナルも表示できます。でも、たとえば「⚡」などの特殊文字を使ってしまうと、ステータスラインの末尾が新しい行に押し出されてしまいます。時刻が変わったりなどの理由でステータスラインが再描画されるたびに、ステータスラインがどんどん上にあがってしまい、最後にはターミナルの内容が何も見えなくなってしまうのです。

これを何とかするのは簡単で、要するにそういった文字を使わないようにに設定すればいいのです。私の場合は powerline を使うようにしましたが、それ以外のステータスラインもあります。面白いことに、私が neovim 上で使っている vim-airline にはこの問題がないようです。なので、こちらは何もいじっていません。おそらく、 iutf8 フラグを設定していないSSHクライアント( stty とタイプすると、設定されているフラグを確認できます)と tmuxpowerline 統合機能を組み合わせたときに発生する問題だとは思うのですが、なぜかConnectbot(後述します)は powerline を完璧に描画します。

Terminal Emulator

このアプリの注目すべき点は、Termux(後述します)と同様に実際のシェルを提供してくれ、マウスのエスケープシーケンスにも対応しているところです。ここでいうシェルとはAndroidの実際のシェルであり、デフォルトのAndroidに付属するコマンドなら何でも(たとえば ssh なども)使えます。 busybox をインストールすれば、 catfindgreppingsed などといったおなじみのコマンドたちも使えるようになります。

マウスのエスケープシーケンスはとても興味深いものです。タッチジェスチャーがマウスのイベントに変換されるのです。つまり、スワイプすれば画面をスクロールできるし、タップした場所にカーソルが移動するということです。これは、コマンドラインだけではなく他のアプリ上でもとても便利です。たとえば、テキストベースのWebブラウザである elinks でも使えます。詳しくは後述しますが、貧弱なインターネット環境で過ごすすべての旅行者にとって、タッチベースの elinks は注目に値するものです。

elinks

elinks

このクライアントにもちょっとした問題があって、日常的な使用には難があります。 screen-256color はサポートしているようなのですが、実際には16色しか使っていないように見えるのです。また、Alt+HomeやAlt+Endといった組み合わせに対応していません。

Connect Bot

私が日々の作業で多用しているクライアントのひとつす。これとTermuxを切り替えて使っています。大きな利点は、画面描画を更新する際のFPSが最大であることと、フォントを完璧にレンダリングすることです。高いFPSを実感できるのは、私がTTYへのグラフィックレンダラ( hiptexttexttop )に関する作業をしているときだけです。フォントのレンダリングは純粋に美的感覚の問題です。大半の時間をテキストベースで過ごす以上は、UTF-8文字などのあらゆるグラフィックが気になるのです。また、 powerline ではフォントへのパッチを管理しており、トライアングルセパレーター(シェブロン記号<>を塗りつぶしたような文字)のような文字を追加できるようになっています。これらの文字を完璧にレンダリングしてくれるクライアントはConnectbotだけなのです。いったいなぜでしょうね。

しかし、他の多くのクライアントと同様に、Connectbotも外部のカスタムフォントには対応していません。そこで、ちょっとしたハックが必要になります。スマホのrootを取っているのなら話は簡単で、 /system/fonts/DejavuSansMono.ttf をお気に入りのフォントで上書きしてから再起動するだけのことです。

私はそれ以外にもちょっとしたハックをしています。 Auto Hide Soft Keys のインストールです。というのもConnectbotは、Back、Home、Menuなどの「ソフトキー」を隠してくれないのです。スマホをラップトップの画面代わりに使うなら、できる限り画面全体を活用したいですよね!

ConnectbotはAndroid用のSSHクライアントとしては最も古くからあるもので、機能的にも成熟しています。さらに Githubリポジトリ の動きも活発です。私がこれをメインアプリとして使わない理由は、CtrlキーやAltキーとの組み合わせがうまく動かないことが多すぎるからです。この件については GithubにPull Request が登録されています。

Termux

私が最終的にたどりついたのが、このクライアントです。いろいろ優れたところがありますが、私がこれを常用する最大の理由は、あらゆるキーコンビネーションに完全に対応しているからです。 neovim にAltキーとの組み合わせを認識させるところでちょっとした問題はありますが、それはまた別の話。気になる点があるとすれば、 powerline 上の特殊文字をきちんと配置してくれないというUTF-8の文字幅問題を抱えていることと、画面描画を更新する際のFPSが低いことあたりですね。あとは、Termuxでのパッチ済み powerline のフォントの配置がおかしく見えるところくらいでしょう。

ちょっと脱線しますが、予期せず見つけた重要な発見についてここで説明しておきましょう。Termuxには、 mosh とマウスのエスケープシーケンスの組み合わせによるすばらしい機能があります。どういうことかというと、リモートのサーバーに mosh を入れると、リモートの elinks を指で操作できるようになるのです。リンクをクリックしたり画面をスクロールさせたりといった操作で、いちいちソフトキーボードを操作する必要はありません。最初に発見したときには別になんとも思わなかったのですが、不安定な2G接続や検閲されたインターネット接続などの状況下でのことを考えてみましょう。 mosh には、 ssh に比べて大きく優れている点が二つあります。接続が途切れたときにも対応できるという点と、画面上で更新された箇所だけしか送信しないのでネットワーク帯域にやさしいという点です。接続が途切れると、 mosh は画面の上部に青いバーを表示して、接続の再開を待ち続けます。 ssh のようにフリーズしてしまうことはありません。サーバー上で tmux を使っているなら、クッキーやタブを使ったブラウザのセッションも、インターネットパイプを用いて信頼性の高い状態で維持できます。

中国の片田舎でバスに乗って移動しているときのことを考えてみましょう。GmailをチェックしたりGoogle検索したりするために必要なネットワーク帯域は、毎分ほんの数キロバイト程度で済むのです。そのためだけにでもTermuxを使う価値があると思います。

Termuxには、他のクライアントと比べて優れた点がたくさんあります。

  • 実際のシェルが使える。jailやchrootのようなものなので、ネイティブのファイルシステムをマウントして、Termux用のリポジトリから apt update && apt-get install mosh などとしてバイナリをインストールする必要があります。
  • mosh に対応している。先ほど紹介した elinks でのハックだけではなく、 mosh でラップトップに接続すれば、スマホの接続が切れたりラップトップをスリープさせたりしても、元に戻ったときにはmoshが自動的に再接続してくれるという利点があります。 注意: mosh セッションをネストさせるときには気をつけないといけません。 mosh ネイティブの Ctrl+^. は、親セッションを殺してしまいます。子プロセスを殺したい場合は、そのプロセスの pid を調べて手動でkillしなければいけません。
  • タッチイベントがマウスのエスケープシーケンスに変換される。
  • 標準で真のフルスクリーンに対応している。 注意: ハードウェアキーボードを使うときには、特殊文字のバーを消したくなるかもしれません。サイドドロワーメニュー(Ctrl+Alt+右矢印)の「keyboard」ボタンを長押しすると、バーの表示/非表示を切り替えられます。
  • powerline にパッチをあてたフォントの多くに対応する。ただし、ちょっとした手間がかかります。
  • オープンソースで、活発な Githubリポジトリ がある。

ラップトップのキーボードをbluetoothキーボード化する

指になじんだラップトップのキーボードを活用しない手はないでしょう。そのためのAndroidアプリもいくつかありますが、どれもこれも、wifiやtelnetによる拙いハックを使うものばかりです。その動きは、スマホとラップトップを同じネットワークにおいてからスマホ側のアプリを立ち上げて、ラップトップのブラウザやシェルから特定のIPアドレスとポートに接続するといった感じです。複雑極まりないし、すべてのキーやキーコンビネーションを送信できるわけでもありません。

そのときふと思いついたのです。このラップトップをBluetoothキーボードとして使えるんじゃないかって。それは実現できました。ただ、必要なソフトウェアが(少なくともLinux版は)アクティブにメンテナンスされていないというところは気になります。私が見つけたソフトウェアを、使い勝手の悪い順に紹介します。

PyTooth関連

pythonでBluetoothキーボードを作ろうという試みがいくつかあるようです。中には成功した人もいるようですが、私はどれひとつとして使いこなせませんでした。よく使われているのは pyTooth.pyhid2bt のふたつです。

btkbdd

このソフトウェアの利点は、iPhoneとMacやWindowsでも動くと謳っているところです。Bluetoothキーボードと物理キーボードを切り替えるためのショートカットを提供するツールも用意されています。このツールがなければ、押したキーの情報がラップトップとスマホの 両方に 送られてしまいます。残念ながら、両方のバイナリを取得してコンパイルしてみたところ、キーが押されたという情報はログに残っているものの、その情報をスマホ側に送ることはできませんでした。

hidclient

数年前の代物ですが、なんと今でも動きます。しかし、Bluetooth環境の設定には苦労しました。今まではそんなことをする必要がなかったものです。ラップトップ用のドライバは適切なものが用意されていたので、ドライバはインストールせずに済みました。systemdの設定で rfkill をいくつか無効にする必要がありました。また、 bluetoothctl でBluetoothを power on しなければいけませんでした。しかし、一番時間を費やした問題は、 /etc/bluetooth/main.confDisablePlugin=input を追加せよというアドバイスがBluez4にしか当てはまらないということでした。確かに、 hidclient などが広く使われていた四年以上前なら、これは適切なアドバイスだったのでしょう。でも今や、ほとんどの人はBluez5を使っています。Bluez5の場合は、 /etc/systemd/system/dbus-org.bluez.service の中で bluetoothhd の引数として --noplugin=input を追加する必要があったのです。

キーを押したときにデスクトップが乱れることを避けてうまくスマホ側にタイプできるようにするお手軽な方法は、Ctrl+Alt+F2などで別のVTに切り替えることです。私はよくこれを忘れてしまって大変なことになります。デスクトップに戻ってみると、開いていたアプリケーションにわけのわからない文字が書き込まれているのです。

bVNC

でも、ディスプレイが壊れてしまったというのにどうやってデスクトップを見ればいいのでしょう?ごくまれにではありますが、私はスマホからVNCで入ることがあります。ラップトップ側には x11vnc をインストールしました。これはとてもシンプルで、セットアップも不要です。インストールして実行すればIPアドレスとポートを知らせてくれるので、それをVNCクライアントに設定すればいいのです。bVNCは、私が二番目に試したVNCクライアントです。最初が何だったかは忘れてしまいましたが、最初に試したクライアントではマウスカーソルが表示できませんでした。理屈のうえでは、やりたいことは何でもVNC経由でできるはずです。しかし私にとっては、画面の描画を更新するときのFPSが遅すぎるし、いちいちピンチしてズームしないと何もできないという残念な環境でした。デスクトップの解像度をスマホにあわせればいいのかもしれませんね。まあ、私は sshtmux があれば十分幸せです。しかし、Gimpで画像編集をするときだけはVNCに戻ってきます。

スマホ経由でのラップトップ

さて、これで準備は整いました。rootもとったしグラフィカルにアクセスできるようにもなったし、物理キーボードも手に入れました。できないことなど何もないでしょう。しかし、もう少し使い勝手をあげる手がまだあります。

  • 固定IPアドレスを割り当てます。 /etc/systemd/network/wired.network に、以下のように追記しました。
    [Match] Name=enp0s20u1 [Netowrk] DHCP=ipv4 [Address] Label=enp0s20u1:0 Address=192.168.42.177/24
  • ブート時とスリープからの復旧時のパスワードログインを無効にして、直接デスクトップに入れるようにします。何も見えない状態でパスワードを打ち込んでも、正しく入力できたか否かを判断できません。しかし、SSHでのログインについてはパスワードを使うままにしておきます。
  • hidclient.service を作って、ブート時にBluetoothキーボードを開始させます。 /usr/lib/systemd/system/hidclient.service というファイルを作って次の内容を書き込みます。
    [Unit] Description=Broadcast physical keyboard as Bluetooth keyboard Requires=bluetooth.service [Service] ExecStart=/usr/local/sbin/hidclient -e0 Restart=always [Install] WantedBy=multi-user.target
    systemctl enable hidclient を実行すると、ブート時に常にBluetoothキーボードが開始するようになります。
  • スマホをラップトップに接続するときの設定を自動化します。 TaskerSystem Settings (¥220)を使って、スマホのUSB経由での給電を検知して以下の設定を切り替えます。

    • USBテザリング
    • 横画面/縦画面
    • Bluetoothキーボードの接続
    • Null Keyboard アプリはシンプルなハックで、ソフトキーボードを一切表示しないようにできます。 これがなければ、テキスト入力欄にフォーカスが移るといつもキーボードがオーバーレイ表示されてしまいます。物理キーボードを使っているときには、これは目障りなだけです。
  • TaskerとSystem Settingsをインストールしたくないけれども、USBテザリング有効化のショートカットくらいは欲しいという人は、 Shortcut アプリを使いましょう。ホーム画面に、USBテザリング用のアイコンを作れます。
  • neovimの設定 で、ふつうのエディタらしく使えるようにします。いや、わかってますよ。わかってますって。vimにはvimのやりかたがあるってことくらい、私も知ってます。でも、私には私のやりかたがあるんです。エディタについての宗教戦争ではまず聞くことがない意見ですが、*vimはプラグインのエコシステムが充実しています。vimのキーバインドを覚える必要なしに、そのメリットを活用できるようにすべきです。
  • tmux のコピー&ペーストの設定をします。 ~/.tmux.conf にこんな内容を追記しました。
    # LEADER->'[' enters copy mode and LEADER->']' pastes the current buffer set-window-option -g mode-keys vi bind-key -t vi-copy 'v' begin-selection bind-key -t vi-copy 'y' copy-selection

書籍の執筆やブログへの投稿

書籍の執筆経験がないかたもいらっしゃるでしょうが、私のやりかたを簡単に説明しておきます。 neovim とmarkdownと pandoc があれば、いとも簡単に実現できる方法です。章ごとに 1.md2.md といったファイルを用意します。そして、以下のようなスクリプトでそれらをひとまとめにしたPDFを作ります。

#!/bin/bash echo "building..." mkdir -p build rm -f build/book.md cp -rf .md build for chapter in $(ls build/ .md); do echo >> $chapter echo '\pagebreak' >> $chapter echo >> $chapter done cat build/*.md > build/book.md pandoc -f markdown -o book.pdf build/book.md echo "built"
私のブログでは、静的サイトジェネレータである Jekyll を使っています。こちらも同じくmarkdownを使っているので、ここでも neovim が使えます。ブログはGithubに置いているので、 git push するだけで記事を公開できます。記事の執筆時には jekyll serve を使って host: 0.0.0.0 を設定しているので、スマホのブラウザから 192.168.42.177 (ラップトップのIPアドレス)にアクセスすれば、公開前の投稿を確認できます。

貧弱なインターネット環境

この地でのインターネット環境は、ダイアルアップ時代よりもひどいものです。一日の半分はまったくつながらない状態だし、残りの半分だって10kbpsにも満たない断続的な接続しかありません。pingの結果はだいたいこんな感じです。

--- google.in ping statistics --- 3450 packets transmitted, 1840 received, +2 duplicates, 46% packet loss, time 3513626ms rtt min/avg/max/mdev = 138.121/18864.009/126507.226/30817.182 ms, pipe 127 mtr

そこで私が活用しているのが、ビジュアルなpingを実行し続けることです。そうすれば、ネットワークの現状をすぐに把握できます。たとえば図のようになります。

赤が多ければ、今はGoogle検索は控えておこうと判断できます。しかし、もしほんの少しでも色がついていれば、少なくとも elinks 上で「r」(デフォルトのCtrl+Rから変更しています)を押して再読み込みをかけることはできます。まあ数分後には、新着メールが届いているかどうかを確認できるでしょう。

オーディオ ping

ちょっとした スクリプト を書いて、ネットワークの現状を音で把握できるようにしました。部屋で他の作業をしながら、インターネット接続が使えるようになるまで待つことができるのです。接続が切れているときは何も音が鳴りません。ビープ音のピッチが高くなればなるほど、pingの応答時間が短くなっていることを意味します。

elinks

ひとつはっきりさせておきたいのは、 elinks はリモートサーバー上で動かすべきだということです。リモートサーバー上のほうが、ネットワーク帯域も広いし接続の信頼性も高いでしょう。テキストベースのブラウザであるとはいえ、ページ全体をダウンロードする必要があることは変わりません。 elinks の利点は、ネットワーク上に流す必要があるのがテキストのページだけだということです。 mosh の差分アルゴリズムを使えば、ほんの数バイト程度になります。 elinks を使う際のヒントを三つ紹介します。

  • 矢印キーには気をつけましょう。おそらく、期待どおりの動きにはなりません。上下の矢印キーは、前後のリンクへの移動を表します。次のリンク先が10ページ先にあるときなどは、いらいらさせられるでしょう。左右の矢印キーは、閲覧履歴内での前後の移動を表します。ページのスクロールにはInsertとDeleteを使いましょう。リンクをたどるときには、次に紹介するヒントが使えます。
  • 「.」を押すと、各リンクに割り当てられた番号の表示/非表示が切り替わります。この番号をタイプしてEnterを押すと、対応するリンクにフォーカスが移ります。そこで改めてEnterを押すとリンク先に移動し、「T」を押すと新しいバックグラウンドタブでリンク先を開きます。
  • 「gg[スペース]」と打つとアドレスバーに「g」が読み込まれた状態になり、このあとに何かを入力すると、そのキーワードをGoogleで検索できます。これは、グラフィカルなブラウザの多くがデフォルトでアドレスバーに搭載している機能と同じです。「tg[スペース]」も同じくGoogle検索ですが、検索結果を新しいフォアグラウンドタブで開きます。

elinks には大きな弱点がふたつあります。ひとつは、SNI SSLページに対応していない点です。つまり、最近のHTTPSサイトの大半を読み込めないということです。 SNIを有効にするパッチ もありますが、今まで試そうと思ったことはありません。もうひとつは、JSの対応が不完全だという点です。最近話題のSPAが出てきたらお手上げです。

texttop

elinks がSNIやJSをサポートしていないことがきっかけで私が開発したのがtexttopです。これは、Firefoxブラウザをターミナルにテキストベースで表示させて、インタラクティブに操作できる仕組みです。

hiptext を使って、GUIをテキストとしてレンダリングしています。ASCIIアートと似ていますが、もう少し優れたものです。また、マウスのエスケープシーケンスにも対応していて、スクロールやクリックやズームができます。実際にこれを使わざるを得なくなったのはたった一度だけで、Digital OceanのアカウントからAPIキーを取得するときのことでした。でも、必要とあらば、ダイヤルアップ環境上でどんなサイトにもアクセスできるということを知っておくだけでも安心できます。

ディスプレイの修理が終わったら

  • sudo systemctl disable hidclient で、ブート時に hidclient.service が立ち上がらないようにしましょう。
  • ブート時とスリープからの復旧時にもパスワードでのログインを求めるように戻しましょう。