[{"data":1,"prerenderedAt":1013},["ShallowReactive",2],{"content:\u002Fja\u002Ffiddling\u002Ffake-ip-based-transparent-proxy":3,"series:content_ja":295},{"id":4,"title":5,"authorship":6,"body":7,"categories":263,"date":265,"description":266,"draft":267,"extension":268,"image":269,"meta":270,"navigation":272,"path":273,"permalink":274,"published":274,"readingTime":275,"recommend":274,"references":274,"seo":280,"seoDescription":281,"seoTitle":274,"sitemap":282,"stem":286,"tags":287,"type":293,"__hash__":294},"content_ja\u002Fposts\u002Ffiddling\u002Ffake-ip-based-transparent-proxy.md","FakeIPを使った透過プロキシの振り分け","human-only",{"type":8,"value":9,"toc":252},"minimark",[10,14,23,36,46,49,55,58,72,80,87,97,100,111,114,118,121,127,130,133,138,146,155,162,168,179,189,195,201,204,207,210,218,221,224,230,233,239,242,246,249],[11,12,13],"h3",{"id":13},"はじめに",[15,16,17,22],"p",{},[18,19,21],"a",{"href":20},"\u002Fja\u002Ffiddling\u002Fdebian-as-bypass-router","前の記事","では、サイドルーターでLAN内の透過プロキシを構築しました。多くの人には十分使える構成ですが、欠点もはっきりしています。",[24,25,26,30,33],"ol",{},[27,28,29],"li",{},"単一障害点になります。DHCPで配るゲートウェイがサイドルーターを直接指すため、そこでClashが止まると検閲回避が不要なサイトまでアクセスできなくなります。",[27,31,32],{},"Clashのパケット転送性能はハードウェア転送に遠く及びません。ゲートウェイをサイドルーターにすると、iptablesの設定により、検閲回避が必要かどうかに関係なくClashが全通信を転送します。",[27,34,35],{},"サイドルーターがゲートウェイになるため、メインルーターとサイドルーターの両方でポート転送を設定する必要があります。",[15,37,38,39,45],{},"ちょうど最近、新興のプロキシコアsing-boxを見つけました。新興というほどでもなく、Clashがarchiveされてから人気が出ただけかもしれません。",[18,40,44],{"href":41,"rel":42},"https:\u002F\u002Fsing-box.sagernet.org\u002Fconfiguration",[43],"nofollow","Wiki","を見ると、対応プロトコルと機能が充実し、性能の最適化もClashより進んでいます。新しい構成では、そのままsing-boxを使うことにしました。",[15,47,48],{},"もちろん、この構成はClashでも実現できます。",[15,50,51],{},[52,53,54],"del",{},"悲報：sing-boxのWikiを見るにも検閲回避が必要です。",[11,56,57],{"id":57},"構成の考え方",[15,59,60,61,65,66,71],{},"sing-boxとClashにはどちらもDNSサーバー機能が組み込まれていて、FakeIPに対応しています。FakeIPは次のように考えるとわかりやすいです。",[62,63,64],"mark",{},"クライアントがDNSクエリを送ると、DNSモジュールはすぐに偽のIPを返し、裏で実際の名前解決を行って偽IPと実IPの対応を保持します。その後クライアントがFakeIPに接続してデータを送ると、ゲートウェイが対応表から実IPを引いてリクエストします。","詳しくは",[18,67,70],{"href":68,"rel":69},"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc3089",[43],"RFC3089","を参照してください。後のルーティングでDNS応答時に保存した対応表を使うため、DNSサーバー単独ではFakeIPの仕組み全体を実現できません。",[15,73,74,75,79],{},"FakeIPは通常、",[76,77,78],"code",{"code":78},"198.18.0.0\u002F15","などの予約済み範囲にあるので、見分けやすく振り分けも簡単です。ソフトウェアルーター上のプロキシのDNSに、プロキシが必要なドメインだけFakeIPを返させます。そしてメインルーターにネクストホップを設定し、FakeIP宛てだけをソフトウェアルーターのプロキシへ流し、それ以外は通常どおり転送します。具体的には次のとおりです。",[15,81,82],{},[83,84],"img",{"alt":85,"src":86},"FakeIPによる振り分け","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002Fe078ffe1fe41b2cbcb04b40a55cbbc56.png",[88,89,94],"pre",{"className":90,"code":92,"language":93},[91],"language-text","1. 无须科学的域名\n  1. 客户端发起 DNS 解析\n  2. DNS 模块判断为无须科学，向国内 DNS 请求，返回 RealIP\n  3. 客户端使用 RealIP 发起请求\n  4. 主路由判断不是 FakeIP，走默认路由（直连）\n  \n2. 需要科学的域名\n  1. 客户端发起 DNS 解析\n  2. DNS 模块判断为需要科学，返回 FakeIP，并向国外 DNS 请求\n  3. 客户端使用 FakeIP 发起请求\n  4. 主路由判断是 FakeIP，路由流量到代理软件\n  5. 代理软件根据 FakeIP 映射，通过出口节点向国外 IP 发起请求\n","text",[76,95,92],{"__ignoreMap":96},"",[15,98,99],{},"これで前の記事の3つの欠点を解消できます。",[24,101,102,105,108],{},[27,103,104],{},"単一障害点の問題です。sing-boxが止まってもインターネット全体が使えなくなるのを防げます。前の記事と同じくsing-boxのDNSはAdGuard Homeの後段に置きます。AdGuardが上流の障害を検知すると、中国国内のフォールバックDNSを使います。FakeIPが返らなくなるので、全通信がメインルーターのデフォルトルートを通ります。",[27,106,107],{},"検閲回避が不要な通信はプロキシソフトを通らず、ルーターが直接転送します。",[27,109,110],{},"メインルーターのルーティングテーブルが転送を担い、全クライアントのゲートウェイもメインルーターになります。NATが2段にならないため、メインルーターのポート転送が壊れません。",[11,112,113],{"id":113},"実装",[115,116,117],"h4",{"id":117},"メインルーターの設定",[15,119,120],{},"まずメインルーターにネクストホップゲートウェイを設定します。iKuaiなら流量制御・振り分け → 振り分け設定 → ポート振り分けでルールを追加し、方式をネクストホップゲートウェイにしてソフトウェアルーターのIP（私の場合は192.168.7.2）を入力します。宛先アドレスに198.18.0.0\u002F15を追加し、ほかは標準設定のままにします。",[15,122,123],{},[83,124],{"alt":125,"src":126},"ネクストホップゲートウェイ","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002F37f3bc2ebbd0f4f79e218c2a949a84c4.png",[15,128,129],{},"これで198.18.0.0\u002F15宛ての通信は、メインルーターを通るときにすべて192.168.7.2へ転送されます。",[115,131,132],{"id":132},"sing-boxのインストールと設定",[15,134,135,137],{},[18,136,21],{"href":20},"に従ってAdGuard Homeを構築し、上流DNSは引き続き127.0.0.1:1053にします。続いてsing-boxをインストールします。Debianならコマンド1つです。",[88,139,144],{"className":140,"code":142,"language":143,"meta":96},[141],"language-shell","bash \u003C(curl -fsSL https:\u002F\u002Fsing-box.app\u002Fdeb-install.sh)\n","shell",[76,145,142],{"__ignoreMap":96},[15,147,148,149,154],{},"ほかのディストリビューション向けの手順は",[18,150,153],{"href":151,"rel":152},"https:\u002F\u002Fsing-box.sagernet.org\u002Finstallation\u002Fpackage-manager\u002F#__tabbed_2_1",[43],"https:\u002F\u002Fsing-box.sagernet.org\u002Finstallation\u002Fpackage-manager","にあります。",[15,156,157,158,161],{},"インストーラーがsystemdサービスを自動作成します。sing-boxの定義は少し変わっていて、",[76,159,160],{"code":160},"\u002Flib\u002Fsystemd\u002Fsystem\u002Fsing-box.service","にあります。このファイルを編集し、ExecStartの前に次の3行を追加します。",[88,163,166],{"className":164,"code":165,"language":143,"meta":96},[141],"ExecStartPre  = +\u002Fusr\u002Fbin\u002Fbash \u002Fetc\u002Fsing-box\u002Fclean.sh\nExecStartPost = +\u002Fusr\u002Fbin\u002Fbash \u002Fetc\u002Fsing-box\u002Fiptables.sh\nExecStopPost  = +\u002Fusr\u002Fbin\u002Fbash \u002Fetc\u002Fsing-box\u002Fclean.sh\n",[76,167,165],{"__ignoreMap":96},[15,169,170,171,174,175,178],{},"前の構成と同様に、起動時にルーティングを設定し、sing-box停止時に消去します。sing-boxの設定はすべて",[76,172,173],{"code":173},"\u002Fetc\u002Fsing-box","にあり、標準の設定ファイルも",[76,176,177],{"code":177},"\u002Fetc\u002Fsing-box\u002Fconfig.json","なので、スクリプトもそこへそろえます。",[15,180,181,184,185,188],{},[76,182,183],{"code":183},"\u002Fetc\u002Fsing-box\u002Fiptables.sh","と",[76,186,187],{"code":187},"\u002Fetc\u002Fsing-box\u002Fclean.sh","を次の内容で作成します。",[88,190,193],{"className":191,"code":192,"language":143,"meta":96},[141],"#!\u002Fusr\u002Fbin\u002Fenv bash\n\nset -ex\n\n# ENABLE ipv4 forward\nsysctl -w net.ipv4.ip_forward=1\n# ENABLE ipv6 forward\nsysctl -w net.ipv6.conf.all.forwarding=1\n\n### IPv4 Routing Rules ###\n# ROUTE RULES\nip rule add fwmark 666 lookup 666\nip route add local 0.0.0.0\u002F0 dev lo table 666\n\n# clash 链负责处理转发流量\niptables -t mangle -N clash\n\n# 跳过内网流量\niptables -t mangle -A clash -d 0.0.0.0\u002F8 -j RETURN\niptables -t mangle -A clash -d 127.0.0.0\u002F8 -j RETURN\niptables -t mangle -A clash -d 10.0.0.0\u002F8 -j RETURN\niptables -t mangle -A clash -d 172.16.0.0\u002F12 -j RETURN\niptables -t mangle -A clash -d 192.168.0.0\u002F16 -j RETURN\niptables -t mangle -A clash -d 169.254.0.0\u002F16 -j RETURN\niptables -t mangle -A clash -d 224.0.0.0\u002F4 -j RETURN\niptables -t mangle -A clash -d 240.0.0.0\u002F4 -j RETURN\n\n# 需代理的 IP 转向到 7893 端口，并打上 mark\niptables -t mangle -A clash -d 198.18.0.0\u002F15 -p tcp -j TPROXY --on-port 7893 --tproxy-mark 666\niptables -t mangle -A clash -d 198.18.0.0\u002F15 -p udp -j TPROXY --on-port 7893 --tproxy-mark 666\n\n# 剩余流量正常处理\niptables -t mangle -A clash -j RETURN\n\n# 最后让所有流量通过 clash 链进行处理\niptables -t mangle -A PREROUTING -j clash\n\n# clash_local 链负责处理网关本身发出的流量\niptables -t mangle -N clash_local\n\n# 跳过内网流量\niptables -t mangle -A clash_local -d 0.0.0.0\u002F8 -j RETURN\niptables -t mangle -A clash_local -d 127.0.0.0\u002F8 -j RETURN\niptables -t mangle -A clash_local -d 10.0.0.0\u002F8 -j RETURN\niptables -t mangle -A clash_local -d 172.16.0.0\u002F12 -j RETURN\niptables -t mangle -A clash_local -d 192.168.0.0\u002F16 -j RETURN\niptables -t mangle -A clash_local -d 169.254.0.0\u002F16 -j RETURN\niptables -t mangle -A clash_local -d 224.0.0.0\u002F4 -j RETURN\niptables -t mangle -A clash_local -d 240.0.0.0\u002F4 -j RETURN\n\n# 为本机发出的流量打 mark\niptables -t mangle -A clash_local -p tcp -j MARK --set-mark 666\niptables -t mangle -A clash_local -p udp -j MARK --set-mark 666\n\n# 让本机发出的流量跳转到 clash_local\n# clash_local 链会为本机流量打 mark, 打过 mark 的流量会重新回到 PREROUTING 上\niptables -t mangle -A OUTPUT -j clash_local\n\n# 修复 ICMP(ping)\n# 这并不能保证 ping 结果有效 (clash 等不支持转发 ICMP), 只是让它有返回结果而已\n# --to-destination 设置为一个可达的地址即可\nsysctl -w net.ipv4.conf.all.route_localnet=1\niptables -t nat -A PREROUTING -p icmp -d 198.18.0.0\u002F16 -j DNAT --to-destination 127.0.0.1\n",[76,194,192],{"__ignoreMap":96},[88,196,199],{"className":197,"code":198,"language":143,"meta":96},[141],"#!\u002Fusr\u002Fbin\u002Fenv bash\n\nset -ex\n\nip rule del fwmark 666 table 666 || true\nip route del local 0.0.0.0\u002F0 dev lo table 666 || true\n\niptables -t nat -F\niptables -t nat -X\niptables -t mangle -F\niptables -t mangle -X clash || true\niptables -t mangle -X clash_local || true\n",[76,200,198],{"__ignoreMap":96},[15,202,203],{},"iptables.shは前の記事とほぼ同じです。clashチェーンの最後だけを変え、198.18.0.0\u002F15宛てを7893番のTPROXYポートへ転送し、それ以外は標準ルールに任せます。つまりメインルーターから転送されたFakeIP通信をsing-boxへ渡しています。clean.shは変更していません。",[15,205,206],{},"チェーン名のclashとclash_localはそのままにしました。Clashの構成を少し直しただけなので。手抜きです。",[15,208,209],{},"次はsing-boxの設定ファイルです。テンプレートを載せます。",[88,211,216],{"className":212,"code":214,"language":215,"meta":96},[213],"language-json","{\n  \"log\": {\n    \"level\": \"info\",\n    \"output\": \"box.log\",\n    \"timestamp\": true\n  },\n  \"dns\": {\n    \"servers\": [\n      {\n        \"tag\": \"cloudflare\",\n        \"address\": \"tls:\u002F\u002F1.1.1.1\",\n        \"detour\": \"🌍 外网\" \u002F\u002F 改为你的代理节点 tag\n      },\n      {\n        \"tag\": \"local\",\n        \"address\": \"223.5.5.5\",\n        \"detour\": \"DIRECT\"\n      },\n      {\n        \"tag\": \"dns-fakeip\",\n        \"address\": \"fakeip\"\n      },\n      {\n        \"tag\": \"block\",\n        \"address\": \"rcode:\u002F\u002Fsuccess\"\n      }\n    ],\n    \"rules\": [\n      {\n        \"server\": \"block\",\n        \"query_type\": [\n          \"HTTPS\",\n          \"SVCB\"\n        ]\n      },\n      {\n        \"server\": \"local\",\n        \"outbound\": \"any\"\n      },\n      {\n        \"server\": \"local\",\n        \"rewrite_ttl\": 10,\n        \"type\": \"logical\",\n        \"mode\": \"and\",\n        \"rules\": [\n          {\n            \"rule_set\": [\n              \"geosite-geolocation-!cn\"\n            ],\n            \"invert\": true\n          },\n          {\n            \"rule_set\": [\n              \"geosite-cn\",\n              \"geosite-category-companies@cn\",\n              \"geoip-cn\"\n            ]\n          }\n        ]\n      },\n      {\n        \"server\": \"dns-fakeip\",\n        \"rewrite_ttl\": 1,\n        \"query_type\": [\n          \"A\",\n          \"AAAA\"\n        ]\n      }\n    ],\n    \"strategy\": \"ipv4_only\",\n    \"fakeip\": {\n      \"enabled\": true,\n      \"inet4_range\": \"198.18.0.0\u002F15\"\n    }\n  },\n  \"inbounds\": [\n    {\n      \"type\": \"tproxy\",\n      \"tag\": \"tproxy-in\",\n      \"listen\": \"::\",\n      \"listen_port\": 7893,\n      \"tcp_fast_open\": true,\n      \"udp_fragment\": true,\n      \"sniff\": true\n    },\n    {\n      \"type\": \"mixed\",\n      \"tag\": \"mixed-in\",\n      \"listen\": \"::\",\n      \"listen_port\": 7890,\n      \"tcp_fast_open\": true,\n      \"udp_fragment\": true,\n      \"sniff\": true\n    },\n    {\n      \"type\": \"direct\",\n      \"tag\": \"dns-in\",\n      \"listen\": \"::\",\n      \"listen_port\": 1053\n    }\n  ],\n  \"outbounds\": [\n    {\n      \"type\": \"direct\",\n      \"tag\": \"DIRECT\"\n    },\n    {\n      \"type\": \"block\",\n      \"tag\": \"REJECT\"\n    },\n    {\n      \"type\": \"dns\",\n      \"tag\": \"dns-out\"\n    },\n    \u002F\u002F 此处填写你的代理节点\n  ],\n  \"route\": {\n    \"rules\": [\n      {\n        \"inbound\": \"dns-in\",\n        \"outbound\": \"dns-out\"\n      },\n      {\n        \"protocol\": \"dns\",\n        \"outbound\": \"dns-out\"\n      },\n      {\n        \"outbound\": \"DIRECT\",\n        \"type\": \"logical\",\n        \"mode\": \"and\",\n        \"rules\": [\n          {\n            \"rule_set\": [\n              \"geosite-geolocation-!cn\"\n            ],\n            \"invert\": true\n          },\n          {\n            \"rule_set\": [\n              \"geosite-cn\",\n              \"geosite-category-companies@cn\",\n              \"geoip-cn\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"rule_set\": [\n      {\n        \"type\": \"remote\",\n        \"tag\": \"geoip-cn\",\n        \"format\": \"binary\",\n        \"url\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FSagerNet\u002Fsing-geoip@rule-set\u002Fgeoip-cn.srs\",\n        \"download_detour\": \"DIRECT\"\n      },\n      {\n        \"type\": \"remote\",\n        \"tag\": \"geosite-cn\",\n        \"format\": \"binary\",\n        \"url\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FSagerNet\u002Fsing-geosite@rule-set\u002Fgeosite-cn.srs\",\n        \"download_detour\": \"DIRECT\"\n      },\n      {\n        \"type\": \"remote\",\n        \"tag\": \"geosite-geolocation-!cn\",\n        \"format\": \"binary\",\n        \"url\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FSagerNet\u002Fsing-geosite@rule-set\u002Fgeosite-geolocation-!cn.srs\",\n        \"download_detour\": \"DIRECT\"\n      },\n      {\n        \"type\": \"remote\",\n        \"tag\": \"geosite-category-companies@cn\",\n        \"format\": \"binary\",\n        \"url\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FSagerNet\u002Fsing-geosite@rule-set\u002Fgeosite-category-companies@cn.srs\",\n        \"download_detour\": \"DIRECT\"\n      }\n    ],\n    \"final\": \"🌍 外网\", \u002F\u002F 改为你的代理节点 tag\n    \"auto_detect_interface\": true\n  },\n  \"experimental\": {\n    \"clash_api\": {\n      \"external_controller\": \"0.0.0.0:9090\",\n      \"external_ui\": \"yacd\",\n      \"external_ui_download_url\": \"https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002FYacd-meta\u002Farchive\u002Fgh-pages.zip\",\n      \"external_ui_download_detour\": \"🌍 外网\", \u002F\u002F 改为你的代理节点 tag\n      \"default_mode\": \"Rule\"\n    }\n  }\n}\n","json",[76,217,214],{"__ignoreMap":96},[15,219,220],{},"コメントで示した箇所を変更してください。標準設定では、中国のドメインを223.5.5.5で直接RealIPに解決し（DNS-rules[2]）、ほかのドメインはFakeIPにします（DNS-rules[3]）。通信は中国のIPとドメインをDIRECTで直接接続し（route-rules[2]）、それ以外をプロキシへ流します（route-final）。",[15,222,223],{},"すべて設定したら、sing-boxを自動起動にし、その場で起動します。",[88,225,228],{"className":226,"code":227,"language":143,"meta":96},[141],"systemctl enable --now sing-box\n",[76,229,227],{"__ignoreMap":96},[15,231,232],{},"ログはDebian標準のツールで確認できます。",[88,234,237],{"className":235,"code":236,"language":143,"meta":96},[141],"journalctl -efu sing-box\n",[76,238,236],{"__ignoreMap":96},[15,240,241],{},"sing-boxにはClash互換APIがあるので、ClashのWeb UIで管理できます。起動後、UIのダウンロードが終わるまで少し待てば、9090番ポートでyacdを開けます。",[115,243,245],{"id":244},"telegramの問題","Telegramの問題",[15,247,248],{},"欠点も明確です。DNSに基づく振り分けなので、DNSを使わずIPを直接指定する通信はメインルーターから直接出てしまい、Telegramのようなアプリを正しく振り分けられません。解決策は簡単で、そのIPをメインルーターのネクストホップのIPリスト、iptables.shの転送リスト、sing-box設定のrulesへ追加し、プロキシ経由に指定します。",[15,250,251],{},"現在は、ルールセット内のIPを自動処理し、対応するIPリスト、iptables.sh、そのままsing-boxで使えるconfig.jsonを生成するスクリプトを自作して使っています。もう少し整えて個人情報を除いたら公開する予定です。お楽しみに。",{"title":96,"searchDepth":253,"depth":253,"links":254},4,[255,257,258],{"id":13,"depth":256,"text":13},3,{"id":57,"depth":256,"text":57},{"id":113,"depth":256,"text":113,"children":259},[260,261,262],{"id":117,"depth":253,"text":117},{"id":132,"depth":253,"text":132},{"id":244,"depth":253,"text":245},[264],"fiddling","2024-08-16 23:53:00","FakeIPを使った透過プロキシ構成で、従来のサイドルーターの単一障害点、性能不足、複雑なポート転送を改善します。プロキシコアをsing-boxに変えることで、転送性能を高めながら設定も簡単にできます。対応プロトコルが豊富で、従来のClashより最適化も進んでいます。同じ構成はClashでも実現できますが、sing-boxは柔軟な選択肢になります。",false,"md","https:\u002F\u002Fblog-img.774352199.xyz\u002FS2HHD5.webp",{"slots":271},{},true,"\u002Ffiddling\u002Ffake-ip-based-transparent-proxy",null,{"text":276,"minutes":277,"time":278,"words":279},"14 min read",13.1,786000,2620,{"title":5,"description":266},"sing-boxのFakeIPとメインルーターのネクストホップ設定で通信を選別。必要な通信をサイドルーターへ送り、DNSのフォールバックやTelegramのIP指定通信にも対応します。",{"loc":273,"images":283},[284,285],{"loc":86},{"loc":126},"posts\u002Ffiddling\u002Ffake-ip-based-transparent-proxy",[288,289,290,291,292],"FakeIP","sing-box","透過プロキシ","ポリシーベースルーティング","トラフィック振り分け","tech","2rpyl5MJfZhIr85tWyAaiBXKLiPwviMCm5Ozk1kEhbU",[296,314,331,349,366,384,402,419,437,453,457,473,489,505,522,540,555,572,586,603,621,638,653,670,686,705,722,739,757,771,789,807,823,838,852,869,884,899,914,928,942,956,971,985,999],{"categories":297,"date":299,"description":300,"image":301,"path":302,"readingTime":303,"recommend":274,"tags":308,"title":313,"type":293},[298],"daily","2024-09-01 22:03:10","子どもの頃からの胃腸の不調が大学時代には不思議と消えたものの、就職後の夜更かしと飲酒で再発。慢性胃炎との付き合いは一筋縄ではいきませんでした。吐き気や胃のむかつきが日常になり、何度か検査を受けて生活を振り返るうちに、ようやく腰を据えて治療に向き合うようになりました。","https:\u002F\u002Fblog-img.774352199.xyz\u002F0Hr9l5.webp","\u002Fdaily\u002Fanti-chronic-gastritis",{"text":304,"minutes":305,"time":306,"words":307},"7 min read",6.485,389100,1297,[309,310,311,312],"慢性胃炎","受診記録","胃内視鏡検査","健康記録","慢性胃炎の治療記録",{"categories":315,"date":316,"description":317,"image":318,"path":319,"readingTime":320,"recommend":274,"tags":325,"title":330,"type":293},[298],"2022-04-11 00:13:13","『三体』では、劉慈欣が壮大な歴史を通して個人と集団の関係を描いています。西側の民主主義への疑念と、大多数の人々に運命を委ねることへの悲観が、三部作を貫いています。英雄たちが力を尽くしても、その努力は歴史の流れに押し流される。文化大革命から始まる物語に、少数の傑出した人物と平凡な大衆の対立を読み、人間性と社会について考えました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FLTzbFP.webp","\u002Fdaily\u002Fpeople-in-three-body",{"text":321,"minutes":322,"time":323,"words":324},"19 min read",18.495,1109700,3699,[326,327,328,329],"三体","劉慈欣","SF文学","読書ノート","『三体』における「大多数の人々」",{"categories":332,"date":333,"description":334,"image":335,"path":336,"readingTime":337,"recommend":274,"tags":342,"title":348,"type":293},[298],"2024-01-04 02:06:51","2024年の学習目標は、日本語をN2レベルに引き上げること、SICPとTAPLを最後までやり切ること、POSIXを完全に実装したカーネルを作ること、そしてブログのテーマを更新すること。どれも簡単ではありませんが、今年取り組む方向は決まりました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FV3rSQC.webp","\u002Fdaily\u002Fplan2024",{"text":338,"minutes":339,"time":340,"words":341},"1 min read",0.345,20700,69,[343,344,345,346,347],"年間計画","日本語学習","SICP","TAPL","オペレーティングシステム","2024年の学習計画",{"categories":350,"date":351,"description":352,"image":353,"path":354,"readingTime":355,"recommend":274,"tags":360,"title":365,"type":293},[298],"2024-09-28 16:26:00","ByteDanceで働いて3年。変化の速い環境で、時間まで加速したように感じながらも、どうにか心のバランスを保ってきました。杭州のオフィスのベランダから遠くの山を眺めていた入社当初を振り返り、仕事の壁や心境の変化、忙しさの中で自分のペースを探してきた日々を記します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FhnCaht.webp","\u002Fdaily\u002Fwork-for-3-years",{"text":356,"minutes":357,"time":358,"words":359},"20 min read",19.73,1183800,3946,[361,362,363,364],"ByteDance","エンジニアのキャリア","仕事の振り返り","メンタルヘルス","ByteDanceで3年働きながら、ある程度の正気を保つことも不可能ではない",{"categories":367,"date":368,"description":369,"image":370,"path":371,"readingTime":372,"recommend":274,"tags":377,"title":383,"type":293},[264],"2025-05-28 22:09:00","ブログをAstroに移行したところ、従来のGoogle Analytics導入方法では性能面が気になるようになりました。headタグにJavaScriptを直接追加してイベントを送ることはできますが、ページの性能に影響します。そこでpartytownでスクリプトをメインスレッドから切り離し、読み込みを妨げないようにしました。サンプルコードに手を加えることでGoogle Analyticsの導入に成功し、性能とアクセス解析を両立できました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FQ0w4RN.webp","\u002Ffiddling\u002Fastro-google-tag-manager",{"text":373,"minutes":374,"time":375,"words":376},"4 min read",3.455,207300,691,[378,379,380,381,382],"Astro","Google Analytics","Google Tag Manager","Partytown","アクセス解析","AstroにGoogle Analyticsを導入する（Tag Manager編）",{"categories":385,"date":386,"description":387,"image":388,"path":389,"readingTime":390,"recommend":395,"tags":396,"title":401,"type":293},[264],"2023-04-08 13:16:36","新しいプログラミング言語の設計は、難しくも面白い作業です。複雑なコンパイラ理論や機能の実装詳細をいったん脇に置き、コードがコンピューターのどこで動くかに注目すると、言語の作り方が見えてきます。RISC-VI命令セットを出発点に、基盤となる構造、階層化されたシステム、仮想マシンのモデルをたどり、言語の本質を考えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FuO420B.webp","\u002Ffiddling\u002Fchitchat-about-programming-language",{"text":391,"minutes":392,"time":393,"words":394},"28 min read",27.03,1621800,5406,2,[397,398,399,400],"プログラミング言語設計","型システム","コンパイラ設計","RISC-V","プログラミング言語についての雑談",{"categories":403,"date":404,"description":405,"image":406,"path":407,"readingTime":408,"recommend":253,"tags":413,"title":418,"type":293},[264],"2025-04-18 16:43:12","彼女が仕事で北京から上海に引っ越したので、回線の手配も手伝いました。ところが上海電信の500Mは杭州の1000Mより高く、なんとも納得がいきません。そこで上海での透過プロキシ、特定の通信の杭州経由での外部接続、両拠点のLAN相互接続を目指してネットワークを組むことにしました。杭州側はソフトウェアルーターと無線APのシンプルな構成で、普段から自宅経由で通信できる環境があり、次の挑戦に向けた準備はできています。","https:\u002F\u002Fblog-img.774352199.xyz\u002FO6cAGh.webp","\u002Ffiddling\u002Fcross-city-network-setup",{"text":409,"minutes":410,"time":411,"words":412},"11 min read",10.14,608400,2028,[414,415,416,290,417],"Tailscale","mihomo","拠点間ネットワーク","ホームネットワーク","上海と杭州の自宅ネットワークをつなぐ",{"categories":420,"date":421,"description":422,"image":423,"path":424,"readingTime":425,"recommend":274,"tags":430,"title":436,"type":293},[264],"2021-12-27 00:09:00","CSAPPの学習では実験が欠かせませんが、Linux環境の構築が壁になりがちです。とくに仮想マシンでは、インストール失敗、互換性、ネットワーク接続などの問題に悩まされます。Windows 10バージョン2004以降なら、WSL（Windows Subsystem for Linux）が有力な選択肢です。従来の仮想マシンの複雑さや性能面の負担を避けながら、Linux環境を手軽に利用できます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FvqOC7N.webp","\u002Ffiddling\u002Fcsapplab0",{"text":426,"minutes":427,"time":428,"words":429},"10 min read",9.585,575100,1917,[431,432,433,434,435],"CSAPP","WSL2","Linux","GDB","実験環境","CSAPP Labの環境構築",{"categories":438,"date":439,"description":440,"image":441,"path":442,"readingTime":443,"recommend":274,"tags":448,"title":452,"type":293},[264],"2024-07-13 17:49:00","Debianをサイドルーターに使うと、OpenWrtやLuCIに依存せず、より安定した柔軟な構成を作れます。Debianを直接設定することでシステムを細かく制御でき、GUIの制約や不安定さを避けられます。一般的なサイドルーター構成と比べて透過プロキシを安定して運用しやすく、性能や効率を重視する場合の選択肢になります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FpPRU5x.webp","\u002Ffiddling\u002Fdebian-as-bypass-router",{"text":444,"minutes":445,"time":446,"words":447},"18 min read",17.525,1051500,3505,[449,450,415,451,290],"Debian","サイドルーター","AdGuard Home","Debianをサイドルーターにする",{"categories":454,"date":265,"description":266,"image":269,"path":273,"readingTime":455,"recommend":274,"tags":456,"title":5,"type":293},[264],{"text":276,"minutes":277,"time":278,"words":279},[288,289,290,291,292],{"categories":458,"date":459,"description":460,"image":461,"path":462,"readingTime":463,"recommend":274,"tags":468,"title":472,"type":293},[264],"2024-08-15 23:50:00","サイドルーターを導入すると、メインルーターのポート転送が効かなくなることがあります。ゲートウェイをサイドルーターに変えることで通信経路が変わり、メインルーターを前提とした転送が正常に動かなくなるためです。ゲートウェイはアドレスを変換して内部ネットワークの通信を外部へ転送し、各端末は外部との通信にこれを必要とします。この仕組みを理解すると、ポート転送の問題を解決しやすくなります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FmRqws9.webp","\u002Ffiddling\u002Ffix-port-forward-in-bypass-router",{"text":464,"minutes":465,"time":466,"words":467},"6 min read",5.155,309300,1031,[450,469,470,471],"ポート転送","NAT","ネットワークのトラブルシューティング","サイドルーター環境でポート転送が効かない問題を解決する",{"categories":474,"date":475,"description":476,"image":477,"path":478,"readingTime":479,"recommend":274,"tags":484,"title":488,"type":293},[264],"2023-02-02 23:24:55","春節の帰省列車で、Goをベアメタルで動かす記事を読み、低レベルのシステムインターフェースに興味が湧きました。実際に動く実装を見て、高級言語でOSを作る可能性に胸が躍ります。関連研究を調べると先行例も見つかり、積もった熱意は期待に満ちたプロジェクトへと変わりました。しかし、最後は思いどおりにはいきませんでした。","https:\u002F\u002Fblog-img.774352199.xyz\u002FxB1Ni5.webp","\u002Ffiddling\u002Fgo-os",{"text":480,"minutes":481,"time":482,"words":483},"12 min read",11.81,708600,2362,[485,400,347,486,487],"Go","ベアメタルプログラミング","ランタイム","失敗に終わったプロジェクト：楽しくなかった春節の7日間",{"categories":490,"date":491,"description":492,"image":493,"path":494,"readingTime":495,"recommend":274,"tags":500,"title":504,"type":293},[264],"2022-08-15 01:05:01","システムのリファクタリングで、階層ごとのエンティティ変換に苦労しました。ビュー層の商品VO、ドメイン層のentity、永続化層のPOは似ていても、型のわずかな違いで直接変換できず、ディープコピーが面倒になります。そこでリフレクションを使った汎用的な変換処理を実装し、大量のassemblerメソッドを減らして、保守性と柔軟性を高めることにしました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBlhm0I.webp","\u002Ffiddling\u002Fgolang-deepcopy-between-different-type",{"text":496,"minutes":497,"time":498,"words":499},"5 min read",4.14,248400,828,[485,501,502,503],"リフレクション","ディープコピー","構造体変換","Goで異なる型の構造体をディープコピーする",{"categories":506,"date":507,"description":508,"image":509,"path":510,"readingTime":511,"recommend":274,"tags":515,"title":521,"type":293},[264],"2025-03-31 23:51:00","Appleヘルスケアの心拍数を定期的にサーバーへ同期し、Grafanaで可視化して直感的に確認できるようにしました。Health Auto ExportのREST API機能でHTTPエンドポイントへデータを送り、InfluxDBに保存します。Grafanaのダッシュボードから、自分の心拍数の変化を追ったり分析したりできます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FF4qD2T.webp","\u002Ffiddling\u002Fheart-rate-to-grafana",{"text":373,"minutes":512,"time":513,"words":514},3.76,225600,752,[516,517,518,519,520],"Apple Watch","Health Auto Export","InfluxDB","Grafana","心拍数モニタリング","My Heart Beats for U：心拍数をGrafanaで可視化する",{"categories":523,"date":524,"description":525,"image":526,"path":527,"readingTime":528,"recommend":532,"tags":533,"title":539,"type":293},[264],"2025-06-10 20:18:00","macOSとiPadOS 26では、新しいデザイン言語Liquid Glassが導入され、アイコンやウインドウの印象が一新されました。とくにiPadのアプリをウインドウで扱えるようになったことは、生産性向上のための端末へ進む大きな一歩です。一方、透明なコントロールセンターやLaunchpadの統合には賛否があり、使い勝手には改善の余地もあります。課題はありつつも、今後につながる更新だと感じました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FTPSaLE.webp","\u002Ffiddling\u002Fmacos-26-trial",{"text":304,"minutes":529,"time":530,"words":531},6.94,416400,1388,5,[534,535,536,537,538],"macOS 26","iPadOS 26","Liquid Glass","Apple Intelligence","OS使用感","macOS 26とiPadOS 26を試してみた",{"categories":541,"date":542,"description":543,"image":544,"path":545,"readingTime":546,"recommend":274,"tags":550,"title":554,"type":293},[264],"2026-06-11 10:00:00","今年もWWDCでmacOS 27の新しいApple Intelligenceが登場しました。macOS 26時代の回避方法はもう使えず、引き続きAppleとの知恵比べです。","https:\u002F\u002Fblog-img.774352199.xyz\u002FfOFucm.webp","\u002Ffiddling\u002Fmacos-27-apple-intelligence-chatgpt",{"text":426,"minutes":547,"time":548,"words":549},9.74,584400,1948,[551,537,552,553],"macOS 27","ChatGPT","中国本土向けMac","中国本土向けMacでApple Intelligenceを使う：地域変更からChatGPTの取り出しまで",{"categories":556,"date":557,"description":558,"image":559,"path":560,"readingTime":561,"recommend":274,"tags":565,"title":571,"type":293},[264],"2025-07-20 23:32:00","MoonTVはNext.jsとReactで作った動画集約プラットフォームで、連続ドラマなどを手軽に楽しむためのものです。LibreTVを改善しようとしたことが始まりで、数か月の開発を経て多くの関心と利用を集めています。Cursorのおかげで効率よく開発できた一方、複数環境への対応や複雑なデータ依存関係には苦労しました。ユーザーが増える中、フィードバックを受けて改善を続けています。","https:\u002F\u002Fblog-img.774352199.xyz\u002FnIeONi.webp","\u002Ffiddling\u002Fmoontv-vibe-coding",{"text":409,"minutes":562,"time":563,"words":564},10.98,658800,2196,[566,567,568,569,570],"MoonTV","LunaTV","Vibe Coding","Cursor","AI支援開発","MoonTV：Vibe Codingを試してみた",{"categories":573,"date":574,"description":575,"image":576,"path":577,"readingTime":578,"recommend":274,"tags":582,"title":585,"type":293},[264],"2024-10-07 16:51:00","BGPをもとに中国国内・国外のIPを振り分けることで、透過プロキシの効率と精度を高めます。国外の宛先をFakeIPで識別すれば、メインルーターでより適切に通信を振り分けられます。sing-boxのDNS設定も見直し、DNSクエリを柔軟かつ効率的に処理して、ネットワーク全体の使い勝手を改善します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FMOmM1s.webp","\u002Ffiddling\u002Fmore-accurate-chnroute",{"text":464,"minutes":579,"time":580,"words":581},5.75,345000,1150,[583,584,291,292],"BGP","IPアドレスデータベース","BGPで中国国内・国外IPの振り分けをより正確にする",{"categories":587,"date":588,"description":589,"image":590,"path":591,"readingTime":592,"recommend":274,"tags":597,"title":602,"type":293},[264],"2025-12-14 14:31:00","友人の一言からシミュレーターに興味が湧き、Microsoft Flight Simulatorを購入。地図やモデルはリアルタイム配信、アカウントは再ログインが必要、チュートリアルは見つけにくく、キーボード操作も難しい。結局フライトスティックを買い、Pico VRまで設定してようやく一通り体験できました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FlfhEuE.webp","\u002Ffiddling\u002Fmsfs2024-joystick-and-pico",{"text":593,"minutes":594,"time":595,"words":596},"9 min read",8.96,537600,1792,[598,599,600,601],"Microsoft Flight Simulator 2024","Thrustmaster TCA","PICO VR","フライトシミュレーション","Microsoft Flight Simulator 2024をあれこれ試す",{"categories":604,"date":605,"description":606,"image":607,"path":608,"readingTime":609,"recommend":274,"tags":614,"title":620,"type":293},[264],"2025-06-05 23:26:00","OnePlusからiPhoneへと何度も機種変更するうち、いじる楽しさからエコシステムへの依存へと関心が変わりました。最近、彼女の一言をきっかけに写真を改善しようとOPPO Find X8 Ultraを購入。Apple環境からの移行では、Androidアプリの質のばらつきと代替探しの難しさを改めて感じました。1か月をかけて、異なるプラットフォームの摩擦に折り合いをつけた記録です。","https:\u002F\u002Fblog-img.774352199.xyz\u002F19NIhZ.webp","\u002Ffiddling\u002Fone-month-using-android",{"text":610,"minutes":611,"time":612,"words":613},"15 min read",14.05,843000,2810,[615,616,617,618,619],"Android","OPPO","iOS","スマートフォン使用感","エコシステム移行","Androidに乗り換えて1か月",{"categories":622,"date":623,"description":624,"image":625,"path":626,"readingTime":627,"recommend":274,"tags":631,"title":637,"type":293},[264],"2026-05-11 22:43:00","GitHub Trendingで旅行計画ツールを見つけ、自分でも動かしたくなりました。どうせ新しいVPSを借りるなら、ついでにもう少し、いや、だいぶ色々入れてしまおうと。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBBdDWW.webp","\u002Ffiddling\u002Fone-trek-twenty-stacks",{"text":409,"minutes":628,"time":629,"words":630},10.34,620400,2068,[632,633,634,635,636],"TREK","Docker Compose","Dockge","VPS","セルフホスティング","TREKひとつのつもりが、20個のスタックに",{"categories":639,"date":640,"description":641,"image":642,"path":643,"readingTime":644,"recommend":274,"tags":648,"title":652,"type":293},[264],"2025-01-16 23:09:00","OPNsenseは、美しい画面と充実した機能を備えるオープンソースのファイアウォール・ルーターです。いくつかの構成を試した末に、透過プロキシやトラフィック振り分けでの可能性に気づきました。BGPベースの振り分けと組み合わせることで安全性と安定性を高められ、IPリストの自動更新で管理もしやすくなります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FxA8C1E.webp","\u002Ffiddling\u002Fopnsense-transparent-proxy",{"text":480,"minutes":645,"time":646,"words":647},11.38,682800,2276,[649,650,415,651,290,292],"OPNsense","FreeBSD","tun2socks","OPNsenseで透過プロキシとトラフィック振り分けを実現する",{"categories":654,"date":655,"description":656,"image":657,"path":658,"readingTime":659,"recommend":256,"tags":663,"title":669,"type":293},[264],"2025-03-15 20:35:00","構文解析では、ユーザー定義型名と通常の変数名を見分けることが課題になります。たとえば`a*b;`は算術式とも宣言とも解釈できます。とくに型指定子に関する文法規則によって変数名が型名と解釈され、正確さや読みやすさに影響します。初期化を伴わない変数宣言は多いため、この曖昧さはソースコードの随所に現れます。","https:\u002F\u002Fblog-img.774352199.xyz\u002F2VKHK9.webp","\u002Ffiddling\u002Fparser-type-variable-ambiguity",{"text":276,"minutes":660,"time":661,"words":662},13.58,814800,2716,[664,665,666,667,668],"構文解析","GLR","シンボルテーブル","スコープ","曖昧性解消","構文解析で型名と変数名の曖昧さを解消する",{"categories":671,"date":672,"description":673,"image":674,"path":675,"readingTime":676,"recommend":274,"tags":680,"title":685,"type":293},[264],"2023-05-24 17:51:09","RISC-Vツールチェーンをインストールするには、まずriscv-gnu-toolchainのソースを取得します。clone時に`--depth=1`を付けるとダウンロード量を減らせます。READMEのPrerequisitesを確認し、必要な依存関係をそろえてから進めます。Debianではコマンドで依存パッケージをまとめて導入できます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FrWNOKx.webp","\u002Ffiddling\u002Fspike-install",{"text":373,"minutes":677,"time":678,"words":679},3.89,233400,778,[400,681,682,683,684],"Spike","riscv-pk","クロスコンパイル","ツールチェーン","RISC-Vツールチェーンとエミュレーターのインストール",{"categories":687,"date":688,"description":689,"image":690,"path":691,"readingTime":692,"recommend":696,"tags":697,"title":704,"type":293},[264],"2026-09-09 23:59:00","これも一種のNTRですよね","https:\u002F\u002Fblog-img.774352199.xyz\u002FNDPUwc.webp","\u002Ffiddling\u002Fsteamdeck-switch-60fps",{"text":276,"minutes":693,"time":694,"words":695},13.905,834300,2781,7,[698,699,700,701,702,703],"Steam Deck","Nintendo Switch","EmuDeck","Eden","Lossless Scaling","フレーム生成","Steam Deckの第二の人生：Switchエミュレーター導入からフレーム補間で60FPSまで",{"categories":706,"date":707,"description":708,"image":709,"path":710,"readingTime":711,"recommend":274,"tags":716,"title":721,"type":293},[264],"2024-06-23 15:31:32","GFWは単に出口のゲートウェイを監視するのではなく、通信経路の脇から国際通信を傍受します。出入国するIPパケットをクラスタへ複製し、詳しく分析・フィルタリングする仕組みです。どこで何をしているかを理解することは、検閲回避の検討に欠かせません。ネットワーク構成を調べることで、遮断の経路や技術、対処方法が見えてきます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FsOpJuL.webp","\u002Ffiddling\u002Ftech-about-gfw",{"text":712,"minutes":713,"time":714,"words":715},"25 min read",24.975,1498500,4995,[717,718,719,720],"GFW","DNSポイズニング","TCP","インターネット検閲","GFWの仕組みを探る",{"categories":723,"date":724,"description":725,"image":726,"path":727,"readingTime":728,"recommend":274,"tags":732,"title":738,"type":293},[264],"2022-04-16 00:01:28","Javaでは`this`を使うことで、コンパイラの定数最適化が効かなくなる場合があります。このコード例の`ab1`と`ab2`は同じstatic final変数`s`を参照しているように見えますが、比較結果は異なります。静的変数を直接参照して文字列を連結する`ab1`に対し、`this`経由の`ab2`では同じ定数伝播の最適化が行われません。わずかな構文の違いが、コンパイル結果を変える例です。","https:\u002F\u002Fblog-img.774352199.xyz\u002FgKtkYe.webp","\u002Ffiddling\u002Fthis-in-javac-string-concat",{"text":373,"minutes":729,"time":730,"words":731},3.88,232800,776,[733,734,735,736,737],"Java","javac","文字列連結","定数伝播","バイトコード","Javaのthisキーワードでコンパイル時の定数伝播が効かなくなる問題",{"categories":740,"date":741,"description":742,"image":743,"path":744,"readingTime":745,"recommend":274,"tags":750,"title":756,"type":293},[264],"2025-01-29 21:58:00","ひとこと投稿機能があれば、静的ブログの記事公開に伴う手間や心理的な負担を減らし、短い思いつきをいつでも共有できます。Cloudflare Workersでバックエンドを実装し、KVで投稿を保存・管理します。フロントエンドはVitePressにVueコンポーネントを埋め込み、投稿を手軽に表示してブログに動きと交流の場を加えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FhZX6hr.webp","\u002Ffiddling\u002Fvitepress-memos-component",{"text":746,"minutes":747,"time":748,"words":749},"24 min read",23.345,1400700,4669,[751,752,753,754,755],"VitePress","Vue","Cloudflare Workers","Cloudflare KV","マイクロブログ","VitePressにひとこと投稿機能を実装する",{"categories":758,"date":759,"description":760,"image":761,"path":762,"readingTime":763,"recommend":274,"tags":767,"title":770,"type":293},[264],"2025-03-15 16:24:00","ある平凡な午後、Telegramの通知で魅力的なVPSプランを見つけました。中国電信CN2直結、帯域2.5Gという好条件です。IPv6付きで動画配信サービスの地域制限解除にも便利ですが、すべての通信をWARP経由にする必要はありません。以前のスクリプトは手軽な一方、速度と振り分けに不満があり、もっと柔軟な方法を探すことにしました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FMcjrrF.webp","\u002Ffiddling\u002Fvps-warp-ipv6",{"text":496,"minutes":764,"time":765,"words":766},4.09,245400,818,[768,769,635,291,292],"Cloudflare WARP","IPv6","VPSの特定の通信をWARP経由のIPv6で外に出す",{"categories":772,"date":773,"description":774,"image":775,"path":776,"readingTime":777,"recommend":781,"tags":782,"title":788,"type":293},[264],"2026-08-17 23:59:21","いじればいじるほど、もっといじりたくなります。年を取ってもまだまだ元気、まだまだ元気です。","https:\u002F\u002Fblog-img.774352199.xyz\u002FqfxB0h.webp","\u002Ffiddling\u002Fxiaomi17-root-and-hide-root",{"text":593,"minutes":778,"time":779,"words":780},8.83,529800,1766,6,[783,784,785,786,787],"Xiaomi 17","Bootloader","Android Root","ファームウェア書き換え","Rootの隠蔽","Xiaomi 17を普段使いに：ロック解除、ROM書き込み、root化とroot隠し",{"categories":790,"date":792,"description":793,"image":794,"path":795,"readingTime":796,"recommend":274,"tags":801,"title":806,"type":293},[791],"notes","2022-01-20 22:29:00","Lab 1では、masterとworkerという2つの主要な部分からなるMapReduceシステムを実装します。GoのRPCと並行プログラミングを十分に使いこなし、MapReduceの処理の流れも深く理解する必要があります。実装は2つの版を作り、mutexでロックする方式から、よりすっきりしたchannelによる明示的なロックを使わない方式へと改めました。後者のほうが設計もシンプルで分かりやすくなっています。実習を理解する鍵は、関連資料、特にフローチャートとその説明をしっかり読むことです。","https:\u002F\u002Fblog-img.774352199.xyz\u002FibVwPJ.webp","\u002Fnotes\u002F65840\u002Fmapreducelab",{"text":797,"minutes":798,"time":799,"words":800},"13 min read",12.39,743400,2478,[802,803,485,804,805],"MIT 6.5840","MapReduce","RPC","並行プログラミング","6.5840 Lab 1：MapReduce",{"categories":808,"date":809,"description":810,"image":811,"path":812,"readingTime":813,"recommend":274,"tags":817,"title":822,"type":293},[791],"2022-01-16 17:32:00","MapReduceは、大規模なデータセットの処理を簡単にするための効率的な並列計算モデルです。利用者はMapとReduceという2つの主要な関数を定義することで、複雑なタスクを簡単な操作に分解できます。データの分配やタスクの割り当てはフレームワークが自動で管理するため、開発者は低レベルの細部に気を取られず、アルゴリズムそのものに集中できます。分散システムで広く使われていることからも、その柔軟性と実用性が分かります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FApIDdC.webp","\u002Fnotes\u002F65840\u002Fmapreducepaper",{"text":593,"minutes":814,"time":815,"words":816},8.085,485100,1617,[803,818,819,820,821],"分散システム","論文ノート","並列計算","耐障害性","MapReduce論文を読む",{"categories":824,"date":825,"description":826,"image":827,"path":828,"readingTime":829,"recommend":274,"tags":833,"title":837,"type":293},[791],"2022-12-16 02:06:10","Lab 2Aでは、Raftのリーダー選出とハートビートを実装し、さまざまな厳しい条件でも任期の交代や選挙が正常に行われるようにします。実習全体は4段階からなり、この後に実装する分散KVストアの土台になります。明示的なロックを使わない設計によって、Raft構造体を簡潔にします。実習の手引きには必要な背景知識が載っていますが、前の実習と比べると参考資料に頼れる部分はほとんどなく、自力で実装することが重視されます。","https:\u002F\u002Fblog-img.774352199.xyz\u002Fc11Uk4.webp","\u002Fnotes\u002F65840\u002Fraftlab2a",{"text":444,"minutes":830,"time":831,"words":832},17.515,1050900,3503,[802,834,485,835,836],"Raft","リーダー選出","分散合意","6.5840 Lab 2A：リーダー選出",{"categories":839,"date":840,"description":841,"image":842,"path":843,"readingTime":844,"recommend":274,"tags":849,"title":851,"type":293},[791],"2022-12-03 21:40:09","Raftは、ログレプリケーションの効率を高めるために設計された合意アルゴリズムです。複数のマシンからなるクラスタに適しており、一部のマシンが故障してもサービスを継続できます。複製状態機械モデルを使い、ログに命令の順序を記録することで、クラスタ内の各マシンが同じ状態に到達できるようにします。論文『In Search of an Understandable Consensus Algorithm』は、Raftの設計思想とPaxosとの比較を詳しく論じ、その理解しやすさを示すとともに、信頼できる大規模なソフトウェアシステムを構築するための土台を提供しています。この記事は、その中心的な概念と応用を理解するための読書メモです。","https:\u002F\u002Fblog-img.774352199.xyz\u002F7mmvIZ.webp","\u002Fnotes\u002F65840\u002Freftextendedpaper",{"text":845,"minutes":846,"time":847,"words":848},"30 min read",29.245,1754700,5849,[834,836,850,819],"ログ複製","Raft論文を読む",{"categories":853,"date":855,"description":856,"image":857,"path":858,"readingTime":859,"recommend":863,"tags":864,"title":868,"type":293},[854],"projects","2021-11-27 14:43:00","MYDBは、データベースの基本原理を学び、実装してみるための個人プロジェクトです。空き時間を使い、半月あまりかけて作りました。大学のデータベースシステムの授業で基礎には触れたものの、インターン中は授業を口実にサボってばかりでした。面接で正直に答えても大きな問題にはなりませんでしたが、それをきっかけに自分の知識を見直し、実際に手を動かして学ぼうと考えるようになりました。そうして生まれたのがこのプロジェクトです。","https:\u002F\u002Fblog-img.774352199.xyz\u002Fxfci2J.webp","\u002Fprojects\u002Fmydb\u002Fmydb0",{"text":593,"minutes":860,"time":861,"words":862},8.03,481800,1606,1,[865,733,866,867],"MYDB","データベース実装","データベースアーキテクチャ","MYDB 0. プロジェクト構成と、先に伝えておきたいこと",{"categories":870,"date":871,"description":872,"image":873,"path":874,"readingTime":875,"recommend":274,"tags":880,"title":883,"type":293},[854],"2021-11-28 16:10:00","MYDBではXIDファイルでトランザクションを管理します。各トランザクションには1から増える一意のXIDがあり、XID 0は常にコミット済みのスーパートランザクションです。TransactionManagerがこのファイルを管理し、実行中・コミット済み・中止済みという3つの状態を記録します。この仕組みにより状態を正確に照会・管理でき、システムの安定性と信頼性を支えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FH4zZAK.webp","\u002Fprojects\u002Fmydb\u002Fmydb1",{"text":876,"minutes":877,"time":878,"words":879},"8 min read",7.42,445200,1484,[865,733,881,882],"トランザクション管理","XID","MYDB 1. まずはシンプルなTMから",{"categories":885,"date":886,"description":887,"image":888,"path":889,"readingTime":890,"recommend":274,"tags":894,"title":898,"type":293},[854],"2021-12-25 18:26:00","MYDBはMySQLに似たC\u002FS構成を採用し、複数のクライアントがソケットでサーバーへ接続してSQLを実行し、結果を受け取れます。通信には専用のバイナリー形式を使いますが、実装を簡単にするならプレーンテキストも選択肢です。サーバーとクライアントの基本的な転送構造によって、データのやり取りと処理を行います。","https:\u002F\u002Fblog-img.774352199.xyz\u002FPAHrUZ.webp","\u002Fprojects\u002Fmydb\u002Fmydb10",{"text":464,"minutes":891,"time":892,"words":893},5.76,345600,1152,[865,733,895,896,897],"Socket","クライアントサーバー構成","通信プロトコル","MYDB 10. サーバー・クライアントの実装と通信プロトコル",{"categories":900,"date":901,"description":902,"image":903,"path":904,"readingTime":905,"recommend":274,"tags":909,"title":913,"type":293},[854],"2021-11-30 23:18:00","データマネージャー（DM）は上位モジュールとファイルシステムをつなぎ、ページとキャッシュを管理しながら、データの安全性と復旧を支えます。キャッシュには従来のLRUではなく参照カウント方式を採用し、汎用性と効率を高めて、この先のデータ操作の土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FWdIGoG.webp","\u002Fprojects\u002Fmydb\u002Fmydb2",{"text":409,"minutes":906,"time":907,"words":908},10.395,623700,2079,[865,733,910,911,912],"参照カウント","キャッシュ設計","共有メモリ","MYDB 2. 参照カウント方式のキャッシュ基盤と共有バイト配列",{"categories":915,"date":916,"description":917,"image":918,"path":919,"readingTime":920,"recommend":274,"tags":924,"title":927,"type":293},[854],"2021-12-05 15:28:00","DMはファイルシステムをページとして抽象化し、ページ単位で読み書きとキャッシュを行います。データページのデフォルトサイズは8Kで、大量の書き込みではサイズの調整によって性能を高められます。実装済みの汎用キャッシュ基盤を使い、ここではページ構造を具体的に定義して、効率よくページを管理します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FjlFC4E.webp","\u002Fprojects\u002Fmydb\u002Fmydb3",{"text":876,"minutes":921,"time":922,"words":923},7.14,428400,1428,[865,733,925,926],"データページ","キャッシュ管理","MYDB 3. データページのキャッシュと管理",{"categories":929,"date":930,"description":931,"image":932,"path":933,"readingTime":934,"recommend":274,"tags":938,"title":941,"type":293},[854],"2021-12-08 22:55:00","MYDBでは、クラッシュ後にデータを復旧できるよう、ログファイルが重要な役割を担います。DMは下位のデータを操作するたびにログを生成・記録し、連続したログ列を作ります。チェックサムと各操作の記録を含む所定のバイナリー形式で保存することで、再起動時にデータの状態を正確に再構築し、整合性と完全性を保ちます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FTRcbsj.webp","\u002Fprojects\u002Fmydb\u002Fmydb4",{"text":797,"minutes":935,"time":936,"words":937},12.685,761100,2537,[865,733,939,940],"データベースログ","クラッシュリカバリ","MYDB 4. ログファイルと復旧戦略",{"categories":943,"date":944,"description":945,"image":946,"path":947,"readingTime":948,"recommend":274,"tags":952,"title":955,"type":293},[854],"2021-12-11 15:16:00","ページインデックスはDM層の重要な構成要素です。各ページの空き容量をキャッシュすることで挿入処理を効率化し、上位モジュールが長い探索をせずに適切なページを素早く見つけられるようにします。実装ではデータ項目（DataItem）の抽象化とも密接に連携し、データベースの効率的な動作を支えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002F22PSG1.webp","\u002Fprojects\u002Fmydb\u002Fmydb5",{"text":426,"minutes":949,"time":950,"words":951},9.86,591600,1972,[865,733,953,954],"ページインデックス","データ管理","MYDB 5. ページインデックスとDMの実装",{"categories":957,"date":958,"description":959,"image":960,"path":961,"readingTime":962,"recommend":274,"tags":966,"title":970,"type":293},[854],"2021-12-18 14:58:00","VMは二相ロックでスケジュールの直列化可能性を保証し、多版型同時実行制御（MVCC）を導入して読み取りと書き込みの相互ブロックを解消します。また、データベース操作の競合を定義し、特に更新と読み取りの関係を整理することで、トランザクションの分離レベルを理解する土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002F8YzotA.webp","\u002Fprojects\u002Fmydb\u002Fmydb6",{"text":610,"minutes":963,"time":964,"words":965},14.665,879900,2933,[865,733,967,968,969],"MVCC","トランザクション分離","二相ロック","MYDB 6. レコードのバージョンとトランザクション分離",{"categories":972,"date":973,"description":974,"image":975,"path":976,"readingTime":977,"recommend":274,"tags":981,"title":984,"type":293},[854],"2021-12-23 21:20:00","VMでは、MVCCに伴うバージョンの飛び越しとデッドロックに対処する必要があります。MYDBはトランザクションに印を付けるだけで取り消しやロールバックを行い、abortedなトランザクションのデータがほかへ影響しないようにします。この設計により並行処理の効率と信頼性を高め、従来の2PLで起こりがちなデッドロックを避けて、システム全体の安定性と性能を向上させます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBF3yDW.webp","\u002Fprojects\u002Fmydb\u002Fmydb7",{"text":480,"minutes":978,"time":979,"words":980},11.32,679200,2264,[865,733,982,983],"デッドロック検出","バージョン管理","MYDB 7. デッドロック検出とVMの実装",{"categories":986,"date":987,"description":988,"image":989,"path":990,"readingTime":991,"recommend":274,"tags":995,"title":998,"type":293},[854],"2021-12-24 21:01:00","MYDBはB+木によるクラスタ化インデックスを実装します。IMはバージョンマネージャー（VM）を経由せず、データマネージャー（DM）と直接やり取りし、インデックスデータをデータベースファイルへ直接書き込みます。この章では二分木インデックスの構造を詳しく説明し、葉フラグ、キー数、兄弟ノードの識別子など、インデックス検索の基盤となる要素を扱います。","https:\u002F\u002Fblog-img.774352199.xyz\u002Ff92X4o.webp","\u002Fprojects\u002Fmydb\u002Fmydb8",{"text":304,"minutes":992,"time":993,"words":994},6.53,391800,1306,[865,733,996,997],"B+木","データベースインデックス","MYDB 8. インデックス管理",{"categories":1000,"date":1001,"description":1002,"image":1003,"path":1004,"readingTime":1005,"recommend":274,"tags":1009,"title":1012,"type":293},[854],"2021-12-25 15:44:00","テーブルマネージャー（TBM）は、フィールドとテーブルの構造を管理します。ParserはSQL風の文を構造化して解析し、文に含まれる情報を対応するクラスへまとめることで、その後の操作を簡単にします。この章ではMYDBのSQL構文も紹介し、管理処理全体を理解する土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FzOMyv5.webp","\u002Fprojects\u002Fmydb\u002Fmydb9",{"text":876,"minutes":1006,"time":1007,"words":1008},7.99,479400,1598,[865,733,1010,1011],"SQL解析","テーブル管理","MYDB 9. フィールドとテーブルの管理",1789914057391]