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