{ "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/tui/feed/json/ -- and add it your reader.", "home_page_url": "https://matoken.org/blog/tag/tui/", "feed_url": "https://matoken.org/blog/tag/tui/feed/json/", "language": "ja", "title": "TUI – 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=5121", "url": "https://matoken.org/blog/2025/12/31/cloudflare-speed-test-with-tui/", "title": "Cloudflare\u306e\u901f\u5ea6\u30c6\u30b9\u30c8\u3092TUI\u3067", "content_html": "
\n
\n

\n
\n

Cloudflare \u306e\u901f\u5ea6\u8a08\u6e2c\u30b5\u30a4\u30c8\u306espeed.cloudflare.com \u3092TUI \u3067\u8a08\u6e2c\u3067\u304d\u308bcloudflare-speed-cli \u3068\u3044\u3046\u3082\u306e\u3092\u77e5\u3063\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e
\ncloudflare-speed-cli \u306fRust \u88fd\u3067GPL-3.0 license \u3067\u3059\uff0e

\n
\n\n
\n

\u985e\u4f3c\u306e\u3082\u306e\u3067\uff0cspeedtest.net \u3092\u8a08\u6e2c\u3067\u304d\u308bspeedtest-cli \u3092\u3088\u304f\u4f7f\u3063\u3066\u3044\u307e\u3059\u304c\uff0cCloudflare \u3082\u4f7f\u3048\u308b\u3068\u4fbf\u5229\u305d\u3046\u3067\u3059\uff0e

\n
\n

\n
\n

cloudflare-speed-cli \u306fGitHub Releases \u306b\u306fLinux x86_64, aarch64, macOS aarch64, x86_64, Windows x86_64 \u306e\u30d0\u30a4\u30ca\u30ea\u304c\u3042\u308a\u307e\u3059\uff0e\u3057\u304b\u3057\u4f8b\u306b\u3088\u3063\u3066Raspberry Pi bookworm armhf(Arm 32bit)\u3067\u3082\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e

\n
\n
\n

Rust \u95a2\u9023\u306fasciimena 3.0 \u3092build \u3057\u305f\u3068\u304d\u306b\u5165\u308c\u305f\u3082\u306e\u304b\u3089rustup \u30671.92.0 \u306b\u3057\u305f\u3082\u306e\u3092\u4f7f\u3044\u307e\u3059\uff0e

\n
\n\n
\n

cargo install \u3067\u6642\u9593\u304c\u639b\u304b\u308a\u307e\u3059\u304c\u7279\u306b\u3064\u307e\u3065\u3044\u305f\u308a\u305b\u305abuild \u3067\u304d\u307e\u3057\u305f\uff0e

\n
\n
\n
\n
$ cargo --version\nwarning: `/home/matoken/.cargo/config` is deprecated in favor of `config.toml`\n  |\n  = help: if you need to support cargo 1.38 or earlier, you can symlink `config` to `config.toml`\ncargo 1.92.0 (344c4567c 2025-10-21)\n$ cargo install --git https://github.com/kavehtehrani/cloudflare-speed-cli --features tui\n$ cloudflare-speed-cli --help\nCloudflare-based speed test with optional TUI\n\nUsage: cloudflare-speed-cli [OPTIONS]\n\nOptions:\n      --base-url <BASE_URL>\n          Base URL for the Cloudflare speed test service [default: https://speed.cloudflare.com]\n      --json\n          Print JSON result and exit (no TUI)\n      --text\n          Print text summary and exit (no TUI)\n      --download-duration <DOWNLOAD_DURATION>\n          Download phase duration [default: 10s]\n      --upload-duration <UPLOAD_DURATION>\n          Upload phase duration [default: 10s]\n      --idle-latency-duration <IDLE_LATENCY_DURATION>\n          Idle latency probe duration (pre-test) [default: 2s]\n      --concurrency <CONCURRENCY>\n          Concurrency for download/upload workers [default: 6]\n      --download-bytes-per-req <DOWNLOAD_BYTES_PER_REQ>\n          Bytes per download request [default: 10000000]\n      --upload-bytes-per-req <UPLOAD_BYTES_PER_REQ>\n          Bytes per upload request [default: 5000000]\n      --probe-interval-ms <PROBE_INTERVAL_MS>\n          Probe interval in milliseconds [default: 250]\n      --probe-timeout-ms <PROBE_TIMEOUT_MS>\n          Probe timeout in milliseconds [default: 800]\n      --experimental\n          Enable experimental features (TURN fetch + UDP-like loss probe)\n      --export-json <EXPORT_JSON>\n          Export results as JSON\n      --export-csv <EXPORT_CSV>\n          Export results as CSV\n      --auto-save <AUTO_SAVE>\n          Use --auto-save true or --auto-save false to override (default: true) [default: true] [possible values: true, false]\n      --interface <INTERFACE>\n          Bind to a specific network interface (e.g., ens18, eth0)\n      --source <SOURCE>\n          Bind to a specific source IP address (e.g., 192.168.10.0)\n      --certificate <CERTIFICATE>\n          Path to a custom TLS certificate file (PEM or DER format)\n  -h, --help\n          Print help\n  -V, --version\n          Print version\n$ cloudflare-speed-cli --version\ncloudflare-speed-cli 0.3.1
\n
\n
\n
\n

\u65e9\u901f\u8a66\u3057\u3066\u307f\u307e\u3059\uff0ecloudflare-speed-cli \u3092\u30aa\u30d7\u30b7\u30e7\u30f3\u306a\u3057\u3067\u5b9f\u884c\u3059\u308b\u3068TUI \u3067\u5b9f\u884c\u3055\u308c\u307e\u3059\uff0e\u8d77\u52d5\u3057\u3066\u3059\u3050\u306b\u8a08\u6e2c\u304c\u59cb\u307e\u308a\uff0c\u65e2\u5b9a\u5024\u3067\u306f\u8a08\u6e2c\u7d50\u679c\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\uff0etab key \u3067History \u30da\u30fc\u30b8\u306b\u9077\u79fb\u3059\u308b\u3068\u904e\u53bb\u306e\u8a08\u6e2c\u7d50\u679c\u3092\u95b2\u89a7\u3057\u305f\u308a\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u305f\u308a\u3067\u304d\u307e\u3059\uff0e

\n
\n
\n

\"cloudflare

\n
\n

\n
\n

--text \u30aa\u30d7\u30b7\u30e7\u30f3\u3067cli \u30e2\u30fc\u30c9\u3067\u3059\u304c\uff0c\u30d7\u30ed\u30b0\u30ec\u30b9\u304c\u5927\u91cf\u306b\u51fa\u3066\u3061\u3087\u3063\u3068\u4f7f\u3044\u3065\u3089\u3044\u611f\u3058\u3067\u3059\uff0e

\n
\n

\n
\n

\u30d7\u30ed\u30b9\u30ec\u30b9\u90e8\u5206\u306fSTDERR \u306a\u306e\u3067\u305d\u308c\u3092\u6368\u3066\u3066\u3057\u307e\u3063\u3066\u3082\u3044\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093

\n
\n
\n
\n
$ cloudflare-speed-cli --text 2>/dev/null\nIP/Colo/ASN: 133.106.160.49 / NRT / 138384 (-)\nDownload: 23.73 Mbps\nUpload:   2.47 Mbps\nIdle latency p50/p90/p99: 98.9/110.7/110.7 ms (loss 0.0%, jitter 10.2 ms)\nLoaded latency (download) p50/p90/p99: 438.0/578.6/755.2 ms (loss 0.0%, jitter 130.1 ms)\nLoaded latency (upload) p50/p90/p99: 654.8/794.1/794.1 ms (loss 45.5%, jitter 144.4 ms)
\n
\n
\n
\n

\u3053\u3093\u306a\u611f\u3058\u3067\u5b9a\u671f\u7684\u306b\u8a08\u6e2c\u3059\u308b\u306e\u306b\u3082\u4fbf\u5229\u304b\u3082\u3068\u601d\u3044\u307e\u3057\u305f\u304c\uff0ccli \u30e2\u30fc\u30c9\u3067\u306f\u65e2\u5b9a\u5024\u3067\u306f\u7d50\u679c\u3092\u4fdd\u5b58\u3057\u306a\u3044\u3088\u3046\u3067\u3059\uff0e

\n
\n
\n
\n
$ watch -n 3600 -- cloudflare-speed-cli --text
\n
\n
\n
\n

--auto-save true \u3082\u8ffd\u52a0\u3059\u308b\u3068\u7d50\u679c\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\uff0e

\n
\n
\n
\n
$ watch -n 3600 -- cloudflare-speed-cli --text --auto-save true
\n
\n
\n
\n

\u305f\u3060\uff0c\u4ee5\u4e0b\u306e\u3088\u3046\u306bTUI \u30e2\u30fc\u30c9\u306e\u8a08\u6e2c\u6642\u306e\u30ed\u30b0\u306b\u306f --interface \u3092\u6307\u5b9a\u3057\u3066\u3082Interface \u3084AP \u540d\u306f\u4fdd\u5b58\u3055\u308c\u306a\u3044\u3088\u3046\u3067\u3059\uff0e

\n
\n
\n
\n
\u2502 3.   2025-12-31 06:30:11 +09:00  DL   20.69 Mbps  UL    4.66 Mbps  Idle p50  103.7 ms  -  (1)\n\u2502 4.   2025-12-31 06:08:33 +09:00  DL   21.73 Mbps  UL    3.16 Mbps  Idle p50  100.7 ms  wlan0  TP-L13💻 (2)
\n
\n
\n
\n
    \n
  1. \n

    --text \u3067cli \u30e2\u30fc\u30c9\u3067\u5b9f\u884c\u3057\u305f\u3068\u304d\u306e\u7d50\u679c

    \n
  2. \n
  3. \n

    TUI \u30e2\u30fc\u30c9\u3067\u5b9f\u884c\u3057\u305f\u3068\u304d\u306e\u7d50\u679c

    \n
  4. \n
\n
\n
\n
\n
\n

SEE ALSO

\n
\n
\n\n
\n
$ speedtest-cli\nRetrieving speedtest.net configuration...\nTesting from Rakuten Mobile Network (133.106.160.42)...\nRetrieving speedtest.net server list...\nSelecting best server based on ping...\nHosted by GSL Networks (Tokyo) [0.26 km]: 60.882 ms\nTesting download speed................................................................................\nDownload: 12.70 Mbit/s\nTesting upload speed......................................................................................................\nUpload: 2.69 Mbit/s
\n
\n
\n
\n
Speedtest CLI: Internet speed test for the command line \u203bOokla\u516c\u5f0f\u3060\u304c\u30d7\u30ed\u30d7\u30e9\u30a4\u30a8\u30bf\u30ea
\n
\n
$ speedtest\n\n   Speedtest by Ookla\n\n      Server: IPA CyberLab 400G - Tokyo (id: 48463)\n         ISP: Rakuten Mobile Network\nIdle Latency:    50.15 ms   (jitter: 1.41ms, low: 48.98ms, high: 52.36ms)\n    Download:    20.75 Mbps (data used: 19.9 MB)\n                262.40 ms   (jitter: 71.32ms, low: 72.73ms, high: 398.26ms)\n      Upload:     2.96 Mbps (data used: 1.6 MB)\n                779.27 ms   (jitter: 95.79ms, low: 75.05ms, high: 1148.99ms)\n Packet Loss:     0.0%\n  Result URL: https://www.speedtest.net/result/c/e1a349cf-53eb-4d63-b8f4-8550dabd772d
\n
\n
\n
\n
n8henrie/fastcli: Python3 speed test via Fast.com fast.com \u3092\u4f7f\u3044cli \u3067\u8a08\u6e2c\u2026\u20262025-12-27\u306barchived \u3055\u308c\u3066\u3044\u305f
\n
\n
$ python -m fastcli -v\nApproximate download speed: 17.48 Mbps
\n
\n
\n
\n
\n", "content_text": "Cloudflare \u306e\u901f\u5ea6\u8a08\u6e2c\u30b5\u30a4\u30c8\u306espeed.cloudflare.com \u3092TUI \u3067\u8a08\u6e2c\u3067\u304d\u308bcloudflare-speed-cli \u3068\u3044\u3046\u3082\u306e\u3092\u77e5\u3063\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\ncloudflare-speed-cli \u306fRust \u88fd\u3067GPL-3.0 license \u3067\u3059\uff0e\n\n\n\n\nkavehtehrani/cloudflare-speed-cli: CLI for internet speed test via cloudflare\n\n\n\nTUI app for internet speed test via Cloudflare’s endpoint : r/commandline\n\n\n\n\n\n\n\n\u985e\u4f3c\u306e\u3082\u306e\u3067\uff0cspeedtest.net \u3092\u8a08\u6e2c\u3067\u304d\u308bspeedtest-cli \u3092\u3088\u304f\u4f7f\u3063\u3066\u3044\u307e\u3059\u304c\uff0cCloudflare \u3082\u4f7f\u3048\u308b\u3068\u4fbf\u5229\u305d\u3046\u3067\u3059\uff0e\n\n\n\ncloudflare-speed-cli \u306fGitHub Releases \u306b\u306fLinux x86_64, aarch64, macOS aarch64, x86_64, Windows x86_64 \u306e\u30d0\u30a4\u30ca\u30ea\u304c\u3042\u308a\u307e\u3059\uff0e\u3057\u304b\u3057\u4f8b\u306b\u3088\u3063\u3066Raspberry Pi bookworm armhf(Arm 32bit)\u3067\u3082\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e\n\n\nRust \u95a2\u9023\u306fasciimena 3.0 \u3092build \u3057\u305f\u3068\u304d\u306b\u5165\u308c\u305f\u3082\u306e\u304b\u3089rustup \u30671.92.0 \u306b\u3057\u305f\u3082\u306e\u3092\u4f7f\u3044\u307e\u3059\uff0e\n\n\n\n\nasciinema 3.0\u3068Raspberry Pi armhf\u74b0\u5883\u3067\u306e\u30d3\u30eb\u30c9 \u2013 matoken’s blog\n\n\n\n\ncargo install \u3067\u6642\u9593\u304c\u639b\u304b\u308a\u307e\u3059\u304c\u7279\u306b\u3064\u307e\u3065\u3044\u305f\u308a\u305b\u305abuild \u3067\u304d\u307e\u3057\u305f\uff0e\n\n\n\n$ cargo --version\nwarning: `/home/matoken/.cargo/config` is deprecated in favor of `config.toml`\n |\n = help: if you need to support cargo 1.38 or earlier, you can symlink `config` to `config.toml`\ncargo 1.92.0 (344c4567c 2025-10-21)\n$ cargo install --git https://github.com/kavehtehrani/cloudflare-speed-cli --features tui\n$ cloudflare-speed-cli --help\nCloudflare-based speed test with optional TUI\n\nUsage: cloudflare-speed-cli [OPTIONS]\n\nOptions:\n --base-url <BASE_URL>\n Base URL for the Cloudflare speed test service [default: https://speed.cloudflare.com]\n --json\n Print JSON result and exit (no TUI)\n --text\n Print text summary and exit (no TUI)\n --download-duration <DOWNLOAD_DURATION>\n Download phase duration [default: 10s]\n --upload-duration <UPLOAD_DURATION>\n Upload phase duration [default: 10s]\n --idle-latency-duration <IDLE_LATENCY_DURATION>\n Idle latency probe duration (pre-test) [default: 2s]\n --concurrency <CONCURRENCY>\n Concurrency for download/upload workers [default: 6]\n --download-bytes-per-req <DOWNLOAD_BYTES_PER_REQ>\n Bytes per download request [default: 10000000]\n --upload-bytes-per-req <UPLOAD_BYTES_PER_REQ>\n Bytes per upload request [default: 5000000]\n --probe-interval-ms <PROBE_INTERVAL_MS>\n Probe interval in milliseconds [default: 250]\n --probe-timeout-ms <PROBE_TIMEOUT_MS>\n Probe timeout in milliseconds [default: 800]\n --experimental\n Enable experimental features (TURN fetch + UDP-like loss probe)\n --export-json <EXPORT_JSON>\n Export results as JSON\n --export-csv <EXPORT_CSV>\n Export results as CSV\n --auto-save <AUTO_SAVE>\n Use --auto-save true or --auto-save false to override (default: true) [default: true] [possible values: true, false]\n --interface <INTERFACE>\n Bind to a specific network interface (e.g., ens18, eth0)\n --source <SOURCE>\n Bind to a specific source IP address (e.g., 192.168.10.0)\n --certificate <CERTIFICATE>\n Path to a custom TLS certificate file (PEM or DER format)\n -h, --help\n Print help\n -V, --version\n Print version\n$ cloudflare-speed-cli --version\ncloudflare-speed-cli 0.3.1\n\n\n\n\u65e9\u901f\u8a66\u3057\u3066\u307f\u307e\u3059\uff0ecloudflare-speed-cli \u3092\u30aa\u30d7\u30b7\u30e7\u30f3\u306a\u3057\u3067\u5b9f\u884c\u3059\u308b\u3068TUI \u3067\u5b9f\u884c\u3055\u308c\u307e\u3059\uff0e\u8d77\u52d5\u3057\u3066\u3059\u3050\u306b\u8a08\u6e2c\u304c\u59cb\u307e\u308a\uff0c\u65e2\u5b9a\u5024\u3067\u306f\u8a08\u6e2c\u7d50\u679c\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\uff0etab key \u3067History \u30da\u30fc\u30b8\u306b\u9077\u79fb\u3059\u308b\u3068\u904e\u53bb\u306e\u8a08\u6e2c\u7d50\u679c\u3092\u95b2\u89a7\u3057\u305f\u308a\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u305f\u308a\u3067\u304d\u307e\u3059\uff0e\n\n\n\n\n\n\n--text \u30aa\u30d7\u30b7\u30e7\u30f3\u3067cli \u30e2\u30fc\u30c9\u3067\u3059\u304c\uff0c\u30d7\u30ed\u30b0\u30ec\u30b9\u304c\u5927\u91cf\u306b\u51fa\u3066\u3061\u3087\u3063\u3068\u4f7f\u3044\u3065\u3089\u3044\u611f\u3058\u3067\u3059\uff0e\n\n\n\n\u30d7\u30ed\u30b9\u30ec\u30b9\u90e8\u5206\u306fSTDERR \u306a\u306e\u3067\u305d\u308c\u3092\u6368\u3066\u3066\u3057\u307e\u3063\u3066\u3082\u3044\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\n\n\n\n$ cloudflare-speed-cli --text 2>/dev/null\nIP/Colo/ASN: 133.106.160.49 / NRT / 138384 (-)\nDownload: 23.73 Mbps\nUpload: 2.47 Mbps\nIdle latency p50/p90/p99: 98.9/110.7/110.7 ms (loss 0.0%, jitter 10.2 ms)\nLoaded latency (download) p50/p90/p99: 438.0/578.6/755.2 ms (loss 0.0%, jitter 130.1 ms)\nLoaded latency (upload) p50/p90/p99: 654.8/794.1/794.1 ms (loss 45.5%, jitter 144.4 ms)\n\n\n\n\u3053\u3093\u306a\u611f\u3058\u3067\u5b9a\u671f\u7684\u306b\u8a08\u6e2c\u3059\u308b\u306e\u306b\u3082\u4fbf\u5229\u304b\u3082\u3068\u601d\u3044\u307e\u3057\u305f\u304c\uff0ccli \u30e2\u30fc\u30c9\u3067\u306f\u65e2\u5b9a\u5024\u3067\u306f\u7d50\u679c\u3092\u4fdd\u5b58\u3057\u306a\u3044\u3088\u3046\u3067\u3059\uff0e\n\n\n\n$ watch -n 3600 -- cloudflare-speed-cli --text\n\n\n\n--auto-save true \u3082\u8ffd\u52a0\u3059\u308b\u3068\u7d50\u679c\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3059\uff0e\n\n\n\n$ watch -n 3600 -- cloudflare-speed-cli --text --auto-save true\n\n\n\n\u305f\u3060\uff0c\u4ee5\u4e0b\u306e\u3088\u3046\u306bTUI \u30e2\u30fc\u30c9\u306e\u8a08\u6e2c\u6642\u306e\u30ed\u30b0\u306b\u306f --interface \u3092\u6307\u5b9a\u3057\u3066\u3082Interface \u3084AP \u540d\u306f\u4fdd\u5b58\u3055\u308c\u306a\u3044\u3088\u3046\u3067\u3059\uff0e\n\n\n\n\u2502 3. 2025-12-31 06:30:11 +09:00 DL 20.69 Mbps UL 4.66 Mbps Idle p50 103.7 ms - (1)\n\u2502 4. 2025-12-31 06:08:33 +09:00 DL 21.73 Mbps UL 3.16 Mbps Idle p50 100.7 ms wlan0 TP-L13💻 (2)\n\n\n\n\n\n--text \u3067cli \u30e2\u30fc\u30c9\u3067\u5b9f\u884c\u3057\u305f\u3068\u304d\u306e\u7d50\u679c\n\n\nTUI \u30e2\u30fc\u30c9\u3067\u5b9f\u884c\u3057\u305f\u3068\u304d\u306e\u7d50\u679c\n\n\n\n\n\n\nSEE ALSO\n\n\nsivel/speedtest-cli: Command line interface for testing internet bandwidth using speedtest.net speedtest.net \u3092\u4f7f\u3044cli \u3067\u8a08\u6e2c\n\n$ speedtest-cli\nRetrieving speedtest.net configuration...\nTesting from Rakuten Mobile Network (133.106.160.42)...\nRetrieving speedtest.net server list...\nSelecting best server based on ping...\nHosted by GSL Networks (Tokyo) [0.26 km]: 60.882 ms\nTesting download speed................................................................................\nDownload: 12.70 Mbit/s\nTesting upload speed......................................................................................................\nUpload: 2.69 Mbit/s\n\n\n\nSpeedtest CLI: Internet speed test for the command line \u203bOokla\u516c\u5f0f\u3060\u304c\u30d7\u30ed\u30d7\u30e9\u30a4\u30a8\u30bf\u30ea\n\n$ speedtest\n\n Speedtest by Ookla\n\n Server: IPA CyberLab 400G - Tokyo (id: 48463)\n ISP: Rakuten Mobile Network\nIdle Latency: 50.15 ms (jitter: 1.41ms, low: 48.98ms, high: 52.36ms)\n Download: 20.75 Mbps (data used: 19.9 MB)\n 262.40 ms (jitter: 71.32ms, low: 72.73ms, high: 398.26ms)\n Upload: 2.96 Mbps (data used: 1.6 MB)\n 779.27 ms (jitter: 95.79ms, low: 75.05ms, high: 1148.99ms)\n Packet Loss: 0.0%\n Result URL: https://www.speedtest.net/result/c/e1a349cf-53eb-4d63-b8f4-8550dabd772d\n\n\n\nn8henrie/fastcli: Python3 speed test via Fast.com fast.com \u3092\u4f7f\u3044cli \u3067\u8a08\u6e2c\u2026\u20262025-12-27\u306barchived \u3055\u308c\u3066\u3044\u305f\n\n$ python -m fastcli -v\nApproximate download speed: 17.48 Mbps", "date_published": "2025-12-31T07:45:08+09:00", "date_modified": "2025-12-31T07:45:10+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "Cloudflare", "Raspberry Pi OS", "speedtest", "TUI", "bookworm", "Debian", "Linux", "sid" ] }, { "id": "https://matoken.org/blog/?p=4923", "url": "https://matoken.org/blog/2025/12/12/ascii_moon/", "title": "\u6708\u306e\u6e80\u3061\u6b20\u3051\u3092TUI\u3067\u8868\u793a\u3059\u308bASCII Moon", "content_html": "

\n
\n

asciimoon.com \u3068\u3044\u3046\u6708\u306e\u6e80\u3061\u6b20\u3051\u304casciiart \u3067\u8868\u73fe\u3055\u308c\u305f\u30b5\u30a4\u30c8\u304c\u3042\u308a\u307e\u3059\uff0e\u305f\u3060\u3057JavaScript\u304c\u7121\u3044\u3068\u6e80\u3061\u6b20\u3051\u306f\u5206\u304b\u3089\u305aw3m \u306a\u3069\u3067\u306f\u4eca\u3072\u3068\u3064\u306a\u611f\u3058\u3067\u3057\u305f\uff0e

\n
\n
\n

ASCII Moon \u306f\u305d\u306esite\u306b\u30a4\u30f3\u30b9\u30d1\u30a4\u30a2\u3055\u308c\u305f\u6708\u306e\u6e80\u3061\u6b20\u3051\u3092TUI \u3067\u8868\u793a\u3059\u308b\u30b3\u30de\u30f3\u30c9\u3067\u3059\uff0e

\n
\n
\n\n
\n

\n
\n

ASCII Moon \u306fReleases page \u306bLinux/macOS/Windows \u306eamd64 \u7248\u306e\u30d0\u30a4\u30ca\u30ea\u304c\u7f6e\u3044\u3066\u3042\u308a\u307e\u3059\uff0e
\nLinux armhf \u3067\u306f\u3069\u3046\u3060\u308d\u3046\u3068\u4eca\u56de\u306fsource \u304b\u3089build \u3057\u307e\u3057\u305f\uff0e

\n
\n
\n
\n
$ git clone https://github.com/rockydd/ascii_moon.git\n$ cd ascii_moon\n$ cargo build --release\n$ ./target/release/ascii_moon\n$ ./target/release/ascii_moon --help\nA TUI to show the moon phase\n\nUsage: ascii_moon [OPTIONS]\n\nOptions:\n  -d, --date <DATE>    Date in YYYY-MM-DD format (defaults to today)\n      --lines <LINES>  Render the moon to a specific number of lines (non-interactive)\n  -h, --help           Print help\n  -V, --version        Print version\n$ ./target/release/ascii_moon --version\nascii_moon 0.2.0
\n
\n
\n
\n

\u30aa\u30d7\u30b7\u30e7\u30f3\u7121\u3057\u3067\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\uff0e
\n-d, --date <\u65e5\u4ed8(YYY-MM-DD)> \u3067\u7279\u5b9a\u306e\u65e5\u4ed8\u3067\u8d77\u52d5\uff0e
\n--lines <\u884c\u6570> \u306fscript \u3084MOTD \u306a\u3069\u5411\u3051\u3067\u6307\u5b9a\u3057\u305f\u884c\u6570\u3067\u6708\u306eAsciiArt \u3092\u51fa\u529b\u3057\u307e\u3059\uff0e
\n-d, --date \u3068 --lines \u306f\u4e00\u7dd2\u306b\u6307\u5b9a\u3067\u304d\u307e\u3059\uff0e

\n
\n
\n

\"ascii

\n
\n
\n

\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\u3067\u306f\u30ab\u30fc\u30bd\u30eb\u5de6\u53f3\u30671\u65e5\u5358\u4f4d\u3067\u65e5\u4ed8\u3092\u64cd\u4f5c\u3067\u304d\u307e\u3059\uff0el key \u3067\u5730\u540d\u306e\u30e9\u30d9\u30eb\u306eon/off\uff0cL key \u3067\u30e9\u30d9\u30eb\u306e\u8a00\u8a9e\u5909\u66f4\uff0ci key \u3067\u4e0b\u90e8\u306e\u60c5\u5831\u306eon/off \u304c\u3067\u304d\u307e\u3059\uff0e
\n\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\u306e\u52d5\u4f5c\u306e\u72b6\u614b\u306f\u4ee5\u4e0b\u306easciinema \u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059\uff0e

\n
\n

\n
\n

TUI \u3067\u3082\u3053\u306eAscii Moon, astroterm, tracker \u306a\u3069\u9762\u767d\u3044\u5929\u6587\u30a2\u30d7\u30ea\u304c\u5897\u3048\u3066\u3044\u308b\u611f\u3058\u304c\u3057\u307e\u3059\uff0e

\n
\n
\n\n
\n
\n
\u74b0\u5883
\n
\n
$ ./target/release/ascii_moon --version\nascii_moon 0.2.0\n$ cargo version\nwarning: `/home/matoken/.cargo/config` is deprecated in favor of `config.toml`\n  |\n  = help: if you need to support cargo 1.38 or earlier, you can symlink `config` to `config.toml`\ncargo 1.92.0 (344c4567c 2025-10-21)\n$ cargo build --release\n$ lsb_release -dr\nNo LSB modules are available.\nDescription:    Raspbian GNU/Linux 12 (bookworm)\nRelease:        12\n$ arch\narmv7l\n$ cat /sys/firmware/devicetree/base/model\nRaspberry Pi 3 Model B Rev 1.2
\n
\n
\n

\n
Post by @matoken
\n
View on Mastodon
\n

\n

\n", "content_text": "asciimoon.com \u3068\u3044\u3046\u6708\u306e\u6e80\u3061\u6b20\u3051\u304casciiart \u3067\u8868\u73fe\u3055\u308c\u305f\u30b5\u30a4\u30c8\u304c\u3042\u308a\u307e\u3059\uff0e\u305f\u3060\u3057JavaScript\u304c\u7121\u3044\u3068\u6e80\u3061\u6b20\u3051\u306f\u5206\u304b\u3089\u305aw3m \u306a\u3069\u3067\u306f\u4eca\u3072\u3068\u3064\u306a\u611f\u3058\u3067\u3057\u305f\uff0e\n\n\nASCII Moon \u306f\u305d\u306esite\u306b\u30a4\u30f3\u30b9\u30d1\u30a4\u30a2\u3055\u308c\u305f\u6708\u306e\u6e80\u3061\u6b20\u3051\u3092TUI \u3067\u8868\u793a\u3059\u308b\u30b3\u30de\u30f3\u30c9\u3067\u3059\uff0e\n\n\n\n\nrockydd/ascii_moon: A TUI (Terminal User Interface) application written in Rust that displays the moon phase in ASCII art.\n\n\n\n\n\nASCII Moon \u306fReleases page \u306bLinux/macOS/Windows \u306eamd64 \u7248\u306e\u30d0\u30a4\u30ca\u30ea\u304c\u7f6e\u3044\u3066\u3042\u308a\u307e\u3059\uff0e\nLinux armhf \u3067\u306f\u3069\u3046\u3060\u308d\u3046\u3068\u4eca\u56de\u306fsource \u304b\u3089build \u3057\u307e\u3057\u305f\uff0e\n\n\n\n$ git clone https://github.com/rockydd/ascii_moon.git\n$ cd ascii_moon\n$ cargo build --release\n$ ./target/release/ascii_moon\n$ ./target/release/ascii_moon --help\nA TUI to show the moon phase\n\nUsage: ascii_moon [OPTIONS]\n\nOptions:\n -d, --date <DATE> Date in YYYY-MM-DD format (defaults to today)\n --lines <LINES> Render the moon to a specific number of lines (non-interactive)\n -h, --help Print help\n -V, --version Print version\n$ ./target/release/ascii_moon --version\nascii_moon 0.2.0\n\n\n\n\u30aa\u30d7\u30b7\u30e7\u30f3\u7121\u3057\u3067\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\uff0e\n-d, --date <\u65e5\u4ed8(YYY-MM-DD)> \u3067\u7279\u5b9a\u306e\u65e5\u4ed8\u3067\u8d77\u52d5\uff0e\n--lines <\u884c\u6570> \u306fscript \u3084MOTD \u306a\u3069\u5411\u3051\u3067\u6307\u5b9a\u3057\u305f\u884c\u6570\u3067\u6708\u306eAsciiArt \u3092\u51fa\u529b\u3057\u307e\u3059\uff0e\n-d, --date \u3068 --lines \u306f\u4e00\u7dd2\u306b\u6307\u5b9a\u3067\u304d\u307e\u3059\uff0e\n\n\n\n\n\n\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\u3067\u306f\u30ab\u30fc\u30bd\u30eb\u5de6\u53f3\u30671\u65e5\u5358\u4f4d\u3067\u65e5\u4ed8\u3092\u64cd\u4f5c\u3067\u304d\u307e\u3059\uff0el key \u3067\u5730\u540d\u306e\u30e9\u30d9\u30eb\u306eon/off\uff0cL key \u3067\u30e9\u30d9\u30eb\u306e\u8a00\u8a9e\u5909\u66f4\uff0ci key \u3067\u4e0b\u90e8\u306e\u60c5\u5831\u306eon/off \u304c\u3067\u304d\u307e\u3059\uff0e\n\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\u306e\u52d5\u4f5c\u306e\u72b6\u614b\u306f\u4ee5\u4e0b\u306easciinema \u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059\uff0e\n\n\n\nTUI \u3067\u3082\u3053\u306eAscii Moon, astroterm, tracker \u306a\u3069\u9762\u767d\u3044\u5929\u6587\u30a2\u30d7\u30ea\u304c\u5897\u3048\u3066\u3044\u308b\u611f\u3058\u304c\u3057\u307e\u3059\uff0e\n\n\n\n\nastroterm\u3067\u7aef\u672b\u4e0a\u3067\u661f\u56f3\u3092\u697d\u3057\u3080 \u2013 matoken’s blog\n\n\nterminal\u885b\u661f\u8ffd\u8de1\u30a2\u30d7\u30ea\u306etracker \u2013 matoken’s blog\n\n\n\n\n\u74b0\u5883\n\n$ ./target/release/ascii_moon --version\nascii_moon 0.2.0\n$ cargo version\nwarning: `/home/matoken/.cargo/config` is deprecated in favor of `config.toml`\n |\n = help: if you need to support cargo 1.38 or earlier, you can symlink `config` to `config.toml`\ncargo 1.92.0 (344c4567c 2025-10-21)\n$ cargo build --release\n$ lsb_release -dr\nNo LSB modules are available.\nDescription: Raspbian GNU/Linux 12 (bookworm)\nRelease: 12\n$ arch\narmv7l\n$ cat /sys/firmware/devicetree/base/model\nRaspberry Pi 3 Model B Rev 1.2\n\n\n \nPost by @matoken\nView on Mastodon", "date_published": "2025-12-12T20:07:15+09:00", "date_modified": "2025-12-12T20:07:17+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "moon", "RaspberryPi", "TUI", "bookworm", "Linux", "Raspberry Pi OS" ] }, { "id": "https://matoken.org/blog/?p=4613", "url": "https://matoken.org/blog/2025/06/20/try-chawan-a-terminal-web-browser-that-supports-images-javascript-css-etc/", "title": "\u753b\u50cf\uff0cJavaScript/CSS\u306a\u3069\u306b\u5bfe\u5fdc\u3059\u308b\u30bf\u30fc\u30df\u30ca\u30eb\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u306eChawan\u3092\u8a66\u3059", "content_html": "
\n
\n

\n
\n

Chawan\u3068\u3044\u3046\u30bf\u30fc\u30df\u30ca\u30eb\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u3092\u77e5\u308a\u307e\u3057\u305f\uff0e
\n\u30e1\u30e2\u30ea\u30bb\u30fc\u30d5\u306aNim\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u3066\u30e9\u30a4\u30bb\u30f3\u30b9\u306f\u30d1\u30d6\u30ea\u30c3\u30af\u30c9\u30e1\u30a4\u30f3\u3067\u3059\uff0e

\n
\n
\n

\u540c\u3058\u3088\u3046\u306b\u30bf\u30fc\u30df\u30ca\u30eb\u4e0a\u3067\u52d5\u4f5c\u3059\u308bw3m\u3084Lynx\u7cfb\u3068\u306e\u5927\u304d\u306a\u9055\u3044\u306fJavaScript\u3084CSS\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u8fba\u308a\u3067\u3057\u3087\u3046\u304b\uff0eSixel\u3084Kitty\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u753b\u50cf\u5f62\u5f0f\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\uff0e
\n\u5c11\u3057\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e

\n
\n\n

\n
\n\n\n\n\n\n
\n
Note
\n
\n
\n

\u5c11\u3057\u7528\u9014\u304c\u9055\u3044\u307e\u3059\u304c\uff0cv8\u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u3063\u305f\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u5411\u3051\u306e\u30d8\u30c3\u30c9\u30ec\u30b9\u30d6\u30e9\u30a6\u30b6\u306eLightpanda\u306a\u3093\u3066\u3082\u306e\u3082\u3042\u308a\u307e\u3059\uff0e

\n
\n\n
\n
\n
\n
\n
\n

Chawan\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb

\n
\n
\n

\u73fe\u5728\u306eChawan: 0.2.0\u306fLinux amd64\u306e\u9759\u7684\u30d0\u30a4\u30ca\u30eatarball\u3084Debian amd64\u306e.deb\u304c\u3042\u308a\u307e\u3059\uff0e
\n\u4e0d\u5b89\u5b9a\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3068\u3057\u3066AUR/NixOS/AppImage\u304c\u3042\u308b\u3088\u3046\u3067\u3059\uff0e(\u3053\u3061\u3089\u306f\u4eca\u56de\u672a\u78ba\u8a8d)

\n
\n
\n

\u4ed6\u306e\u74b0\u5883\u3067\u306f\u30bb\u30eb\u30d5\u30d3\u30eb\u30c9\u304c\u5fc5\u8981\u305d\u3046\u3067\u3059\uff0e

\n
\n
\n

Debian\u30d1\u30c3\u30b1\u30fc\u30b8\u5229\u7528(amd64\u306e\u307f)

\n
\n

Debian sid amd64\u74b0\u5883\u306b.deb\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u5c0e\u5165\u3057\u3066\u307f\u307e\u3057\u305f\uff0e

\n
\n
\n
\n
$ wget -c https://chawan.net/dl/chawan-0-2-0-amd64.deb (1)\n$ sha256sum ./chawan-0-2-0-amd64.deb\nba3ff4e24a5bf09919caba1cdc4f50b0cbf862f8433f5ea43d5391c1e04eceda  ./chawan-0-2-0-amd64.deb\n$ sha512sum ./chawan-0-2-0-amd64.deb\ne941b880c179df8da7eb4cf7a8050c75ef8a1cdfe629aff8287893f4308071454bf7fb54b4054a5ab99330610b17eca12e7f23a71ffc956d613329365d3c7e17  ./chawan-0-2-0-amd64.deb\n$ sudo apt install ./chawan-0-2-0-amd64.deb (2)\n$ chawan (3)\nbash: chawan: command not found\n$ dpkg -L chawan | grep /bin/ (4)\n/usr/bin/cha\n/usr/bin/mancha\n$ cha\nChawan browser v0.2.0 (release, sandboxed)\nUsage: cha [options] [URL(s) or file(s)...]\nOptions:\n    --                          Interpret all following arguments as URLs\n    -c, --css <stylesheet>      Pass stylesheet (e.g. -c 'a{color: blue}')\n    -d, --dump                  Print page to stdout\n    -h, --help                  Print this usage message\n    -o, --opt <config>          Pass config options (e.g. -o 'page.q=\"quit()\"')\n    -r, --run <script/file>     Run passed script or file\n    -v, --version               Print version information\n    -C, --config <file>         Override config path\n    -I, --input-charset <enc>   Specify document charset\n    -M, --monochrome            Set color-mode to 'monochrome'\n    -O, --display-charset <enc> Specify display charset\n    -T, --type <type>           Specify content mime type\n    -V, --visual                Visual startup mode\n$ cha --version\nChawan browser v0.2.0 (release, sandboxed by seccomp-bpf)\n$ mancha\nUsage:\nmancha [-M path] [[-s] section] -k keyword\nmancha [-M path] [[-s] section] name\nmancha -l file\n$ mancha cha\n    :
\n
\n
\n
\n
    \n
  1. \n

    .deb\u3092\u5165\u624b

    \n
  2. \n
  3. \n

    \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb

    \n
  4. \n
  5. \n

    chwan\u30b3\u30de\u30f3\u30c9\u306f\u306a\u304b\u3063\u305f

    \n
  6. \n
  7. \n

    \u30d0\u30a4\u30ca\u30ea\u3092\u63a2\u3059\u3068 cha \u3068 mancha \u304c\u898b\u3064\u304b\u3063\u305f

    \n
  8. \n
\n
\n
\n
\n

Debian sid amd64\u3067source\u304b\u3089build

\n
\n

source\u304b\u3089\u306ebuild\u3082\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e

\n
\n
\n

\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u5c0e\u5165\u3057\u305fNim\u306f\u3061\u3087\u3063\u3068\u53e4\u305d\u3046\u3067\u3059\uff0e

\n
\n
\n
\n
$ /usr/bin/nim -V\nNim Compiler Version 1.6.14 [Linux: amd64]\nCompiled at 2024-04-25\nCopyright (c) 2006-2023 by Andreas Rumpf\n\nactive boot switches: -d:release
\n
\n
\n
\n

Nim 2.2.4\u3092\u8cb0\u3063\u3066\u304d\u3066PATH\u3092\u901a\u3057\u3066\u304a\u304d\u307e\u3059\uff0e

\n
\n\n
\n
\n
$ wget -c https://nim-lang.org/download/nim-2.2.4-linux_x64.tar.xz https://nim-lang.org/download/nim-2.2.4-linux_x64.tar.xz.sha256\n$ sha256sum -c nim-2.2.4-linux_x64.tar.xz.sha256\nnim-2.2.4-linux_x64.tar.xz: OK\n$ fuse-archive nim-2.2.4-linux_x64.tar.xz\nfuse-archive: Created mount point 'nim-2.2.4-linux_x64'\n$ export PATH=`pwd`/nim-2.2.4-linux_x64/nim-2.2.4/bin:$PATH\n$ which nim\n/home/matoken/Downloads/nim-2.2.4-linux_x64/nim-2.2.4/bin/nim\n$ nim -V\nNim Compiler Version 2.2.4 [Linux: amd64]\nCompiled at 2025-04-22\nCopyright (c) 2006-2025 by Andreas Rumpf\n\ngit hash: f7145dd26efeeeb6eeae6fff649db244d81b212d\nactive boot switches: -d:release
\n
\n
\n
\n

\u9069\u5f53\u306a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066Chawan\u306esource\u3092\u8cb0\u3063\u3066\u304d\u3066build\u3057\u307e\u3059\uff0e

\n
\n
\n
\n
$ cd ~/src\n$ git clone https://git.sr.ht/~bptato/chawan && cd chawan\n$ sudo apt install libssh2-1-dev libssl-dev libbrotli-dev pkg-config make\n$ make\n$ ./cha\nChawan browser v0.3 (release, sandboxed)\nUsage: cha [options] [URL(s) or file(s)...]\nOptions:\n    --                          Interpret all following arguments as URLs\n    -c, --css <stylesheet>      Pass stylesheet (e.g. -c 'a{color: blue}')\n    -d, --dump                  Print page to stdout\n    -h, --help                  Print this usage message\n    -o, --opt <config>          Pass config options (e.g. -o 'page.q=\"quit()\"')\n    -r, --run <script/file>     Run passed script or file\n    -v, --version               Print version information\n    -C, --config <file>         Override config path\n    -I, --input-charset <enc>   Specify document charset\n    -M, --monochrome            Set color-mode to 'monochrome'\n    -O, --display-charset <enc> Specify display charset\n    -T, --type <type>           Specify content mime type\n    -V, --visual                Visual startup mode\n$ ./cha -v\nChawan browser v0.3 (release, sandboxed by seccomp-bpf)
\n
\n
\n
\n
\n

Raspberry Pi OS bookworm armhf

\n
\n

Single-Board Computer\u306eRaspberry Pi\u3067\u3082\u8a66\u3057\u305f\u3044\u306e\u3067\u3053\u3061\u3089\u3067\u3082build\u3092\u8a66\u3057\u307e\u3059\uff0e

\n
\n
\n

Linux armhf\u306eNim\u30d0\u30a4\u30ca\u30ea\u306f\u516c\u5f0f\u306b\u898b\u5f53\u305f\u3089\u306a\u3044\u306e\u3067\u3053\u3061\u3089\u306eNightly\u306e\u3082\u306e\u3092\u4f7f\u3044\u307e\u3057\u305f\uff0e

\n
\n\n
\n
\n
$ wget -c https://github.com/nim-lang/nightlies/releases/download/2025-04-22-version-2-2-f7145dd26efeeeb6eeae6fff649db244d81b212d/nim-2.2.4-linux_armv7l.tar.xz\n$ tar tvf nim-2.2.4-linux_armv7l.tar.xz\n$ tar xvf nim-2.2.4-linux_armv7l.tar.xz\n$ export PATH=$PATH:`pwd`/nim-2.2.4/bin\n$ which nim\n/home/matoken/Downloads/nim-2.2.4/bin/nim\n$ cd ~/src\n$ git clone https://git.sr.ht/~bptato/chawan && cd chawan\n$ sudo apt install libssh2-1-dev libssl-dev libbrotli-dev pkg-config make\n$ make\n$ ./cha --version\nChawan browser v0.3 (release, sandboxed by seccomp-bpf)
\n
\n
\n
\n\n\n\n\n\n
\n
Note
\n
\n
\n

\u624b\u5143\u306e\u74b0\u5883\u3067\u306f\u30d1\u30c3\u30b1\u30fc\u30b8\u5c0e\u5165\u6642\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u4f9d\u5b58\u95a2\u4fc2\u306e\u30a8\u30e9\u30fc\u3068\u306a\u308a\u307e\u3057\u305f\uff0e

\n
\n
\n
\n
The following packages have unmet dependencies:\n zlib1g-dev : Depends: zlib1g (= 1:1.2.13.dfsg-1) but 1:1.2.13.dfsg-1+rpt1 is to be installed\nE: Unable to correct problems, you have held broken packages.
\n
\n
\n
\n

\u3068\u308a\u3042\u3048\u305a\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u5165\u308c\u76f4\u3057\u3066\u56de\u907f\u3067\u304d\u307e\u3057\u305f\uff0e

\n
\n
\n
\n
$ sudo apt install zlib1g=1:1.2.13.dfsg-1
\n
\n
\n
\n
\n
\n
\n
\n
\n

Chawan\u3092\u8a66\u3059

\n
\n
\n
\n
$ cha\nChawan browser v0.2.0 (release, sandboxed)\nUsage: cha [options] [URL(s) or file(s)...]\nOptions:\n    --                          Interpret all following arguments as URLs\n    -c, --css <stylesheet>      Pass stylesheet (e.g. -c 'a{color: blue}')\n    -d, --dump                  Print page to stdout\n    -h, --help                  Print this usage message\n    -o, --opt <config>          Pass config options (e.g. -o 'page.q=\"quit()\"')\n    -r, --run <script/file>     Run passed script or file\n    -v, --version               Print version information\n    -C, --config <file>         Override config path\n    -I, --input-charset <enc>   Specify document charset\n    -M, --monochrome            Set color-mode to 'monochrome'\n    -O, --display-charset <enc> Specify display charset\n    -T, --type <type>           Specify content mime type\n    -V, --visual                Visual startup mode
\n
\n
\n
\n

\u3068\u308a\u3042\u3048\u305a cha $URL \u3068\u3044\u3046\u611f\u3058\u3067url\u3092\u6307\u5b9a\u3057\u3066\u8d77\u52d5\u3059\u308b\u3068\u30a6\u30a7\u30d6\u30da\u30fc\u30b8\u304c\u8868\u793a\u3067\u304d\u307e\u3059\uff0e
\n\u65e2\u5b9a\u5024\u3067\u306fCSS\u306f\u8a8d\u8b58\u3057\u307e\u3059\u304c\uff0cJavaScript\u3084\u753b\u50cf\u306f\u4f7f\u3048\u307e\u305b\u3093\uff0e

\n
\n
\n

\u53f3\u30af\u30ea\u30c3\u30af\u304b\u3089\u306e\u30e1\u30fc\u30cb\u30e5\u30fc\u3084\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u3067\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u3082\u51fa\u6765\u307e\u3059\u304c\u9762\u5012\u306a\u306e\u3067\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u8a2d\u5b9a\u3057\u307e\u3059\uff0e

\n
\n
\n
\u53f3\u30af\u30ea\u30c3\u30af\u306e\u30e1\u30cb\u30e5\u30fc
\n
\n
\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Select text              (v) \u2502\n\u2502 Copy selection           (y) \u2502\n\u2502 Previous buffer          (,) \u2502\n\u2502 Next buffer              (.) \u2502\n\u2502 Discard buffer           (D) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 View image               (I) \u2502\n\u2502 Peek                     (u) \u2502\n\u2502 Copy link               (yu) \u2502\n\u2502 Copy image link         (yI) \u2502\n\u2502 Paste link             (M-p) \u2502\n\u2502 Reload                   (U) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 Save link             (sC-m) \u2502\n\u2502 View source              (\\) \u2502\n\u2502 Edit source             (sE) \u2502\n\u2502 Save source             (sS) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 Linkify URLs             (:) \u2502\n\u2502 Toggle images          (M-i) \u2502\n\u2502 Toggle JS & reload     (M-j) \u2502\n\u2502 Toggle cookie & reload (M-k) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 Bookmark page          (M-a) \u2502\n\u2502 Open bookmarks         (M-b) \u2502\n\u2502 Open history           (C-h) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
\n
\n
\n
\n

\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306f
\n~/.chawan/config.toml \u82e5\u3057\u304f\u306f ~/.config/chawan/config.toml \u304c\u4f7f\u3048\u308b\u3088\u3046\u3067\u3059\uff0e
\ncha-config(5) \u3092\u898b\u306a\u304c\u3089\u8a2d\u5b9a\u3059\u308b\u3068\u826f\u3055\u305d\u3046\u3067\u3059\uff0e

\n
\n
\n

\u3068\u308a\u3042\u3048\u305a\u753b\u50cf\u3068JavaScript\u3092\u6709\u52b9\u306b\u3059\u308b\u6700\u4f4e\u9650\u306e\u8a2d\u5b9a\u306f\u3053\u3093\u306a\u611f\u3058\u306e\u3088\u3046\u3067\u3059\uff0e

\n
\n
\n
\n
[buffer]\nimages = true\nscripting = true
\n
\n
\n
\n

\u305f\u3060\uff0cJavaScript\u306e\u8a2d\u5b9a\u306e scripting \u306f\u3053\u3053\u3067\u306f\u306a\u304fsite\u3054\u3068\u306e\u8a2d\u5b9a\u306e [siteconf] \u5185\u3067\u6709\u52b9\u306b\u3059\u308b\u306e\u3092\u5f37\u304f\u52e7\u3081\u307e\u3059\u3068\u306e\u3053\u3068\u306a\u306e\u3067\u3061\u3083\u3093\u3068\u5fc5\u8981\u306asite\u3060\u3051\u6709\u52b9\u306b\u3057\u305f\u307b\u3046\u304c\u826f\u3055\u305d\u3046\u3067\u3059\uff0e

\n
\n
\n

\u3053\u306e\u72b6\u614b\u3067Sixel\u3084Kitty\u306b\u5bfe\u5fdc\u3057\u305fXTerm\u306a\u3069\u306e\u7aef\u672b\u3067\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3053\u3093\u306a\u611f\u3058\u3067\u8868\u793a\u3055\u308c\u307e\u3059\uff0e

\n
\n
\n
about:chawan \u30ad\u30fc\u30d0\u30a4\u30f3\u30c9\u306a\u3069\u3082\u78ba\u8a8d\u3067\u304d\u307e\u3059
\n

\"chawan

\n
\n\n\n
\n
https://tenki.jp/forecast/9/49/8820/46490/10days.html JavaScript\u3092On\u306b\u3057\u305f\u72b6\u614b\u30672\u9031\u9593\u5929\u6c17\u3092\u898b\u3088\u3046\u3068\u3059\u308b\u3068\u30b3\u30b1\u307e\u3059\uff0eJavaScript off\u3060\u3068\u8868\u793a\u3067\u304d\u307e\u3057\u305f\uff0e
\n

\"chawan

\n
\n\n\n
\n
Mastodon\u3084Misskey\u306fJavaScript\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u30c0\u30e1\u305d\u3046\u3067\u3059\uff0e\u3053\u306e\u8fba\u308a\u306f\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u3063\u305f\u307b\u3046\u304c\u826f\u3055\u305d\u3046\u3067\u3059\uff0e\u3068\u601d\u3063\u305f\u3051\u3069 fedibird.com \u306f\u5927\u4e08\u592b\u305d\u3046\uff0e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8a2d\u5b9a\u304c\u9055\u3046\u306e\u3067\u3057\u3087\u3046\u304b?
\n

\"chawan
\n\"chawan

\n
\n
\n
Github\u306eReleases\u306eAssets\u3082\u4eca\u306fJavaScript\u304c\u5fc5\u9808\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u3066\u3044\u308b\u306e\u3067\u3053\u308c\u306f\u3069\u3046\u3060\u308d\u3046\u3068\u601d\u3044\u307e\u3057\u305f\u304c\u99c4\u76ee\u3067\u3057\u305f\uff0e
\n

\"chawan

\n
\n
\n

\u3068\u3044\u3046\u611f\u3058\u3067\u5c11\u3057\u8a66\u3057\u305f\u611f\u3058\u3067\u306fCSS\u3092\u8a8d\u8b58\u3059\u308b\u306e\u3067\u898b\u305f\u76ee\u304cw3m\u306a\u3069\u3068\u6bd4\u3079\u3066\u5927\u5206\u3044\u3044\u611f\u3058\u3067\u3059\uff0e\u30ab\u30fc\u30bd\u30eb\u304c\u80cc\u666f\u3068\u540c\u3058\u306b\u306a\u308a\u5834\u6240\u304c\u308f\u304b\u3089\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3063\u305f\u308a\u3057\u307e\u3059\u304c\uff0c\u30dd\u30a4\u30f3\u30c6\u30a3\u30f3\u30b0\u30c7\u30d0\u30a4\u30b9\u304c\u4f7f\u3048\u308b\u5834\u5408\u306f\u30af\u30ea\u30c3\u30af\u3067\u30ab\u30fc\u30bd\u30eb\u304c\u305d\u306e\u5834\u6240\u306b\u79fb\u52d5\u3059\u308b\u306e\u3067\u30a2\u30f3\u30ab\u90e8\u5206\u3092\u30af\u30ea\u30c3\u30af&Enter\u3067\u30ea\u30f3\u30af\u5148\u306b\u79fb\u52d5\u3067\u304d\u307e\u3059\uff0e\u753b\u50cf\u304c\u4e00\u90e8\u3057\u304b\u8868\u793a\u3055\u308c\u306a\u3044\u3068\u304d key:[M-i] \u3067\u753b\u50cf\u3092off → \u518d\u5ea6 key:[M-i] \u3067\u753b\u50cf\u3092\u518d\u5ea6on \u3068\u3059\u308b\u3068\u8aad\u307f\u8fbc\u307e\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\uff0e

\n
\n
\n

\u56de\u7dda\u304c\u7d30\u3044\u5834\u5408\u30ea\u30e2\u30fc\u30c8\u306eVPS\u3067Chawan\u3092\u52d5\u304b\u3057\u3066\u7d50\u679c\u3060\u3051\u3092\u3082\u3089\u3046\u3088\u3046\u306b\u3059\u308b\u3068\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u6642\u9593\u304c\u77ed\u7e2e\u3055\u308c\u3066\u3044\u3044\u611f\u3058\u3067\u3059\uff0e\u305f\u3060\u3057\u52a0\u5897\u304c\u591a\u3044\u30b5\u30a4\u30c8\u3067\u30b9\u30af\u30ed\u30fc\u30eb\u3092\u591a\u7528\u3059\u308b\u5834\u5408\u306f\u3082\u305f\u3064\u304d\u307e\u3059\uff0e

\n
\n
\n

Sixel\u3067\u753b\u50cf\u304c\u5229\u7528\u3067\u304d\u308b\u6642\u306bSixel\u5bfe\u5fdctmux\u7d4c\u7531\u3067Chawan\u3092\u8d77\u52d5\u3059\u308b\u3068Chawan\u306eSixel\u753b\u50cf\u304c\u8868\u793a\u3055\u308c\u306a\u3044\u3088\u3046\u3067\u3059\uff0e\u540c\u3058\u7aef\u672b\u3067img2sixel\u306a\u3069\u306f\u554f\u984c\u306a\u3044\u306e\u3067Chawan\u5074\u306e\u554f\u984c\u3067\u3057\u3087\u3046\u304b?

\n
\n
\n

JavaScript\u306f\u601d\u3063\u305f\u3088\u308a\u52d5\u304b\u306a\u3044\u306a\u3068\u3044\u3046\u611f\u3058\u3067\u3059\u304cCSS\u304c\u601d\u3063\u305f\u3088\u308a\u52a9\u304b\u308a\u307e\u3059\uff0eJavaScript\u306b\u3064\u3044\u3066\u306fQuickJS-NG\u3092\u4f7f\u3063\u3066\u3044\u308b\u306e\u3067\u3053\u3061\u3089\u306b\u671f\u5f85\u3067\u3059\uff0eECMAScript\u306e\u6a5f\u80fd\u6e96\u62e0\u306e\u9032\u6357\u72b6\u6cc1\u306f\u3053\u3061\u3089

\n
\n
\n

\u305f\u3060\uff0c\u73fe\u6642\u70b9\u3067\u306fChawan\u306fLinux amd64\u74b0\u5883\u3067JavaScript/\u753b\u50cf\u6709\u52b9\u3067\u3082\u30e1\u30e2\u30ea\u5229\u7528\u91cf10MB\u524d\u5f8c\uff0e\u8272\u3005\u3068\u52d5\u304f\u3088\u3046\u306b\u306a\u308b\u3068\u3053\u306e\u8fba\u3082\u5897\u3048\u3066\u3044\u3063\u3066\u3057\u307e\u3046\u3067\u3057\u3087\u3046\u306d\u2026\u2026\uff0e

\n
\n
\n

\u3068\u3044\u3046\u611f\u3058\u3067\u8efd\u91cf\u3067\u898b\u305f\u76ee\u3082\u3044\u3044\u306e\u3067\u3053\u308c\u304b\u3089\u306b\u3082\u671f\u5f85\u3057\u3064\u3064w3m\u306a\u3069\u3068\u4f75\u7528\u3057\u3066\u3044\u3053\u3046\u3068\u601d\u3044\u307e\u3059\uff0e

\n
\n
\n
\n", "content_text": "Chawan\u3068\u3044\u3046\u30bf\u30fc\u30df\u30ca\u30eb\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u3092\u77e5\u308a\u307e\u3057\u305f\uff0e\n\u30e1\u30e2\u30ea\u30bb\u30fc\u30d5\u306aNim\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u3066\u30e9\u30a4\u30bb\u30f3\u30b9\u306f\u30d1\u30d6\u30ea\u30c3\u30af\u30c9\u30e1\u30a4\u30f3\u3067\u3059\uff0e\n\n\n\u540c\u3058\u3088\u3046\u306b\u30bf\u30fc\u30df\u30ca\u30eb\u4e0a\u3067\u52d5\u4f5c\u3059\u308bw3m\u3084Lynx\u7cfb\u3068\u306e\u5927\u304d\u306a\u9055\u3044\u306fJavaScript\u3084CSS\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u8fba\u308a\u3067\u3057\u3087\u3046\u304b\uff0eSixel\u3084Kitty\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u753b\u50cf\u5f62\u5f0f\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\uff0e\n\u5c11\u3057\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\n\n\n\n\nChawan: TUI web browser\n\n\nchawan: TUI Web Browser\n\n\n\nchawan – A TUI web browser.\n\n\n\n\n\n\n\n\n\n\n\nNote\n\n\n\n\u5c11\u3057\u7528\u9014\u304c\u9055\u3044\u307e\u3059\u304c\uff0cv8\u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u3063\u305f\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u5411\u3051\u306e\u30d8\u30c3\u30c9\u30ec\u30b9\u30d6\u30e9\u30a6\u30b6\u306eLightpanda\u306a\u3093\u3066\u3082\u306e\u3082\u3042\u308a\u307e\u3059\uff0e\n\n\n\n\nLightpanda | The headless browser\n\n\n\n\n\n\n\n\n\n\nChawan\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n\n\n\u73fe\u5728\u306eChawan: 0.2.0\u306fLinux amd64\u306e\u9759\u7684\u30d0\u30a4\u30ca\u30eatarball\u3084Debian amd64\u306e.deb\u304c\u3042\u308a\u307e\u3059\uff0e\n\u4e0d\u5b89\u5b9a\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3068\u3057\u3066AUR/NixOS/AppImage\u304c\u3042\u308b\u3088\u3046\u3067\u3059\uff0e(\u3053\u3061\u3089\u306f\u4eca\u56de\u672a\u78ba\u8a8d)\n\n\n\u4ed6\u306e\u74b0\u5883\u3067\u306f\u30bb\u30eb\u30d5\u30d3\u30eb\u30c9\u304c\u5fc5\u8981\u305d\u3046\u3067\u3059\uff0e\n\n\nDebian\u30d1\u30c3\u30b1\u30fc\u30b8\u5229\u7528(amd64\u306e\u307f)\n\nDebian sid amd64\u74b0\u5883\u306b.deb\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u5c0e\u5165\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\n\n\n\n$ wget -c https://chawan.net/dl/chawan-0-2-0-amd64.deb (1)\n$ sha256sum ./chawan-0-2-0-amd64.deb\nba3ff4e24a5bf09919caba1cdc4f50b0cbf862f8433f5ea43d5391c1e04eceda ./chawan-0-2-0-amd64.deb\n$ sha512sum ./chawan-0-2-0-amd64.deb\ne941b880c179df8da7eb4cf7a8050c75ef8a1cdfe629aff8287893f4308071454bf7fb54b4054a5ab99330610b17eca12e7f23a71ffc956d613329365d3c7e17 ./chawan-0-2-0-amd64.deb\n$ sudo apt install ./chawan-0-2-0-amd64.deb (2)\n$ chawan (3)\nbash: chawan: command not found\n$ dpkg -L chawan | grep /bin/ (4)\n/usr/bin/cha\n/usr/bin/mancha\n$ cha\nChawan browser v0.2.0 (release, sandboxed)\nUsage: cha [options] [URL(s) or file(s)...]\nOptions:\n -- Interpret all following arguments as URLs\n -c, --css <stylesheet> Pass stylesheet (e.g. -c 'a{color: blue}')\n -d, --dump Print page to stdout\n -h, --help Print this usage message\n -o, --opt <config> Pass config options (e.g. -o 'page.q=\"quit()\"')\n -r, --run <script/file> Run passed script or file\n -v, --version Print version information\n -C, --config <file> Override config path\n -I, --input-charset <enc> Specify document charset\n -M, --monochrome Set color-mode to 'monochrome'\n -O, --display-charset <enc> Specify display charset\n -T, --type <type> Specify content mime type\n -V, --visual Visual startup mode\n$ cha --version\nChawan browser v0.2.0 (release, sandboxed by seccomp-bpf)\n$ mancha\nUsage:\nmancha [-M path] [[-s] section] -k keyword\nmancha [-M path] [[-s] section] name\nmancha -l file\n$ mancha cha\n :\n\n\n\n\n\n.deb\u3092\u5165\u624b\n\n\n\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n\n\nchwan\u30b3\u30de\u30f3\u30c9\u306f\u306a\u304b\u3063\u305f\n\n\n\u30d0\u30a4\u30ca\u30ea\u3092\u63a2\u3059\u3068 cha \u3068 mancha \u304c\u898b\u3064\u304b\u3063\u305f\n\n\n\n\n\nDebian sid amd64\u3067source\u304b\u3089build\n\nsource\u304b\u3089\u306ebuild\u3082\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e\n\n\n\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u5c0e\u5165\u3057\u305fNim\u306f\u3061\u3087\u3063\u3068\u53e4\u305d\u3046\u3067\u3059\uff0e\n\n\n\n$ /usr/bin/nim -V\nNim Compiler Version 1.6.14 [Linux: amd64]\nCompiled at 2024-04-25\nCopyright (c) 2006-2023 by Andreas Rumpf\n\nactive boot switches: -d:release\n\n\n\nNim 2.2.4\u3092\u8cb0\u3063\u3066\u304d\u3066PATH\u3092\u901a\u3057\u3066\u304a\u304d\u307e\u3059\uff0e\n\n\n\n\nUnix installation – Nim Programming Language\n\n\n\n\n\n$ wget -c https://nim-lang.org/download/nim-2.2.4-linux_x64.tar.xz https://nim-lang.org/download/nim-2.2.4-linux_x64.tar.xz.sha256\n$ sha256sum -c nim-2.2.4-linux_x64.tar.xz.sha256\nnim-2.2.4-linux_x64.tar.xz: OK\n$ fuse-archive nim-2.2.4-linux_x64.tar.xz\nfuse-archive: Created mount point 'nim-2.2.4-linux_x64'\n$ export PATH=`pwd`/nim-2.2.4-linux_x64/nim-2.2.4/bin:$PATH\n$ which nim\n/home/matoken/Downloads/nim-2.2.4-linux_x64/nim-2.2.4/bin/nim\n$ nim -V\nNim Compiler Version 2.2.4 [Linux: amd64]\nCompiled at 2025-04-22\nCopyright (c) 2006-2025 by Andreas Rumpf\n\ngit hash: f7145dd26efeeeb6eeae6fff649db244d81b212d\nactive boot switches: -d:release\n\n\n\n\u9069\u5f53\u306a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066Chawan\u306esource\u3092\u8cb0\u3063\u3066\u304d\u3066build\u3057\u307e\u3059\uff0e\n\n\n\n$ cd ~/src\n$ git clone https://git.sr.ht/~bptato/chawan && cd chawan\n$ sudo apt install libssh2-1-dev libssl-dev libbrotli-dev pkg-config make\n$ make\n$ ./cha\nChawan browser v0.3 (release, sandboxed)\nUsage: cha [options] [URL(s) or file(s)...]\nOptions:\n -- Interpret all following arguments as URLs\n -c, --css <stylesheet> Pass stylesheet (e.g. -c 'a{color: blue}')\n -d, --dump Print page to stdout\n -h, --help Print this usage message\n -o, --opt <config> Pass config options (e.g. -o 'page.q=\"quit()\"')\n -r, --run <script/file> Run passed script or file\n -v, --version Print version information\n -C, --config <file> Override config path\n -I, --input-charset <enc> Specify document charset\n -M, --monochrome Set color-mode to 'monochrome'\n -O, --display-charset <enc> Specify display charset\n -T, --type <type> Specify content mime type\n -V, --visual Visual startup mode\n$ ./cha -v\nChawan browser v0.3 (release, sandboxed by seccomp-bpf)\n\n\n\n\nRaspberry Pi OS bookworm armhf\n\nSingle-Board Computer\u306eRaspberry Pi\u3067\u3082\u8a66\u3057\u305f\u3044\u306e\u3067\u3053\u3061\u3089\u3067\u3082build\u3092\u8a66\u3057\u307e\u3059\uff0e\n\n\nLinux armhf\u306eNim\u30d0\u30a4\u30ca\u30ea\u306f\u516c\u5f0f\u306b\u898b\u5f53\u305f\u3089\u306a\u3044\u306e\u3067\u3053\u3061\u3089\u306eNightly\u306e\u3082\u306e\u3092\u4f7f\u3044\u307e\u3057\u305f\uff0e\n\n\n\n\nRelease Nightly build on 2025-04-22 for branch version-2-2 \u00b7 nim-lang/nightlies\n\n\n\n\n\n$ wget -c https://github.com/nim-lang/nightlies/releases/download/2025-04-22-version-2-2-f7145dd26efeeeb6eeae6fff649db244d81b212d/nim-2.2.4-linux_armv7l.tar.xz\n$ tar tvf nim-2.2.4-linux_armv7l.tar.xz\n$ tar xvf nim-2.2.4-linux_armv7l.tar.xz\n$ export PATH=$PATH:`pwd`/nim-2.2.4/bin\n$ which nim\n/home/matoken/Downloads/nim-2.2.4/bin/nim\n$ cd ~/src\n$ git clone https://git.sr.ht/~bptato/chawan && cd chawan\n$ sudo apt install libssh2-1-dev libssl-dev libbrotli-dev pkg-config make\n$ make\n$ ./cha --version\nChawan browser v0.3 (release, sandboxed by seccomp-bpf)\n\n\n\n\n\n\nNote\n\n\n\n\u624b\u5143\u306e\u74b0\u5883\u3067\u306f\u30d1\u30c3\u30b1\u30fc\u30b8\u5c0e\u5165\u6642\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u4f9d\u5b58\u95a2\u4fc2\u306e\u30a8\u30e9\u30fc\u3068\u306a\u308a\u307e\u3057\u305f\uff0e\n\n\n\nThe following packages have unmet dependencies:\n zlib1g-dev : Depends: zlib1g (= 1:1.2.13.dfsg-1) but 1:1.2.13.dfsg-1+rpt1 is to be installed\nE: Unable to correct problems, you have held broken packages.\n\n\n\n\u3068\u308a\u3042\u3048\u305a\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u5165\u308c\u76f4\u3057\u3066\u56de\u907f\u3067\u304d\u307e\u3057\u305f\uff0e\n\n\n\n$ sudo apt install zlib1g=1:1.2.13.dfsg-1\n\n\n\n\n\n\n\n\n\n\nChawan\u3092\u8a66\u3059\n\n\n\n$ cha\nChawan browser v0.2.0 (release, sandboxed)\nUsage: cha [options] [URL(s) or file(s)...]\nOptions:\n -- Interpret all following arguments as URLs\n -c, --css <stylesheet> Pass stylesheet (e.g. -c 'a{color: blue}')\n -d, --dump Print page to stdout\n -h, --help Print this usage message\n -o, --opt <config> Pass config options (e.g. -o 'page.q=\"quit()\"')\n -r, --run <script/file> Run passed script or file\n -v, --version Print version information\n -C, --config <file> Override config path\n -I, --input-charset <enc> Specify document charset\n -M, --monochrome Set color-mode to 'monochrome'\n -O, --display-charset <enc> Specify display charset\n -T, --type <type> Specify content mime type\n -V, --visual Visual startup mode\n\n\n\n\u3068\u308a\u3042\u3048\u305a cha $URL \u3068\u3044\u3046\u611f\u3058\u3067url\u3092\u6307\u5b9a\u3057\u3066\u8d77\u52d5\u3059\u308b\u3068\u30a6\u30a7\u30d6\u30da\u30fc\u30b8\u304c\u8868\u793a\u3067\u304d\u307e\u3059\uff0e\n\u65e2\u5b9a\u5024\u3067\u306fCSS\u306f\u8a8d\u8b58\u3057\u307e\u3059\u304c\uff0cJavaScript\u3084\u753b\u50cf\u306f\u4f7f\u3048\u307e\u305b\u3093\uff0e\n\n\n\u53f3\u30af\u30ea\u30c3\u30af\u304b\u3089\u306e\u30e1\u30fc\u30cb\u30e5\u30fc\u3084\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\u3067\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u3082\u51fa\u6765\u307e\u3059\u304c\u9762\u5012\u306a\u306e\u3067\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u8a2d\u5b9a\u3057\u307e\u3059\uff0e\n\n\n\u53f3\u30af\u30ea\u30c3\u30af\u306e\u30e1\u30cb\u30e5\u30fc\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Select text (v) \u2502\n\u2502 Copy selection (y) \u2502\n\u2502 Previous buffer (,) \u2502\n\u2502 Next buffer (.) \u2502\n\u2502 Discard buffer (D) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 View image (I) \u2502\n\u2502 Peek (u) \u2502\n\u2502 Copy link (yu) \u2502\n\u2502 Copy image link (yI) \u2502\n\u2502 Paste link (M-p) \u2502\n\u2502 Reload (U) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 Save link (sC-m) \u2502\n\u2502 View source (\\) \u2502\n\u2502 Edit source (sE) \u2502\n\u2502 Save source (sS) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 Linkify URLs (:) \u2502\n\u2502 Toggle images (M-i) \u2502\n\u2502 Toggle JS & reload (M-j) \u2502\n\u2502 Toggle cookie & reload (M-k) \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n\u2502 Bookmark page (M-a) \u2502\n\u2502 Open bookmarks (M-b) \u2502\n\u2502 Open history (C-h) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\n\n\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306f\n~/.chawan/config.toml \u82e5\u3057\u304f\u306f ~/.config/chawan/config.toml \u304c\u4f7f\u3048\u308b\u3088\u3046\u3067\u3059\uff0e\ncha-config(5) \u3092\u898b\u306a\u304c\u3089\u8a2d\u5b9a\u3059\u308b\u3068\u826f\u3055\u305d\u3046\u3067\u3059\uff0e\n\n\n\u3068\u308a\u3042\u3048\u305a\u753b\u50cf\u3068JavaScript\u3092\u6709\u52b9\u306b\u3059\u308b\u6700\u4f4e\u9650\u306e\u8a2d\u5b9a\u306f\u3053\u3093\u306a\u611f\u3058\u306e\u3088\u3046\u3067\u3059\uff0e\n\n\n\n[buffer]\nimages = true\nscripting = true\n\n\n\n\u305f\u3060\uff0cJavaScript\u306e\u8a2d\u5b9a\u306e scripting \u306f\u3053\u3053\u3067\u306f\u306a\u304fsite\u3054\u3068\u306e\u8a2d\u5b9a\u306e [siteconf] \u5185\u3067\u6709\u52b9\u306b\u3059\u308b\u306e\u3092\u5f37\u304f\u52e7\u3081\u307e\u3059\u3068\u306e\u3053\u3068\u306a\u306e\u3067\u3061\u3083\u3093\u3068\u5fc5\u8981\u306asite\u3060\u3051\u6709\u52b9\u306b\u3057\u305f\u307b\u3046\u304c\u826f\u3055\u305d\u3046\u3067\u3059\uff0e\n\n\n\u3053\u306e\u72b6\u614b\u3067Sixel\u3084Kitty\u306b\u5bfe\u5fdc\u3057\u305fXTerm\u306a\u3069\u306e\u7aef\u672b\u3067\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3053\u3093\u306a\u611f\u3058\u3067\u8868\u793a\u3055\u308c\u307e\u3059\uff0e\n\n\nabout:chawan \u30ad\u30fc\u30d0\u30a4\u30f3\u30c9\u306a\u3069\u3082\u78ba\u8a8d\u3067\u304d\u307e\u3059\n\n\n\nhttps://chawan.net/\n\n\n\nhttps://teni.jp/\n\n\n\n\nhttps://tenki.jp/forecast/9/49/8820/46490/10days.html JavaScript\u3092On\u306b\u3057\u305f\u72b6\u614b\u30672\u9031\u9593\u5929\u6c17\u3092\u898b\u3088\u3046\u3068\u3059\u308b\u3068\u30b3\u30b1\u307e\u3059\uff0eJavaScript off\u3060\u3068\u8868\u793a\u3067\u304d\u307e\u3057\u305f\uff0e\n\n\n\nhttps://ja.wikipedia.org/wiki/%E8%8C%B6%E7%A2%97\n\n\n\nhttps://matoken.org/blog/\n\n\n\nMastodon\u3084Misskey\u306fJavaScript\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u30c0\u30e1\u305d\u3046\u3067\u3059\uff0e\u3053\u306e\u8fba\u308a\u306f\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f7f\u3063\u305f\u307b\u3046\u304c\u826f\u3055\u305d\u3046\u3067\u3059\uff0e\u3068\u601d\u3063\u305f\u3051\u3069 fedibird.com \u306f\u5927\u4e08\u592b\u305d\u3046\uff0e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8a2d\u5b9a\u304c\u9055\u3046\u306e\u3067\u3057\u3087\u3046\u304b?\n\n\n\n\nGithub\u306eReleases\u306eAssets\u3082\u4eca\u306fJavaScript\u304c\u5fc5\u9808\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u3066\u3044\u308b\u306e\u3067\u3053\u308c\u306f\u3069\u3046\u3060\u308d\u3046\u3068\u601d\u3044\u307e\u3057\u305f\u304c\u99c4\u76ee\u3067\u3057\u305f\uff0e\n\n\n\n\u3068\u3044\u3046\u611f\u3058\u3067\u5c11\u3057\u8a66\u3057\u305f\u611f\u3058\u3067\u306fCSS\u3092\u8a8d\u8b58\u3059\u308b\u306e\u3067\u898b\u305f\u76ee\u304cw3m\u306a\u3069\u3068\u6bd4\u3079\u3066\u5927\u5206\u3044\u3044\u611f\u3058\u3067\u3059\uff0e\u30ab\u30fc\u30bd\u30eb\u304c\u80cc\u666f\u3068\u540c\u3058\u306b\u306a\u308a\u5834\u6240\u304c\u308f\u304b\u3089\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3063\u305f\u308a\u3057\u307e\u3059\u304c\uff0c\u30dd\u30a4\u30f3\u30c6\u30a3\u30f3\u30b0\u30c7\u30d0\u30a4\u30b9\u304c\u4f7f\u3048\u308b\u5834\u5408\u306f\u30af\u30ea\u30c3\u30af\u3067\u30ab\u30fc\u30bd\u30eb\u304c\u305d\u306e\u5834\u6240\u306b\u79fb\u52d5\u3059\u308b\u306e\u3067\u30a2\u30f3\u30ab\u90e8\u5206\u3092\u30af\u30ea\u30c3\u30af&Enter\u3067\u30ea\u30f3\u30af\u5148\u306b\u79fb\u52d5\u3067\u304d\u307e\u3059\uff0e\u753b\u50cf\u304c\u4e00\u90e8\u3057\u304b\u8868\u793a\u3055\u308c\u306a\u3044\u3068\u304d key:[M-i] \u3067\u753b\u50cf\u3092off → \u518d\u5ea6 key:[M-i] \u3067\u753b\u50cf\u3092\u518d\u5ea6on \u3068\u3059\u308b\u3068\u8aad\u307f\u8fbc\u307e\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\uff0e\n\n\n\u56de\u7dda\u304c\u7d30\u3044\u5834\u5408\u30ea\u30e2\u30fc\u30c8\u306eVPS\u3067Chawan\u3092\u52d5\u304b\u3057\u3066\u7d50\u679c\u3060\u3051\u3092\u3082\u3089\u3046\u3088\u3046\u306b\u3059\u308b\u3068\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u6642\u9593\u304c\u77ed\u7e2e\u3055\u308c\u3066\u3044\u3044\u611f\u3058\u3067\u3059\uff0e\u305f\u3060\u3057\u52a0\u5897\u304c\u591a\u3044\u30b5\u30a4\u30c8\u3067\u30b9\u30af\u30ed\u30fc\u30eb\u3092\u591a\u7528\u3059\u308b\u5834\u5408\u306f\u3082\u305f\u3064\u304d\u307e\u3059\uff0e\n\n\nSixel\u3067\u753b\u50cf\u304c\u5229\u7528\u3067\u304d\u308b\u6642\u306bSixel\u5bfe\u5fdctmux\u7d4c\u7531\u3067Chawan\u3092\u8d77\u52d5\u3059\u308b\u3068Chawan\u306eSixel\u753b\u50cf\u304c\u8868\u793a\u3055\u308c\u306a\u3044\u3088\u3046\u3067\u3059\uff0e\u540c\u3058\u7aef\u672b\u3067img2sixel\u306a\u3069\u306f\u554f\u984c\u306a\u3044\u306e\u3067Chawan\u5074\u306e\u554f\u984c\u3067\u3057\u3087\u3046\u304b?\n\n\nJavaScript\u306f\u601d\u3063\u305f\u3088\u308a\u52d5\u304b\u306a\u3044\u306a\u3068\u3044\u3046\u611f\u3058\u3067\u3059\u304cCSS\u304c\u601d\u3063\u305f\u3088\u308a\u52a9\u304b\u308a\u307e\u3059\uff0eJavaScript\u306b\u3064\u3044\u3066\u306fQuickJS-NG\u3092\u4f7f\u3063\u3066\u3044\u308b\u306e\u3067\u3053\u3061\u3089\u306b\u671f\u5f85\u3067\u3059\uff0eECMAScript\u306e\u6a5f\u80fd\u6e96\u62e0\u306e\u9032\u6357\u72b6\u6cc1\u306f\u3053\u3061\u3089\n\n\n\u305f\u3060\uff0c\u73fe\u6642\u70b9\u3067\u306fChawan\u306fLinux amd64\u74b0\u5883\u3067JavaScript/\u753b\u50cf\u6709\u52b9\u3067\u3082\u30e1\u30e2\u30ea\u5229\u7528\u91cf10MB\u524d\u5f8c\uff0e\u8272\u3005\u3068\u52d5\u304f\u3088\u3046\u306b\u306a\u308b\u3068\u3053\u306e\u8fba\u3082\u5897\u3048\u3066\u3044\u3063\u3066\u3057\u307e\u3046\u3067\u3057\u3087\u3046\u306d\u2026\u2026\uff0e\n\n\n\u3068\u3044\u3046\u611f\u3058\u3067\u8efd\u91cf\u3067\u898b\u305f\u76ee\u3082\u3044\u3044\u306e\u3067\u3053\u308c\u304b\u3089\u306b\u3082\u671f\u5f85\u3057\u3064\u3064w3m\u306a\u3069\u3068\u4f75\u7528\u3057\u3066\u3044\u3053\u3046\u3068\u601d\u3044\u307e\u3059\uff0e", "date_published": "2025-06-20T05:52:39+09:00", "date_modified": "2025-06-20T06:27:31+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "Chawan", "CSS", "JavaScript", "terminal", "TUI", "w3m", "Web browser", "bookworm", "Debian", "Linux", "Raspberry Pi OS", "sid" ] }, { "id": "https://matoken.org/blog/?p=4527", "url": "https://matoken.org/blog/2025/05/03/bbc_weather_scraper-allows-you-to-check-bbc-weather-information-on-tui/", "title": "TUI\u3067BBC\u306e\u5929\u6c17\u60c5\u5831\u304c\u78ba\u8a8d\u3067\u304d\u308bbbc_weather_scraper", "content_html": "
\n

BBC\u306e\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066TUI\u3067\u8868\u793a\u3059\u308bbbc_weather_scraper\u3068\u3044\u3046\u30c4\u30fc\u30eb\u3092\u77e5\u3063\u305f\u306e\u3067\u5c11\u3057\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e
\nBBC\u306e\u5929\u6c17\u60c5\u5831\u306f\u7d30\u304b\u306a\u571f\u5730\u306b\u306f\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u305b\u3093\u304c\u5168\u4e16\u754c\u306e\u5929\u6c17\u304c\u78ba\u8a8d\u3067\u304d\uff0conion site\u3082\u3042\u3063\u3066\u4fbf\u5229\u3067\u3059\uff0e

\n
\n
\n\n
\n

\n
\n
\u5c0e\u5165
\n
\n
$ git clone https://github.com/leonmavr/bbc_weather_scraper\n$ cd bbc_weather_scraper\n$ python -m venv venv\n$ source venv/bin/activate\n$ pip install -r requirements.txt
\n
\n
\n
\n
error1
\n
\n
$ ./scraper.py\nTraceback (most recent call last):\n  File \"/home/matoken/src/bbc_weather_scraper/./scraper.py\", line 3, in <module>\n    from hourly import fmt_day_hourly\n  File \"/home/matoken/src/bbc_weather_scraper/hourly.py\", line 1, in <module>\n    import requests\nModuleNotFoundError: No module named 'requests'
\n
\n
\n
\n

requests \u304c\u8db3\u308a\u306a\u3044\u3088\u3046\u306a\u306e\u3067\uff0crequirements.txt \u306b requests \u3092\u8ffd\u52a0\u3057\u3066 pip install -r requirements.txt \u3092\u518d\u5b9f\u884c\uff0e

\n
\n
\n
error2
\n
\n
$ ./scraper.py\nTraceback (most recent call last):\n  File \"/home/matoken/src/bbc_weather_scraper/./scraper.py\", line 8, in <module>\n    from pynput import keyboard\nModuleNotFoundError: No module named 'pynput'
\n
\n
\n
\n

\u4eca\u5ea6\u306f pynput \u304c\u8db3\u308a\u306a\u3044\u3088\u3046\u306a\u306e\u3067 requirements.txt \u306b\u8ffd\u52a0\u3057\u3066 pip install -r requirements.txt \u3092\u518d\u5b9f\u884c\uff0e

\n
\n
\n

\u3053\u308c\u3067\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\uff0e

\n
\n
\n
\u4fee\u6b63\u5f8c\u306e requirements.txt
\n
\n
$ git diff\ndiff --git a/requirements.txt b/requirements.txt\nindex b6942e8..9172c97 100644\n--- a/requirements.txt\n+++ b/requirements.txt\n@@ -1,3 +1,5 @@\n beautifulsoup4==4.12.3\n wcwidth==0.2.13\n geopy\n+requests\n+pynput
\n
\n
\n
\n\n\n\n\n\n
\n
Note
\n
\n\u5831\u544a\u3057\u305f\u306e\u3067\u4fee\u6b63\u3055\u308c\u307e\u3057\u305f\uff0e\n
\n
\n
\n

\u5f15\u6570\u306a\u3057\u3067\u5b9f\u884c\u3059\u308b\u3068 city_ids.dat \u5185\u304b\u3089\u8fd1\u304f\u3067\u3042\u308d\u3046\u5834\u6240\u304c\u9078\u3070\u308c\u307e\u3059\uff0e
\nKagoshima\u306a\u3069BBC\u306b\u306f\u3042\u308b\u3051\u308c\u3069\u3053\u306e\u30ea\u30b9\u30c8\u306b\u306a\u3044\u5834\u6240\u306e\u5834\u5408\u4ee5\u4e0b\u306e\u30da\u30fc\u30b8\u304b\u3089\u63a2\u3057\u3066URL\u306e\u6700\u5f8c\u306eID\u3092\u30e1\u30e2\u3057\u307e\u3059\uff0eKagoshima\u306e\u5834\u5408\uff0c URL\u306f https://www.bbc.com/weather/6300348 \u3067\uff0cID\u306f 6300348 \u3067\u3059\uff0e

\n
\n
\n\n
\n
\n

city_ids.dat \u306b\u540d\u524d\u3068\u3053\u306eID\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff0e

\n
\n
\n
\n
Kagoshima: 6300348
\n
\n
\n
\n

\u5f15\u6570\u306b\u540d\u524d\u3092\u66f8\u304f\u3053\u3068\u3067\u6307\u5b9a\u3057\u305f\u5834\u6240\u304c\u958b\u3051\u307e\u3059\uff0e

\n
\n
\n
\n
$ ./scraper.py Kagoshima
\n
\n
\n
\n

\u66f4\u306b\u7def\u5ea6\uff0c\u7d4c\u5ea6\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\uff0e

\n
\n
\n
\n
Kagoshima: 6300348: 31.801837, 130.719404
\n
\n
\n
\n

\u81ea\u5206\u306e\u74b0\u5883\u3067\u306f\u7269\u7406\u7684\u306b\u306fKagoshima\u304c\u8fd1\u3044\u306e\u3067\u3059\u304c\uff0cTokyo\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\uff0e
\n\u3053\u308c\u306f\u56de\u7dda\u306b\u3088\u308b\u306e\u3060\u3068\u601d\u3044\u307e\u3059\uff0e

\n
\n
\n

\u8d77\u52d5\u3057\u305f\u3089wasd\u3067\u65e5\u306b\u3061\u3092\u79fb\u52d5\uff0cf\u3067\u8a73\u7d30\u3092\u958b\u3051\u307e\u3059\uff0ex\u3067\u623b\u308a\uff0cq\u3067\u7d42\u4e86\u3067\u3059\uff0e

\n
\n
\n

\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u306e\u3067\u3059\u304c\uff0c\u4f55\u3082\u3057\u306a\u304f\u3066\u3082\u7d30\u304b\u304f\u30d5\u30e9\u30c3\u30b7\u30e5\u3055\u308c\u3066\u898b\u3065\u3089\u3044\u3067\u3059\uff0e
\ndemo\u3067\u306f\u305d\u3093\u306a\u3053\u3068\u306f\u306a\u3055\u305d\u3046\u306a\u306e\u3067\u306a\u306b\u304b\u306e\u74b0\u5883\u304c\u60aa\u3044\u306e\u304b\u3082\u3057\u308c\u307e\u305b\u3093\uff0e

\n
\n
\n
\u74b0\u5883
\n
\n
$ git log --pretty=oneline -1\ne648ad41b5d192ff2e21bebb18feece7981ef4de (HEAD -> master, origin/master, origin/HEAD) Add requirements\n$ python --version\nPython 3.13.3\n$ dpkg-query -W python3 python3-venv python3-pip\npython3 3.13.3-1\npython3-pip     25.1+dfsg-1\npython3-venv    3.13.3-1\n$ lsb_release -a\nNo LSB modules are available.\nDistributor ID: Debian\nDescription:    Debian GNU/Linux trixie/sid\nRelease:        n/a\nCodename:       trixie\n$ arch\nx86_64
\n
\n
\n", "content_text": "BBC\u306e\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066TUI\u3067\u8868\u793a\u3059\u308bbbc_weather_scraper\u3068\u3044\u3046\u30c4\u30fc\u30eb\u3092\u77e5\u3063\u305f\u306e\u3067\u5c11\u3057\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\nBBC\u306e\u5929\u6c17\u60c5\u5831\u306f\u7d30\u304b\u306a\u571f\u5730\u306b\u306f\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u305b\u3093\u304c\u5168\u4e16\u754c\u306e\u5929\u6c17\u304c\u78ba\u8a8d\u3067\u304d\uff0conion site\u3082\u3042\u3063\u3066\u4fbf\u5229\u3067\u3059\uff0e\n\n\n\n\nleonmavr/bbc_weather_scraper: Tiny weather scraper for https://www.bbc.com/weather\n\n\nBBC weather forecast as tiles : r/commandline\n\n\n\n\n\n\u5c0e\u5165\n\n$ git clone https://github.com/leonmavr/bbc_weather_scraper\n$ cd bbc_weather_scraper\n$ python -m venv venv\n$ source venv/bin/activate\n$ pip install -r requirements.txt\n\n\n\nerror1\n\n$ ./scraper.py\nTraceback (most recent call last):\n File \"/home/matoken/src/bbc_weather_scraper/./scraper.py\", line 3, in <module>\n from hourly import fmt_day_hourly\n File \"/home/matoken/src/bbc_weather_scraper/hourly.py\", line 1, in <module>\n import requests\nModuleNotFoundError: No module named 'requests'\n\n\n\nrequests \u304c\u8db3\u308a\u306a\u3044\u3088\u3046\u306a\u306e\u3067\uff0crequirements.txt \u306b requests \u3092\u8ffd\u52a0\u3057\u3066 pip install -r requirements.txt \u3092\u518d\u5b9f\u884c\uff0e\n\n\nerror2\n\n$ ./scraper.py\nTraceback (most recent call last):\n File \"/home/matoken/src/bbc_weather_scraper/./scraper.py\", line 8, in <module>\n from pynput import keyboard\nModuleNotFoundError: No module named 'pynput'\n\n\n\n\u4eca\u5ea6\u306f pynput \u304c\u8db3\u308a\u306a\u3044\u3088\u3046\u306a\u306e\u3067 requirements.txt \u306b\u8ffd\u52a0\u3057\u3066 pip install -r requirements.txt \u3092\u518d\u5b9f\u884c\uff0e\n\n\n\u3053\u308c\u3067\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\uff0e\n\n\n\u4fee\u6b63\u5f8c\u306e requirements.txt\n\n$ git diff\ndiff --git a/requirements.txt b/requirements.txt\nindex b6942e8..9172c97 100644\n--- a/requirements.txt\n+++ b/requirements.txt\n@@ -1,3 +1,5 @@\n beautifulsoup4==4.12.3\n wcwidth==0.2.13\n geopy\n+requests\n+pynput\n\n\n\n\n\n\nNote\n\n\n\u5831\u544a\u3057\u305f\u306e\u3067\u4fee\u6b63\u3055\u308c\u307e\u3057\u305f\uff0e\n\n\n\n\n\n\u5f15\u6570\u306a\u3057\u3067\u5b9f\u884c\u3059\u308b\u3068 city_ids.dat \u5185\u304b\u3089\u8fd1\u304f\u3067\u3042\u308d\u3046\u5834\u6240\u304c\u9078\u3070\u308c\u307e\u3059\uff0e\nKagoshima\u306a\u3069BBC\u306b\u306f\u3042\u308b\u3051\u308c\u3069\u3053\u306e\u30ea\u30b9\u30c8\u306b\u306a\u3044\u5834\u6240\u306e\u5834\u5408\u4ee5\u4e0b\u306e\u30da\u30fc\u30b8\u304b\u3089\u63a2\u3057\u3066URL\u306e\u6700\u5f8c\u306eID\u3092\u30e1\u30e2\u3057\u307e\u3059\uff0eKagoshima\u306e\u5834\u5408\uff0c URL\u306f https://www.bbc.com/weather/6300348 \u3067\uff0cID\u306f 6300348 \u3067\u3059\uff0e\n\n\n\n\nBBC Weather – Home\n\n\n\nonion site\n\n\n\n\n\n\n\ncity_ids.dat \u306b\u540d\u524d\u3068\u3053\u306eID\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff0e\n\n\n\nKagoshima: 6300348\n\n\n\n\u5f15\u6570\u306b\u540d\u524d\u3092\u66f8\u304f\u3053\u3068\u3067\u6307\u5b9a\u3057\u305f\u5834\u6240\u304c\u958b\u3051\u307e\u3059\uff0e\n\n\n\n$ ./scraper.py Kagoshima\n\n\n\n\u66f4\u306b\u7def\u5ea6\uff0c\u7d4c\u5ea6\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\uff0e\n\n\n\nKagoshima: 6300348: 31.801837, 130.719404\n\n\n\n\u81ea\u5206\u306e\u74b0\u5883\u3067\u306f\u7269\u7406\u7684\u306b\u306fKagoshima\u304c\u8fd1\u3044\u306e\u3067\u3059\u304c\uff0cTokyo\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\uff0e\n\u3053\u308c\u306f\u56de\u7dda\u306b\u3088\u308b\u306e\u3060\u3068\u601d\u3044\u307e\u3059\uff0e\n\n\n\u8d77\u52d5\u3057\u305f\u3089wasd\u3067\u65e5\u306b\u3061\u3092\u79fb\u52d5\uff0cf\u3067\u8a73\u7d30\u3092\u958b\u3051\u307e\u3059\uff0ex\u3067\u623b\u308a\uff0cq\u3067\u7d42\u4e86\u3067\u3059\uff0e\n\n\n\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u306e\u3067\u3059\u304c\uff0c\u4f55\u3082\u3057\u306a\u304f\u3066\u3082\u7d30\u304b\u304f\u30d5\u30e9\u30c3\u30b7\u30e5\u3055\u308c\u3066\u898b\u3065\u3089\u3044\u3067\u3059\uff0e\ndemo\u3067\u306f\u305d\u3093\u306a\u3053\u3068\u306f\u306a\u3055\u305d\u3046\u306a\u306e\u3067\u306a\u306b\u304b\u306e\u74b0\u5883\u304c\u60aa\u3044\u306e\u304b\u3082\u3057\u308c\u307e\u305b\u3093\uff0e\n\n\n\u74b0\u5883\n\n$ git log --pretty=oneline -1\ne648ad41b5d192ff2e21bebb18feece7981ef4de (HEAD -> master, origin/master, origin/HEAD) Add requirements\n$ python --version\nPython 3.13.3\n$ dpkg-query -W python3 python3-venv python3-pip\npython3 3.13.3-1\npython3-pip 25.1+dfsg-1\npython3-venv 3.13.3-1\n$ lsb_release -a\nNo LSB modules are available.\nDistributor ID: Debian\nDescription: Debian GNU/Linux trixie/sid\nRelease: n/a\nCodename: trixie\n$ arch\nx86_64", "date_published": "2025-05-03T07:10:01+09:00", "date_modified": "2025-05-03T07:13:01+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "bbc", "TUI", "Weather", "Debian", "Linux", "sid" ] }, { "id": "https://matoken.org/blog/?p=4092", "url": "https://matoken.org/blog/2024/08/23/tui-bluetooth-manager-bluetuith/", "title": "TUI \u306e Bluetooth \u30de\u30cd\u30fc\u30b8\u30e3\u306e Bluetuith", "content_html": "
\n

Bluetuith \u3068\u3044\u3046 TUI \u306e Bluetooth \u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u3092\u77e5\u3063\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e

\n
\n
\n\n
\n
\n

\"bluetuith\"/

\n
\n

\n
\n

terminal \u3067 Bluetooth \u8a2d\u5b9a\u3092\u884c\u3046\u5834\u5408\uff0c\u3044\u3064\u3082\u306f bluez \u306e bluetoothctl \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\uff0e\u3053\u308c\u3067\u305d\u3046\u56f0\u3063\u3066\u3044\u306a\u3044\u306e\u3067\u3059\u304c\uff0c TUI \u306e Bluetuith \u3092\u77e5\u3063\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e
\nGo\u88fd MIT license \u3067\u3059\uff0e

\n
\n
\n

\u5c0e\u5165\u306f go install \u3067\u3055\u304f\u3063\u3068\u5165\u308a\u307e\u3057\u305f\uff0eGitHub \u306e release \u306b Linux\u7248 i386/amd64, armv5/armv6/armv7/arm64 \u306e\u30d0\u30a4\u30ca\u30ea\u304c\u3042\u308b\u306e\u3067\u305d\u3061\u3089\u3082\u304a\u624b\u8efd\u3067\u3059\uff0e

\n
\n
\n
go install \u3067\u306e\u5c0e\u5165
\n
\n
$ go install -v github.com/darkhz/bluetuith@latest\n$ which bluetuith\n/home/matoken/go/bin/bluetuith\n$ bluetuith
\n
\n
\n
\n
GitHub release \u304b\u3089 armv7\u7248\u3092\u5165\u624b
\n
\n
$ wget https://github.com/darkhz/bluetuith/releases/download/v0.2.3/bluetuith_0.2.3_Linux_armv7.tar.gz \\\n    https://github.com/darkhz/bluetuith/releases/download/v0.2.3/checksums.txt (1)\n$ sha256sum --ignore-missing -c checksums.txt (2)\nbluetuith_0.2.3_Linux_armv7.tar.gz: OK\n$ tar tvf bluetuith_0.2.3_Linux_armv7.tar.gz (3)\n-rw-r--r-- darkhz/darkhz  1064 2024-04-15 22:41 LICENSE\n-rwxr-xr-x darkhz/darkhz 8650904 2024-08-12 20:13 bluetuith\n$ tar xvf bluetuith_0.2.3_Linux_armv7.tar.gz -C ~/bin/ bluetuith (4)\nbluetuith\n$ bluetuith
\n
\n
\n
\n
    \n
  1. \n

    GitHub release \u304b\u3089 armv7\u30d0\u30a4\u30ca\u30ea\u3068 checksum \u3092\u5165\u624b

    \n
  2. \n
  3. \n

    \u30c1\u30a7\u30c3\u30af\u30b5\u30e0\u78ba\u8a8d

    \n
  4. \n
  5. \n

    archive \u78ba\u8a8d

    \n
  6. \n
  7. \n

    \u30d0\u30a4\u30ca\u30ea\u3092\u597d\u307f\u306e\u5834\u6240\u306b\u5c55\u958b

    \n
  8. \n
\n
\n
\n

Bluetuith \u3092\u8d77\u52d5\u3059\u308b\u3068 TUI \u306e\u753b\u9762\u3067\u5927\u307e\u304b\u306a\u64cd\u4f5c\u65b9\u6cd5\u3082\u66f8\u304b\u308c\u3066\u3044\u307e\u3059\uff0e ? key \u3067 help \u3092\u8868\u793a\u3059\u308b\u3068\u3053\u3093\u306a\u611f\u3058\uff0e

\n
\n
\n
\n
\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                          Help                         [X]\u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502Device Screen                                             \u2502\n\u2502Open the menu                                  Alt+m      \u2502\n\u2502Navigate between menus                         Tab        \u2502\n\u2502Navigate between devices/options               Up/Down    \u2502\n\u2502Toggle adapter power state                     o          \u2502\n\u2502Toggle discoverable state                      S          \u2502\n\u2502Toggle pairable state                          P          \u2502\n\u2502Toggle scan (discovery state)                  s          \u2502\n\u2502Change adapter                                 a          \u2502\n\u2502Send files                                     f          \u2502\n\u2502Connect to network                             n          \u2502\n\u2502Progress view                                  v          \u2502\n\u2502Show/Hide player                               m/M        \u2502\n\u2502Show device information                        i          \u2502\n\u2502Connect to selected device                     c          \u2502\n\u2502Pair with selected device                      p          \u2502\n\u2502Trust selected device                          t          \u2502\n\u2502Remove device from adapter                     d          \u2502\n\u2502Cancel operation                               Ctrl+X     \u2502\n\u2502Show help                                      ?          \u2502\n\u2502Quit                                           Q          \u2502\n\u2502                                                          \u2502\n\u2502File Picker                                               \u2502\n\u2502Navigate between directory entries             Up/Down    \u2502\n\u2502Enter/Go back a directory                      Right/Left \u2502\n\u2502Select one file                                Space      \u2502\n\u2502Invert file selection                          a          \u2502\n\u2502Select all files                               A          \u2502\n\u2502Refresh current directory                      Ctrl+R     \u2502\n\u2502Toggle hidden files                            h          \u2502\n\u2502Confirm file(s) selection                      Ctrl+S     \u2502\n\u2502Exit                                           Esc        \u2502\n\u2502                                                          \u2502\n\u2502Progress View                                             \u2502\n\u2502Navigate between transfers                     Up/Down    \u2502\n\u2502Suspend transfer                               z          \u2502\n\u2502Resume transfer                                g          \u2502\n\u2502Cancel transfer                                x          \u2502\n\u2502Exit                                           Esc        \u2502\n\u2502                                                          \u2502\n\u2502Media Player                                              \u2502\n\u2502Toggle play/pause                              Up/Down    \u2502\n\u2502Next                                           >          \u2502\n\u2502Previous                                       <          \u2502\n\u2502Rewind                                         Right      \u2502\n\u2502Fast forward                                   Left       \u2502\n\u2502Stop                                           ]          \u2502\n\u2502                                                          \u2502\n\u2502Device Screen                                             \u2502\n\u2502Open the menu                                  Alt+m      \u2502\n\u2502Navigate between menus                         Tab        \u2502\n\u2502Navigate between devices/options               Up/Down    \u2502\n\u2502Toggle adapter power state                     o          \u2502\n\u2502Toggle discoverable state                      S          \u2502\n\u2502Toggle pairable state                          P          \u2502\n\u2502Toggle scan (discovery state)                  s          \u2502\n\u2502Change adapter                                 a          \u2502\n\u2502Send files                                     f          \u2502\n\u2502Connect to network                             n          \u2502\n\u2502Progress view                                  v          \u2502\n\u2502Show/Hide player                               m/M        \u2502\n\u2502Show device information                        i          \u2502\n\u2502Connect to selected device                     c          \u2502\n\u2502Pair with selected device                      p          \u2502\n\u2502Trust selected device                          t          \u2502\n\u2502Remove device from adapter                     d          \u2502\n\u2502Cancel operation                               Ctrl+X     \u2502\n\u2502Show help                                      ?          \u2502\n\u2502Quit                                           Q          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
\n
\n
\n
\n

