
私、macOS XをNintendo Wiiにポート(移植)いたしました。
## Japanese Translation: --- ## 改良された要約 Mac OS X 10.0(Cheetah)は、Nintendo Wii 上でネイティブに動作するようにポートされ、コンソールをキーボード/マウス入力と GUI サポート付きの完全機能型デスクトップへ変貌させました。プロジェクトのコアは、*ppcskel* をベースに最初から書き直されたカスタムブートローダーです。このブートローダーは、Wii の PowerPC 750CL CPU を起動し、メモリレイアウトを設定し、最小限のデバイスツリー(root → cpus → PowerPC,750; memory)を作成します。SD カードから XNU カーネルをロードし、実行中にカーネルバイナリをパッチ(MEM1/MEM2 用の BAT 設定と USB Gecko へのコンソール出力)し、制御を XNU に渡します。 ブートローダーが提供する主要ドライバーは次の通りです: - **SD‑カードドライバー**:Starlet MINI IPC コマンド(IPC_SDMMC_SIZE, READ, WRITE)を介して IOBlockStorageDevice を実装し、XNU が SD カードからルートファイルシステムをマウントできるようにします。 - **フレームバッファドライバー**:0x01700000 に RGB フレームバッファ(640×480 @ 16 bpp)を提供し、Wii のアナログテレビ出力用に YUV へ変換して Mac OS X GUI を実現します。 - **USB サポート**:PCI デバイスのニブ(NintendoWiiHollywoodPCIDevice)を作成し、AppleUSBOHCI をパッチして受け入れさせ、OHCI ドライバーからバイトスワップ処理を除去することでリバースレトルエンディアンハードウェアに対応し、USB キーボード/マウス機能をフル実装します。 ブートローダーは Apple Partition Map を解析し、起動可能なパーティションを一覧表示し、/chosen/memory‑map ノード経由でカーネル拡張を直接メモリにロードできるようにするため、改変されていない Mac OS X インストーラーパーティションからのインストールも可能です。必要なカーネル変更は最小限(BAT 設定、“hollywood” I/O ベース取得、フレームバッファキャッシュ整合性修正)で済み、その他すべてのドライバーはブートローダーが提供します。 この成果は、歴史的にサポートされていなかったプラットフォーム――Nintendo Wii――でも Mac OS X Cheetah をエンドツーエンドで動作させることを示し、ホビイストに低コストのレトロコンソールとして機能するデスクトップコンピュータを提供します。


![**カルマンフィルタを理解する:シンプルなレーダー例題**
カルマンフィルタは、ノイズの多い測定値からシステム(位置・速度など)の状態を推定するアルゴリズムです。
この例では、レーダーセンサーを使って移動物体を追跡する方法を見てみます。
1. **システムモデル**
- 状態ベクトル:\(\mathbf{x}_k = [x_k,\; y_k,\; \dot{x}_k,\; \dot{y}_k]^T\)
- 変換行列(定常速度モデル):
\[
\mathbf{F} =
\begin{bmatrix}
1 & 0 & \Delta t & 0\\
0 & 1 & 0 & \Delta t\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{bmatrix}
\]
- プロセスノイズ共分散:\(\mathbf{Q}\)(加速度不確かさに依存)
2. **測定モデル**
- レーダーは距離 \(r\) と方位角 \(\theta\) を返します。
- 測定ベクトル:\(\mathbf{z}_k = [r_k,\; \theta_k]^T\)
- 観測行列:
\[
\mathbf{H} =
\begin{bmatrix}
\dfrac{x}{\sqrt{x^2+y^2}} & \dfrac{y}{\sqrt{x^2+y^2}} & 0 & 0\\[4pt]
-\dfrac{y}{x^2+y^2} & \dfrac{x}{x^2+y^2} & 0 & 0
\end{bmatrix}
\]
- 測定ノイズ共分散:\(\mathbf{R}\)
3. **カルマンフィルタの手順**
- *予測*
\[
\hat{\mathbf{x}}_{k|k-1}= \mathbf{F}\,\hat{\mathbf{x}}_{k-1|k-1}
\]
\[
\mathbf{P}_{k|k-1}= \mathbf{F}\,\mathbf{P}_{k-1|k-1}\,\mathbf{F}^T + \mathbf{Q}
\]
- *更新*
イノベーション(残差)を計算:
\[
\mathbf{y}_k = \mathbf{z}_k - h(\hat{\mathbf{x}}_{k|k-1})
\]
イノベーション共分散:
\[
\mathbf{S}_k = \mathbf{H}\,\mathbf{P}_{k|k-1}\,\mathbf{H}^T + \mathbf{R}
\]
カルマンゲイン:
\[
\mathbf{K}_k = \mathbf{P}_{k|k-1}\,\mathbf{H}^T\,\mathbf{S}_k^{-1}
\]
更新された状態と共分散:
\[
\hat{\mathbf{x}}_{k|k}= \hat{\mathbf{x}}_{k|k-1}+ \mathbf{K}_k\,\mathbf{y}_k
\]
\[
\mathbf{P}_{k|k}= (\mathbf{I}-\mathbf{K}_k\,\mathbf{H})\,\mathbf{P}_{k|k-1}
\]
4. **実装のヒント**
- レーダー測定関数が非線形の場合は、線形化したモデル(拡張カルマンフィルタ)を使用します。
- 追跡が失われた際には、頻繁にフィルタを再初期化してください。
- \(\mathbf{Q}\) と \(\mathbf{R}\) を実際のセンサーノイズ特性に合わせて調整します。
5. **結果の解釈**
- 追加測定が増えるにつれて、推定位置は真軌道に収束します。
- フィルタが十分なデータを蓄積し不確実性が減少すると、速度推定も改善されます。
これらの手順に従えば、シンプルなレーダー測定値でもカルマンフィルタで処理でき、物体運動の正確かつリアルタイムな追跡を実現できます。](/_next/image?url=%2Fscreenshots%2F2026-04-09%2F1775692539358.webp&w=3840&q=75)











