Sixel グラフィックス対応ターミナル

Sixel グラフィックスは、キャラクターベースのターミナルエミュレータを拡張し、特別なエスケープシーケンスを送信することでビットマップグラフィックを表示する技術です。

この記事は、2023-06 に VS Code 内蔵ターミナルエミュレータが Sixel グラフィックスを実験的にサポートしたので試してみたのと、他の自分が使っているターミナルについても対応状況を調べてみたメモです。

Sixel グラフィックスに対応したターミナルは、curl した画像やジェネレータコマンドで生成した画像をそのままの流れで確認できたりするので便利です。

VS Code

VS Code 設定:(expertimertal から stable に昇格した時は設定不要になるはずです。2023-07 リリースの 1.80 で昇格したので以下の設定は不要になりました)

{ "terminal.integrated.experimentalImageSupport": true }

ImageMagick の convert コマンドで出力を sixel:- とすると標準出力に sixel 形式が出力されターミナルにグラフィックが表示されます。

convert コマンドを試行錯誤している中で、画像出力がすぐに動作確認できて便利の図。(良さそうになったらファイル出力する)

# 画像サイズ取得
$ identify KlaudiaIcon.jpg 
KlaudiaIcon.jpg JPEG 300x300 300x300+0+0 8-bit sRGB 49208B 0.000u 0:00.000
# 丸抜きマスク画像生成
$ convert -size 300x300 xc:black -fill white -draw "circle 148 148 148 0" -alpha copy mask-300px.png
# マスクと画像でアルファ合成 
$ convert KlaudiaIcon.jpg mask-300px.png -compose copy-opacity -composite sixel:-
# ワンライナー and 透過色の出力色指定
$ convert KlaudiaIcon.jpg \( -size 300x300 xc:none -fill white -draw "circle 148 148 148 0" -alpha copy \) -compose copy-opacity -composite -background "#1e1e1e" -alpha remove sixel:-
# 普通に透過色
convert pidgin-ryza.png \( -size 162x162 xc:none -fill white -draw "circle 80 80 80 0" -alpha copy \) -compose copy-opacity -composite pidgi
n-ryza-circle.png
# SVG を大きさ指定で入力
$ convert -size 1000x1000 input.svg sixel:-

なお .svg 表示などのレンダリングで使われる、convert コマンドから見えるフォント名は以下のようにすると得ることができます。

$ convert -list font | grep -e Font | egrep 'JP$'
  Font: Noto-Sans-CJK-JP
  Font: Noto-Sans-Mono-CJK-JP
  Font: Noto-Serif-CJK-JP
# フォントがある .svg を出力する例
$ convert -font 'Noto-Sans-CJK-JP' math-sample1.svg sixel:-
# 任意サイズのダミー画像をつくる例
$ convert -size 320x200 -background "#95a5a6" -fill "#2c3e50" -font 'Noto-Sans-CJK-JP' -pointsize 36 -gravity center label:"320x200" sixel:-

sensors コマンドで CPU の温度を表示してそれっぽく表示するメモ。

$ CPU_TEMP1=$(sensors -j 2>/dev/null \
    | jq '.["thinkpad-isa-0000"]["CPU"].temp1_input') \
    && convert -size 200x20 \
    xc:green \
    -draw "fill red rectangle 0,0,${CPU_TEMP1},20" \
    -gravity center \
    -annotate 0 ${CPU_TEMP1} \
    sixel:-

Alacritty

Alaclitty は2023-06 現在まだ Sexel に対応していませんが、マスターブランチにマージ可能なプルリクが存在します。

Support for graphics in the terminal #4763

This patch adds support for graphics in the terminal. Graphics can be sent as Sixel images.

以下、対応ソースが入っているブランチをビルドして Alacritty + Zellij(Sixel 対応済み) で動作させてみた様子です。(Zellij を通すと clearコマンドなどが正常に機能しないパターンがあるかも。継続確認。Alacritty のみだと綺麗に動作しています)

$ montage *.jpg -tile 4x3 -geometry 240x240 sixel:-

ちなみに ffmpeg-sixel もうまく動作しました。(VS Code のターミナルだと動画の表示位置が左上固定になってしまいますが、Alacritty はカーソル位置の下で再生できました)