alt+m \u3067\u4e0a\u90e8\u306e Anapter \u306e\u30e1\u30cb\u30e5\u30fc\u3092\u958b\u304f\u3068\u3053\u3093\u306a\u611f\u3058\u3067\uff0c

\n
\n
\n
\n
[Adapter] [Device]\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502Power Off           o \u2502\n\u2502Discoverable On     S \u2502\n\u2502Pairable Off        P \u2502\n\u2502Stop Scan           s \u2502\n\u2502Change              a \u2502\n\u2502View Downloads      v \u2502\n\u2502Hide Media Player   M \u2502\n\u2502Quit                Q \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
\n
\n
\n
\n

\u66f4\u306b\u305d\u3053\u304b\u3089 tab \u3067 Device \u3092\u958b\u304f\u3068\u3053\u3093\u306a\u611f\u3058\u3067\u3059\uff0e

\n
\n
\n
\n
[Device]\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502Connect             c \u2502\n\u2502Pair                p \u2502\n\u2502Untrust             t \u2502\n\u2502Block               b \u2502\n\u2502Send                f \u2502\n\u2502Network Options     n \u2502\n\u2502Audio Profiles      A \u2502\n\u2502Show Media Player   m \u2502\n\u2502Info                i \u2502\n\u2502Remove              d \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
\n
\n
\n
\n

