[{"data":1,"prerenderedAt":1313},["ShallowReactive",2],{"content:\u002Fja\u002Ffiddling\u002Fdebian-as-bypass-router":3,"series:content_ja":597},{"id":4,"title":5,"authorship":6,"body":7,"categories":562,"date":564,"description":565,"draft":566,"extension":567,"image":568,"meta":569,"navigation":571,"path":572,"permalink":573,"published":573,"readingTime":574,"recommend":573,"references":573,"seo":579,"seoDescription":580,"seoTitle":581,"sitemap":582,"stem":588,"tags":589,"type":595,"__hash__":596},"content_ja\u002Fposts\u002Ffiddling\u002Fdebian-as-bypass-router.md","Debianをサイドルーターにする","human-only",{"type":8,"value":9,"toc":539},"minimark",[10,14,18,34,37,40,47,50,53,56,59,62,65,71,74,80,83,87,90,95,102,112,115,147,150,158,165,170,176,179,182,185,191,195,198,204,207,210,214,217,223,226,233,239,250,258,265,271,274,280,283,289,296,302,305,308,311,317,321,324,328,330,336,339,344,350,353,359,369,375,378,381,384,392,398,401,405,411,419,422,430,433,447,450,454,457,463,469,475,478,484,487,493,496,502,508,511,517,524,527,530],[11,12,13],"h3",{"id":13},"はじめに",[15,16,17],"p",{},"サイドルーター構成の多くは、独自のパッケージシステムを持つLinuxディストリビューション、OpenWrtを使っています。さらにその大半が、OpenWrt専用のWeb GUIであるLuCIを前提にし、解説でもLuCI向けのluci-app-xxxを使っています。よい方法ではありますが、まだ物足りません。",[19,20,21,25,28,31],"ol",{},[22,23,24],"li",{},"GUIへの依存が強すぎます。LuCIパッケージのWeb画面で設定できる項目はたいてい限られています。",[22,26,27],{},"LuCIが十分に安定していません。OpenWrt自体ではなくLuCIの話です。私の環境ではOpenClashが原因でLuCIが3回落ちました。私の問題かもしれませんが。",[22,29,30],{},"OpenWrtは自分でビルドできますが、多くの解説はビルド済みのファームウェアをそのまま使い、中には古いものもあります。",[22,32,33],{},"システムを完全には掌握できません。LuCIに実権を握られています。",[15,35,36],{},"私も1、2年ほどOpenWrtの透過プロキシをいじり、メインルーター構成もサイドルーター構成も試しましたが、結局は安定性に不満があってやめました。その後しばらくはSurge、Loon、Clash Verge Revなどのクライアントで何とかしのいでいました。1週間ほど前にゼンレスゾーンゼロがリリースされましたが、中国国内版の認可の関係でPS5は国際版のみ。アジアサーバーならかろうじて直接接続できても、速度と遅延は絶望的でした。NetEase UUにお金を払いたくない一心で、透過プロキシをまた思い出しました。ちょうどDebianを入れたまま遊んでいるBeelinkの小型PCがありました。開発用にするつもりが、面倒くさがってほこりをかぶらせていたものです。週末を費やして、ようやくDebianをサイドルーターにした透過プロキシ構成が完成しました。",[15,38,39],{},"完成したネットワーク構成は次のとおりです。",[15,41,42],{},[43,44],"img",{"alt":45,"src":46},"topo","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002Fc4347103c787f3d28b50a679e80aa0fe.png",[15,48,49],{},"LANを192.168.6.0\u002F24と192.168.7.0\u002F24の2つに分けています。6.0\u002F24は検閲回避が不要な端末用の標準サブネットです。必要な端末は7.0\u002F24に置き、通信をすべてサイドルーターの小型PC経由で転送します。",[15,51,52],{},"中心となるのはAdGuard Home + Clashです。AdGuard Homeが広告フィルタリングなどを担当し、ClashがDNSの振り分けと通信のプロキシを担当します。",[11,54,55],{"id":55},"メインルーターの設定",[15,57,58],{},"現在のLANは192.168.6.0\u002F24なので、新たに192.168.7.0\u002F24を追加します。",[15,60,61],{},"メインルーターはiKuaiなので、以下はiKuaiでサブネットを追加する方法です。OpenWrtなどの場合は検索してください。",[15,63,64],{},"iKuaiのネットワーク設定 → 内外ネットワーク設定 → lan1を開き、詳細設定で拡張IPを追加します。IPは192.168.7.1、サブネットマスクは255.255.255.0です。",[15,66,67],{},[43,68],{"alt":69,"src":70},"iKuaiの設定","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002F9fc87b145274f1fb0cba1ed0d2329ac0.png",[15,72,73],{},"DHCP設定で192.168.7.0\u002F24用の設定を追加します。",[15,75,76],{},[43,77],{"alt":78,"src":79},"DHCPの設定","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002F2de91498b256d08c92a3c8844ca14dbe.png",[15,81,82],{},"ゲートウェイは、あとで設定するサイドルーターのアドレス192.168.7.2にします。このサブネットのDNSはすべてサイドルーターで処理するので、優先DNSと代替DNSも両方192.168.7.2にします。",[11,84,86],{"id":85},"debianの設定","Debianの設定",[15,88,89],{},"特に断りがなければ、以下の操作はサイドルーター上で行います。",[91,92,94],"h4",{"id":93},"ipアドレスの設定","IPアドレスの設定",[15,96,97,101],{},[98,99,100],"code",{"code":100},"sudo nano \u002Fetc\u002Fnetwork\u002Finterfaces","でDebianのネットワーク設定を開き、次の内容に編集して保存・終了します。",[103,104,109],"pre",{"className":105,"code":107,"language":108},[106],"language-text","# This file describes the network interfaces available on your system\n# and how to activate them. For more information, see interfaces(5).\n\nsource \u002Fetc\u002Fnetwork\u002Finterfaces.d\u002F*\n\n# The loopback network interface\nauto lo\niface lo inet loopback\n\n# The primary network interface\nallow-hotplug enp1s0\niface enp1s0 inet static\naddress 192.168.7.2\nnetmask 255.255.255.0\ngateway 192.168.7.1\ndns-nameservers 127.0.0.1\n","text",[98,110,107],{"__ignoreMap":111},"",[15,113,114],{},"この設定では、次の点に注意してください。",[116,117,118,128],"ul",{},[22,119,120,123,124,127],{},[98,121,122],{"code":122},"enp1s0","は私のネットワークインターフェース名です。",[98,125,126],{"code":126},"ip a","で確認して、自分のものに置き換えてください。",[22,129,130,131,134,135,138,139,142,143,146],{},"IPv4は",[98,132,133],{"code":133},"inet static","で固定し、アドレスを",[98,136,137],{"code":137},"192.168.7.2\u002F24","、ゲートウェイをメインルーターの",[98,140,141],{"code":141},"192.168.7.1","にします。設定中にインターネットへ接続できなくならないよう、DNSは最初は利用可能なサーバーを指定し、ローカルのAdGuard Homeが設定できてから",[98,144,145],{"code":145},"127.0.0.1","へ変更します。",[15,148,149],{},"保存したら、次のコマンドでネットワークを再起動できます。",[103,151,156],{"className":152,"code":154,"language":155,"meta":111},[153],"language-shell","sudo systemctl restart networking.service\n","shell",[98,157,154],{"__ignoreMap":111},[15,159,160,161,164],{},"IPアドレスが変わるので、SSH接続が切れることがあります。新しいIPの",[98,162,163],{"code":163},"192.168.7.2","にSSHで接続し直してください。",[15,166,167,169],{},[98,168,126],{"code":126},"で設定結果を確認します。",[103,171,174],{"className":172,"code":173,"language":155,"meta":111},[153],"ip a\n1: lo: \u003CLOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link\u002Floopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1\u002F8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1\u002F128 scope host noprefixroute\n       valid_lft forever preferred_lft forever\n2: enp1s0: \u003CBROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n    link\u002Fether 70:70:fc:00:e3:36 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.7.2\u002F24 brd 192.168.7.255 scope global enp1s0\n       valid_lft forever preferred_lft forever\n    inet6 ■■■:■■■■:■■■■:■■■:■■■■:■■■■\u002F64 scope global dynamic mngtmpaddr\n       valid_lft 1741sec preferred_lft 1741sec\n    inet6 fe80::7270:fcff:fe00:e336\u002F64 scope link\n       valid_lft forever preferred_lft forever\n",[98,175,173],{"__ignoreMap":111},[15,177,178],{},"LAN内のIPアドレスが192.168.7.2\u002F24になりました。",[91,180,181],{"id":181},"転送の設定",[15,183,184],{},"ルーターやゲートウェイとして動作するには、通信の転送機能が必要です。",[103,186,189],{"className":187,"code":188,"language":155,"meta":111},[153],"sudo echo \"net.ipv4.ip_forward = 1\" >> \u002Fetc\u002Fsysctl.conf\nsudo sysctl -p\n",[98,190,188],{"__ignoreMap":111},[11,192,194],{"id":193},"adguard-homeの設定","AdGuard Homeの設定",[15,196,197],{},"DNSの構成を説明します。",[15,199,200],{},[43,201],{"alt":202,"src":203},"DNSの経路","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002Fbb62d86943fdce26364eea909c4621a9.png",[15,205,206],{},"クライアントが名前解決すると、53番ポートのAdGuard Homeが上流のClashへクエリを転送します。Clashは設定に従って振り分け、中国本土向けは中国国内のパブリックDNS、それ以外はプロキシ経由で中国国外のパブリックDNSに問い合わせます。",[15,208,209],{},"Clashに異常があると、AdGuard Homeは中国国内のパブリックDNSへ直接問い合わせます。ただ、名前解決できても通信はClashを通る必要があるので、実際にはあまり意味がありません。",[91,211,213],{"id":212},"adguard-homeのインストール","AdGuard Homeのインストール",[15,215,216],{},"以下はrootで実行します。",[103,218,221],{"className":219,"code":220,"language":155,"meta":111},[153],"## 检查最新稳定版的版本号，如果获取不到请检查网络\nremote_ver=$(curl -sS https:\u002F\u002Fapi.github.com\u002Frepos\u002FAdguardTeam\u002FAdGuardHome\u002Freleases\u002Flatest | jq -r .tag_name | sed 's|v||' | grep -v \"null\"); echo $remote_ver\n\n## 下载最新稳定版（前一句有输出这一句才能正常执行）\ncd \u002Ftmp\nwget -q --progress=bar:dot --show-progress -O \"AdGuardHome_linux_amd64.tar.gz\" \"https:\u002F\u002Fgithub.com\u002FAdguardTeam\u002FAdGuardHome\u002Freleases\u002Fdownload\u002Fv${remote_ver}\u002FAdGuardHome_linux_amd64.tar.gz\"\n\n## 解压\ntar --no-same-owner -xf \"AdGuardHome_linux_amd64.tar.gz\" --strip-components 2 --directory=.\n\n## 安装\ninstall -ps AdGuardHome \u002Fusr\u002Flocal\u002Fbin\u002Fadguardhome\n",[98,222,220],{"__ignoreMap":111},[91,224,225],{"id":225},"サービスの作成",[15,227,228,229,232],{},"作業ディレクトリ",[98,230,231],{"code":231},"\u002Fvar\u002Flib\u002Fadguardhome","を作成します。",[103,234,237],{"className":235,"code":236,"language":155,"meta":111},[153],"mkdir -p \u002Fvar\u002Flib\u002Fadguardhome\n",[98,238,236],{"__ignoreMap":111},[15,240,241,242,245,246,249],{},"次の内容で",[98,243,244],{"code":244},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fadguardhome.service","を作成します。設定ファイルは",[98,247,248],{"code":248},"\u002Fvar\u002Flib\u002Fadguardhome\u002FAdGuardHome.yaml","になります。",[103,251,256],{"className":252,"code":254,"language":255,"meta":111},[253],"language-ini","[Unit]\nDescription = Network-wide ads & trackers blocking DNS server.\nWants       = network-online.target mosdns.service\nAfter       = network-online.target mosdns.service\n\n[Service]\nType               = simple\nRestart            = always\nStartLimitInterval = 5\nStartLimitBurst    = 10\nExecStart          = \u002Fusr\u002Flocal\u002Fbin\u002Fadguardhome -w \u002Fvar\u002Flib\u002Fadguardhome\nRestartSec         = 10\n\n[Install]\nWantedBy = multi-user.target\n","ini",[98,257,254],{"__ignoreMap":111},[15,259,260,261,264],{},"保存後、",[98,262,263],{"code":263},"systemctl enable --now adguardhome.service","で自動起動を有効にし、その場で起動します。ログはDebian標準のツールで確認できます。",[103,266,269],{"className":267,"code":268,"language":155,"meta":111},[153],"journalctl -efu adguardhome.service\n",[98,270,268],{"__ignoreMap":111},[15,272,273],{},"再起動する場合はこちらです。",[103,275,278],{"className":276,"code":277,"language":155,"meta":111},[153],"systemctl restart adguardhome.service\n",[98,279,277],{"__ignoreMap":111},[91,281,282],{"id":282},"初期設定",[15,284,285,288],{},[98,286,287],{"code":287},"http:\u002F\u002F192.168.7.2:3000","で初期設定を開きます。Web管理画面のポートは3000のままでよく、DNSサーバーのポートは53にします。",[15,290,291,292,295],{},"設定 → DNS設定で、上流DNSをまだ設定していないClashの",[98,293,294],{"code":294},"127.0.0.1:1053","にします。フォールバックDNSには中国国内のDNSをいくつか指定できます。たとえば次のとおりです。",[103,297,300],{"className":298,"code":299,"language":108},[106],"223.5.5.5\n119.29.29.29\n",[98,301,299],{"__ignoreMap":111},[15,303,304],{},"適用を忘れずにクリックしてください。",[15,306,307],{},"続いてDNSサービス設定 → レート制限を0にします。",[15,309,310],{},"広告をブロックするなら、フィルター → DNSブロックリストから追加します。中国本土で使いやすいルールセットを2つ紹介します。",[103,312,315],{"className":313,"code":314,"language":108},[106],"easylist:  https:\u002F\u002Fanti-ad.net\u002Feasylist.txt\nhalf-life: https:\u002F\u002Fadguard.yojigen.tech\u002FHalfLifeList.txt\n",[98,316,314],{"__ignoreMap":111},[11,318,320],{"id":319},"clashの設定","Clashの設定",[15,322,323],{},"Clashは中国国内・国外のDNS解決の振り分けと、本業の検閲回避を担当します。元のClashはリポジトリが削除され、開発者も姿を消したため、その後をMihomoが継ぎました。（miHoYoめ、何もかもお前のせいだ。）",[91,325,327],{"id":326},"clashのインストール","Clashのインストール",[15,329,216],{},[103,331,334],{"className":332,"code":333,"language":155,"meta":111},[153],"## 检查最新稳定版的版本号，如果获取不到请检查网络\nremote_ver=$(curl -sS https:\u002F\u002Fapi.github.com\u002Frepos\u002FMetaCubeX\u002Fmihomo\u002Freleases\u002Flatest | jq -r .tag_name | sed 's|v||' | grep -v \"null\"); echo $remote_ver\n\n## 下载最新稳定版（前一句有输出这一句才能正常执行）\ncd \u002Ftmp\nwget -q --progress=bar:dot --show-progress -O \"mihomo-linux-amd64-v${remote_ver}.gz\" \"https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmihomo\u002Freleases\u002Fdownload\u002Fv${remote_ver}\u002Fmihomo-linux-amd64-v${remote_ver}.gz\"\n\n## 解压\ngzip -d \"mihomo-linux-amd64-v${remote_ver}.gz\"\n\n## 安装\ninstall -ps mihomo-linux-amd64-v${remote_ver} \u002Fusr\u002Flocal\u002Fbin\u002Fclash\n",[98,335,333],{"__ignoreMap":111},[91,337,225],{"id":338},"サービスの作成-1",[15,340,228,341,232],{},[98,342,343],{"code":343},"\u002Fvar\u002Flib\u002Fclash",[103,345,348],{"className":346,"code":347,"language":155,"meta":111},[153],"mkdir -p \u002Fvar\u002Flib\u002Fclash\n",[98,349,347],{"__ignoreMap":111},[15,351,352],{},"clashユーザーを作成します。",[103,354,357],{"className":355,"code":356,"language":155,"meta":111},[153],"useradd -M -s \u002Fusr\u002Fsbin\u002Fnologin clash\n",[98,358,356],{"__ignoreMap":111},[15,360,241,361,364,365,368],{},[98,362,363],{"code":363},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fclash.service","を作成します。Clashの設定ファイルは",[98,366,367],{"code":367},"\u002Fvar\u002Flib\u002Fclash\u002Fconfig.yaml","です。",[103,370,373],{"className":371,"code":372,"language":255,"meta":111},[253],"[Unit]\nDescription = Clash-Meta tproxy daemon.\nWants       = network-online.target\nAfter       = network-online.target\n\n[Service]\nEnvironment   = PATH=\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fb>\nType          = simple\nUser          = clash\nGroup         = clash\n\nCapabilityBoundingSet = CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW\nAmbientCapabilities   = CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW\n\nRestart       = always\nExecStartPre  = +\u002Fusr\u002Fbin\u002Fbash \u002Fvar\u002Flib\u002Fclash\u002Fclean.sh\nExecStart     = clash -d \u002Fvar\u002Flib\u002Fclash\nExecStartPost = +\u002Fusr\u002Fbin\u002Fbash \u002Fvar\u002Flib\u002Fclash\u002Fiptables.sh\n\nExecStopPost  = +\u002Fusr\u002Fbin\u002Fbash \u002Fvar\u002Flib\u002Fclash\u002Fclean.sh\n",[98,374,372],{"__ignoreMap":111},[15,376,377],{},"このファイルのとおり、Clashバイナリはclash:clashとして実行します。Clash自身が生成する通信と、Clashが転送する通信を区別しやすくするためです。",[15,379,380],{},"ExecStartPostとExecStopPostではiptables.shとclean.shを実行し、ルーティングルールの設定と消去を行っています。",[15,382,383],{},"iptables.shとclean.shの内容は次のとおりです。",[103,385,390],{"className":386,"code":388,"language":389,"meta":111},[387],"language-sh","#!\u002Fusr\u002Fbin\u002Fenv bash\n\nset -ex\n\n# ENABLE ipv4 forward\nsysctl -w net.ipv4.ip_forward=1\n\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# 目标地址为局域网或保留地址的流量跳过处理\n# 保留地址参考：https:\u002F\u002Fzh.wikipedia.org\u002Fwiki\u002F%E5%B7%B2%E5%88%86%E9%85%8D%E7%9A%84\u002F8_IPv4%E5%9C%B0%E5%9D%80%E5%9D%97%E5%88%97%E8%A1%A8\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\n\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# 其他所有流量转向到 7893 端口，并打上 mark\niptables -t mangle -A clash -p tcp -j TPROXY --on-port 7893 --tproxy-mark 666\niptables -t mangle -A clash -p udp -j TPROXY --on-port 7893 --tproxy-mark 666\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\n\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 程序本身发出的流量，防止死循环 (clash 程序需要使用 \"clash\" 用户启动)\niptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner clash -j RETURN\niptables -t mangle -A OUTPUT -p udp -m owner --uid-owner clash -j RETURN\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","sh",[98,391,388],{"__ignoreMap":111},[103,393,396],{"className":394,"code":395,"language":389,"meta":111},[387],"#!\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",[98,397,395],{"__ignoreMap":111},[15,399,400],{},"各行に詳しいコメントを書いてあります。さらに知りたければChatGPTに聞いてください。",[91,402,404],{"id":403},"clashの設定ファイル","Clashの設定ファイル",[15,406,407,408,410],{},"Clashの設定ファイルは各プロキシサービスから入手でき、形式はYAMLのはずです。",[98,409,367],{"code":367},"へ保存し、次の部分を変更します。",[103,412,417],{"className":413,"code":415,"language":416,"meta":111},[414],"language-yaml","tproxy-port: 7893   # iptables.sh 将所有流量转发到了 7893 端口\nmixed-port: 7890\nallow-lan: true\nfind-process-mode: off\nbind-address: \"*\"\nmode: rule\nlog-level: debug\nipv6: false # 不进行 IPv6 流量代理\n\nexternal-controller: 0.0.0.0:9090\nsecret: # 登陆 ui 的密码\nexternal-ui: ui # webui 的基础路径\nexternal-ui-name: xd # webui 的下级路径\nexternal-ui-url: https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmetacubexd\u002Farchive\u002Frefs\u002Fheads\u002Fgh-pages.zip\nunified-delay: true\ntcp-concurrent: true\nexperimental:\n  sniff-tls-sni: true\ngeodata-mode: true\ngeodata-loader: standard\ngeox-url:\n  geoip: https:\u002F\u002Ftestingcf.jsdelivr.net\u002Fgh\u002FMetaCubeX\u002Fmeta-rules-dat@release\u002Fgeoip.dat\n  geosite: https:\u002F\u002Ftestingcf.jsdelivr.net\u002Fgh\u002FMetaCubeX\u002Fmeta-rules-dat@release\u002Fgeosite.dat\n  mmdb: https:\u002F\u002Ftestingcf.jsdelivr.net\u002Fgh\u002FMetaCubeX\u002Fmeta-rules-dat@release\u002Fcountry.mmdb\nprofile:\n  tracing: true\n  store-selected: true\n  store-fake-ip: true\nsniffer:\n  enable: true\n  parse-pure-ip: true\n  override-destination: true\n\ndns:\n  enable: true\n  ipv6: false\n  listen: 0.0.0.0:1053 # DNS 监听端口\n  use-hosts: true\n  enhanced-mode: fake-ip\n  default-nameserver: # 建议修改为国内 DNS 服务器\n    - 223.5.5.5\n    - 119.29.29.29\n  nameserver:\n    - https:\u002F\u002Fdoh.pub\u002Fdns-query\n    - tls:\u002F\u002Fdot.pub\n    - tls:\u002F\u002Fdns.alidns.com\n    - https:\u002F\u002Fdns.alidns.com\u002Fdns-query\n  fallback:\n    - https:\u002F\u002Fdns.cloudflare.com\u002Fdns-query\n    - tls:\u002F\u002Fdns.google:853\n    - https:\u002F\u002F1.1.1.1\u002Fdns-query\n    - tls:\u002F\u002F1.1.1.1:853\n    - tls:\u002F\u002F8.8.8.8:853\n  fake-ip-filter:\n    - '+.lan'\n    - '+.cluster.local'\n    - 'time.*.com'\n    - 'time.*.gov'\n    - 'time.*.edu.cn'\n    - 'time.*.apple.com'\n    - 'ntp.*.com'\n    - 'localhost.ptlogin2.qq.com'\n    - '+.ntp.org.cn'\n    - '+.pool.ntp.org'\n    - '+.localhost'\n  fallback-filter:\n    geoip: true\n    geoip-code: CN\n    geosite:\n      - gfw\n    ipcidr:\n      - 224.0.0.0\u002F4\n      - 240.0.0.0\u002F4\n      - 169.254.0.0\u002F16\n      - 0.0.0.0\u002F8\n      - 127.0.0.1\u002F32\n    domain:\n      - '+.google.com'\n      - '+.facebook.com'\n      - '+.youtube.com'\n\nproxies:  # 以下为你的代理节点、分组及代理规则\nproxy-groups:\nrules:\n","yaml",[98,418,415],{"__ignoreMap":111},[15,420,421],{},"DNS部分を少し詳しく説明します。DNSサーバーは2つのグループに分かれています。",[116,423,424,427],{},[22,425,426],{},"nameserverは中国国内のパブリックDNSです。",[22,428,429],{},"fallbackは中国国外のパブリックDNSです。",[15,431,432],{},"fallback-filterは、どの条件でfallback側の名前解決結果を使うかを決めます。",[116,434,435,438,441,444],{},[22,436,437],{},"geoip-codeは否定条件です。nameserverの結果がgeoip-codeに一致しない場合、fallbackの結果を使います。",[22,439,440],{},"geositeは肯定条件で、一致するドメインはfallbackを使います。",[22,442,443],{},"ipcidrは肯定条件です。nameserverがこれらの汚染されたIPを返す場合、fallbackを使います。",[22,445,446],{},"domainは肯定条件で、一致するドメインは直接fallbackを使います。",[15,448,449],{},"これでDNS解決の振り分けができました。",[91,451,453],{"id":452},"clashの関連ファイル","Clashの関連ファイル",[15,455,456],{},"Clashには関連ファイルも必要なので、起動前にダウンロードします。",[103,458,461],{"className":459,"code":460,"language":155,"meta":111},[153],"cd \u002Fvar\u002Flib\u002Fclash\nwget -q --progress=bar:dot --show-progress -O country.mmdb https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmeta-rules-dat\u002Freleases\u002Fdownload\u002Flatest\u002Fcountry.mmdb\nwget -q --progress=bar:dot --show-progress -O geosite.dat  https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmeta-rules-dat\u002Freleases\u002Fdownload\u002Flatest\u002Fgeosite.dat\nwget -q --progress=bar:dot --show-progress -O GeoIP.dat    https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmeta-rules-dat\u002Freleases\u002Fdownload\u002Flatest\u002Fgeoip.dat\n\nmkdir -p ui\ncd ui\nwget -q --progress=bar:dot --show-progress -O xd.zip https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmetacubexd\u002Farchive\u002Frefs\u002Fheads\u002Fgh-pages.zip\nunzip -oqq xd.zip\nmv metacubexd-gh-pages xd\n",[98,462,460],{"__ignoreMap":111},[15,464,465,466,468],{},"最終的な",[98,467,343],{"code":343},"は次のようになります。",[103,470,473],{"className":471,"code":472,"language":155,"meta":111},[153],"\u002Fvar\u002Flib\u002Fclash\n├── clean.sh\n├── config.yaml\n├── country.mmdb\n├── GeoIP.dat\n├── geosite.dat\n├── iptables.sh\n└── ui\n",[98,474,472],{"__ignoreMap":111},[15,476,477],{},"Clashはclashユーザーで起動するので、所有者を変更します。",[103,479,482],{"className":480,"code":481,"language":155,"meta":111},[153],"chown -R clash:clash \u002Fvar\u002Flib\u002Fclash\n",[98,483,481],{"__ignoreMap":111},[15,485,486],{},"iptables.shとclean.shに実行権限も付けます。",[103,488,491],{"className":489,"code":490,"language":155,"meta":111},[153],"chmod +x iptables.sh\nchmod +x clean.sh\n",[98,492,490],{"__ignoreMap":111},[91,494,495],{"id":495},"サービスの起動",[15,497,498,499,501],{},"設定がすべて終わったら、",[98,500,363],{"code":363},"を自動起動にし、その場で起動します。",[103,503,506],{"className":504,"code":505,"language":155,"meta":111},[153],"systemctl enable --now clash.service\n",[98,507,505],{"__ignoreMap":111},[15,509,510],{},"ログを見るにはDebian標準のツールを使います。",[103,512,515],{"className":513,"code":514,"language":155,"meta":111},[153],"journalctl -efu clash.service\n",[98,516,514],{"__ignoreMap":111},[15,518,519,520,523],{},"Web UIはこちらです：",[98,521,522],{"code":522},"http:\u002F\u002F192.168.7.2:9090\u002Fui\u002Fxd","。",[15,525,526],{},"Web UIの設定は皆さんおなじみだと思います。問題なく動いたら、先述のとおりこのマシンのDNSを127.0.0.1に変更し、LAN内の端末のゲートウェイとDNSを両方192.168.7.2へ向けます。",[11,528,529],{"id":529},"ポート転送",[15,531,532,533,538],{},"メインルーターにポート転送を設定していて、転送先マシンがサイドルーターをゲートウェイにしている場合、転送が効かなくなっているはずです。解決方法は",[534,535,537],"a",{"href":536},"\u002Fja\u002Ffiddling\u002Ffix-port-forward-in-bypass-router","サイドルーター環境でポート転送が効かない問題を解決する","を参照してください。",{"title":111,"searchDepth":540,"depth":540,"links":541},4,[542,544,545,549,554,561],{"id":13,"depth":543,"text":13},3,{"id":55,"depth":543,"text":55},{"id":85,"depth":543,"text":86,"children":546},[547,548],{"id":93,"depth":540,"text":94},{"id":181,"depth":540,"text":181},{"id":193,"depth":543,"text":194,"children":550},[551,552,553],{"id":212,"depth":540,"text":213},{"id":225,"depth":540,"text":225},{"id":282,"depth":540,"text":282},{"id":319,"depth":543,"text":320,"children":555},[556,557,558,559,560],{"id":326,"depth":540,"text":327},{"id":338,"depth":540,"text":225},{"id":403,"depth":540,"text":404},{"id":452,"depth":540,"text":453},{"id":495,"depth":540,"text":495},{"id":529,"depth":543,"text":529},[563],"fiddling","2024-07-13 17:49:00","Debianをサイドルーターに使うと、OpenWrtやLuCIに依存せず、より安定した柔軟な構成を作れます。Debianを直接設定することでシステムを細かく制御でき、GUIの制約や不安定さを避けられます。一般的なサイドルーター構成と比べて透過プロキシを安定して運用しやすく、性能や効率を重視する場合の選択肢になります。",false,"md","https:\u002F\u002Fblog-img.774352199.xyz\u002FpPRU5x.webp",{"slots":570},{},true,"\u002Ffiddling\u002Fdebian-as-bypass-router",null,{"text":575,"minutes":576,"time":577,"words":578},"18 min read",17.525,1051500,3505,{"title":5,"description":565},"Debianの小型PCをサイドルーターにし、AdGuard HomeとmihomoでDNS振り分けと透過プロキシを構成。サブネット、iptables、systemdの設定を示します。","Debian サブゲートウェイ：mihomo・AdGuard Home と透過プロキシ",{"loc":572,"images":583},[584,585,586,587],{"loc":46},{"loc":70},{"loc":79},{"loc":203},"posts\u002Ffiddling\u002Fdebian-as-bypass-router",[590,591,592,593,594],"Debian","サイドルーター","mihomo","AdGuard Home","透過プロキシ","tech","Aup_x8XyOUMylrPkGCsgAZMuoMwOr8u1tJ5cfJhxBvc",[598,616,633,651,668,686,704,720,738,742,759,773,789,805,822,840,855,872,886,903,921,938,953,970,986,1005,1022,1039,1057,1071,1089,1107,1123,1138,1152,1169,1184,1199,1214,1228,1242,1256,1271,1285,1299],{"categories":599,"date":601,"description":602,"image":603,"path":604,"readingTime":605,"recommend":573,"tags":610,"title":615,"type":595},[600],"daily","2024-09-01 22:03:10","子どもの頃からの胃腸の不調が大学時代には不思議と消えたものの、就職後の夜更かしと飲酒で再発。慢性胃炎との付き合いは一筋縄ではいきませんでした。吐き気や胃のむかつきが日常になり、何度か検査を受けて生活を振り返るうちに、ようやく腰を据えて治療に向き合うようになりました。","https:\u002F\u002Fblog-img.774352199.xyz\u002F0Hr9l5.webp","\u002Fdaily\u002Fanti-chronic-gastritis",{"text":606,"minutes":607,"time":608,"words":609},"7 min read",6.485,389100,1297,[611,612,613,614],"慢性胃炎","受診記録","胃内視鏡検査","健康記録","慢性胃炎の治療記録",{"categories":617,"date":618,"description":619,"image":620,"path":621,"readingTime":622,"recommend":573,"tags":627,"title":632,"type":595},[600],"2022-04-11 00:13:13","『三体』では、劉慈欣が壮大な歴史を通して個人と集団の関係を描いています。西側の民主主義への疑念と、大多数の人々に運命を委ねることへの悲観が、三部作を貫いています。英雄たちが力を尽くしても、その努力は歴史の流れに押し流される。文化大革命から始まる物語に、少数の傑出した人物と平凡な大衆の対立を読み、人間性と社会について考えました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FLTzbFP.webp","\u002Fdaily\u002Fpeople-in-three-body",{"text":623,"minutes":624,"time":625,"words":626},"19 min read",18.495,1109700,3699,[628,629,630,631],"三体","劉慈欣","SF文学","読書ノート","『三体』における「大多数の人々」",{"categories":634,"date":635,"description":636,"image":637,"path":638,"readingTime":639,"recommend":573,"tags":644,"title":650,"type":595},[600],"2024-01-04 02:06:51","2024年の学習目標は、日本語をN2レベルに引き上げること、SICPとTAPLを最後までやり切ること、POSIXを完全に実装したカーネルを作ること、そしてブログのテーマを更新すること。どれも簡単ではありませんが、今年取り組む方向は決まりました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FV3rSQC.webp","\u002Fdaily\u002Fplan2024",{"text":640,"minutes":641,"time":642,"words":643},"1 min read",0.345,20700,69,[645,646,647,648,649],"年間計画","日本語学習","SICP","TAPL","オペレーティングシステム","2024年の学習計画",{"categories":652,"date":653,"description":654,"image":655,"path":656,"readingTime":657,"recommend":573,"tags":662,"title":667,"type":595},[600],"2024-09-28 16:26:00","ByteDanceで働いて3年。変化の速い環境で、時間まで加速したように感じながらも、どうにか心のバランスを保ってきました。杭州のオフィスのベランダから遠くの山を眺めていた入社当初を振り返り、仕事の壁や心境の変化、忙しさの中で自分のペースを探してきた日々を記します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FhnCaht.webp","\u002Fdaily\u002Fwork-for-3-years",{"text":658,"minutes":659,"time":660,"words":661},"20 min read",19.73,1183800,3946,[663,664,665,666],"ByteDance","エンジニアのキャリア","仕事の振り返り","メンタルヘルス","ByteDanceで3年働きながら、ある程度の正気を保つことも不可能ではない",{"categories":669,"date":670,"description":671,"image":672,"path":673,"readingTime":674,"recommend":573,"tags":679,"title":685,"type":595},[563],"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":675,"minutes":676,"time":677,"words":678},"4 min read",3.455,207300,691,[680,681,682,683,684],"Astro","Google Analytics","Google Tag Manager","Partytown","アクセス解析","AstroにGoogle Analyticsを導入する（Tag Manager編）",{"categories":687,"date":688,"description":689,"image":690,"path":691,"readingTime":692,"recommend":697,"tags":698,"title":703,"type":595},[563],"2023-04-08 13:16:36","新しいプログラミング言語の設計は、難しくも面白い作業です。複雑なコンパイラ理論や機能の実装詳細をいったん脇に置き、コードがコンピューターのどこで動くかに注目すると、言語の作り方が見えてきます。RISC-VI命令セットを出発点に、基盤となる構造、階層化されたシステム、仮想マシンのモデルをたどり、言語の本質を考えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FuO420B.webp","\u002Ffiddling\u002Fchitchat-about-programming-language",{"text":693,"minutes":694,"time":695,"words":696},"28 min read",27.03,1621800,5406,2,[699,700,701,702],"プログラミング言語設計","型システム","コンパイラ設計","RISC-V","プログラミング言語についての雑談",{"categories":705,"date":706,"description":707,"image":708,"path":709,"readingTime":710,"recommend":540,"tags":715,"title":719,"type":595},[563],"2025-04-18 16:43:12","彼女が仕事で北京から上海に引っ越したので、回線の手配も手伝いました。ところが上海電信の500Mは杭州の1000Mより高く、なんとも納得がいきません。そこで上海での透過プロキシ、特定の通信の杭州経由での外部接続、両拠点のLAN相互接続を目指してネットワークを組むことにしました。杭州側はソフトウェアルーターと無線APのシンプルな構成で、普段から自宅経由で通信できる環境があり、次の挑戦に向けた準備はできています。","https:\u002F\u002Fblog-img.774352199.xyz\u002FO6cAGh.webp","\u002Ffiddling\u002Fcross-city-network-setup",{"text":711,"minutes":712,"time":713,"words":714},"11 min read",10.14,608400,2028,[716,592,717,594,718],"Tailscale","拠点間ネットワーク","ホームネットワーク","上海と杭州の自宅ネットワークをつなぐ",{"categories":721,"date":722,"description":723,"image":724,"path":725,"readingTime":726,"recommend":573,"tags":731,"title":737,"type":595},[563],"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":727,"minutes":728,"time":729,"words":730},"10 min read",9.585,575100,1917,[732,733,734,735,736],"CSAPP","WSL2","Linux","GDB","実験環境","CSAPP Labの環境構築",{"categories":739,"date":564,"description":565,"image":568,"path":572,"readingTime":740,"recommend":573,"tags":741,"title":5,"type":595},[563],{"text":575,"minutes":576,"time":577,"words":578},[590,591,592,593,594],{"categories":743,"date":744,"description":745,"image":746,"path":747,"readingTime":748,"recommend":573,"tags":753,"title":758,"type":595},[563],"2024-08-16 23:53:00","FakeIPを使った透過プロキシ構成で、従来のサイドルーターの単一障害点、性能不足、複雑なポート転送を改善します。プロキシコアをsing-boxに変えることで、転送性能を高めながら設定も簡単にできます。対応プロトコルが豊富で、従来のClashより最適化も進んでいます。同じ構成はClashでも実現できますが、sing-boxは柔軟な選択肢になります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FS2HHD5.webp","\u002Ffiddling\u002Ffake-ip-based-transparent-proxy",{"text":749,"minutes":750,"time":751,"words":752},"14 min read",13.1,786000,2620,[754,755,594,756,757],"FakeIP","sing-box","ポリシーベースルーティング","トラフィック振り分け","FakeIPを使った透過プロキシの振り分け",{"categories":760,"date":761,"description":762,"image":763,"path":764,"readingTime":765,"recommend":573,"tags":770,"title":537,"type":595},[563],"2024-08-15 23:50:00","サイドルーターを導入すると、メインルーターのポート転送が効かなくなることがあります。ゲートウェイをサイドルーターに変えることで通信経路が変わり、メインルーターを前提とした転送が正常に動かなくなるためです。ゲートウェイはアドレスを変換して内部ネットワークの通信を外部へ転送し、各端末は外部との通信にこれを必要とします。この仕組みを理解すると、ポート転送の問題を解決しやすくなります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FmRqws9.webp","\u002Ffiddling\u002Ffix-port-forward-in-bypass-router",{"text":766,"minutes":767,"time":768,"words":769},"6 min read",5.155,309300,1031,[591,529,771,772],"NAT","ネットワークのトラブルシューティング",{"categories":774,"date":775,"description":776,"image":777,"path":778,"readingTime":779,"recommend":573,"tags":784,"title":788,"type":595},[563],"2023-02-02 23:24:55","春節の帰省列車で、Goをベアメタルで動かす記事を読み、低レベルのシステムインターフェースに興味が湧きました。実際に動く実装を見て、高級言語でOSを作る可能性に胸が躍ります。関連研究を調べると先行例も見つかり、積もった熱意は期待に満ちたプロジェクトへと変わりました。しかし、最後は思いどおりにはいきませんでした。","https:\u002F\u002Fblog-img.774352199.xyz\u002FxB1Ni5.webp","\u002Ffiddling\u002Fgo-os",{"text":780,"minutes":781,"time":782,"words":783},"12 min read",11.81,708600,2362,[785,702,649,786,787],"Go","ベアメタルプログラミング","ランタイム","失敗に終わったプロジェクト：楽しくなかった春節の7日間",{"categories":790,"date":791,"description":792,"image":793,"path":794,"readingTime":795,"recommend":573,"tags":800,"title":804,"type":595},[563],"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":796,"minutes":797,"time":798,"words":799},"5 min read",4.14,248400,828,[785,801,802,803],"リフレクション","ディープコピー","構造体変換","Goで異なる型の構造体をディープコピーする",{"categories":806,"date":807,"description":808,"image":809,"path":810,"readingTime":811,"recommend":573,"tags":815,"title":821,"type":595},[563],"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":675,"minutes":812,"time":813,"words":814},3.76,225600,752,[816,817,818,819,820],"Apple Watch","Health Auto Export","InfluxDB","Grafana","心拍数モニタリング","My Heart Beats for U：心拍数をGrafanaで可視化する",{"categories":823,"date":824,"description":825,"image":826,"path":827,"readingTime":828,"recommend":832,"tags":833,"title":839,"type":595},[563],"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":606,"minutes":829,"time":830,"words":831},6.94,416400,1388,5,[834,835,836,837,838],"macOS 26","iPadOS 26","Liquid Glass","Apple Intelligence","OS使用感","macOS 26とiPadOS 26を試してみた",{"categories":841,"date":842,"description":843,"image":844,"path":845,"readingTime":846,"recommend":573,"tags":850,"title":854,"type":595},[563],"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":727,"minutes":847,"time":848,"words":849},9.74,584400,1948,[851,837,852,853],"macOS 27","ChatGPT","中国本土向けMac","中国本土向けMacでApple Intelligenceを使う：地域変更からChatGPTの取り出しまで",{"categories":856,"date":857,"description":858,"image":859,"path":860,"readingTime":861,"recommend":573,"tags":865,"title":871,"type":595},[563],"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":711,"minutes":862,"time":863,"words":864},10.98,658800,2196,[866,867,868,869,870],"MoonTV","LunaTV","Vibe Coding","Cursor","AI支援開発","MoonTV：Vibe Codingを試してみた",{"categories":873,"date":874,"description":875,"image":876,"path":877,"readingTime":878,"recommend":573,"tags":882,"title":885,"type":595},[563],"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":766,"minutes":879,"time":880,"words":881},5.75,345000,1150,[883,884,756,757],"BGP","IPアドレスデータベース","BGPで中国国内・国外IPの振り分けをより正確にする",{"categories":887,"date":888,"description":889,"image":890,"path":891,"readingTime":892,"recommend":573,"tags":897,"title":902,"type":595},[563],"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":893,"minutes":894,"time":895,"words":896},"9 min read",8.96,537600,1792,[898,899,900,901],"Microsoft Flight Simulator 2024","Thrustmaster TCA","PICO VR","フライトシミュレーション","Microsoft Flight Simulator 2024をあれこれ試す",{"categories":904,"date":905,"description":906,"image":907,"path":908,"readingTime":909,"recommend":573,"tags":914,"title":920,"type":595},[563],"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":910,"minutes":911,"time":912,"words":913},"15 min read",14.05,843000,2810,[915,916,917,918,919],"Android","OPPO","iOS","スマートフォン使用感","エコシステム移行","Androidに乗り換えて1か月",{"categories":922,"date":923,"description":924,"image":925,"path":926,"readingTime":927,"recommend":573,"tags":931,"title":937,"type":595},[563],"2026-05-11 22:43:00","GitHub Trendingで旅行計画ツールを見つけ、自分でも動かしたくなりました。どうせ新しいVPSを借りるなら、ついでにもう少し、いや、だいぶ色々入れてしまおうと。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBBdDWW.webp","\u002Ffiddling\u002Fone-trek-twenty-stacks",{"text":711,"minutes":928,"time":929,"words":930},10.34,620400,2068,[932,933,934,935,936],"TREK","Docker Compose","Dockge","VPS","セルフホスティング","TREKひとつのつもりが、20個のスタックに",{"categories":939,"date":940,"description":941,"image":942,"path":943,"readingTime":944,"recommend":573,"tags":948,"title":952,"type":595},[563],"2025-01-16 23:09:00","OPNsenseは、美しい画面と充実した機能を備えるオープンソースのファイアウォール・ルーターです。いくつかの構成を試した末に、透過プロキシやトラフィック振り分けでの可能性に気づきました。BGPベースの振り分けと組み合わせることで安全性と安定性を高められ、IPリストの自動更新で管理もしやすくなります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FxA8C1E.webp","\u002Ffiddling\u002Fopnsense-transparent-proxy",{"text":780,"minutes":945,"time":946,"words":947},11.38,682800,2276,[949,950,592,951,594,757],"OPNsense","FreeBSD","tun2socks","OPNsenseで透過プロキシとトラフィック振り分けを実現する",{"categories":954,"date":955,"description":956,"image":957,"path":958,"readingTime":959,"recommend":543,"tags":963,"title":969,"type":595},[563],"2025-03-15 20:35:00","構文解析では、ユーザー定義型名と通常の変数名を見分けることが課題になります。たとえば`a*b;`は算術式とも宣言とも解釈できます。とくに型指定子に関する文法規則によって変数名が型名と解釈され、正確さや読みやすさに影響します。初期化を伴わない変数宣言は多いため、この曖昧さはソースコードの随所に現れます。","https:\u002F\u002Fblog-img.774352199.xyz\u002F2VKHK9.webp","\u002Ffiddling\u002Fparser-type-variable-ambiguity",{"text":749,"minutes":960,"time":961,"words":962},13.58,814800,2716,[964,965,966,967,968],"構文解析","GLR","シンボルテーブル","スコープ","曖昧性解消","構文解析で型名と変数名の曖昧さを解消する",{"categories":971,"date":972,"description":973,"image":974,"path":975,"readingTime":976,"recommend":573,"tags":980,"title":985,"type":595},[563],"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":675,"minutes":977,"time":978,"words":979},3.89,233400,778,[702,981,982,983,984],"Spike","riscv-pk","クロスコンパイル","ツールチェーン","RISC-Vツールチェーンとエミュレーターのインストール",{"categories":987,"date":988,"description":989,"image":990,"path":991,"readingTime":992,"recommend":996,"tags":997,"title":1004,"type":595},[563],"2026-09-09 23:59:00","これも一種のNTRですよね","https:\u002F\u002Fblog-img.774352199.xyz\u002FNDPUwc.webp","\u002Ffiddling\u002Fsteamdeck-switch-60fps",{"text":749,"minutes":993,"time":994,"words":995},13.905,834300,2781,7,[998,999,1000,1001,1002,1003],"Steam Deck","Nintendo Switch","EmuDeck","Eden","Lossless Scaling","フレーム生成","Steam Deckの第二の人生：Switchエミュレーター導入からフレーム補間で60FPSまで",{"categories":1006,"date":1007,"description":1008,"image":1009,"path":1010,"readingTime":1011,"recommend":573,"tags":1016,"title":1021,"type":595},[563],"2024-06-23 15:31:32","GFWは単に出口のゲートウェイを監視するのではなく、通信経路の脇から国際通信を傍受します。出入国するIPパケットをクラスタへ複製し、詳しく分析・フィルタリングする仕組みです。どこで何をしているかを理解することは、検閲回避の検討に欠かせません。ネットワーク構成を調べることで、遮断の経路や技術、対処方法が見えてきます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FsOpJuL.webp","\u002Ffiddling\u002Ftech-about-gfw",{"text":1012,"minutes":1013,"time":1014,"words":1015},"25 min read",24.975,1498500,4995,[1017,1018,1019,1020],"GFW","DNSポイズニング","TCP","インターネット検閲","GFWの仕組みを探る",{"categories":1023,"date":1024,"description":1025,"image":1026,"path":1027,"readingTime":1028,"recommend":573,"tags":1032,"title":1038,"type":595},[563],"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":675,"minutes":1029,"time":1030,"words":1031},3.88,232800,776,[1033,1034,1035,1036,1037],"Java","javac","文字列連結","定数伝播","バイトコード","Javaのthisキーワードでコンパイル時の定数伝播が効かなくなる問題",{"categories":1040,"date":1041,"description":1042,"image":1043,"path":1044,"readingTime":1045,"recommend":573,"tags":1050,"title":1056,"type":595},[563],"2025-01-29 21:58:00","ひとこと投稿機能があれば、静的ブログの記事公開に伴う手間や心理的な負担を減らし、短い思いつきをいつでも共有できます。Cloudflare Workersでバックエンドを実装し、KVで投稿を保存・管理します。フロントエンドはVitePressにVueコンポーネントを埋め込み、投稿を手軽に表示してブログに動きと交流の場を加えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FhZX6hr.webp","\u002Ffiddling\u002Fvitepress-memos-component",{"text":1046,"minutes":1047,"time":1048,"words":1049},"24 min read",23.345,1400700,4669,[1051,1052,1053,1054,1055],"VitePress","Vue","Cloudflare Workers","Cloudflare KV","マイクロブログ","VitePressにひとこと投稿機能を実装する",{"categories":1058,"date":1059,"description":1060,"image":1061,"path":1062,"readingTime":1063,"recommend":573,"tags":1067,"title":1070,"type":595},[563],"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":796,"minutes":1064,"time":1065,"words":1066},4.09,245400,818,[1068,1069,935,756,757],"Cloudflare WARP","IPv6","VPSの特定の通信をWARP経由のIPv6で外に出す",{"categories":1072,"date":1073,"description":1074,"image":1075,"path":1076,"readingTime":1077,"recommend":1081,"tags":1082,"title":1088,"type":595},[563],"2026-08-17 23:59:21","いじればいじるほど、もっといじりたくなります。年を取ってもまだまだ元気、まだまだ元気です。","https:\u002F\u002Fblog-img.774352199.xyz\u002FqfxB0h.webp","\u002Ffiddling\u002Fxiaomi17-root-and-hide-root",{"text":893,"minutes":1078,"time":1079,"words":1080},8.83,529800,1766,6,[1083,1084,1085,1086,1087],"Xiaomi 17","Bootloader","Android Root","ファームウェア書き換え","Rootの隠蔽","Xiaomi 17を普段使いに：ロック解除、ROM書き込み、root化とroot隠し",{"categories":1090,"date":1092,"description":1093,"image":1094,"path":1095,"readingTime":1096,"recommend":573,"tags":1101,"title":1106,"type":595},[1091],"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":1097,"minutes":1098,"time":1099,"words":1100},"13 min read",12.39,743400,2478,[1102,1103,785,1104,1105],"MIT 6.5840","MapReduce","RPC","並行プログラミング","6.5840 Lab 1：MapReduce",{"categories":1108,"date":1109,"description":1110,"image":1111,"path":1112,"readingTime":1113,"recommend":573,"tags":1117,"title":1122,"type":595},[1091],"2022-01-16 17:32:00","MapReduceは、大規模なデータセットの処理を簡単にするための効率的な並列計算モデルです。利用者はMapとReduceという2つの主要な関数を定義することで、複雑なタスクを簡単な操作に分解できます。データの分配やタスクの割り当てはフレームワークが自動で管理するため、開発者は低レベルの細部に気を取られず、アルゴリズムそのものに集中できます。分散システムで広く使われていることからも、その柔軟性と実用性が分かります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FApIDdC.webp","\u002Fnotes\u002F65840\u002Fmapreducepaper",{"text":893,"minutes":1114,"time":1115,"words":1116},8.085,485100,1617,[1103,1118,1119,1120,1121],"分散システム","論文ノート","並列計算","耐障害性","MapReduce論文を読む",{"categories":1124,"date":1125,"description":1126,"image":1127,"path":1128,"readingTime":1129,"recommend":573,"tags":1133,"title":1137,"type":595},[1091],"2022-12-16 02:06:10","Lab 2Aでは、Raftのリーダー選出とハートビートを実装し、さまざまな厳しい条件でも任期の交代や選挙が正常に行われるようにします。実習全体は4段階からなり、この後に実装する分散KVストアの土台になります。明示的なロックを使わない設計によって、Raft構造体を簡潔にします。実習の手引きには必要な背景知識が載っていますが、前の実習と比べると参考資料に頼れる部分はほとんどなく、自力で実装することが重視されます。","https:\u002F\u002Fblog-img.774352199.xyz\u002Fc11Uk4.webp","\u002Fnotes\u002F65840\u002Fraftlab2a",{"text":575,"minutes":1130,"time":1131,"words":1132},17.515,1050900,3503,[1102,1134,785,1135,1136],"Raft","リーダー選出","分散合意","6.5840 Lab 2A：リーダー選出",{"categories":1139,"date":1140,"description":1141,"image":1142,"path":1143,"readingTime":1144,"recommend":573,"tags":1149,"title":1151,"type":595},[1091],"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":1145,"minutes":1146,"time":1147,"words":1148},"30 min read",29.245,1754700,5849,[1134,1136,1150,1119],"ログ複製","Raft論文を読む",{"categories":1153,"date":1155,"description":1156,"image":1157,"path":1158,"readingTime":1159,"recommend":1163,"tags":1164,"title":1168,"type":595},[1154],"projects","2021-11-27 14:43:00","MYDBは、データベースの基本原理を学び、実装してみるための個人プロジェクトです。空き時間を使い、半月あまりかけて作りました。大学のデータベースシステムの授業で基礎には触れたものの、インターン中は授業を口実にサボってばかりでした。面接で正直に答えても大きな問題にはなりませんでしたが、それをきっかけに自分の知識を見直し、実際に手を動かして学ぼうと考えるようになりました。そうして生まれたのがこのプロジェクトです。","https:\u002F\u002Fblog-img.774352199.xyz\u002Fxfci2J.webp","\u002Fprojects\u002Fmydb\u002Fmydb0",{"text":893,"minutes":1160,"time":1161,"words":1162},8.03,481800,1606,1,[1165,1033,1166,1167],"MYDB","データベース実装","データベースアーキテクチャ","MYDB 0. プロジェクト構成と、先に伝えておきたいこと",{"categories":1170,"date":1171,"description":1172,"image":1173,"path":1174,"readingTime":1175,"recommend":573,"tags":1180,"title":1183,"type":595},[1154],"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":1176,"minutes":1177,"time":1178,"words":1179},"8 min read",7.42,445200,1484,[1165,1033,1181,1182],"トランザクション管理","XID","MYDB 1. まずはシンプルなTMから",{"categories":1185,"date":1186,"description":1187,"image":1188,"path":1189,"readingTime":1190,"recommend":573,"tags":1194,"title":1198,"type":595},[1154],"2021-12-25 18:26:00","MYDBはMySQLに似たC\u002FS構成を採用し、複数のクライアントがソケットでサーバーへ接続してSQLを実行し、結果を受け取れます。通信には専用のバイナリー形式を使いますが、実装を簡単にするならプレーンテキストも選択肢です。サーバーとクライアントの基本的な転送構造によって、データのやり取りと処理を行います。","https:\u002F\u002Fblog-img.774352199.xyz\u002FPAHrUZ.webp","\u002Fprojects\u002Fmydb\u002Fmydb10",{"text":766,"minutes":1191,"time":1192,"words":1193},5.76,345600,1152,[1165,1033,1195,1196,1197],"Socket","クライアントサーバー構成","通信プロトコル","MYDB 10. サーバー・クライアントの実装と通信プロトコル",{"categories":1200,"date":1201,"description":1202,"image":1203,"path":1204,"readingTime":1205,"recommend":573,"tags":1209,"title":1213,"type":595},[1154],"2021-11-30 23:18:00","データマネージャー（DM）は上位モジュールとファイルシステムをつなぎ、ページとキャッシュを管理しながら、データの安全性と復旧を支えます。キャッシュには従来のLRUではなく参照カウント方式を採用し、汎用性と効率を高めて、この先のデータ操作の土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FWdIGoG.webp","\u002Fprojects\u002Fmydb\u002Fmydb2",{"text":711,"minutes":1206,"time":1207,"words":1208},10.395,623700,2079,[1165,1033,1210,1211,1212],"参照カウント","キャッシュ設計","共有メモリ","MYDB 2. 参照カウント方式のキャッシュ基盤と共有バイト配列",{"categories":1215,"date":1216,"description":1217,"image":1218,"path":1219,"readingTime":1220,"recommend":573,"tags":1224,"title":1227,"type":595},[1154],"2021-12-05 15:28:00","DMはファイルシステムをページとして抽象化し、ページ単位で読み書きとキャッシュを行います。データページのデフォルトサイズは8Kで、大量の書き込みではサイズの調整によって性能を高められます。実装済みの汎用キャッシュ基盤を使い、ここではページ構造を具体的に定義して、効率よくページを管理します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FjlFC4E.webp","\u002Fprojects\u002Fmydb\u002Fmydb3",{"text":1176,"minutes":1221,"time":1222,"words":1223},7.14,428400,1428,[1165,1033,1225,1226],"データページ","キャッシュ管理","MYDB 3. データページのキャッシュと管理",{"categories":1229,"date":1230,"description":1231,"image":1232,"path":1233,"readingTime":1234,"recommend":573,"tags":1238,"title":1241,"type":595},[1154],"2021-12-08 22:55:00","MYDBでは、クラッシュ後にデータを復旧できるよう、ログファイルが重要な役割を担います。DMは下位のデータを操作するたびにログを生成・記録し、連続したログ列を作ります。チェックサムと各操作の記録を含む所定のバイナリー形式で保存することで、再起動時にデータの状態を正確に再構築し、整合性と完全性を保ちます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FTRcbsj.webp","\u002Fprojects\u002Fmydb\u002Fmydb4",{"text":1097,"minutes":1235,"time":1236,"words":1237},12.685,761100,2537,[1165,1033,1239,1240],"データベースログ","クラッシュリカバリ","MYDB 4. ログファイルと復旧戦略",{"categories":1243,"date":1244,"description":1245,"image":1246,"path":1247,"readingTime":1248,"recommend":573,"tags":1252,"title":1255,"type":595},[1154],"2021-12-11 15:16:00","ページインデックスはDM層の重要な構成要素です。各ページの空き容量をキャッシュすることで挿入処理を効率化し、上位モジュールが長い探索をせずに適切なページを素早く見つけられるようにします。実装ではデータ項目（DataItem）の抽象化とも密接に連携し、データベースの効率的な動作を支えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002F22PSG1.webp","\u002Fprojects\u002Fmydb\u002Fmydb5",{"text":727,"minutes":1249,"time":1250,"words":1251},9.86,591600,1972,[1165,1033,1253,1254],"ページインデックス","データ管理","MYDB 5. ページインデックスとDMの実装",{"categories":1257,"date":1258,"description":1259,"image":1260,"path":1261,"readingTime":1262,"recommend":573,"tags":1266,"title":1270,"type":595},[1154],"2021-12-18 14:58:00","VMは二相ロックでスケジュールの直列化可能性を保証し、多版型同時実行制御（MVCC）を導入して読み取りと書き込みの相互ブロックを解消します。また、データベース操作の競合を定義し、特に更新と読み取りの関係を整理することで、トランザクションの分離レベルを理解する土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002F8YzotA.webp","\u002Fprojects\u002Fmydb\u002Fmydb6",{"text":910,"minutes":1263,"time":1264,"words":1265},14.665,879900,2933,[1165,1033,1267,1268,1269],"MVCC","トランザクション分離","二相ロック","MYDB 6. レコードのバージョンとトランザクション分離",{"categories":1272,"date":1273,"description":1274,"image":1275,"path":1276,"readingTime":1277,"recommend":573,"tags":1281,"title":1284,"type":595},[1154],"2021-12-23 21:20:00","VMでは、MVCCに伴うバージョンの飛び越しとデッドロックに対処する必要があります。MYDBはトランザクションに印を付けるだけで取り消しやロールバックを行い、abortedなトランザクションのデータがほかへ影響しないようにします。この設計により並行処理の効率と信頼性を高め、従来の2PLで起こりがちなデッドロックを避けて、システム全体の安定性と性能を向上させます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBF3yDW.webp","\u002Fprojects\u002Fmydb\u002Fmydb7",{"text":780,"minutes":1278,"time":1279,"words":1280},11.32,679200,2264,[1165,1033,1282,1283],"デッドロック検出","バージョン管理","MYDB 7. デッドロック検出とVMの実装",{"categories":1286,"date":1287,"description":1288,"image":1289,"path":1290,"readingTime":1291,"recommend":573,"tags":1295,"title":1298,"type":595},[1154],"2021-12-24 21:01:00","MYDBはB+木によるクラスタ化インデックスを実装します。IMはバージョンマネージャー（VM）を経由せず、データマネージャー（DM）と直接やり取りし、インデックスデータをデータベースファイルへ直接書き込みます。この章では二分木インデックスの構造を詳しく説明し、葉フラグ、キー数、兄弟ノードの識別子など、インデックス検索の基盤となる要素を扱います。","https:\u002F\u002Fblog-img.774352199.xyz\u002Ff92X4o.webp","\u002Fprojects\u002Fmydb\u002Fmydb8",{"text":606,"minutes":1292,"time":1293,"words":1294},6.53,391800,1306,[1165,1033,1296,1297],"B+木","データベースインデックス","MYDB 8. インデックス管理",{"categories":1300,"date":1301,"description":1302,"image":1303,"path":1304,"readingTime":1305,"recommend":573,"tags":1309,"title":1312,"type":595},[1154],"2021-12-25 15:44:00","テーブルマネージャー（TBM）は、フィールドとテーブルの構造を管理します。ParserはSQL風の文を構造化して解析し、文に含まれる情報を対応するクラスへまとめることで、その後の操作を簡単にします。この章ではMYDBのSQL構文も紹介し、管理処理全体を理解する土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FzOMyv5.webp","\u002Fprojects\u002Fmydb\u002Fmydb9",{"text":1176,"minutes":1306,"time":1307,"words":1308},7.99,479400,1598,[1165,1033,1310,1311],"SQL解析","テーブル管理","MYDB 9. フィールドとテーブルの管理",1789914057321]