xterm だと何らかのコントロールシーケンスでマウスのクリックを 取れるとかいうのがあったな。そんなコントロールシーケンス使ったことないので 説明はできないが。
working example でいうと,w3m とか。w3m 素敵だよね。 こんにちの Web には対応不可能感が漂いすぎてるけど。 あと Emacs だと M-x xterm-mouse-mode でマウスで カーソルを動かしたりできるようになる。
端末エミュレータで URL に飛ぶといえば,たいていのものについている URL の自動検出機能 を使うというのがまあ普通の答えになる気がするんですが,任意のテキストに URL を割り当てる エスケープシーケンスというのが世の中には存在するという話。(今日知った)
TL;DR ハイパーリンクは次のようなエスケープシーケンスで実現できる。1
"\e]8;;${URL}\a${LABEL}\e]8;;\a" 例えば,http://example.com に飛ぶ 「Click here」というリンクを作りたかったら, 下のようにする。
"\e]8;;http://example.com/\aClick here\e]8;;\a" 経緯 これを知ったきっかけというのは,
$ coredumpctl --help というコマンドを実行したことだった。ヘルプの下の方に coredumpctl(1) man page という点線のついた文字が表示されていて,右クリックのメニューからリンクをたどってみると, マニュアルページのウィンドウが表示されて驚いた。僕は plain-old な man コマンドでの 表示の方が好きなので,HTML 変換されたものが表示されたのには納得がいかなかったが。 まあそんなことはさておき……。
前のポストでテキストエディタ自作の知見のことを思い出したので,書いておこうかなと。
この記事では,端末で動く簡単なテキストエディタを作ります(ただし, そんなにまとまっていないかつサンプルコードとかも限りなく少なくなると思うので, 断片的な情報にすぎない気がする)。
この記事では GNU/Linux のシステムを前提としますが,macOS や BSD 系の OS など Unix 系の OS であればほとんどの内容は通用すると思われます。 また,Windows Subsystem for Linux (WSL) でもおそらく動作しますが, テストはしていません。 また,端末エミュレータは xterm 互換である必要があります。 GNOME 端末,Konsole,mlterm など主要な端末エミュレータ(端末)であれば問題ありません。 WSL を使っている場合で,Windows Terminal を使っている場合, 細かい部分で非互換が発生することがあります。 なお,筆者は ArchLinux 上の GNOME 端末で開発を行いました。
有名すぎて今更感あるけど(でも実際にやった人はあまりいないと思われ)やってみたい。
grub のコマンドを編集すると bash を init ってことにして 立ち上げたりできるので(シングルユーザーモードで起動するみたいな話), 特定の処理専用の Linux を作れるよな,と思ったところから, Linux From Scratch したいみたいな発想になってしまった。
http://lfsbookja.osdn.jp/7.10/
翻訳のバージョンはちょっと古そうだが,英語を読むという辛さがないし, 参考にしながら腕試しがてらやってみるのもいいかな,という気持ちになった (持てる知識だけで新しい構成にしつつ起動するところまでいけるのかは微妙)。 そもそもこれは systemd じゃなさそうだし,systemd にするにはいろいろ変える必要がありそう。 まあ僕は systemd 便利でいわゆるきれいな設計なんだろうなとは思うけどあまり賛成派ではない。
今日は小さいツールを2つほど作って,ちょうど700行コードを書いた。 まあ空行とかコメント(ほとんどない気がする)も含まれるのであまり意味のある数字ではないけど。
1つはパイプラインの中で標準入力をテキストエディタで編集して標準出力に流すというもので, なんかこんなのすでにシステムにインストールされたりしてそう……。 作っている時はパイプラインの中で使うという発想があまりなかったし, あまり機会がある気がしないが,ヒアドキュメントとかヒアストリングとかを意識して hereed というゴミみたいな名前にした。
もう1つは Wake-on-LAN のユーティリティで,0個以上の予め登録したホストを 同時に Wake-on-LAN できるというものだ。 送るホストを選ぶところは,以前にテキストエディタを作った時の 端末の制御の知見があったので,それが使えた。non-canonical mode にするとか, エコーバックを無効にするとか。 まあ知ってれば何も難しいことはないけれど。 設定ファイルが json なのが Unix のツールとしてイケてないと思うけど, 設定の構造的に json が都合が良かったのでまあ使った。
なんか /var/log あたりを見ても syslog がないな,と思っていたら, systemd がすごい syslogd をやってるらしい。systemd 肥大化しすぎでは……。
で,そのログを見るには,
$ journalctl とかする。
でも,これは保存されているログが古い方から全部出てしまうのでたいていの場合は用途に合わない気がする。 僕の場合は 12 月のログとかが最初に出てきてうーん,となった。 たいていの場合はログは新しい方から見たいんではないかと思うので,そういう場合は,
$ journalctl --reverse とかすると,新しいものから表示してくれる。
あと --grep オプションとかもあって,
$ cat /var/log/syslog | grep foobar みたいにやってたところを 1 つのコマンドで済ませられるっぽい。うーん,でもこれはなんかなー。
他には --since とか --until とかもあるっぽいけど,syslog.1 とかの方がなんとなく好きだったりします。
久しぶりに触った。例によってマップの実装に使った訳だが。
プラウザの履歴をゴニョゴニョできる API だが,適当に使うのは割と簡単。
history.pushState(null, null, '?foo=bar'); みたいな感じで URL のクエリを書き換えたりとかできる。 MDN を見たら第一引数と第二引数にいろいろ渡していたが,めんどくさいので null でよさそう。
書き換えを listen する方は,
window.addEventListener('popstate', () => { // なんか処理 }); とかでよさそう。これが呼ばれたときには URL が書き換わっているので, それを location.href とかで取ればよさそうな気がする。 真面目にやるなら push したときの値を受け取って使う感じになるんだろうけど。
onload と同時に popstate が起こるブラウザもあるらしい。怖いよ〜。
参考 https://developer.mozilla.org/ja/docs/Web/API/History_API https://qiita.com/nenokido2000/items/2dd8da77d06837c8a510
ブロックの高さと名前が出せるようになった。 パーサーをサーバーとして実行てきるようにして,PHP で Unix ドメインソケットで話させる みたいな感じにした。
サーバーの実装だけど,最初 wait してなかったせいで,大量のゾンビプロセスを作ってしまった。 これは,犠牲となる子プロセスを作ったあと,そのプロセス内でプロセスを立ち上げて レスポンスを返す感じにして,即座に終了する最初の子プロセスをwaitするようにして解決した。
自分で買うぞと思いながら作った。
https://suzuri.jp/kofuk/3008828/t-shirt/s/white
短いコードが書かれている。内容は以下だ。
#include <stdio.h> int main(void) { int i,a; while(a<5) {a=a+1; printf("Hello, world!\n"); }} ツッコミどころが多すぎるので完結に表すと,こんなに短いのにクソ汚くて, しかも未定義動作まで踏んでしまうというコードになっている。
はい,しょうもない。
僕がブルジョワジーになった日に買おう。(来るのか?)
Google Chrome Light ってやつを入れた。デフォルト厨なので(?)今まではデフォルトのままで使ってきたけど急に変えたくなったので。 今は Google Chrome 使ってないけどあのモダンなデザインは割と好き。
あと,タブがウィンドウの枠に直接描画されるようにした。GNOME だとトップバーがあって, ウィンドウの枠があって,それから Web ページって感じだとかなり狭いので。 これが Firefox 標準のカスタマイズってところで変えられることに気づいてなかった。
で,最終的にこういう感じ。
そういや今日やったのではないけど,新しいタブのページの中の最近アクセスしたページ の一覧とかは使ったためしがないので設定で消してる。
そういや GNOME のテーマは逆にデフォルトに戻した。 今まではダークを使っていて,ライトよりダークの方が好きなんだけど, webkit2gtk でウェブページ内にもダークテーマが部分的に適用されたりして都合が悪かったので。