\u3088\u304f\u4f7f\u3046\u30da\u30a2\u30ea\u30f3\u30b0\u306f s \u3067\u30b9\u30ad\u30e3\u30f3\u3092\u884c\u3044\uff0c\u5bfe\u8c61\u30c7\u30d0\u30a4\u30b9\u3092\u9078\u3093\u3067 p \u3067\u30da\u30a2\u30ea\u30f3\u30b0\uff0e
\nt \u3067 Trusted \uff0e
\nc \u3067\u63a5\u7d9a\uff0c\u5207\u65ad\uff0e

\n
\n
\n

\u30aa\u30fc\u30c7\u30a3\u30aa\u30c7\u30d0\u30a4\u30b9\u3060\u3068 A \u3067\u30aa\u30fc\u30c7\u30a3\u30aa\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u9078\u629e\u3082\u51fa\u6765\u307e\u3059\uff0e

\n
\n
\n
\n
\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Off                                             \u2502\n\u2502  High Fidelity Playback (A2DP Sink, codec SBC)   \u2502\n\u2502  High Fidelity Playback (A2DP Sink, codec SBC-XQ)\u2502\n\u2502\u2022 Headset Head Unit (HSP/HFP, codec CVSD)         \u2502\n\u2502  Headset Head Unit (HSP/HFP, codec mSBC)         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
\n
\n
\n
\n

