{ "version": "https://jsonfeed.org/version/1.1", "user_comment": "This feed allows you to read the posts from this site in any feed reader that supports the JSON Feed format. To add this feed to your reader, copy the following URL -- https://matoken.org/blog/tag/blurhash/feed/json/ -- and add it your reader.", "home_page_url": "https://matoken.org/blog/tag/blurhash/", "feed_url": "https://matoken.org/blog/tag/blurhash/feed/json/", "language": "ja", "title": "BlurHash – matoken's blog", "description": "Is there no plan B?", "icon": "https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9.jpeg", "items": [ { "id": "https://matoken.org/blog/?p=5089", "url": "https://matoken.org/blog/2025/12/24/sataka-and-blurhash/", "title": "\u30bf\u30fc\u30df\u30ca\u30eb\u7279\u5316Misskey\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306esayaka\u3061\u3083\u3093\u3068BlurHash", "content_html": "
\u30bf\u30fc\u30df\u30ca\u30eb\u306b\u7279\u5316\u3057\u305f Misskey \u30b9\u30c8\u30ea\u30fc\u30e0\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306esayaka \u3061\u3083\u3093\u3068\u3044\u3046\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c\u3042\u308a\u307e\u3059\uff0eSixel \u5bfe\u5fdc\u7aef\u672b\u3067\u5b9f\u884c\u3059\u308b\u3068\u753b\u50cf\u4ed8\u304d\u3067Misskey \u3092\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u3057\u3066\u3068\u3066\u3082\u697d\u3057\u3044\u3067\u3059\uff0e
\n\u3053\u306esayaka \u3061\u3083\u3093\u306b --force-blurhash \u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u5b9f\u88c5\u3055\u308c\u305f\u306e\u3067\u5c11\u3057\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e
\n
BlurHash \u306f\u30d5\u30fc\u30c9\u30c7\u30ea\u30d0\u30ea\u30fc\u30b5\u30fc\u30d3\u30b9\u306eWolt \u306e\u958b\u767a\u3057\u305f\u753b\u50cf\u8aad\u307f\u8fbc\u307f\u306e\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306a\u3069\u306b\u5229\u7528\u3067\u304d\u308b\u30b3\u30f3\u30d1\u30af\u30c8\u306a20\u301c30\u6587\u5b57\u3067\u8868\u305b\u308b\u307c\u304b\u3057\u305f\u753b\u50cf\u3067\u3059\uff0e
\n\u3053\u306e\u5bb9\u91cf\u306e\u5c0f\u3055\u3044\u753b\u50cf\u3092\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u306b\u57cb\u3081\u8fbc\u3080\u3068\u7a7a\u3063\u307d\u3088\u308a\u5f69\u308a\u304c\u8c4a\u304b\u306b\u306a\u3063\u305f\u308a\uff0cNSFW \u753b\u50cf\u3092\u30e2\u30b6\u30a4\u30af\u3059\u308b\u4ee3\u308f\u308a\u306b\u4f7f\u3063\u305f\u308a\u51fa\u6765\u307e\u3059\uff0e
\nBlurHash \u306fJSON, HTML, Shell \u3067\u5b89\u5168\u306a\u6b21\u306e\u30ad\u30e3\u30e9\u30af\u30bf\u3092\u4f7f\u3063\u305fBase 83 \u3067\u8868\u73fe\u3055\u308c\u307e\u3059\uff0e
\n\n\n\n\n0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~
\n
BlurHash \u306fMIT\u30e9\u30a4\u30bb\u30f3\u30b9\u3067\u305f\u304f\u3055\u3093\u306e\u8a00\u8a9e\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u3059\uff0e
\n\u4ee5\u4e0b\u306fDebian logo \u3092C \u5b9f\u88c5\u306eBlurHash \u306b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u6570\u3054\u3068\u306b\u304b\u3051\u3066\u307f\u3066\u3044\u307e\u3059\uff0e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u6570\u306b\u3088\u308a7\u301c133byte\u3067\u8868\u3055\u308c\u3066\u3044\u307e\u3059\uff0e
\n$ git clone https://github.com/woltapp/blurhash (1)\n$ cd blurhash/C/\n$ make blurhash_encoder (2)\n$ make blurhash_decoder (3)\n$ wget https://www.debian.org/logos/openlogo-nd-100.png (4)\n$ file openlogo-nd-100.png\nopenlogo-nd-100.png: PNG image data, 101 x 124, 8-bit colormap, non-interlaced\n$ for i in {1..8}; do ./blurhash_encoder $i $i openlogo-nd-100.png; done (5)\n00SFLy\nAJSFLyixHXx]\nKJSFLyixR5HXx]kCWBj[%#\nUJSFLyixR5xuHXx]kCofWBj[%#yDeTV@yXR5\neJSFLyixR5xuVsHXx]kCofj[WBj[%#yD%#eTV@yXR5tRV@o|%}kCRP\noJSFLyixR5xuVsiwHXx]kCofj[VsWBj[%#yD%#tleTV@yXR5tRofV@o|%}kCRPMJ%gV@ozozRPoz\nyJSFLyixR5xuVsiwtlHXx]kCofj[VsozWBj[%#yD%#tlkCeTV@yXR5tRofkCV@o|%}kCRPMJMd%gV@ozozRPozRPozaytlR5H?kBRP\n:JSFLyixR5xuVsiwtlt7HXx]kCofj[VsozVsWBj[%#yD%#tlkCj[eTV@yXR5tRofkCtRV@o|%}kCRPMJMdV@%gV@ozozRPozRPozozaytlR5H?kBRPtRxukCtRVsR5kCfkae\n$ for i in {1..8}; do ./blurhash_encoder $i $i openlogo-nd-100.png | wc -c; done (6)\n7\n13\n23\n37\n55\n77\n103\n133\n$ for i in {1..8}; do ./blurhash_decoder $( ./blurhash_encoder $i $i openlogo-nd-100.png ) 101 124 blur-$i.png; done (7)\n$ lsix (8)\nBlurHash \u306esource \u5165\u624b
\nencoder build
\ndecoder build
\nDebian logo file \u5165\u624b
\n\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u679a\u306bBlurHash \u306b\u5909\u63db
\n\u30d0\u30a4\u30c8\u6570\u78ba\u8a8d
\nBlurHash \u3092png \u306b\u5909\u63db
\npng \u306b\u5909\u63db\u3057\u305fBlurHash \u3092\u8868\u793a
\n
\u6614\u306fhtml \u306eimg \u30bf\u30b0\u306blowsrc \u3067\u30b5\u30a4\u30ba\u306e\u5c0f\u3055\u3044\u4ee3\u66ff\u753b\u50cf\u3092\u6307\u5b9a\u3057\u305f\u308a\u3057\u3066\u3044\u307e\u3057\u305f\u304c(\u73fe\u5728\u306f\u975e\u63a8\u5968)\u305d\u308c\u3088\u308a\u3082\u5c0f\u3055\u304f\u306a\u308b\u3068\u601d\u3044\u307e\u3059\uff0e
\nsayaka \u3061\u3083\u3093\u306e –force-blurhash \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e
\n\u307e\u305a\u306fbuild\uff0e
\nLinux \u3067\u306ebuild \u6642\u306b\u5f15\u3063\u304b\u304b\u308a\u3084\u3059\u3044\u306e\u304cGNU Make \u3067\u306f\u306a\u304fbmake \u3092\u4f7f\u3046\u3068\u3053\u308d\uff0e
$ git checkout a4e143d50ceee29a61610d1ee76e4030b0bba273\nPrevious HEAD position was d76cb2c ver 3.8.1 (2024/09/21)\nHEAD is now at a4e143d src/misskey: --force-blurhash \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u5b9f\u88c5\u3057\u3066\u307f\u308b\u3002 \u753b\u50cf\u8868\u793a\u3092 Blurhash \u3060\u3051\u306b\u3059\u308b\u30e2\u30fc\u30c9\u3002\n$ ./configure\n$ bmake -DRELEASE all\n$ src/sayaka\nusage: sayaka <command> [<options...>]\n <command>\n -h,--home : Home timeline mode (needs --server and --token)\n -l,--local : Local timeline mode (needs --server)\n -p,--play=<file|-> : Playback mode\n <options>\n -s,--server=<host> : Set misskey server\n -t,--token=<file> : Set misskey access token file\n -c,--color=<color> : 256,16,8,2,1 and gray[2-256] (default:256)\n --show-cw : Open CW(Contents Warning) part\n --nsfw=<show|blur|alt|hide> : How to show NSFW contents (default:blur)\n --show-image=<yes|no|auto> : Whether to show image or not (default:auto)\n -r,--record=<file> : Record JSON to <file>\n --help-all : More details\n
build \u51fa\u6765\u305f\u306e\u3067\u65e9\u901f --force-blurhash \u3092\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e\u4f8b\u3048\u3070 misskey.io \u3092\u3053\u3093\u306a\u611f\u3058\u3067\uff0e
$ src/sayaka --force-blurhash -l -s misskey.io\n
\u3053\u308c\u307e\u3067\u306f\u65e2\u5b9a\u5024\u3067\u306fNSFW \u30b3\u30f3\u30c6\u30f3\u30c4\u304cBlurHash \u3067\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u304c\uff0c--force-blurhash \u3067\u306f\u5168\u3066\u306e\u30a2\u30a4\u30b3\u30f3\u753b\u50cf\u3082\u6dfb\u4ed8\u753b\u50cf\u3082BlurHash \u306b\u306a\u308a\u307e\u3059\uff0e

| \n Note \n | \n\n\u30a2\u30ab\u30a6\u30f3\u30c8\u3084\u672c\u6587\u306b\u306f\u30e2\u30b6\u30a4\u30af\u3092\u639b\u3051\u3066\u3042\u308a\u307e\u3059\uff0e\n | \n
BlurHash \u3067\u753b\u50cf\u30b5\u30a4\u30ba\u304c\u5c0f\u3055\u304f\u306a\u308b\u3063\u3066\u3053\u3068\u306f\u901a\u4fe1\u6599\u3082\u30c7\u30fc\u30bf\u91cf\u3082\u5c0f\u3055\u304f\u306a\u3063\u3066\u3044\u3066\u30d7\u30a2\u306a\u56de\u7dda\u3067\u3082\u3044\u3044\u611f\u3058\u306b\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u3067\u304d\u305d\u3046\u306a\u6c17\u304c\u3057\u307e\u3059\uff0e
\nBlurHash \u3068Sixel \u309260\u79d2\u305a\u3064 --record \u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\u671f\u5f85\u306b\u53cd\u3057\u3066BlurHash \u306e\u307b\u3046\u304c\u5927\u5206\u5927\u304d\u3044\u3067\u3059\uff0e
$ timeout 60 src/sayaka --record=blurhash.rec --force-blurhash -l -s misskey.io\n$ timeout 60 src/sayaka --record=sixel.rec -l -s misskey.io\n$ ls -s *.rec\n436 blurhash.rec 44 sixel.rec\n
ttyrec \u3067\u3082\u540c\u3058\u3088\u3046\u306a\u611f\u3058\uff0e
\n$ ttyrec -f blurhash.ttyrec -- timeout 60 src/sayaka --force-blurhash -l -s misskey.io\n$ ttyrec -f sixel.ttyrec -- timeout 60 src/sayaka -l -s misskey.io\n$ ls -s *.ttyrec\n1768 blurhash.ttyrec 228 sixel.ttyrec\n
\u901a\u4fe1\u91cf\u306f\u3069\u3046\u3060\u308d\u3046\u3068nethogs \u30b3\u30de\u30f3\u30c9\u3067 $ sudo nethogs -P $(pgrep sayaka) -l \u306a\u611f\u3058\u3067\u898b\u3066\u307f\u308b\u3068\u3084\u306f\u308aBlurHash \u306e\u307b\u3046\u304c\u901a\u4fe1\u91cf\u304c\u591a\u3044\u3088\u3046\u306a?
NetHogs version 0.8.8\n\n PID USER PROGRAM DEV SENT RECEIVED\n ? root unknown TCP 435.079 11.067 kB/s\n2782477 matoken src/sayaka -.. enx349971e11a0f 0.252 6.934 kB/s\n\n TOTAL 435.331 18.001 kB/s\n
NetHogs version 0.8.8\n\n PID USER PROGRAM DEV SENT RECEIVED\n ? root unknown TCP 432.206 11.271 kB/s\n2787797 matoken src/sayaka -.. enx349971e11a0f 0.150 0.885 kB/s\n\n TOTAL 432.356 12.156 kB/s\n
\u9332\u753b\u30c7\u30fc\u30bf\u3092\u898b\u308b\u3068\u4ef6\u6570\u304c\u9055\u3044\u307e\u3059\uff0eSixel \u306e\u3068\u304d\u306b\u306a\u306b\u304b\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u304c\u3042\u308a\u305d\u3046\u3067\u3059\uff0e\u56de\u7dda\u306e\u554f\u984c?
\n\u5f8c\u3067VPS \u3067\u3082\u78ba\u8a8d\u3057\u3066\u307f\u3088\u3046\u3068\u601d\u3044\u307e\u3059\uff0e
$ jq .body.type blurhash.rec | wc -l\n119\n$ jq .body.type sixel.rec | wc -l\n10\n