趣味用OSでWineを利用してWindowsゲームを実行する

2026/06/24 23:38

趣味用OSでWineを利用してWindowsゲームを実行する

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

要約

Japanese Translation:

著者は、独自のオペレーティングシステム「Astral」へ Wine を成功裡に移植し、ネイティブ 64 ビットアーキテクチャ上で幅広い 32 ビット Windows アプリケーションを実行できるようにしました。主な技術的課題には、WoW64 に Long Descriptor Table (LDT) サポートを追加して 32 ビットコードの実行を可能にし、PE から Unix への移行失敗を引き起こしていた Wine ディスパッチャの未定義動作を修正する事、MinGW を統合して必須の PE DLL をコンパイルする事、xlib から Mesa パッチによる DRI に OpenGL バックエンドを変更することで /dev/dri がなくても X.org サーバーを起動できるようにする事がありました。これらの努力により、「Cogmind」といった複雑なソフトウェアの安定した実行が可能になりました。以前の不完全なビルドは基本的なツールのみに対応していましたが、これらの修正後、より高度なアプリケーションの実行が現実的になりました。

現在のテスト結果は混在しています。「FTL」などのタイトルは正常に動作しますが、DRM 制限(例:Steam にてブロックされている「Plants vs. Zombies」)により、部分的または完全に機能しないタイトルもあります。実行時エラー(「Half-Life」は C++ assert で失敗)、インストーラー/起動時の失敗(Firefox、Chromium、SCP: Containment Breach)、エンジン固有の問題(Unity ゲームが MonoManager で停止)も報告されています。「FTL」や「Half-Life」といった人気タイトルはいくらか遊べる状態ですが、DRM やインストール問題により、万能な互換性は確保されていません。

今後の計画として、著者は Chromium ブラウザを Steam で完全に動作可能にするとともに、新規ドライバとバグ修正による Astral カーネルの最適化を継続し、全体のパフォーマンスと安定性を向上させる予定です。

本文

アストラルでの Wine ポーティング:コグマインドから Steam まで

背景と目標

数ヶ月前、趣味の開発 OS「アストラル」上で マインクラフトを動作させる記事を公開しました。その後、より多くのゲームやファクターイオ(glibc 互換 C ライブラリ)への対応が進められていますが、多くのタイトルは Windows 向けにコンパイルされた閉源代码であり、動作には Wine のような互換層が必須です。

特に私が愛好するログライクゲーム**「コグマインド」**は、32 ビット版の Windows 専用ソフトであり、アストラル上で動かすのが目標となりました。

  • 既存の Wine ポートではメモ帳(
    notepad.exe
    )すら正常に動作せず極めて不完全でした。
  • コグマインドを動かすためには、Wine ポートの完遂に加え、64 ビット OS 上で 32 ビットコードを実行可能にする環境整備も必要でした。

Wine の基本機能の確立

Wine を動作させる最初のステップとして、以下を実施しました。

MinGW の導入

  • MinGWをダウンロードし、ビルド設定で有効化。
  • PE フォーマットの DLL コンパイルに不可欠な環境です。
  • 成果: メモ帳が正常に動作し、「名前付けて保存」操作でのクラッシュ現象が解消されました。

libEGL.so のコンパイルと EGL 対応

Wine は当初、OpenGL サポートを無効な状態でビルドされていました。アストラルには OpenGL が搭載されていますが、Wine の正しく動作するには**EGL(レンダリング API とウィンドウシステムの接続)**が必要です。

  • 課題: アストラルの Mesa ポートでは EGL を提供していませんでした。
  • 試行錯誤:
    • 当初は Mesa で
      xlib
      バックエンドを使い易く有効化しようとしました。
    • しかし、Mesa の
      xlib
      バックエンドではEGL サポートが非対応でした。
  • 解決策: DRI(Direct Rendering Infrastructure)バックエンドへの切り替え
    • DRI は X サーバーを経由せず、アプリケーションが GPU と直接通信する仕組みです。
    • /dev/dri
      を介さずに X.org サーバーを起動できるように Mesa のパッチ適用という深い調査を実施。
  • 成果: 上記対応により**「デルタラン」**の起動に成功しました。

WoW64 と 32 ビット Windows プログラムの対応

コグマインドは 32 ビットアプリケーションであり、アストラルは 64 ビットシステムであるため、以下の基盤構築が必須でした。

  • WoW64 モードの実装:
    • 32 ビットの Unix ライブラリを必要としません。
    • 64 ビットプロセス内で 32 ビット Windows バイナリを実行します。
    • 必要な場合、32 ビットおよび 64 ビットのシステムコールやデータ構造の間を翻訳し、完全な 32 ビットユーザースペースを用意せずに実行環境を提供します。

実装詳細

実装の中心はカーネル内の LDT(ローカル説明子テーブル)サポートでした。

  • LDT の役割:
    • x86-64 アーキテクチャでは、ロングモードの中で 32 ビットセグメント説明子を用いて 32 ビットコードを実行可能になります。
    • これらはメモリのアクセス方法や、コードセグメントの処理方法を定義します。
    • LDT はこれらのセグメント説明子をプロセス単位で定義する仕組みです。
  • その他:
    • Wine のシグナルハンドリングとシステムコール処理コードにおいて、いくつかの細かい**接着層(glue)**の実装も必要でした。

コグマインド!アストラル上で動作開始!

Wine ポートに WoW64 サポートを実装し、カーネルにおける数々のバグを修正した結果、ついにコグマインドが動作しました。

  • ゲーム内で遊べる状態を実現できました。
  • ゲーム内のニュース表示スコアシート送信機能以外は顕著な問題は見られませんでした。

スコアシート送信機能の不具合の解決

TCP 接続が開かれて即座に断られ、かつデータ転送が一切行われない現象が発生していましたが、その原因は以下の通りでした。

  • 初期判断: ネットワークスタックの問題と考えましたが、それはではありませんでした。
  • 真の原因発見: Wine デバッグログ関数**
    __wine_dbg_write
    **が WoW64 モードでは全く機能しないこと。
    • これにより、Wine のコードを掘り下げた結果、
      __wine_unix_call_dispatcher
      関数においてレジスタの保存を忘れていることに気づきました。
  • 修正と成果:
    • この欠落により PE から Unix への移行が破綻し、未定義動作(UB)を引き起こしていました。
    • コードを修正することで、スコアシート送信機能が正常に動作するようになりました。

その他のゲーム・アプリケーションの実行状況

Wine を介して試行した他のアプリケーションの結果です。

アプリケーション名状態詳細
FTL✅ 動作完全遊 playable
Steam⚠️ 部分的インストール・アップデートは可能だが、Chromium 起動時 (
GetInterfaceAddresses()
) にクラッシュ。
iexplore.exe⚠️ 部分的シンプルなサイト表示可能だが、複雑なページでは Chromium と同様の不具合でクラッシュ。
Factorio⚠️ 部分的ウィンドウが開くが、ローディング画面を過ぎない。
Spooky's Jumpscare Mansion⚠️ 部分的起動はするが、プレイには遅すぎすぎる速度で動作する。
Noita⚠️ 部分的起動はするが、プレイには遅すぎすぎる速度で動作する。
プラントズ vs ザンビーズ❌ 破損メインメニュー到達前に Steam DRM にブロックされる。
ハーフライフ❌ 破損Wine の C++ ランタイムでアサート失敗(おそらくポーティングの欠落)。
Firefox / Chromium❌ 破損インストーラーが失敗し、実行可能な状態に至らない。
SCP: コンテインメントブリーチ❌ 破損起動せず、原因未特定。
Unity ゲーム全般❌ 破損wine-mono に問題があり、MonoManager の
ReloadAssembly
で停止する。

おわりに

Wine のポーティングは非常に楽しくて刺激的な課題でした。趣味の OS でも当初思っている以上に多くのゲームが遊べることを証明する手段となりました。

  • 実用性: 趣味の OS が実用的な日常利用ツールへと進化していく過程の一歩です。
  • 学び: 特に PE から Unix への移行修正を通じて、コードを深く掘り下げ、Wine の内側を学ぶことができました。

今後の目標とロードマップ

現時点では粗面やパフォーマンス課題、奇妙なクラッシュが残っていますが、コア部分での動作は確認できました。以下のことに重点を置きます。

  1. 主要目標: Steam の動作を実現する(これにより Chromium も同時に動くと考えられます)。
  2. アストラル開発: 最適化、新しいドライバの開発、バグ修正へのリソース集中。
  3. カーネル改善: カーネル側にも改善の余地は十分にあります。

ご阅读いただきありがとうございました!

同じ日のほかのニュース

一覧に戻る →

2026/06/25 2:47

OpenAI、ブロードコムによる初自有チップを発表

## Japanese Translation: 要約: OpenAI は、Nvidia ハードウェアへの依存を減らすという戦略的な動きとして、Broadcom と共同で開発した最初の独自の AI 推論チップ「Jalapeño」を発表しました。このチップの主な優位点は、既存の選択肢を上回る卓越したワットあたりの性能であり、これは OpenAI の大規模言語モデルが直接、チップおよび全体の基盤スタック(アーキテクチャ、カーネル、メモリスистем、ネットワーク、デプロイメントシステムなど)の最適化に参加するという独自のプロセスを通じて実現されています。事前学習タスクは既存のシステムで引き続き行われますが、10 月の公式パートナーシップ発表以降およびさらなるテストを経て、推論ワークロードが Jalapeño へ迅速に移転する見込みです。このチップは推論用に特別に設計されており、より高速で信頼性が高くコスト効率の良い AI エクスペリエンスを実現するとともに運用コストを削減することを可能にします。これは OpenAI の財務の底線を改善する方法として強調されており、エージェント型製品(例:Codex)やリアルタイムモデルを取り扱う専用データセンターなどの目的builtアプリケーションを動かすために適しています。

2026/06/25 7:39

PostgreSQL で十分です

## Japanese Translation: 主要な要点は、GitHub Desktop で特定のクローニングタスクが必要なユーザーは、コントリビューター「cpursley」から提供される専用のスクリプトを使用すべきであるということです。Gist の URL—`https://gist.github.com/cpursley/c8fb81fe8a7e5df038158bdfe0f06dbb.js`—はスクリプトを提供しており、ユーザーは GitHub Desktop 内での使用のために「cpursley/c8fb81fe8a7e5df038158bdfe0f06dbb」をローカルに保存するよう指示されています。内容は、背景や今後のアップデートなしに直ちに実装することに焦点を当てています。

2026/06/24 23:41

RubyLLM:すべての主要 AI プロバイダーに対応する Ruby フレームワーク

## 日本語翻訳: RubyLLM は、OpenAI、xAI、Anthropic、Gemini、Ollama を含むローカルモデルに至るまで主要なすべての AI プロバイダーをサポートする統一された Ruby フレームワークです。多様な API とレスポンス形式を単一のインターフェースに統合することで開発を簡素化するのがその主たる価値であり、このことでチームはチャットボット、AI エージェント、RAG システム、コンテンツ生成器、および様々な AI ワークフローを構築できます。インストールは簡単です:Gemfile に RubyLLM を追加し、`config/initializers/ruby_llm.rb` で API キーを設定し、必要であれば generator コマンドで Rails と統合し、`localhost:3000/chats` でローカルチャット UI を起動できます。開発者は RAG システムやコンテンツ生成器などの複雑なアプリケーションをわずか 2 分で構築でき、Ruby エコシステム内でこの機能を拡張しています。JPG(画像)、MP4(ビデオ)、WAV(音声)、PDF(文書)、RB(コード)を含む広範なファイル解析をサポートしており、`RubyLLM.paint` を介した画像生成、`RubyLLM.embed` を介した埋め込み生成、`RubyLLM.transcribe` を介した音声書き起こしが可能となります。また、`RubyLLM.moderate` を用いたコンテンツモデレーション機能も含まれており、テキストの安全性を確認できます。ユーザーは `.with_tool` を使用して AI エージェントが特定の指示に基づいて実行するカスタム Ruby クラスツールを定義でき、`RubyLLM::Agent` を用いて特定の指示、モデル、ツールの関連付けを持つエージェントを作成できます。さらに、このフレームワークは `RubyLLM::Schema` で定義されたスキーマによる構造化 JSON 出力をサポートし、`.ask` メソッドに渡されるブロックを通じてストリーミングレスポンスを提供します。このアプローチにより、高度なモデルを使用して複雑なタスクを実行する洗練されたエージェントの迅速なデプロイが可能となり、ネイティブ Ruby 環境内で堅牢な人工知能ソリューションの作成が著しく加速されます。