summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/content/posts/2022-04-24
diff options
context:
space:
mode:
Diffstat (limited to 'vhosts/blog/content/posts/2022-04-24')
-rw-r--r--vhosts/blog/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml125
1 files changed, 125 insertions, 0 deletions
diff --git a/vhosts/blog/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml b/vhosts/blog/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml
new file mode 100644
index 00000000..34082b12
--- /dev/null
+++ b/vhosts/blog/content/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<article xmlns="http://docbook.org/ns/docbook" xmlns:xl="http://www.w3.org/1999/xlink" version="5.0">
+ <info>
+ <title>term-banner: ターミナルにバナーを表示するツールを書いた</title>
+ <abstract>
+ ターミナルに任意の文字のバナーを表示するためのツールを Go で書いた。
+ </abstract>
+ <revhistory>
+ <revision>
+ <date>2022-04-24</date>
+ <revremark>公開</revremark>
+ </revision>
+ <revision>
+ <date>2022-04-27</date>
+ <revremark>-f オプションについて追記</revremark>
+ </revision>
+ </revhistory>
+ </info>
+ <section xml:id="intro">
+ <title>はじめに</title>
+ <para>
+ こんなものを作った。
+ </para>
+ <literallayout class="monospaced">
+ <![CDATA[
+ $ term-banner 'Hello, World!' 'こんにちは、' '世界!'
+ ]]>
+ </literallayout>
+ <para>
+ image::https://raw.githubusercontent.com/nsfisis/term-banner/main/screenshot.png[term-banner
+ のスクリーンショット]
+ </para>
+ <para>
+ コマンドライン引数として渡した文字列をターミナルに大きく表示する。
+ </para>
+ <para>
+ リポジトリはこちら: <link xl:href="https://github.com/nsfisis/term-banner">https://github.com/nsfisis/term-banner</link>
+ </para>
+ </section>
+ <section xml:id="motivation">
+ <title>Motivation</title>
+ <para>
+ 以前、https://github.com/nsfisis/big-clock-mode[big-clock-mode]
+ という似たようなプログラムを書いた。 これは tmux の <literal>:clock-mode</literal>
+ コマンドに着想を得たもので、<literal>:clock-mode</literal>
+ よりも大きく現在時刻を表示する。
+ </para>
+ <para>
+ <literal>big-clock-mode</literal>
+ を開発したのは、次のようなシチュエーションで使うためである。
+ 弊社では現在リモートワークが基本だが、web
+ 会議などで画面共有しているときに、休憩を挟んで特定の時刻から再開する、ということがある。
+ こういったケースで、画面上に現在の時刻を大きめに表示しておくと、モニタから離れても遠くから時刻がわかるので便利である。
+ </para>
+ <para>
+ それこそタイマアプリか何かを使えばいいのだが、ターミナルに棲むいきものとしては、住処から離れたくないわけだ。
+ </para>
+ <para>
+ しばらく便利に使っていたのだが、ひとつ不満点が出てきた。それは、再開する時刻がいつだったかを覚えておかなければならないということだ。
+ どこかにメモしておいてもいいが、せっかくなら現在時刻とともに表示させておきたい。
+ </para>
+ <para>
+ そんなわけで、「任意の文字列をターミナルに表示する」プログラムを書く運びとなった。
+ まあ、作らなくても探せばあると思うが、作りたいものは作りたいので知ったことではない。
+ </para>
+ </section>
+ <section xml:id="program">
+ <title>プログラム</title>
+ <para>
+ 全体の流れは次のようになっている。
+ </para>
+ <orderedlist numeration="arabic">
+ <listitem>フォントファイルを読み込む</listitem>
+ <listitem>コマンドライン引数を Shift-JIS に変換する (フォントが Shift-JIS 基準で並んでいるため)</listitem>
+ <listitem>1文字ずつレンダリングしていく</listitem>
+ </orderedlist>
+ <para>
+ <literal>big-clock-mode</literal> が Go 製なので、今回も Go で書いた。 PNG
+ が標準ライブラリにあったり、Shift-JIS
+ のエンコーディングが準標準ライブラリにあったりしたのは助かった。
+ </para>
+ <para>
+ フォントファイルは <literal>go:embed</literal>
+ で実行ファイルに埋め込んでいるので、ビルド後はワンバイナリで動く。
+ 仕事ではスクリプト言語ばかり書いているが、やはりコンパイル言語はいい。
+ </para>
+ </section>
+ <section xml:id="font">
+ <title>フォント</title>
+ <para>
+ フリーの 8x8
+ ビットマップフォントである、https://littlelimit.net/misaki.htm[美咲フォント
+ 2021-05-05a 版] を使わせていただいた。
+ </para>
+ <para>
+ はじめは自分でポチポチ打っていたのだが、「き」くらいまでやって挫折した。
+ 同じく 8x8
+ で作っていたのだが、平仮名でさえも、この小さなキャンバスにはとても収められない。
+ </para>
+ <para>
+ 美咲フォントは、平仮名・片仮名に留まらず、JIS
+ 第一・第二水準の漢字までサポートしている。
+ 第二水準ともなると一生お目にかかることのない字の方が多いくらいだが、これをこの大きさで書くというのは、もはや芸術の域である。
+ </para>
+ <para>
+ さらに言うと、実のところ美咲フォントは実サイズ 7x7
+ で作られており、余白が設けられている。
+ これは、単純にそのまま並べても字間・行間を確保できるようにという配慮である。
+ おかげでコーディングまで楽になった。
+ </para>
+ <para>
+ ゴシック体と明朝体があったが、私の好みで明朝体の方にした。
+ ただ、ゴシック体の方が見やすい気がするので、フォントを選べるように後ほど拡張するかもしれない。
+ </para>
+ <para>
+ 2022-04-27 追記: <literal>-f</literal> オプションで選べるようにした。
+ </para>
+ </section>
+ <section xml:id="outro">
+ <title>おわりに</title>
+ <para>
+ あなたもターミナルに住んでみませんか?
+ </para>
+ </section>
+</article>