\u30d5\u30a1\u30a4\u30eb\u9001\u53d7\u4fe1\u3082\u51fa\u6765\u307e\u3059\uff0e\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u306e\u3068\u304d\u306e\u683c\u7d0d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306f ~/bluetuith/ \u306e\u4e0b\u306b\u7f6e\u304b\u308c\u307e\u3059\uff0e
\n\u4f46\u3057\uff0c\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u306f Bluetuith \u304c\u8d77\u52d5\u3057\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff0e

\n
\n
\n

Bluetuith \u306e\u7d42\u4e86\u306f Q (shift+q) \u3067\u7d42\u4e86\u3057\u307e\u3059\uff0e

\n
\n
\n

bluetoothctl \u3088\u308a\u4f7f\u3044\u3084\u3059\u3044\u306e\u306f\u3082\u3061\u308d\u3093\u3067\u3059\u304c\uff0cBluetuith \u306e\u65b9\u306f scan \u3057\u305f\u5f8c\u306a\u3069\u306b MAC \u30a2\u30c9\u30ec\u30b9\u3067\u306f\u306a\u304f\u540d\u524d\u3067\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u8907\u6570\u30c7\u30d0\u30a4\u30b9\u306e\u6271\u3044\u306e\u3068\u304d\u306b\u3068\u3066\u3082\u4fbf\u5229\u3067\u3059\uff0e

\n
\n
\n

Rust\u88fd\u306e\u540c\u3058\u3088\u3046\u306a bluetui \u3068\u3044\u3046\u3082\u306e\u3082\u3042\u308b\u3088\u3046\u306a\u306e\u3067\u3053\u3061\u3089\u3082\u8a66\u3057\u3066\u307f\u305f\u3044\u3067\u3059\uff0e

\n
\n
\n\n
\n
\n
\u74b0\u58831
\n
\n
$ ls ~/go/pkg/mod/github.com/darkhz/\nbluetuith@v0.2.2  tview@v0.0.0-20240308094543-6078a888ff79\n$ dpkg-query -W golang bluez bluetooth\nbluetooth       5.77-1\nbluez   5.77-1\ngolang:amd64    2:1.22~3\n$ lsb_release -dr\nDescription:    Debian GNU/Linux trixie/sid\nRelease:        n/a\n$ arch\nx86_64
\n
\n
\n
\n
\u74b0\u58832
\n
\n
$ bluetuith --version\nBluetuith v0.2.3 (5780d74)\n$ dpkg-query -W bluez\nbluez   5.66-1+rpt1+deb12u2\n$ lsb_release -dr\narchNo LSB modules are available.\nDescription:    Raspbian GNU/Linux 12 (bookworm)\nRelease:        12\n$ arch\narmv7l\n$ cat /sys/firmware/devicetree/base/model ;echo\nRaspberry Pi 3 Model B Rev 1.2
\n
\n
\n", "content_text": "Bluetuith \u3068\u3044\u3046 TUI \u306e Bluetooth \u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u3092\u77e5\u3063\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\n\n\n\n\ndarkhz/bluetuith: A TUI bluetooth manager for Linux.\n\n\n\n\n\n\n\n\nterminal \u3067 Bluetooth \u8a2d\u5b9a\u3092\u884c\u3046\u5834\u5408\uff0c\u3044\u3064\u3082\u306f bluez \u306e bluetoothctl \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\uff0e\u3053\u308c\u3067\u305d\u3046\u56f0\u3063\u3066\u3044\u306a\u3044\u306e\u3067\u3059\u304c\uff0c TUI \u306e Bluetuith \u3092\u77e5\u3063\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\nGo\u88fd MIT license \u3067\u3059\uff0e\n\n\n\u5c0e\u5165\u306f go install \u3067\u3055\u304f\u3063\u3068\u5165\u308a\u307e\u3057\u305f\uff0eGitHub \u306e release \u306b Linux\u7248 i386/amd64, armv5/armv6/armv7/arm64 \u306e\u30d0\u30a4\u30ca\u30ea\u304c\u3042\u308b\u306e\u3067\u305d\u3061\u3089\u3082\u304a\u624b\u8efd\u3067\u3059\uff0e\n\n\ngo install \u3067\u306e\u5c0e\u5165\n\n$ go install -v github.com/darkhz/bluetuith@latest\n$ which bluetuith\n/home/matoken/go/bin/bluetuith\n$ bluetuith\n\n\n\nGitHub release \u304b\u3089 armv7\u7248\u3092\u5165\u624b\n\n$ wget https://github.com/darkhz/bluetuith/releases/download/v0.2.3/bluetuith_0.2.3_Linux_armv7.tar.gz \\\n https://github.com/darkhz/bluetuith/releases/download/v0.2.3/checksums.txt (1)\n$ sha256sum --ignore-missing -c checksums.txt (2)\nbluetuith_0.2.3_Linux_armv7.tar.gz: OK\n$ tar tvf bluetuith_0.2.3_Linux_armv7.tar.gz (3)\n-rw-r--r-- darkhz/darkhz 1064 2024-04-15 22:41 LICENSE\n-rwxr-xr-x darkhz/darkhz 8650904 2024-08-12 20:13 bluetuith\n$ tar xvf bluetuith_0.2.3_Linux_armv7.tar.gz -C ~/bin/ bluetuith (4)\nbluetuith\n$ bluetuith\n\n\n\n\n\nGitHub release \u304b\u3089 armv7\u30d0\u30a4\u30ca\u30ea\u3068 checksum \u3092\u5165\u624b\n\n\n\u30c1\u30a7\u30c3\u30af\u30b5\u30e0\u78ba\u8a8d\n\n\narchive \u78ba\u8a8d\n\n\n\u30d0\u30a4\u30ca\u30ea\u3092\u597d\u307f\u306e\u5834\u6240\u306b\u5c55\u958b\n\n\n\n\nBluetuith \u3092\u8d77\u52d5\u3059\u308b\u3068 TUI \u306e\u753b\u9762\u3067\u5927\u307e\u304b\u306a\u64cd\u4f5c\u65b9\u6cd5\u3082\u66f8\u304b\u308c\u3066\u3044\u307e\u3059\uff0e ? key \u3067 help \u3092\u8868\u793a\u3059\u308b\u3068\u3053\u3093\u306a\u611f\u3058\uff0e\n\n\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Help [X]\u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502Device Screen \u2502\n\u2502Open the menu Alt+m \u2502\n\u2502Navigate between menus Tab \u2502\n\u2502Navigate between devices/options Up/Down \u2502\n\u2502Toggle adapter power state o \u2502\n\u2502Toggle discoverable state S \u2502\n\u2502Toggle pairable state P \u2502\n\u2502Toggle scan (discovery state) s \u2502\n\u2502Change adapter a \u2502\n\u2502Send files f \u2502\n\u2502Connect to network n \u2502\n\u2502Progress view v \u2502\n\u2502Show/Hide player m/M \u2502\n\u2502Show device information i \u2502\n\u2502Connect to selected device c \u2502\n\u2502Pair with selected device p \u2502\n\u2502Trust selected device t \u2502\n\u2502Remove device from adapter d \u2502\n\u2502Cancel operation Ctrl+X \u2502\n\u2502Show help ? \u2502\n\u2502Quit Q \u2502\n\u2502 \u2502\n\u2502File Picker \u2502\n\u2502Navigate between directory entries Up/Down \u2502\n\u2502Enter/Go back a directory Right/Left \u2502\n\u2502Select one file Space \u2502\n\u2502Invert file selection a \u2502\n\u2502Select all files A \u2502\n\u2502Refresh current directory Ctrl+R \u2502\n\u2502Toggle hidden files h \u2502\n\u2502Confirm file(s) selection Ctrl+S \u2502\n\u2502Exit Esc \u2502\n\u2502 \u2502\n\u2502Progress View \u2502\n\u2502Navigate between transfers Up/Down \u2502\n\u2502Suspend transfer z \u2502\n\u2502Resume transfer g \u2502\n\u2502Cancel transfer x \u2502\n\u2502Exit Esc \u2502\n\u2502 \u2502\n\u2502Media Player \u2502\n\u2502Toggle play/pause Up/Down \u2502\n\u2502Next > \u2502\n\u2502Previous < \u2502\n\u2502Rewind Right \u2502\n\u2502Fast forward Left \u2502\n\u2502Stop ] \u2502\n\u2502 \u2502\n\u2502Device Screen \u2502\n\u2502Open the menu Alt+m \u2502\n\u2502Navigate between menus Tab \u2502\n\u2502Navigate between devices/options Up/Down \u2502\n\u2502Toggle adapter power state o \u2502\n\u2502Toggle discoverable state S \u2502\n\u2502Toggle pairable state P \u2502\n\u2502Toggle scan (discovery state) s \u2502\n\u2502Change adapter a \u2502\n\u2502Send files f \u2502\n\u2502Connect to network n \u2502\n\u2502Progress view v \u2502\n\u2502Show/Hide player m/M \u2502\n\u2502Show device information i \u2502\n\u2502Connect to selected device c \u2502\n\u2502Pair with selected device p \u2502\n\u2502Trust selected device t \u2502\n\u2502Remove device from adapter d \u2502\n\u2502Cancel operation Ctrl+X \u2502\n\u2502Show help ? \u2502\n\u2502Quit Q \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\n\nalt+m \u3067\u4e0a\u90e8\u306e Anapter \u306e\u30e1\u30cb\u30e5\u30fc\u3092\u958b\u304f\u3068\u3053\u3093\u306a\u611f\u3058\u3067\uff0c\n\n\n\n[Adapter] [Device]\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502Power Off o \u2502\n\u2502Discoverable On S \u2502\n\u2502Pairable Off P \u2502\n\u2502Stop Scan s \u2502\n\u2502Change a \u2502\n\u2502View Downloads v \u2502\n\u2502Hide Media Player M \u2502\n\u2502Quit Q \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\n\n\u66f4\u306b\u305d\u3053\u304b\u3089 tab \u3067 Device \u3092\u958b\u304f\u3068\u3053\u3093\u306a\u611f\u3058\u3067\u3059\uff0e\n\n\n\n[Device]\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502Connect c \u2502\n\u2502Pair p \u2502\n\u2502Untrust t \u2502\n\u2502Block b \u2502\n\u2502Send f \u2502\n\u2502Network Options n \u2502\n\u2502Audio Profiles A \u2502\n\u2502Show Media Player m \u2502\n\u2502Info i \u2502\n\u2502Remove d \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\n\n\u3088\u304f\u4f7f\u3046\u30da\u30a2\u30ea\u30f3\u30b0\u306f s \u3067\u30b9\u30ad\u30e3\u30f3\u3092\u884c\u3044\uff0c\u5bfe\u8c61\u30c7\u30d0\u30a4\u30b9\u3092\u9078\u3093\u3067 p \u3067\u30da\u30a2\u30ea\u30f3\u30b0\uff0e\nt \u3067 Trusted \uff0e\nc \u3067\u63a5\u7d9a\uff0c\u5207\u65ad\uff0e\n\n\n\u30aa\u30fc\u30c7\u30a3\u30aa\u30c7\u30d0\u30a4\u30b9\u3060\u3068 A \u3067\u30aa\u30fc\u30c7\u30a3\u30aa\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u9078\u629e\u3082\u51fa\u6765\u307e\u3059\uff0e\n\n\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Off \u2502\n\u2502 High Fidelity Playback (A2DP Sink, codec SBC) \u2502\n\u2502 High Fidelity Playback (A2DP Sink, codec SBC-XQ)\u2502\n\u2502\u2022 Headset Head Unit (HSP/HFP, codec CVSD) \u2502\n\u2502 Headset Head Unit (HSP/HFP, codec mSBC) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\n\n\u30d5\u30a1\u30a4\u30eb\u9001\u53d7\u4fe1\u3082\u51fa\u6765\u307e\u3059\uff0e\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u306e\u3068\u304d\u306e\u683c\u7d0d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306f ~/bluetuith/ \u306e\u4e0b\u306b\u7f6e\u304b\u308c\u307e\u3059\uff0e\n\u4f46\u3057\uff0c\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u306f Bluetuith \u304c\u8d77\u52d5\u3057\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff0e\n\n\nBluetuith \u306e\u7d42\u4e86\u306f Q (shift+q) \u3067\u7d42\u4e86\u3057\u307e\u3059\uff0e\n\n\nbluetoothctl \u3088\u308a\u4f7f\u3044\u3084\u3059\u3044\u306e\u306f\u3082\u3061\u308d\u3093\u3067\u3059\u304c\uff0cBluetuith \u306e\u65b9\u306f scan \u3057\u305f\u5f8c\u306a\u3069\u306b MAC \u30a2\u30c9\u30ec\u30b9\u3067\u306f\u306a\u304f\u540d\u524d\u3067\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u8907\u6570\u30c7\u30d0\u30a4\u30b9\u306e\u6271\u3044\u306e\u3068\u304d\u306b\u3068\u3066\u3082\u4fbf\u5229\u3067\u3059\uff0e\n\n\nRust\u88fd\u306e\u540c\u3058\u3088\u3046\u306a bluetui \u3068\u3044\u3046\u3082\u306e\u3082\u3042\u308b\u3088\u3046\u306a\u306e\u3067\u3053\u3061\u3089\u3082\u8a66\u3057\u3066\u307f\u305f\u3044\u3067\u3059\uff0e\n\n\n\n\npythops/bluetui at terminaltrove\n\n\n\n\n\u74b0\u58831\n\n$ ls ~/go/pkg/mod/github.com/darkhz/\nbluetuith@v0.2.2 tview@v0.0.0-20240308094543-6078a888ff79\n$ dpkg-query -W golang bluez bluetooth\nbluetooth 5.77-1\nbluez 5.77-1\ngolang:amd64 2:1.22~3\n$ lsb_release -dr\nDescription: Debian GNU/Linux trixie/sid\nRelease: n/a\n$ arch\nx86_64\n\n\n\n\u74b0\u58832\n\n$ bluetuith --version\nBluetuith v0.2.3 (5780d74)\n$ dpkg-query -W bluez\nbluez 5.66-1+rpt1+deb12u2\n$ lsb_release -dr\narchNo LSB modules are available.\nDescription: Raspbian GNU/Linux 12 (bookworm)\nRelease: 12\n$ arch\narmv7l\n$ cat /sys/firmware/devicetree/base/model ;echo\nRaspberry Pi 3 Model B Rev 1.2", "date_published": "2024-08-23T06:02:47+09:00", "date_modified": "2024-08-23T06:02:49+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "bluetooth", "TUI", "bookworm", "Debian", "Linux", "Raspberry Pi OS", "sid" ] }, { "id": "https://matoken.org/blog/?p=3804", "url": "https://matoken.org/blog/2023/01/08/tuis-markdown-browser-textual-markdown-browser/", "title": "TUI\u306eMarkdown\u30d6\u30e9\u30a6\u30b6\u306eTextual Markdown Browser \u3092\u5c11\u3057\u8a66\u3059", "content_html": "
\n

Textual\u3068\u3044\u3046TUI\u306ePython\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u5229\u7528\u3057\u305fMarkdown\u30d6\u30e9\u30a6\u30b6\u306eTextual Markdown Browser \u3068\u3044\u3046\u3082\u306e\u3092\u898b\u304b\u3051\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e

\n
\n
\n\n
\n

\n
\n
\u5c0e\u5165
\n
\n
$ python3 -m venv venv\n$ source venv/bin/activate\n$ pip install textual-markdown
\n
\n
\n
\n
\u5b9f\u884c
\n
\n
$ python3 -m textual_markdown ./README.md
\n
\n
\n
\n

\"textual

\n
\n
\n

\u30de\u30a6\u30b9\u30db\u30a4\u30fc\u30eb\u3067\u306e\u30b9\u30af\u30ed\u30fc\u30eb\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u3066\u52d5\u4f5c\u304c\u3059\u308b\u3059\u308b\u3068\u3044\u3044\u611f\u3058\u3067\u3059\uff0eTOC\u304b\u3089\u306e\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u3082\u30de\u30a6\u30b9\u30af\u30ea\u30c3\u30af\u3067\u52d5\u4f5c\u3057\u307e\u3059\uff0e\u3068\u3044\u3044\u611f\u3058\u306a\u306e\u3067\u3059\u304c\uff0c\u4ee5\u4e0b\u306e\u3088\u3046\u306bMarkdown\u306b\u3088\u308a\u30a8\u30e9\u30fc\u306b\u306a\u3063\u3066\u52d5\u4f5c\u3057\u306a\u3044\u3082\u306e\u304c\u591a\u3044\u3067\u3059\uff0e

