[{"data":1,"prerenderedAt":1121},["ShallowReactive",2],{"content:\u002Fja\u002Ffiddling\u002Fcross-city-network-setup":3,"series:content_ja":244,"github:nikkinikki-org\u002FOpenWrt-nikki":962,"github:asvow\u002Fluci-app-tailscale":1051},{"id":4,"title":5,"authorship":6,"body":7,"categories":214,"date":216,"description":217,"draft":218,"extension":219,"image":220,"meta":221,"navigation":223,"path":224,"permalink":225,"published":225,"readingTime":226,"recommend":207,"references":225,"seo":231,"seoDescription":232,"seoTitle":233,"sitemap":234,"stem":235,"tags":236,"type":242,"__hash__":243},"content_ja\u002Fposts\u002Ffiddling\u002Fcross-city-network-setup.md","上海と杭州の自宅ネットワークをつなぐ","human-only",{"type":8,"value":9,"toc":205},"minimark",[10,14,18,21,24,30,33,46,49,52,55,70,73,76,79,82,85,88,91,94,105,108,116,120,123,134,137,140,143,146,149,158,161,164,167,184,187,190,193,196,199,202],[11,12,13],"h3",{"id":13},"はじめに",[15,16,17],"p",{},"今月、彼女が仕事の都合で北京から上海に引っ越しました。",[15,19,20],{},"引っ越しの手伝いと一緒に、中国電信の500M回線も契約しました。",[15,22,23],{},"ついでに上海電信への愚痴ですが、500M回線が杭州電信の1000M回線より高いんです。",[15,25,26],{},[27,28,29],"del",{},"光ファイバーが金でできているんですか？ それともONUのほう？",[15,31,32],{},"自称Geekとしては、いじらずにはいられません。考えた結果、次の3つを目標にしました。",[34,35,36,40,43],"ol",{},[37,38,39],"li",{},"上海で透過プロキシによる検閲回避。",[37,41,42],{},"上海の一部の通信を杭州から外へ出す。",[37,44,45],{},"両拠点のLANを相互にアクセス可能にする。",[15,47,48],{},"2つ目は、Netflixなどの地域制限解除にプロキシのサブスクリプションサービスを使っているためです（ここにアフィリエイトリンクを挿入）。このサービスは利用者を制限しており、複数拠点で同時に使うとアカウントを停止される可能性があります。そのため通信を杭州に転送し、出口を1か所にまとめる必要があります。",[11,50,51],{"id":51},"事前準備",[15,53,54],{},"杭州のネットワーク構成は単純です。ONUの下にPPPoE接続を行うソフトウェアルーターがあり、その先に無線AP用のTP-Link機器をつないでいます。小型PCもルーターに直結し、普段の通信を自宅経由にするためのShadowsocksサーバーを動かしています。ソフトウェアルーターは倍控のG30Sです（ここに広告を挿入）。N5100で十分で、OSはImmortalWrt。次のプラグインを入れています。",[56,57,58,61,64,67],"ul",{},[37,59,60],{},"AdGuard Home：DNSによる広告ブロック。",[37,62,63],{},"Nikki：Mihomoコアによる透過プロキシ。",[37,65,66],{},"Tailscale：仮想LANの構築。これまでは自宅経由の通信の予備手段として使っていました。",[37,68,69],{},"DDNS-Go：見てのとおり、DDNSです。",[15,71,72],{},"LANのサブネットは192.168.7.0\u002F24です。",[15,74,75],{},"機器をそろえて少しでも複雑さを減らすため、同じ構成のG30Sをもう1台購入し、ImmortalWrtを入れました。上海も杭州と同じ、ONU → ソフトウェアルーター → APの構成にします。",[11,77,78],{"id":78},"インストール",[15,80,81],{},"ImmortalWrtのインストールには触れておきたいです。最初はWindowsやほかのLinuxディストリビューションのように、イメージはLive CDかインストーラーで、USBメモリに書いて起動してからインストールするものだと思っていました。ところがUSBから起動すると、そのまま立ち上がってしまいました……。",[15,83,84],{},"立ち上がったんです……。",[15,86,87],{},"あのimg、システムそのもののイメージだったんですね。",[15,89,90],{},"急いでUSBをWinPEに作り直し、physdiskwriteでイメージを内蔵ディスクへ書き込みました。無事に起動し、簡単な設定でインターネット接続とDHCPも動きました。上海のLANは192.168.10.0\u002F24です。",[15,92,93],{},"次は容量拡張です。イメージを直接書いたOpenWrtは使える領域が1G未満で、残りのディスクが丸ごと無駄になります。ここで2つ目の難関が来ました。適切な拡張手順が見つからないのです。簡体字中国語の解説は複雑で誤りだらけ、しかも互いのコピペばかりでした。実際の内容はsquashfsの拡張か、空き領域に新しいパーティションを作ってルートをそちらへ移す方法で、本当にパーティション自体を「拡張」する解説はほとんどありません。",[15,95,96,97,104],{},"結局、",[98,99,103],"a",{"href":100,"rel":101},"https:\u002F\u002Fopenwrt.org\u002Fdocs\u002Fguide-user\u002Fadvanced\u002Fexpand_root",[102],"nofollow","OpenWrtの公式ドキュメント","にありました……。今後は中国語で検索するのをやめたほうがよさそうです。Googleでも役に立つものが出てきません。",[15,106,107],{},"まず検閲回避と通信の出口を片づけます。ここはClashだけで対応できます。",[15,109,110,115],{},[98,111,114],{"href":112,"rel":113},"https:\u002F\u002Fgithub.com\u002Fnikkinikki-org\u002FOpenWrt-nikki",[102],"Nikki","はMihomoコアで透過プロキシを行うOpenWrtプラグインです。PasswallやClashなどの同種プラグインより細かくカスタマイズできます。インストールはREADMEの手順に従ってください。Releasesからipkを直接ダウンロードしてもインストールできません。妙な話ですが。",[117,118],"github",{"repo":119},"nikkinikki-org\u002FOpenWrt-nikki",[15,121,122],{},"インストール後は設定ファイルを読み込めば起動できます。注意点をいくつか。",[34,124,125,128,131],{},[37,126,127],{},"TUNモードをそのまま有効にできます。ルーティングテーブルを自動設定して透過プロキシを行い、基本的に問題なく動きます。",[37,129,130],{},"Mihomoのドメインによる振り分けには、DNSクエリをMihomo経由にする必要があります。Mihomo DNSに53番ポートを取らせてOpenWrt標準のdnsmasqを別ポートに移すか、dnsmasqですべてのDNSクエリをMihomoのDNSポートへ転送します。",[37,132,133],{},"FakeIPモードでは、FakeIP Filterを丁寧に設定してください。",[15,135,136],{},"あとはおなじみの話で、ほかの環境のMihomoとほぼ同じなので省略します。",[15,138,139],{},"設定後にNikkiを有効にすると、DashboardでMihomoがルーターの出口通信をすべて引き受けていることを確認できます。",[15,141,142],{},"設定はほぼ私の環境からコピーしました。検閲回避の通信の大半は搬瓦工（BandwagonHost）のプロキシ🪜へ直接つなぎ、杭州から出す必要があるルールだけoutboundを杭州のShadowsocksサーバーに変更しました。試すと遅延も許容範囲で、中国国内の中継を1段挟むようなものです。",[15,144,145],{},"ここまでで、ドメイン名を使えば上海から杭州のLANへアクセスできます。FakeIPモードなので、DNSが返した偽IPへのリクエストはMihomoが処理し、ドメインルールで杭州へ転送できるからです。ただしDNSを通らないIP直接指定のリクエストはMihomoでは転送できません。TUNは標準ではLAN宛ての通信を引き受けないためです。また、杭州から上海へのアクセスもまだできません。",[15,147,148],{},"そこで、Tailscaleの登場です！",[15,150,151,152,157],{},"OpenWrtでは",[98,153,156],{"href":154,"rel":155},"https:\u002F\u002Fgithub.com\u002Fasvow\u002Fluci-app-tailscale",[102],"luci-app-tailscale","を使うと、Tailscaleを比較的わかりやすい画面で管理・設定できます。",[117,159],{"repo":160},"asvow\u002Fluci-app-tailscale",[15,162,163],{},"インストール後は一度起動してログイン認証を済ませてから設定します。Tailscale側でこの端末のキー有効期限も無効にしておくとよいです。",[15,165,166],{},"詳細設定では、次のようにします。",[56,168,169,172,175,178,181],{},[37,170,171],{},"ルートを有効化にチェック：ほかのサブネットへの経路をTailscaleが自動設定します。",[37,173,174],{},"DNSを許可はチェックしない：必要なのはIP通信のルーティングだけです。",[37,176,177],{},"公開するサブネットは192.168.10.0\u002F24：この端末がその範囲をルーティングできるとTailscaleに伝えます。",[37,179,180],{},"サブネット相互接続にチェック：文字どおりの意味です。",[37,182,183],{},"サブネットルートは192.168.7.0\u002F24を選択：この範囲へのルーティングをTailscaleに任せます。",[15,185,186],{},"杭州側のTailscaleにも対応する設定が必要です。公開するサブネットとサブネットルートには、それぞれ正しい側のアドレス範囲を指定してください。",[15,188,189],{},"設定後にTailscaleを再起動すれば、サブネット間の接続ができあがります。上海からも杭州からも、相手側のサブネットのIPを直接指定してホストへアクセスできます。",[11,191,192],{"id":192},"あとがき",[15,194,195],{},"上海で契約したのは何やら「クラウドブロードバンド」というもので、これを解除してブリッジモードを有効にする手続きが非常に面倒です。いまだに終わっていません。",[15,197,198],{},"そのため、上の設定はすべて上海のソフトウェアルーターにグローバルIPがない状態で行っています。",[15,200,201],{},"幸い杭州側にはグローバルIPがあるので、Tailscaleのホールパンチングで直接接続でき、遅延は十数ミリ秒です。両側ともグローバルIPがなければ、運を天に任せるしかありません。自前のDERP中継を立てるか、数百ミリ秒の遅延に耐えることになります。",[15,203,204],{},"最後にもう一度上海電信へ愚痴を。ブリッジモードを有効にするだけで、契約書への署名、写真撮影、審査まで必要とは。泥棒でも警戒しているようです。",{"title":206,"searchDepth":207,"depth":207,"links":208},"",4,[209,211,212,213],{"id":13,"depth":210,"text":13},3,{"id":51,"depth":210,"text":51},{"id":78,"depth":210,"text":78},{"id":192,"depth":210,"text":192},[215],"fiddling","2025-04-18 16:43:12","彼女が仕事で北京から上海に引っ越したので、回線の手配も手伝いました。ところが上海電信の500Mは杭州の1000Mより高く、なんとも納得がいきません。そこで上海での透過プロキシ、特定の通信の杭州経由での外部接続、両拠点のLAN相互接続を目指してネットワークを組むことにしました。杭州側はソフトウェアルーターと無線APのシンプルな構成で、普段から自宅経由で通信できる環境があり、次の挑戦に向けた準備はできています。",false,"md","https:\u002F\u002Fblog-img.774352199.xyz\u002FO6cAGh.webp",{"slots":222},{},true,"\u002Ffiddling\u002Fcross-city-network-setup",null,{"text":227,"minutes":228,"time":229,"words":230},"11 min read",10.14,608400,2028,{"title":5,"description":217},"上海と杭州の自宅LANをImmortalWRT、Nikki、Tailscaleで接続。透過プロキシ、杭州経由の通信、双方向のサブネットアクセスを設定し、導入時の問題も記録します。","Tailscale と mihomo による上海・杭州の拠点間ネットワーク",{"loc":224},"posts\u002Ffiddling\u002Fcross-city-network-setup",[237,238,239,240,241],"Tailscale","mihomo","拠点間ネットワーク","透過プロキシ","ホームネットワーク","tech","rbCyNWUGUnCSdY0WbxoQaNCziEUUYp_hQtl49TIocCI",[245,263,280,298,315,333,351,355,373,389,406,422,438,454,471,489,504,521,535,552,570,587,602,619,635,654,671,688,706,720,738,756,772,787,801,818,833,848,863,877,891,905,920,934,948],{"categories":246,"date":248,"description":249,"image":250,"path":251,"readingTime":252,"recommend":225,"tags":257,"title":262,"type":242},[247],"daily","2024-09-01 22:03:10","子どもの頃からの胃腸の不調が大学時代には不思議と消えたものの、就職後の夜更かしと飲酒で再発。慢性胃炎との付き合いは一筋縄ではいきませんでした。吐き気や胃のむかつきが日常になり、何度か検査を受けて生活を振り返るうちに、ようやく腰を据えて治療に向き合うようになりました。","https:\u002F\u002Fblog-img.774352199.xyz\u002F0Hr9l5.webp","\u002Fdaily\u002Fanti-chronic-gastritis",{"text":253,"minutes":254,"time":255,"words":256},"7 min read",6.485,389100,1297,[258,259,260,261],"慢性胃炎","受診記録","胃内視鏡検査","健康記録","慢性胃炎の治療記録",{"categories":264,"date":265,"description":266,"image":267,"path":268,"readingTime":269,"recommend":225,"tags":274,"title":279,"type":242},[247],"2022-04-11 00:13:13","『三体』では、劉慈欣が壮大な歴史を通して個人と集団の関係を描いています。西側の民主主義への疑念と、大多数の人々に運命を委ねることへの悲観が、三部作を貫いています。英雄たちが力を尽くしても、その努力は歴史の流れに押し流される。文化大革命から始まる物語に、少数の傑出した人物と平凡な大衆の対立を読み、人間性と社会について考えました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FLTzbFP.webp","\u002Fdaily\u002Fpeople-in-three-body",{"text":270,"minutes":271,"time":272,"words":273},"19 min read",18.495,1109700,3699,[275,276,277,278],"三体","劉慈欣","SF文学","読書ノート","『三体』における「大多数の人々」",{"categories":281,"date":282,"description":283,"image":284,"path":285,"readingTime":286,"recommend":225,"tags":291,"title":297,"type":242},[247],"2024-01-04 02:06:51","2024年の学習目標は、日本語をN2レベルに引き上げること、SICPとTAPLを最後までやり切ること、POSIXを完全に実装したカーネルを作ること、そしてブログのテーマを更新すること。どれも簡単ではありませんが、今年取り組む方向は決まりました。","https:\u002F\u002Fblog-img.774352199.xyz\u002FV3rSQC.webp","\u002Fdaily\u002Fplan2024",{"text":287,"minutes":288,"time":289,"words":290},"1 min read",0.345,20700,69,[292,293,294,295,296],"年間計画","日本語学習","SICP","TAPL","オペレーティングシステム","2024年の学習計画",{"categories":299,"date":300,"description":301,"image":302,"path":303,"readingTime":304,"recommend":225,"tags":309,"title":314,"type":242},[247],"2024-09-28 16:26:00","ByteDanceで働いて3年。変化の速い環境で、時間まで加速したように感じながらも、どうにか心のバランスを保ってきました。杭州のオフィスのベランダから遠くの山を眺めていた入社当初を振り返り、仕事の壁や心境の変化、忙しさの中で自分のペースを探してきた日々を記します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FhnCaht.webp","\u002Fdaily\u002Fwork-for-3-years",{"text":305,"minutes":306,"time":307,"words":308},"20 min read",19.73,1183800,3946,[310,311,312,313],"ByteDance","エンジニアのキャリア","仕事の振り返り","メンタルヘルス","ByteDanceで3年働きながら、ある程度の正気を保つことも不可能ではない",{"categories":316,"date":317,"description":318,"image":319,"path":320,"readingTime":321,"recommend":225,"tags":326,"title":332,"type":242},[215],"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":322,"minutes":323,"time":324,"words":325},"4 min read",3.455,207300,691,[327,328,329,330,331],"Astro","Google Analytics","Google Tag Manager","Partytown","アクセス解析","AstroにGoogle Analyticsを導入する（Tag Manager編）",{"categories":334,"date":335,"description":336,"image":337,"path":338,"readingTime":339,"recommend":344,"tags":345,"title":350,"type":242},[215],"2023-04-08 13:16:36","新しいプログラミング言語の設計は、難しくも面白い作業です。複雑なコンパイラ理論や機能の実装詳細をいったん脇に置き、コードがコンピューターのどこで動くかに注目すると、言語の作り方が見えてきます。RISC-VI命令セットを出発点に、基盤となる構造、階層化されたシステム、仮想マシンのモデルをたどり、言語の本質を考えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FuO420B.webp","\u002Ffiddling\u002Fchitchat-about-programming-language",{"text":340,"minutes":341,"time":342,"words":343},"28 min read",27.03,1621800,5406,2,[346,347,348,349],"プログラミング言語設計","型システム","コンパイラ設計","RISC-V","プログラミング言語についての雑談",{"categories":352,"date":216,"description":217,"image":220,"path":224,"readingTime":353,"recommend":207,"tags":354,"title":5,"type":242},[215],{"text":227,"minutes":228,"time":229,"words":230},[237,238,239,240,241],{"categories":356,"date":357,"description":358,"image":359,"path":360,"readingTime":361,"recommend":225,"tags":366,"title":372,"type":242},[215],"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":362,"minutes":363,"time":364,"words":365},"10 min read",9.585,575100,1917,[367,368,369,370,371],"CSAPP","WSL2","Linux","GDB","実験環境","CSAPP Labの環境構築",{"categories":374,"date":375,"description":376,"image":377,"path":378,"readingTime":379,"recommend":225,"tags":384,"title":388,"type":242},[215],"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":380,"minutes":381,"time":382,"words":383},"18 min read",17.525,1051500,3505,[385,386,238,387,240],"Debian","サイドルーター","AdGuard Home","Debianをサイドルーターにする",{"categories":390,"date":391,"description":392,"image":393,"path":394,"readingTime":395,"recommend":225,"tags":400,"title":405,"type":242},[215],"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":396,"minutes":397,"time":398,"words":399},"14 min read",13.1,786000,2620,[401,402,240,403,404],"FakeIP","sing-box","ポリシーベースルーティング","トラフィック振り分け","FakeIPを使った透過プロキシの振り分け",{"categories":407,"date":408,"description":409,"image":410,"path":411,"readingTime":412,"recommend":225,"tags":417,"title":421,"type":242},[215],"2024-08-15 23:50:00","サイドルーターを導入すると、メインルーターのポート転送が効かなくなることがあります。ゲートウェイをサイドルーターに変えることで通信経路が変わり、メインルーターを前提とした転送が正常に動かなくなるためです。ゲートウェイはアドレスを変換して内部ネットワークの通信を外部へ転送し、各端末は外部との通信にこれを必要とします。この仕組みを理解すると、ポート転送の問題を解決しやすくなります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FmRqws9.webp","\u002Ffiddling\u002Ffix-port-forward-in-bypass-router",{"text":413,"minutes":414,"time":415,"words":416},"6 min read",5.155,309300,1031,[386,418,419,420],"ポート転送","NAT","ネットワークのトラブルシューティング","サイドルーター環境でポート転送が効かない問題を解決する",{"categories":423,"date":424,"description":425,"image":426,"path":427,"readingTime":428,"recommend":225,"tags":433,"title":437,"type":242},[215],"2023-02-02 23:24:55","春節の帰省列車で、Goをベアメタルで動かす記事を読み、低レベルのシステムインターフェースに興味が湧きました。実際に動く実装を見て、高級言語でOSを作る可能性に胸が躍ります。関連研究を調べると先行例も見つかり、積もった熱意は期待に満ちたプロジェクトへと変わりました。しかし、最後は思いどおりにはいきませんでした。","https:\u002F\u002Fblog-img.774352199.xyz\u002FxB1Ni5.webp","\u002Ffiddling\u002Fgo-os",{"text":429,"minutes":430,"time":431,"words":432},"12 min read",11.81,708600,2362,[434,349,296,435,436],"Go","ベアメタルプログラミング","ランタイム","失敗に終わったプロジェクト：楽しくなかった春節の7日間",{"categories":439,"date":440,"description":441,"image":442,"path":443,"readingTime":444,"recommend":225,"tags":449,"title":453,"type":242},[215],"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":445,"minutes":446,"time":447,"words":448},"5 min read",4.14,248400,828,[434,450,451,452],"リフレクション","ディープコピー","構造体変換","Goで異なる型の構造体をディープコピーする",{"categories":455,"date":456,"description":457,"image":458,"path":459,"readingTime":460,"recommend":225,"tags":464,"title":470,"type":242},[215],"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":322,"minutes":461,"time":462,"words":463},3.76,225600,752,[465,466,467,468,469],"Apple Watch","Health Auto Export","InfluxDB","Grafana","心拍数モニタリング","My Heart Beats for U：心拍数をGrafanaで可視化する",{"categories":472,"date":473,"description":474,"image":475,"path":476,"readingTime":477,"recommend":481,"tags":482,"title":488,"type":242},[215],"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":253,"minutes":478,"time":479,"words":480},6.94,416400,1388,5,[483,484,485,486,487],"macOS 26","iPadOS 26","Liquid Glass","Apple Intelligence","OS使用感","macOS 26とiPadOS 26を試してみた",{"categories":490,"date":491,"description":492,"image":493,"path":494,"readingTime":495,"recommend":225,"tags":499,"title":503,"type":242},[215],"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":362,"minutes":496,"time":497,"words":498},9.74,584400,1948,[500,486,501,502],"macOS 27","ChatGPT","中国本土向けMac","中国本土向けMacでApple Intelligenceを使う：地域変更からChatGPTの取り出しまで",{"categories":505,"date":506,"description":507,"image":508,"path":509,"readingTime":510,"recommend":225,"tags":514,"title":520,"type":242},[215],"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":227,"minutes":511,"time":512,"words":513},10.98,658800,2196,[515,516,517,518,519],"MoonTV","LunaTV","Vibe Coding","Cursor","AI支援開発","MoonTV：Vibe Codingを試してみた",{"categories":522,"date":523,"description":524,"image":525,"path":526,"readingTime":527,"recommend":225,"tags":531,"title":534,"type":242},[215],"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":413,"minutes":528,"time":529,"words":530},5.75,345000,1150,[532,533,403,404],"BGP","IPアドレスデータベース","BGPで中国国内・国外IPの振り分けをより正確にする",{"categories":536,"date":537,"description":538,"image":539,"path":540,"readingTime":541,"recommend":225,"tags":546,"title":551,"type":242},[215],"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":542,"minutes":543,"time":544,"words":545},"9 min read",8.96,537600,1792,[547,548,549,550],"Microsoft Flight Simulator 2024","Thrustmaster TCA","PICO VR","フライトシミュレーション","Microsoft Flight Simulator 2024をあれこれ試す",{"categories":553,"date":554,"description":555,"image":556,"path":557,"readingTime":558,"recommend":225,"tags":563,"title":569,"type":242},[215],"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":559,"minutes":560,"time":561,"words":562},"15 min read",14.05,843000,2810,[564,565,566,567,568],"Android","OPPO","iOS","スマートフォン使用感","エコシステム移行","Androidに乗り換えて1か月",{"categories":571,"date":572,"description":573,"image":574,"path":575,"readingTime":576,"recommend":225,"tags":580,"title":586,"type":242},[215],"2026-05-11 22:43:00","GitHub Trendingで旅行計画ツールを見つけ、自分でも動かしたくなりました。どうせ新しいVPSを借りるなら、ついでにもう少し、いや、だいぶ色々入れてしまおうと。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBBdDWW.webp","\u002Ffiddling\u002Fone-trek-twenty-stacks",{"text":227,"minutes":577,"time":578,"words":579},10.34,620400,2068,[581,582,583,584,585],"TREK","Docker Compose","Dockge","VPS","セルフホスティング","TREKひとつのつもりが、20個のスタックに",{"categories":588,"date":589,"description":590,"image":591,"path":592,"readingTime":593,"recommend":225,"tags":597,"title":601,"type":242},[215],"2025-01-16 23:09:00","OPNsenseは、美しい画面と充実した機能を備えるオープンソースのファイアウォール・ルーターです。いくつかの構成を試した末に、透過プロキシやトラフィック振り分けでの可能性に気づきました。BGPベースの振り分けと組み合わせることで安全性と安定性を高められ、IPリストの自動更新で管理もしやすくなります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FxA8C1E.webp","\u002Ffiddling\u002Fopnsense-transparent-proxy",{"text":429,"minutes":594,"time":595,"words":596},11.38,682800,2276,[598,599,238,600,240,404],"OPNsense","FreeBSD","tun2socks","OPNsenseで透過プロキシとトラフィック振り分けを実現する",{"categories":603,"date":604,"description":605,"image":606,"path":607,"readingTime":608,"recommend":210,"tags":612,"title":618,"type":242},[215],"2025-03-15 20:35:00","構文解析では、ユーザー定義型名と通常の変数名を見分けることが課題になります。たとえば`a*b;`は算術式とも宣言とも解釈できます。とくに型指定子に関する文法規則によって変数名が型名と解釈され、正確さや読みやすさに影響します。初期化を伴わない変数宣言は多いため、この曖昧さはソースコードの随所に現れます。","https:\u002F\u002Fblog-img.774352199.xyz\u002F2VKHK9.webp","\u002Ffiddling\u002Fparser-type-variable-ambiguity",{"text":396,"minutes":609,"time":610,"words":611},13.58,814800,2716,[613,614,615,616,617],"構文解析","GLR","シンボルテーブル","スコープ","曖昧性解消","構文解析で型名と変数名の曖昧さを解消する",{"categories":620,"date":621,"description":622,"image":623,"path":624,"readingTime":625,"recommend":225,"tags":629,"title":634,"type":242},[215],"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":322,"minutes":626,"time":627,"words":628},3.89,233400,778,[349,630,631,632,633],"Spike","riscv-pk","クロスコンパイル","ツールチェーン","RISC-Vツールチェーンとエミュレーターのインストール",{"categories":636,"date":637,"description":638,"image":639,"path":640,"readingTime":641,"recommend":645,"tags":646,"title":653,"type":242},[215],"2026-09-09 23:59:00","これも一種のNTRですよね","https:\u002F\u002Fblog-img.774352199.xyz\u002FNDPUwc.webp","\u002Ffiddling\u002Fsteamdeck-switch-60fps",{"text":396,"minutes":642,"time":643,"words":644},13.905,834300,2781,7,[647,648,649,650,651,652],"Steam Deck","Nintendo Switch","EmuDeck","Eden","Lossless Scaling","フレーム生成","Steam Deckの第二の人生：Switchエミュレーター導入からフレーム補間で60FPSまで",{"categories":655,"date":656,"description":657,"image":658,"path":659,"readingTime":660,"recommend":225,"tags":665,"title":670,"type":242},[215],"2024-06-23 15:31:32","GFWは単に出口のゲートウェイを監視するのではなく、通信経路の脇から国際通信を傍受します。出入国するIPパケットをクラスタへ複製し、詳しく分析・フィルタリングする仕組みです。どこで何をしているかを理解することは、検閲回避の検討に欠かせません。ネットワーク構成を調べることで、遮断の経路や技術、対処方法が見えてきます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FsOpJuL.webp","\u002Ffiddling\u002Ftech-about-gfw",{"text":661,"minutes":662,"time":663,"words":664},"25 min read",24.975,1498500,4995,[666,667,668,669],"GFW","DNSポイズニング","TCP","インターネット検閲","GFWの仕組みを探る",{"categories":672,"date":673,"description":674,"image":675,"path":676,"readingTime":677,"recommend":225,"tags":681,"title":687,"type":242},[215],"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":322,"minutes":678,"time":679,"words":680},3.88,232800,776,[682,683,684,685,686],"Java","javac","文字列連結","定数伝播","バイトコード","Javaのthisキーワードでコンパイル時の定数伝播が効かなくなる問題",{"categories":689,"date":690,"description":691,"image":692,"path":693,"readingTime":694,"recommend":225,"tags":699,"title":705,"type":242},[215],"2025-01-29 21:58:00","ひとこと投稿機能があれば、静的ブログの記事公開に伴う手間や心理的な負担を減らし、短い思いつきをいつでも共有できます。Cloudflare Workersでバックエンドを実装し、KVで投稿を保存・管理します。フロントエンドはVitePressにVueコンポーネントを埋め込み、投稿を手軽に表示してブログに動きと交流の場を加えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FhZX6hr.webp","\u002Ffiddling\u002Fvitepress-memos-component",{"text":695,"minutes":696,"time":697,"words":698},"24 min read",23.345,1400700,4669,[700,701,702,703,704],"VitePress","Vue","Cloudflare Workers","Cloudflare KV","マイクロブログ","VitePressにひとこと投稿機能を実装する",{"categories":707,"date":708,"description":709,"image":710,"path":711,"readingTime":712,"recommend":225,"tags":716,"title":719,"type":242},[215],"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":445,"minutes":713,"time":714,"words":715},4.09,245400,818,[717,718,584,403,404],"Cloudflare WARP","IPv6","VPSの特定の通信をWARP経由のIPv6で外に出す",{"categories":721,"date":722,"description":723,"image":724,"path":725,"readingTime":726,"recommend":730,"tags":731,"title":737,"type":242},[215],"2026-08-17 23:59:21","いじればいじるほど、もっといじりたくなります。年を取ってもまだまだ元気、まだまだ元気です。","https:\u002F\u002Fblog-img.774352199.xyz\u002FqfxB0h.webp","\u002Ffiddling\u002Fxiaomi17-root-and-hide-root",{"text":542,"minutes":727,"time":728,"words":729},8.83,529800,1766,6,[732,733,734,735,736],"Xiaomi 17","Bootloader","Android Root","ファームウェア書き換え","Rootの隠蔽","Xiaomi 17を普段使いに：ロック解除、ROM書き込み、root化とroot隠し",{"categories":739,"date":741,"description":742,"image":743,"path":744,"readingTime":745,"recommend":225,"tags":750,"title":755,"type":242},[740],"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":746,"minutes":747,"time":748,"words":749},"13 min read",12.39,743400,2478,[751,752,434,753,754],"MIT 6.5840","MapReduce","RPC","並行プログラミング","6.5840 Lab 1：MapReduce",{"categories":757,"date":758,"description":759,"image":760,"path":761,"readingTime":762,"recommend":225,"tags":766,"title":771,"type":242},[740],"2022-01-16 17:32:00","MapReduceは、大規模なデータセットの処理を簡単にするための効率的な並列計算モデルです。利用者はMapとReduceという2つの主要な関数を定義することで、複雑なタスクを簡単な操作に分解できます。データの分配やタスクの割り当てはフレームワークが自動で管理するため、開発者は低レベルの細部に気を取られず、アルゴリズムそのものに集中できます。分散システムで広く使われていることからも、その柔軟性と実用性が分かります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FApIDdC.webp","\u002Fnotes\u002F65840\u002Fmapreducepaper",{"text":542,"minutes":763,"time":764,"words":765},8.085,485100,1617,[752,767,768,769,770],"分散システム","論文ノート","並列計算","耐障害性","MapReduce論文を読む",{"categories":773,"date":774,"description":775,"image":776,"path":777,"readingTime":778,"recommend":225,"tags":782,"title":786,"type":242},[740],"2022-12-16 02:06:10","Lab 2Aでは、Raftのリーダー選出とハートビートを実装し、さまざまな厳しい条件でも任期の交代や選挙が正常に行われるようにします。実習全体は4段階からなり、この後に実装する分散KVストアの土台になります。明示的なロックを使わない設計によって、Raft構造体を簡潔にします。実習の手引きには必要な背景知識が載っていますが、前の実習と比べると参考資料に頼れる部分はほとんどなく、自力で実装することが重視されます。","https:\u002F\u002Fblog-img.774352199.xyz\u002Fc11Uk4.webp","\u002Fnotes\u002F65840\u002Fraftlab2a",{"text":380,"minutes":779,"time":780,"words":781},17.515,1050900,3503,[751,783,434,784,785],"Raft","リーダー選出","分散合意","6.5840 Lab 2A：リーダー選出",{"categories":788,"date":789,"description":790,"image":791,"path":792,"readingTime":793,"recommend":225,"tags":798,"title":800,"type":242},[740],"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":794,"minutes":795,"time":796,"words":797},"30 min read",29.245,1754700,5849,[783,785,799,768],"ログ複製","Raft論文を読む",{"categories":802,"date":804,"description":805,"image":806,"path":807,"readingTime":808,"recommend":812,"tags":813,"title":817,"type":242},[803],"projects","2021-11-27 14:43:00","MYDBは、データベースの基本原理を学び、実装してみるための個人プロジェクトです。空き時間を使い、半月あまりかけて作りました。大学のデータベースシステムの授業で基礎には触れたものの、インターン中は授業を口実にサボってばかりでした。面接で正直に答えても大きな問題にはなりませんでしたが、それをきっかけに自分の知識を見直し、実際に手を動かして学ぼうと考えるようになりました。そうして生まれたのがこのプロジェクトです。","https:\u002F\u002Fblog-img.774352199.xyz\u002Fxfci2J.webp","\u002Fprojects\u002Fmydb\u002Fmydb0",{"text":542,"minutes":809,"time":810,"words":811},8.03,481800,1606,1,[814,682,815,816],"MYDB","データベース実装","データベースアーキテクチャ","MYDB 0. プロジェクト構成と、先に伝えておきたいこと",{"categories":819,"date":820,"description":821,"image":822,"path":823,"readingTime":824,"recommend":225,"tags":829,"title":832,"type":242},[803],"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":825,"minutes":826,"time":827,"words":828},"8 min read",7.42,445200,1484,[814,682,830,831],"トランザクション管理","XID","MYDB 1. まずはシンプルなTMから",{"categories":834,"date":835,"description":836,"image":837,"path":838,"readingTime":839,"recommend":225,"tags":843,"title":847,"type":242},[803],"2021-12-25 18:26:00","MYDBはMySQLに似たC\u002FS構成を採用し、複数のクライアントがソケットでサーバーへ接続してSQLを実行し、結果を受け取れます。通信には専用のバイナリー形式を使いますが、実装を簡単にするならプレーンテキストも選択肢です。サーバーとクライアントの基本的な転送構造によって、データのやり取りと処理を行います。","https:\u002F\u002Fblog-img.774352199.xyz\u002FPAHrUZ.webp","\u002Fprojects\u002Fmydb\u002Fmydb10",{"text":413,"minutes":840,"time":841,"words":842},5.76,345600,1152,[814,682,844,845,846],"Socket","クライアントサーバー構成","通信プロトコル","MYDB 10. サーバー・クライアントの実装と通信プロトコル",{"categories":849,"date":850,"description":851,"image":852,"path":853,"readingTime":854,"recommend":225,"tags":858,"title":862,"type":242},[803],"2021-11-30 23:18:00","データマネージャー（DM）は上位モジュールとファイルシステムをつなぎ、ページとキャッシュを管理しながら、データの安全性と復旧を支えます。キャッシュには従来のLRUではなく参照カウント方式を採用し、汎用性と効率を高めて、この先のデータ操作の土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FWdIGoG.webp","\u002Fprojects\u002Fmydb\u002Fmydb2",{"text":227,"minutes":855,"time":856,"words":857},10.395,623700,2079,[814,682,859,860,861],"参照カウント","キャッシュ設計","共有メモリ","MYDB 2. 参照カウント方式のキャッシュ基盤と共有バイト配列",{"categories":864,"date":865,"description":866,"image":867,"path":868,"readingTime":869,"recommend":225,"tags":873,"title":876,"type":242},[803],"2021-12-05 15:28:00","DMはファイルシステムをページとして抽象化し、ページ単位で読み書きとキャッシュを行います。データページのデフォルトサイズは8Kで、大量の書き込みではサイズの調整によって性能を高められます。実装済みの汎用キャッシュ基盤を使い、ここではページ構造を具体的に定義して、効率よくページを管理します。","https:\u002F\u002Fblog-img.774352199.xyz\u002FjlFC4E.webp","\u002Fprojects\u002Fmydb\u002Fmydb3",{"text":825,"minutes":870,"time":871,"words":872},7.14,428400,1428,[814,682,874,875],"データページ","キャッシュ管理","MYDB 3. データページのキャッシュと管理",{"categories":878,"date":879,"description":880,"image":881,"path":882,"readingTime":883,"recommend":225,"tags":887,"title":890,"type":242},[803],"2021-12-08 22:55:00","MYDBでは、クラッシュ後にデータを復旧できるよう、ログファイルが重要な役割を担います。DMは下位のデータを操作するたびにログを生成・記録し、連続したログ列を作ります。チェックサムと各操作の記録を含む所定のバイナリー形式で保存することで、再起動時にデータの状態を正確に再構築し、整合性と完全性を保ちます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FTRcbsj.webp","\u002Fprojects\u002Fmydb\u002Fmydb4",{"text":746,"minutes":884,"time":885,"words":886},12.685,761100,2537,[814,682,888,889],"データベースログ","クラッシュリカバリ","MYDB 4. ログファイルと復旧戦略",{"categories":892,"date":893,"description":894,"image":895,"path":896,"readingTime":897,"recommend":225,"tags":901,"title":904,"type":242},[803],"2021-12-11 15:16:00","ページインデックスはDM層の重要な構成要素です。各ページの空き容量をキャッシュすることで挿入処理を効率化し、上位モジュールが長い探索をせずに適切なページを素早く見つけられるようにします。実装ではデータ項目（DataItem）の抽象化とも密接に連携し、データベースの効率的な動作を支えます。","https:\u002F\u002Fblog-img.774352199.xyz\u002F22PSG1.webp","\u002Fprojects\u002Fmydb\u002Fmydb5",{"text":362,"minutes":898,"time":899,"words":900},9.86,591600,1972,[814,682,902,903],"ページインデックス","データ管理","MYDB 5. ページインデックスとDMの実装",{"categories":906,"date":907,"description":908,"image":909,"path":910,"readingTime":911,"recommend":225,"tags":915,"title":919,"type":242},[803],"2021-12-18 14:58:00","VMは二相ロックでスケジュールの直列化可能性を保証し、多版型同時実行制御（MVCC）を導入して読み取りと書き込みの相互ブロックを解消します。また、データベース操作の競合を定義し、特に更新と読み取りの関係を整理することで、トランザクションの分離レベルを理解する土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002F8YzotA.webp","\u002Fprojects\u002Fmydb\u002Fmydb6",{"text":559,"minutes":912,"time":913,"words":914},14.665,879900,2933,[814,682,916,917,918],"MVCC","トランザクション分離","二相ロック","MYDB 6. レコードのバージョンとトランザクション分離",{"categories":921,"date":922,"description":923,"image":924,"path":925,"readingTime":926,"recommend":225,"tags":930,"title":933,"type":242},[803],"2021-12-23 21:20:00","VMでは、MVCCに伴うバージョンの飛び越しとデッドロックに対処する必要があります。MYDBはトランザクションに印を付けるだけで取り消しやロールバックを行い、abortedなトランザクションのデータがほかへ影響しないようにします。この設計により並行処理の効率と信頼性を高め、従来の2PLで起こりがちなデッドロックを避けて、システム全体の安定性と性能を向上させます。","https:\u002F\u002Fblog-img.774352199.xyz\u002FBF3yDW.webp","\u002Fprojects\u002Fmydb\u002Fmydb7",{"text":429,"minutes":927,"time":928,"words":929},11.32,679200,2264,[814,682,931,932],"デッドロック検出","バージョン管理","MYDB 7. デッドロック検出とVMの実装",{"categories":935,"date":936,"description":937,"image":938,"path":939,"readingTime":940,"recommend":225,"tags":944,"title":947,"type":242},[803],"2021-12-24 21:01:00","MYDBはB+木によるクラスタ化インデックスを実装します。IMはバージョンマネージャー（VM）を経由せず、データマネージャー（DM）と直接やり取りし、インデックスデータをデータベースファイルへ直接書き込みます。この章では二分木インデックスの構造を詳しく説明し、葉フラグ、キー数、兄弟ノードの識別子など、インデックス検索の基盤となる要素を扱います。","https:\u002F\u002Fblog-img.774352199.xyz\u002Ff92X4o.webp","\u002Fprojects\u002Fmydb\u002Fmydb8",{"text":253,"minutes":941,"time":942,"words":943},6.53,391800,1306,[814,682,945,946],"B+木","データベースインデックス","MYDB 8. インデックス管理",{"categories":949,"date":950,"description":951,"image":952,"path":953,"readingTime":954,"recommend":225,"tags":958,"title":961,"type":242},[803],"2021-12-25 15:44:00","テーブルマネージャー（TBM）は、フィールドとテーブルの構造を管理します。ParserはSQL風の文を構造化して解析し、文に含まれる情報を対応するクラスへまとめることで、その後の操作を簡単にします。この章ではMYDBのSQL構文も紹介し、管理処理全体を理解する土台を作ります。","https:\u002F\u002Fblog-img.774352199.xyz\u002FzOMyv5.webp","\u002Fprojects\u002Fmydb\u002Fmydb9",{"text":825,"minutes":955,"time":956,"words":957},7.99,479400,1598,[814,682,959,960],"SQL解析","テーブル管理","MYDB 9. フィールドとテーブルの管理",{"id":963,"node_id":964,"name":965,"full_name":119,"private":218,"owner":966,"html_url":112,"description":984,"fork":218,"url":985,"forks_url":986,"keys_url":987,"collaborators_url":988,"teams_url":989,"hooks_url":990,"issue_events_url":991,"events_url":992,"assignees_url":993,"branches_url":994,"tags_url":995,"blobs_url":996,"git_tags_url":997,"git_refs_url":998,"trees_url":999,"statuses_url":1000,"languages_url":1001,"stargazers_url":1002,"contributors_url":1003,"subscribers_url":1004,"subscription_url":1005,"commits_url":1006,"git_commits_url":1007,"comments_url":1008,"issue_comment_url":1009,"contents_url":1010,"compare_url":1011,"merges_url":1012,"archive_url":1013,"downloads_url":1014,"issues_url":1015,"pulls_url":1016,"milestones_url":1017,"notifications_url":1018,"labels_url":1019,"releases_url":1020,"deployments_url":1021,"created_at":1022,"updated_at":1023,"pushed_at":1024,"git_url":1025,"ssh_url":1026,"clone_url":1027,"svn_url":112,"homepage":1028,"size":1029,"stargazers_count":1030,"watchers_count":1030,"language":1031,"has_issues":223,"has_projects":218,"has_downloads":218,"has_wiki":223,"has_pages":223,"has_discussions":223,"forks_count":1032,"mirror_url":225,"archived":218,"disabled":218,"open_issues_count":481,"license":1033,"allow_forking":223,"is_template":218,"web_commit_signoff_required":218,"has_pull_requests":223,"pull_request_creation_policy":1039,"topics":1040,"visibility":983,"forks":1032,"open_issues":481,"watchers":1030,"default_branch":1047,"temp_clone_token":225,"custom_properties":1048,"organization":1049,"network_count":1032,"subscribers_count":1050},799128627,"R_kgDOL6G8Mw","OpenWrt-nikki",{"login":967,"id":968,"node_id":969,"avatar_url":970,"gravatar_id":206,"url":971,"html_url":972,"followers_url":973,"following_url":974,"gists_url":975,"starred_url":976,"subscriptions_url":977,"organizations_url":978,"repos_url":979,"events_url":980,"received_events_url":981,"type":982,"user_view_type":983,"site_admin":218},"nikkinikki-org",198439251,"O_kgDOC9PxUw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F198439251?v=4","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org","https:\u002F\u002Fgithub.com\u002Fnikkinikki-org","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Ffollowers","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Ffollowing{\u002Fother_user}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Fgists{\u002Fgist_id}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Fstarred{\u002Fowner}{\u002Frepo}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Fsubscriptions","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Forgs","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Frepos","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Fevents{\u002Fprivacy}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fnikkinikki-org\u002Freceived_events","Organization","public","Transparent Proxy with Mihomo on OpenWrt.","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fforks","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fkeys{\u002Fkey_id}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fcollaborators{\u002Fcollaborator}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fteams","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fhooks","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fissues\u002Fevents{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fevents","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fassignees{\u002Fuser}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fbranches{\u002Fbranch}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Ftags","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fgit\u002Fblobs{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fgit\u002Ftags{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fgit\u002Frefs{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fgit\u002Ftrees{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fstatuses\u002F{sha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Flanguages","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fstargazers","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fcontributors","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fsubscribers","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fsubscription","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fcommits{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fgit\u002Fcommits{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fcomments{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fissues\u002Fcomments{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fcontents\u002F{+path}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fcompare\u002F{base}...{head}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fmerges","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002F{archive_format}{\u002Fref}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fdownloads","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fissues{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fpulls{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fmilestones{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fnotifications{?since,all,participating}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Flabels{\u002Fname}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Freleases{\u002Fid}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnikkinikki-org\u002FOpenWrt-nikki\u002Fdeployments","2024-05-11T08:59:35Z","2026-09-20T13:44:52Z","2026-09-20T00:39:23Z","git:\u002F\u002Fgithub.com\u002Fnikkinikki-org\u002FOpenWrt-nikki.git","git@github.com:nikkinikki-org\u002FOpenWrt-nikki.git","https:\u002F\u002Fgithub.com\u002Fnikkinikki-org\u002FOpenWrt-nikki.git","https:\u002F\u002Fnikkinikki.pages.dev",1571,5283,"JavaScript",582,{"key":1034,"name":1035,"spdx_id":1036,"url":1037,"node_id":1038},"gpl-3.0","GNU General Public License v3.0","GPL-3.0","https:\u002F\u002Fapi.github.com\u002Flicenses\u002Fgpl-3.0","MDc6TGljZW5zZTk=","all",[1041,1042,1043,238,1044,1045,1046],"clash","luci-app","luci-app-nikki","nikki","openwrt","transparent-proxy","main",{},{"login":967,"id":968,"node_id":969,"avatar_url":970,"gravatar_id":206,"url":971,"html_url":972,"followers_url":973,"following_url":974,"gists_url":975,"starred_url":976,"subscriptions_url":977,"organizations_url":978,"repos_url":979,"events_url":980,"received_events_url":981,"type":982,"user_view_type":983,"site_admin":218},27,{"id":1052,"node_id":1053,"name":156,"full_name":160,"private":218,"owner":1054,"html_url":154,"description":1071,"fork":218,"url":1072,"forks_url":1073,"keys_url":1074,"collaborators_url":1075,"teams_url":1076,"hooks_url":1077,"issue_events_url":1078,"events_url":1079,"assignees_url":1080,"branches_url":1081,"tags_url":1082,"blobs_url":1083,"git_tags_url":1084,"git_refs_url":1085,"trees_url":1086,"statuses_url":1087,"languages_url":1088,"stargazers_url":1089,"contributors_url":1090,"subscribers_url":1091,"subscription_url":1092,"commits_url":1093,"git_commits_url":1094,"comments_url":1095,"issue_comment_url":1096,"contents_url":1097,"compare_url":1098,"merges_url":1099,"archive_url":1100,"downloads_url":1101,"issues_url":1102,"pulls_url":1103,"milestones_url":1104,"notifications_url":1105,"labels_url":1106,"releases_url":1107,"deployments_url":1108,"created_at":1109,"updated_at":1110,"pushed_at":1111,"git_url":1112,"ssh_url":1113,"clone_url":1114,"svn_url":154,"homepage":225,"size":1115,"stargazers_count":1116,"watchers_count":1116,"language":1031,"has_issues":223,"has_projects":223,"has_downloads":218,"has_wiki":223,"has_pages":218,"has_discussions":218,"forks_count":1117,"mirror_url":225,"archived":223,"disabled":218,"open_issues_count":210,"license":1118,"allow_forking":223,"is_template":218,"web_commit_signoff_required":218,"has_pull_requests":223,"pull_request_creation_policy":1039,"topics":1119,"visibility":983,"forks":1117,"open_issues":210,"watchers":1116,"default_branch":1047,"temp_clone_token":225,"network_count":1117,"subscribers_count":1120},748894834,"R_kgDOLKM6cg",{"login":1055,"id":1056,"node_id":1057,"avatar_url":1058,"gravatar_id":206,"url":1059,"html_url":1060,"followers_url":1061,"following_url":1062,"gists_url":1063,"starred_url":1064,"subscriptions_url":1065,"organizations_url":1066,"repos_url":1067,"events_url":1068,"received_events_url":1069,"type":1070,"user_view_type":983,"site_admin":218},"asvow",88471740,"MDQ6VXNlcjg4NDcxNzQw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F88471740?v=4","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow","https:\u002F\u002Fgithub.com\u002Fasvow","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Ffollowers","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Ffollowing{\u002Fother_user}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Fgists{\u002Fgist_id}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Fstarred{\u002Fowner}{\u002Frepo}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Fsubscriptions","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Forgs","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Frepos","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Fevents{\u002Fprivacy}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fasvow\u002Freceived_events","User","LuCI support for tailscale","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fforks","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fkeys{\u002Fkey_id}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fcollaborators{\u002Fcollaborator}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fteams","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fhooks","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fissues\u002Fevents{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fevents","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fassignees{\u002Fuser}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fbranches{\u002Fbranch}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Ftags","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fgit\u002Fblobs{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fgit\u002Ftags{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fgit\u002Frefs{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fgit\u002Ftrees{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fstatuses\u002F{sha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Flanguages","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fstargazers","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fcontributors","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fsubscribers","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fsubscription","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fcommits{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fgit\u002Fcommits{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fcomments{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fissues\u002Fcomments{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fcontents\u002F{+path}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fcompare\u002F{base}...{head}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fmerges","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002F{archive_format}{\u002Fref}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fdownloads","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fissues{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fpulls{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fmilestones{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fnotifications{?since,all,participating}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Flabels{\u002Fname}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Freleases{\u002Fid}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fasvow\u002Fluci-app-tailscale\u002Fdeployments","2024-01-27T01:11:19Z","2026-09-16T14:30:06Z","2025-05-09T09:28:22Z","git:\u002F\u002Fgithub.com\u002Fasvow\u002Fluci-app-tailscale.git","git@github.com:asvow\u002Fluci-app-tailscale.git","https:\u002F\u002Fgithub.com\u002Fasvow\u002Fluci-app-tailscale.git",120,315,68,{"key":1034,"name":1035,"spdx_id":1036,"url":1037,"node_id":1038},[],0,1789914057159]