Wi-Fiã5æéæ»ãã§ããæ â 5忝ãããã¯ãŒã¯ãããŒãã§airportdã®åãæŽã
ååãã¯ã©ãŒã¿ã埩æ§ããç¬éã«ãžã§ããã©ãã ãåå®è¡ãã¹ãããæžããè©±ãæžããŸãããä»åã¯ãã®æ°æ¥åã«èµ·ããããã£ãšå°å³ã§åä»ãªè©±ã§ã ââ èªå® Wi-Fiã5æéæ»ãã§ããã®ã«ããã©ãŠã¶ã ãã¯å¹³ç¶ãšç¹ãã£ãŠããæã®èšé²ã§ãã
å°ãããšïŒãã©ãŠã¶ã¯ç¹ãã£ãŠãã®ã«ãžã§ãã ãèœã¡ã
2026-09-12ã®æãç¡äººãžã§ãã4æ¬ç«ãŠç¶ãã«èœã¡ãŸããã
| ãžã§ã | æå» |
|---|---|
com.lily.es-daily-rows | 05:01 |
com.lily.paid-note-pin-guard | 07:20 |
com.lily.line-column-gen | 08:40 |
com.lily.line-pdca | 08:41 |
ãšã©ãŒã¯ Node fetch failed ã python getaddrinfo ã®å€±æããšãããåãæéã«Chromeã§ãã©ãŠãžã³ã°ã¯æ®éã«ã§ããŠããŸãããããããã¯ç¹ãã£ãŠãã®ã«äžéšã®ããã»ã¹ã ãæ»ã¬ããšãããäžçªåä»ãªãã€ã§ãã
unified logãæããšãairportd ãåããŠãã SlowWiFiDnsFailure ãç°åžžãªä»¶æ°åºãŠããŸãããçŽè¿24æéã§4,960ä»¶ã05:43é ããæ¬æ ŒåããŠ06ã11æå°ã¯æ¯æ1,000ã1,700ä»¶è¶
ãããŒã¯ã¯10æå°ã®1,720ä»¶ã12:38ãæåŸã«ãŽãããšæ¢ãŸã£ãŠããŸããåå åŽã®äººéã®æäœã¯13:09ãèªå®
Wi-Fiããã¹ããã®ãã¶ãªã³ã°ãžæåã§åãæ¿ããç¬éã§ãããåæ¿åŸã«ãããŒãã37åæã€ãšfailed: 0ãIPv4/IPv6ãšã lookup 60msæªæºã»connect 100msæªæºã«åŸ©åž°ããŠããŸãã
ç¯äººã¯ãDNSã®çµè·¯ã ããæ»ãã§ããããšã§ãããChromeã¯ç¬èªã®DNS解決ïŒDoHïŒãã£ãã·ã¥ïŒãæã€ããèªå® ã«ãŒã¿ã®DNSãè ã£ãŠããŠãå¹³ç¶ãšåããNode/pythonã¯ã·ã¹ãã ãªãŸã«ãïŒïŒèªå® ã«ãŒã¿ã®DNSïŒãçŽæããã®ã§åºãããããã©ãŠã¶ãç¹ãã£ãŠãïŒãããã¯æ£åžžããšããçŽæãããã®ãŸãŸèšºæã®ãã©ããã«ãªã£ãŠããŸããã
èžãã èœãšã穎ïŒèšºæç·šïŒ
- symlinkã®mtimeãèŠãŠã3é±éåãããã¶ãªã³ã°ã ã£ãããšèª€èªãããã â
/etc/resolv.confã¯symlinkã§ãmtimeãAug 15ã®ãŸãŸãå®äœã®/var/run/resolv.confã®mtimeãèŠããšåæ¿æå»ïŒ13:09:39ïŒãšãŽã£ããäžèŽãã誀èªãšå€æãsymlinkãšå®äœãã©ã£ã¡ã®mtimeãèŠãŠãããåžžã«æèããå¿ èŠããã - unified logã®facilityããšã«ä¿æãŠã£ã³ããŠãéã â
configdã¯05:54以éããæ®ã£ãŠããããairportdã¯åæ¥19æããæ®åãåãæé軞ã§2ã€ã®facilityãæ¯èŒããŠããã€ããããçæ¹ã ãåãããŒããŠãã SlowWiFiDnsFailureãšããååããã¹ãªãŒã â ãé ããã§ãã£ãŠãæ»ãã§ãããã§ã¯ãªãäœã§ãã°ã«åºããããgrepã§ç°åžžæ€ç¥ããã«ãéŸå€å€æãèŠã- Node fetch failed ã¯åã24æéã§343ä»¶ããžã§ãã®å€±ææå»ïŒ05:01ã08:41ïŒãš
airportdã®ããŒã¹ãéå§ïŒ05:43ãïŒããºã¬ãŠèŠããã®ããfacilityã®ä¿ææéå·®ãçç±ã§ãã
ãã®æ¥ã¯åŸãã unified log ãæã£ãŠã06:00-12:38ã«çŽ5,000ä»¶ããŸã§ã¯ç¹å®ã§ããŸãããã§ããããã§ããã®ã¯ãããŸããŸã€ã³ã·ãã³ããç®ç«ã€èŠæš¡ã ã£ãããã§ããæ¬¡ã«åãçŸè±¡ããã£ãšçæéã»äœé »åºŠã§èµ·ããããunified logã®ä¿ææéãéããŠäœãæ®ããªãå¯èœæ§ããããŸããåå 远跡ããåŸããlogãæããã«äŸåããªãä»çµã¿ãèŠãããšããã®ããã®èšäºã®æ¬é¡ã§ãã
äºåºŠãšåŸè¿œãã«ããªãããã«ïŒnet-probe.sh
äœã£ãã®ã¯ã5åããšã«ãåç·ç¶æ ã®ã¹ãããã·ã§ãããã1è¡JSONLãžæ®ãç¶ããã ãã®ã¹ã¯ãªããã§ããChromeãclaudeã䜿ããã20ç§ä»¥å ã«åãŸãããšãç®æšã«ããŠããŸãã
#!/bin/bash
# 5忝ã®è»œéãããã¯ãŒã¯ãããŒãïŒChrome/claude äžäœ¿çšã»ç®æš20ç§ä»¥å
)ã
# gateway / SSID / nameserver / dig 3ãã¹ã / curl -4,-6 2ãã¹ã / python getaddrinfo ã
# 1è¡JSONã§ ~/.claude/logs/net-probe.jsonl ãžè¿œèšããã
# ç®ç: Node fetch failed / python getaddrinfo 倱æããã©ã®åç·ã»ã©ã®DNSã§ãèµ·ããããåŸããçªåããã
èã¯å
šéšäžŠåã§æã€ããšã§ããsystem_profiler ã«ããSSIDååŸã ãã§5ç§ãããã®ã§ãä»ã®åéãšåæã«ããã¯ã°ã©ãŠã³ããžéãããŸãã
# --- SSID 㯠system_profiler ã5ç§ãããã®ã§äžŠå ---
( system_profiler SPAirPortDataType 2>/dev/null | awk '/Current Network Information:/{getline; gsub(/^ +| *:$/,""); print; exit}' > "$TMP/ssid" ) &
# --- DNS: ã·ã¹ãã é åºã§3ãã¹ã + åNSã§ oauth2 (ãã¹ãŠäžŠå, 2ç§Ã1å) ---
for h in oauth2.googleapis.com discord.com note.com; do
( dig +time=2 +tries=1 "$h" A > "$TMP/dig.$h" 2>&1 ) &
done
i=0
for ns in ${NS//,/ }; do
( dig +time=2 +tries=1 @"$ns" oauth2.googleapis.com A > "$TMP/digns.$i" 2>&1; echo "$ns" > "$TMP/digns.$i.ns" ) &
i=$((i+1))
done
dig 㯠+time=2 +tries=1 ã§å¿
ã2ç§ã§åãäžããcurl 㯠--max-time 6ãpythonã® getaddrinfo ã¯ã¹ã¬ããåã㊠join(5) ã§åŒ·å¶çã«5ç§ã§èŠåããŸããå
šéšã¿ã€ã ã¢ãŠããæç€ºããªããšãDNSãæ¬åœã«æ»ãã§ãããšãã«ãããŒãèªäœãåºãã£ãŠæ¬¡ã®5åæ ã«éã«åããªããªãããã§ãã
def f():
t = time.time()
try:
r = socket.getaddrinfo('oauth2.googleapis.com', 443)
res.update(ok=True, n=len(r), ms=round((time.time()-t)*1000))
except Exception as e:
res.update(ok=False, err=type(e).__name__+': '+str(e), ms=round((time.time()-t)*1000))
th = threading.Thread(target=f, daemon=True); th.start(); th.join(5)
if not res: res.update(ok=False, err='timeout>5s', ms=5000)
éããæç㯠wait ã§å
šéšæãã®ãåŸ
ã£ãŠãããbashã§ã¯ãªãpythonã§1è¡JSONãžçµã¿ç«ãŠãŸããæååé£çµã§JSONãæçµã¿ãããšãSSIDã«ç©ºçœãç¹æ®æåãå
¥ã£ãç¬éã«å£ããã®ã§ãããã ã㯠json.dumps ã«ä»»ããŠããŸãã
gw = os.environ['GW']
fail = sum(1 for d in dns.values() if d['status'] != 'NOERROR') + sum(1 for h in http.values() if h['http'] == 0) + (0 if py.get('ok') else 1)
rec = {
'ts': os.environ['TS'], 'gateway': gw, 'gateway6': os.environ['GW6'], 'iface': os.environ['IFACE'],
'ip4': os.environ['IP4'], 'ssid': rd(f'{T}/ssid').strip(), 'security': os.environ['SEC'],
'isIphoneHotspot': gw == '172.20.10.1', 'resolvers': [x for x in os.environ['NS'].split(',') if x],
'utun': int(os.environ['UTUN'] or 0), 'dns': dns, 'dnsPerResolver': per_ns, 'http': http,
'pyGetaddrinfo': py, 'failures': fail,
}
isIphoneHotspot ã¯ã²ãŒããŠã§ã€IPã 172.20.10.1ïŒiPhoneãã¶ãªã³ã°ã®æ¢å®ã¢ãã¬ã¹ïŒãã©ããã§å€å®ããŠããŸããã²ãŒããŠã§ã€ã®IPãæ¯åç®ã§èŠæ¯ã¹ãªããŠãããã®1ãã£ãŒã«ãã§ãä»ã©ã£ã¡ã®åç·ãããäžçºã§åããããã«ããŠããŸããfailures 㯠dns / http / pyGetaddrinfo ã®å€±ææ°ãè¶³ããéèšå€ã§ãjsonlã grep '"failures":[1-9]' ããã ãã§ç°åžžè¡ãæããŸãã
launchdïŒ5忝ã«éãã«èµ°ããã
StartInterval ã§åºå®ééèµ·åã«ããåªå
床ãäžããŠããã¯ã°ã©ãŠã³ãã«åŸ¹ãããŸãã
<key>StartInterval</key>
<integer>300</integer>
<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>10</integer>
<key>ProcessType</key>
<string>Background</string>
Nice 10 + LowPriorityIO ã§ãä»ã®èªååãžã§ãã®CPU/IOã絶察ã«å¥ªããªãããã«ããŠããŸãããããã¯ãŒã¯ã®çæ»ãèŠåŒµããžã§ãèªèº«ããªãœãŒã¹ç«¶åã®åå ã«ãªã£ããæ¬æ«è»¢åã§ãã
4æ¥éåããŠã¿ã宿ž¬
å°å ¥ãã仿¥ãŸã§ã§ 662è¡æºãŸããŸããã
$ wc -l ~/.claude/logs/net-probe.jsonl
662
ã²ãŒããŠã§ã€å¥ã®å
èš³ã¯ãèªå®
Wi-FiïŒ192.168.3.1ïŒã594ä»¶ãiPhoneãã¶ãªã³ã°ïŒ172.20.10.1ïŒã68ä»¶ã"failures":[1-9] ã«ãããããè¡ã¯50ä»¶ã662ä»¶äžçŽ7.6%ã§ããããŒãä»¶ã ã£ãæ¥ãããã°ã2026-09-13T09 ã ãã§5件倱æãåºãŸã£ãŠããæé垯ãããã5åç²åºŠã§èŠãªããšæœ°ããŠããã§ãããã ã©ã§ãã
1è¡ã¯ããããåœ¢ã§æ®ããŸãïŒå®éã®èšé²ããæç²ïŒã
{"ts":"2026-09-16T20:28:45+0900","gateway":"192.168.3.1","iface":"en0",
"security":"WPA2_PSK","isIphoneHotspot":false,
"dns":{"oauth2.googleapis.com":{"status":"NOERROR","ms":17,"answers":5,"err":null},
"discord.com":{"status":"NOERROR","ms":17,"answers":11,"err":null},
"note.com":{"status":"NOERROR","ms":15,"answers":8,"err":null}},
"http":{"v4:discord.com":{"http":200,"lookup":0.004285,"connect":0.013422,"total":0.115357}, ...},
"pyGetaddrinfo":{"ok":true,"n":4,"ms":107},"failures":0}
çªåãïŒãã€ã»ã©ã®åç·ã»ã©ã®DNSã§ãåŸãã埩å ãã
ã€ã³ã·ãã³ãçŽåŸã«ãŸãšãã network-flap-probe-2026-09-12.json ã«ã¯ verdict: "dns-resolver-flap" ãšãåå ã®èª¬æããã®ãŸãŸæ®ã£ãŠããŸãã
"verdictDetail": "çç¶ã®çºçæºã¯èªå®
Wi-Fiã® DNS çµè·¯ãairportd ã 06:00-12:38 ã«
SlowWiFiDnsFailure ãçŽ5,000ä»¶ïŒæ¯æ1,000-1,700ä»¶ïŒèšé²ããŠãããfailing 4 ãžã§ããš
fetch failed 343ä»¶ã¯ãã®åç·äžã§çºçã13:09ã«äººéã iPhone ãã¶ãªã³ã°ãžæååæ¿ããåŸã¯
fault 0ã»å
šãããŒãæåãChrome çµç±ãžã§ããéã£ãŠããã®ã¯ Chrome ãç¬èª DNS
(DoH/éåæãªãŸã«ã+ãã£ãã·ã¥)ã䜿ããNode/pythonã¯ã·ã¹ãã ãªãŸã«ã
ïŒèªå®
ã«ãŒã¿ DNSïŒãçŽæãããã"
ãã®æ¥ã¯æäœæ¥ã§ãããŸã§æããŸããããnet-probe.jsonl ãããã°åãçµè«ã«5åç²åºŠã§æ©æ¢°çã«èŸ¿ãçããŸããgateway ãã£ãŒã«ãã§åç·ããdnsPerResolver ãã£ãŒã«ãã§ã©ã®DNSãµãŒããŒãžã®åãåãããã©ãå¿çããããåå¥ã«èšé²ããŠããã®ã§ãããã€ã»ã©ã®åç·ã»ã©ã®DNSãµãŒããŒã§ã倱æãããããã£ãŒã«ãã®çµã蟌ã¿ã ãã§åçŸã§ããŸããæåã§ã®åçŸæé ïŒrouteråèµ·åãDNSã1.1.1.1/8.8.8.8ã«åºå®ïŒãå¿
èŠãã©ãããããã®èšé²ãèŠãã°éœåºŠå€æã§ããŸãã
ãŸãšã
- Wi-Fiã¯ç¹ãã£ãŠããŠãDNSçµè·¯ã ããæ»ã¬ããšããããChromeãå¹³ç¶ãšåãã®ã¯ç¬èªDNSãã£ãã·ã¥ãæã£ãŠããããã§ãæ£åžžæ§ã®èšŒæ ã«ã¯ãªããªã
- åå 远跡ããã€ã³ã·ãã³ãåŸã«unified logãæããã«äŸåãããšãfacilityããšã®ä¿ææéå·®ãsymlinkã®mtime誀èªãšãã£ãçœ ã«ã¯ãŸã
net-probe.sh㯠gateway / SSID / DNS / HTTP(v4,v6) / getaddrinfo ãå šéšäžŠåã»ã¿ã€ã ã¢ãŠãä»ãã§æã¡ã20ç§ä»¥å ã«1è¡JSONLãžè¿œèšããã ãã®èãä»çµã¿launchdã®StartInterval=300+Nice 10+LowPriorityIOã§ã5忝ã«ä»ãžã§ããšç«¶åããéãã«åã- 4æ¥ã§662è¡ãfailures>0ã50è¡ïŒ7.6%ïŒããã®èç©ãããã°ã次ã«åãçŸè±¡ãèµ·ããŠããåŸããæããã§ã¯ãªãããã£ãŒã«ããçµããã ãã§åå ã«å°éã§ãã
ãã®jsonlã䜿ã£ãŠãå®éã«ç°åžžãæ€ç¥ãããèªåã§Discordã«éç¥ããå¿ èŠãªãåç·ãèªåã§åãæ¿ãããšãããŸã§è²ãŠãããšæã£ãŠããŸããããã¯ãŸãå¥ã®èšäºã§ã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