Android移行一ヶ月記
19 min頻繁に機種変更を繰り返してきた私が、一加(OnePlus)からiPhoneへと移行し、最初は試行錯誤の楽しみを味わいながらも次第にエコシステムへの依存へと変わっていった。最近、彼女の勧めでOppo Find X8 Ultraを手に入れ、主に写真撮影の体験向上を目的としている。Appleのエコシステムに浸りつつも、アプリの移行問題に直面し、Androidのアプリ環境がまだまだ不均一であることを痛感。代替アプリ探しに苦労したこの一ヶ月の移行体験は、異なるプラットフォーム間の摩擦と適応を実感させてくれた。
AstroでのGoogle Analytics(タグマネージャー)導入
4 minブログをAstroフレームワークに移行した後、従来のGoogle Analytics導入方法はパフォーマンス面で適さなくなりました。headタグに直接JSコードを追加してイベントを送信することも可能ですが、ページのパフォーマンスに影響を与えます。Astroの高いパフォーマンスを維持するために、partytown技術を用いてスクリプトをメインスレッドから切り離し、読み込みプロセスに影響を与えないようにしました。その上で、デモコードを組み合わせてGoogle Analyticsのシームレスな導入に成功し、パフォーマンスとデータ解析のバランスを実現しました。
紀行文:近畿地方(2025年4月)
10 min4月のある週末、同僚が言った、「日本に行こう」と。こうして、私たちは日本へ行った。
上海と杭州の遠隔ネットワーク構築記録
14 min仕事の異動に伴い、彼女が北京から上海へ引っ越し、ついでに光回線の設置も行いました。電信の500M回線を選んだものの、杭州の1000M回線よりも料金が高く、少々困惑しました。そんな状況の中、上海での透明プロキシ設定、一部トラフィックを杭州経由で出口とし、両都市のLAN間通信を実現するための跨都市ネットワーク環境を構築することにしました。杭州のネットワーク構成は比較的シンプルで、ソフトルーターと無線APの組み合わせにより、日常的なトラフィックを自宅に戻すシステムを構築し、今後のネットワーク課題に備えています。
My heart beats for U —— 心拍数同期 Grafana 表示
4 minAppleのヘルスケアの心拍数データを定期的にサーバーへ同期し、Grafanaで可視化表示することで、直感的な健康モニタリングを実現しました。Health Auto ExportアプリのRestful APIを利用して心拍情報を指定のHTTPインターフェースに送信し、InfluxDBに保存、最終的にGrafanaで見やすいダッシュボードとして表示。個人の心拍変動を追跡・分析しやすくしています。
構文解析における型名と変数名の曖昧性解消
15 min構文解析の過程で、ユーザー定義の型名と通常の変数名が混同される問題は大きな課題となっています。特に `a*b;` のような文は、数学的な式として解釈される場合もあれば、型宣言として扱われる場合もあります。この曖昧さは文法規則の設計に起因し、特に型指定子に関わる部分で変数名が型名と誤認されることがあり、コードの正確性と可読性に影響を及ぼします。初期化されていない変数定義が一般的になるにつれて、この問題はソースコード内でより顕著になっています。
VPSでWarpを使った特定出口のIPv6分流設定
4 minある平凡な午後、Telegramのプッシュ通知が新しいプランへの熱意を呼び起こしました。電信CN2直結、2.5G帯域幅の割引は非常に魅力的です。このプランはIPv6を標準搭載しており、ストリーミングサービスのアンロックに適していますが、すべてのトラフィックをWarp経由にする必要はありません。以前使っていたスクリプトは便利でしたが、速度やトラフィックの振り分けに課題があり、より柔軟な解決策が求められています。
VitePressで動的なつぶやき機能を実装する
24 min動的なブログを構築する際、つぶやき機能を追加するとユーザー体験が大幅に向上します。静的ブログの煩雑な手順に比べ、この機能はユーザーがいつでもどこでも短い思考を共有でき、投稿の心理的負担を軽減します。CloudFlare Workersを利用してバックエンドロジックを実装し、KVストレージと組み合わせることで、開発者はつぶやき内容を簡単に管理可能です。フロントエンドはVitePressフレームワークとVueコンポーネントの埋め込みにより、これらの動的情報を素早く表示し、ブログに生き生きとしたインタラクティブ性を加えます。
OPNsenseでの透明プロキシ+分流の実現
13 minOPNsenseはオープンソースのファイアウォール兼ルーティングシステムで、美しいユーザーインターフェースと充実した機能により注目を集めています。様々なルーティング構成を経て、透明プロキシとトラフィックの分流における強力な可能性が徐々に認識されました。BGPによる分流転送方式を組み合わせることで、OPNsenseはより高い安全性と安定性を提供し、理想的なネットワーク管理ソリューションとなっています。特にIPリストの自動更新機能により、ネットワーク管理が一層便利になっています。
BGPに基づくより正確な国内外IP分流
6 minBGPに基づく国内外IP分流の方法で、透明プロキシの効率と精度を向上させました。国外IPにFakeIPマークを付けることで、メインルーターがよりスマートにトラフィックを分流し、ネットワーク接続のスムーズさを確保します。sing-boxのDNSモジュール設定も最適化され、DNSリクエスト処理時により柔軟かつ効率的になり、全体のネットワーク体験をさらに向上させています。
バイトで3年間働きながらも一定の精神的健康を保つことは、実は完全に不可能ではない
19 minバイトで3年間働き、時間の流れがまるで見えないうちに加速しているかのように感じられます。急速に変化する環境に身を置きながらも、わずかな心理的バランスを見つけることができました。入社当時の戸惑いを振り返ると、若き日の自分が杭州八方城のバルコニーで遠くの山々を眺め、未来に期待と好奇心を抱いていたのを思い出します。時間が経つにつれて、職場での挑戦と成長が交錯し、忙しい中でも自分のリズムを見つけることを学んだ、独特で豊かな経験となりました。
慢性胃炎治療の道のり
6 min慢性胃炎の治療の道は波乱に満ちており、幼少期の胃腸不調から大学時代の奇跡的な回復、そして社会人生活での放縦と再発を経て、胃の痛みが日常の一部となってしまいました。若い頃の症状はしばらくの間奇跡的に消えましたが、夜更かしや飲酒の習慣が悪化するにつれて胃の警告が再び鳴り始め、頻繁な吐き気や胃もたれが生活を耐え難いものにしました。何度もの医療検査と自己反省を経て、ようやくこの長く複雑な治療過程を真剣に受け止め始めました。
FakeIPを用いた透明プロキシの分流方法
13 minFakeIPを活用した透明プロキシの分流ソリューションは、従来のバイパスルーターにおける単一障害点、性能不足、複雑なポートマッピング問題を解決することを目的としています。新たなプロキシコアであるsing-boxを導入することで、転送性能の向上と設定の簡素化を実現しました。sing-boxはより多彩なプロトコルをサポートし、clashよりも明らかに最適化効果が優れており、高効率な透明プロキシの実現に最適な選択肢となっています。clashでも同様の実装は可能ですが、sing-boxの導入によりユーザーはより柔軟な体験を享受できます。
バイパスルーターのポートフォワーディング不具合の解決
6 minバイパスルーターを使った設定の場合、メインルーターのポートフォワーディングが無効になることがよくあります。これはバイパスルーターのゲートウェイ設定がトラフィックの転送経路を変えるためで、元々メインルーターに依存していたポートフォワーディングが正常に機能しなくなるためです。ゲートウェイの主な役割はアドレス変換を行い、内部ネットワークのトラフィックを外部ネットワークへ転送することです。各内部ネットワーク機器は外部と通信するために必ずゲートウェイを設定する必要があります。この仕組みを理解することで、ポートフォワーディングの不具合解決に役立ちます。
Debian バイパスルーター構成案
18 minDebian バイパスルーター構成案は、OpenWRTやLuCIへの依存を脱却し、より安定かつ柔軟な選択肢をユーザーに提供します。Debian上で直接設定を行うことで、システムの制御権を高め、GUIによる制限や不安定さを回避できます。一般的なバイパスルーター構成と比べて、Debian方式は透明プロキシの設定をより信頼性の高いものにし、性能と効率を追求するユーザーに新たな可能性をもたらします。
GFWの原理考察
24 minGFWの動作メカニズムは単なる出口ゲートウェイの監視ではなく、バイパス監視技術によって国際トラフィックを検査しています。この方法により、すべての出入国IPパケットがGFWクラスターに複製され、深い分析とフィルタリングが行われます。この点を理解することは、VPN 方法の研究に不可欠であり、検閲の具体的な経路と技術手段を明らかにします。GFWのネットワークトポロジーを深く探ることは、より効果的にネットワーク検閲に対処し回避する助けとなります。
2024年の学習計画
1 min2024年の学習計画は明確かつ具体的であり、目標は日本語でN2レベルに到達すること、SICPとTAPLの学習を完了すること、POSIX準拠のカーネルを完全に実装するためにオペレーティングシステムの知識を深めること、そしてブログのテーマを更新することです。これらの目標は挑戦的であると同時に、個人の成長とスキル向上に向けた明確な指針を提供します。
RISC-V ツールチェーンとエミュレーター(emulator)のインストール
4 minRISC-V ツールチェーンをインストールする際、まず riscv-gnu-toolchain のソースコードを取得する必要があります。`--depth=1` オプションを付けて clone することを推奨し、ダウンロードサイズを削減できます。インストール中は README の Prerequisites セクションをよく確認し、前提となる依存関係が正しくインストールされていることを確認してください。Debian システムでは簡単なコマンドで必要な依存パッケージをインストールでき、ツールチェーンの構築をスムーズに行えます。
プログラミング言語についての雑談
31 min新しいプログラミング言語を設計することは、挑戦的でありながらも非常に面白い作業です。複雑なコンパイラ理論や機能の実装を簡素化し、コードがコンピュータシステム内でどのように動作するかに焦点を当てることで、プログラミング言語の構築過程をより明確に理解できます。RISC-VI命令セットを基盤に言語設計の低レイヤーアーキテクチャを探求し、コンピュータシステムの階層構造と仮想マシンモデルを明らかにします。これは単なる技術的な議論にとどまらず、プログラミング言語の本質に対する深い考察でもあります。
失敗に終わったプロジェクト実践——春節七日間の楽しみ(起動せず)
13 min春節の連休中、ひらめきがひそかに訪れました。高速鉄道の中で偶然、裸機上でGoプログラムを動かす記事を読み、低レベルのシステムインターフェースへの探求心が刺激されました。著者の成功事例と実装は、高級言語とOSの融合の可能性に胸を躍らせます。関連研究を深めるうちに、このコンセプトは既に先例があることを知り、その熱意は徐々に積み重なり、期待に満ちたものの叶わなかったプロジェクト実践へと発展しました。
6.5840 実験 2a —— リーダー選出
18 min実験 2a は Raft アルゴリズムにおけるリーダー選出とハートビート機構の実装に焦点を当てており、さまざまな極端な状況下でも正常にリーダー交代と選挙が行われることを保証することを目的としています。この実験は後続の分散KVストレージ実装の基礎となり、4つのステップに分かれており、ロックフリー版の設計により Raft 構造体の複雑さを軽減しています。実験マニュアルは必要な背景資料を提供しますが、前回の実験に比べてほとんど参考資料に依存せず、独立して実装する重要性を強調しています。
Raft 論文読解
29 minRaft はログ複製の効率を高めることを目的としたコンセンサスアルゴリズムであり、特に複数台のクラスタ環境に適していて、一部のマシンが故障してもサービスを提供し続けることを保証します。このアルゴリズムは状態機械の複製モデルを用い、ログに指令の順序を記録することで、クラスタ内の各マシンが一致した状態に到達できるようにします。論文『In Search of an Understandable Consensus Algorithm』では Raft の設計理念や Paxos との比較が深く掘り下げられており、その理解しやすさが強調されており、信頼性の高い大規模ソフトウェアシステム構築の基盤を提供しています。本記事はこの論文の読解ノートを記録し、その核心概念と応用の理解を助けることを目的としています。
golangで異なる型の構造体間の深いコピーをサポートする
4 minシステムのリファクタリング過程で、階層化アーキテクチャにおける異なるエンティティ間の変換問題に直面し、深いコピーが課題となりました。商品を例にとると、ビュー層の商品VO、ドメイン層のエンティティ、ストレージ層のPO構造体は似ていますが、データ型の微妙な違いなどがあり、直接の変換が複雑で面倒です。そこでリフレクションを使って汎用的な変換メソッドを実装し、このプロセスを簡素化し、煩雑なアセンブラメソッドを減らし、コードの保守性と柔軟性を向上させることを目指しました。
Javaにおけるthisキーワードがコンパイル時定数伝播最適化を無効化する問題について
4 minJavaでは、`this`キーワードを使用すると、コンパイラによる定数の最適化が失敗することがあります。コード例では、`ab1`と`ab2`は同じfinal静的変数`s`を参照しているように見えますが、比較結果は異なります。`ab1`は静的変数を直接参照して文字列連結を行うのに対し、`ab2`は`this`キーワードを介しているため、コンパイラは同じ定数伝播の最適化を行えず、文字列比較の結果に影響を与えています。この現象は、Javaにおける微妙な文法の違いがコンパイル時の挙動に変化をもたらすことを示しています。
『三体』における「大多数の人々」
18 min『三体』において、劉慈欣は壮大な歴史叙述を通じて、個人と集団の複雑な関係を探求している。彼の西洋式民主主義への疑念は一貫しており、多数派の自己決定に対する不安を反映している。物語に登場する多くの英雄たちの努力と犠牲は、最終的には歴史の大河の中で取るに足らないものとなり、歴史的大変動に直面した個人の無力感を際立たせている。物語は文化大革命の混乱から始まり、エリートと平凡な大衆の深刻な対立を暗示し、人間性と社会に対する深い考察を映し出している。
6.5840 実験一 —— MapReduce
12 min実験一の目標は MapReduce システムを実装することで、master と worker の二つの主要な部分に分かれています。この過程は golang の RPC と並行プログラミングの理解が求められ、同時に MapReduce のフローを深く理解する必要があります。実験では mutex ロックを使ったバージョンから、より洗練された channel ベースのロックフリー版まで二つの実装を経験しました。後者の設計はより簡潔で明快です。実験の要点は関連ドキュメント、特にフローチャートと説明を丁寧に読むことにあります。
MapReduce 論文読解
8 minMapReduce は大規模データセットの処理を簡素化することを目的とした効率的な並列計算モデルです。Map と Reduce という二つの重要な関数を定義することで、ユーザーは複雑なタスクを簡単な操作に分解できます。このモデルのアーキテクチャはデータの分配やタスクのスケジューリングを自動的に管理し、開発者はアルゴリズム自体に専念できるように設計されています。この手法は分散システムにおいて広く応用され、その柔軟性と実用性の高さを示しています。
CSAPP LAB 環境構築
10 minCSAPPを学ぶ過程で、実験の重要性は無視できません。しかし、多くの学生がLinux環境の構築で様々なトラブルに遭遇し、特に仮想マシンを使う場合はインストールエラーや互換性問題、ネットワーク接続の不具合などが頻発し、挫折しがちです。これらの障害を解決するために、WSL(Windows Subsystem for Linux)は理想的な選択肢となります。特にWindows 10 バージョン2004以降のユーザーに適しており、仮想マシンの複雑さや性能のボトルネックを回避しつつ、よりシンプルで直接的にLinux環境を体験できます。
MYDB 10. サーバー・クライアントの実装と通信規則
6 minMYDBはC/S構造を採用し、MySQLに似ており、複数のクライアントがソケットを通じてサーバーに接続し、SQLクエリを実行して結果を返します。通信は特殊なバイナリ形式を用いていますが、実装を簡素化するためにプレーンテキストでの送信も選択可能です。サーバーとクライアント間の基本的な伝送構造により、データの有効なやり取りと処理が保証されています。
MYDB 9. フィールドとテーブル管理
9 minテーブルマネージャ(TBM)の役割はフィールドとテーブル構造の管理です。SQLに似た文の構造化解析を通じて、Parserは文の情報を対応するクラスにカプセル化し、その後の操作を簡素化します。本章ではMYDBで使用されるSQL文の構文も紹介し、管理全体の理解の基礎を提供します。
MYDB 8. インデックス管理
7 minMYDB は B+ 木に基づくクラスタ化インデックスを実装しています。IM(Index Manager)は直接データ管理(DM)とやり取りし、バージョン管理(VM)層を省略することで、インデックスデータを直接データベースファイルに書き込むことを保証しています。本章では二分木インデックスの構造を詳述し、葉フラグ、キー数、兄弟ノード識別子などの基本要素を含むノード構成を解説し、インデックス検索の基盤を提供しています。
MYDB 7. デッドロック検出と VM の実装
12 minVM は MVCC によるバージョンジャンプやデッドロック問題を処理する必要があります。シンプルなマーク方式により、MYDB はトランザクションの取り消しやロールバックを容易に行い、中止されたトランザクションのデータが他のトランザクションに影響を与えないことを保証します。この設計により、トランザクションは並行処理時により効率的かつ信頼性高く動作し、従来の 2PL 手法でよく見られるデッドロックリスクを回避し、システム全体の安定性と性能を向上させています。
MYDB 6. レコードのバージョンとトランザクションの分離レベル
16 minVMは2フェーズロックプロトコルによりスケジューリングシーケンスの直列化可能性を保証し、読み書きのブロック問題を解消するために多版本並行制御(MVCC)を導入しています。また、データベース操作における競合を定義し、特に更新操作と読み取り操作の相互影響に注目し、トランザクション間の分離レベルの理解の基礎を築いています。
MYDB 5. ページインデックスとDMの実装
11 minページインデックスはDM層の重要な構成要素であり、各ページの空きスペースをキャッシュすることで挿入操作を最適化します。この仕組みにより上位モジュールは適切なページを迅速に特定でき、長い検索過程を避けてデータ処理の効率を向上させます。実装面では、ページインデックスはデータ項目(DataItem)の抽象と密接に結びつき、データベースの高効率な運用を支えています。
MYDB 4. ログファイルとリカバリ戦略
13 minMYDB の設計において、ログファイルは極めて重要な役割を果たし、クラッシュ後のデータ復旧を確実にします。DM 層は基盤データに対する操作のたびにログを生成・記録し、連続したログチェーンを形成します。これらのログは特定のバイナリ形式で保存され、チェックサムや各操作記録を含み、システム再起動時に正確にデータ状態を再構築し、一貫性と完全性を維持します。
MYDB 3. データページのキャッシュと管理
8 minDMモジュールはファイルシステムをページ単位に抽象化し、その単位でデータの読み書きとキャッシュを行います。デフォルトのデータページサイズは8Kに設定されており、高負荷時の書き込み性能向上に寄与します。既に実装済みの汎用キャッシュフレームワークを活用し、次にページ構造の具体的な定義に注力し、高効率なページキャッシュ管理を実現します。
MYDB 2. 参照カウントキャッシュフレームワークと共有メモリアレイ
10 minデータマネージャ(DM)は上位モジュールとファイルシステムの橋渡し役を担い、ページ管理とキャッシュ管理を行いながら、データの安全性と復旧能力を確保します。特にキャッシュ戦略においては、DMは従来のLRUではなく参照カウント方式を採用し、キャッシュの汎用性と効率性を高め、後続のデータ操作の基盤を築いています。
MYDB 1. 最もシンプルな TM から始める
8 minMYDB では、トランザクションの管理は XID ファイルによって実現されており、各トランザクションには 1 から始まる一意の XID が割り当てられています。XID 0 はスーパートランザクションとして定義され、その状態は常にコミット済みです。TransactionManager はこのファイルを管理し、トランザクションの三つの状態(アクティブ、コミット済み、中止)を記録します。この仕組みにより、トランザクションの状態を正確に照会・管理でき、システムの安定性と信頼性の基盤を提供しています。
MYDB 0. プロジェクト構成といくつかの言わざるを得ないこと
10 minMYDB プロジェクトは、データベースの基本原理を探求し実装することを目的とした個人作品であり、約半月にわたる努力の末、空き時間を利用して徐々に完成させました。学校でデータベースシステムを学ぶ過程で基礎知識を蓄積しましたが、実習期間中はむしろ“サボり”が多かったです。面接で正直に答えたことは大きな影響を与えませんでしたが、データベースの知識を見直し、自発的に学び実践する決意を促し、このプロジェクト誕生のきっかけとなりました。