Debian グッズ販売を始めました。UP-Tのサービスを利用しています。
- インストールメディアを販売している、このサイトとはシステムが別ですので御注意ください。
- 商品はUP-Tから直送されます。
- Debianへの寄付は仲介していません。
- 国内発送のみです。
Debian グッズ販売を始めました。UP-Tのサービスを利用しています。
Perplexity AIや他のLLMの知恵を借りて、サーバ管理やプログラミングに役立つ知識を紹介していきます。その他の記事もたまに書きます。
サーバー移設中につき、暫く御不便をかけます。
旧サイトのアカウントは削除しますので、御注文前に新たに登録し直して下さい。
fpocket を題材にした CI/CD と Snapcraft 実践録
ここでは、私がオープンソースの分子ポケット検出ツール fpocket を snap パッケージ として公開しようと試みた経験をまとめます。
Snapcraft の基本から GitHub Actions を用いた CI/CD、自動更新チェックの仕組み、そしてつまづいたポイントまで、私が実際に体験した内容を中心に書いています。
snap パッケージ化に興味がある方や、CI を使った自動ビルド・公開を行いたい方の参考になれば幸いです。
Linux ディストリビューション間で依存関係の差があると、バイナリ配布が難しくなることがあります。
fpocket は C 言語製で比較的コンパイルしやすいのですが、一般ユーザーにとってはインストールの手順が多く、簡単とは言えません。
そこで、クリック一つでインストールできる snap パッケージとして提供できれば便利だと考え、開発を始めました。
しかし、snapcraft は奥が深く、パッケージング・CI/CD・Snap Store 運用など、多くの学びがありました。
この記事では、そうした経験を整理して紹介します。
まず、Snapcraft の基本を簡単におさらいします。
snap にはアプリの権限レベルを示す confinement(制限モード) があり、次の 3 種類があります。
| モード | 説明 |
|---|---|
| strict | 最も制限が強く、標準的なモード。Snap Store で公開する場合は基本これ。 |
| devmode | 開発用。strict に必要な許可が足りていない場合でも動くが、公開不可。 |
| classic | 権限制限なし。伝統的ツール向け。使用には審査が必要。 |
一般的な CLI ツールは strict で動かすのが基本です。また今回の fpocket-snap では、 interfaces は home のみを使用します。
snap のビルドには複数の方法があり、それぞれ環境の隔離強度が異なります。
| ビルド方法 | 特徴 |
|---|---|
| Multipass | core20の場合、Multipassはすべてのプラットフォームでデフォルトのプロバイダー。 |
| LXD | core22以降では、LinuxではLXDがデフォルトプロバイダーであり、macOSおよびWindowsではMultipassがデフォルトとなる。 |
| –destructive-mode | ホスト環境でビルド。再現性は低いが高速。 |
この中で、特に注意が必要なのが --destructive-mode です。後述します。
--destructive-mode とは何かSnapcraft には、ビルド時に --destructive-mode という特別なオプションがあります。
snapcraft --destructive-mode
結論として、このモードでビルドした snap を Snap Store に公開するべきではありません。
理由は次の通りです。
core22 指定なのに Ubuntu 24.04 でビルドすればエラーになるでしょう。GitHub でホストされる runner (この場合はUbuntu)がずっと同じバージョンとは限りません。
つまり、開発や検証のためのモードであり、最終版の公開には使用しないのが正しい使い方です。
私が構築したリポジトリは次のような構成にしています。
fpocket-snap/
├── .github/
│ └── workflows/
│ ├── release.yml
│ └── upstream-check.yml
└── snap/
└── snapcraft.yaml
GitHub Actions で自動ビルド・公開し、加えて upstream の fpocket に更新がないか定期的にチェックする仕組みを入れています。
snap/snapcraft.yaml の詳細解説Snapcraft の定義ファイルは本来リポジトリ直下に置くことが多いのですが、今回は整理のために snap/ ディレクトリに配置しました。
snap/ に置く理由fpocket-snapのsnap.yamlを参照してください。
内容としては次のポイントが重要です。
makefile に書かれているパス等の調査を反映parts でソースコードとビルド手順を指定build-packages はコンパイルに必要なパッケージstage-packages はランタイム依存| 項目 | 説明 |
|---|---|
| summary | ストアの検索結果などに表示(短文) |
| description | 詳細ページに表示(複数行OK) |
| title | 見出しとして表示される(省略可) |
| 作成者名 | snapcraft.yaml 内には不要(ストア登録時にアカウント名が自動的に「publisher」として表示) |
| README.md | 自動では反映されない。description部分が代わりに使われる。 |
| スクリーンショット | 手動でSnapcraftダッシュボードからアップロード可能。 |
| フィールド | 目的 | fpocket の場合の内容 |
|---|---|---|
| website | Snapパッケージに関する公式ページ(=あなたがメンテナンスしているsnapラッパープロジェクト) | 🔗 https://github.com/akuroiwa/fpocket-snap |
| source-code | ソフトウェア本体(上流プロジェクト)のソースコードURL | 🔗 https://github.com/Discngine/fpocket など、fpocketの公式リポジトリ |
Snapcraft の定義は簡潔ですが、Tiny な CLI ツールには十分です。
release.ymlこの workflow は タグを切ったときに snap をビルドして Store へ公開するためのものです。
主な流れは次のとおりです。
snapcraft.yaml が snap/ にある場合デフォルトではルートにあると認識されるため、次の指定が必要です。
with:
path: snap/
これがないとビルドが失敗します。
パッケージ名は事前に調べ、snap store に存在しないことを確認しなければなりません。Ubuntu One のアカウントが必要です。
snapcraft register fpocket
snapcraft export-login --snaps fpocket --channels stable,edge snapcraft_token.json
snapcraft logout
生成したトークンの中身(ファイル内の文字列)を GitHub Actions の secret にペーストし保存しますが、その際に yml ファイルから呼び出す環境変数名でなければなりません。
私の場合、トークン生成時にチャンネル指定の不備が原因で公開に失敗し、再登録後に workflow を re-run して修正することがありました。使用するチャンネルが複数ある場合は必ず指定しなければなりません。
upstream-check.ymlfpocket 自体の更新を監視するための workflow です。
fpocket の upstream に動きがあった際に素早く対応できるので便利です。
snapcore/action-build@v1Snap をビルドする Action です。この アクション は自動で LXD を使います。
snapcore/action-publish@v1ビルドした snap を Snap Store のチャネルに公開します。
with:
release: stable
チャネルとしては stable, candidate, beta, edge が選べます。
オプション無しでインストールできるのは stable(安定版)のみです。
snapcore/action-build@v1 の出力は id: build を付けることで ${{ steps.build.outputs.snap }} として利用可能です。これにより、.snap の明示的なパス指定(snap/*.snap)が不要になります。
ここからは、私が実際に遭遇したトラブルです。
snapcraft list-revisions
は現在、
snapcraft revisions
にリネームされています。
古いコマンドを使うと警告が出ます。
snapcraft revisions fpocket #Rev.としてrevision番号を出力する
snapcraft release fpocket 1 stable #Rev.を特定した1で指定しstableに昇格する
snapcraft export-login で作成したトークンが権限不足で動作せず、
workflow が失敗することがありました。
再生成と再登録で解決しました。
設定順序の問題で snapcraft が正しく読み込まれず、ビルドエラーが発生したこともあります。snapcore/action-build@v1 実行後でなければ動作しません。snapcraft: command not foundと怒られてしまいます。
workflow ファイルの記述順は意外と重要です。
fpocket の snap 化を通じて、多くの知見を得ました。
--destructive-mode は開発時に便利だが、本番公開には不向きsnap パッケージの配布は、Linux ユーザーにとってインストール手順を大幅に簡略化できるメリットがあります。
今後は multi-arch 対応や、自動テストなどを取り入れて改善していきたいと思います。
この記事では、私が最近行った2つのプロジェクトmcts-genとpy-chessboardjsでの開発記録を基に、AIを活用したspec-kitツールの使い方、GitHub Actionsを用いたCI/CDワークフローの構築、そしてPyPIのTrusted Publisher設定について解説します。
プロジェクトmcts-gen(akuroiwa/mcts-gen)において、spec-kitのバージョン更新を行いました。この際、古いファイルの削除に手間取りました。また、仮想環境管理ツールuvxを用いた初期インストール手順が、恒久的なツールの利点を享受できない原因となりました。
以前のバージョンでspecify initを実行していたため、新しいバージョンのspec-kitを導入する際、古いコマンド定義ファイルが残ってしまいました。
現在のgemini-cliでspec-kitのコマンドは全て/speckit.から始まりますが、古いバージョンでは異なっていました。
【新しいspec-kitのインストール】
仮想環境をアクティベートし、uv tool installで最新版を取得します。因みにこのuv tool install は 「システム全体(またはユーザーローカル)」に独立した環境を作ってツールを入れる、という働きをしますのでvenvと関わりはありません。他のプロジェクトの仮想環境でもspecifyコマンドを使用できます。Ubuntuの場合のコマンドの場所は~/.local/bin/specifyです。
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/以下に作成されます。
因みに、Upgrade Guide ではAIエージェントを予め指定するオプションを推奨しています。
specify init --here --force --ai gemini
【新規ファイルの確認】
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/といったサブディレクトリが含まれます。
新しいコマンドファイルと競合する古いファイルを特定し、手動で削除する必要がありました。
古いコマンド定義ファイルの削除
cd .gemini/commands/
rm plan.toml
rm specify.toml
rm tasks.toml
cd -
古い.specify関連ファイルの削除
rm -rf memory/
rm -rf templates/
rm -rf scripts/
💡 ヒント: コマンド定義ファイルが管理対象外になるように、.gitignoreに.geminiを追加することも検討できます。ただし、その場合はgit statusには表示されなくなります。
既存のプロジェクトpy-chessboardjs(akuroiwa/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のコアな使い方は、事前に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 # 作業ブランチを削除
パッケージの自動公開のために、GitHub Actionsのワークフローを.github/workflows/にYAMLファイルで記述します。このYAMLファイルはGeminiに依頼して作成してもらうことが可能ですが、動作確認が不可欠です。
この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の構文エラーをリアルタイムに確認でき、大変便利です。
py-chessboardjsの開発中に遭遇した2つの不具合は、AIによる開発支援の限界と可能性を示す良い事例となりました。
C:\fakepath\)現象: チェスエンジンのパス指定が機能しないエラーが発生し、出力にはFileNotFoundError: [Errno 2] そのようなファイルやディレクトリはありません: 'C:\\fakepath\\stockfish'とありました。
解決: Google検索の結果、「fakepath」はHTMLのファイル入力フィールドがセキュリティ上の理由から実際のパスを隠蔽するブラウザの挙動であることが判明しました。この情報をGeminiに提供したところ、**「input type="file"をボタンに置き換え、pywebview.apiを介してPythonのネイティブファイルダイアログを呼び出す」**という正確な解決策が提示され、実装に成功しました。
concurrent.futures.CancelledError)現象: キャスリングを行うとエラーが発生しました。
解決: ログからconcurrent.futures.CancelledErrorが見つかり、並列処理の不具合が疑われました。原因は、プロジェクトが使用しているchessboardjsの古いバージョンにあり、キャスリング時にFEN(盤面情報)が複数回更新され、チェスエンジンが処理しきれなかった可能性が高いと特定しました。
以下はGeminiによる解説です:
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はイベントループ上でタスクを実行し、通常は単一のスレッドで行われます。
競合 (レースコンディション):
解決策 (専用ワーカースレッド):
specs/002-fix-castling-errorの削除について
削除したのは良い判断でした。002-fix-castling-errorブランチとその関連する仕様ファイルは、バグ修正の失敗した試みを表していました。それらを残しておくと、誤った情報や置き換えられた情報でリポジトリが煩雑になります。
フィーチャーの試みが失敗したり、新しいアプローチに置き換えられたりした場合は、古いブランチとその成果物をクリーンアップするのがベストプラクティスです。これにより、プロジェクトの履歴がクリーンに保たれ、成功した作業や関連する作業のみが反映されます。
新しい003-fix-engine-concurrencyブランチとその仕様は、根本的な並行処理の問題を解決するための現在の成功したアプローチを正確に反映しています。
これらの事例から学んだのは、Geminiでも不具合の特定は難しく、ユーザーとの共同作業であるということです。特に、エラー出力や挙動を注意深く観察し、根気強くAIにフィードバックすることが、適切な解決策を導き出すために不可欠となります。AIは強力な助けとなりますが、最終的なデバッグと検証は人間の役割です。
先日開発した 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エージェントとの通信です。mcts-genの探索エンジンは、MCP (Model Context Protocol) を通じて外部のAIエージェントと通信し、局面に応じたポリシー予測や価値評価を受け取ります。
特に spec-kit と gemini-cli を組み合わせ、AIをバックエンドとしたMCTSサーバーを生成・構築できる点が大きな特徴です。これにより、高速で柔軟な探索環境が実現します。
MCPサーバーの導入により、このフレームワークは学習済みデータに基づく既存の知識空間だけでなく、未経験・未知の局面への探索も可能としました。
AIエージェントによるPolicy Pruning(有望手の絞り込み)機能により、広大で非効率になりがちな探索空間の中から、効率的に有益な手だけを選び出して深く探索できます。これは、複雑な問題や新しいゲームへの応用において非常に強力なアドバンテージとなります。
spec-kitのような高度な開発ツールを使用する際は、ワークフローの順守が不可欠です。
spec-kitでは、/speckit.specify, /speckit.plan, /speckit.tasks といったスラッシュから始まるコマンドを実行すると、作業内容がMarkdownファイルに自動で記録され、新しいGitブランチも作成されます。その後、メインストリームへのマージ作業を行うのが基本の流れです。
私の場合、コマンドを実行せずに直接GeminiにMarkdownファイルの更新を依頼したため、過去の作業記録が上書きされて失われてしまいました。これはGeminiの動作によるものではなく、規定の手順を踏まなかった私の操作ミスが原因です。ツールが意図するワークフローを守ることの重要性を改めて痛感しました。
gemini-cliおよびFastMCPの公式推奨設定例 Gemini CLI 🤝 FastMCP では、uvコマンド による環境管理が原則とされています。
uvはPythonパッケージの仮想環境管理ツールで、極めて高速かつクリーンな依存関係管理を可能にします。Rustで書かれており、従来のパッケージ管理ツールが抱えていたパフォーマンスの問題を解決します。
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 が生成されます。
因みに末尾の :mcp は fastmcp_server.py にあるオブジェクト名です。オブジェクトが2つあるためか、自動でFastMCPサーバーのオブジェクトが認識されないので指定しなければなりません。run() メソッドで実行されます。
仮想環境を終了するには deactivate コマンドを使います。
マニュアルにある AGENTS.md は v0.0.2 で廃止しコード化しました。AIに指示を追加する場合のみcontextの設定を .gemini/settings.json に追記してください。
mcts-genは、探索手法にAIの力を統合したいと考えるすべての開発者にとって、有力な選択肢となるはずです。詳細やセットアップ手順は、ぜひ公式ドキュメントも参考にしてください。
gemini-jscad-tool は、Gemini CLI の拡張として開発されたツールで、JSCADを用いた3Dモデル生成を対話的に実現します。Geminiとチャットしながら、3Dモデルを作成し、リアルタイムにプレビュー&STLファイルに変換できます。
npm install -g gemini-jscad-tool
インストール後、自動的に以下が行われます:
gemini-jscad-server コマンドがグローバルに配置されるgemini-extension.json と GEMINI.md が ~/.gemini/extensions/jscad/ にコピーされる以下のように、Geminiとの会話ベースで操作を進めます。
あなた: Start the preview server.
→ http://localhost:3000 にアクセスしてプレビュー。
あなた: Create a 20mm cube.
Geminiが自動的に .jscad ファイルを生成しSTLに変換後、プレビューサーバーに反映。
あなた: Stop the preview server.
不要なプロセスの残留を防ぎます。
生成されたJSCADモデルは、ツール内部の処理を通じて STL形式に変換され、3Dプリント等にそのまま利用可能です。
当パッケージは、Gemini CLI Extension 開発ガイドに則って作成されています。
拡張子 .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)"])省略可能。 |
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サーバーへのリクエストのタイムアウトをミリ秒単位で行いますgemini-extension.json の説明に戻ります。
この拡張のガイドやAI連携ガイダンスを含むMarkdownファイル名です。
省略時は拡張ディレクトリ内の GEMINI.md が自動検出されます。
Gemini CLIが利用可能なツールで、本拡張では“除外”したいものを配列で指定します。
例:
"excludeTools": ["run_shell_command"]
"excludeTools": ["run_shell_command(rm -rf)"]
~/.gemini/extensions/)よりワークスペース直下(/.gemini/extensions/)の拡張が優先されます。settings.jsonの内容が同名の場合はそちらが上書きします。commandプロパティが必要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と一緒なら、それが可能です。
2FA(Two-Factor Authentication、二要素認証)は、アカウントやサービスへのログイン時に「2つの異なる要素」で本人確認を行うセキュリティ手法です。
一般的には「パスワード(知識情報)」+「ワンタイムパスワードやスマートフォン(所持情報)」の組み合わせが用いられます。これにより、万が一パスワードが漏れても、不正ログインを防ぐことができます123。
| サービス名 | 2FA設定ガイドへのリンク |
|---|---|
| GitHub | GitHub 2FA設定方法4 |
| PyPI | PyPI 2FA設定方法5 |
| Google 2段階認証設定6 | |
| ChatGPT | ChatGPT 2FA設定方法7 |
sudo apt update
sudo apt -y install otpclient
※apt-getやaptitudeでもインストール可能です9。
QRコード画像の保存
2FA設定画面で表示されるQRコード画像を右クリック→「名前を付けて画像を保存」で保存します。
SVG形式の場合のPNG変換
SVG形式で保存された場合は、Inkscapeを使ってPNG形式にエクスポートできます。
Ubuntu環境でもOTPClientを使えば、主要なウェブサービスの2FAを簡単かつ安全に管理できます。リカバリーコードの保管も忘れずに、セキュリティを強化しましょう。
以下は私が2025年5月31日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。
JDIが開発可能なキャパシタ技術(スーパーキャパシタ)を、充電池として新規事業化することを提案します。スーパーキャパシタは、リチウムイオン電池と比較して急速充電・放電性能、長寿命、安全性、広い温度耐性に優れ、近年では自動車の回生システムやウェアラブル端末、IoT機器、非常用電源など多様な分野で採用が進んでいます。
例えば、スイスの電動バスでは15秒の急速充電で走行が可能となり、メンテナンスコスト削減と信頼性向上を実現しています。また、スーパーキャパシタは100万回以上の充放電サイクルに耐え、長期運用コスト低減にも寄与します。JDIの精密な薄膜・パターニング技術を活かせば、より高性能なキャパシタの量産化が期待できます。
今後、エネルギー密度向上やハイブリッド型電池との組み合わせで、更なる市場拡大が見込まれるため、JDIの新たな成長分野として積極的な開発・事業化を提案いたします。
以下は私が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へお問い合わせフォームを通して株主提案書を送信した内容です。
貴社はOLEDWorksとの戦略的提携を通じて米国内に製造拠点を設立する計画を発表しました。この取り組みを加速し、ディスプレイ製造に加えて半導体パッケージング事業も米国内で展開することを提案します。これにより、地政学的リスクの軽減と米国市場へのアクセス強化が期待できます。
経営難でもインテルのアーキテクチャは依然として業界に大きな影響力を持っています。貴社の強みを活かした提携を提案します:
貴社や貴社の提携会社にとって、インテルとの提携は、技術開発のみならず、インテルが持つ販路の獲得にも繋がるので、提携交渉すべきです。
新規事業、特にデータセンターや半導体パッケージングの進捗状況について、毎月の詳細な報告を提案します。これにより、株主との信頼関係を強化し、貴社の成長戦略への理解を深めることができます。
以上の施策により、貴社の競争力強化と企業価値向上を図ることができると考えます。ご検討のほど、よろしくお願いいたします。
Doom EmacsはEmacsの機能を拡張し、Vimライクな操作性を取り入れた強力なエディタです。本記事では、標準Emacsとの主要な違いを中心に、キーバインドと管理コマンドについて解説します。
| 操作 | 標準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 |
| 操作 | 標準Emacs | Doom Emacs |
|---|---|---|
| ウィンドウ分割(垂直) | C-x 3 |
SPC w v |
| ウィンドウ分割(水平) | C-x 2 |
SPC w s |
| 操作 | 標準Emacs | Doom Emacs |
|---|---|---|
| インクリメンタル検索 | C-s |
/ (Evilモード) または C-s |
| プロジェクト内検索 | なし(追加パッケージが必要) | SPC s p |
| 操作 | 標準Emacs | Doom Emacs |
|---|---|---|
| キーバインドのヘルプ | C-h k |
SPC h k |
| プロジェクト切り替え | なし(追加パッケージが必要) | SPC p p |
| 設定ファイル編集 | 手動でファイルを開く | SPC f p |
Doom EmacsはVimライクなスクロール操作を採用しています:
Ctrl-f または <PageDown>Ctrl-b または <PageUp>Ctrl-dCtrl-uDoom Emacsでは以下のキーバインドでコメント操作を行います:
gccgc(ビジュアルモードで範囲選択後)標準EmacsではCtrl+SPCでマーク開始しますが、Doom Emacsではvimのようにvisual modeで選択します:
vV(Shift + v)Ctrl-vviwESCまたはCtrl-[選択後の操作:
ydxcgcDoom Emacsの管理にはdoomコマンドを使用します。主要なコマンドは以下の通りです:
設定ファイルを変更した後は、必ずdoom syncを実行して変更を反映させましょう(init.el、packages.el。config.elは不要)。Doom Emacsにインストールされているパッケージによってはaptでインストールしなければならないソフトウェアを呼び出すことがあるので注意が必要です。doom doctorで確認しましょう。1
sudo apt install ripgrep fd-find shellcheck
以下はREADMEからの機械翻訳です。マニュアルには更に詳しい説明があります:
Doom Emacsは標準Emacsとは異なるキーバインドを採用していますが、これにより直感的で効率的な操作が可能になっています。ただし、従来のEmacsユーザーにとっては学習曲線がある点に注意が必要です。doomコマンドを効果的に使用することで、環境を最適な状態に保ち、スムーズな編集体験を維持することができます。