https://github.com/Albert-S-Briscoe/FFmpeg-SIXEL

FFmpeg fork for outputting full resolution video to your terminal

$ ffmpeg -i test.mp4 -f sixel -pix_fmt rgb24 -s 800x450 - -f alsa -ac 2 pulse -loglevel quiet

Windows Terminal

Windows Terminal はサポートリクエストがあがっています。ソースコードを grep すると sixel という文字列がいくつか見えるので対応するのかな?(未確認)

Feature Request: sixel graphics support #448

Would like to see Sixel support in the Terminal, this is the standard used to show graphics in the console.

継続ウォッチしていきます。


記事中の画像はライザのアトリエ3 “Social Icons and Wallpapers” で配布されているものを使わせていただきました。(先日、ライザ1-3 まで通しでクリアしてすごく良かった…!)

https://www.koeitecmoeurope.com/ryza3/social.html

To celebrate the release of “Atelier Ryza 3: Alchemist of the End & the Secret Key” , we have prepared some social icons and phone wallpapers for you to enjoy!

関連

ファイルツリー表記をテキストで記述する

技術文書などでファイルとディレクトリ・フォルダ構造を図解したい場合に、テキストを使った定義から .svg.png を生成する方法メモです。

出力例:

いくつか方法があると思いますが、Docker – PlaantUML Server と VS Code – PlantUML 拡張を使うとお手軽にいけると思います。

Docker で PlantUML Server を起動。8080 ポートが何かとかぶっている場合は変更のこと。(9090:8080 等。ホスト側: コンテナ側 にて、ホスト側を設定します)

docker run -d --rm -p 8080:8080 plantuml/plantuml-server:jetty
# もしくは podman
podman run -d --rm -p 8080:8080 plantuml/plantuml-server:jetty

VS Code に PlantUML 拡張を導入。

https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml

Rich PlantUML support for Visual Studio Code.

VS Code .vscode/settings.json などで以下を設定。Docker で起動した PlantUML Server とポートを合わせます。

    "plantuml.server": "http://localhost:8080"

VS Code で test.puml など *.puml 拡張子でファイルを新規作成し PlantUML Salt 記法でファイル、ディレクトリツリーをテキストで定義。なお、<&folder> などのアイコン定義名は open-iconic のものが使えます。

@startsalt diag-sequence-sample2
{
{T
 + <&folder> wp-admin
 + <&folder> wp-content
 ++ <&folder> themes
 +++ <&folder> my-theme   | 新規作成
 ++++ <&file> style.css   | 新規作成
 ++++ <&file> index.php   | 新規作成
 ++ <&folder> uploads
 + <&folder> wp-includes
 + <&file> .htaccess      | 自動作成
 + <&file> index.php
}
}
@endsalt

VS Code でカーソルを @startsalt@endsalt の間に合わせ、 [F1] 押下後、PlantUML: Preview Current Diagram を選択。

プレビューしながらいい感じになったら、[F1] から PlantUML: Export Current Diagram.svg.png を選択してファイルエクスポート。なお、.png のサイズはプレビューしているのと同じ大きさになるようです。

以上です。

PlantUML は Salt 以外にもテキスト定義でいろいろ描けますので、準備しておくと何かと便利ではないかと思います。

AsciiMath の例:

@startmath math-sample1
f(t)=(a_0)/2 + sum_(n=1)^ooa_ncos((npit)/L)+sum_(n=1)^oo b_n\ sin((npit)/L)
@endmath

Docker コマンド

Windows で docker コンテナを扱う場合は WSL2 上の podman を使うと便利だと思います。

WSL2 への podman の導入:

# podman 導入
$ sudo apt update
$ sudo apt install podman
# レジストリ登録
$ echo "unqualified-search-registries = ['docker.io']" | sudo tee -a /etc/containers/registries.conf

podman を使った PlantUML Server の起動停止例:

# 起動
$ podman -d --name plantuml_server --rm -p 8080:8080 plantuml/plantuml-server:jetty
# 終了
$ podman stop plantuml_server
$ podman ps -a
# --rm 指定で PlantUML Server を起動しているので終了と同時に破棄される

関連

Asciidoc 文書及びその中に含まれる PlantUML 形式を HTML/PDF に自動ビルドできるようにした文書執筆環境についての記事が以下にあります。