![**Show HN:**
*useEffect でのロジックにうんざり?クラスベースの React 状態管理を作りました*
数年前から React を使ってシングルページアプリを構築してきましたが、何度も「`useEffect` にロジックを書く」臭いが出てくるパターンがあります。データ取得やサブスクリプションの設定、ローカルストレージの同期などを行うたびに、次のようなエフェクトフックを書いてしまいます。
```js
useEffect(() => {
const id = setInterval(() => setCount(c => c + 1), 1000);
return () => clearInterval(id);
}, []);
```
構文は簡潔ですが、大きなコンポーネントになると煩雑になりがちです。私は次のようなものを求めていました。
- **状態ロジックを集約**
- **コンポーネントは宣言的に保つ**
- **予測可能な API を提供**
そこで、古典的なアイデアに立ち戻りました:軽量でクラスベースの状態管理者です。
### 実装例
```js
class Store {
constructor(initial = {}) {
this.state = initial;
this.listeners = new Set();
}
get(key) {
return this.state[key];
}
set(updater, callback) {
const prev = { ...this.state };
if (typeof updater === 'function') {
this.state = updater(this.state);
} else {
this.state = { ...this.state, ...updater };
}
this.listeners.forEach(cb => cb(prev, this.state));
if (callback) callback();
}
subscribe(listener) {
this.listeners.add(listener);
return () => this.listeners.delete(listener);
}
}
```
### ストアの作成
```js
const counter = new Store({ count: 0 });
```
### コンポーネントでの利用例
```jsx
function Counter() {
const [count, setCount] = React.useState(counter.get('count'));
React.useEffect(() => {
const unsub = counter.subscribe((_, next) => setCount(next.count));
return unsub;
}, []);
const increment = () => counter.set(state => ({ count: state.count + 1 }));
return (
<div>
<p>{count}</p>
<button onClick={increment}>+</button>
</div>
);
}
```
### なぜうまくいくのか
- **エフェクトのボイラープレートが不要** – 状態変更はストア側で処理され、エフェクトを介さない。
- **単一真実源** – すべてのコンポーネントが同じインスタンスから読み書きする。
- **予測可能な更新** – リスナーは前状態と次状態の両方を受け取る。
### 注意点
- React の組み込み最適化(例:自動バッチ処理)が失われることがあります。
- 手動でサブスクライブ/アンサブスクライブする必要があるため、クリーンアップを忘れるとメモリリークに繋がります。
- 型安全はデフォルトでは保証されないので、必要なら TypeScript の型定義を追加してください。
### TL;DR
散らばった `useEffect` ロジックを、状態を集中管理する小さなクラスベースストアへ置き換えました。これによりコンポーネントは軽量で宣言的に保たれ、状態変更のタイミングや伝播方法を完全に制御できます。シンプルな状態更新で複数のエフェクトを管理することに疲れているなら、このパターンを試してみてください。](/_next/image?url=%2Fscreenshots%2F2026-04-09%2F1775692575135.webp&w=3840&q=75)









