ブログ

  • Debian グッズ販売開始

    Debian グッズ販売を始めました。UP-Tのサービスを利用しています。

    • インストールメディアを販売している、このサイトとはシステムが別ですので御注意ください。
    • 商品はUP-Tから直送されます。
    • Debianへの寄付は仲介していません。
    • 国内発送のみです。
  • 入門書

    Perplexity AIや他のLLMの知恵を借りて、サーバ管理やプログラミングに役立つ知識を紹介していきます。その他の記事もたまに書きます。

  • 新装開店

    サーバー移設中につき、暫く御不便をかけます。

    旧サイトのアカウントは削除しますので、御注文前に新たに登録し直して下さい。

  • Spec-kitの活用

    mcts-genとpy-chessboardjsにおけるSpec-kitの活用と開発ワークフロー改善の記録

    この記事では、私が最近行った2つのプロジェクトmcts-genpy-chessboardjsでの開発記録を基に、AIを活用したspec-kitツールの使い方、GitHub Actionsを用いたCI/CDワークフローの構築、そしてPyPIのTrusted Publisher設定について解説します。


    1. spec-kitのアップデートと古い設定ファイルの整理

    プロジェクトmcts-genakuroiwa/mcts-gen)において、spec-kitのバージョン更新を行いました。この際、古いファイルの削除に手間取りました。また、仮想環境管理ツールuvxを用いた初期インストール手順が、恒久的なツールの利点を享受できない原因となりました。

    🚨 古いバージョンからの移行時の注意点

    以前のバージョンでspecify initを実行していたため、新しいバージョンのspec-kitを導入する際、古いコマンド定義ファイルが残ってしまいました。

    現在のgemini-cliでspec-kitのコマンドは全て/speckit.から始まりますが、古いバージョンでは異なっていました。

    【新しいspec-kitのインストール】

    仮想環境をアクティベートした後、uv tool installで最新版を取得します。

    source .venv/bin/activate
    uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git

    【内部コマンドの更新】

    プロジェクトのルートで以下のコマンドを実行し、gemini-cliの内部コマンドを更新します。

    specify init --here

    これにより、新しいコマンドファイルが.gemini/commands/以下に作成されます。

    【新規ファイルの確認】

    git statusで確認すると、以下のような新しいファイルが追加されていることが分かります。

    ブランチ main
    追跡されていないファイル:
      (use "git add <file>..." to include in what will be committed)
        .gemini/commands/speckit.analyze.toml
        .gemini/commands/speckit.checklist.toml
        ...(中略)...
        .gemini/commands/speckit.tasks.toml
        .specify/

    .specify/ディレクトリにはmemory/, scripts/, templates/といったサブディレクトリが含まれます。

    🧹 古いファイルの削除手順

    新しいコマンドファイルと競合する古いファイルを特定し、手動で削除する必要がありました。

    1. 古いコマンド定義ファイルの削除

      cd .gemini/commands/
      rm plan.toml
      rm specify.toml
      rm tasks.toml
      cd -
    2. 古い.specify関連ファイルの削除

      rm -rf memory/
      rm -rf templates/
      rm -rf scripts/

    💡 ヒント: コマンド定義ファイルが管理対象外になるように、.gitignore.geminiを追加することも検討できます。ただし、その場合はgit statusには表示されなくなります。


    2. 既存プロジェクト(py-chessboardjs)でのspec-kit導入と運用

    既存のプロジェクトpy-chessboardjsakuroiwa/py-chessboardjs)でもspec-kitを導入しました。

    🛠️ 導入手順

    プロジェクトのルートディレクトリで、以下の手順を実行します。

    uv venv
    source .venv/bin/activate
    uv pip install -e . # プロジェクト依存パッケージのインストール
    uv tool install specify-cli --from git+https://github.com/github/spec-kit.git # spec-kitのインストール
    specify init --here # プロジェクト設定ファイルの作成
    specify --help # 動作確認

    spec-kitをgemini-cliで使用し始めると、プロジェクトルートに**GEMINI.md**というファイルが作成され、これがAIとの対話の出発点となります。

    🚀 spec-kitを利用した開発サイクル

    spec-kitのコアな使い方は、事前にGeminiにチャットで相談し、戦略を固めてからスラッシュコマンドを実行していく流れが最も効果的です。

    コマンド 目的
    /speckit.specify <文字列> 要件定義や仕様策定をAIに依頼し、**specs/**にMarkdownファイルを作成させる
    /speckit.plan 実装計画を立てる
    /speckit.tasks タスクリストを作成する
    /speckit.implement 実際にコードの実装を依頼する

    これらの作業を通して、specs/以下にMarkdownファイルが作成されます。原則として、specs/以下のサブディレクトリは作業ごとに作成されたブランチ名と同じになります。

    🔄 作業終了後のブランチマージ

    spec-kitがブランチを作成して作業を進めた後、作業をメインブランチに反映するには、以下の手順が必要です。

    git commit -m "修正内容のメッセージ" # 作業ブランチで必ずコミットする
    git checkout main
    git merge 001-fix-settings-load-error # 作業ブランチをmainにマージ
    git branch -d 001-fix-settings-load-error # 作業ブランチを削除

    3. GitHub ActionsとPyPI Trusted Publisherの設定

    パッケージの自動公開のために、GitHub Actionsのワークフローを.github/workflows/にYAMLファイルで記述します。このYAMLファイルはGeminiに依頼して作成してもらうことが可能ですが、動作確認が不可欠です。

    🚢 パッケージ公開ワークフロー

    py-chessboardjsのワークフロー例

    このYAMLファイルを使用して、PyPIのTrusted Publisherを登録します。登録時には、上記のYAMLファイル名を指定する必要があります。これにより、GitHub ActionsとPyPIが連携し、OIDC(OpenID Connect)を使って安全にパッケージを公開できます。

    🧪 テスト公開と本番公開

    タグ名によって、TestPyPIと本番PyPIへの公開を分けます。

    公開先 タグ名の条件 コマンド例
    TestPyPI -testを含むタグ名 git tag v0.0.3-test1
    本番PyPI -testを含まないタグ名 git tag v0.0.3

    タグを作成したら、git push origin <タグ名>でプッシュすることで、GitHub Actionsが起動します。

    📝 YAMLの構文チェック: Emacsではflycheck-yamllintをインストールすると、flycheck-modeでYAMLの構文エラーをリアルタイムに確認でき、大変便利です。


    4. AIとの協調作業における重要な教訓

    py-chessboardjsの開発中に遭遇した2つの不具合は、AIによる開発支援の限界と可能性を示す良い事例となりました。

    不具合1: ファイルパスの取得問題(C:\fakepath\

    現象: チェスエンジンのパス指定が機能しないエラーが発生し、出力にはFileNotFoundError: [Errno 2] そのようなファイルやディレクトリはありません: 'C:\\fakepath\\stockfish'とありました。

    解決: Google検索の結果、「fakepath」はHTMLのファイル入力フィールドがセキュリティ上の理由から実際のパスを隠蔽するブラウザの挙動であることが判明しました。この情報をGeminiに提供したところ、**「input type="file"をボタンに置き換え、pywebview.apiを介してPythonのネイティブファイルダイアログを呼び出す」**という正確な解決策が提示され、実装に成功しました。

    不具合2: キャスリング時のエラー(concurrent.futures.CancelledError

    現象: キャスリングを行うとエラーが発生しました。

    解決: ログからconcurrent.futures.CancelledErrorが見つかり、並列処理の不具合が疑われました。原因は、プロジェクトが使用しているchessboardjsの古いバージョンにあり、キャスリング時にFEN(盤面情報)が複数回更新され、チェスエンジンが処理しきれなかった可能性が高いと特定しました。

    以下はGeminiによる解説です:

    1. python-chessエンジン呼び出しの問題について

      根本的な問題は、GUIフレームワークであるpywebviewと、asyncioベースのエンジン通信を行うpython-chessライブラリとの間の並行処理の競合でした。

      • pywebviewのAPI呼び出しは同期かつ別スレッドで実行される: JavaScriptからpywebview.api.some_function()を呼び出すと、pywebviewは新しいPythonスレッドでsome_functionを実行し、その関数が戻るまでスレッドをブロックします。

      • python-chessのエンジン通信は非同期 (asyncio):
        chess.engine.popen_uci()関数やengine.play()メソッドは、Pythonのasyncioライブラリを使用して外部のチェスエンジンプロセス(Stockfishなど)と通信します。asyncioはイベントループ上でタスクを実行し、通常は単一のスレッドで行われます。

      • 競合 (レースコンディション):

        1. 以前のApi.uci_engine_move()は、await self.engine.play()を直接呼び出していました。このawait呼び出しは、エンジンが指し手を返すまでpywebviewのAPIスレッドをブロックしていました。
        2. このpywebviewのAPIスレッドがブロックされている間に、ユーザーが別のUI操作(例: 「リセット」ボタンや「戻る」ボタンのクリック)を行うと、その操作もpywebviewのAPI呼び出し(例: Api.on_closed())をトリガーしていました。
        3. 古い設計のApi.on_closed()メソッドはself.engine.quit()を呼び出し、エンジンプロセスを終了させていました。
        4. エンジンプロセスが終了すると、self.engine.play()が待機していたasyncioのFutureがキャンセルされ、concurrent.futures.CancelledErrorが発生しました。エンジンプロセスが予期せず終了した場合はchess.engine.EngineTerminatedErrorが発生しました。
        5. pywebviewのAPIスレッドはself.engine.play()の結果を待ってブロックされていたため、Futureがキャンセルされると、CancelledError(またはEngineTerminatedError)が伝播し、アプリケーションがクラッシュしたり、一貫性のない状態になったりしていました。
      • 解決策 (専用ワーカースレッド):

        • 私たちは、専用のthreading.Threadで実行されるEngineWorkerクラスを導入しました。
        • このEngineWorkerスレッドは独自のasyncioイベントループを持ちます。
        • pywebviewからApi.uci_engine_move()が呼び出されても、もはやブロックされません。代わりに、EngineWorkerが監視するqueue.Queueに「プレイ」タスクを投入します。
        • EngineWorkerはタスクを受け取り、自身の asyncioイベントループ上でawait self.engine.play()を実行します。指し手が準備できると、スレッドセーフなコールバック(_engine_move_callback)を使用して結果をApiクラスに返します。
        • Apiクラスはself.window.evaluate_js()を使用して、指し手をJavaScriptのフロントエンドにプッシュします。
        • なぜこれで解決したのか: pywebviewのAPIスレッドはasyncio操作によってブロックされなくなりました。asyncioイベントループは独自の安定したスレッドで継続的に実行されます。エンジンを終了させる可能性のあるUI操作は、EngineWorkerのキューに「終了」タスクを送信するようになり、ワーカースレッドはエンジンとそのループを安全にシャットダウンできます。計算中に「終了」が受信されても、ワーカースレッド内でasyncioタスクがキャンセルされるだけで、pywebviewのAPIスレッドには伝播せず、クラッシュを防ぎます。Engine move discardedというメッセージは、この正常な処理を示しています。
    2. specs/002-fix-castling-errorの削除について

      削除したのは良い判断でした。002-fix-castling-errorブランチとその関連する仕様ファイルは、バグ修正の失敗した試みを表していました。それらを残しておくと、誤った情報や置き換えられた情報でリポジトリが煩雑になります。

      フィーチャーの試みが失敗したり、新しいアプローチに置き換えられたりした場合は、古いブランチとその成果物をクリーンアップするのがベストプラクティスです。これにより、プロジェクトの履歴がクリーンに保たれ、成功した作業や関連する作業のみが反映されます。

      新しい003-fix-engine-concurrencyブランチとその仕様は、根本的な並行処理の問題を解決するための現在の成功したアプローチを正確に反映しています。

    💡 教訓: ユーザーの根気強さが成功の鍵

    これらの事例から学んだのは、Geminiでも不具合の特定は難しく、ユーザーとの共同作業であるということです。特に、エラー出力や挙動を注意深く観察し、根気強くAIにフィードバックすることが、適切な解決策を導き出すために不可欠となります。AIは強力な助けとなりますが、最終的なデバッグと検証は人間の役割です。

  • mcts-gen

    mcts-gen:AIエージェント統合型 次世代MCTSフレームワーク

    先日開発した mcts-gen は、標準的なUCT(Upper Confidence Bound 1 applied to Trees)アルゴリズムにAIエージェントを統合した、汎用的なMCTS(モンテカルロ木探索)フレームワークです。

    従来の chess-ant がGenetic Programming(GP)ベースであったのに対し、mcts-genは設計を根本から見直しました。Policy(方策)やValue(価値)の予測を外部AIエージェント(例えばgemini-cli)と連携させることで、探索効率と応用範囲を大幅に拡張しています。

    FastMCPによるAIエージェント連携

    このプロジェクトの核となるのは、FastMCP を介したAIエージェントとの通信です。mcts-genの探索エンジンは、MCP (Model Context Protocol) を通じて外部のAIエージェントと通信し、局面に応じたポリシー予測や価値評価を受け取ります。

    特に spec-kitgemini-cli を組み合わせ、AIをバックエンドとしたMCTSサーバーを生成・構築できる点が大きな特徴です。これにより、高速で柔軟な探索環境が実現します。

    未知領域探索への応用とPolicy Pruning

    MCPサーバーの導入により、このフレームワークは学習済みデータに基づく既存の知識空間だけでなく、未経験・未知の局面への探索も可能としました。

    AIエージェントによるPolicy Pruning(有望手の絞り込み)機能により、広大で非効率になりがちな探索空間の中から、効率的に有益な手だけを選び出して深く探索できます。これは、複雑な問題や新しいゲームへの応用において非常に強力なアドバンテージとなります。

    spec-kitワークフローの注意点(教訓)

    spec-kitのような高度な開発ツールを使用する際は、ワークフローの順守が不可欠です。

    spec-kitでは、/speckit.specify, /speckit.plan, /speckit.tasks といったスラッシュから始まるコマンドを実行すると、作業内容がMarkdownファイルに自動で記録され、新しいGitブランチも作成されます。その後、メインストリームへのマージ作業を行うのが基本の流れです。

    私の場合、コマンドを実行せずに直接GeminiにMarkdownファイルの更新を依頼したため、過去の作業記録が上書きされて失われてしまいました。これはGeminiの動作によるものではなく、規定の手順を踏まなかった私の操作ミスが原因です。ツールが意図するワークフローを守ることの重要性を改めて痛感しました。

    uvによるgemini-cliとFastMCP管理

    gemini-cliおよびFastMCPの公式推奨設定例 Gemini CLI 🤝 FastMCP では、uvコマンド による環境管理が原則とされています。

    uvはPythonパッケージの仮想環境管理ツールで、極めて高速かつクリーンな依存関係管理を可能にします。Rustで書かれており、従来のパッケージ管理ツールが抱えていたパフォーマンスの問題を解決します。

    Ubuntuでのuvインストールと使用法

    mcts-genプロジェクトでuvを利用するための基本的な手順は以下の通りです。

    pipxのインストール:

    sudo apt install pipx

    uvのインストール:

    pipx install uv

    基本的な利用方法。プロジェクトディレクトリで以下のコマンドを実行します:

    uv venv
    source .venv/bin/activate
    uv pip install mcts-gen[shogi]
    fastmcp install gemini-cli .venv/lib/python3.12/site-packages/mcts_gen/fastmcp_server.py:mcp

    コマンドを実行すると .gemini/settings.json が生成されます。
    因みに末尾の :mcpfastmcp_server.py にあるオブジェクト名です。オブジェクトが2つあるためか、自動でFastMCPサーバーのオブジェクトが認識されないので指定しなければなりません。run() メソッドで実行されます。
    仮想環境を終了するには deactivate コマンドを使います。

    マニュアルにある AGENTS.mdv0.0.2 で廃止しコード化しました。AIに指示を追加する場合のみcontextの設定を .gemini/settings.json に追記してください。


    mcts-genは、探索手法にAIの力を統合したいと考えるすべての開発者にとって、有力な選択肢となるはずです。詳細やセットアップ手順は、ぜひ公式ドキュメントも参考にしてください。

  • Gemini-JSCAD-Tool: GeminiとチャットしながらCAD開発する新しい体験

    概要

    gemini-jscad-tool は、Gemini CLI の拡張として開発されたツールで、JSCADを用いた3Dモデル生成を対話的に実現します。Geminiとチャットしながら、3Dモデルを作成し、リアルタイムにプレビュー&STLファイルに変換できます。

    特徴

    • 🔄 Geminiと自然言語でやり取りしながら設計できる
    • 🧊 JSCADモデルを作成し、STLへ変換
    • 🌐 ローカルのライブプレビューサーバーで即座にSTLの形状を確認可能
    • ⚙️ Gemini向け拡張機能の実装例としても活用可能

    インストール方法

    npm install -g gemini-jscad-tool

    インストール後、自動的に以下が行われます:

    • gemini-jscad-server コマンドがグローバルに配置される
    • gemini-extension.jsonGEMINI.md~/.gemini/extensions/jscad/ にコピーされる

    使用方法

    以下のように、Geminiとの会話ベースで操作を進めます。

    1. プレビューサーバーを起動

    あなた: Start the preview server.

    http://localhost:3000 にアクセスしてプレビュー。

    2. モデルを作成

    あなた: Create a 20mm cube.

    Geminiが自動的に .jscad ファイルを生成しSTLに変換後、プレビューサーバーに反映。

    3. サーバーを停止

    あなた: Stop the preview server.

    不要なプロセスの残留を防ぎます。

    STL変換について

    生成されたJSCADモデルは、ツール内部の処理を通じて STL形式に変換され、3Dプリント等にそのまま利用可能です。

    Gemini CLI拡張機能の開発に関して

    当パッケージは、Gemini CLI Extension 開発ガイドに則って作成されています。

    gemini-extension.json の基本構造とMCPサーバー登録

    拡張子 .json のこのファイルは、拡張(extension)ごとに最低1つ必要です。
    MCPサーバーの設定例は以下のようになります。
    因みにgemini-jscad-toolにはMCPサーバーは使用していません。後述の GEMINI.md で呼び出しを定義しています。

    マニュアルからの引用:

    {
      "name": "my-extension",
      "version": "1.0.0",
      "mcpServers": {
        "my-server": {
          "command": "node my-server.js"
        }
      },
      "contextFileName": "GEMINI.md",
      "excludeTools": ["run_shell_command"]
    }

    各項目の説明

    項目 必須 内容・役割
    name 拡張ディレクトリ名と同じにします。拡張の一意名識別子です。
    version 拡張のバージョン。任意の文字列(例 "1.0.0")。省略不可。
    mcpServers この拡張が使うMCPサーバーの "名前: 設定" マップ。各サーバーは必ずcommandプロパティが必要です。
    contextFileName 拡張についてAIへ与える文書ファイル名(通常はGEMINI.md)。省略可能。
    excludeTools Geminiに読み込ませたくないツール名列挙。(例 ["run_shell_command"]/["run_shell_command(rm -rf)"])省略可能。

    mcpServers の詳細

    MCP(Model Context Protocol) に準拠したサーバーの登録ができます。
    これにより、Geminiはサーバーを正しく起動・停止し、会話の中で状態管理することができます。

    mcpServers はオブジェクト形式で記述し、
    「サーバー識別名: 設定」 の形式でサーバーを複数登録できます。

    最小構成例:

    "mcpServers": {
      "my-server": {
        "command": "node my-server.js"
      }
    }
    • my-server:好きな識別名(ユニーク推奨)。
    • command:起動方法。実行ファイルやNodeスクリプト等を記述。

    コマンドにオプションや環境変数を指定したい場合

    因みに、 settings.jsonにもMCPサーバーを登録できます。
    非推奨パッケージになった @modelcontextprotocol/server-github
    設定例が書かれた記事も参照してください。

    マニュアルからの引用:

    "mcpServers": {
      "myPythonServer": {
        "command": "python",
        "args": ["mcp_server.py", "--port", "8080"],
        "cwd": "./mcp_tools/python",
        "timeout": 5000
      },
      "myNodeServer": {
        "command": "node",
        "args": ["mcp_server.js"],
        "cwd": "./mcp_tools/node"
      },
      "myDockerServer": {
        "command": "docker",
        "args": ["run", "-i", "--rm", "-e", "API_KEY", "ghcr.io/foo/bar"],
        "env": {
          "API_KEY": "$MY_API_TOKEN"
        }
      }
    }
    • args → コマンドライン引数
    • env → サーバープロセスの環境変数
    • cwd → サーバを起動する作業ディレクトリ
    • timeout → このMCPサーバーへのリクエストのタイムアウトをミリ秒単位で行います

    contextFileName について

    gemini-extension.json の説明に戻ります。
    この拡張のガイドやAI連携ガイダンスを含むMarkdownファイル名です。
    省略時は拡張ディレクトリ内の GEMINI.md が自動検出されます。

    excludeTools について

    Gemini CLIが利用可能なツールで、本拡張では“除外”したいものを配列で指定します。

    例:

    • すべてのシェルコマンド実行を除外
      "excludeTools": ["run_shell_command"]
    • 特定の危険コマンドのみ除外
      "excludeTools": ["run_shell_command(rm -rf)"]

    設定の優先順位と適用範囲

    • 個人設定(~/.gemini/extensions/)よりワークスペース直下(/.gemini/extensions/)の拡張が優先されます。
    • MCPサーバー設定はsettings.jsonの内容が同名の場合はそちらが上書きします。

    よくある誤り

    • mcpServersは必ずマッピング形式(オブジェクト)で書く。[マニュアル例と食い違う原因の多く]
    • サーバーごとに必ずcommandプロパティが必要

    GEMINI.md の役割

    GEMINI.md には、Geminiが拡張機能と対話する際のワークフローやコマンド定義がMarkdown形式で記述されています。例として下記のように構成します:

    # jscad Extension
    
    ## Commands
    
    ### Start Server
    User: Start the preview server.
    Gemini runs: gemini-jscad-server
    
    ### Create Model
    User: Create a 20mm cube.
    Gemini writes: cube({size: 20})
    
    ### Stop Server
    User: Stop the preview server.
    Gemini stops: jscad_preview

    これにより、Geminiは自動的に動作フローを把握し、ユーザーの自然言語要求をコード生成やファイル操作にマッピングします。

    コード・リソース

    おわりに

    gemini-jscad-tool は、AIとの自然な対話3D設計と即時プレビューの連携を実現した次世代のCLI拡張です。Gemini CLI拡張の実践例としても最適なので、カスタム開発の参考にもご活用ください。

    3D設計をもっと気軽に、もっと賢く―
    Geminiと一緒なら、それが可能です。

  • Ubuntuで2要素認証(2FA)を導入する方法【OTPClient活用ガイド】

    2FA(二要素認証)とは?

    2FA(Two-Factor Authentication、二要素認証)は、アカウントやサービスへのログイン時に「2つの異なる要素」で本人確認を行うセキュリティ手法です。
    一般的には「パスワード(知識情報)」+「ワンタイムパスワードやスマートフォン(所持情報)」の組み合わせが用いられます。これにより、万が一パスワードが漏れても、不正ログインを防ぐことができます123

    2FAを採用している主なウェブサービス

    サービス名 2FA設定ガイドへのリンク
    GitHub GitHub 2FA設定方法4
    PyPI PyPI 2FA設定方法5
    Google Google 2段階認証設定6
    ChatGPT ChatGPT 2FA設定方法7

    Ubuntuで使える2FA用ソフトウェア「OTPClient」

    OTPClientとは?

    • OTPClientは、TOTP(時刻ベース)・HOTP(カウンターベース)両対応のワンタイムパスワード生成アプリです。
    • ローカルデータベースはAES256-GCMで暗号化され、Argon2idによる鍵導出を採用しており高いセキュリティを誇ります8
    • 主要な2FAサービス(Google、GitHub、PyPIなど)に対応。

    Ubuntuへのインストール方法

    1. パッケージリストを更新
      sudo apt update
    2. OTPClientをインストール
      sudo apt -y install otpclient

      apt-getaptitudeでもインストール可能です9

    サイトのQRコード画像の保存と変換

    1. QRコード画像の保存
      2FA設定画面で表示されるQRコード画像を右クリック→「名前を付けて画像を保存」で保存します。

    2. SVG形式の場合のPNG変換
      SVG形式で保存された場合は、Inkscapeを使ってPNG形式にエクスポートできます。

      • InkscapeでSVGファイルを開く
      • 「ファイル」→「エクスポート」→「PNG画像としてエクスポート」

    OTPClientでの2FAトークン追加手順

    1. OTPClientを起動
    2. 「+」ボタンをクリックし「Add token」を選択
    3. 「Using a QR Code」→「From File」を選び、保存したQRコード画像を指定
    4. 登録後は、ワンタイムパスワードの項目をクリックするだけでクリップボードにコピーされます

    リカバリーコード(バックアップコード)の重要性

    • 2FAを有効化すると、万が一スマホやOTPClientにアクセスできなくなった場合に備えてリカバリーコード(バックアップコード)が発行されます。
    • 必ず安全な場所に保存し、第三者に見られないよう管理してください。
    • ログイン時に認証アプリが使えない場合、このリカバリーコードでアクセス回復が可能です1011

    まとめ

    Ubuntu環境でもOTPClientを使えば、主要なウェブサービスの2FAを簡単かつ安全に管理できます。リカバリーコードの保管も忘れずに、セキュリティを強化しましょう。

  • キャパシタ

    以下は私が2025年5月31日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。

    JDIが開発可能なキャパシタ技術(スーパーキャパシタ)を、充電池として新規事業化することを提案します。スーパーキャパシタは、リチウムイオン電池と比較して急速充電・放電性能、長寿命、安全性、広い温度耐性に優れ、近年では自動車の回生システムやウェアラブル端末、IoT機器、非常用電源など多様な分野で採用が進んでいます。

    例えば、スイスの電動バスでは15秒の急速充電で走行が可能となり、メンテナンスコスト削減と信頼性向上を実現しています。また、スーパーキャパシタは100万回以上の充放電サイクルに耐え、長期運用コスト低減にも寄与します。JDIの精密な薄膜・パターニング技術を活かせば、より高性能なキャパシタの量産化が期待できます。

    今後、エネルギー密度向上やハイブリッド型電池との組み合わせで、更なる市場拡大が見込まれるため、JDIの新たな成長分野として積極的な開発・事業化を提案いたします。

  • AIデバイス

    以下は私が2025年5月31日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。

    OpenAIによるIo社の買収を受け、AIハードウェア分野での新端末開発が加速する中、JDIが開発中の先端半導体パッケージング技術をIoデバイス向けに積極的に提案・展開することを要望します。

    Io社は元Appleのジョナサン・アイブ氏らが設立し、AIを活用した新しい消費者向けハードウェア製品を開発しており、今後OpenAIグループの中核的なデバイス開発拠点となる見通しです。こうした次世代AIデバイスは、高速・大容量データ処理、高密度実装、省電力化、放熱対策など、半導体パッケージ基板に従来以上の性能が求められます。

    JDIのガラス基板技術は、表面粗さ0.01μm未満という極めて滑らかな表面を実現し、高周波数帯域(28GHz以上)でも伝送損失を大幅に低減できます。また、ガラス基板は剛性・熱安定性に優れ、チップレット化や大型化が進むAIプロセッサ基板において、歪みや反りを抑えつつ高密度配線(L/S=5/5μm)が可能です。さらに、PanelSemi社との共同開発により、ディスプレイ由来のTFT技術やセンサー用フレキシブル基板も展開でき、Io社の多様なデバイス設計要求に柔軟に対応できます。

    AI半導体パッケージング市場は2034年までに年20兆円規模へ成長が見込まれており、JDIの技術はIoデバイスの競争力強化に大きく貢献できると確信します。

    つきましては、JDIがIo社およびOpenAIグループに対し、積極的な技術提案と協業体制の構築を推進されることを強く提案いたします。

  • トランプ政権下での米国内製造拠点の確立について

    以下は私が2025年3月20日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。

    1. 米国内製造拠点の確立

    貴社はOLEDWorksとの戦略的提携を通じて米国内に製造拠点を設立する計画を発表しました。この取り組みを加速し、ディスプレイ製造に加えて半導体パッケージング事業も米国内で展開することを提案します。これにより、地政学的リスクの軽減と米国市場へのアクセス強化が期待できます。

    2. インテルとの戦略的提携の模索

    経営難でもインテルのアーキテクチャは依然として業界に大きな影響力を持っています。貴社の強みを活かした提携を提案します:

    • セラミック基板技術: PanelSemiとの提携で開発中の高性能セラミック基板は、AIチップの熱問題解決に貢献します。
    • BBCube: TEXが保有するBBCube製造技術をインテルは次世代三次元集積技術の開発に活かせます。

    貴社や貴社の提携会社にとって、インテルとの提携は、技術開発のみならず、インテルが持つ販路の獲得にも繋がるので、提携交渉すべきです。

    3. IR情報の頻繁な更新

    新規事業、特にデータセンターや半導体パッケージングの進捗状況について、毎月の詳細な報告を提案します。これにより、株主との信頼関係を強化し、貴社の成長戦略への理解を深めることができます。

    以上の施策により、貴社の競争力強化と企業価値向上を図ることができると考えます。ご検討のほど、よろしくお願いいたします。

  • Doom Emacsのキーバインドと管理コマンド:標準Emacsとの違い

    Doom EmacsはEmacsの機能を拡張し、Vimライクな操作性を取り入れた強力なエディタです。本記事では、標準Emacsとの主要な違いを中心に、キーバインドと管理コマンドについて解説します。

    主要なキーバインドの違い

    1. 基本操作

    操作 標準Emacs Doom Emacs
    コマンド実行 M-x SPC : または M-x
    ファイルを開く C-x C-f SPC .
    ファイルを保存 C-x C-s SPC f s または :w (Evilモード)
    バッファ切り替え C-x b SPC b b
    バッファ削除 C-x k SPC b d

    2. ウィンドウ操作

    操作 標準Emacs Doom Emacs
    ウィンドウ分割(垂直) C-x 3 SPC w v
    ウィンドウ分割(水平) C-x 2 SPC w s

    3. 検索と置換

    操作 標準Emacs Doom Emacs
    インクリメンタル検索 C-s / (Evilモード) または C-s
    プロジェクト内検索 なし(追加パッケージが必要) SPC s p

    4. その他

    操作 標準Emacs Doom Emacs
    キーバインドのヘルプ C-h k SPC h k
    プロジェクト切り替え なし(追加パッケージが必要) SPC p p
    設定ファイル編集 手動でファイルを開く SPC f p

    スクロールのキーバインド

    Doom EmacsはVimライクなスクロール操作を採用しています:

    • 1ページ分下にスクロール: Ctrl-f または <PageDown>
    • 1ページ分上にスクロール: Ctrl-b または <PageUp>
    • 半ページ分下にスクロール: Ctrl-d
    • 半ページ分上にスクロール: Ctrl-u

    コメントアウトとアンコメント

    Doom Emacsでは以下のキーバインドでコメント操作を行います:

    • 選択した行をコメントアウト/アンコメント: gcc
    • 選択範囲をコメントアウト/アンコメント: gc(ビジュアルモードで範囲選択後)

    テキスト選択(Visual Mode)

    標準EmacsではCtrl+SPCでマーク開始しますが、Doom Emacsではvimのようにvisual modeで選択します:

    • 文字単位の選択: v
    • 行単位の選択: V(Shift + v)
    • 矩形選択: Ctrl-v
    • 単語選択: viw
    • 選択モードの終了: ESCまたはCtrl-[

    選択後の操作:

    • コピー: y
    • 切り取り: d
    • 削除: x
    • 置換: c
    • コメントアウト/アンコメント: gc

    Doomコマンドの基本

    Doom Emacsの管理にはdoomコマンドを使用します。主要なコマンドは以下の通りです:

    1. doom sync: 設定の変更を反映し、パッケージを更新
    2. doom upgrade: Doom Emacsとそのパッケージを最新版にアップグレード
    3. doom doctor: Doom Emacsの環境に問題がないかチェック
    4. doom env: Doomの環境変数を更新
    5. doom purge: 不要なパッケージや古いビルドファイルを削除

    設定ファイルを変更した後は、必ずdoom syncを実行して変更を反映させましょう(init.elpackages.elconfig.elは不要)。Doom Emacsにインストールされているパッケージによってはaptでインストールしなければならないソフトウェアを呼び出すことがあるので注意が必要です。doom doctorで確認しましょう。1

    sudo apt install ripgrep fd-find shellcheck

    以下はREADMEからの機械翻訳です。マニュアルには更に詳しい説明があります:

    • doom sync は、不足しているパッケージをインストールし、孤立したパッケージを削除し、キャッシュを再生成することで、プライベート設定を Doom と同期します。プライベート init.el または packages.el を変更するとき、または OS パッケージ マネージャーを介して Emacs パッケージ (mu4e や agda など) をインストール/削除するときは、必ずこれを実行します。
    • doom upgrade は、Doom を最新リリースおよびインストールされているすべてのパッケージに更新します。
    • doom doctor は、システムと設定の一般的な問題を診断します。
    • doom env は、起動時に Doom が読み込むファイルにシェル環境のスナップショットをダンプします。これにより、Emacs は PATH などを継承できます。

    まとめ

    Doom Emacsは標準Emacsとは異なるキーバインドを採用していますが、これにより直感的で効率的な操作が可能になっています。ただし、従来のEmacsユーザーにとっては学習曲線がある点に注意が必要です。doomコマンドを効果的に使用することで、環境を最適な状態に保ち、スムーズな編集体験を維持することができます。

  • Doom Emacsのインストールと設定

    インストール手順

    1. Doom Emacsのリポジトリをクローンする

      git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
    2. Doom Emacsをインストールする

      ~/.config/emacs/bin/doom install

      これにより、設定ファイルは~/.config/doom/に、Doom Emacs用のユーザーディレクトリuser-emacs-directory~/.config/emacs/にインストールされます。従来のEmacsのユーザーディレクトリは~/.emacs.d/のままですので、影響を受けることはありませんが、バックアップを取ることをお勧めします。

    3. パスの設定
      Doomコマンドのパスは~/.config/emacs/bin/doomです。システム全体で利用できるようにパスを通すには、以下の方法があります。

      • .bashrcや.zshrcに追加

        echo 'export PATH=$PATH:$HOME/.config/emacs/bin' >> ~/.bashrc
        source ~/.bashrc

        または

        echo 'export PATH=$PATH:$HOME/.config/emacs/bin' >> ~/.zshrc
        source ~/.zshrc

        .bashrc以外のファイルでもパスを設定できますが、使用するシェルやログイン方法によって読み込まれるタイミングが異なります。

        • .bashrc: 通常、ターミナルを新しく開くたびに読み込まれます。
        • .profile: ログインシェル時に読み込まれます。ターミナルを新しく開くたびに読み込まれないため、反映するにはターミナル内でsource ~/.profileを実行する必要があります。
        • .bash_aliases: 通常、.bashrc内で読み込まれるように設定されています。.bashrcが読み込まれるたびに自動的に読み込まれます。

    Doom Emacsの起動

    Doom Emacsを起動するには、以下のコマンドを使用します(Emacs 29以降)。Emacsの変数user-emacs-directoryを指定して起動するためです。1 2

    emacs --maximized --init-directory ~/.config/emacs/

    --maximizedオプションは画面を最大化するためのもので、省略可能です。ショートカットキーに登録すると便利です。
    Ubuntuの場合は以下の通りです:

    1. 設定
    2. キーボード
    3. ショートカットの表示と設定
    4. 独自のショートカット
    5. +をクリック

    ~/.bash_aliasesにエイリアスを登録しても良いでしょう。

    alias emacs.doom='emacs --maximized --init-directory ~/.config/emacs/'

    基本的な使い方

    Doom EmacsはVimユーザーにも親しみやすい設定が整っています。基本的な操作はVimと似ていますが、Emacs独自の機能も多く利用できます。
    All-the-icons fontsの文字化けはM-x nerd-icons-install-fontsを実行すれば解消されます。3

    Doomコマンドの基礎

    Doomコマンドは、Doom Emacsの設定やパッケージ管理に利用されます。例えば、パッケージをインストールする際には、Doom Emacs内で特定のコマンドを実行します。

    予めインストールされるパッケージ

    Doom Emacsには、多くの便利なパッケージがデフォルトでインストールされています。これにより、すぐにでも効率的な開発環境を構築できます。
    多くは~/.config/doom/init.elの各行をアンコメントし、doom syncすることですぐに有効化出来ます。4

    Doom Emacsでパッケージをインストールする方法

    Doom Emacsでは、straight.elがデフォルトのパッケージマネージャーとして使用されています。新しいパッケージをインストールするには、設定ファイルを編集してからdoom syncコマンドを実行する必要があります。

    Codeium.elのインストールと設定

    1. Codeium.elのインストール
      Doom Emacsでは、codeium.elを直接インストールする方法は通常のEmacsと異なります。まず、~/.config/doom/packages.elに以下のコードを追加します:

      (package! codeium :recipe (:host github :repo "Exafunction/codeium.el"))

      編集後は、以下のコマンドで設定を反映させます:

      ~/.config/emacs/bin/doom sync

      次にDoom Emacs内で以下のコマンドを実行します:

      M-x codeium-install

      APIキーを自動取得するオプションが表示されます。autoを選択すると、Webブラウザでログイン画面が表示され、ログイン後にAPIキーが自動取得されます。
      ~/.config/doom/custom.elに保存されます。

    2. 設定
      codeium.elの設定は、customize-variableコマンドではなく、~/.config/doom/config.elを直接編集する必要があります。編集後は、doom syncは不要です。

      以下のコードは、codeium-completion-at-pointcompletion-at-point-functionsに追加するものです:

      (add-to-list 'completion-at-point-functions #'codeium-completion-at-point)

      このコードにより、Codeiumの補完機能が有効になります。また、codeium.elの設定をコピーしても良いでしょう。ただし、codeium.elが正しくインストールされ、他の設定が競合していないことを確認する必要があります。