Silurus/ooxml:ブラウザ上で表示されるピクセル忠実な Office ドキュメント

2026/06/08 2:22

Silurus/ooxml:ブラウザ上で表示されるピクセル忠実な Office ドキュメント

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

要約

Japanese Translation:

@silurus/ooxml
は、完全に AI が生成した(人間が書かれたアプリコードなし)Rust/WASM シートであり、クライアント側 WebAssembly パーサーを Web Workers で実行することでブラウザ上で DOCX、XLSX、PPTX ファイルを高忠実度でレンダリングします。このスレッドセーフなアーキテクチャは、メインスレッドでレンダリングを行いながら詳細なグラフィックを Canvas 2D に描画し、一貫した
FontFaceSet
の使用を保証します。このパッケージは ESM 専用であり、Vite バンダーなどのバンドラーを使用する場合は
vite-plugin-wasm
を、webpack では
experiments.asyncWebAssembly
を設定することで WebAssembly モジュールを正しく処理する必要があります。

数学式は、OMML 方程式の DOCX ドキュメントを安全に解析するための MathJax + STIX Two Math エンジン(約 3 MB で、インポートされない場合は tree-shaken)をオプトインしてサポートします。レンダリング機能には以下が含まれます:

  • DOCX:ヘッダー/フッター付きのページレイアウト、変更追跡、コメント(解析済み)、ネイティブテキスト選択。
  • XLSX:複数シートを持つワークブック、スパークライン、グラフマーカー/誤差棒、固定ペイン、Excel 風ズームスライダー。
  • PPTX:スライド背景、画像埋め込みによる SmartArt、インク/手書き、および広範な形状・テーブルスタイル。

テキスト選択は現在、ネイティブ Canvas

drawElement
API が利用されるまでの暫定的な透明 DOM オーバーレイを使用しています。デフォルトではネットワークリクエストが発生しません。ZIP ボムに対しては
maxZipEntryBytes
で保護され、XML パーソル化は XXE セーフです。Google Fonts は
useGoogleFonts: true
が設定されるまで自動で読み込まれません。

関連パッケージには、WASM ベースのコンバーターである

@silurus/ooxml-markdown
、ヘッドレスパーサーである
@silurus/ooxml-node
、および自動インストールされる MCP サーバーを備えた VS Code 拡張機能が含まれます。開発コマンドは
pnpm build:wasm
pnpm storybook
、視覚的回帰テスト用には
pnpm vrt
です。このプロジェクトは MIT ライセンスの下でリリースされています。

本文

@silurus/ooxml:ブラウザベースの Office ファイルビューア

概要と構成

  • 実装方法: コードベース全体は、反復的なプロンプティングを通じて Claude(Anthropic の AI)によって作成されています。人間が書かれたアプリケーションコードは含まれていません。
  • 機能: Office Open XML (.docx, .xlsx, .pptx) ファイルをブラウザ上で読み込み、HTML Canvas 要素にレンダリングします。
  • アーキテクチャ:
    • パーサー: Rust で記述され、WebAssembly (WASM) にコンパイルされています。
    • レンダー: Canvas 2D API を使用します。
    • ヘッドレスエンジン:
      DocxDocument
      XlsxWorkbook
      PptxPresentation
      は公開されており、ビルトインビューアに依存せず、独自の UI(スクロール、サムネイル、マスター/ディテールなど)を構成できます。
フォーマット動作状態
DOCX
XLSX
PPTX

インストール

npm install @silurus/ooxml
# または
pnpm add @silurus/ooxml

重要:バンドラー設定と注意

  1. WASM 埋め込みの対応

    • Vite:
      vite-plugin-wasm
      を追加してください。
    • webpack:
      experiments.asyncWebAssembly
      を使用してください。
  2. バンドルサイズについて

    • このパッケージは ESM (
      .mjs
      ) 専用です。
    • npm の「Unpacked Size」は約 3 MB です(数学エンジン
      MathJax + STIX Two Math
      を含むオプションエントリ)。
    • アプリに組み込まれる実際のサイズは小さく、必要なフォーマットだけをインポートすれば済みます(例:
      @silurus/ooxml/pptx
      )。
    • 数学エンジンは独立したパッケージ (
      @silurus/ooxml/math
      ) です。これらを受け取りない限り、バンドルからは自動的に除外(ツリーシェイク)されます。

クイックスタート

DOCX (ワード)

呼び出し側が Canvas を提供する必要あり。

import { DocxViewer } from '@silurus/ooxml/docx';

const canvas = document.getElementById('docx-canvas') as HTMLCanvasElement;
const docx = new DocxViewer(canvas);

await docx.load('/document.docx');
docx.nextPage(); // ページ移動

XLSX (エクセル)

ビューア自体が Canvas とタブバーを管理します。

import { XlsxViewer } from '@silurus/ooxml/xlsx';

const container = document.getElementById('xlsx-container') as HTMLElement;
const xlsx = new XlsxViewer(container);

await xlsx.load('/workbook.xlsx');

PPTX (パワーポイント)

呼び出し側が Canvas を提供する必要あり。

import { PptxViewer } from '@silurus/ooxml/pptx';

const canvas = document.getElementById('pptx-canvas') as HTMLCanvasElement;
const pptx = new PptxViewer(canvas);

await pptx.load('/deck.pptx');
pptx.nextSlide(); // スライド移動

方程式のレンダリング (MathJax + STIX Two Math)

.docx
.pptx
内の OMML 方程式 (
m:oMath
) は、MathJax と STIX Two Math を使用してレンダリングされます。

  • エンジンサイズ: 約 3 MB(オプション)。
  • 導入方法:
    @silurus/ooxml/math
    パッケージを別エントリとしてインポートし、ビューアに渡す必要があります。
    • インポート → レンダリング
    • インポートなし → エクストラバンドルなし(方程式はスキップ)
  • 適用対象:
    DocxViewer
    ,
    PptxViewer
    ,
    DocxDocument
    ,
    PptxPresentation
    (オプション引数
    math
    )。
  • 例外:
    XlsxViewer
    は方程式をサポートしていません。
import { DocxViewer } from '@silurus/ooxml/docx';
import { math } from '@silurus/ooxml/math'; // 数学エンジンを読み込む

const canvas = document.getElementById('docx-canvas') as HTMLCanvasElement;
// ← ここに math オプションを渡すことで方程式がレンダリングされます
const docx = new DocxViewer(canvas, { math }); 

await docx.load('/paper-with-equations.docx');

アーキテクチャ

ビルドとランタイムの流れ

flowchart TB
    subgraph build["🦀 ビルド時 (Rust → WebAssembly)"]
        direction LR
        docx_rs["packages/docx/parser/src/lib.rs"]
        xlsx_rs["packages/xlsx/parser/src/lib.rs"]
        pptx_rs["packages/pptx/parser/src/lib.rs"]
        
        docx_rs -- wasm-pack --> docx_wasm["docx_parser.wasm"]
        xlsx_rs -- wasm-pack --> xlsx_wasm["xlsx_parser.wasm"]
        pptx_rs -- wasm-pack --> pptx_wasm["pptx_parser.wasm"]
    end

    subgraph browser["🌐 ランタイム (ブラウザ)"]
        subgraph core_pkg["@silurus/ooxml-core (共有プリミティブ)"]
            CORE["renderChart<br/>resolveFill·applyStroke<br/>buildCustomPath<br/>autoResize<br/>共有型定義"]
        end
        
        subgraph docx_pkg["@silurus/ooxml · docx"]
            DV["DocxViewer"] --> DD["DocxDocument"]
            DD --> DW["worker.ts\n(WASM 初期化・解析)"]
            DD --> DR["renderer.ts\n(Canvas 2D レンダリング)"]
        end
        
        subgraph xlsx_pkg["@silurus/ooxml · xlsx"]
            XV["XlsxViewer"] --> XB["XlsxWorkbook"]
            XB --> XW["worker.ts\n(WASM 初期化・解析)"]
            XB --> XR["renderer.ts\n(Canvas 2D レンダリング)"]
        end
        
        subgraph pptx_pkg["@silurus/ooxml · pptx"]
            PV["PptxViewer"] --> PP["PptxPresentation"]
            PP --> PW["worker.ts\n(WASM 初期化・解析)"]
            PP --> PR["renderer.ts\n(Canvas 2D レンダリング)"]
        end
        
        DR -. uses .-> CORE
        XR -. uses .-> CORE
        PR -. uses .-> CORE
        
        DW -- WASM --> docx_wasm
        XW -- WASM --> xlsx_wasm
        PW -- WASM --> pptx_wasm

        DR --> canvas["&lt;canvas&gt;"]
        XR --> canvas
        PR --> canvas
    end

読み込み処理の仕組み

  1. ワーカー (Web Worker): Rust WASM を使用して
    .docx
    /
    .xlsx
    /
    .pptx
    アーカイブを解析し、JSON モデルとして結果をポストします。
  2. メインスレッド (Renderer): JSON モデルに基づいて Canvas 上に描画を行います。
    • メインスレッド上のため、
      FontFaceSet
      を直接共有可能。
    • ワーカー内の
      OffscreenCanvas
      は独自のフォント設定を持つため、システムフォントにフォールバックすると文字幅が微妙に異なる可能性があります。

主要なファイル構成

ファイルロール
packages/docx/xlsx/pptx/parser/src/lib.rs
Rust WASM パーサー: ZIP → JSON モデル変換
packages/docx/xlsx/pptx/src/renderer.ts
メインスレッド レンダラー: Canvas 2D 描画エンジン
packages/*/src/worker.ts
Web Worker: WASM 初期化と解析専用(1 つのフォーマットあたり)
packages/*/src/viewer.ts
公開 API: キャンバスライフサイクル・ナビゲーション制御
packages/core/src/index.ts
共有プリミティブ: チャートレンダラー、形状ヘルパー (
resolveFill
など)、
autoResize

フレームワーク例 (React, Vue, Angular, Svelte, SolidJS, Qwik)

以下はスライドショー (

PptxViewer
) の実装例です。

React 19

import { useEffect, useRef, useState } from 'react';
import { PptxViewer } from '@silurus/ooxml/pptx';

export function PptxViewerComponent({ src }: { src: string }) {
  const canvasRef = useRef<HTMLCanvasElement>(null);
  const viewerRef = useRef<PptxViewer | null>(null);
  const [slide, setSlide] = useState({ current: 0, total: 0 });

  useEffect(() => {
    const canvas = canvasRef.current;
    if (!canvas) return;

    const viewer = new PptxViewer(canvas, {
      onSlideChange: (i, total) => setSlide({ current: i, total }),
    });
    viewerRef.current = viewer;
    viewer.load(src);
  }, [src]);

  return (
    <div>
      <canvas ref={canvasRef} style={{ width: 800 }} />
      <button onClick={() => viewerRef.current?.prevSlide()}>‹ Prev</button>
      <span> {slide.current + 1} / {slide.total} </span>
      <button onClick={() => viewerRef.current?.nextSlide()}>Next ›</button>
    </div>
  );
}

Vue 3.5

<script setup lang="ts">
import { useTemplateRef, onMounted, ref } from 'vue';
import { PptxViewer } from '@silurus/ooxml/pptx';

const props = defineProps<{ src: string }>();

const canvas = useTemplateRef<HTMLCanvasElement>('canvas');
let viewer: PptxViewer | null = null;
const current = ref(0);
const total   = ref(0);

onMounted(async () => {
  viewer = new PptxViewer(canvas.value!, {
    onSlideChange: (i, t) => { current.value = i; total.value = t; },
  });
  await viewer.load(props.src);
});
</script>

<template>
  <div>
    <canvas ref="canvas" style="width: 800px" />
    <button @click="viewer?.prevSlide()">‹ Prev</button>
    <span> {{ current + 1 }} / {{ total }} </span>
    <button @click="viewer?.nextSlide()">Next ›</button>
  </div>
</template>

Angular 19

import { Component, ElementRef, viewChild, signal, AfterViewInit } from '@angular/core';
import { PptxViewer } from '@silurus/ooxml/pptx';

@Component({
  selector: 'app-pptx-viewer',
  standalone: true,
  template: `
    <div>
      <canvas #canvas style="width: 800px"></canvas>
      <button (click)="prev()">‹ Prev</button>
      <span> {{ current() + 1 }} / {{ total() }} </span>
      <button (click)="next()">Next ›</button>
    </div>
  `,
})
export class PptxViewerComponent implements AfterViewInit {
  canvasEl = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');
  current = signal(0);
  total   = signal(0);
  private viewer?: PptxViewer;

  ngAfterViewInit(): void {
    this.viewer = new PptxViewer(this.canvasEl().nativeElement, {
      onSlideChange: (i, t) => { this.current.set(i); this.total.set(t); },
    });
    this.viewer.load('/deck.pptx');
  }

  prev(): void { this.viewer?.prevSlide(); }
  next(): void { this.viewer?.nextSlide(); }
}

Svelte 5

<script lang="ts">
  import { onMount } from 'svelte';
  import { PptxViewer } from '@silurus/ooxml/pptx';

  let { src }: { src: string } = $props();
  let canvas: HTMLCanvasElement;
  let viewer: PptxViewer;
  let current = $state(0);
  let total   = $state(0);

  onMount(async () => {
    viewer = new PptxViewer(canvas, {
      onSlideChange: (i, t) => { current = i; total = t; },
    });
    await viewer.load(src);
  });
</script>

<div>
  <canvas bind:this={canvas} style="width: 800px"></canvas>
  <button onclick={() => viewer?.prevSlide()}>‹ Prev</button>
  <span> {current + 1} / {total} </span>
  <button onclick={() => viewer?.nextSlide()}>Next ›</button>
</div>

SolidJS 1.9

import { createSignal, onMount } from 'solid-js';
import { PptxViewer } from '@silurus/ooxml/pptx';

export function PptxViewerComponent(props: { src: string }) {
  let canvasEl!: HTMLCanvasElement;
  let viewer: PptxViewer | undefined;
  const [current, setCurrent] = createSignal(0);
  const [total,   setTotal  ] = createSignal(0);

  onMount(async () => {
    viewer = new PptxViewer(canvasEl, {
      onSlideChange: (i, t) => { setCurrent(i); setTotal(t); },
    });
    await viewer.load(props.src);
  });

  return (
    <div>
      <canvas ref={canvasEl} style={{ width: '800px' }} />
      <button onClick={() => viewer?.prevSlide()}>‹ Prev</button>
      <span> {current() + 1} / {total()} </span>
      <button onClick={() => viewer?.nextSlide()}>Next ›</button>
    </div>
  );
}

Qwik 2

import { component$, useSignal, useVisibleTask$ } from '@builder.io/qwik';
import type { PptxViewer as PptxViewerType } from '@silurus/ooxml/pptx';

export const PptxViewerComponent = component$<{ src: string }>(({ src }) => {
  const canvasRef = useSignal<HTMLCanvasElement>();
  const current = useSignal(0);
  const total   = useSignal(0);
  let viewer: PptxViewerType | undefined;

  // ブラウザ環境のみ実行(SSR ではスキップ)
  useVisibleTask$(async () => {
    if (!canvasRef.value) return;
    const { PptxViewer } = await import('@silurus/ooxml/pptx');
    viewer = new PptxViewer(canvasRef.value, {
      onSlideChange: (i, t) => { current.value = i; total.value = t; },
    });
    await viewer.load(src);
  });

  return (
    <div>
      <canvas ref={canvasRef} style={{ width: '800px' }} />
      <button onClick$={() => viewer?.prevSlide()}>‹ Prev</button>
      <span> {current.value + 1} / {total.value} </span>
      <button onClick$={() => viewer?.nextSlide()}>Next ›</button>
    </div>
  );
});

機能サポート詳述

Word (.docx)

  • ドキュメント: ページレンダリング、サイズ/余白、ヘッダー/フッター(ページ番号・偶奇)、セクション分離
  • テキスト: フォント設定、太字/イタリック/アンダーライン/取り消し線、ハイパーリンク、上付き/下付き文字、ルビ注記 (ふりがな)
  • フォートメット: 行間隔、グリッド、インデント/タブストップ、リスト(箇条書き・番号)、スタイル(見出し、Normal)、テーブルスタイル(枠線/塗りつぶし)、目次(TOC)
  • 要素: テーブル(マージ/帯柄)、数学方程式 (OMML) (MathJax 使用)、画像(インライン/テキスト回り込み)、テキストボックス、WMF/EMF(予定未定)、変更追跡、コメント(解析済みで非表示)
  • 高度機能: 変更追跡(著者色付き)、メールマージフィールド(予定未定)

Excel (.xlsx)

  • ワークブック: 複数シート、シートタブの色設定
  • セル: テキスト/数値/ブール値/エラー、式計算結果、日付形式、リッチテキスト
  • フォーマット: フォント設定、背景色(ソリッド・グラデーション)、パターン塗りつぶし、枠線(破線・点線など)、アライメント、折り返し、数値形式(通貨/パーセントなど)
  • 構造: マージセル、フローリングパン、非表示行/列の管理
  • 要素: 画像、描画形状、チャート(棒/折れ線/エリア/レーダー/散布図/泡グラフ)、スライサー(2010 互換)
  • チャート詳細: マーカー種別変更、データラベル、誤差棒、スパークライン(Excel Sparkline)、手動レイアウト
  • 高度機能: 条件付きフォーマット(セル基準・色スケール・ダータバーなど)

PowerPoint (.pptx)

  • スライド: レイアウト継承、サイズ変更、背景設定、スライド番号
  • 要素タイプ: 形状、画像(グループ化/変換可)、コンネクタ、テーブル、チャート、SmartArt(非対応)、OLE オブジェクト(非対応)、メディア再生、インク書き込み
  • 形状ジオメトリ: 130+ プリセット形状、カスタムパス、回転/反転、3D(非対応)
  • 塗りつぶし/ストローク: ソリッド/グラデーション/パターン (30 種)、画像埋め込み、破線・矢印・二重ライン
  • 形状効果: ドロップシャドウ、グロー、反射、ボベル(部分実装)
  • テキスト: フォント設定(東アジア対応)、太字/イタリック/アンダーラインスタイル、数学方程式、ハイパーリンク、アウトライン、数学式
  • パラグラフィ: 水平/垂直配置、行間隔、箇条書き、インデント、縦書き (bodyPr@vert)、右から左配置 (rtl)
  • テキストレイアウト: マルチカラム、収縮自動調整 (normAutoFit/spAutoFit)、折り返し制御、テキストパディング
  • テーマ: スキーム色(16 色)、フォントスキーム、アルファ/輝度変換
  • 相互作用: テキスト選択機能

注記:テキスト選択の実装

現在のテキスト選択機能は、Canvas グリフレンダリング +透過性 DOM レヤーのオーバーレイという二重構造で実装されています。これは応急処置であり、将来 WICG/html-in-canvas の

drawElement
API が標準化された時点で、単一パイプラインへの移行が予定されています。


サブパッケージとツール

  • packages/markdown/: Office ファイルを Markdown へ変換する CLI とライブラリ(GitHub Actions などでの大規模変換に有用)。
  • packages/node/: Node.js 環境用のサーバーサイドパーサー(Web Worker 不要)。CI チェックやヘッドレスレンダリングパイプライン向け。
    ooxml-thumbnail
    CLI も含む。
  • packages/vscode-extension/: VS Code 拡張機能(
    ooxml-viewer
    )。ファイル選択時に自動で解析し、AI エージェントへ構造を提供する。
  • packages/mcp-server/: AI エージェント(Claude, Copilot など)向けの MCP サーバー。ファイルの構造をツールとして提供 (
    docx_get_structure
    等)。Mac/Win/Linux のプリビルトバイナリ付き。

開発方法

依存関係とビルド

# 依存関係のインストール
pnpm install

# WASM パーサーの構築(Rust + wasm-pack 必須)
pnpm build:wasm

# Storybook デバッグモード (ポート 6006)
pnpm storybook

# 型チェックの実行
pnpm typecheck

# 視覚的回復テスト (Visual Regression Test)
pnpm vrt
UPDATE_REFS=1 pnpm vrt # ベースラインの更新

# ライブラリ全体のビルド
pnpm build

WASM の個別構築手順

cd packages/docx/parser && wasm-pack build --target web && cp pkg/docx_parser_bg.wasm pkg/docx_parser.js ../src/wasm/
cd packages/xlsx/parser && wasm-pack build --target web && cp pkg/xlsx_parser_bg.wasm pkg/xlsx_parser.js ../src/wasm/
cd packages/pptx/parser && wasm-pack build --target web && cp pkg/pptx_parser_bg.wasm pkg/pptx_parser.js ../src/wasm/

セキュリティとプライバシー

  • Canvas 専用レンダリング: ドキュメントは解読され Canvas に描画されます。HTML/JS/XSS な攻撃や外部コンテンツの注入は行われません。
  • ZIP デコンプレッション制限:
    • 各 ZIP エントリへのデフォルト制限は 512 MiB。DoS 防御のため。
    • オーバーライド:
      maxZipEntryBytes
      オプション(バイト単位)。
      new PptxViewer(canvas, { maxZipEntryBytes: 64 * 1024 * 1024 }); // 64 MiB
      
  • ネットワーク通信:
    • デフォルトはオフ。テレメトリやサードパーティサービスへの連絡なし。
    • Google Fonts (テーマフォント) もデフォルトで読み込まれません。
    • useGoogleFonts: true
      を指定すると HTTP リクエストが発生する(注意)。
  • XML パーシング: 外部エンティティ解決を行わない (
    roxmltree
    使用)。XXE のリスクは排除されています。

ライセンス

MIT

同じ日のほかのニュース

一覧に戻る →

2026/06/08 4:01

Linear がなぜこれほど速いのか?技術的な解説

## Japanese Translation: # リニア革命:ウェブアプリケーションのパフォーマンス革新 リニアは、データベースをブラウザ内に完全に実行する(IndexedDB を使用)ことで、従来の CRUD アプリのデータ読み込み時間である約 300ms を数ミリ秒に短縮します。この「ローカルファースト」アーキテクチャでは、標準的なネットワークループが逆転し、デバイス上で変更を即時適用し、WebSocket を経由で非同期でデルタをプッシュすることで、アップデート待ちの地味な网络待ち時間を排除します。共同創設者のトゥオマス・カンカレは、この自社工程エンジンをゼロから構築することを強く推奨しました。タンスタッククエリや SWR などの一般的な楽観的な更新ライブラリを使用せず、サーバーを単なる同期ターゲットとして厳密に扱うアプローチを採用しています。JavaScript のサイズを最小限に抑えるため(圧縮後の JS は約 21MB にまで削減され、ルートレベルのチャンクに分けられている)、チームはバンドルパイプラインを 4 回も移行しました(Parcel → Rollup → Vite → Rolldown)。これにより、配送されるコード量は約 50% 削減されました。重要資産には、フォント(単一の可変 Inter ファイル)、数百のルートチャンクが含まれており、サービスワーカーと `<head/>` に設定された並行モジュールプレロードリンクを通じて事前キャッシュされます。これにより、オフライン時や繰り返し訪問時でも即座にレンダリングが可能になります。さらに、重要な CSS、JavaScript、認証ロジックは HTML に直接埋め込まれており、認証にはセッショントークンの即時取得ではなく、ローカルストレージ内の存在を確認する方式を採用しています。该系统は、50 件のイシューリストが変更された場合、わずか 50 セルだけを更新するなどの粒度の細かなリレンダを達成します。これは、データをプロパティごとの MobX オブザーバブルに水浸げすることで実現されており、標準的なフレームワークでは追いつけない優れた速度優位性を保証しています。

2026/06/08 3:33

依存症、逮捕、犯罪歴からの再起:ゼロから立ち直すまで

## Japanese Translation: 最も重要な示唆は、技術分野における採用決定において過去の過ちよりも将来の可能性を優先させるべきであるという点です。堅い身元調査は無視できない課題を乗り越えた有能な個人が不当に排除されるためです。著者は自らの驚異的なキャリア回復の実例によってこの主張を具体化しています:未成年の逮捕歴(監禁中に最大保安施設で Schedule II 指定薬物への所有および製造・頒布意図に関する 17 の起訴を含む)から、現代の技術産業における高位な技術職に就くまでです。当初、企業の「前科者なし」という採用ポリシーにより 8 社のオファーが撤回されましたが、彼は後に、ワークリリースインターンシップ期間中やハスラ(現在は PromptQL)で創設者から felony conviction の開示を受け入れた際に再雇用されるなど、採用管理者が大きなリスクを冒して彼を採用したことで成功を果たしました。彼の journey はまた、試行錯誤を通じて学んだ特定の教訓も強調しています:Techtonic での不当な解雇とその後 Slack の履歴を調べて正当化されたことや、Hasura などのコミュニティ主導のツールの発見とその仕事が不可欠になったことなどです。この個人的な物語は、犯罪記録を超えて才能が存在し、支援的なリーダーシップが人生を変えうることを説得力のある証拠として提供します。これからの未来において、業界リーダーは候補者の履歴に基づいて自動的に不合格にするのではなく、実証されたスキルを評価するよりニュアンスのある採用慣行を採用すべきです。功績基準による評価システムへとシフトすることで、技術セクターは見逃された膨大な talent の蓄水池を活用できるほか、更生と労働市場への再統合を積極的に支援し、より包摂的な環境を構築できます。

2026/06/08 3:54

LLM が人間のような属性を持つなら、同じく「エイジ オブ エンパイア2」もそうだ

## Japanese Translation: 本文書(arXiv:2605.31514)は、Adrian de Wynter 氏によるものであり、大規模言語モデル(LLM)に独自の人間のような(擬人化された)特性を帰属させることは欠陥のある仮定であると論じます。その理由は、そのような特性は「Age of Empires II」といったリアルタイム戦略ゲームでトレーニングされたニューラルネットワークを含む、あらゆる十分に複雑なシステムにおいて現れる可能性があるためです。著者は「Age of Empires II」が機能的かつチューリング完全であることを認めつつも、レゴの組み立てやグレート・ボストン地域など他のエンティティを、同様の擬人化的特性を示し得る強力なサブストレートの例として挙げています。基本的な証拠は、根本的な応答特性は一定のままでも、観測される行動の解釈はサブストレートによって変化する可能性があることを示しています。擬人化された属性が存在するかどうかを、サブストレートに依存せずに仮定することは循環的な結論や情報不足の結論につながります。著者は「null(零)」という仮説を提唱しており、明示的な測定がそれを否定するまで、LLM をこれらの特性において非特異であると扱うよう提案しています。この転換は、技術業界に対して、ニューラルネットワークだけでなく他のシステムにも人間のような性質を見出さないよう警戒することを促します。これを裏付けるために、本稿では分野の概要調査、潜在的な異議への言及、そして「null」仮説を適用する具体例について論じています。本研究は、オープンネスとユーザーデータのプライバシーを重視する arXivLabs の取り組みの一部です。