Ubuntu 22.04 LTS で Microsoft PPA 版の dotnet-sdk-7.0 を導入するメモ

Ubuntu 上で .NET Core を使いたい場合は、Microsoft PPA から dotnet-sdk-7.0 パッケージを導入すると便利です。

Ubuntu に .NET SDK または .NET ランタイムをインストールする

この記事では、Ubuntu に .NET をインストールする方法について説明します。 Microsoft パッケージ リポジトリには、Ubuntu で現在または以前にサポートされていたすべてのバージョンの .NET が含まれています。 Ubuntu 22.04 以降では、Ubuntu パッケージ フィードで一部のバージョンの .NET を使用できます。 使用可能なバージョンの詳細については、「 サポートされているディストリビューション 」セクションを参照してください。

Ubuntu PPA 上にもパッケージが用意されていますが、Microsoft PPA を使う場合は次のようにします。

# Get Ubuntu version
declare repo_version=$(if command -v lsb_release &> /dev/null; then lsb_release -r -s; else grep -oP '(?<=^VERSION_ID=).+' /etc/os-release | tr -d '"'; fi)

# Download Microsoft signing key and repository
wget https://packages.microsoft.com/config/ubuntu/$repo_version/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

# Install Microsoft signing key and repository
sudo dpkg -i packages-microsoft-prod.deb

# Clean up
rm packages-microsoft-prod.deb

# Update packages
sudo apt update

ここまでドキュメントの通りですが、同名で Ubuntu PPA のパッケージがあるため、Microsoft PPA を優先させるために次のようにします。

これをしないと Ubuntu PPA 版のアップデートが起きた場合に上書きされて、dotnet コマンドは効けど SDK が見えなくなったりします。

(不具合が発生している場合は一度 dotnet* package を削除:)

sudo apt purge dotnet*
sudo apt autoremove

Microsoft PPA を優先設定:

sudo sh -c "cat > /etc/apt/preferences.d/dotnet <<'EOF'
Package: dotnet*
Pin: origin packages.microsoft.com
Pin-Priority: 1001
EOF"
sudo sh -c "cat > /etc/apt/preferences.d/aspnet <<'EOF'
Package: aspnet*
Pin: origin packages.microsoft.com
Pin-Priority: 1001
EOF"

dot-net-sdk-7.0 を導入:

sudo apt update
sudo apt install dotnet-sdk-7.0

これで dotnet --info が次のようになれば OK です。

$ dotnet --info
.NET SDK:
 Version:   7.0.302
 Commit:    990cf98a27

ランタイム環境:
 OS Name:     ubuntu
 OS Version:  22.04
 OS Platform: Linux
 RID:         ubuntu.22.04-x64
 Base Path:   /usr/share/dotnet/sdk/7.0.302/

Host:
  Version:      7.0.5
  Architecture: x64
  Commit:       8042d61b17

.NET SDKs installed:
  7.0.302 [/usr/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.5 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  DOTNET_ROOT       [/usr/lib/dotnet]

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

ハローワールド:

$ mkdir hello && cd hello
$ dotnet new console
テンプレート "コンソール アプリ" が正常に作成されました。

作成後の操作を処理しています...
/home/hiromasa/devel/dotnet/hello/hello.csproj を復元しています:
  復元対象のプロジェクトを決定しています...
  /home/hiromasa/devel/dotnet/hello/hello.csproj を復元しました (108 ms)。
正常に復元されました。
$ ls -laF
合計 20
drwxrwxr-x 3 hiromasa hiromasa 4096  5月 28 19:00 ./
drwxrwxr-x 5 hiromasa hiromasa 4096  5月 28 18:59 ../
-rw-rw-r-- 1 hiromasa hiromasa  105  5月 28 19:00 Program.cs
-rw-rw-r-- 1 hiromasa hiromasa  249  5月 28 19:00 hello.csproj
drwxrwxr-x 2 hiromasa hiromasa 4096  5月 28 19:00 obj/
$ dotnet run
Hello, World!
$ file obj/Debug/net7.0/hello.dll
obj/Debug/net7.0/hello.dll: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

VS Code の C# Extention でコーディングしてデバッグブレイクしている様子: