**ブラック―ホワイト配列**  
*高速で順序付けられ、O(log N) のメモリ割り当てに基づく*

2026/02/23 4:19

**ブラック―ホワイト配列** *高速で順序付けられ、O(log N) のメモリ割り当てに基づく*

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

改良された概要

BWArr は、Go 用の軽量で配列ベースのデータ構造であり、既存の BTree ライブラリを置き換えることができ、要素ごとの余分なオーバーヘッドなしに multiset のサポートを追加します。挿入・削除・検索に対して平均的 (O(\log N)) の性能を提供しつつ、要素を連続したメモリ領域に格納するため、キャッシュローカリティが優れ、ポインタ中心のツリーと比べてメモリ使用量が削減されます。ベンチマークでは、挿入・取得・反復速度で Google の BTree 実装と同等またはそれを上回ることが示されています。BWArr は

github.com/google/btree
および
github.com/petar/GoLLRB
に対するドロップイン代替品で、Go 1.22+ が必要であり、
go get github.com/dronnix/bwarr
でインストールできます。
性能のニュアンス:非常に小さなコレクションでは Search()/Delete() が最大で (O((\log N)^2)) になる場合があります。長い削除系列では Max()/Min() や反復が (O(N/4)) に達することがあります(ただし平均的には (O(\log N)) のままです)。1 回あたりの挿入操作は (O(N)) まで悪化し、レイテンシスパイクを引き起こす可能性があります。
今後の更新では、その配列ベースであることを活かしてバッチ操作の高速化を目指します。BWArr を採用することで、Go 開発者は従来の BTree ライブラリに依存していたアプリケーションで、メモリ消費量の削減、CPU キャッシュ使用率の向上、およびスケーラビリティの改善を実現できます。

本文

何でしょうか?

Black‑White Array(略称 BWArr)は、O(log N) のメモリ割り当てで高速に動作する順序付きデータ構造です。配列をベースにしており、挿入・削除・検索が O(log N) アマルガメイト(摂算)で実行できます。


データ構造

Black‑White Array のアイディアは、Professor Z. George Mou によって発明され、Black‑White Array: A New Data Structure for Dynamic Data Sets で公開されました。
このリポジトリには最初の公開実装が収録されています。

主な特徴

  • 挿入時に O(log N) のメモリ割り当て – GC(ガーベジコレクション)への負荷を抑制。
  • 高速な挿入、削除、検索操作 (O(log N) 摂算)。
  • 配列ベースでポインタ不要 → CPU フレンドリー:キャッシュローカリティ / 連続メモリアクセスなどが有効化。
  • 重複要素をネイティブにサポート(マルチセット挙動) – 値を構造体で包む必要はない。
  • github.com/google/btree
    github.com/petar/GoLLRB
    の Drop‑in 置き換え候補。
  • メモリオーバーヘッドが低い – 要素ごとにポインタを持たず、コンパクトな表現。
  • バッチ操作向け:内部で配列を使用しているため、大量挿入・削除の効率化(開発中)。
  • シリアライズしやすい(開発中)。

トレードオフ

  • 1 回の N ごとの挿入O(N) になる場合がありますが、摂算は O(log N) のままです。
    リアルタイムシステムでは数百万要素を扱うと遅延スパイクが発生する可能性があります(非同期 / バックグラウンド挿入で緩和)。
  • 要素数が少ない場合、Search()/Delete() が O((log N)²) になることがあります。
    ざっくり言えば、50 % の要素は O(log N)、75 % は O(2 log N)、87.5 % は O(3 log N) など。
  • 長い連続削除を行うと Max()/Min() が O(N/4) を要する場合がありますが、摂算は O(log N) のままです。
  • 大量削除時にイテレーションステップが O(N/4) になることがあります。
    摂算上は各要素ごとに O(log N) を保ちます。

ベンチマーク

ベンチマークでは BWArr と Google BTree を比較しています。

テスト内容
InsertN 個のユニークなランダム
int64
値を順次挿入したときの時間、割り当て数、および割り当て KB 数。
Get事前に埋め込まれたデータ構造から N 個の値をキーで検索する時間。
Iterate並べ替え済みと未並べ替え状態で全 N 要素を走査する時間。

詳細やアーキテクチャ別のベンチマークは

bwarr-bench
リポジトリにあります。


インストール

Go 1.22 以降が必要です。

go get github.com/dronnix/bwarr

インポート:

import "github.com/dronnix/bwarr"

使用例

基本例

package main

import (
    "fmt"

    "github.com/dronnix/bwarr"
)

func main() {
    // 整数比較関数を指定して BWArr を作成。
    // 2 番目の引数 (10) は初期容量ヒントです。
    bwa := bwarr.New(func(a, b int64) int {
        return int(a - b)
    }, 10)

    // 要素挿入
    bwa.Insert(42)
    bwa.Insert(17)
    bwa.Insert(99)
    bwa.Insert(23)
    bwa.Insert(8)

    fmt.Printf("Length: %d\n", bwa.Len()) // 出力: Length: 5

    // 要素取得
    val, found := bwa.Get(42)
    if found {
        fmt.Printf("Found: %d\n", val) // 出力: Found: 42
    }

    // 要素削除
    deleted, found := bwa.Delete(17)
    if found {
        fmt.Printf("Deleted: %d\n", deleted) // 出力: Deleted: 17
    }

    // 昇順でイテレーション
    fmt.Println("Elements in sorted order:")
    bwa.Ascend(func(item int64) bool {
        fmt.Printf("  %d\n", item)
        return true // 途中で停止したい場合は false を返す
    })
}

出力

Length: 5
Found: 42
Deleted: 17
Elements in sorted order:
  8
  23
  42
  99

同じ日のほかのニュース

一覧に戻る →

2026/02/23 4:12

私は「Timeframe」、すなわち私たち家族用の電子ペーパー・ダッシュボードを構築しました。

## Japanese Translation: 著者は長期プロトタイプを **Timeframe** に変え、カレンダー・天気・スマートホームデータを電子ペーパー画面に表示する常時稼働型ファミリーダッシュボードを作り上げました。 初期テストでは、自然光下で読みづらい Magic Mirror LCD と 30 分ごとしか更新されないジャイルブレークされた Kindle e‑ink ディスプレイから始めました。2019 年に著者は Visionect の電子ペーパー パネル(6″、10″、13″、32″)へ切り替え、単一充電で 10 分ごとに更新可能となりました。これらは Raspberry Pi 上の Ruby on Rails と IMGKit を用いて PNG を生成することで制御されました。13″ パネルの価格が 1,000 ドル、さらにデバイスあたり月額 7 ドルの新料金がかかったため、システムは高価になってしまいました。 2021 年末にマシャル火災で著者の家を失い、再建にはより信頼性の高いソリューションが必要だったため、Boox の 25.3″ Mira Pro 電子ペーパー画面(HDMI 経由でリアルタイム更新)と Mac Mini プロトタイプを採用しました。現在のディスプレイには、時計、Sonos 曲情報(node‑sonos‑http‑api を介して取得)、Dark Sky の翌時間降水予報などのリアルタイムデータが表示されます。 バックエンドは Rails/Redis から Home Assistant (HA) に書き換えられました。HA は Google カレンダー、Apple Weather、Sonos などを直接取得し、データベース層を排除します。著者は Home Assistant のテンプレートセンサー(例:食洗機のリマインダー)を追加し、コード再配備なしでアラートをトリガーできるようにしました。これにより電子ペーパー画面上で自動化されたステータスアラートが実現しました。 現在のディスプレイには左上に「ハウスヘルス」インジケーターがあり、ドアの開閉状態・ロック解除状況・洗濯完了など、必要な情報のみを表示して画面を常に確認する手間を省きます。 残っている課題は、保守不要で配備可能な組み込みハードウェアの強化、すべてのデータソースを HA に完全統合すること、および 25″ Boox の約 2,000 ドルというコストと複雑性を削減することです。著者は Timeframe を継続的に開発しつつ、潜在顧客からの関心を得て、Home Assistant アプリとして市場へ投入することを目指しています。同時に日常業務のソフトウェア作業と並行して個人的な情熱プロジェクトとして進めています。

2026/02/23 7:42

**FreeBSD 15 の新しいブリッジ機能** FreeBSD 15 では、パフォーマンスの向上・設定の簡易化・安定性の強化を実現したスリム化されたブリッジ実装が導入されました。 --- ### 主な改善点 - **低レイテンシ** を実現するために最適化されたパケット処理経路。 - ブリッジインターフェース上で直接 VLAN タギングをサポート。 - 帯域幅やキュー制限のチューニング用 `sysctl` 設定が簡素化。 - ブリッジ接続セグメント間で IPv6 フォワーディングを組み込みでサポート。 --- ### インストールと設定手順 1. **ブリッジモジュールの読み込み** ```sh kldload bridge ``` 2. **ブリッジインターフェース作成**(例:`bridge0`) ```sh ifconfig bridge0 create ``` 3. **メンバーインターフェースの追加** (`em0`, `em1`, …) ```sh ifconfig bridge0 addm em0 addm em1 up ``` 4. **IP アドレスを割り当てる(管理用に任意)** ```sh ifconfig bridge0 inet 192.168.10.1/24 ``` --- ### よくある利用ケース - L2 仮想化(例:KVM ゲストが同一ネットワークセグメントを共有) - 複数のアップリンクで冗長構成 - 追加ルーティング不要で VLAN 分割をシンプルに実現 --- ### パフォーマンス向上のヒント - NIC がサポートしている場合は `bridge_hwfilter` を有効化し、ハードウェアアクセラレーテッドフィルタリングを利用。 - トラフィックプロファイルに合わせて `bridge_maxframe` と `bridge_mtu` の `sysctl` 値を調整。 - `netstat -e` や `sockstat -4` でブリッジ統計情報をモニタリング。 --- ### トラブルシューティング - ブリッジ上のインターフェースに IP アドレス競合がないか確認。 - カーネルログ(`dmesg`)で「bridge」に関するエラーを探す。 - `ifconfig bridge0` でメンバー接続と状態を確認。 --- これらの手順を踏むことで、FreeBSD 15 の新ブリッジ機能を活用し、高性能かつ信頼性の高いネットワーク環境を構築できます。

## Japanese Translation: FreeBSD 15は、従来のVLANごとのブリッジモデルを廃止し、`vlanfilter` フラグで複数のタグ付きまたはタグなし VLAN をホストできる単一の多機能ブリッジに置き換えました。新設計では個別のブリッジが不要になり設定が簡素化されます。sysctl `net.link.bridge.member_ifaddrs` は、ブリッジメンバー上のレイヤー3アドレスをソフト非推奨にし(FreeBSD 16.0‑RELEASEで削除予定)、VLAN フィルタリングが有効でない場合はタグ付きメンバーを追加すると ``` ifconfig: BRDGSIFVLANSET ix1: Invalid argument (extended error VLAN filtering not enabled) ``` というエラーになります。 最小構成例: ``` ifconfig_ix1="up -tso4 -tso6 …" cloned_interfaces="bridge0" ifconfig_bridge0="vlanfilter addm ix1 tagged 2,3,128" ``` VNET ジャイルは `jib` スクリプト(またはカスタム `/scripts/vnetif`)を使い、epair デバイスを作成して正しい VLAN タグでブリッジに接続できます。カーネルは現在 epair 用の安定した MAC 生成 (`net.link.epair.ether_gen_addr`) を提供しているため、jib スクリプトの MAC 安定化ロジックは不要です。例として `/scripts/vnetif` は epair を作成し、IPv6 link‑local を無効にし、ポート名を付け、一方の側をタグなし VLAN 2 としてブリッジへ追加します。 Bhyve VM では手動でタップインタフェース(例: `tap133`)が事前に作成され、ブリッジに追加されます (`ifconfig bridge0 addm tap133 untagged 2`)。VM 設定はこれらのタップを参照しますが、新しいブリッジ/VLAN モデルへのネイティブサポートはありません。FreeBSD 15 の変更後は `network0_mac` フィールドが無効になるため、タップインタフェース作成時に安定した MAC アドレスを設定する必要があります。 総じて、新しいブリッジ+VLAN デザインは従来の VLAN ごとのアプローチよりも設定が簡単になり、カスタムスクリプトへの依存が減少し、ギガビット速度でのパフォーマンスが向上します(10 Gbps でも潜在的にメリットがあります)。残る懸念点としては、ルーター・オン・ア・ストック構成との互換性があります。

2026/02/23 3:56

「Loopsは、フェデレーテッド(分散型)でオープンソースなTikTokです。」

## Japanese Translation: > Loopsは、現在オープンベータ段階にある企業支配を拒否するオープンソースの分散型短編動画プラットフォームです。分散化されたアーキテクチャにより、ユーザーは単一の企業エコシステムに縛られることなく、独立したサーバ間でコンテンツを共有できます。Fediverseモデルに従い、Loopsはクリエイターとコミュニティに作品とオーディエンスデータの所有権を与えることで力を付与します。このプラットフォームはクリエイターに優しく、広告は一切含まれていません。持続可能性はユーザーによるスポンサーシップから来ており、すべての寄付は開発・インフラストラクチャー・コミュニティイニシアチブへと向けられ、Loopsが独立した状態を保つようにしています。