\n
\n
\n
\n
$ python3 -m textual_markdown ~/src/reveal.js/README.md\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Traceback (most recent call last) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 /home/matoken/.local/lib/python3.10/site-packages/textual_markdown/widgets.py:601  \u2502\n\u2502 in on_tocupdated                                                                   \u2502\n\u2502                                                                                    \u2502\n\u2502   598 \u2502   \u2502   yield MarkdownDocument()                                             \u2502\n\u2502   599 \u2502                                                                            \u2502\n\u2502   600 \u2502   def on_tocupdated(self, message: TOCUpdated) -> None:                    \u2502\n\u2502 \u2771 601 \u2502   \u2502   self.query_one(MarkdownTOC).toc = message.toc                        \u2502\n\u2502   602 \u2502   \u2502   message.stop()                                                       \u2502\n\u2502   603 \u2502                                                                            \u2502\n\u2502   604 \u2502   def on_tocselected(self, message: TOCSelected) -> None:                  \u2502\n\u2502                                                                                    \u2502\n\u2502 \u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 locals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e                               \u2502\n\u2502 \u2502 message = TOCUpdated(MarkdownDocument())         \u2502                               \u2502\n\u2502 \u2502    self = MarkdownBrowser(classes={'-show-toc'}) \u2502                               \u2502\n\u2502 \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f                               \u2502\n\u2502                                                                                    \u2502\n\u2502 /home/matoken/.local/lib/python3.10/site-packages/textual_markdown/widgets.py:525  \u2502\n\u2502 in watch_toc                                                                       \u2502\n\u2502                                                                                    \u2502\n    :
\n
\n
\n
\n

