@kyanny's blog

My thoughts, my life. Views/opinions are my own.

ここ数年 Garmin の body battery の数値を何かと気にして生活する body battery 信者と化していたが*1、ここ数ヶ月私生活が多忙で満足に休めておらず十分な長さのまとまった睡眠もままならない日々が続いているなかで、そういったのっぴきならない事情を完全に無視して連日「睡眠が短く低質」「疲れ果てています、十分な睡眠を」などと言われ続けると、だんだんうんざりしてきた。

なので、心機一転ウォッチフェイスを変えて、body battery が表示されないものにしてみた。デフォルトがどれだったか覚えてないけど、ほとんど変えたことがない(デフォルトのままだったかも)ので、なかなか新鮮。今度のやつは無駄に方位が表示されて、ぐっとアウトドアウォッチっぽくなった。CASIO の PRO TREK を連想した。

*1:妻は侮蔑を込めて「ボディバカ」と呼ぶ

スクリーンリーダーで特定のページのナビゲーションに問題がある、というケースを担当した。最終的に開発側にエスカレーションすることになるのはわかっていたが、どういう事象か理解したくて想定よりもだいぶ時間をかけてしまったが、満足感があった。スクリーンリーダーの使い方にも少し慣れた。VoiceOver と NVDA で試したが、VO+U(ローター)と NVDA+F7(要素リスト)の使い方を理解できたのが大きかった。

つくづく、おれは何かに習熟することが好きなのだなと思う。アクセシビリティに造詣が深いわけではないし*1、スクリーンリーダーを常用しているわけでも、常用する気があるわけでもないが、とにかく未知なる道具の使い方がわかって使えるようになる過程が純粋に楽しい。エレキギターの練習に自分でもちょっと驚くほどハマっているのも、根本は同じだろう。

*1:平均よりほんのちょっとだけ関心は持っている気はするが

csvpick.rb

CSV の加工には csvkit を愛用しているが、一つ苦手なことがあることがわかった。エスケープ(重複したダブルクォート)を外した生テキストデータを出力できないのだ。

以下のような、列内に JSON 文字列が入っている CSV を扱う場合を考える。log 列の値を取り出して jq で整形・抽出したい。

timestamp,log
2026-03-30T09:00:01Z,"{""host"":""192.168.1.10"",""method"":""GET"",""path"":""/index.html"",""protocol"":""HTTP/1.1"",""status"":200,""bytes"":1234,""referer"":""-"",""user_agent"":""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36""}"
2026-03-30T09:00:15Z,"{""host"":""10.0.0.42"",""method"":""POST"",""path"":""/api/login"",""protocol"":""HTTP/1.1"",""status"":200,""bytes"":512,""referer"":""https://example.com/login"",""user_agent"":""curl/7.88.1""}"
2026-03-30T09:01:03Z,"{""host"":""203.0.113.5"",""method"":""GET"",""path"":""/assets/style.css"",""protocol"":""HTTP/1.1"",""status"":304,""bytes"":0,""referer"":""https://example.com/index.html"",""user_agent"":""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)""}"
2026-03-30T09:02:47Z,"{""host"":""198.51.100.7"",""method"":""GET"",""path"":""/api/users/99"",""protocol"":""HTTP/1.1"",""status"":404,""bytes"":89,""referer"":""-"",""user_agent"":""python-requests/2.31.0""}"
2026-03-30T09:03:22Z,"{""host"":""192.168.1.88"",""method"":""DELETE"",""path"":""/api/posts/5"",""protocol"":""HTTP/1.1"",""status"":403,""bytes"":61,""referer"":""-"",""user_agent"":""PostmanRuntime/7.36.0""}"
2026-03-30T09:05:10Z,"{""host"":""10.0.0.15"",""method"":""PUT"",""path"":""/api/users/12"",""protocol"":""HTTP/1.1"",""status"":500,""bytes"":143,""referer"":""-"",""user_agent"":""axios/1.6.7""}"
2026-03-30T09:07:55Z,"{""host"":""172.16.0.3"",""method"":""GET"",""path"":""/favicon.ico"",""protocol"":""HTTP/1.1"",""status"":200,""bytes"":4286,""referer"":""-"",""user_agent"":""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36""}"
2026-03-30T09:10:30Z,"{""host"":""203.0.113.99"",""method"":""GET"",""path"":""/robots.txt"",""protocol"":""HTTP/1.1"",""status"":200,""bytes"":96,""referer"":""-"",""user_agent"":""Googlebot/2.1 (+http://www.google.com/bot.html)""}"

要するに、

  • "{""host"":""192.168.1.10"",""method"":""GET"",""path"":""/index.html"",""protocol"":""HTTP/1.1"",""status"":200,""bytes"":1234,""referer"":""-"",""user_agent"":""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36""}" というデータを、
  • {"host":"192.168.1.10","method":"GET","path":"/index.html","protocol":"HTTP/1.1","status":200,"bytes":1234,"referer":"-","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} という形で、

取り出したい。のだが、csvkit は Python csv モジュールの csv.writer を経由してデータを出力し、csv.writer は RFC に厳格なクォートの扱いをするので、こういうことはできない。ということらしい。

csvkit のオプションをいろいろ試したが難しく、最終的にこの仕事をする単体のツール csvpick.rb を作った。

github.com

これを使うと、やりたいことが最短の手順でできる。

% csvpick.rb -c log < sample.csv | jq -r .user_agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
curl/7.88.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
python-requests/2.31.0
PostmanRuntime/7.36.0
axios/1.6.7
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36

numfmt.pl

数字の単位変換(byte -> KB/MB/GB)が必要なとき、毎度 irb などで / 1024 / 1024 ... とやるのも芸がないし*1、なんかコマンドあったよなあとわざわざ調べて numfmt を思い出したら macOS にデフォルトでインストールされていなかった。numfmt は使い方も難しいし、どっち方向の変換かをオプションで指定するのは面倒くさいからよしなにやって欲しいんだよな、と思い立って numfmt.pl というのを作った(AI に作らせた)。

github.com

*1:数年前から irb の起動が遅くなって、こういうちょっとしたことをやりづらくなった。python のほうがインタラクティブシェルの起動が速いので使用頻度が逆転しつつある

ソフトバンクのメッシュ Wi-Fi の設定画面にアクセスできないときは iPhone の Safari からログインする

ソフトバンクのメッシュWi-Fiの設定画面にアクセスできないときは一日待て - @kyanny's blog

一日も待ってられない。前回どうしたか覚えてられないのでメモ。

iPhone の Safari から http://rtconf.jp にアクセスすると、メッシュ Wi-Fi 機器の管理画面にアクセスできる。

会社支給の MacBook Pro だと名前解決に使う DNS サーバーが違うので名前解決できない、とかが起こっていそう。

メッシュ Wi-Fi の親機と子機、それぞれに管理画面があり、管理画面のログインパスワードはそれぞれ設定変更する必要がある。

ソフトバンク光のルーター(光BBユニット)の管理画面とは IP アドレスも違う。例:

  • 光BBユニット: 192.168.1.1
  • メッシュ Wi-Fi 親機: 192.168.1.14
  • メッシュ Wi-Fi 親機: 192.168.1.15

メッシュ Wi-Fi 機器の IP アドレスは、(iPhone の Safari で)親機の管理画面にログインしてから、有線 LAN 接続情報ページを見ると、自身の IP アドレスが書いてあるのがそれ。子機も同様。Wi-Fi SSID 設定などは親機側で行う。

MacBook Pro からは、/etc/hosts にホスト名を書けばアクセスできるが、IP アドレス直打ちのほうが早い。