ターミナルに特化した Misskey ストリームクライアントのsayaka ちゃんというソフトウェアがあります.Sixel 対応端末で実行すると画像付きでMisskey をストリーミングしてとても楽しいです.
このsayaka ちゃんに --force-blurhash オプションが実装されたので少し試してみました.
BlurHash?
BlurHash はフードデリバリーサービスのWolt の開発した画像読み込みのプレースホルダーなどに利用できるコンパクトな20〜30文字で表せるぼかした画像です.
この容量の小さい画像をプレースホルダーに埋め込むと空っぽより彩りが豊かになったり,NSFW 画像をモザイクする代わりに使ったり出来ます.
ソフトウェアはMITライセンスでたくさんの言語で実装されています.
以下はDebian logo をC 実装のBlurHash にコンポーネント数ごとにかけてみています.コンポーネント数により7〜133byteで表されています.
$ git clone https://github.com/woltapp/blurhash (1)
$ cd blurhash/C/
$ make blurhash_encoder (2)
$ make blurhash_decoder (3)
$ wget https://www.debian.org/logos/openlogo-nd-100.png (4)
$ file openlogo-nd-100.png
openlogo-nd-100.png: PNG image data, 101 x 124, 8-bit colormap, non-interlaced
$ for i in {1..8}; do ./blurhash_encoder $i $i openlogo-nd-100.png; done (5)
00SFLy
AJSFLyixHXx]
KJSFLyixR5HXx]kCWBj[%#
UJSFLyixR5xuHXx]kCofWBj[%#yDeTV@yXR5
eJSFLyixR5xuVsHXx]kCofj[WBj[%#yD%#eTV@yXR5tRV@o|%}kCRP
oJSFLyixR5xuVsiwHXx]kCofj[VsWBj[%#yD%#tleTV@yXR5tRofV@o|%}kCRPMJ%gV@ozozRPoz
yJSFLyixR5xuVsiwtlHXx]kCofj[VsozWBj[%#yD%#tlkCeTV@yXR5tRofkCV@o|%}kCRPMJMd%gV@ozozRPozRPozaytlR5H?kBRP
:JSFLyixR5xuVsiwtlt7HXx]kCofj[VsozVsWBj[%#yD%#tlkCj[eTV@yXR5tRofkCtRV@o|%}kCRPMJMdV@%gV@ozozRPozRPozozaytlR5H?kBRPtRxukCtRVsR5kCfkae
$ for i in {1..8}; do ./blurhash_encoder $i $i openlogo-nd-100.png | wc -c; done (6)
7
13
23
37
55
77
103
133
$ for i in {1..8}; do ./blurhash_decoder $( ./blurhash_encoder $i $i openlogo-nd-100.png ) 101 124 blur-$i.png; done (7)
$ lsix (8)BlurHash のsource 入手
encoder build
decoder build
Debian logo file 入手
プレースホルダー枚にBlurHash に変換
バイト数確認
BlurHash をpng に変換
png に変換したBlurHash を表示

sayaka の –force-blurhash オプションを試す
sayaka ちゃんの –force-blurhash オプションを試してみます.
まずはbuild.
Linux で引っかかりやすいのがGNU Make ではなくbmake を使うところ.
$ git checkout a4e143d50ceee29a61610d1ee76e4030b0bba273 Previous HEAD position was d76cb2c ver 3.8.1 (2024/09/21) HEAD is now at a4e143d src/misskey: --force-blurhash オプションを実装してみる。 画像表示を Blurhash だけにするモード。 $ ./configure $ bmake -DRELEASE all $ src/sayaka usage: sayaka <command> [<options...>] <command> -h,--home : Home timeline mode (needs --server and --token) -l,--local : Local timeline mode (needs --server) -p,--play=<file|-> : Playback mode <options> -s,--server=<host> : Set misskey server -t,--token=<file> : Set misskey access token file -c,--color=<color> : 256,16,8,2,1 and gray[2-256] (default:256) --show-cw : Open CW(Contents Warning) part --nsfw=<show|blur|alt|hide> : How to show NSFW contents (default:blur) --show-image=<yes|no|auto> : Whether to show image or not (default:auto) -r,--record=<file> : Record JSON to <file> --help-all : More details
build 出来たので早速 --force-blurhash を試してみます.例えば misskey.io をこんな感じで.アイコン画像も添付画像もBlurHash になります.
$ src/sayaka --force-blurhash -l -s misskey.io

Note | アカウントや本文にはモザイクを掛けてあります. |
BlurHash で画像サイズが小さくなるってことは通信料もデータ量も小さくなっていてプアな回線でもいい感じにストリーミングできそうな気がします.
BlurHash とSixel を60秒ずつ --record オプションでファイルに保存してみました.期待に反してBlurHash のほうが大分大きいです.
$ timeout 60 src/sayaka --record=blurhash.rec --force-blurhash -l -s misskey.io $ timeout 60 src/sayaka --record=sixel.rec -l -s misskey.io $ ls -s *.rec 436 blurhash.rec 44 sixel.rec
ttyrec でも同じような感じ.
$ ttyrec -f blurhash.ttyrec -- timeout 60 src/sayaka --force-blurhash -l -s misskey.io $ ttyrec -f sixel.ttyrec -- timeout 60 src/sayaka -l -s misskey.io $ ls -s *.ttyrec 1768 blurhash.ttyrec 228 sixel.ttyrec
通信量はどうだろうとnethogs コマンドで $ sudo nethogs -P $(pgrep sayaka) -l な感じで見てみるとやはりBlurHash のほうが通信量が多いような?
NetHogs version 0.8.8
PID USER PROGRAM DEV SENT RECEIVED
? root unknown TCP 435.079 11.067 kB/s
2782477 matoken src/sayaka -.. enx349971e11a0f 0.252 6.934 kB/s
TOTAL 435.331 18.001 kB/sNetHogs version 0.8.8
PID USER PROGRAM DEV SENT RECEIVED
? root unknown TCP 432.206 11.271 kB/s
2787797 matoken src/sayaka -.. enx349971e11a0f 0.150 0.885 kB/s
TOTAL 432.356 12.156 kB/s録画データを見ると件数が違います.Sixel のときになにかボトルネックがありそうです.回線の問題?
後でVPS でも確認してみようと思います.
$ jq .body.type blurhash.rec | wc -l 119 $ jq .body.type sixel.rec | wc -l 10