\u73fe\u6bb5\u968e\u3067\u306f\u8868\u793a\u3067\u306a\u3044Markdown\u304c\u591a\u3044\u306e\u3067html\u306b\u5909\u63db\u3057\u3066\u30d6\u30e9\u30a6\u30b6\u3067\u898b\u308b\u307b\u3046\u304c\u826f\u3055\u305d\u3046\u3067\u3059\uff0e

\n
\n
\n
\n
$ pandoc -f markdown -t html ~/src/reveal.js/README.md | w3m -T text/html\n$ pandoc -f markdown -t html ~/src/reveal.js/README.md | lynx -stdin
\n
\n
\n
\n
\u74b0\u5883
\n
\n
$ pip3 show textual-markdown\nName: textual-markdown\nVersion: 0.1.1\nSummary: Markdown viewer widgets for Textual\nHome-page:\nAuthor: Will McGugan\nAuthor-email: willmcgugan@gmail.com\nLicense: MIT\nLocation: /home/matoken/.local/lib/python3.10/site-packages\nRequires: markdown-it-py, textual\nRequired-by:\n$ dpkg-query -W python3 python3-pip pandoc lynx w3m\nlynx    2.9.0dev.11-1\npandoc  2.17.1.1-1.1\npython3 3.10.6-3+b1\npython3-pip     22.3.1+dfsg-1\nw3m     0.5.3+git20220429-1+b1\n$ lsb_release --all\nDistributor ID: Debian\nDescription:    Debian GNU/Linux bookworm/sid\nRelease:        n/a\nCodename:       bookworm\n$ arch\nx86_64
\n
\n
\n", "content_text": "Textual\u3068\u3044\u3046TUI\u306ePython\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u5229\u7528\u3057\u305fMarkdown\u30d6\u30e9\u30a6\u30b6\u306eTextual Markdown Browser \u3068\u3044\u3046\u3082\u306e\u3092\u898b\u304b\u3051\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\n\n\n\nwillmcgugan/textual-markdown\nTextualize/textual: Textual is a TUI (Text User Interface) framework for Python inspired by modern web development.\n\n\n\n\n\u5c0e\u5165\n\n$ python3 -m venv venv\n$ source venv/bin/activate\n$ pip install textual-markdown\n\n\n\n\u5b9f\u884c\n\n$ python3 -m textual_markdown ./README.md\n\n\n\n\n\n\n\u30de\u30a6\u30b9\u30db\u30a4\u30fc\u30eb\u3067\u306e\u30b9\u30af\u30ed\u30fc\u30eb\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u3066\u52d5\u4f5c\u304c\u3059\u308b\u3059\u308b\u3068\u3044\u3044\u611f\u3058\u3067\u3059\uff0eTOC\u304b\u3089\u306e\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u3082\u30de\u30a6\u30b9\u30af\u30ea\u30c3\u30af\u3067\u52d5\u4f5c\u3057\u307e\u3059\uff0e\u3068\u3044\u3044\u611f\u3058\u306a\u306e\u3067\u3059\u304c\uff0c\u4ee5\u4e0b\u306e\u3088\u3046\u306bMarkdown\u306b\u3088\u308a\u30a8\u30e9\u30fc\u306b\u306a\u3063\u3066\u52d5\u4f5c\u3057\u306a\u3044\u3082\u306e\u304c\u591a\u3044\u3067\u3059\uff0e\n\n\n\n$ python3 -m textual_markdown ~/src/reveal.js/README.md\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Traceback (most recent call last) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 /home/matoken/.local/lib/python3.10/site-packages/textual_markdown/widgets.py:601 \u2502\n\u2502 in on_tocupdated \u2502\n\u2502 \u2502\n\u2502 598 \u2502 \u2502 yield MarkdownDocument() \u2502\n\u2502 599 \u2502 \u2502\n\u2502 600 \u2502 def on_tocupdated(self, message: TOCUpdated) -> None: \u2502\n\u2502 \u2771 601 \u2502 \u2502 self.query_one(MarkdownTOC).toc = message.toc \u2502\n\u2502 602 \u2502 \u2502 message.stop() \u2502\n\u2502 603 \u2502 \u2502\n\u2502 604 \u2502 def on_tocselected(self, message: TOCSelected) -> None: \u2502\n\u2502 \u2502\n\u2502 \u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 locals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e \u2502\n\u2502 \u2502 message = TOCUpdated(MarkdownDocument()) \u2502 \u2502\n\u2502 \u2502 self = MarkdownBrowser(classes={'-show-toc'}) \u2502 \u2502\n\u2502 \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f \u2502\n\u2502 \u2502\n\u2502 /home/matoken/.local/lib/python3.10/site-packages/textual_markdown/widgets.py:525 \u2502\n\u2502 in watch_toc \u2502\n\u2502 \u2502\n :\n\n\n\n\u73fe\u6bb5\u968e\u3067\u306f\u8868\u793a\u3067\u306a\u3044Markdown\u304c\u591a\u3044\u306e\u3067html\u306b\u5909\u63db\u3057\u3066\u30d6\u30e9\u30a6\u30b6\u3067\u898b\u308b\u307b\u3046\u304c\u826f\u3055\u305d\u3046\u3067\u3059\uff0e\n\n\n\n$ pandoc -f markdown -t html ~/src/reveal.js/README.md | w3m -T text/html\n$ pandoc -f markdown -t html ~/src/reveal.js/README.md | lynx -stdin\n\n\n\n\u74b0\u5883\n\n$ pip3 show textual-markdown\nName: textual-markdown\nVersion: 0.1.1\nSummary: Markdown viewer widgets for Textual\nHome-page:\nAuthor: Will McGugan\nAuthor-email: willmcgugan@gmail.com\nLicense: MIT\nLocation: /home/matoken/.local/lib/python3.10/site-packages\nRequires: markdown-it-py, textual\nRequired-by:\n$ dpkg-query -W python3 python3-pip pandoc lynx w3m\nlynx 2.9.0dev.11-1\npandoc 2.17.1.1-1.1\npython3 3.10.6-3+b1\npython3-pip 22.3.1+dfsg-1\nw3m 0.5.3+git20220429-1+b1\n$ lsb_release --all\nDistributor ID: Debian\nDescription: Debian GNU/Linux bookworm/sid\nRelease: n/a\nCodename: bookworm\n$ arch\nx86_64", "date_published": "2023-01-08T19:20:00+09:00", "date_modified": "2023-01-08T19:20:01+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "Markdown", "TUI", "bookworm", "Debian", "Linux" ] }, { "id": "http://matoken.org/blog/?p=3224", "url": "https://matoken.org/blog/2021/04/19/periodic-table-tui/", "title": "TUI\u306a\u5468\u671f\u8868\u306e\u300cperiodic-table-tui\u300d", "content_html": "
\n

TUI\u3067\u52d5\u4f5c\u3059\u308bPython\u88fd\u306escript\u3092\u898b\u304b\u3051\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e

\n
\n
\n\n
\n
\n

\n
\n
\n
\n
$ git clone https://github.com/pryme-svg/periodic-table-tui\n$ cd ./periodic-table-tui\n$ ./periodic-table.py
\n
\n
\n
\n

\"periodic

\n
\n
\n

\u7aef\u672b\u30b5\u30a4\u30ba\u304c\u5c0f\u3055\u3044\u3068 Terminal too small! \u3068\u8a00\u308f\u308c\u3066\u52d5\u4f5c\u3057\u307e\u305b\u3093\uff0e
\nsource\u3092\u898b\u308b\u3068\u7e26\u6a2a35×95\u5fc5\u8981\u305d\u3046\u3067\u3059\uff0e

\n
\n
\n

` min_h, min_w = 35, 95`

\n
\n
\n

\u30ab\u30fc\u30bd\u30eb\u3067\u79fb\u52d5\uff0c\u5143\u7d20\u540d(\u3084\u7565\u53f7)\u3092\u5165\u529b\u3057\u3066\u30a8\u30f3\u30bf\u30fc\u3067\u305d\u306e\u5143\u7d20\u306b\u79fb\u52d5\u3057\u307e\u3059\uff0eCtrl+c\u3067\u7d42\u4e86\u3057\u307e\u3059\uff0e

\n
\n
\n
\u74b0\u5883
\n
\n
$ git log -1|head -1\ncommit 8fe6b458cc889fe8c08c8207cd9448bb66c4dfd2\n$ dpkg-query -W python3\npython3\t3.9.2-3\n$ lsb_release -dr\nDescription:\tDebian GNU/Linux 11 (bullseye)\nRelease:\t11\n$ arch\nx86_64
\n
\n
\n", "content_text": "TUI\u3067\u52d5\u4f5c\u3059\u308bPython\u88fd\u306escript\u3092\u898b\u304b\u3051\u305f\u306e\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e\n\n\n\nGitHub – pryme-svg/periodic-table-tui\n\n\n\n\n\n\n\n$ git clone https://github.com/pryme-svg/periodic-table-tui\n$ cd ./periodic-table-tui\n$ ./periodic-table.py\n\n\n\n\n\n\n\u7aef\u672b\u30b5\u30a4\u30ba\u304c\u5c0f\u3055\u3044\u3068 Terminal too small! \u3068\u8a00\u308f\u308c\u3066\u52d5\u4f5c\u3057\u307e\u305b\u3093\uff0e\nsource\u3092\u898b\u308b\u3068\u7e26\u6a2a35×95\u5fc5\u8981\u305d\u3046\u3067\u3059\uff0e\n\n\n` min_h, min_w = 35, 95`\n\n\n\u30ab\u30fc\u30bd\u30eb\u3067\u79fb\u52d5\uff0c\u5143\u7d20\u540d(\u3084\u7565\u53f7)\u3092\u5165\u529b\u3057\u3066\u30a8\u30f3\u30bf\u30fc\u3067\u305d\u306e\u5143\u7d20\u306b\u79fb\u52d5\u3057\u307e\u3059\uff0eCtrl+c\u3067\u7d42\u4e86\u3057\u307e\u3059\uff0e\n\n\n\u74b0\u5883\n\n$ git log -1|head -1\ncommit 8fe6b458cc889fe8c08c8207cd9448bb66c4dfd2\n$ dpkg-query -W python3\npython3\t3.9.2-3\n$ lsb_release -dr\nDescription:\tDebian GNU/Linux 11 (bullseye)\nRelease:\t11\n$ arch\nx86_64", "date_published": "2021-04-19T22:44:28+09:00", "date_modified": "2021-04-19T22:44:30+09:00", "authors": [ { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" } ], "author": { "name": "matoken", "url": "https://matoken.org/blog/author/matoken/", "avatar": "https://secure.gravatar.com/avatar/38f5f3b575c5eb45cda6aa659bca119ac7a5e16b46565e869d0030e3bd66981d?s=512&d=mm&r=g" }, "tags": [ "periodic table", "TUI", "Debian", "Linux", "sid" ] } ] }