commit 91dd16d51bcb935cf1b9d276469030c9b96e888c parent c3570a594e1dd03fc054dccde134ee5caa9853b5 Author: minerva-jupiter <ryouturn@gmail.com> Date: Mon, 8 Jun 2026 23:13:55 +0900 feat: convert Zenn blog posts to Qiita format and rename files This commit includes the following changes: - Created a conversion script `rename-zenn.py` to process markdown files. - Automatically converts Zenn front-matter (title, topics, published_at) to Qiita-compatible front-matter (title, tags, private, updated_at, etc.). - Renames markdown files to snake_case based on translated English titles. - Updated all existing markdown files in the `public/` directory to conform to the new Qiita format. Diffstat:
| M | public/2025_pim_editor_war_vim_side.md | | | 38 | ++++++++++++++++++++------------------ |
| M | public/a_story_about_creating_the_typst_typesetting_system_on_github.md | | | 268 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/a_story_about_how_i_got_hooked_on_inkscapes_transparent_background_output.md | | | 48 | ++++++++++++++++++++++++------------------------ |
| M | public/a_story_about_how_i_suffered_from_getrandom_in_rust_wasm.md | | | 192 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/a_story_about_installing_ubuntu_server_on_an_old_laptop.md | | | 236 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/a_story_about_setting_up_a_minecraft_bedrock_server_at_home.md | | | 152 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
| M | public/blazor_webassembly_on_cloudflare_pages.md | | | 280 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/considerations_regarding_the_development_environment.md | | | 144 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/create_a_report_review_llm_with_lora.md | | | 398 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/gentoo_desktop_with_ofast.md | | | 298 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/gentoo_install_battle.md | | | 16 | +++++++++------- |
| M | public/how_to_export_specific_channels_in_mattermost.md | | | 170 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/i_made_a_subtractive_synthesizer_using_rust.md | | | 260 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/now_rreport_of_my_home_cluster.md | | | 150 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/pve_upgrade_8_to_9.md | | | 728 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/redox_os_on_pve_vm.md | | | 188 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/rename-zenn.py | | | 35 | +++++++++++++++++++++++++---------- |
| M | public/ssh_from_internet_via_cloudflare_zero_trust.md | | | 76 | ++++++++++++++++++++++++++++++++++++++-------------------------------------- |
| M | public/stuck_of_zed_remote.md | | | 94 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/synapsematrix_on_docker_compose.md | | | 426 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
| M | public/those_days_when_i_was_playing_scratch.md | | | 76 | ++++++++++++++++++++++++++++++++++++++-------------------------------------- |
| M | public/try_nexttypescript_wasmrust_vite.md | | | 60 | +++++++++++++++++++++++++++++++----------------------------- |
| M | public/updated_portage_on_gentoo_from_rsync_to_git.md | | | 66 | +++++++++++++++++++++++++++++++++--------------------------------- |
| M | public/what_is_manufacturing.md | | | 54 | +++++++++++++++++++++++++++--------------------------- |
| M | public/windows_pc_setup_script.md | | | 620 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
| M | public/windows_update_fail_with_0x800f0983.md | | | 168 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
26 files changed, 2633 insertions(+), 2608 deletions(-)
diff --git a/public/2025_pim_editor_war_vim_side.md b/public/2025_pim_editor_war_vim_side.md @@ -1,19 +1,21 @@ ---- -title: "2025年Pimエディタ戦争(Vim側)" -emoji: "👏" -topics: [] -published: false ---- - -# Vim側の意見 -## 自己紹介 -私は収容人数100人超えのチャットサービスとチケット管理サービスのセルフホストを24/365で運用しているチームの一員です. -最近はRust狂信者になるべく,開発を積極的に勧めているところであります. -## Vimとの出会い -私のVimとの出会いは,初めてサーバ業務をしたときでした.テキストエディタviはLinuxに標準的に導入されていて,渡されたドキュメントがviを使って.envファイルを書き直すような内容でした.最初は`how to exit vim`ってなってましたが,モードの概念が導入されてからは,KVMコンソールでサーバに触る機会も多かった私は段々とその便利さに心惹かれていきました. -## メインエディターがNeovimになった経緯 -私はそれまで,VScodeの民だったのですが,vimプラグインを入れて,一行削除などを積極的にするようになっていました.ですが,あるとき,VScodeでTeXファイルを編集して大学のレポートを書いていたとき,AIが勝手にレポートの回答を書き始めてしまったのです.オプションでオフにできるとはいえ,コードを書くときとレポートを書くときで毎回切り替えるのもめんどくさいし,Vibeコーディングというものがあまり好きでない(自分が理解できないコードが溢れてきてデバックさせられるのが嫌)性分でしたので,もはやVScodeから離れたいと思っていたときにNeovimの存在を知りました. -それからは,Neovimの起動の早さと,設定項目の自由度,そして,純粋なるvimの力に浸かるようになりました. -## Vimのいいところ -nanoのようにLinuxの大抵のリポジトリに組み入れられているにも関わらず,便利な機能が多々あり,デフォルトのコンフィグが優秀である点においてVimは素晴らしいエディターです. +--- +title: 2025年Pimエディタ戦争(Vim側) +tags: [] +private: false +updated_at: '' +id: null +organization_url_name: null +slide: false +--- +# Vim側の意見 +## 自己紹介 +私は収容人数100人超えのチャットサービスとチケット管理サービスのセルフホストを24/365で運用しているチームの一員です. +最近はRust狂信者になるべく,開発を積極的に勧めているところであります. +## Vimとの出会い +私のVimとの出会いは,初めてサーバ業務をしたときでした.テキストエディタviはLinuxに標準的に導入されていて,渡されたドキュメントがviを使って.envファイルを書き直すような内容でした.最初は`how to exit vim`ってなってましたが,モードの概念が導入されてからは,KVMコンソールでサーバに触る機会も多かった私は段々とその便利さに心惹かれていきました. +## メインエディターがNeovimになった経緯 +私はそれまで,VScodeの民だったのですが,vimプラグインを入れて,一行削除などを積極的にするようになっていました.ですが,あるとき,VScodeでTeXファイルを編集して大学のレポートを書いていたとき,AIが勝手にレポートの回答を書き始めてしまったのです.オプションでオフにできるとはいえ,コードを書くときとレポートを書くときで毎回切り替えるのもめんどくさいし,Vibeコーディングというものがあまり好きでない(自分が理解できないコードが溢れてきてデバックさせられるのが嫌)性分でしたので,もはやVScodeから離れたいと思っていたときにNeovimの存在を知りました. +それからは,Neovimの起動の早さと,設定項目の自由度,そして,純粋なるvimの力に浸かるようになりました. +## Vimのいいところ +nanoのようにLinuxの大抵のリポジトリに組み入れられているにも関わらず,便利な機能が多々あり,デフォルトのコンフィグが優秀である点においてVimは素晴らしいエディターです. EmacsのようにLispの環境を読み込む時間もかかりませんし,拡張機能の種類も非常に豊富です. \ No newline at end of file diff --git a/public/a_story_about_creating_the_typst_typesetting_system_on_github.md b/public/a_story_about_creating_the_typst_typesetting_system_on_github.md @@ -1,135 +1,135 @@ ---- -title: "Typstの組版システムをGitHubで作った話" -emoji: "⌨️" -type: "tech" -topics: - - "typst" - - "githubrun" -published: true -published_at: "2025-12-01 13:07" ---- - -# 想定読者 -- GitHubのworkflowを触れる程度の技術がある人 -- GitHubを用いることで、一人または複数人での組版を楽にしたいと思っている人 - -# TL;DR -完成したテンプレートリポジトリはこちら -https://github.com/minerva-jupiter/typst-githubrun-template -使い方はREADMEをご覧ください。 -# 経緯(長い駄文) -## 前史(TeX) -大学でのレポートをwordで書きたくないと思った私はTeXに魅了されていました。 -WSLにTeX Liveをインストールし、TeXで大学のレポート等々をほそぼそと書いていました。 -そんな2024年の12月、私の所属するサークルが冬コミに向けて部誌を発行することになりました。 -自分の書いた記事が同人誌になるなんて夢のようでした。そのサークルは技術者コミュニティなので、記事はGitHubのプライベートリポジトリで管理され、提出形式はHTMLでした。 -ですが、締切が近いことや、GitHubに慣れていないメンバーもいたせいか、CSSの参照が破壊されてしまったりしました。またmainブランチへの強制プッシュなども行われて、非常に混乱してしまいました。 -また、完成した冊子を見ると、自分の記事もレイアウトが崩れてしまっていて、非常に悔しい思いをしました。そこで、完成のプレビューのPDFを吐くタイプの自動レンダリング組版システムを構築する決心をしました。 -そして、完成したのがTeXをPDFにコンパイルしてArtifactに投稿するシステムでした。 -## TeXってさ...... -しかしながら、TeXの酷いエラーやTeX Liveの重さがネックとなり始めました。 -極めつけは本格的に大学の実験レポートが始まったことでした。2週間に1回か2回PDFにして14ページ程度もあるレポートにぎっしりの文字と数式と図表を書く必要が発生したのです。それはTeXの長い記法にうんざりするには十分でした。 -ニュートンの運動方程式を書くために、 -```LaTeX -$ m \frac{d^2 x}{d t^2} = F $ -``` -って書くなんて冗長じゃないですか! -あわよくば、暗算しながら書けるくらいの使いやすさで書きたい! -そう思っていたときに私はTypstに出会いました。 -typstで書くとこれですみます。 -```typst -$ m (d^2 x)/(d t^2) = F $ -``` - -## Typstの紹介 -> Typst is a new markup-based typesetting system that is designed to be as powerful as LaTeX while being much easier to learn and use. - -レポジトリのREADME.mdより -らしいです。意訳すると、「Typstは新しいマークアップを基とした、LaTeXみたく強力なそしてもっと学びやすくて使いやすいタイプセッティングのシステムです」です。(あんまり正確な翻訳じゃないかも) -そして何より、これはRust製です。そこが素晴らしい(Rust大好き人間なので) -正直なところ、まだ未発達な部分も多いので、枯れるまで開発されて、やっと使われるようになるかのスタートラインだとは思うのですが、それでも、こういう新しい技術は使ってみたくなります。 -繰り返す文章をfor文で書けたり、数式を美しく簡単に書けたりと、そそる機能が満載です。 -二点、問題点を挙げると、 -1. テンプレート等が未発展 -2. 日本語が使いにくい -です。テンプレートは自分なりに形成していけばよいのですが、警告メッセージにすべての日本語文字を出すのはやめてほしいですね。あとは、フォントの指定なのですが、規定の欧文フォントだと日本語を使えないので、かなり必須なところが設定が面倒です。typst.appでは日本語フォントの指定は`Noto Sans CJK JP`とできます。しかし、ローカルでのコンパイルとなると、話が変わります。私はtypstのシステムにフォントを追加する方法がわからなかったので、typstにコンパイルをお願いするときにttfファイルの在処を`--font-path ~/.fonts`で指定してコンパイルしています。ただ、毎回面倒だし、bash-completionで入力できないのでbashスクリプトを書いています。 -ということで、まだまだ発展途上ですが、私は使いたい(というかTeXにうんざりしている)ので、Typstで組版システムを構築しようというのが今回の流れです。 - -# 設計 - -まず、はじめにこのシステムの設計思想です。 -目的として - -- Typstの実行環境が手元にない場合でも使いやすいこと -- 一つの絶対的なコンパイル手法を存在させること -- Typstの利点を活かせること - -を設定しました。 -したがって要件定義は - -- GitHubのPRにpushするとすぐにプレビューができる形であること -- レンダリング手段が統一されていること -- typstをネイティブに叩いて変換を行うこと - -となりました。 -## システムの設計 -上記より、今回は前回のシステムを踏襲するような形で書きたいと思います。 -また、一部技術的な問題で達成できない目的があります。 -```mermaid -flowchart TB - User -->|push to branch| PR - PR --> Workflows - SelfHosted --> typst - typst --> Artifact - typst --> Log - Artifact -->|URL| PR - - subgraph GitHub - PR - Workflows - end - - subgraph Workflows - SelfHosted - Artifact - Log - end - - subgraph SelfHostedRunner - Docker - end - - subgraph Docker - typst -->|--font-path| font[~/.fonts] - typst - end -``` -これを基に構築をすすめていきます。 -ですが、コンパイル速度の問題と、SelfHostedの部分が私のサーバのリソースと向き合った結果、足りない可能性が出てきたので、TypstをDockerの中ではなくて、SelfHostedサーバのネイティブ上にインストールかとおもっています。(なおSelfHostedサーバ自体がVMなので安全性は確保される) -# SelfHostedサーバの準備 -一家に一台はあるであろう、自宅サーバに適当なVMを立てて、セットアップします。 -UbuntuServerを使いました。そこにDockerとTypstをインストールして、あとはGitHubのActions/RunnerからSelfHostedRunnerを追加するボタンを押せば手順やトークンが出てくるのでそれに従えば良いです。 - -## typstのインストール -UbuntuServer上では -``` -sudo snap install typst -``` -で終わります。Rustをインストールしてビルドしたいけど、環境を統一したいので、これ一択ですね。 - -# Workflow -SelfHostedでtypstを実行するものを作成します。 -なお、リリースビルドはSelfHostedだと怖いので、GitHubがホストしているRunnerにFontを入れて、Dockerでtypstのイメージを引っ張ってくる形にして安定を取りたいと思います。 -完成品のworkflowはリポジトリに置いてあるので、そちらを見て貰えば良いです。 -基本的には先人が作ったactionsの組み合わせで十分です。 -というか、前回までの積み上げがあるとはいえ、workflowがバグ無しで完璧に動作したのめちゃくちゃ気持ち良い。 - -# fonts -これがかなりの鬼門でした。Log上では動作しているので、わからないのですが、出力されたPDFを見ると、文字化けしてしまって□ばかりが並んでいるものになっていました。 -結論から言うとダウンロードしてサーバに入れていたフォントが悪かったのですが、ちゃんと動作するフォントと動作しないフォントがあって、大変でした。 -私はNoto Sans JPを愛用しているのですが、Google fontsからのダウンロードをworkflowができない点が問題でした。そして、埋め込み用のotfファイルをダウンロードしてもtypstが読み込めなかったです。 -NotoSansCJKのリポジトリから様々にotfファイルやttfファイルをダウンロードして入れてみましたが、細っそいフォントで描画されるのが関の山でした。しかし、LaTeXからTypstに移行した先人でNoto Sans CJK JPをインストールした方のQiitaを発見し、そのリンクのおかげで使えるようになりました。ここがこの記事で一番時間がかかりました。 -[ありがたき先人のQiita](https://qiita.com/ryoshin0830/items/216f95790e21888ea5e7) - -# あとがき +--- +title: Typstの組版システムをGitHubで作った話 +tags: +- typst +- githubrun +private: false +updated_at: 2025-12-01 13:07 +id: null +organization_url_name: null +slide: false +--- +# 想定読者 +- GitHubのworkflowを触れる程度の技術がある人 +- GitHubを用いることで、一人または複数人での組版を楽にしたいと思っている人 + +# TL;DR +完成したテンプレートリポジトリはこちら +https://github.com/minerva-jupiter/typst-githubrun-template +使い方はREADMEをご覧ください。 +# 経緯(長い駄文) +## 前史(TeX) +大学でのレポートをwordで書きたくないと思った私はTeXに魅了されていました。 +WSLにTeX Liveをインストールし、TeXで大学のレポート等々をほそぼそと書いていました。 +そんな2024年の12月、私の所属するサークルが冬コミに向けて部誌を発行することになりました。 +自分の書いた記事が同人誌になるなんて夢のようでした。そのサークルは技術者コミュニティなので、記事はGitHubのプライベートリポジトリで管理され、提出形式はHTMLでした。 +ですが、締切が近いことや、GitHubに慣れていないメンバーもいたせいか、CSSの参照が破壊されてしまったりしました。またmainブランチへの強制プッシュなども行われて、非常に混乱してしまいました。 +また、完成した冊子を見ると、自分の記事もレイアウトが崩れてしまっていて、非常に悔しい思いをしました。そこで、完成のプレビューのPDFを吐くタイプの自動レンダリング組版システムを構築する決心をしました。 +そして、完成したのがTeXをPDFにコンパイルしてArtifactに投稿するシステムでした。 +## TeXってさ...... +しかしながら、TeXの酷いエラーやTeX Liveの重さがネックとなり始めました。 +極めつけは本格的に大学の実験レポートが始まったことでした。2週間に1回か2回PDFにして14ページ程度もあるレポートにぎっしりの文字と数式と図表を書く必要が発生したのです。それはTeXの長い記法にうんざりするには十分でした。 +ニュートンの運動方程式を書くために、 +```LaTeX +$ m \frac{d^2 x}{d t^2} = F $ +``` +って書くなんて冗長じゃないですか! +あわよくば、暗算しながら書けるくらいの使いやすさで書きたい! +そう思っていたときに私はTypstに出会いました。 +typstで書くとこれですみます。 +```typst +$ m (d^2 x)/(d t^2) = F $ +``` + +## Typstの紹介 +> Typst is a new markup-based typesetting system that is designed to be as powerful as LaTeX while being much easier to learn and use. + +レポジトリのREADME.mdより +らしいです。意訳すると、「Typstは新しいマークアップを基とした、LaTeXみたく強力なそしてもっと学びやすくて使いやすいタイプセッティングのシステムです」です。(あんまり正確な翻訳じゃないかも) +そして何より、これはRust製です。そこが素晴らしい(Rust大好き人間なので) +正直なところ、まだ未発達な部分も多いので、枯れるまで開発されて、やっと使われるようになるかのスタートラインだとは思うのですが、それでも、こういう新しい技術は使ってみたくなります。 +繰り返す文章をfor文で書けたり、数式を美しく簡単に書けたりと、そそる機能が満載です。 +二点、問題点を挙げると、 +1. テンプレート等が未発展 +2. 日本語が使いにくい +です。テンプレートは自分なりに形成していけばよいのですが、警告メッセージにすべての日本語文字を出すのはやめてほしいですね。あとは、フォントの指定なのですが、規定の欧文フォントだと日本語を使えないので、かなり必須なところが設定が面倒です。typst.appでは日本語フォントの指定は`Noto Sans CJK JP`とできます。しかし、ローカルでのコンパイルとなると、話が変わります。私はtypstのシステムにフォントを追加する方法がわからなかったので、typstにコンパイルをお願いするときにttfファイルの在処を`--font-path ~/.fonts`で指定してコンパイルしています。ただ、毎回面倒だし、bash-completionで入力できないのでbashスクリプトを書いています。 +ということで、まだまだ発展途上ですが、私は使いたい(というかTeXにうんざりしている)ので、Typstで組版システムを構築しようというのが今回の流れです。 + +# 設計 + +まず、はじめにこのシステムの設計思想です。 +目的として + +- Typstの実行環境が手元にない場合でも使いやすいこと +- 一つの絶対的なコンパイル手法を存在させること +- Typstの利点を活かせること + +を設定しました。 +したがって要件定義は + +- GitHubのPRにpushするとすぐにプレビューができる形であること +- レンダリング手段が統一されていること +- typstをネイティブに叩いて変換を行うこと + +となりました。 +## システムの設計 +上記より、今回は前回のシステムを踏襲するような形で書きたいと思います。 +また、一部技術的な問題で達成できない目的があります。 +```mermaid +flowchart TB + User -->|push to branch| PR + PR --> Workflows + SelfHosted --> typst + typst --> Artifact + typst --> Log + Artifact -->|URL| PR + + subgraph GitHub + PR + Workflows + end + + subgraph Workflows + SelfHosted + Artifact + Log + end + + subgraph SelfHostedRunner + Docker + end + + subgraph Docker + typst -->|--font-path| font[~/.fonts] + typst + end +``` +これを基に構築をすすめていきます。 +ですが、コンパイル速度の問題と、SelfHostedの部分が私のサーバのリソースと向き合った結果、足りない可能性が出てきたので、TypstをDockerの中ではなくて、SelfHostedサーバのネイティブ上にインストールかとおもっています。(なおSelfHostedサーバ自体がVMなので安全性は確保される) +# SelfHostedサーバの準備 +一家に一台はあるであろう、自宅サーバに適当なVMを立てて、セットアップします。 +UbuntuServerを使いました。そこにDockerとTypstをインストールして、あとはGitHubのActions/RunnerからSelfHostedRunnerを追加するボタンを押せば手順やトークンが出てくるのでそれに従えば良いです。 + +## typstのインストール +UbuntuServer上では +``` +sudo snap install typst +``` +で終わります。Rustをインストールしてビルドしたいけど、環境を統一したいので、これ一択ですね。 + +# Workflow +SelfHostedでtypstを実行するものを作成します。 +なお、リリースビルドはSelfHostedだと怖いので、GitHubがホストしているRunnerにFontを入れて、Dockerでtypstのイメージを引っ張ってくる形にして安定を取りたいと思います。 +完成品のworkflowはリポジトリに置いてあるので、そちらを見て貰えば良いです。 +基本的には先人が作ったactionsの組み合わせで十分です。 +というか、前回までの積み上げがあるとはいえ、workflowがバグ無しで完璧に動作したのめちゃくちゃ気持ち良い。 + +# fonts +これがかなりの鬼門でした。Log上では動作しているので、わからないのですが、出力されたPDFを見ると、文字化けしてしまって□ばかりが並んでいるものになっていました。 +結論から言うとダウンロードしてサーバに入れていたフォントが悪かったのですが、ちゃんと動作するフォントと動作しないフォントがあって、大変でした。 +私はNoto Sans JPを愛用しているのですが、Google fontsからのダウンロードをworkflowができない点が問題でした。そして、埋め込み用のotfファイルをダウンロードしてもtypstが読み込めなかったです。 +NotoSansCJKのリポジトリから様々にotfファイルやttfファイルをダウンロードして入れてみましたが、細っそいフォントで描画されるのが関の山でした。しかし、LaTeXからTypstに移行した先人でNoto Sans CJK JPをインストールした方のQiitaを発見し、そのリンクのおかげで使えるようになりました。ここがこの記事で一番時間がかかりました。 +[ありがたき先人のQiita](https://qiita.com/ryoshin0830/items/216f95790e21888ea5e7) + +# あとがき みんな、typst使ってくれるかな、いや、使われないだろう。ということで、部誌で採用されるわけもないのにtypstの組版システムを作成しました。このへんはバックエンドの表層を撫でてる感じがして、雲の上をスキップしている気分です。今度は平和に部誌を書ききりたいなと思いながら、今回はこのへんで〜。 \ No newline at end of file diff --git a/public/a_story_about_how_i_got_hooked_on_inkscapes_transparent_background_output.md b/public/a_story_about_how_i_got_hooked_on_inkscapes_transparent_background_output.md @@ -1,25 +1,25 @@ ---- -title: "Inkscapeの背景透過出力でハマった話" -emoji: "✒️" -type: "tech" -topics: - - "inkscape" - - "背景透過" -published: true -published_at: "2025-11-26 23:04" ---- - -Inkscapeで背景透過pngを出力しようとした時にはまった話です. -# 想定読者 -- Inkscapeで適当に画像を作ったり切り抜いたりして,使いこなし始めたひと -# 状況 -アイコン(512x510px)のプロパティで取得しようとしてドキュメントを生成しました. -画像ができたと思って出力しようと思ったんですね.透過画像に対応しているからpngでいいかな?と思って,ファイルに書き出したんですけど,どうにも背景に真っ白が入ってて,困惑致しました. -# 原因 -- 出力のビット深度の設定がRGB16になっていたから -## 原因の判明の経緯 -最初、pngがだめなのかな?と思ってsvgにしたりしたんですけどsvgだと納品先がダメだったので,pngと格闘してました.いろいろネット調べてみると,背景色が未指定の場合にドキュメントの背景色になってしまうらしく,ドキュメントの背景色という設定を探したのですけど,ドキュメントのプロパティのウィンドウにそれらしき設定項目がなくて,情報が古かったんですね. -ということで、いろいろ右往左往して,また、エクスポートタブの中の背景色設定をいろいろいじってたりしても改善せず,悩んでおりました. -そしたら,エクスポートボタンの近くにギアみたいな設定ボタンがあることに気が付きまして,それを押してみたらビンゴ. -出力する際のビット深度がRGB16になっていたので,RGB"A"16になおして出力したら,無事に背景が透過された画像が出力されました. +--- +title: Inkscapeの背景透過出力でハマった話 +tags: +- inkscape +- 背景透過 +private: false +updated_at: 2025-11-26 23:04 +id: null +organization_url_name: null +slide: false +--- +Inkscapeで背景透過pngを出力しようとした時にはまった話です. +# 想定読者 +- Inkscapeで適当に画像を作ったり切り抜いたりして,使いこなし始めたひと +# 状況 +アイコン(512x510px)のプロパティで取得しようとしてドキュメントを生成しました. +画像ができたと思って出力しようと思ったんですね.透過画像に対応しているからpngでいいかな?と思って,ファイルに書き出したんですけど,どうにも背景に真っ白が入ってて,困惑致しました. +# 原因 +- 出力のビット深度の設定がRGB16になっていたから +## 原因の判明の経緯 +最初、pngがだめなのかな?と思ってsvgにしたりしたんですけどsvgだと納品先がダメだったので,pngと格闘してました.いろいろネット調べてみると,背景色が未指定の場合にドキュメントの背景色になってしまうらしく,ドキュメントの背景色という設定を探したのですけど,ドキュメントのプロパティのウィンドウにそれらしき設定項目がなくて,情報が古かったんですね. +ということで、いろいろ右往左往して,また、エクスポートタブの中の背景色設定をいろいろいじってたりしても改善せず,悩んでおりました. +そしたら,エクスポートボタンの近くにギアみたいな設定ボタンがあることに気が付きまして,それを押してみたらビンゴ. +出力する際のビット深度がRGB16になっていたので,RGB"A"16になおして出力したら,無事に背景が透過された画像が出力されました. 古い情報に踊らされて,そんな設定ないけどなぁとか右往左往してたので,これ以上,古い情報にあたまごっちゃになる人が発生しないように書き留めときます. \ No newline at end of file diff --git a/public/a_story_about_how_i_suffered_from_getrandom_in_rust_wasm.md b/public/a_story_about_how_i_suffered_from_getrandom_in_rust_wasm.md @@ -1,97 +1,97 @@ ---- -title: "Rust WASM のgetrandomに苦しんだ話" -emoji: "🎲" -type: "tech" -topics: - - "rust" - - "wasm" - - "getrandom" -published: true -published_at: "2025-11-27 19:19" ---- - -# 状況 -いつものようにnext.jsからWASMのRustを呼び出してました。 -今回は、形態素解析のビブラートというソフトウェアを入れて、 それによってチャットの返答が変わるようなアプリケーションを作成しようとしてました。 -しかしながら、ビルドが通りません。 -前回、一度同じようなエラーが出た時に、`getrandom`の問題で長い事詰まってたので、今回は、その時の資料を引っ張り出して、早急に解決できると思っていました。 - -# 前回のこと -前にwebtoolsを作っていた時に、同じようにRustのWASMの呼び出しをしてました。 -今回と同じように、`getrandom`のエラーが起きて、ググって、ググッた結果、以下のような変更を加えることで治りました。 - -### Cargo.toml -```diff -[package] -name = "wasm-webtools" -version = "0.1.0" -edition = "2024" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -rand = "0.9.2" -wasm-bindgen = "0.2" --- getrandom = "0.3" -++ getrandom = { version = "0.3", features = ["wasm_js"] } -``` -### .cargo/config.toml -```diff -++ [target.wasm32-unknown-unknown] -++ rustflags = ["--cfg", 'getrandom_backend="wasm_js"'] -``` - -# 今回起きたこと -しかしながら、今回は前回のようにはいきませんでした。 -そもそも、明示的に`getrandom`を使用していなかったので、同様のことが起こったりはしないだろうなあと思っていたら、どうやら使っているライブラリーが`getrandom`が必須なようでした。 -前回と同じようにファイルに変更を加えます。 -しながら、今回は動きませんでした。 -最初はビブラートが悪さしてるのかな?とか思いましたが、そんなこともなく。 -AIにも聞いてみましたが、それはFSを使っているから泊まるんだよみたいなことを言われて。 -確かにWASMでFSを使うことは無理なんですが、今止まっているのは、そこじゃないんですよねー。 -そして、AIとGoogle検索と格闘すること、一時間ぐらい。 -もしかして、`wasm-bingen`が使ってるのと`js-sys`が使ってる`getrandom`ってバージョンが違うんじゃね?という話になりまして。 -`getrandom`って、version0.2系と0.3系でフィーチャーの名前が`js`から`wams_js`に変更されてるので、両方を内包するようなコンフィグを書きましょう、という話になりました。 -めでたく、これで終わりましたね。 -非常に長ったらしく、馬鹿らしいコンフィグになりました。 -``` -[package] -name = "rust-wasm" -version = "0.1.0" -edition = "2024" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -js-sys = "0.3.81" -vibrato = "0.5.2" -wasm-bindgen = "0.2.104" -getrandom_v02 = { package = "getrandom", version = "0.2", features = ["js"] } -getrandom_v03 = { package = "getrandom", version = "0.3", features = ["wasm_js"] } -``` -バージョンの依存って、Ubuntu以外で考えたことなかったんですけど、Rustにも普通に存在しますわね。よく考えたら。 -ということで2時間ぐらいはまってたので、 ~~恨み節~~次回の自分への教訓と言うことで書いておきます。 -# 余談 -`js-sys`を使った理由も、ためになりそうなので書いておきます。 -実際に書いたコードはこちらなんですけど、エラーが発生する可能性があるコードを書いていたので、エラーを取得してJSのエラーにぶち込むために`js-sys`のエラー型を使って新しいエラーを作るっていうことをしてました。 -```Rust -use std::io::Cursor; -use vibrato::{Dictionary, Tokenizer}; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen] -pub fn chat(dict_data: &[u8], input: &str) -> Result<String, JsValue> { - let reader = Cursor::new(dict_data); - let dict = Dictionary::read(reader) - .map_err(|_|{JsValue::from(js_sys::Error::new("Dictionary road Error"))})?; - let tokenizer = Tokenizer::new(dict); - let mut worker = tokenizer.new_worker(); - - worker.reset_sentence(input); - worker.tokenize(); - worker.token(0); - let &mut ans = worker.token(0).to_string(); - Ok(ans) +--- +title: Rust WASM のgetrandomに苦しんだ話 +tags: +- rust +- wasm +- getrandom +private: false +updated_at: 2025-11-27 19:19 +id: null +organization_url_name: null +slide: false +--- +# 状況 +いつものようにnext.jsからWASMのRustを呼び出してました。 +今回は、形態素解析のビブラートというソフトウェアを入れて、 それによってチャットの返答が変わるようなアプリケーションを作成しようとしてました。 +しかしながら、ビルドが通りません。 +前回、一度同じようなエラーが出た時に、`getrandom`の問題で長い事詰まってたので、今回は、その時の資料を引っ張り出して、早急に解決できると思っていました。 + +# 前回のこと +前にwebtoolsを作っていた時に、同じようにRustのWASMの呼び出しをしてました。 +今回と同じように、`getrandom`のエラーが起きて、ググって、ググッた結果、以下のような変更を加えることで治りました。 + +### Cargo.toml +```diff +[package] +name = "wasm-webtools" +version = "0.1.0" +edition = "2024" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +rand = "0.9.2" +wasm-bindgen = "0.2" +-- getrandom = "0.3" +++ getrandom = { version = "0.3", features = ["wasm_js"] } +``` +### .cargo/config.toml +```diff +++ [target.wasm32-unknown-unknown] +++ rustflags = ["--cfg", 'getrandom_backend="wasm_js"'] +``` + +# 今回起きたこと +しかしながら、今回は前回のようにはいきませんでした。 +そもそも、明示的に`getrandom`を使用していなかったので、同様のことが起こったりはしないだろうなあと思っていたら、どうやら使っているライブラリーが`getrandom`が必須なようでした。 +前回と同じようにファイルに変更を加えます。 +しながら、今回は動きませんでした。 +最初はビブラートが悪さしてるのかな?とか思いましたが、そんなこともなく。 +AIにも聞いてみましたが、それはFSを使っているから泊まるんだよみたいなことを言われて。 +確かにWASMでFSを使うことは無理なんですが、今止まっているのは、そこじゃないんですよねー。 +そして、AIとGoogle検索と格闘すること、一時間ぐらい。 +もしかして、`wasm-bingen`が使ってるのと`js-sys`が使ってる`getrandom`ってバージョンが違うんじゃね?という話になりまして。 +`getrandom`って、version0.2系と0.3系でフィーチャーの名前が`js`から`wams_js`に変更されてるので、両方を内包するようなコンフィグを書きましょう、という話になりました。 +めでたく、これで終わりましたね。 +非常に長ったらしく、馬鹿らしいコンフィグになりました。 +``` +[package] +name = "rust-wasm" +version = "0.1.0" +edition = "2024" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +js-sys = "0.3.81" +vibrato = "0.5.2" +wasm-bindgen = "0.2.104" +getrandom_v02 = { package = "getrandom", version = "0.2", features = ["js"] } +getrandom_v03 = { package = "getrandom", version = "0.3", features = ["wasm_js"] } +``` +バージョンの依存って、Ubuntu以外で考えたことなかったんですけど、Rustにも普通に存在しますわね。よく考えたら。 +ということで2時間ぐらいはまってたので、 ~~恨み節~~次回の自分への教訓と言うことで書いておきます。 +# 余談 +`js-sys`を使った理由も、ためになりそうなので書いておきます。 +実際に書いたコードはこちらなんですけど、エラーが発生する可能性があるコードを書いていたので、エラーを取得してJSのエラーにぶち込むために`js-sys`のエラー型を使って新しいエラーを作るっていうことをしてました。 +```Rust +use std::io::Cursor; +use vibrato::{Dictionary, Tokenizer}; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn chat(dict_data: &[u8], input: &str) -> Result<String, JsValue> { + let reader = Cursor::new(dict_data); + let dict = Dictionary::read(reader) + .map_err(|_|{JsValue::from(js_sys::Error::new("Dictionary road Error"))})?; + let tokenizer = Tokenizer::new(dict); + let mut worker = tokenizer.new_worker(); + + worker.reset_sentence(input); + worker.tokenize(); + worker.token(0); + let &mut ans = worker.token(0).to_string(); + Ok(ans) ``` \ No newline at end of file diff --git a/public/a_story_about_installing_ubuntu_server_on_an_old_laptop.md b/public/a_story_about_installing_ubuntu_server_on_an_old_laptop.md @@ -1,119 +1,119 @@ ---- -title: "古いLaptopにUbuntuServerを入れた話" -emoji: "💻" -type: "idea" -topics: - - "laptop" - - "ubnutuserver" - - "used" -published: true -published_at: "2025-07-30 07:59" ---- - -# 想定する読者 -暇つぶしに、他人のPCのセットアップを見学したい方 -# 経緯 -Gentoo OSなどのインストールに挑戦した私であったが、Wi-Fi cardのドライバーの入れ方がわからない等々の問題があったので、結局のところUbuntuに戻って来ることにした。 - -けれども、GNOMEが入っているUbuntuを私などが好くわけがないので、今回はGUI系統の一切入っていないUbuntuとして、UbuntuServerをインストールして、好き勝手にアプリケーションを入れていってしまおうという魂胆である。 - -# UbuntuServerのインストール -とりあえずインストールする。 - -UbuntuServerのサイトからisoをダウンロードしてきて、rufusでUSBに焼いて、インストール。 - -TUIでとっても簡単。W-Fiの設定すらできてしまう。 - -Gentooから来た人からすると、非常に早くて快適。中で何をやっているのか見ることができないので、ちょっと残念な気もするが。 - -# 使うアプリをインストール -## DNS(不要になった手順) -DNSを設定していないと、github.comが解決されない問題があったので(google.com等は解決される)、/etc/systemd/resolved.confを書き換え。DNS=1.1.1.2 1.0.0.2 - -++追記 -RouterのデフォルトDNSを上記に変更したので、この手順は不要になった++ - -# NetworkManager -UbuntuServerのデフォルトで、systemd-networkdが使われているけれど、設定とかがダルいので、NetworkManagerを使います。(甘え) - -``` -sudo apt install network-manager && vi /etc/netplan/50-cloud-init.yaml -``` -して、 -``` -renderer: NetworkManager -``` -をnetwork:2の下に明記 - -それから -``` -sudo systemctl disable systemd-networkd -``` -する。 - -近頃の大学ネットは不安定で、繋がらないことも多々あるので、wait-online系を切っとくと良いかな。 - -nmtuiは便利だけど、nmcliを使う必要のある設定をば一つ。 -``` -sudo nmcli connection show #接続一覧 -``` -``` -sudo nmcli connection show "{接続機器名}" | grep metric #メトリック値確認 -``` -``` -sudo nmcli connection modify "{接続機器名}" ipv4.route-metric {メトリック値} -``` -``` -sudo nmcli connection up "{接続機器名}" -``` -で、メトリックを適切に設定してあげないと、nmtuiからは全部-1になって、不安定な大学ネットに繋がっては切れを繰り返してしまう。 - -## GUI関連 -``` -xserver-xorg xinit xterm i3 feh -``` - -ターミナルはxtermじゃなくていいと思うけど、最初にxtermがないよって言われた記憶があったので、とりあえず入れてるだけ。 - -i3のconfigファイルは私のgitに保存してるのを持ってきます。 - -fehはwallpaperの画像を表示するためのものです。 - -## Font -私はプログラマ用のフォントの可視性が非常に好きなのでMoralerspaceNeonNF-Regularを使用します。 -最近は資料作りもするので、Noto Sans JPもいれてますね。 - -インストールは.ttfファイルを~/.fontsフォルダーに入れるだけ。 - -## IME -``` -fcitx-mozc fcitx-skk -``` -fcitxはモダンで設定がしやすくて、ありがたい。skkを(お試し)しているので、入れた。まだ設定はしていない。 - -## apt mirrorの選定 -安定性のいらない、Laptop環境だからこそ、apt mirrorは速いのにしたい! -私はicscoeを使わせてもらってます -``` -sudo sed -i.bak -r 's@http://(jp\.)?archive\.ubuntu\.com/ubuntu/?@https://ftp.udx.icscoe.jp/Linux/ubuntu/@g' /etc/apt/sources.list.d/ubuntu.sources -``` - -## Audio -音声出力に関係した部分を設定する。 - -``` -sudo apt install alsa-base pulseaudio pipewire pulseaudio-modules-bluetooth -``` -``` -sudo adduser {username} audio -``` -再起動したら、音が出るようになってるはず。 - -alsaだけだと不便な部分があったので、pulseAudioとPipeWireもいれてる。PipeWireだけにしたかったけれど、ms-edgeくんがPipeWire Onlyだと動かなかったので致し方なく。 - -## themeの設定 -なんか一括で変更できるsystem themeなるものは存在せず、そこから取得してくる系はデフォのlightテーマになりやがるので、edgeとxtermは強制でテーマを変えた。 - -## Terminalの選定 -もともとは、デフォルトのXtermを使っていたのだけど、なんだか使い心地が悪かったので、変更しました。 +--- +title: 古いLaptopにUbuntuServerを入れた話 +tags: +- laptop +- ubnutuserver +- used +private: false +updated_at: 2025-07-30 07:59 +id: null +organization_url_name: null +slide: false +--- +# 想定する読者 +暇つぶしに、他人のPCのセットアップを見学したい方 +# 経緯 +Gentoo OSなどのインストールに挑戦した私であったが、Wi-Fi cardのドライバーの入れ方がわからない等々の問題があったので、結局のところUbuntuに戻って来ることにした。 + +けれども、GNOMEが入っているUbuntuを私などが好くわけがないので、今回はGUI系統の一切入っていないUbuntuとして、UbuntuServerをインストールして、好き勝手にアプリケーションを入れていってしまおうという魂胆である。 + +# UbuntuServerのインストール +とりあえずインストールする。 + +UbuntuServerのサイトからisoをダウンロードしてきて、rufusでUSBに焼いて、インストール。 + +TUIでとっても簡単。W-Fiの設定すらできてしまう。 + +Gentooから来た人からすると、非常に早くて快適。中で何をやっているのか見ることができないので、ちょっと残念な気もするが。 + +# 使うアプリをインストール +## DNS(不要になった手順) +DNSを設定していないと、github.comが解決されない問題があったので(google.com等は解決される)、/etc/systemd/resolved.confを書き換え。DNS=1.1.1.2 1.0.0.2 + +++追記 +RouterのデフォルトDNSを上記に変更したので、この手順は不要になった++ + +# NetworkManager +UbuntuServerのデフォルトで、systemd-networkdが使われているけれど、設定とかがダルいので、NetworkManagerを使います。(甘え) + +``` +sudo apt install network-manager && vi /etc/netplan/50-cloud-init.yaml +``` +して、 +``` +renderer: NetworkManager +``` +をnetwork:2の下に明記 + +それから +``` +sudo systemctl disable systemd-networkd +``` +する。 + +近頃の大学ネットは不安定で、繋がらないことも多々あるので、wait-online系を切っとくと良いかな。 + +nmtuiは便利だけど、nmcliを使う必要のある設定をば一つ。 +``` +sudo nmcli connection show #接続一覧 +``` +``` +sudo nmcli connection show "{接続機器名}" | grep metric #メトリック値確認 +``` +``` +sudo nmcli connection modify "{接続機器名}" ipv4.route-metric {メトリック値} +``` +``` +sudo nmcli connection up "{接続機器名}" +``` +で、メトリックを適切に設定してあげないと、nmtuiからは全部-1になって、不安定な大学ネットに繋がっては切れを繰り返してしまう。 + +## GUI関連 +``` +xserver-xorg xinit xterm i3 feh +``` + +ターミナルはxtermじゃなくていいと思うけど、最初にxtermがないよって言われた記憶があったので、とりあえず入れてるだけ。 + +i3のconfigファイルは私のgitに保存してるのを持ってきます。 + +fehはwallpaperの画像を表示するためのものです。 + +## Font +私はプログラマ用のフォントの可視性が非常に好きなのでMoralerspaceNeonNF-Regularを使用します。 +最近は資料作りもするので、Noto Sans JPもいれてますね。 + +インストールは.ttfファイルを~/.fontsフォルダーに入れるだけ。 + +## IME +``` +fcitx-mozc fcitx-skk +``` +fcitxはモダンで設定がしやすくて、ありがたい。skkを(お試し)しているので、入れた。まだ設定はしていない。 + +## apt mirrorの選定 +安定性のいらない、Laptop環境だからこそ、apt mirrorは速いのにしたい! +私はicscoeを使わせてもらってます +``` +sudo sed -i.bak -r 's@http://(jp\.)?archive\.ubuntu\.com/ubuntu/?@https://ftp.udx.icscoe.jp/Linux/ubuntu/@g' /etc/apt/sources.list.d/ubuntu.sources +``` + +## Audio +音声出力に関係した部分を設定する。 + +``` +sudo apt install alsa-base pulseaudio pipewire pulseaudio-modules-bluetooth +``` +``` +sudo adduser {username} audio +``` +再起動したら、音が出るようになってるはず。 + +alsaだけだと不便な部分があったので、pulseAudioとPipeWireもいれてる。PipeWireだけにしたかったけれど、ms-edgeくんがPipeWire Onlyだと動かなかったので致し方なく。 + +## themeの設定 +なんか一括で変更できるsystem themeなるものは存在せず、そこから取得してくる系はデフォのlightテーマになりやがるので、edgeとxtermは強制でテーマを変えた。 + +## Terminalの選定 +もともとは、デフォルトのXtermを使っていたのだけど、なんだか使い心地が悪かったので、変更しました。 私はRust大好き人間なので、Alacrittyを導入しました。Ubuntuのaptリポジトリに登録されてたのでsudo apt install alacrittyと入力するだけで終わりました。あとはi3のコンフィグを書き換えてexec alacrittyにしただけです。かんたんですね。 \ No newline at end of file diff --git a/public/a_story_about_setting_up_a_minecraft_bedrock_server_at_home.md b/public/a_story_about_setting_up_a_minecraft_bedrock_server_at_home.md @@ -1,76 +1,78 @@ ---- -title: "自宅にMinecraft Bedrock Serverを立てた話" -emoji: "💡" -topics: [] -published: false ---- - -# 想定読者 -- インフラエンジニア -# 始めに -この記事は半分は備忘録です. -なので,完成品についてだけでなく,試そうとした色々な構成についても書いています. -## 記事の前提 -この記事の前提として,Minecraft Bedrock Server(以下BDS)については知っているものとします. -例えばUDPを使っているみたいな解説はいちいち致しませんのでご了承ください. -# 前記 -以前に使っていたBDSのデプロイ構成を簡単にご紹介したいと思います. -シングルノード上に`Ubuntu Server`をインストールし,その上にdockerを使ってコンテナでBDSのコンテナをデプロイしていました. -コンテナイメージは[`itzg/minecraft-bedrock-server`](https://hub.docker.com/r/itzg/minecraft-bedrock-server)を使用しました. -サーバーを外に出すため,契約していた光回線のポートを一つ解放してUDPバケットを通すような方式にしていました. - -## 反省 -この構成を続けないという決断に至ったのは,この構成でのラグがひどいという報告を受けたからです. -実際にプレイしているところを画面共有見せてもらったりしたのですが,敵をクリックした数秒後にダメージが入った演出があり,その気にはすでにこちらがダメージを負っているみたいなことが珍しくなかったです. -これについて私は深く深く反省し,UXの向上に努めるべく,インフラエンジニアの威信をかけて,次のサーバーをデプロイしようというところであります. - -# 構成の構想 -ひと口にラグを改善するといっても手段は幾通りもあります.ここで注目したいのは,前回LAN内で折り返しをしていた私のプレイだけは非常に快適だったことです.つまりのところサーバー側に関してはほとんど問題なく稼働しており,サーバーが外に出るまでのところについて私どもの改善が見込まれるのではないかなと言う結論に至りました. - -## 上流について -ここで一つ注意なのですが,私が以前に使っていた光回線はソフトバンクで,私が今回使う回線は大家さんの意向で更新されたマーブル光であります.つまり厳密な検証環境ではないということは重々ご承知いただきたいなと思います. -基本的にはソフトバンク光よりもマーブル光の方が通信速度も安定していてパケットロスも少なくて回線の品質は良いです.しかしながらマーブル光はポート開放をすることができません.固定IPオプションを申し込めばもしかしたらみたいな話を聞いたのですが,そこらへんの準備がうまくいってない段階でこの企画を始めてしまったので,ポート開放は諦めて代替の手段を使います. - -## サーバーを外に出す -サーバーを外に出す方式について,本当はCloudflareトンネルを使いたかったのですが,トンネルが場合によってはUDPパケット通さないという仕様があったため,泣く泣く別のトンネルサービスを利用することにします. -それが`playit.gg`です.ゲーム用にサーバーをエクスポートするためのサービスらしくて,これ以外に良さげな選択肢がなかった(あったら教えてほしい)のでこれで頑張るという感じです.今のところそこまで悪い印象はないですが(ソフトバンク回線の時に比べて),本番環境で8人とかが同時ログインしたら話が変わってくるかもしれません. - -## どこを高速にするべきか -以上のことを踏まえまして,今回速度向上のために使用するのは,LAN内部でどれだけロスを減らせるかに尽きるかと思います. - -## 反省点 -前回,ボトルネックになっていた可能性のある箇所について列挙します. - -- Dockerのネットワークを経由してノードネットワークに出ていた -- Ubuntu Serverの過剰な機能がリソースを圧迫した -- Dockerが制御に挟まっていた - -このあたりかなと思っています. -## 改善点 -なんだかDockerが悪者みたいな書き方をしていますが,`docker compose`などは非常によい奴で,自分が最初にシステム管理を担当したときにDockerだったのが心底助かりました.いい奴です. -んでも,このくらいのエッジ環境を作るとなると,色々と改善点が見えてくるのです. -速度というか,直に動かすという意味では`systemd-nspawn`の方が強いですし,そこまでいかなくても`containerd`を直に触るほうが,そりゃ速いですよ. -ということで,Dockerを使わずにcountainerdを直に叩くorベアメタルにBDSをインストールしちゃう,という方策が一つ立ちました.OSももっとキレッキレのものを使う模索をしたいと思います. -### Flatcar -コンテナを動かしたいだけなら,それ専用のOSがあるよという話をKaaSの方から聞いたことがありました.コンテナ専用OSの一つがFlatcarです. -[Flatcar公式サイト](https://www.flatcar.org/) -他のコンテナ専用OSもあって,k8s専用のTalos等です. - -# 構成案s -## Flatcar-systemd-nspawn -FlatcarというOSの上に,systemc-nspawnでBDSをデプロイするという方法です. -Flatcar上で色々と動かす必要があって,イミュータブルなシステムと相性が最悪でした. -今後はこの構成は登場しません. -## Flatcar-containerd -containerdを直接叩こうという試みです. -nerdctlコマンドをインストールするIgnitionを書くところで詰まった(適切なバイナリーを落としてきても,バイナリーの形式が実行可能ではないというエラーが出た)ので,頓挫しました. -## Flatcar-k3s -containerdを直接叩くような挙動をしたいけれど,Flatcarの外から叩きたいという思想です. -k3sを入れたInginitionを書くのが難しかった(検索しても情報が少ない)ので,停止中. -## Gentoo -この記事の中で一番狂った選択肢です. -Linux Kernelのヘルツを変えてパケットさばきを高速にしたり,各種ツールについて,`-Ofast`でビルドするなどの,速くするためのカスタムを最も自由度が高くできるので,おすすめ. -最初に思いついたアイデアですが,作業コストが高すぎるので,テスト期間が終わって余力があったらやろうかなと思っています. -## Alpine-k3s -Alpine Linuxというとても小さなLinuxの上にk3sクラスタを作ってcontainerdをコントロールしようというものです.デプロイが比較的簡単で(ほんとか?),私でも3時間くらいでできました. +--- +title: 自宅にMinecraft Bedrock Serverを立てた話 +tags: [] +private: false +updated_at: '' +id: null +organization_url_name: null +slide: false +--- +# 想定読者 +- インフラエンジニア +# 始めに +この記事は半分は備忘録です. +なので,完成品についてだけでなく,試そうとした色々な構成についても書いています. +## 記事の前提 +この記事の前提として,Minecraft Bedrock Server(以下BDS)については知っているものとします. +例えばUDPを使っているみたいな解説はいちいち致しませんのでご了承ください. +# 前記 +以前に使っていたBDSのデプロイ構成を簡単にご紹介したいと思います. +シングルノード上に`Ubuntu Server`をインストールし,その上にdockerを使ってコンテナでBDSのコンテナをデプロイしていました. +コンテナイメージは[`itzg/minecraft-bedrock-server`](https://hub.docker.com/r/itzg/minecraft-bedrock-server)を使用しました. +サーバーを外に出すため,契約していた光回線のポートを一つ解放してUDPバケットを通すような方式にしていました. + +## 反省 +この構成を続けないという決断に至ったのは,この構成でのラグがひどいという報告を受けたからです. +実際にプレイしているところを画面共有見せてもらったりしたのですが,敵をクリックした数秒後にダメージが入った演出があり,その気にはすでにこちらがダメージを負っているみたいなことが珍しくなかったです. +これについて私は深く深く反省し,UXの向上に努めるべく,インフラエンジニアの威信をかけて,次のサーバーをデプロイしようというところであります. + +# 構成の構想 +ひと口にラグを改善するといっても手段は幾通りもあります.ここで注目したいのは,前回LAN内で折り返しをしていた私のプレイだけは非常に快適だったことです.つまりのところサーバー側に関してはほとんど問題なく稼働しており,サーバーが外に出るまでのところについて私どもの改善が見込まれるのではないかなと言う結論に至りました. + +## 上流について +ここで一つ注意なのですが,私が以前に使っていた光回線はソフトバンクで,私が今回使う回線は大家さんの意向で更新されたマーブル光であります.つまり厳密な検証環境ではないということは重々ご承知いただきたいなと思います. +基本的にはソフトバンク光よりもマーブル光の方が通信速度も安定していてパケットロスも少なくて回線の品質は良いです.しかしながらマーブル光はポート開放をすることができません.固定IPオプションを申し込めばもしかしたらみたいな話を聞いたのですが,そこらへんの準備がうまくいってない段階でこの企画を始めてしまったので,ポート開放は諦めて代替の手段を使います. + +## サーバーを外に出す +サーバーを外に出す方式について,本当はCloudflareトンネルを使いたかったのですが,トンネルが場合によってはUDPパケット通さないという仕様があったため,泣く泣く別のトンネルサービスを利用することにします. +それが`playit.gg`です.ゲーム用にサーバーをエクスポートするためのサービスらしくて,これ以外に良さげな選択肢がなかった(あったら教えてほしい)のでこれで頑張るという感じです.今のところそこまで悪い印象はないですが(ソフトバンク回線の時に比べて),本番環境で8人とかが同時ログインしたら話が変わってくるかもしれません. + +## どこを高速にするべきか +以上のことを踏まえまして,今回速度向上のために使用するのは,LAN内部でどれだけロスを減らせるかに尽きるかと思います. + +## 反省点 +前回,ボトルネックになっていた可能性のある箇所について列挙します. + +- Dockerのネットワークを経由してノードネットワークに出ていた +- Ubuntu Serverの過剰な機能がリソースを圧迫した +- Dockerが制御に挟まっていた + +このあたりかなと思っています. +## 改善点 +なんだかDockerが悪者みたいな書き方をしていますが,`docker compose`などは非常によい奴で,自分が最初にシステム管理を担当したときにDockerだったのが心底助かりました.いい奴です. +んでも,このくらいのエッジ環境を作るとなると,色々と改善点が見えてくるのです. +速度というか,直に動かすという意味では`systemd-nspawn`の方が強いですし,そこまでいかなくても`containerd`を直に触るほうが,そりゃ速いですよ. +ということで,Dockerを使わずにcountainerdを直に叩くorベアメタルにBDSをインストールしちゃう,という方策が一つ立ちました.OSももっとキレッキレのものを使う模索をしたいと思います. +### Flatcar +コンテナを動かしたいだけなら,それ専用のOSがあるよという話をKaaSの方から聞いたことがありました.コンテナ専用OSの一つがFlatcarです. +[Flatcar公式サイト](https://www.flatcar.org/) +他のコンテナ専用OSもあって,k8s専用のTalos等です. + +# 構成案s +## Flatcar-systemd-nspawn +FlatcarというOSの上に,systemc-nspawnでBDSをデプロイするという方法です. +Flatcar上で色々と動かす必要があって,イミュータブルなシステムと相性が最悪でした. +今後はこの構成は登場しません. +## Flatcar-containerd +containerdを直接叩こうという試みです. +nerdctlコマンドをインストールするIgnitionを書くところで詰まった(適切なバイナリーを落としてきても,バイナリーの形式が実行可能ではないというエラーが出た)ので,頓挫しました. +## Flatcar-k3s +containerdを直接叩くような挙動をしたいけれど,Flatcarの外から叩きたいという思想です. +k3sを入れたInginitionを書くのが難しかった(検索しても情報が少ない)ので,停止中. +## Gentoo +この記事の中で一番狂った選択肢です. +Linux Kernelのヘルツを変えてパケットさばきを高速にしたり,各種ツールについて,`-Ofast`でビルドするなどの,速くするためのカスタムを最も自由度が高くできるので,おすすめ. +最初に思いついたアイデアですが,作業コストが高すぎるので,テスト期間が終わって余力があったらやろうかなと思っています. +## Alpine-k3s +Alpine Linuxというとても小さなLinuxの上にk3sクラスタを作ってcontainerdをコントロールしようというものです.デプロイが比較的簡単で(ほんとか?),私でも3時間くらいでできました. ちなみにコントローラーもAlpine Linuxですが,workのAlpine Linuxだけベアメタルにしようかなと思ってます. \ No newline at end of file diff --git a/public/blazor_webassembly_on_cloudflare_pages.md b/public/blazor_webassembly_on_cloudflare_pages.md @@ -1,141 +1,141 @@ ---- -title: "Blazor WebAssembly on Cloudflare Pages" -emoji: "💨" -type: "tech" -topics: - - "csharp" - - "blazor" - - "cloudflarepages" -published: true -published_at: "2025-07-28 01:06" ---- - -# TL;DL -[リポジトリ](https://github.com/minerva-jupiter/webtools-mj) -ビルド設定は - -|key|value| -|-|-| -|ビルドコマンド|chmod +x build.sh && ./build.sh| -|ビルド出力|output/wwwroot| - -/build.sh -```sh -#!/bin/sh -curl -sSL https://dot.net/v1/dotnet-install.sh > dotnet-install.sh -chmod +x dotnet-install.sh -./dotnet-install.sh -c 9.0 -InstallDir ./dotnet -./dotnet/dotnet --version -./dotnet/dotnet publish -c Release -o output -``` -## 参考 -- [CloudflareのBlazor WebAssemblyドキュメント](https://developers.cloudflare.com/pages/framework-guides/deploy-a-blazor-site/) -- [Permission denied on build scriptへの回答](https://community.cloudflare.com/t/permission-denied-on-build-script/295840/3) -# 経緯 -WASMを使ってランダムパスワードジェネレーターを作りたいなと思ったので、このプロジェクトが始まりました。最初はNext.js + WASM(Rust) on Cloudflareしようと思ってました。 -`create next app`して、cloudflare pagesに入れたら`nodejs_compat`がいるよって言われた。 -そこでworkersに入れようと思ったら、純粋なnext.jsとWASMの扱いが違ったので、cloudflareに適したWASMを含むセットアップを探してWranglerにたどり着いた。 -ただ、WranglerがWindowsだとうまく動いてくれなかったので、断念。 -Windowsのpowershellで動かすとWranglerが`C:\`みたいなパスはだめだからWSLで動かしてねって言われて、WSLで動かすと「そのファイルパスは許可してないからcmd.exeで実行するね。あとついでにファイルパスは標準の'C:\Windows\'以下だよ」って言われて、permissionエラー(当然)で、諦めて退散しました。(ここまで4日かかった) -ということで、私は諦めて、サークルの先輩が使ってたBlazorでWASMを実現することにしました。~~ほんとはRustを使いたかったんだけど。~~ - -# 手順 -## 使用環境 -|key|value| -|-|-| -|IDE|VisualStudio2022| -|ソースコード管理|GitHub| -|ライセンス|MIT| -|デプロイ先|Cloudflare Pages| - -## Create Blazor Project -VisualStudio(以下VSと略)を起動して`新規プロジェクトを作成`から`Blazor WebAssembly スタンドアロン アプリ`を選択して、作成。残りはよしなに。 -`プログレッシブWebアプリケーション`って項目があって、何かと思って調べたら、ネイティブアプリみたいに独立したウィンドウとして表示できる機能?みたい。間違ってたらごめんなさい。Next.jsだったかReactでも似たような機能あるよね。アプリとしてインストールってやつ。 - -## Setting up git -VSはgit clientも付いている超優秀な子です。上のツールバーの`Git`項目にマウスを持っていくと、リポジトリを作るところまでやってくれます。昔はこんな項目があった覚えがないのだけど。 - -## Push to GitHub -上の手順でやると、勝手にコミットメッセージ込みでプッシュしてくれます。~~しやがります~~ -`プロジェクト ファイルを追加します。`というコミットメッセージ付きです。~~日本語コミットメッセージやめて~~ -ただ、VSのデフォルト設定だと`master`ブランチが作られます。ただ、近年の差別的な言葉を避ける運動により`main`ブランチにしましょうという流れらしいです。 -個人的にはbridgeのslaveとか言ったりするし分かり易い表現だと思うので、すべて変える必要があるとは思いませんが、ブランチに関してはmasterでもmainでも可用性に差があるように感じないので`main`ブランチにしときます。 - -## Ready for deploy -Cloudflare Pagesにデプロイするために必要な手順がひとつ残っています。 -参考に挙げた[CloudflareドキュメントCreate the build script](https://developers.cloudflare.com/pages/framework-guides/deploy-a-blazor-site/#create-the-build-script)に書いてあるとおり、ビルド用のスクリプトを書きます。一応再掲。 -```sh -#!/bin/sh -curl -sSL https://dot.net/v1/dotnet-install.sh > dotnet-install.sh -chmod +x dotnet-install.sh -./dotnet-install.sh -c 9.0 -InstallDir ./dotnet -./dotnet/dotnet --version -./dotnet/dotnet publish -c Release -o output -``` -なお、4行目の9.0のところは各々が新規プロジェクト作成の際に選択したSDKバージョンを入れてください。 -Window上のneovimを使ってこれを書いたところ、なんかバグったので、WSLでnanoやらvimやら使って書くことをおすすめします。 -書けたら、そのファイルも含めてGitHubに上げときます。上げるっていうのは含めてコミットするわけで...VSのgit clientはcliにラッパーが被さった程度のものなので、プロジェクトのルートディレクトリ内にスクリプトを置いとけば、Add&Commitする欄に出てくるので、"適当に"コミットメッセージを書いてCommit&&Pushします。 - -## いざDeploy -CloudflareにログインしてDashboardからPages(表示は`コンピューティング(Workers)`)に飛んで、作成を押して、プロジェクトのリポジトリを選択します。 -ビルドコマンドのところに"Cloudflareのドキュメント通りに" -|Configuration option|Value| -|-|-| -|Production branch|main| -|Build command|./build.sh| -|Build directory|output/wwwroot| -してみます。 -```log -23:10:29.350 Executing user command: ./build.sh -23:10:29.358 /bin/sh: 1: ./build.sh: Permission denied -23:10:29.359 Failed: Error while executing user command. Exited with error code: 126 -23:10:29.366 Failed: build command exited with code: 1 -23:10:33.878 Failed: error occurred while running build command -``` -らしいです。そう言えば公式ドキュメントに -> Your build.sh file needs to be executable for the build command to work. You can make it so by running chmod +x build.sh. - -って書いてありました。ね。 -### バカの遠回り -バカな私はローカルで`ls -l`してpermissionを確認し始めました。 -``` --rwxrwxrwx 1 <user> <user> 1094 Jul 28 00:13 LICENSE.txt --rwxrwxrwx 1 <user> <user> 13 Jul 27 22:36 README.md --rwxrwxrwx 1 <user> <user> 223 Jul 27 23:12 build.sh -drwxrwxrwx 1 <user> <user> 4096 Jul 27 22:33 webtools-mj --rwxrwxrwx 1 <user> <user> 1146 Jul 27 22:33 webtools-mj.sln -``` -あれ、おかしいですね、実行権限どころか、他の権限まであるじゃないですか。 -なんでだろうなと思いながら`chmod +x build.sh`を実行します。 -まあ、何も変わるわけがなくてですね、英語の読み間違いかなと思って日本語に翻訳をかけました。 -> ビルドコマンドを機能させるには、ファイルが実行可能である必要があります。実行することでそうすることができます. `build.sh chmod +x build.sh` - -ん?じゃあ`build.sh chmod +x build.sh`を実行すればいいんだな?と思い、実行しました。 -するとどうでしょう、ルートディレクトリ内に.NET SDKがインストールされました! -それをGitHubに上げて、Cloudflareがdeployしようとすると…… -既に.NET SDKがあります!ってエラーが。まあ当然ですわな。 -それから私は何をトチ狂ったか、インストールされている.NET SDKファイルらを削除してみたり、`build.sh`すら消してみたり色々とやりました。GitHubさん、本当にごめんなさい。 -### 結局は…… -そろそろ公式ドキュメントを信用しなくなってきた私はググりました。そして見つけたのです。 -[Permission denied on build scriptへの回答](https://community.cloudflare.com/t/permission-denied-on-build-script/295840/3) -> The only way would be to change the build command from `./build.sh` to `chmod +x build.sh && ./build.sh` - -天才か? -つまり、Cloudflareのサーバがgit cloneしてる時点でこっちのファイルのpermissionなんて向こうに関係ないわけでして、そのサーバ内でのpermissionを変更するにはこれしかないという、至極真っ当な答えでしたとさ。 - -|Configuration option|Value| -|-|-| -|Production branch|main| -|Build command|`chmod +x && ./build.sh`| -|Build directory|output/wwwroot| - -## Deployの成功と今後 -やっとのことでDeployが成功しましたとさ。 -今後は、このWEBページの機能と見た目を開発していけたらいいなと思ってます。 - -# 反省 -- 公式ドキュメントはきっちり読む(翻訳に頼らずに) -- 公式ドキュメントで詰まったらググってみてもよい -- 無知。よい勉強になりました - +--- +title: Blazor WebAssembly on Cloudflare Pages +tags: +- csharp +- blazor +- cloudflarepages +private: false +updated_at: 2025-07-28 01:06 +id: null +organization_url_name: null +slide: false +--- +# TL;DL +[リポジトリ](https://github.com/minerva-jupiter/webtools-mj) +ビルド設定は + +|key|value| +|-|-| +|ビルドコマンド|chmod +x build.sh && ./build.sh| +|ビルド出力|output/wwwroot| + +/build.sh +```sh +#!/bin/sh +curl -sSL https://dot.net/v1/dotnet-install.sh > dotnet-install.sh +chmod +x dotnet-install.sh +./dotnet-install.sh -c 9.0 -InstallDir ./dotnet +./dotnet/dotnet --version +./dotnet/dotnet publish -c Release -o output +``` +## 参考 +- [CloudflareのBlazor WebAssemblyドキュメント](https://developers.cloudflare.com/pages/framework-guides/deploy-a-blazor-site/) +- [Permission denied on build scriptへの回答](https://community.cloudflare.com/t/permission-denied-on-build-script/295840/3) +# 経緯 +WASMを使ってランダムパスワードジェネレーターを作りたいなと思ったので、このプロジェクトが始まりました。最初はNext.js + WASM(Rust) on Cloudflareしようと思ってました。 +`create next app`して、cloudflare pagesに入れたら`nodejs_compat`がいるよって言われた。 +そこでworkersに入れようと思ったら、純粋なnext.jsとWASMの扱いが違ったので、cloudflareに適したWASMを含むセットアップを探してWranglerにたどり着いた。 +ただ、WranglerがWindowsだとうまく動いてくれなかったので、断念。 +Windowsのpowershellで動かすとWranglerが`C:\`みたいなパスはだめだからWSLで動かしてねって言われて、WSLで動かすと「そのファイルパスは許可してないからcmd.exeで実行するね。あとついでにファイルパスは標準の'C:\Windows\'以下だよ」って言われて、permissionエラー(当然)で、諦めて退散しました。(ここまで4日かかった) +ということで、私は諦めて、サークルの先輩が使ってたBlazorでWASMを実現することにしました。~~ほんとはRustを使いたかったんだけど。~~ + +# 手順 +## 使用環境 +|key|value| +|-|-| +|IDE|VisualStudio2022| +|ソースコード管理|GitHub| +|ライセンス|MIT| +|デプロイ先|Cloudflare Pages| + +## Create Blazor Project +VisualStudio(以下VSと略)を起動して`新規プロジェクトを作成`から`Blazor WebAssembly スタンドアロン アプリ`を選択して、作成。残りはよしなに。 +`プログレッシブWebアプリケーション`って項目があって、何かと思って調べたら、ネイティブアプリみたいに独立したウィンドウとして表示できる機能?みたい。間違ってたらごめんなさい。Next.jsだったかReactでも似たような機能あるよね。アプリとしてインストールってやつ。 + +## Setting up git +VSはgit clientも付いている超優秀な子です。上のツールバーの`Git`項目にマウスを持っていくと、リポジトリを作るところまでやってくれます。昔はこんな項目があった覚えがないのだけど。 + +## Push to GitHub +上の手順でやると、勝手にコミットメッセージ込みでプッシュしてくれます。~~しやがります~~ +`プロジェクト ファイルを追加します。`というコミットメッセージ付きです。~~日本語コミットメッセージやめて~~ +ただ、VSのデフォルト設定だと`master`ブランチが作られます。ただ、近年の差別的な言葉を避ける運動により`main`ブランチにしましょうという流れらしいです。 +個人的にはbridgeのslaveとか言ったりするし分かり易い表現だと思うので、すべて変える必要があるとは思いませんが、ブランチに関してはmasterでもmainでも可用性に差があるように感じないので`main`ブランチにしときます。 + +## Ready for deploy +Cloudflare Pagesにデプロイするために必要な手順がひとつ残っています。 +参考に挙げた[CloudflareドキュメントCreate the build script](https://developers.cloudflare.com/pages/framework-guides/deploy-a-blazor-site/#create-the-build-script)に書いてあるとおり、ビルド用のスクリプトを書きます。一応再掲。 +```sh +#!/bin/sh +curl -sSL https://dot.net/v1/dotnet-install.sh > dotnet-install.sh +chmod +x dotnet-install.sh +./dotnet-install.sh -c 9.0 -InstallDir ./dotnet +./dotnet/dotnet --version +./dotnet/dotnet publish -c Release -o output +``` +なお、4行目の9.0のところは各々が新規プロジェクト作成の際に選択したSDKバージョンを入れてください。 +Window上のneovimを使ってこれを書いたところ、なんかバグったので、WSLでnanoやらvimやら使って書くことをおすすめします。 +書けたら、そのファイルも含めてGitHubに上げときます。上げるっていうのは含めてコミットするわけで...VSのgit clientはcliにラッパーが被さった程度のものなので、プロジェクトのルートディレクトリ内にスクリプトを置いとけば、Add&Commitする欄に出てくるので、"適当に"コミットメッセージを書いてCommit&&Pushします。 + +## いざDeploy +CloudflareにログインしてDashboardからPages(表示は`コンピューティング(Workers)`)に飛んで、作成を押して、プロジェクトのリポジトリを選択します。 +ビルドコマンドのところに"Cloudflareのドキュメント通りに" +|Configuration option|Value| +|-|-| +|Production branch|main| +|Build command|./build.sh| +|Build directory|output/wwwroot| +してみます。 +```log +23:10:29.350 Executing user command: ./build.sh +23:10:29.358 /bin/sh: 1: ./build.sh: Permission denied +23:10:29.359 Failed: Error while executing user command. Exited with error code: 126 +23:10:29.366 Failed: build command exited with code: 1 +23:10:33.878 Failed: error occurred while running build command +``` +らしいです。そう言えば公式ドキュメントに +> Your build.sh file needs to be executable for the build command to work. You can make it so by running chmod +x build.sh. + +って書いてありました。ね。 +### バカの遠回り +バカな私はローカルで`ls -l`してpermissionを確認し始めました。 +``` +-rwxrwxrwx 1 <user> <user> 1094 Jul 28 00:13 LICENSE.txt +-rwxrwxrwx 1 <user> <user> 13 Jul 27 22:36 README.md +-rwxrwxrwx 1 <user> <user> 223 Jul 27 23:12 build.sh +drwxrwxrwx 1 <user> <user> 4096 Jul 27 22:33 webtools-mj +-rwxrwxrwx 1 <user> <user> 1146 Jul 27 22:33 webtools-mj.sln +``` +あれ、おかしいですね、実行権限どころか、他の権限まであるじゃないですか。 +なんでだろうなと思いながら`chmod +x build.sh`を実行します。 +まあ、何も変わるわけがなくてですね、英語の読み間違いかなと思って日本語に翻訳をかけました。 +> ビルドコマンドを機能させるには、ファイルが実行可能である必要があります。実行することでそうすることができます. `build.sh chmod +x build.sh` + +ん?じゃあ`build.sh chmod +x build.sh`を実行すればいいんだな?と思い、実行しました。 +するとどうでしょう、ルートディレクトリ内に.NET SDKがインストールされました! +それをGitHubに上げて、Cloudflareがdeployしようとすると…… +既に.NET SDKがあります!ってエラーが。まあ当然ですわな。 +それから私は何をトチ狂ったか、インストールされている.NET SDKファイルらを削除してみたり、`build.sh`すら消してみたり色々とやりました。GitHubさん、本当にごめんなさい。 +### 結局は…… +そろそろ公式ドキュメントを信用しなくなってきた私はググりました。そして見つけたのです。 +[Permission denied on build scriptへの回答](https://community.cloudflare.com/t/permission-denied-on-build-script/295840/3) +> The only way would be to change the build command from `./build.sh` to `chmod +x build.sh && ./build.sh` + +天才か? +つまり、Cloudflareのサーバがgit cloneしてる時点でこっちのファイルのpermissionなんて向こうに関係ないわけでして、そのサーバ内でのpermissionを変更するにはこれしかないという、至極真っ当な答えでしたとさ。 + +|Configuration option|Value| +|-|-| +|Production branch|main| +|Build command|`chmod +x && ./build.sh`| +|Build directory|output/wwwroot| + +## Deployの成功と今後 +やっとのことでDeployが成功しましたとさ。 +今後は、このWEBページの機能と見た目を開発していけたらいいなと思ってます。 + +# 反省 +- 公式ドキュメントはきっちり読む(翻訳に頼らずに) +- 公式ドキュメントで詰まったらググってみてもよい +- 無知。よい勉強になりました + 以上、長々と、私の右往左往の失敗談でした。 \ No newline at end of file diff --git a/public/considerations_regarding_the_development_environment.md b/public/considerations_regarding_the_development_environment.md @@ -1,73 +1,73 @@ ---- -title: "開発環境に関する考察" -emoji: "📖" -type: "idea" -topics: - - "ssh" - - "devcontainer" - - "proxmox" - - "zed" -published: true -published_at: "2026-02-17 21:30" ---- - -# 想定読者 -- 他の人の開発環境とその背後にある構想を覗いてみたい人 - -# たどり着いた先 - -| 項目名 | 利用ソフト | 主な用途 | -| - | - | - | -| メイン機OS | Windows | 開発,制作,ゲーム,動画視聴等 | -| サーバーOS | Proxmox | VMの払い出し | -| 開発VMのOS | Debian | | -| エディター | Zed | | -| サブエディター | Helix | 試用中 | - -# Windowsへの不満(TL;DR) - -Windowsは私の技術スタックにおける開発に不利なものでした. -C#との相性は素晴らしいのですが,RustやNode.js,Wranglerなどとの相性が悪かったのです. -具体的に言うと,Rustはリンカーの非存在やCのコンパイルが絡むようなクレートを使用するとllvmの非存在をなじられたり,Wranglerに関しては,Windowsのファイル・システムだと上手く動作しないというログを出して,停止し,WSLに切り替えても,Linuxネイティブでないとかでデプロイが通らないことがありました.Element-webのコンパイルが通らなかったりもしました. -また,Windowsのパッケージマネージャーは非常にゴミです.そもそもWindowsの中枢の更新は設定からでないとできず,大抵月に1度配布される月例アップデートは何等か不具合があることがしばしば. -Wingetを使おうにも,一つのDLがこけるとそこで停止して他のアプリの更新確認等すらできない.[アプリをインストールしている途中に別のアプリをダウンロードしよう!みたいなissue](https://github.com/microsoft/winget-cli/issues/225)も2020年5月20日に立てられて以来,一向に更新される予感がしません. -かと言ってチョコやスコープは専用フォルダにインストールをしてしまうので,探す手間が増えて面倒. -とにかくWindows環境に対する不信感と不満は,私の中で日に日に大きくなってきました. - -しかし,ここでとんでもない出来事が起こりました. -Windowsでしか動作しないゲームがあったので,Linuxとのデュアルブートにしようと思い,SSDを買おうかなと探していたところ,買おうと目をつけていたクルーシャルby micronのブランドが終了してしまったのです. -そして,OpenAI社のサム・アルトマンによる韓国半導体チップの買い占めと,その市場リアクションによる,半導体製品全体の価格高騰.もっと早めに動いていたら,1TBのNVMeのSSDが1万円台前半で変えていたのに.そう思う頃には遅かったです. - -ほんと,OpenAIって余計なことしかしないですよね.ChatGPTで,未だ実用でないAIをさも万能なツールのように発表して市場を過剰に刺激したり,robot.txtを読まずにサイトをクロールしまくって学習に使ったり,半導体チップを買い占めたり,APIの仕様をコロコロ変えまくったり. - -そんなこんなで,私はデュアルブート前までの暫定的な,Windowsよりもマシな開発環境を構築することになりました. - -# DevContainerについて - -(私の周りで)数多くの開発者が用いているのが,このDevContainerです. -今回の開発環境構築で実際に試しました. -結果,私は敗北しました. -(Rustを書いていることからも察されるかもしれませんが)私はできるだけフットプリントを下げたいと思っています.なので,Docker Desktopを避けようとしました. -しかし,npmモジュールであるdevcontainarはそれを許してはくれませんでした.dockerをpodmanのエイリアスにしたりしたんですけどね. -また,Zedが提案してくれるdevcontainerのテンプレートのイメージが起動しませんでした. -/workingが存在しないって言われます.docker-composeなら書き方が分かるのですが,devcontainer.jsonの初心者である私はこの時点で躓いてしまいました. - -# ssh for Zed - -Zedにはリモート接続でプログラミングをする機能が備わっています. -非常に便利ですね.私はdebianのLXCをProxmox上に立て,そこに必要なものをインストールしていって,環境をつくりました. -多分LXCのテンプレはProxmoxなりのミニマルインストールなので,ここに書いたものだけをインストールすれば完全に動くという保証はできかねますので,ご了承ください. -``` -doas vim curl git netcat-openbsd -``` -[doas](https://man.openbsd.org/doas.1)はOpenBSD版のsudoみたいなものだと思ってください.sudoよりも軽量でコンフィグの書き方も簡単です. -``` -# /etc/doas.conf -permit user as root -``` -visudoみたいなチェックを失敗すると設定が完了できないという機能はないです.`su - user`してから`doas`するだけなのですが,忘れてrootユーザーを無効化してしまうと詰んでしまうことがあるので注意ですね.まあ,rootでrootのログインを無効化するなんてしませんよね? - -# 評価 - -今のところ,コンパイルが遅いことを除いて非常に快適です. +--- +title: 開発環境に関する考察 +tags: +- ssh +- devcontainer +- proxmox +- zed +private: false +updated_at: 2026-02-17 21:30 +id: null +organization_url_name: null +slide: false +--- +# 想定読者 +- 他の人の開発環境とその背後にある構想を覗いてみたい人 + +# たどり着いた先 + +| 項目名 | 利用ソフト | 主な用途 | +| - | - | - | +| メイン機OS | Windows | 開発,制作,ゲーム,動画視聴等 | +| サーバーOS | Proxmox | VMの払い出し | +| 開発VMのOS | Debian | | +| エディター | Zed | | +| サブエディター | Helix | 試用中 | + +# Windowsへの不満(TL;DR) + +Windowsは私の技術スタックにおける開発に不利なものでした. +C#との相性は素晴らしいのですが,RustやNode.js,Wranglerなどとの相性が悪かったのです. +具体的に言うと,Rustはリンカーの非存在やCのコンパイルが絡むようなクレートを使用するとllvmの非存在をなじられたり,Wranglerに関しては,Windowsのファイル・システムだと上手く動作しないというログを出して,停止し,WSLに切り替えても,Linuxネイティブでないとかでデプロイが通らないことがありました.Element-webのコンパイルが通らなかったりもしました. +また,Windowsのパッケージマネージャーは非常にゴミです.そもそもWindowsの中枢の更新は設定からでないとできず,大抵月に1度配布される月例アップデートは何等か不具合があることがしばしば. +Wingetを使おうにも,一つのDLがこけるとそこで停止して他のアプリの更新確認等すらできない.[アプリをインストールしている途中に別のアプリをダウンロードしよう!みたいなissue](https://github.com/microsoft/winget-cli/issues/225)も2020年5月20日に立てられて以来,一向に更新される予感がしません. +かと言ってチョコやスコープは専用フォルダにインストールをしてしまうので,探す手間が増えて面倒. +とにかくWindows環境に対する不信感と不満は,私の中で日に日に大きくなってきました. + +しかし,ここでとんでもない出来事が起こりました. +Windowsでしか動作しないゲームがあったので,Linuxとのデュアルブートにしようと思い,SSDを買おうかなと探していたところ,買おうと目をつけていたクルーシャルby micronのブランドが終了してしまったのです. +そして,OpenAI社のサム・アルトマンによる韓国半導体チップの買い占めと,その市場リアクションによる,半導体製品全体の価格高騰.もっと早めに動いていたら,1TBのNVMeのSSDが1万円台前半で変えていたのに.そう思う頃には遅かったです. + +ほんと,OpenAIって余計なことしかしないですよね.ChatGPTで,未だ実用でないAIをさも万能なツールのように発表して市場を過剰に刺激したり,robot.txtを読まずにサイトをクロールしまくって学習に使ったり,半導体チップを買い占めたり,APIの仕様をコロコロ変えまくったり. + +そんなこんなで,私はデュアルブート前までの暫定的な,Windowsよりもマシな開発環境を構築することになりました. + +# DevContainerについて + +(私の周りで)数多くの開発者が用いているのが,このDevContainerです. +今回の開発環境構築で実際に試しました. +結果,私は敗北しました. +(Rustを書いていることからも察されるかもしれませんが)私はできるだけフットプリントを下げたいと思っています.なので,Docker Desktopを避けようとしました. +しかし,npmモジュールであるdevcontainarはそれを許してはくれませんでした.dockerをpodmanのエイリアスにしたりしたんですけどね. +また,Zedが提案してくれるdevcontainerのテンプレートのイメージが起動しませんでした. +/workingが存在しないって言われます.docker-composeなら書き方が分かるのですが,devcontainer.jsonの初心者である私はこの時点で躓いてしまいました. + +# ssh for Zed + +Zedにはリモート接続でプログラミングをする機能が備わっています. +非常に便利ですね.私はdebianのLXCをProxmox上に立て,そこに必要なものをインストールしていって,環境をつくりました. +多分LXCのテンプレはProxmoxなりのミニマルインストールなので,ここに書いたものだけをインストールすれば完全に動くという保証はできかねますので,ご了承ください. +``` +doas vim curl git netcat-openbsd +``` +[doas](https://man.openbsd.org/doas.1)はOpenBSD版のsudoみたいなものだと思ってください.sudoよりも軽量でコンフィグの書き方も簡単です. +``` +# /etc/doas.conf +permit user as root +``` +visudoみたいなチェックを失敗すると設定が完了できないという機能はないです.`su - user`してから`doas`するだけなのですが,忘れてrootユーザーを無効化してしまうと詰んでしまうことがあるので注意ですね.まあ,rootでrootのログインを無効化するなんてしませんよね? + +# 評価 + +今のところ,コンパイルが遅いことを除いて非常に快適です. ZedのレンダリングがWindows側で動作しているので,エディター部分は快適ですし,element-webのコンパイルはむしろ今の方が早かったりします.~~あれはwindowsが遅いと言うより不具合で止まっていたが正解かもしれない~~ \ No newline at end of file diff --git a/public/create_a_report_review_llm_with_lora.md b/public/create_a_report_review_llm_with_lora.md @@ -1,199 +1,199 @@ ---- -title: "レポートレビューLLMをLoRAで作る" -emoji: "⛏️" -type: "tech" -topics: - - "lora" - - "llm" - - "typst" - - "qlora" -published: true -published_at: "2025-12-13 00:11" ---- - -# 想定読者 - -この記事の想定読者は以下の人です.専門用語に関しては,検索すれば出てくるものとして,こちらで注釈を付けることはしません.誤用などあればコメント下さい. - -- ローカルLLMの開発の経験のある人 -- LLMのファインチューニングの知識がある人 - -# はじめに - -本記事は,ローカル環境でLLMを動かし,物理学実験のレポートを提出前にレビューするアプリケーションを作ってみた備忘録です. -最終的な目標は,Typstで書かれた物理学実験のレポートに対し,教員から提示されるであろう指摘事項を前もって指摘してくれることです. -なお,当該リポジトリは私の書いた実験レポートそのものが含まれる学習データがありますので,Private Repositoryになっています. -公開できる部分は公開したいのですが,記事に書き込んでしまうと冗長なのと,Geminiに同じことを頼んだら,同じようなコードが返ってくると思いますので,擬似コードだけ置いておきます. -学習に使用したデータはレポート2本とその指摘事項です.圧倒的に少ないですね. - -## 初期計画と環境コンテキスト - -プロジェクト開始時の主要な計画と環境は以下の通りです. - -### 動作環境 -| 項目 | 詳細 | -| :--- | :--- | -| OS | Windows 11 | -| CPU | AMD Ryzen 9 3900XT (12コア/24スレッド) | -| GPU | NVIDIA GeForce RTX 3060 | - -### モデルと手法 -| 項目 | 詳細 | -| :--- | :--- | -| ベースモデル | Mistral 7B (GGUF 形式) | -| ファインチューニング | QRoLA | - - -# 仮実装 -## 環境構築 - -とりあえず初期計画のために環境を整えます. -どっかでPythonのパッケージマネージャーとしてRust製の`uv`ってのが巷で流行っているという話を聞いたので,今回は`uv`を使います. -それにしてもRust製のPythonパッケージマネージャーなんて,もはやRustにしちまえよって感じですけどね.学習コストが高いんでね. -環境構築は備忘録的に書いた`README.md`の中身を掲示して置くことで代替とします. -```Markdown -# Prepare Python -## create venv -### install uv -`pip install uv` -### create .venv -`uv venv .venv` -## activate venv -`source .venv/bin/activate` -if you use windows powershell, use `.\.venv\Scripts\activate.ps1` - -## install requirements -`uv pip install -r requirements.txt` - -## setting for cuda -please make sure you have cuda installed and set the environment variable CUDA_HOME to the path of your cuda installation. -check for it can do with `nvcc --version` -and install pytorch for your cuda version. -for example nvcc version is 13.0 -`uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130 --reinstall` -And then, check this python env can use cuda with `python gpu_check.py` - -## set API key for gemini(only need to use structuring-training-data) -`export GEMINI_API_KEY=your_api_key` -if you use windows powershell, use `$env:GEMINI_API_KEY="あなたのAPIキー"` -``` -厳密にはMarkdownのベストプラクティスには従ってないですが,許してください.読めりゃ,わかりゃいいんですよ. -なぜかGPUに対応したPyTorch等が入らなくて,なんでだろうなとか思ってたら,そもそもPCに`cuda`がインストールされてませんでした. -## 学習用データ - -自分の書いたレポートとそれについた指摘事項を統合して学習データにします. -指摘事項とそれに当たっている部分を抜き出してセットにして入れるといいみたいなのですが,そのJSONを書くのがめんどくさかったので,GeminiのAPIを叩いてJSONを返してもらってます. - -次に,まとめられたJSONとレポート本体を合体させ,さらに合体した各レポートのセットを一つのjsonlファイルに合体させます. -レポートを連番にして,連番毎にレポートのtypstファイルと指摘事項のtxtファイルを学習用データのディレクトリに入れて,それを読むようにすれば,学習用データが多くなっても安心です. - -## 学習 - -いよいよ学習です. -学習プログラムの入力はjsonlで出力はアダプターのアセット達です. -それぞれ設定値です. - -| パラメータ名 | 値 | -| :--- | :--- | -| **ベースモデル** | `Mistral-7B-Instruct-v0.2` | -| **量子化 (4bit)** | `load_in_4bit=True` | -| **量子化タイプ** | `bnb_4bit_quant_type="nf4"` | -| **LoRA R (ランク)** | `16` | -| **LoRA Alpha** | `32` | -| **バッチサイズ** | `1` | -| **勾配蓄積** | `4` | -| **学習率** | `2e-4` | -| **最大ステップ数** | `50` | -| **FP16** | `True` | - -## GGUF化 - -先程の出力をllama.cppでRoLAしたモデルを読み込むために,GGUF化します. -Gitのサブモジュールとして,llama.cppをクローンして,リポジトリのルートでこのコマンドを叩けばできます. -``` -python vendor/llama.cpp/convert_hf_to_gguf.py mistral_typst_merged --outfile mistral_typst_merged.f16.gguf --outtype f16 -``` -(`mistral_typst_merged`はモデルのディレクトリ,`mistral_typst_merged.f16.gguf`は出力です) - -## 量子化 - -リソースバカ食いの可能性を危惧して,モデルを量子化します. -ただ,何故かllama.cppの量子化が上手く動かなかったので,公式ビルドを落としてきてバイナリを叩いて量子化しました. - -## APIサーバー - -何をトチ狂ったのか,私はこの推論をAPIサーバーにしようと考えて,PythonでAPIサーバーを立て始めました. -もともとはフロントエンドアプリをつけて,APIだけを自宅サーバーに立てて叩きたいなと思っていた名残です. -名残を実装に反映してしまうのがGeminiの悪い癖ですね.自分は間違わないと思っているのか,モジュールテストとかをしない方向で動いているように見えます. -冗談はさておき,このAPIサーバー,とても重大な欠陥がありました. -モデルがJSONでない形式で返してきたときにパースエラーが起きるんです. -APIの行き帰りは厳格にJSONでなければなりませんが,量子化したモデルにそれをやらすのもそもそも無理があります. -良く見てみると,トランスフォーマー型らしいと言えばそうなのですが,一行一行に対して支離滅裂な指摘事項が挙げられていて,到底設定したいた`max_tokens`では足りずにパースエラーを起こしていました. - -## 仮実装で露呈した問題点 - -- JSON形式の破壊 -- 量子化の問題 -- CPU推論 - -です.次の章から順番に説明と施した対策を挙げていきます. - -# JSON形式 - -そもそもモデルに(それも量子化した)JSONを書かせるなんてエラーの元ですし,APIにしたいなら,出てきたテキストをそのままJSONにぶち込むように変更すればいいので,JSON形式で出力させるようなプロンプト(システムイントロダクション)は削除しました. -そしてAPIサーバーを立てて,それを叩くpythonを作ってとやっているのが無駄なので,モデルを直接読み込んでtypstファイルをぶち込むようなpythonプログラムを書きました. - -# QLoRAの問題 - -JSON問題が解決しても,回答の長さが`max_tokens`を軽々と突破する問題は依然として存在しました. -そこで,私は諦めて量子化されていないf16のモデルを使いました. -するとどうでしょう.10行程度のリストに収まりました. - -# CPU推論 - -推論を動かしていると,CPUとDRAMの使用率が最大に張り付きます.当然ですね.f16なLLMをローカルで動かしているのですから. -問題はそこではなくて,GPUを使ってくれないという点です. -私が1年前くらいに奮発して買ったGDDDR5が12GBも積まれているRTX3060をせっかく搭載しているというのに,一個も使わないんです. -QLoRAではバイナリのバージョンを揃えてインストールしたので,llama.cppでも同様のことをしようと思ってやりました. -参考にさせていただいた記事です. -https://zenn.dev/hellohazime/articles/ccd01c2df0b5c3 -でも,インストールに失敗しました. -仕方ないので,環境変数による強制ビルドをしました. -```PowerShell -$env:CMAKE_ARGS='-DGGML_CUDA=ON -DCMAKE_CUDA_COMPILER="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.0/bin/nvcc.exe" -DCUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.0" -DCUDA_ARCHITECTURES=native' -$env:FORCE_CMAKE=1 -uv pip install -r requirements.txt --no-cache-dir -``` -これでも失敗しました. -エラーログに`Use GGML_CUDA instead` -って書いてあったので,次の記事を参考にmakeの環境変数を書き換えしました. -https://qiita.com/Nikeri/items/27490eb865c42803d14c -それでもエラーは止まりません. -``` -No CUDA toolset found. -``` -意味がわかりません.ご丁寧にnvcc.exeのパスを入れてるのに,無いとか言われるんですからもうどうしようもないです. -今は諦めてCPUで推論を回してますが,時間と電気代がかかるのでぜひともやめてほしいところです. -Gemini君が言うにはDLL地獄という状態らしくて,どうしたらいいかわかんないです. - -# 今後への課題 - -現状の問題点は以下の2つです. -- CPUで推論している -- レビューの品質が低い - -前者については前章で述べたので後者について述べます. -レビュー品質が低い原因は色々と考えられます. -当初は50ステップとしていたLoRAですが,25ステップのあたりでlossが0.1412とかまで下がってるので,過学習が疑われます. -25ステップにすると,ファジーさはだいぶ弱まりましたが,全体的に当たらない指摘をしている部分が多いです. -開発途中に教員のレビューを受けたレポートが一本増えたので学習用データに追加してみましたが,反応は芳しくないです. -他の人のレポートを学習用データとして入れればもっと良いのですけどね. - -# まとめ - -レポートのレビューをするLLMをLoRAで作るには,まだ超えなければならい壁が幾つもあるように思います. -私のこれも到底,学科の仲間には見せることができない出来栄えですからね. -人間の脳も大概,説明可能性に欠けていると思うのですが,それを補おうとしてきた科学とそこから生まれたそれに矛盾する再現性のない深層学習. -その表層にちょっとでも触れることができたかなと思います. -皆さんはくれぐれも,これを応用して,教科書の内容からレポートを生成しようなんて思わないでくださいね. -科学の自壊が進んでしまわないように. +--- +title: レポートレビューLLMをLoRAで作る +tags: +- lora +- llm +- typst +- qlora +private: false +updated_at: 2025-12-13 00:11 +id: null +organization_url_name: null +slide: false +--- +# 想定読者 + +この記事の想定読者は以下の人です.専門用語に関しては,検索すれば出てくるものとして,こちらで注釈を付けることはしません.誤用などあればコメント下さい. + +- ローカルLLMの開発の経験のある人 +- LLMのファインチューニングの知識がある人 + +# はじめに + +本記事は,ローカル環境でLLMを動かし,物理学実験のレポートを提出前にレビューするアプリケーションを作ってみた備忘録です. +最終的な目標は,Typstで書かれた物理学実験のレポートに対し,教員から提示されるであろう指摘事項を前もって指摘してくれることです. +なお,当該リポジトリは私の書いた実験レポートそのものが含まれる学習データがありますので,Private Repositoryになっています. +公開できる部分は公開したいのですが,記事に書き込んでしまうと冗長なのと,Geminiに同じことを頼んだら,同じようなコードが返ってくると思いますので,擬似コードだけ置いておきます. +学習に使用したデータはレポート2本とその指摘事項です.圧倒的に少ないですね. + +## 初期計画と環境コンテキスト + +プロジェクト開始時の主要な計画と環境は以下の通りです. + +### 動作環境 +| 項目 | 詳細 | +| :--- | :--- | +| OS | Windows 11 | +| CPU | AMD Ryzen 9 3900XT (12コア/24スレッド) | +| GPU | NVIDIA GeForce RTX 3060 | + +### モデルと手法 +| 項目 | 詳細 | +| :--- | :--- | +| ベースモデル | Mistral 7B (GGUF 形式) | +| ファインチューニング | QRoLA | + + +# 仮実装 +## 環境構築 + +とりあえず初期計画のために環境を整えます. +どっかでPythonのパッケージマネージャーとしてRust製の`uv`ってのが巷で流行っているという話を聞いたので,今回は`uv`を使います. +それにしてもRust製のPythonパッケージマネージャーなんて,もはやRustにしちまえよって感じですけどね.学習コストが高いんでね. +環境構築は備忘録的に書いた`README.md`の中身を掲示して置くことで代替とします. +```Markdown +# Prepare Python +## create venv +### install uv +`pip install uv` +### create .venv +`uv venv .venv` +## activate venv +`source .venv/bin/activate` +if you use windows powershell, use `.\.venv\Scripts\activate.ps1` + +## install requirements +`uv pip install -r requirements.txt` + +## setting for cuda +please make sure you have cuda installed and set the environment variable CUDA_HOME to the path of your cuda installation. +check for it can do with `nvcc --version` +and install pytorch for your cuda version. +for example nvcc version is 13.0 +`uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130 --reinstall` +And then, check this python env can use cuda with `python gpu_check.py` + +## set API key for gemini(only need to use structuring-training-data) +`export GEMINI_API_KEY=your_api_key` +if you use windows powershell, use `$env:GEMINI_API_KEY="あなたのAPIキー"` +``` +厳密にはMarkdownのベストプラクティスには従ってないですが,許してください.読めりゃ,わかりゃいいんですよ. +なぜかGPUに対応したPyTorch等が入らなくて,なんでだろうなとか思ってたら,そもそもPCに`cuda`がインストールされてませんでした. +## 学習用データ + +自分の書いたレポートとそれについた指摘事項を統合して学習データにします. +指摘事項とそれに当たっている部分を抜き出してセットにして入れるといいみたいなのですが,そのJSONを書くのがめんどくさかったので,GeminiのAPIを叩いてJSONを返してもらってます. + +次に,まとめられたJSONとレポート本体を合体させ,さらに合体した各レポートのセットを一つのjsonlファイルに合体させます. +レポートを連番にして,連番毎にレポートのtypstファイルと指摘事項のtxtファイルを学習用データのディレクトリに入れて,それを読むようにすれば,学習用データが多くなっても安心です. + +## 学習 + +いよいよ学習です. +学習プログラムの入力はjsonlで出力はアダプターのアセット達です. +それぞれ設定値です. + +| パラメータ名 | 値 | +| :--- | :--- | +| **ベースモデル** | `Mistral-7B-Instruct-v0.2` | +| **量子化 (4bit)** | `load_in_4bit=True` | +| **量子化タイプ** | `bnb_4bit_quant_type="nf4"` | +| **LoRA R (ランク)** | `16` | +| **LoRA Alpha** | `32` | +| **バッチサイズ** | `1` | +| **勾配蓄積** | `4` | +| **学習率** | `2e-4` | +| **最大ステップ数** | `50` | +| **FP16** | `True` | + +## GGUF化 + +先程の出力をllama.cppでRoLAしたモデルを読み込むために,GGUF化します. +Gitのサブモジュールとして,llama.cppをクローンして,リポジトリのルートでこのコマンドを叩けばできます. +``` +python vendor/llama.cpp/convert_hf_to_gguf.py mistral_typst_merged --outfile mistral_typst_merged.f16.gguf --outtype f16 +``` +(`mistral_typst_merged`はモデルのディレクトリ,`mistral_typst_merged.f16.gguf`は出力です) + +## 量子化 + +リソースバカ食いの可能性を危惧して,モデルを量子化します. +ただ,何故かllama.cppの量子化が上手く動かなかったので,公式ビルドを落としてきてバイナリを叩いて量子化しました. + +## APIサーバー + +何をトチ狂ったのか,私はこの推論をAPIサーバーにしようと考えて,PythonでAPIサーバーを立て始めました. +もともとはフロントエンドアプリをつけて,APIだけを自宅サーバーに立てて叩きたいなと思っていた名残です. +名残を実装に反映してしまうのがGeminiの悪い癖ですね.自分は間違わないと思っているのか,モジュールテストとかをしない方向で動いているように見えます. +冗談はさておき,このAPIサーバー,とても重大な欠陥がありました. +モデルがJSONでない形式で返してきたときにパースエラーが起きるんです. +APIの行き帰りは厳格にJSONでなければなりませんが,量子化したモデルにそれをやらすのもそもそも無理があります. +良く見てみると,トランスフォーマー型らしいと言えばそうなのですが,一行一行に対して支離滅裂な指摘事項が挙げられていて,到底設定したいた`max_tokens`では足りずにパースエラーを起こしていました. + +## 仮実装で露呈した問題点 + +- JSON形式の破壊 +- 量子化の問題 +- CPU推論 + +です.次の章から順番に説明と施した対策を挙げていきます. + +# JSON形式 + +そもそもモデルに(それも量子化した)JSONを書かせるなんてエラーの元ですし,APIにしたいなら,出てきたテキストをそのままJSONにぶち込むように変更すればいいので,JSON形式で出力させるようなプロンプト(システムイントロダクション)は削除しました. +そしてAPIサーバーを立てて,それを叩くpythonを作ってとやっているのが無駄なので,モデルを直接読み込んでtypstファイルをぶち込むようなpythonプログラムを書きました. + +# QLoRAの問題 + +JSON問題が解決しても,回答の長さが`max_tokens`を軽々と突破する問題は依然として存在しました. +そこで,私は諦めて量子化されていないf16のモデルを使いました. +するとどうでしょう.10行程度のリストに収まりました. + +# CPU推論 + +推論を動かしていると,CPUとDRAMの使用率が最大に張り付きます.当然ですね.f16なLLMをローカルで動かしているのですから. +問題はそこではなくて,GPUを使ってくれないという点です. +私が1年前くらいに奮発して買ったGDDDR5が12GBも積まれているRTX3060をせっかく搭載しているというのに,一個も使わないんです. +QLoRAではバイナリのバージョンを揃えてインストールしたので,llama.cppでも同様のことをしようと思ってやりました. +参考にさせていただいた記事です. +https://zenn.dev/hellohazime/articles/ccd01c2df0b5c3 +でも,インストールに失敗しました. +仕方ないので,環境変数による強制ビルドをしました. +```PowerShell +$env:CMAKE_ARGS='-DGGML_CUDA=ON -DCMAKE_CUDA_COMPILER="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.0/bin/nvcc.exe" -DCUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.0" -DCUDA_ARCHITECTURES=native' +$env:FORCE_CMAKE=1 +uv pip install -r requirements.txt --no-cache-dir +``` +これでも失敗しました. +エラーログに`Use GGML_CUDA instead` +って書いてあったので,次の記事を参考にmakeの環境変数を書き換えしました. +https://qiita.com/Nikeri/items/27490eb865c42803d14c +それでもエラーは止まりません. +``` +No CUDA toolset found. +``` +意味がわかりません.ご丁寧にnvcc.exeのパスを入れてるのに,無いとか言われるんですからもうどうしようもないです. +今は諦めてCPUで推論を回してますが,時間と電気代がかかるのでぜひともやめてほしいところです. +Gemini君が言うにはDLL地獄という状態らしくて,どうしたらいいかわかんないです. + +# 今後への課題 + +現状の問題点は以下の2つです. +- CPUで推論している +- レビューの品質が低い + +前者については前章で述べたので後者について述べます. +レビュー品質が低い原因は色々と考えられます. +当初は50ステップとしていたLoRAですが,25ステップのあたりでlossが0.1412とかまで下がってるので,過学習が疑われます. +25ステップにすると,ファジーさはだいぶ弱まりましたが,全体的に当たらない指摘をしている部分が多いです. +開発途中に教員のレビューを受けたレポートが一本増えたので学習用データに追加してみましたが,反応は芳しくないです. +他の人のレポートを学習用データとして入れればもっと良いのですけどね. + +# まとめ + +レポートのレビューをするLLMをLoRAで作るには,まだ超えなければならい壁が幾つもあるように思います. +私のこれも到底,学科の仲間には見せることができない出来栄えですからね. +人間の脳も大概,説明可能性に欠けていると思うのですが,それを補おうとしてきた科学とそこから生まれたそれに矛盾する再現性のない深層学習. +その表層にちょっとでも触れることができたかなと思います. +皆さんはくれぐれも,これを応用して,教科書の内容からレポートを生成しようなんて思わないでくださいね. +科学の自壊が進んでしまわないように. diff --git a/public/gentoo_desktop_with_ofast.md b/public/gentoo_desktop_with_ofast.md @@ -1,149 +1,149 @@ ---- -title: "Gentoo Desktop with \"-Ofast\"" -emoji: "🐧" -type: "tech" -topics: - - "linux" - - "gcc" - - "gentoo" - - "ofast" -published: true -published_at: "2025-09-28 17:32" ---- - -# 経緯 -Gentoo Linuxのインストールを複数回やって、きたのでそろそろ挑戦的なことがしてみたいという気持ちが発生してきて、このような内容をやってみました。 -とりあえず構築しようとした環境をまとめておきます。 -# 想定読者 -- Gentoo Linuxに慣れてきて、そろそろ変わったことがしたいと思っている人 -- Gentoo Linuxって敷居が高くてなぁ...って思っている人 -- Gentoo Linuxのメンテナー -- gccオプションの意味を考えずに使っている人 -# 目標 -最終的に目指すところはこちらです。 - -|key|value| -|-|-| -|OS|Gentoo Linux| -|Arch|VM(QEMU on Intel x86_64)| -|VM Flaver|4vCPU_4GiBRAM_32GiBHDD| -|wm|sway| -|display serv|wayland| -|terminal emu|alacritty| -|editor|vim/nvim| -|BIOS|seaBIOS(not UEFI)| - -# Ref -- [Gentoo Handbook for AMD64](https://wiki.gentoo.org/wiki/Handbook:AMD64/ja) -- [作業の様子のYouTube配信動画の再生リスト](https://youtube.com/playlist?list=PLQ-fF3xcxe3e8hY7tb2Dr4z0pAb1qeq2E&si=BC51X8-7hP18QI4_) - -# 実際の手順 -## 下準備 -YouTubeで配信(ログのこしのため)するつもりだったのと、使ってるVMホストをする子が、まともに設定を弄っていないProxmoxだったので、コピペが使えず(or使いづらく)、踏み台サーバからsshして繋ぎました。 -``` -ssh-import-id gh:<your github account> -``` -して、keyを入れ、 -``` -passwd -``` -でrootのパスワードを設定し、 -``` -rc-service sshd start -``` -でsshサーバを起動すれば準備はOK -``` -ip a -``` -でマシンのipを確認して、踏み台からsshしに行きます。 -## ディスクの準備 -QEMUではseaBIOSを使っていたので、レガシーBIOSとしてセットアップします。 -|part name|mount path|fs|role|size| -|-|-|-|-|-| -|/dev/sda1|/boot|xfs|boot loader|1G| -|/dev/sda2|swap|swap|swap|16G| -|/dev/sda3|/|ext4|files|15G| - -ちょっと歪な構成になりましたね。ビルドに時間がかかった経験から(主に-Ofastのせい)、swapをデカくした結果、こうなりました。メインのファイルシステムよりもスワップが大きいなんて......ま、お遊び環境だし、特に重要で大きなものを置く予定もないので、これで一旦は様子見です。 -### -追記20250905 -この構成でインストールを進めていたところ、システムのサイズが足りないと言われてしまったので、 -`swap`の8GBを`/`に上げるように構成を変更し、インストールし直しをしました。 - -## stageファイル -文章の構成がGentooHandbookっぽくなってきました。 -なので、詳細はgentoo handbookに任せます。というか、あの文章はとても初心者向けに詳しく書いてあるので、Arch Linuxに挫折した知り合いが「あの行為はこういう意味だったんだ」と何度も感心していました。 -話を戻して、`links`で`www.gentoo.org/downloads`にアクセスしてstageファイルとそのsha256チェックサムを落としてきます。この辺はなんどもやっていて手練れなので、手早くやっていけました。 -コツは`.sha256`ファイルを落としてくるときに、linksだとデフォルトの末尾に`.tar.xz`だったかが着くので、それを外して落とすことです。そうすることで`sha256sum --check sta*`を打つときに、長ったらしいファイル名を入力せずにTab補完が使えますし、なにより`sha256sum`コマンドが末尾が`.sha256`じゃないファイルだと、それを省略したファイルを読んだりできないのでとても困ります。 -## ベースシステム(?)のインストール -### Chroot -handbookからのコピペ作業が多い。知り合いはarch-chrootで横着してるって言ってましたね。ただ、個人的には何らかの事情でファイルシステム構成が変わってると怖いので、やりたくないですね。 -### CFLAG -ここが今回のメインと言っても過言ではないパート。そう、CFLAGです。コンパイラに渡すオプションの指定なのですが、ここで最適化`-Ofast`をグローバルにかけるという暴れっぷりを発揮しました。 -これが試したくて、今回の企画が始まったといっても過言じゃないです。 -### USE_FLAG -使うパッケージ、使わないパッケージを省略し、使いそうなパッケージをいれる作業ですね。 -これに結構時間を使いました。というか、これが一番人間に時間がかかる作業です。 -といっても、知っているパッケージはあまりなかったので、知ってて明確に減らしたほうがよいものだけを減らしていった感じです。 -### RUST_FLAG -handbookのそのままです。Rust大好き人間なので当然のように使います。 -### rsync --> git -知り合いからemergeのリポジトリの更新プロトコルであるrsyncをgitに置き換えれるよと教えてもらったので、やってみました。 -[記事はこちら。](https://zenn.dev/minervajuppiter/articles/a1d15e757ef0f8)なお、手順のコマンドしか書いてないので、詳細に興味がある方はrefにあるgentoo wikiを読み、適宜ググってください。 -### いざ、更新 -の前に、前の手順でUSEフラグの一部が入ったので、意外といれるパッケージは少なかったりします。前回はここで155パッケージでしたからね。前手順40パッケージ、今回40パッケージくらいなので、ここの時間は結構短縮されたように思います。前回はUSEフラグを便利そうなツール全てに立てていたので、USEフラグは不要物を除去するために使ったほうが良いのかなという気になってきました。 -ま、それでも平気で数時間はかかるので私は一旦就寝です。 -``` -emerge --ask --verbose --update --deep --changed-use @world -``` -### 更新が止まった -elogindのemergeで更新がエラーを吐いて停止しました。これは前回と同じ動作ですが、ログ(ビルドしている途中でgccあたりが吐いているもの)を見ていると、`-Ofast`はだめだよって書いてあるので、`elogind`には-O3を設定します。 -``` -mkdir /etc/portage/env -``` -で環境ディレクトリを作って、その中に`COMMON_FLAG`を`-O3`にしたバージョンの -``` -COMMON_FLAGS="-march=native -O3 -pipe" -CFLAGS="${COMMON_FLAGS}" -CXXFLAGS="${COMMON_FLAGS}" -``` -を書いたenvファイル(ファイル名は任意だがここではo3とする)を作ります。 -そしたら`/etc/portage/package.env`ファイルにパッケージ名と適応したいenvファイル名を書きます。 -``` -sys-auth/elogind o3(任意のファイル名) -``` -これで終わりです。 -更新に戻ります。 -※再試行の際はelogindのUSEフラグは切りました。 -## kernelの設定 -`/etc/portage/package.use/installkernel`に以下の内容を書き込んで保存し、firmwareとgentoo-kernelを同時にemeregeしてしまいました(grubも巻き添え) -``` -sys-kernel/installkernel grub dracut -``` -### ここでmake停止 -ディスクの残り容量がないのでと言われ、`gentoo-kernel`のmakeが止まった様子です。 -dfやduを使って見ていくと`/var/tmp`が16GBも食っているではないですか。 -とりあえず`gentoo-kernel`のmake設定も`-O3`の方にして様子見します。 -いろいろやってみましたが、成果は芳しくなく。 最終的には、 VMに新しくハードディスクを100GB追加して、 それを/var/tmpにマウントする事で、添付ファイルの容量を大目にとって解決することができました。 -### Install Gentoo kernel -一応、GentooKernelというLinuxカーネルを再インストールしておきます。 -## システムの設定 -fstubに必要なことを書き込みます。 できたら、ホスト名を`/etc/hostname`に追加して、 Dhcpクライアントであるdhcpcdをインストールしました。 この後に出てくるプログラムもそうですが、基本的にはインストールしたらopen-rcにaddします。 あとは、rootユーザーのパスワードを設定して、 次回ブート時のキーボードの設定もぶち込みます`jp106`。私はこれを間違えて`en`のまま再起動して、パスワードが打てなくなって詰んだことがあります。気をつけましょう。 -## ツールのインストール(と有効化) -システムログは`syslogd`を、 クーロンデーモンは`cronie`を使いました。 あと、外部からアクセスできないと困るので。SSHを有効化しました。 個人的に必須だと思っているのが、シェル補完の`bash-completion`です。 -## ブートローダーの設定 -ブートローダーは`grub`を使います。kernel設定の時点でされていると思いますが、もう一度`grub`を`emerge`して、 -``` -grub-install /dev/sda -``` -コマンドでインストールします。 グループのインストールがおわったら、`grub`のコンフィグを書き込みます。 ここがドキュメントの中で生まれて、少し見にくくて、飛ばしちゃってブートしない。みたいな事故が何回か起きたのでご注意です。 また、この段階か、もういっこ前の段階で、ログで「デュアルブートのために2つ目のOSを探しに行きます」みたいな設定を有効にしているので、それを無効にする設定をグルヴのえとせに書き込みます。 私の環境では、このログを無視して進むと、起動時に`grub`を操作しないとブートができない状態だったので、ここは割と大事です。 -### 緊張のリブート -全部`exit`して、システムをリブートします。この瞬間が一番緊張します。だって、今までの努力がすべて吹き飛んでブートしませんでしたってなったら、すべてがやり直しなので、結構きついですね。 -## インストールの締め括り -日常的な使用のためのユーザーを作って、一時的に権限を獲得する為のsudoをインストールします。`nano`を消したのに`visudo`が`nano`を触ろうとしてエラーをおこしてて、そこのコンフィグ治すのが大変でした。コピペが使えないのがなおさらきつかったです。 -## GUIの導入 -実は、今までi3しか使ったことはなくて、`sway`を使うのは初めてなのですが、せっかくだし`wayland`を使いたいということで、`sway`を入れます。`sway`の依存関係の中に`wayland`が入ってたのか、そもそもデスクトッププロファイルに入ってたのか、useフラグで有効にしたのかを忘れちゃいましたが、`wayland`が勝手に入ってて、`emerge --ask sway`するだけで環境は整いました。 -### swayが起きない -ところがどっこい、`sway`コマンドを打っても起動しません。ログを見ると、`elogind`とかが勝手に有効にしてくれる設定で、`xdg`なんとかの設定項目が設定されてないよ。って言われたので、open-rcに`elogind`をブートレベルに追加しておきます。`rc-update add elogind boot` -## 無事に -ここまでの設定は終わると`sway`を起動することが出来ました。i3のコンフィグを流用していて、その環境に入っているフォントが入ってないとか、いろいろ文句を言われたりはしましたが、一応のところ`sway`がちゃんと動いてくれたので、デスクトッププロファイルを用いた`Gentoo install with -Ofast`は完成ってことになりました。 +--- +title: Gentoo Desktop with "-Ofast" +tags: +- linux +- gcc +- gentoo +- ofast +private: false +updated_at: 2025-09-28 17:32 +id: null +organization_url_name: null +slide: false +--- +# 経緯 +Gentoo Linuxのインストールを複数回やって、きたのでそろそろ挑戦的なことがしてみたいという気持ちが発生してきて、このような内容をやってみました。 +とりあえず構築しようとした環境をまとめておきます。 +# 想定読者 +- Gentoo Linuxに慣れてきて、そろそろ変わったことがしたいと思っている人 +- Gentoo Linuxって敷居が高くてなぁ...って思っている人 +- Gentoo Linuxのメンテナー +- gccオプションの意味を考えずに使っている人 +# 目標 +最終的に目指すところはこちらです。 + +|key|value| +|-|-| +|OS|Gentoo Linux| +|Arch|VM(QEMU on Intel x86_64)| +|VM Flaver|4vCPU_4GiBRAM_32GiBHDD| +|wm|sway| +|display serv|wayland| +|terminal emu|alacritty| +|editor|vim/nvim| +|BIOS|seaBIOS(not UEFI)| + +# Ref +- [Gentoo Handbook for AMD64](https://wiki.gentoo.org/wiki/Handbook:AMD64/ja) +- [作業の様子のYouTube配信動画の再生リスト](https://youtube.com/playlist?list=PLQ-fF3xcxe3e8hY7tb2Dr4z0pAb1qeq2E&si=BC51X8-7hP18QI4_) + +# 実際の手順 +## 下準備 +YouTubeで配信(ログのこしのため)するつもりだったのと、使ってるVMホストをする子が、まともに設定を弄っていないProxmoxだったので、コピペが使えず(or使いづらく)、踏み台サーバからsshして繋ぎました。 +``` +ssh-import-id gh:<your github account> +``` +して、keyを入れ、 +``` +passwd +``` +でrootのパスワードを設定し、 +``` +rc-service sshd start +``` +でsshサーバを起動すれば準備はOK +``` +ip a +``` +でマシンのipを確認して、踏み台からsshしに行きます。 +## ディスクの準備 +QEMUではseaBIOSを使っていたので、レガシーBIOSとしてセットアップします。 +|part name|mount path|fs|role|size| +|-|-|-|-|-| +|/dev/sda1|/boot|xfs|boot loader|1G| +|/dev/sda2|swap|swap|swap|16G| +|/dev/sda3|/|ext4|files|15G| + +ちょっと歪な構成になりましたね。ビルドに時間がかかった経験から(主に-Ofastのせい)、swapをデカくした結果、こうなりました。メインのファイルシステムよりもスワップが大きいなんて......ま、お遊び環境だし、特に重要で大きなものを置く予定もないので、これで一旦は様子見です。 +### +追記20250905 +この構成でインストールを進めていたところ、システムのサイズが足りないと言われてしまったので、 +`swap`の8GBを`/`に上げるように構成を変更し、インストールし直しをしました。 + +## stageファイル +文章の構成がGentooHandbookっぽくなってきました。 +なので、詳細はgentoo handbookに任せます。というか、あの文章はとても初心者向けに詳しく書いてあるので、Arch Linuxに挫折した知り合いが「あの行為はこういう意味だったんだ」と何度も感心していました。 +話を戻して、`links`で`www.gentoo.org/downloads`にアクセスしてstageファイルとそのsha256チェックサムを落としてきます。この辺はなんどもやっていて手練れなので、手早くやっていけました。 +コツは`.sha256`ファイルを落としてくるときに、linksだとデフォルトの末尾に`.tar.xz`だったかが着くので、それを外して落とすことです。そうすることで`sha256sum --check sta*`を打つときに、長ったらしいファイル名を入力せずにTab補完が使えますし、なにより`sha256sum`コマンドが末尾が`.sha256`じゃないファイルだと、それを省略したファイルを読んだりできないのでとても困ります。 +## ベースシステム(?)のインストール +### Chroot +handbookからのコピペ作業が多い。知り合いはarch-chrootで横着してるって言ってましたね。ただ、個人的には何らかの事情でファイルシステム構成が変わってると怖いので、やりたくないですね。 +### CFLAG +ここが今回のメインと言っても過言ではないパート。そう、CFLAGです。コンパイラに渡すオプションの指定なのですが、ここで最適化`-Ofast`をグローバルにかけるという暴れっぷりを発揮しました。 +これが試したくて、今回の企画が始まったといっても過言じゃないです。 +### USE_FLAG +使うパッケージ、使わないパッケージを省略し、使いそうなパッケージをいれる作業ですね。 +これに結構時間を使いました。というか、これが一番人間に時間がかかる作業です。 +といっても、知っているパッケージはあまりなかったので、知ってて明確に減らしたほうがよいものだけを減らしていった感じです。 +### RUST_FLAG +handbookのそのままです。Rust大好き人間なので当然のように使います。 +### rsync --> git +知り合いからemergeのリポジトリの更新プロトコルであるrsyncをgitに置き換えれるよと教えてもらったので、やってみました。 +[記事はこちら。](https://zenn.dev/minervajuppiter/articles/a1d15e757ef0f8)なお、手順のコマンドしか書いてないので、詳細に興味がある方はrefにあるgentoo wikiを読み、適宜ググってください。 +### いざ、更新 +の前に、前の手順でUSEフラグの一部が入ったので、意外といれるパッケージは少なかったりします。前回はここで155パッケージでしたからね。前手順40パッケージ、今回40パッケージくらいなので、ここの時間は結構短縮されたように思います。前回はUSEフラグを便利そうなツール全てに立てていたので、USEフラグは不要物を除去するために使ったほうが良いのかなという気になってきました。 +ま、それでも平気で数時間はかかるので私は一旦就寝です。 +``` +emerge --ask --verbose --update --deep --changed-use @world +``` +### 更新が止まった +elogindのemergeで更新がエラーを吐いて停止しました。これは前回と同じ動作ですが、ログ(ビルドしている途中でgccあたりが吐いているもの)を見ていると、`-Ofast`はだめだよって書いてあるので、`elogind`には-O3を設定します。 +``` +mkdir /etc/portage/env +``` +で環境ディレクトリを作って、その中に`COMMON_FLAG`を`-O3`にしたバージョンの +``` +COMMON_FLAGS="-march=native -O3 -pipe" +CFLAGS="${COMMON_FLAGS}" +CXXFLAGS="${COMMON_FLAGS}" +``` +を書いたenvファイル(ファイル名は任意だがここではo3とする)を作ります。 +そしたら`/etc/portage/package.env`ファイルにパッケージ名と適応したいenvファイル名を書きます。 +``` +sys-auth/elogind o3(任意のファイル名) +``` +これで終わりです。 +更新に戻ります。 +※再試行の際はelogindのUSEフラグは切りました。 +## kernelの設定 +`/etc/portage/package.use/installkernel`に以下の内容を書き込んで保存し、firmwareとgentoo-kernelを同時にemeregeしてしまいました(grubも巻き添え) +``` +sys-kernel/installkernel grub dracut +``` +### ここでmake停止 +ディスクの残り容量がないのでと言われ、`gentoo-kernel`のmakeが止まった様子です。 +dfやduを使って見ていくと`/var/tmp`が16GBも食っているではないですか。 +とりあえず`gentoo-kernel`のmake設定も`-O3`の方にして様子見します。 +いろいろやってみましたが、成果は芳しくなく。 最終的には、 VMに新しくハードディスクを100GB追加して、 それを/var/tmpにマウントする事で、添付ファイルの容量を大目にとって解決することができました。 +### Install Gentoo kernel +一応、GentooKernelというLinuxカーネルを再インストールしておきます。 +## システムの設定 +fstubに必要なことを書き込みます。 できたら、ホスト名を`/etc/hostname`に追加して、 Dhcpクライアントであるdhcpcdをインストールしました。 この後に出てくるプログラムもそうですが、基本的にはインストールしたらopen-rcにaddします。 あとは、rootユーザーのパスワードを設定して、 次回ブート時のキーボードの設定もぶち込みます`jp106`。私はこれを間違えて`en`のまま再起動して、パスワードが打てなくなって詰んだことがあります。気をつけましょう。 +## ツールのインストール(と有効化) +システムログは`syslogd`を、 クーロンデーモンは`cronie`を使いました。 あと、外部からアクセスできないと困るので。SSHを有効化しました。 個人的に必須だと思っているのが、シェル補完の`bash-completion`です。 +## ブートローダーの設定 +ブートローダーは`grub`を使います。kernel設定の時点でされていると思いますが、もう一度`grub`を`emerge`して、 +``` +grub-install /dev/sda +``` +コマンドでインストールします。 グループのインストールがおわったら、`grub`のコンフィグを書き込みます。 ここがドキュメントの中で生まれて、少し見にくくて、飛ばしちゃってブートしない。みたいな事故が何回か起きたのでご注意です。 また、この段階か、もういっこ前の段階で、ログで「デュアルブートのために2つ目のOSを探しに行きます」みたいな設定を有効にしているので、それを無効にする設定をグルヴのえとせに書き込みます。 私の環境では、このログを無視して進むと、起動時に`grub`を操作しないとブートができない状態だったので、ここは割と大事です。 +### 緊張のリブート +全部`exit`して、システムをリブートします。この瞬間が一番緊張します。だって、今までの努力がすべて吹き飛んでブートしませんでしたってなったら、すべてがやり直しなので、結構きついですね。 +## インストールの締め括り +日常的な使用のためのユーザーを作って、一時的に権限を獲得する為のsudoをインストールします。`nano`を消したのに`visudo`が`nano`を触ろうとしてエラーをおこしてて、そこのコンフィグ治すのが大変でした。コピペが使えないのがなおさらきつかったです。 +## GUIの導入 +実は、今までi3しか使ったことはなくて、`sway`を使うのは初めてなのですが、せっかくだし`wayland`を使いたいということで、`sway`を入れます。`sway`の依存関係の中に`wayland`が入ってたのか、そもそもデスクトッププロファイルに入ってたのか、useフラグで有効にしたのかを忘れちゃいましたが、`wayland`が勝手に入ってて、`emerge --ask sway`するだけで環境は整いました。 +### swayが起きない +ところがどっこい、`sway`コマンドを打っても起動しません。ログを見ると、`elogind`とかが勝手に有効にしてくれる設定で、`xdg`なんとかの設定項目が設定されてないよ。って言われたので、open-rcに`elogind`をブートレベルに追加しておきます。`rc-update add elogind boot` +## 無事に +ここまでの設定は終わると`sway`を起動することが出来ました。i3のコンフィグを流用していて、その環境に入っているフォントが入ってないとか、いろいろ文句を言われたりはしましたが、一応のところ`sway`がちゃんと動いてくれたので、デスクトッププロファイルを用いた`Gentoo install with -Ofast`は完成ってことになりました。 diff --git a/public/gentoo_install_battle.md b/public/gentoo_install_battle.md @@ -1,7 +1,9 @@ ---- -title: "Gentoo install battle" -emoji: "🙆♀️" -topics: [] -published: false ---- - +--- +title: Gentoo install battle +tags: [] +private: false +updated_at: '' +id: null +organization_url_name: null +slide: false +--- diff --git a/public/how_to_export_specific_channels_in_mattermost.md b/public/how_to_export_specific_channels_in_mattermost.md @@ -1,86 +1,86 @@ ---- -title: "Mattermostの特定のチャンネルをexportする方法" -emoji: "📑" -type: "tech" -topics: - - "export" - - "mattermost" -published: true -published_at: "2026-02-26 21:10" ---- - -# 総集編 -### ログイン(トークンの取得) -```bash -curl -i -d '{"login_id":"username@example.com","password":"thisbadpassword"}' https://yourdomain/api/v4/users/login -``` -### export -```bash -curl -i -H 'Authorization: Bearer TOKEN' https://yourdomain/api/v4/channels/CHANNEL_ID/posts -o mattermost-export.json -``` - -# 想定読者 -~~Mattermostの新たなFreeEditionへの規制の追加で~~Mattermostの提供が終了するため,履歴をexportしておきたい方 - -# 詳細な手順 - -### ログイン -アカウントでログインします. -アカウントのアクセス範囲にあるAPIが叩けるようになります. -```bash -curl -i -d '{"login_id":"username@example.com","password":"thisbadpassword"}' https://yourdomain/api/v4/users/login -``` -もちろんのこと,username@example.comとそのpassword,yourdomainはexportしたいMattermostのURLのドメインです. -成功すると以下のようなレスポンスが返ってきます. -```bash -HTTP/2 200 -date: Thu, 26 Feb 2026 11:15:29 GMT -content-type: application/json -content-length: 772 -permissions-policy: -referrer-policy: no-referrer -token: TOKEN -vary: Accept-Encoding -x-content-type-options: nosniff -x-ratelimit-limit: 101 -x-ratelimit-remaining: 100 -x-ratelimit-reset: 1 -x-request-id: X-REQUEST-ID -x-version-id: 11.0.7.20090702019.12a90a33d692853deafd8a4c7a7162684aa60dfcb310709dd96061b261c1b24b.false -cf-cache-status: DYNAMIC -nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800} -report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"URL"}]} -server: SERVER -cf-ray: CF-RAY -alt-svc: h3=":443"; ma=86400 - -(以下,ユーザーの詳細) -``` -これの上から7行目`token:`の後ろにあるのが,貴方の一時的なアクセストークンです. - -### `channel ID`の取得 -`Channel ID`はMattermostのUIから確認することができます. - -当該チャンネルを開いて,右上のinfoマークを押したら,画像のようなタブが出てきます. -これの赤く塗りつぶした部分,ここにチャンネルのIDが表示されています. -参考文献の2にはAPIだけでチャンネルのIDを取得する方法が掲載されています. -※チャンネルIDは任意の文字列です.チャンネル名やチャンネルのURLとは異なります. - -### エクスポート -```bash -curl -i -H 'Authorization: Bearer TOKEN' https://yourdomain/api/v4/channels/CHANNEL_ID/posts -``` -この`TOKEN`は先程ログインのときにもらったものです. -yourdomainは引き続きexportしたいMattermostのURLのドメインです. -そして`CHANNEL_ID`は先程説明したチャンネルIDです. -そうしたらJSON形式で降ってきます. -cURLではファイルをエクスポートすることができます. -エクスポート後のファイル名を`mattermost-export.json`とすると -```bash -curl -i -H 'Authorization: Bearer TOKEN' https://yourdomain/api/v4/channels/CHANNEL_ID/posts -o mattermost-export.json -``` -とできる. - -# 参考文献 -1. [Mattermost API Document](https://developers.mattermost.com/api-documentation/) +--- +title: Mattermostの特定のチャンネルをexportする方法 +tags: +- export +- mattermost +private: false +updated_at: 2026-02-26 21:10 +id: null +organization_url_name: null +slide: false +--- +# 総集編 +### ログイン(トークンの取得) +```bash +curl -i -d '{"login_id":"username@example.com","password":"thisbadpassword"}' https://yourdomain/api/v4/users/login +``` +### export +```bash +curl -i -H 'Authorization: Bearer TOKEN' https://yourdomain/api/v4/channels/CHANNEL_ID/posts -o mattermost-export.json +``` + +# 想定読者 +~~Mattermostの新たなFreeEditionへの規制の追加で~~Mattermostの提供が終了するため,履歴をexportしておきたい方 + +# 詳細な手順 + +### ログイン +アカウントでログインします. +アカウントのアクセス範囲にあるAPIが叩けるようになります. +```bash +curl -i -d '{"login_id":"username@example.com","password":"thisbadpassword"}' https://yourdomain/api/v4/users/login +``` +もちろんのこと,username@example.comとそのpassword,yourdomainはexportしたいMattermostのURLのドメインです. +成功すると以下のようなレスポンスが返ってきます. +```bash +HTTP/2 200 +date: Thu, 26 Feb 2026 11:15:29 GMT +content-type: application/json +content-length: 772 +permissions-policy: +referrer-policy: no-referrer +token: TOKEN +vary: Accept-Encoding +x-content-type-options: nosniff +x-ratelimit-limit: 101 +x-ratelimit-remaining: 100 +x-ratelimit-reset: 1 +x-request-id: X-REQUEST-ID +x-version-id: 11.0.7.20090702019.12a90a33d692853deafd8a4c7a7162684aa60dfcb310709dd96061b261c1b24b.false +cf-cache-status: DYNAMIC +nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800} +report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"URL"}]} +server: SERVER +cf-ray: CF-RAY +alt-svc: h3=":443"; ma=86400 + +(以下,ユーザーの詳細) +``` +これの上から7行目`token:`の後ろにあるのが,貴方の一時的なアクセストークンです. + +### `channel ID`の取得 +`Channel ID`はMattermostのUIから確認することができます. + +当該チャンネルを開いて,右上のinfoマークを押したら,画像のようなタブが出てきます. +これの赤く塗りつぶした部分,ここにチャンネルのIDが表示されています. +参考文献の2にはAPIだけでチャンネルのIDを取得する方法が掲載されています. +※チャンネルIDは任意の文字列です.チャンネル名やチャンネルのURLとは異なります. + +### エクスポート +```bash +curl -i -H 'Authorization: Bearer TOKEN' https://yourdomain/api/v4/channels/CHANNEL_ID/posts +``` +この`TOKEN`は先程ログインのときにもらったものです. +yourdomainは引き続きexportしたいMattermostのURLのドメインです. +そして`CHANNEL_ID`は先程説明したチャンネルIDです. +そうしたらJSON形式で降ってきます. +cURLではファイルをエクスポートすることができます. +エクスポート後のファイル名を`mattermost-export.json`とすると +```bash +curl -i -H 'Authorization: Bearer TOKEN' https://yourdomain/api/v4/channels/CHANNEL_ID/posts -o mattermost-export.json +``` +とできる. + +# 参考文献 +1. [Mattermost API Document](https://developers.mattermost.com/api-documentation/) 2. [Mattermost Forums ~How do I extract posts from a Mattermost channel?~](https://forum.mattermost.com/t/how-do-i-extract-posts-from-a-mattermost-channel/6285) \ No newline at end of file diff --git a/public/i_made_a_subtractive_synthesizer_using_rust.md b/public/i_made_a_subtractive_synthesizer_using_rust.md @@ -1,131 +1,131 @@ ---- -title: "Rustで減算方式のシンセサイザーを作った" -emoji: "🎹" -type: "tech" -topics: - - "rust" - - "vst" - - "clap" - - "nihplug" -published: true -published_at: "2026-04-14 00:17" ---- - -## 想定読者 - -- Rustacean -- CLAPプラグインを書いてみたい人 - -## 成果物 -https://github.com/minerva-jupiter/mooxide - -## 使用技術 - -- Rust -- nih-plug -- DAW(REAPER) - -## 構想 - -私は3年前くらいから歌うシンセサイザーを作りたいと思っていました。 -VOCALOIDは触った程度でしたが、DAWとの結合が甘いのが不満点でした。 -また、NEUTRINOをメインで使っていましたが、これは完全に別プロセスで、やはりDAWから調声をしたいと思っていました。 -これらに加えて、人間の声と合成音声の違いについての研究の成果も合わせて、合成音声のVSTiをつくるという構想がありました。 -それらに向けた習作として、また、自分が使いやすいようなシンセサイザーを作れたら便利だなと思い、開発に踏み切りました。 -~~mini moogとか欲しいのだけど、高くて手が出ないからソフトウェアで作っちまえって思いたったのもあります。~~ - -## nih-plugについて - -[nih-plug](https://github.com/robbert-vdh/nih-plug)はRustでVSTiとCLAPを作成するためのフレームワークです。 -今回はSteinberg社が規定するVST3 Licenseの関係がめんどくさいと感じた(当社比)ので、CLAPだけに焦点を絞って作りました。 - -他の選択肢としてJUCEというフレームワークがあります。 -これはOSSのC++でアプリやプラグインを作るフレームワークです。 -また、フレームワークを使わなくてもSteinberg社が出しているVST3 SDKというものを使えばC++でVSTを書くことができます。 - -私がそんな中でnih-plugを採用した理由は、ズバリ、Rustで書けるからです。 -Rustを書いているときにしか得られない栄養があります。(中毒者のセリフ) -というかCの扱いが難しすぎてC++に手を出すきになれなかったという方が正しいかもしれないです。 - -## 開発手順概説 -### セットアップ - -Rustでプラグインを書く為のnih-plugですが、プロジェクトのセットアップにはpythonを使ったcookiecutterを使用します。 -まず、pipxが無ければ入れます。 -```bash -pip install pipx -``` -そしてセットアップを実行します。 -```bash -pipx run cookiecutter gh:robbert-vdh/nih-plug-template -``` -ここでプロジェクトの名前などを決めて、気づいたらプロジェクトのフォルダーが完成しています。 - -### CLAPのみに設定 - -https://github.com/minerva-jupiter/mooxide/commit/b9406fbce17ead3f25c9e3600eef349993289944 -具体的な作業はcommitの変更点を参照してください。 -VST3のバインディングを外して、nih-plugのfeature設定を変更したりしています。 - -### GUIについて - -配布されている殆どのプラグインにはGUIが搭載されています。 -私はそういうものは基本的に不要だと考えています。 -曲の中で動的に数値を変えたいとなるとDAW側のエンベロープを用いることになり、結局のところGUIは計算資源の無駄遣いになってしまうんじゃないかなと思ってしまいます。 -もちろん、エフェクターの配置を自由に変えることができるプラグインなどでGUIが有意義であることは認めます。 - -### オシレーターの実装 - -一からすべてを考える必要はありません。 -nih-plugのリポジトリにシンセサイザーの作例があるので、ありがたく使わせてもらいましょう。 -https://github.com/robbert-vdh/nih-plug/tree/master/plugins/examples/sine -ただ、参考にしたmini moogはオシレーターが3つ付いていたので、その分、detuneやミックスを考慮してコードを書き足していきました。 -作業としては、structにパラメーターを追記して、それを掛けるなり足すなりするだけなので、コードに高度な変更はしてないです。 -https://github.com/minerva-jupiter/mooxide/commit/f53c759018bb6a4551fbc61829c9eac3879205c8 -個人的にはシンセの波の形をプログラムで書くときに、関数として綺麗な形で書く(条件分岐を減らす等)工夫が楽しかったです。 - -### ノイズ生成 - -ノイズ生成が一番簡単でした。 -特にホワイトノイズ。 --1~1のランダムな値を返せばそれで終わりですよ。 -拍子抜け。 - -### ローパスフィルターの実装 - -減算方式シンセサイザーの"減算"の部分です。 -本当は4ラダーフィルターの動きをシミュレートしたかったのですが、あまりうまくいかなかったです。 -似たようなことをしている先人も見つけることができず、闇に消えました。 -たどり着いたのは、参考文献の1つ目、セットアップのときに参考にした記事でした。 -こちらの記事で参考にされている記事で参照されているBiQuadフィルタという非常に簡易的なローパスフィルターの実装をしました。 - -### エンベロープの実装 - -フィルターの効き具合や信号強度を、鍵盤が押されてからの時間経過で切り替えるために、エンベロープを実装しました。 -https://github.com/minerva-jupiter/mooxide/commit/da4a5e14d5894bf3fdfbe7be3657d42cf63c78b9 - -### ビルドとデバック - -作った系の記事ってこれがなくて困るので、私は書きます。 -ビルドコマンドはReadmeにも書いた通り -``` -cargo xtask bundle mooxide --release -``` -です。これで`target/release`みたいなフォルダーにCALPプラグインができてます。 -これをいちいちCLAPの既定の場所に持っていっても良いんですけどめんどくさいので、ReaperのCLAPを探しに行く場所にプロジェクトのリポジトリを追加するという荒業で対応しました。 -ちなみにReaperだとプラグインのキャッシュを残すのか、一度Reaperを閉じてからもう一度開かないと、うまく変更が適応されない場合がありました。 - -あと、最初に書いてあるゲインプログラムは有効な状態で残しといたほうが良いです。 -もしうまく動かなかったときに、音量が大きすぎるせいor小さすぎるせいという可能性を検証することができるからです。 - -## 最後に - -拙い文章ですが、読んで下さり、ありがとうございます。 -nih-plugの日本語記事が非常に少数で、楽器を作るとなるとまた非常に少数だったので、記事にしてみました。 -コーディング難易度も高くなく、成果物がちゃんと音を鳴らす様子を見ると、楽しかったです。 -みなさんもやってみてください。 -最後に、構想でも書きましたが、合成音声CLAPの制作をしている途中です。 -難易度が高いので、一緒にやってくれる人がほしいです。 - -## 参考文献 +--- +title: Rustで減算方式のシンセサイザーを作った +tags: +- rust +- vst +- clap +- nihplug +private: false +updated_at: 2026-04-14 00:17 +id: null +organization_url_name: null +slide: false +--- +## 想定読者 + +- Rustacean +- CLAPプラグインを書いてみたい人 + +## 成果物 +https://github.com/minerva-jupiter/mooxide + +## 使用技術 + +- Rust +- nih-plug +- DAW(REAPER) + +## 構想 + +私は3年前くらいから歌うシンセサイザーを作りたいと思っていました。 +VOCALOIDは触った程度でしたが、DAWとの結合が甘いのが不満点でした。 +また、NEUTRINOをメインで使っていましたが、これは完全に別プロセスで、やはりDAWから調声をしたいと思っていました。 +これらに加えて、人間の声と合成音声の違いについての研究の成果も合わせて、合成音声のVSTiをつくるという構想がありました。 +それらに向けた習作として、また、自分が使いやすいようなシンセサイザーを作れたら便利だなと思い、開発に踏み切りました。 +~~mini moogとか欲しいのだけど、高くて手が出ないからソフトウェアで作っちまえって思いたったのもあります。~~ + +## nih-plugについて + +[nih-plug](https://github.com/robbert-vdh/nih-plug)はRustでVSTiとCLAPを作成するためのフレームワークです。 +今回はSteinberg社が規定するVST3 Licenseの関係がめんどくさいと感じた(当社比)ので、CLAPだけに焦点を絞って作りました。 + +他の選択肢としてJUCEというフレームワークがあります。 +これはOSSのC++でアプリやプラグインを作るフレームワークです。 +また、フレームワークを使わなくてもSteinberg社が出しているVST3 SDKというものを使えばC++でVSTを書くことができます。 + +私がそんな中でnih-plugを採用した理由は、ズバリ、Rustで書けるからです。 +Rustを書いているときにしか得られない栄養があります。(中毒者のセリフ) +というかCの扱いが難しすぎてC++に手を出すきになれなかったという方が正しいかもしれないです。 + +## 開発手順概説 +### セットアップ + +Rustでプラグインを書く為のnih-plugですが、プロジェクトのセットアップにはpythonを使ったcookiecutterを使用します。 +まず、pipxが無ければ入れます。 +```bash +pip install pipx +``` +そしてセットアップを実行します。 +```bash +pipx run cookiecutter gh:robbert-vdh/nih-plug-template +``` +ここでプロジェクトの名前などを決めて、気づいたらプロジェクトのフォルダーが完成しています。 + +### CLAPのみに設定 + +https://github.com/minerva-jupiter/mooxide/commit/b9406fbce17ead3f25c9e3600eef349993289944 +具体的な作業はcommitの変更点を参照してください。 +VST3のバインディングを外して、nih-plugのfeature設定を変更したりしています。 + +### GUIについて + +配布されている殆どのプラグインにはGUIが搭載されています。 +私はそういうものは基本的に不要だと考えています。 +曲の中で動的に数値を変えたいとなるとDAW側のエンベロープを用いることになり、結局のところGUIは計算資源の無駄遣いになってしまうんじゃないかなと思ってしまいます。 +もちろん、エフェクターの配置を自由に変えることができるプラグインなどでGUIが有意義であることは認めます。 + +### オシレーターの実装 + +一からすべてを考える必要はありません。 +nih-plugのリポジトリにシンセサイザーの作例があるので、ありがたく使わせてもらいましょう。 +https://github.com/robbert-vdh/nih-plug/tree/master/plugins/examples/sine +ただ、参考にしたmini moogはオシレーターが3つ付いていたので、その分、detuneやミックスを考慮してコードを書き足していきました。 +作業としては、structにパラメーターを追記して、それを掛けるなり足すなりするだけなので、コードに高度な変更はしてないです。 +https://github.com/minerva-jupiter/mooxide/commit/f53c759018bb6a4551fbc61829c9eac3879205c8 +個人的にはシンセの波の形をプログラムで書くときに、関数として綺麗な形で書く(条件分岐を減らす等)工夫が楽しかったです。 + +### ノイズ生成 + +ノイズ生成が一番簡単でした。 +特にホワイトノイズ。 +-1~1のランダムな値を返せばそれで終わりですよ。 +拍子抜け。 + +### ローパスフィルターの実装 + +減算方式シンセサイザーの"減算"の部分です。 +本当は4ラダーフィルターの動きをシミュレートしたかったのですが、あまりうまくいかなかったです。 +似たようなことをしている先人も見つけることができず、闇に消えました。 +たどり着いたのは、参考文献の1つ目、セットアップのときに参考にした記事でした。 +こちらの記事で参考にされている記事で参照されているBiQuadフィルタという非常に簡易的なローパスフィルターの実装をしました。 + +### エンベロープの実装 + +フィルターの効き具合や信号強度を、鍵盤が押されてからの時間経過で切り替えるために、エンベロープを実装しました。 +https://github.com/minerva-jupiter/mooxide/commit/da4a5e14d5894bf3fdfbe7be3657d42cf63c78b9 + +### ビルドとデバック + +作った系の記事ってこれがなくて困るので、私は書きます。 +ビルドコマンドはReadmeにも書いた通り +``` +cargo xtask bundle mooxide --release +``` +です。これで`target/release`みたいなフォルダーにCALPプラグインができてます。 +これをいちいちCLAPの既定の場所に持っていっても良いんですけどめんどくさいので、ReaperのCLAPを探しに行く場所にプロジェクトのリポジトリを追加するという荒業で対応しました。 +ちなみにReaperだとプラグインのキャッシュを残すのか、一度Reaperを閉じてからもう一度開かないと、うまく変更が適応されない場合がありました。 + +あと、最初に書いてあるゲインプログラムは有効な状態で残しといたほうが良いです。 +もしうまく動かなかったときに、音量が大きすぎるせいor小さすぎるせいという可能性を検証することができるからです。 + +## 最後に + +拙い文章ですが、読んで下さり、ありがとうございます。 +nih-plugの日本語記事が非常に少数で、楽器を作るとなるとまた非常に少数だったので、記事にしてみました。 +コーディング難易度も高くなく、成果物がちゃんと音を鳴らす様子を見ると、楽しかったです。 +みなさんもやってみてください。 +最後に、構想でも書きましたが、合成音声CLAPの制作をしている途中です。 +難易度が高いので、一緒にやってくれる人がほしいです。 + +## 参考文献 - [Rustで簡単にVST/CLAPプラグインを作る](https://qiita.com/Saisana299/items/003aa9aa3b40db4f6f89) \ No newline at end of file diff --git a/public/now_rreport_of_my_home_cluster.md b/public/now_rreport_of_my_home_cluster.md @@ -1,75 +1,75 @@ ---- -title: "Now Rreport of my home Cluster" -emoji: "📃" -type: "tech" -topics: - - "zennfes2025infra" -published: true -published_at: "2025-09-28 18:19" ---- - -# 我が家のインフラまとめ -## Network -```mermaid -flowchart TD - A[GlobalNetwork] --> B[Provider] - B --> C[ONU & Router & AP] - ceres-cf --> Cloudflare - proxmox-cf --> Cloudflare - Cloudflare --> A - ironkube-con --> ironkube-work02 - - subgraph Home /24 - C --> ceres[Proteus] - C --> janus[iani] - C --> proxmox[Proxmox] - end - - subgraph ceres - ceres-docker[docker] - ceres-cf[Cloudflared] - ironkube-work02 - end - - subgraph ceres-docker - Minecraft01[priv Minecraft01] - end - - subgraph proxmox - proxmox-cf[Cloudflared] - dokuwiki --> proxmox-cf - proxmox-gate[Janus-gate] --> proxmox-cf - Softether - GithubRunners - ironkube-con --> ironkube-work01 - end -``` -※Ceres is internal server name. -※ironkube is internal k8s cluster name. -## Spec -### Proxmox -||| -|-|-| -|CPU|Intel Core i3-4170| -|Mem|DDR3 8GB| -|SSD|128GB| -|HDD1|512GB| -|HDD2|512GB| -### Ceres -||| -|-|-| -|CPU|AMD Ryzen 3 PRO 2200G| -|Mem|DDR4 16GB| -|SSD|1TB| -## OS -### Proxmox's VM -||| -|-|-| -|cloudflared|UbuntuServer| -|dokuwiki|AlpineLinux| -|moodle|AlpineLinux| -|softether|UbuntuServer| -|github runner|UbuntuServer| -|janus-gate|GentooLinux| -### Ceres -UbuntuServer +--- +title: Now Rreport of my home Cluster +tags: +- zennfes2025infra +private: false +updated_at: 2025-09-28 18:19 +id: null +organization_url_name: null +slide: false +--- +# 我が家のインフラまとめ +## Network +```mermaid +flowchart TD + A[GlobalNetwork] --> B[Provider] + B --> C[ONU & Router & AP] + ceres-cf --> Cloudflare + proxmox-cf --> Cloudflare + Cloudflare --> A + ironkube-con --> ironkube-work02 + + subgraph Home /24 + C --> ceres[Proteus] + C --> janus[iani] + C --> proxmox[Proxmox] + end + + subgraph ceres + ceres-docker[docker] + ceres-cf[Cloudflared] + ironkube-work02 + end + + subgraph ceres-docker + Minecraft01[priv Minecraft01] + end + + subgraph proxmox + proxmox-cf[Cloudflared] + dokuwiki --> proxmox-cf + proxmox-gate[Janus-gate] --> proxmox-cf + Softether + GithubRunners + ironkube-con --> ironkube-work01 + end +``` +※Ceres is internal server name. +※ironkube is internal k8s cluster name. +## Spec +### Proxmox +||| +|-|-| +|CPU|Intel Core i3-4170| +|Mem|DDR3 8GB| +|SSD|128GB| +|HDD1|512GB| +|HDD2|512GB| +### Ceres +||| +|-|-| +|CPU|AMD Ryzen 3 PRO 2200G| +|Mem|DDR4 16GB| +|SSD|1TB| +## OS +### Proxmox's VM +||| +|-|-| +|cloudflared|UbuntuServer| +|dokuwiki|AlpineLinux| +|moodle|AlpineLinux| +|softether|UbuntuServer| +|github runner|UbuntuServer| +|janus-gate|GentooLinux| +### Ceres +UbuntuServer diff --git a/public/pve_upgrade_8_to_9.md b/public/pve_upgrade_8_to_9.md @@ -1,365 +1,365 @@ ---- -title: "PVE upgrade 8 to 9" -emoji: "⛰️" -type: "tech" -topics: - - "debian" - - "proxmox" - - "pve" - - "pve8to9" -published: true -published_at: "2025-11-07 15:00" ---- - -# 想定読者 -- Proxmox VEをCLIからも触ることができ、よく保守している利用者 -- Debian系OSのメジャーバージョンアップグレードをする人 -# 本編 -絶対に参照してください。 -**[公式ドキュメント](https://pve.proxmox.com/wiki/Upgrade_from_8_to_9)** -## `pve8to9`を通す -### 一回目 -チェック用のスクリプトのコマンドが入ってるので実行します。 -``` -pve8to9 -``` -そしたらなんかエラーが出ました。 -どうやらsystemd-bootがあるとコンフィグが上書きされてうまく行かないようです。 -ログはコピーするの忘れてました。 -### 二回目 -systemd-bootを削除後の出力 -``` -root@pve01:~# pve8to9 -= CHECKING VERSION INFORMATION FOR PVE PACKAGES = - -Checking for package updates.. -PASS: all packages up-to-date - -Checking proxmox-ve package version.. -PASS: proxmox-ve package has version >= 8.4-0 - -Checking running kernel version.. -PASS: running kernel '6.8.12-14-pve' is considered suitable for upgrade. - -= CHECKING CLUSTER HEALTH/SETTINGS = - -SKIP: standalone node. - -= CHECKING HYPER-CONVERGED CEPH STATUS = - -SKIP: no hyper-converged ceph setup detected! - -= CHECKING CONFIGURED STORAGES = - -PASS: storage 'datahdd' enabled and active. -PASS: storage 'local' enabled and active. -PASS: storage 'local-lvm' enabled and active. -INFO: Checking storage content type configuration.. -PASS: no storage content problems found -PASS: no storage re-uses a directory for multiple content types. -INFO: Check for usage of native GlusterFS storage plugin... -PASS: No GlusterFS storage found. -INFO: Checking whether all external RBD storages have the 'keyring' option configured -SKIP: No RBD storage configured. - -= VIRTUAL GUEST CHECKS = - -INFO: Checking for running guests.. -WARN: 4 running guest(s) detected - consider migrating or stopping them. -INFO: Checking if LXCFS is running with FUSE3 library, if already upgraded.. -SKIP: not yet upgraded, no need to check the FUSE library version LXCFS uses -INFO: Checking for VirtIO devices that would change their MTU... -PASS: All guest config descriptions fit in the new limit of 8 KiB -INFO: Checking container configs for deprecated lxc.cgroup entries -PASS: No legacy 'lxc.cgroup' keys found. -INFO: Checking VM configurations for outdated machine versions -PASS: All VM machine versions are recent enough - -= MISCELLANEOUS CHECKS = - -INFO: Checking common daemon services.. -PASS: systemd unit 'pveproxy.service' is in state 'active' -PASS: systemd unit 'pvedaemon.service' is in state 'active' -PASS: systemd unit 'pvescheduler.service' is in state 'active' -PASS: systemd unit 'pvestatd.service' is in state 'active' -INFO: Checking for supported & active NTP service.. -PASS: Detected active time synchronisation unit 'chrony.service' -INFO: Checking if the local node's hostname 'pve01' is resolvable.. -INFO: Checking if resolved IP is configured on local node.. -PASS: Resolved node IP '192.168.0.15' configured and active on single interface. -INFO: Check node certificate's RSA key size -PASS: Certificate 'pve-root-ca.pem' passed Debian Busters (and newer) security level for TLS connections (4096 >= 2048) -PASS: Certificate 'pve-ssl.pem' passed Debian Busters (and newer) security level for TLS connections (2048 >= 2048) -INFO: Checking backup retention settings.. -PASS: no backup retention problems found. -INFO: checking CIFS credential location.. -PASS: no CIFS credentials at outdated location found. -INFO: Checking permission system changes.. -INFO: Checking custom role IDs -PASS: no custom roles defined -INFO: Checking node and guest description/note length.. -PASS: All node config descriptions fit in the new limit of 64 KiB -INFO: Checking if the suite for the Debian security repository is correct.. -PASS: found no suite mismatch -INFO: Checking for existence of NVIDIA vGPU Manager.. -PASS: No NVIDIA vGPU Service found. -INFO: Checking bootloader configuration... -PASS: bootloader packages installed correctly -INFO: Check for dkms modules... -SKIP: could not get dkms status -INFO: Check for legacy 'filter' or 'group' sections in /etc/pve/notifications.cfg... -INFO: Check for legacy 'notification-policy' or 'notification-target' options in /etc/pve/jobs.cfg... -PASS: No legacy 'notification-policy' or 'notification-target' options found! -INFO: Check for LVM autoactivation settings on LVM and LVM-thin storages... -NOTICE: storage 'datahdd' has guest volumes with autoactivation enabled -NOTICE: storage 'local-lvm' has guest volumes with autoactivation enabled -NOTICE: Starting with PVE 9, autoactivation will be disabled for new LVM/LVM-thin guest volumes. This system has some volumes that still have autoactivation enabled. All volumes with autoactivations reside on local storage, where this normally does not cause any issues. -You can run the following command to disable autoactivation for existing LVM/LVM-thin guest volumes: - - /usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation - -INFO: Checking lvm config for thin_check_options... -PASS: Check for correct thin_check_options passed -INFO: Check space requirements for RRD migration... -PASS: Enough free disk space for increased RRD metric granularity requirements, which is roughly 24.60 MiB. -INFO: Checking for IPAM DB files that have not yet been migrated. -PASS: No legacy IPAM DB found. -PASS: No legacy MAC DB found. -INFO: Checking if the legacy sysctl file '/etc/sysctl.conf' needs to be migrated to new '/etc/sysctl.d/' path. -PASS: Legacy file '/etc/sysctl.conf' exists but does not contain any settings. -INFO: Checking if matching CPU microcode package is installed. -WARN: The matching CPU microcode package 'intel-microcode' could not be found! Consider installing it to receive the latest security and bug fixes for your CPU. - Ensure you enable the 'non-free-firmware' component in the apt sources and run: - apt install intel-microcode -SKIP: NOTE: Expensive checks, like CT cgroupv2 compat, not performed without '--full' parameter - -= SUMMARY = - -TOTAL: 44 -PASSED: 33 -SKIPPED: 6 -WARNINGS: 2 -FAILURES: 0 - -ATTENTION: Please check the output for detailed information! -``` -### 三回目 -ゲストを落としてもう一回 -``` -root@pve01:~# pve8to9 --full -= CHECKING VERSION INFORMATION FOR PVE PACKAGES = - -Checking for package updates.. -PASS: all packages up-to-date - -Checking proxmox-ve package version.. -PASS: proxmox-ve package has version >= 8.4-0 - -Checking running kernel version.. -PASS: running kernel '6.8.12-14-pve' is considered suitable for upgrade. - -= CHECKING CLUSTER HEALTH/SETTINGS = - -SKIP: standalone node. - -= CHECKING HYPER-CONVERGED CEPH STATUS = - -SKIP: no hyper-converged ceph setup detected! - -= CHECKING CONFIGURED STORAGES = - -PASS: storage 'datahdd' enabled and active. -PASS: storage 'local' enabled and active. -PASS: storage 'local-lvm' enabled and active. -INFO: Checking storage content type configuration.. -PASS: no storage content problems found -PASS: no storage re-uses a directory for multiple content types. -INFO: Check for usage of native GlusterFS storage plugin... -PASS: No GlusterFS storage found. -INFO: Checking whether all external RBD storages have the 'keyring' option configured -SKIP: No RBD storage configured. - -= VIRTUAL GUEST CHECKS = - -INFO: Checking for running guests.. -PASS: no running guest detected. -INFO: Checking if LXCFS is running with FUSE3 library, if already upgraded.. -SKIP: not yet upgraded, no need to check the FUSE library version LXCFS uses -INFO: Checking for VirtIO devices that would change their MTU... -PASS: All guest config descriptions fit in the new limit of 8 KiB -INFO: Checking container configs for deprecated lxc.cgroup entries -PASS: No legacy 'lxc.cgroup' keys found. -INFO: Checking VM configurations for outdated machine versions -PASS: All VM machine versions are recent enough - -= MISCELLANEOUS CHECKS = - -INFO: Checking common daemon services.. -PASS: systemd unit 'pveproxy.service' is in state 'active' -PASS: systemd unit 'pvedaemon.service' is in state 'active' -PASS: systemd unit 'pvescheduler.service' is in state 'active' -PASS: systemd unit 'pvestatd.service' is in state 'active' -INFO: Checking for supported & active NTP service.. -PASS: Detected active time synchronisation unit 'chrony.service' -INFO: Checking if the local node's hostname 'pve01' is resolvable.. -INFO: Checking if resolved IP is configured on local node.. -PASS: Resolved node IP '192.168.0.15' configured and active on single interface. -INFO: Check node certificate's RSA key size -PASS: Certificate 'pve-root-ca.pem' passed Debian Busters (and newer) security level for TLS connections (4096 >= 2048) -PASS: Certificate 'pve-ssl.pem' passed Debian Busters (and newer) security level for TLS connections (2048 >= 2048) -INFO: Checking backup retention settings.. -PASS: no backup retention problems found. -INFO: checking CIFS credential location.. -PASS: no CIFS credentials at outdated location found. -INFO: Checking permission system changes.. -INFO: Checking custom role IDs -PASS: no custom roles defined -INFO: Checking node and guest description/note length.. -PASS: All node config descriptions fit in the new limit of 64 KiB -INFO: Checking if the suite for the Debian security repository is correct.. -PASS: found no suite mismatch -INFO: Checking for existence of NVIDIA vGPU Manager.. -PASS: No NVIDIA vGPU Service found. -INFO: Checking bootloader configuration... -PASS: bootloader packages installed correctly -INFO: Check for dkms modules... -SKIP: could not get dkms status -INFO: Check for legacy 'filter' or 'group' sections in /etc/pve/notifications.cfg... -INFO: Check for legacy 'notification-policy' or 'notification-target' options in /etc/pve/jobs.cfg... -PASS: No legacy 'notification-policy' or 'notification-target' options found! -INFO: Check for LVM autoactivation settings on LVM and LVM-thin storages... -NOTICE: storage 'datahdd' has guest volumes with autoactivation enabled -NOTICE: storage 'local-lvm' has guest volumes with autoactivation enabled -NOTICE: Starting with PVE 9, autoactivation will be disabled for new LVM/LVM-thin guest volumes. This system has some volumes that still have autoactivation enabled. All volumes with autoactivations reside on local storage, where this normally does not cause any issues. -You can run the following command to disable autoactivation for existing LVM/LVM-thin guest volumes: - - /usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation - -INFO: Checking lvm config for thin_check_options... -PASS: Check for correct thin_check_options passed -INFO: Check space requirements for RRD migration... -PASS: Enough free disk space for increased RRD metric granularity requirements, which is roughly 24.60 MiB. -INFO: Checking for IPAM DB files that have not yet been migrated. -PASS: No legacy IPAM DB found. -PASS: No legacy MAC DB found. -INFO: Checking if the legacy sysctl file '/etc/sysctl.conf' needs to be migrated to new '/etc/sysctl.d/' path. -PASS: Legacy file '/etc/sysctl.conf' exists but does not contain any settings. -INFO: Checking if matching CPU microcode package is installed. -WARN: The matching CPU microcode package 'intel-microcode' could not be found! Consider installing it to receive the latest security and bug fixes for your CPU. - Ensure you enable the 'non-free-firmware' component in the apt sources and run: - apt install intel-microcode - -= SUMMARY = - -TOTAL: 43 -PASSED: 34 -SKIPPED: 5 -WARNINGS: 1 -FAILURES: 0 - -ATTENTION: Please check the output for detailed information! -``` -non-free-firmwareは金を払ってないので勘弁してください。次に進みます。 -## リポジトリの更新 -自分はお金を払っていないので、払っていない人向けって書いてあるスクリプトをコピペして実行するだけでいいです。 -``` -apt update -``` -``` -apt dist-upgrade -``` -``` -pveversion -``` -``` -sed -i 's/bookworm/trixie/g' /etc/apt/sources.list -``` -``` -sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/pve-enterprise.list -``` -``` -cat > /etc/apt/sources.list.d/proxmox.sources << EOF -Types: deb -URIs: http://download.proxmox.com/debian/pve -Suites: trixie -Components: pve-no-subscription -Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg -EOF -``` -ワイはcephを使ってないのでceph系はそもそもファイルがないですね。 -私の環境だと行間に空白行があってaptから認識されない形式になっちゃったので、viで適宜修正しながら`apt update`がちゃんと実行されるのを待つだけです。 -ちゃんとリポジトリを取ってこれてそうだったら次です。 -## `dist-upgrade` -Ubuntuの`do-release-update`みたい! -なんか途中でニュースが表示されたが、知らん。へーそうなんだ~って読んで(Shift+G)、qキーで閉じてたら実行が再び進む。 -途中でなんか出てきたので、見てみる。 -### `/etc/issue` Update -`/etc/issue`の変更みたいですね。変更をDで確認すると、元のProxmoxのヤツのほうがいいからNとします。 -``` -Configuration file '/etc/issue' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** issue (Y/I/N/O/D/Z) [default=N] ? D --- /etc/issue 2025-11-07 12:56:29.654409431 +0900 -+++ /etc/issue.dpkg-new 2025-08-25 01:20:00.000000000 +0900 -@@ -1,10 +1,2 @@ -- -------------------------------------------------------------------------------- -- --Welcome to the Proxmox Virtual Environment. Please use your web browser to --configure this server - connect to: -- -- https://192.168.0.15:8006/ -- -------------------------------------------------------------------------------- -+Debian GNU/Linux 13 \n \l - - -Configuration file '/etc/issue' - ==> Modified (by you or by a script) since installation. - ==> Package distributor has shipped an updated version. - What would you like to do about it ? Your options are: - Y or I : install the package maintainer's version - N or O : keep your currently-installed version - D : show the differences between the versions - Z : start a shell to examine the situation - The default action is to keep your current version. -*** issue (Y/I/N/O/D/Z) [default=N] ? N -Installing new version of config file /etc/issue.net ... -``` -### `/etc/lvm/lvm.conf` Update -続きましては`/etc/lvm/lvm.conf`らしいです。 -``` -Configuration file '/etc/lvm/lvm.conf' - ==> Modified (by you or by a script) since installation. - ==> Package distributor has shipped an updated version. - What would you like to do about it ? Your options are: - Y or I : install the package maintainer's version - N or O : keep your currently-installed version - D : show the differences between the versions - Z : start a shell to examine the situation - The default action is to keep your current version. -*** lvm.conf (Y/I/N/O/D/Z) [default=N] ? D ---- /etc/lvm/lvm.conf 2025-04-26 20:47:17.070430178 +0900 -+++ /etc/lvm/lvm.conf.dpkg-new 2025-08-11 17:46:22.000000000 +0900 -``` -こっちはめちゃ長い! -コメントの綴ミスがほとんどだけど、最後にコメントアウトされてない設定が消されてました。 -``` --devices { -- # added by pve-manager to avoid scanning ZFS zvols and Ceph rbds -- global_filter=["r|/dev/zd.*|","r|/dev/rbd.*|"] --} -``` -これはpve-managerが追加したみたいなので、消したくないよー。修正されたオプションや綴ミスだけを取り入れてこの設定だけは残したいところ。 -ま、むりなんで元のバーションを残します。こういうときにgitのコンフリクトを込んだ画面みたいにしててくれたら直しやすいのになーって思います。 -ということでなんやかんやあって、PVEの更新完了! -## 更新チェック -``` -root@pve01:~# pveversion -Target Packages (pve-no-subscription/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 -Target Packages (pve-no-subscription/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 -Target Translations (pve-no-subscription/i18n/Translation-en_US) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 -Target Translations (pve-no-subscription/i18n/Translation-en) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 -pve-manager/9.0.11/3bf5476b8a4699e2 (running kernel: 6.8.12-14-pve) -``` -バージョンを確認したらちゃんと上がっとります。 -何故かsshが切れなかったので、念の為にtmuxを張っていたけど切れなくて良かったです。 -# Ref +--- +title: PVE upgrade 8 to 9 +tags: +- debian +- proxmox +- pve +- pve8to9 +private: false +updated_at: 2025-11-07 15:00 +id: null +organization_url_name: null +slide: false +--- +# 想定読者 +- Proxmox VEをCLIからも触ることができ、よく保守している利用者 +- Debian系OSのメジャーバージョンアップグレードをする人 +# 本編 +絶対に参照してください。 +**[公式ドキュメント](https://pve.proxmox.com/wiki/Upgrade_from_8_to_9)** +## `pve8to9`を通す +### 一回目 +チェック用のスクリプトのコマンドが入ってるので実行します。 +``` +pve8to9 +``` +そしたらなんかエラーが出ました。 +どうやらsystemd-bootがあるとコンフィグが上書きされてうまく行かないようです。 +ログはコピーするの忘れてました。 +### 二回目 +systemd-bootを削除後の出力 +``` +root@pve01:~# pve8to9 += CHECKING VERSION INFORMATION FOR PVE PACKAGES = + +Checking for package updates.. +PASS: all packages up-to-date + +Checking proxmox-ve package version.. +PASS: proxmox-ve package has version >= 8.4-0 + +Checking running kernel version.. +PASS: running kernel '6.8.12-14-pve' is considered suitable for upgrade. + += CHECKING CLUSTER HEALTH/SETTINGS = + +SKIP: standalone node. + += CHECKING HYPER-CONVERGED CEPH STATUS = + +SKIP: no hyper-converged ceph setup detected! + += CHECKING CONFIGURED STORAGES = + +PASS: storage 'datahdd' enabled and active. +PASS: storage 'local' enabled and active. +PASS: storage 'local-lvm' enabled and active. +INFO: Checking storage content type configuration.. +PASS: no storage content problems found +PASS: no storage re-uses a directory for multiple content types. +INFO: Check for usage of native GlusterFS storage plugin... +PASS: No GlusterFS storage found. +INFO: Checking whether all external RBD storages have the 'keyring' option configured +SKIP: No RBD storage configured. + += VIRTUAL GUEST CHECKS = + +INFO: Checking for running guests.. +WARN: 4 running guest(s) detected - consider migrating or stopping them. +INFO: Checking if LXCFS is running with FUSE3 library, if already upgraded.. +SKIP: not yet upgraded, no need to check the FUSE library version LXCFS uses +INFO: Checking for VirtIO devices that would change their MTU... +PASS: All guest config descriptions fit in the new limit of 8 KiB +INFO: Checking container configs for deprecated lxc.cgroup entries +PASS: No legacy 'lxc.cgroup' keys found. +INFO: Checking VM configurations for outdated machine versions +PASS: All VM machine versions are recent enough + += MISCELLANEOUS CHECKS = + +INFO: Checking common daemon services.. +PASS: systemd unit 'pveproxy.service' is in state 'active' +PASS: systemd unit 'pvedaemon.service' is in state 'active' +PASS: systemd unit 'pvescheduler.service' is in state 'active' +PASS: systemd unit 'pvestatd.service' is in state 'active' +INFO: Checking for supported & active NTP service.. +PASS: Detected active time synchronisation unit 'chrony.service' +INFO: Checking if the local node's hostname 'pve01' is resolvable.. +INFO: Checking if resolved IP is configured on local node.. +PASS: Resolved node IP '192.168.0.15' configured and active on single interface. +INFO: Check node certificate's RSA key size +PASS: Certificate 'pve-root-ca.pem' passed Debian Busters (and newer) security level for TLS connections (4096 >= 2048) +PASS: Certificate 'pve-ssl.pem' passed Debian Busters (and newer) security level for TLS connections (2048 >= 2048) +INFO: Checking backup retention settings.. +PASS: no backup retention problems found. +INFO: checking CIFS credential location.. +PASS: no CIFS credentials at outdated location found. +INFO: Checking permission system changes.. +INFO: Checking custom role IDs +PASS: no custom roles defined +INFO: Checking node and guest description/note length.. +PASS: All node config descriptions fit in the new limit of 64 KiB +INFO: Checking if the suite for the Debian security repository is correct.. +PASS: found no suite mismatch +INFO: Checking for existence of NVIDIA vGPU Manager.. +PASS: No NVIDIA vGPU Service found. +INFO: Checking bootloader configuration... +PASS: bootloader packages installed correctly +INFO: Check for dkms modules... +SKIP: could not get dkms status +INFO: Check for legacy 'filter' or 'group' sections in /etc/pve/notifications.cfg... +INFO: Check for legacy 'notification-policy' or 'notification-target' options in /etc/pve/jobs.cfg... +PASS: No legacy 'notification-policy' or 'notification-target' options found! +INFO: Check for LVM autoactivation settings on LVM and LVM-thin storages... +NOTICE: storage 'datahdd' has guest volumes with autoactivation enabled +NOTICE: storage 'local-lvm' has guest volumes with autoactivation enabled +NOTICE: Starting with PVE 9, autoactivation will be disabled for new LVM/LVM-thin guest volumes. This system has some volumes that still have autoactivation enabled. All volumes with autoactivations reside on local storage, where this normally does not cause any issues. +You can run the following command to disable autoactivation for existing LVM/LVM-thin guest volumes: + + /usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation + +INFO: Checking lvm config for thin_check_options... +PASS: Check for correct thin_check_options passed +INFO: Check space requirements for RRD migration... +PASS: Enough free disk space for increased RRD metric granularity requirements, which is roughly 24.60 MiB. +INFO: Checking for IPAM DB files that have not yet been migrated. +PASS: No legacy IPAM DB found. +PASS: No legacy MAC DB found. +INFO: Checking if the legacy sysctl file '/etc/sysctl.conf' needs to be migrated to new '/etc/sysctl.d/' path. +PASS: Legacy file '/etc/sysctl.conf' exists but does not contain any settings. +INFO: Checking if matching CPU microcode package is installed. +WARN: The matching CPU microcode package 'intel-microcode' could not be found! Consider installing it to receive the latest security and bug fixes for your CPU. + Ensure you enable the 'non-free-firmware' component in the apt sources and run: + apt install intel-microcode +SKIP: NOTE: Expensive checks, like CT cgroupv2 compat, not performed without '--full' parameter + += SUMMARY = + +TOTAL: 44 +PASSED: 33 +SKIPPED: 6 +WARNINGS: 2 +FAILURES: 0 + +ATTENTION: Please check the output for detailed information! +``` +### 三回目 +ゲストを落としてもう一回 +``` +root@pve01:~# pve8to9 --full += CHECKING VERSION INFORMATION FOR PVE PACKAGES = + +Checking for package updates.. +PASS: all packages up-to-date + +Checking proxmox-ve package version.. +PASS: proxmox-ve package has version >= 8.4-0 + +Checking running kernel version.. +PASS: running kernel '6.8.12-14-pve' is considered suitable for upgrade. + += CHECKING CLUSTER HEALTH/SETTINGS = + +SKIP: standalone node. + += CHECKING HYPER-CONVERGED CEPH STATUS = + +SKIP: no hyper-converged ceph setup detected! + += CHECKING CONFIGURED STORAGES = + +PASS: storage 'datahdd' enabled and active. +PASS: storage 'local' enabled and active. +PASS: storage 'local-lvm' enabled and active. +INFO: Checking storage content type configuration.. +PASS: no storage content problems found +PASS: no storage re-uses a directory for multiple content types. +INFO: Check for usage of native GlusterFS storage plugin... +PASS: No GlusterFS storage found. +INFO: Checking whether all external RBD storages have the 'keyring' option configured +SKIP: No RBD storage configured. + += VIRTUAL GUEST CHECKS = + +INFO: Checking for running guests.. +PASS: no running guest detected. +INFO: Checking if LXCFS is running with FUSE3 library, if already upgraded.. +SKIP: not yet upgraded, no need to check the FUSE library version LXCFS uses +INFO: Checking for VirtIO devices that would change their MTU... +PASS: All guest config descriptions fit in the new limit of 8 KiB +INFO: Checking container configs for deprecated lxc.cgroup entries +PASS: No legacy 'lxc.cgroup' keys found. +INFO: Checking VM configurations for outdated machine versions +PASS: All VM machine versions are recent enough + += MISCELLANEOUS CHECKS = + +INFO: Checking common daemon services.. +PASS: systemd unit 'pveproxy.service' is in state 'active' +PASS: systemd unit 'pvedaemon.service' is in state 'active' +PASS: systemd unit 'pvescheduler.service' is in state 'active' +PASS: systemd unit 'pvestatd.service' is in state 'active' +INFO: Checking for supported & active NTP service.. +PASS: Detected active time synchronisation unit 'chrony.service' +INFO: Checking if the local node's hostname 'pve01' is resolvable.. +INFO: Checking if resolved IP is configured on local node.. +PASS: Resolved node IP '192.168.0.15' configured and active on single interface. +INFO: Check node certificate's RSA key size +PASS: Certificate 'pve-root-ca.pem' passed Debian Busters (and newer) security level for TLS connections (4096 >= 2048) +PASS: Certificate 'pve-ssl.pem' passed Debian Busters (and newer) security level for TLS connections (2048 >= 2048) +INFO: Checking backup retention settings.. +PASS: no backup retention problems found. +INFO: checking CIFS credential location.. +PASS: no CIFS credentials at outdated location found. +INFO: Checking permission system changes.. +INFO: Checking custom role IDs +PASS: no custom roles defined +INFO: Checking node and guest description/note length.. +PASS: All node config descriptions fit in the new limit of 64 KiB +INFO: Checking if the suite for the Debian security repository is correct.. +PASS: found no suite mismatch +INFO: Checking for existence of NVIDIA vGPU Manager.. +PASS: No NVIDIA vGPU Service found. +INFO: Checking bootloader configuration... +PASS: bootloader packages installed correctly +INFO: Check for dkms modules... +SKIP: could not get dkms status +INFO: Check for legacy 'filter' or 'group' sections in /etc/pve/notifications.cfg... +INFO: Check for legacy 'notification-policy' or 'notification-target' options in /etc/pve/jobs.cfg... +PASS: No legacy 'notification-policy' or 'notification-target' options found! +INFO: Check for LVM autoactivation settings on LVM and LVM-thin storages... +NOTICE: storage 'datahdd' has guest volumes with autoactivation enabled +NOTICE: storage 'local-lvm' has guest volumes with autoactivation enabled +NOTICE: Starting with PVE 9, autoactivation will be disabled for new LVM/LVM-thin guest volumes. This system has some volumes that still have autoactivation enabled. All volumes with autoactivations reside on local storage, where this normally does not cause any issues. +You can run the following command to disable autoactivation for existing LVM/LVM-thin guest volumes: + + /usr/share/pve-manager/migrations/pve-lvm-disable-autoactivation + +INFO: Checking lvm config for thin_check_options... +PASS: Check for correct thin_check_options passed +INFO: Check space requirements for RRD migration... +PASS: Enough free disk space for increased RRD metric granularity requirements, which is roughly 24.60 MiB. +INFO: Checking for IPAM DB files that have not yet been migrated. +PASS: No legacy IPAM DB found. +PASS: No legacy MAC DB found. +INFO: Checking if the legacy sysctl file '/etc/sysctl.conf' needs to be migrated to new '/etc/sysctl.d/' path. +PASS: Legacy file '/etc/sysctl.conf' exists but does not contain any settings. +INFO: Checking if matching CPU microcode package is installed. +WARN: The matching CPU microcode package 'intel-microcode' could not be found! Consider installing it to receive the latest security and bug fixes for your CPU. + Ensure you enable the 'non-free-firmware' component in the apt sources and run: + apt install intel-microcode + += SUMMARY = + +TOTAL: 43 +PASSED: 34 +SKIPPED: 5 +WARNINGS: 1 +FAILURES: 0 + +ATTENTION: Please check the output for detailed information! +``` +non-free-firmwareは金を払ってないので勘弁してください。次に進みます。 +## リポジトリの更新 +自分はお金を払っていないので、払っていない人向けって書いてあるスクリプトをコピペして実行するだけでいいです。 +``` +apt update +``` +``` +apt dist-upgrade +``` +``` +pveversion +``` +``` +sed -i 's/bookworm/trixie/g' /etc/apt/sources.list +``` +``` +sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/pve-enterprise.list +``` +``` +cat > /etc/apt/sources.list.d/proxmox.sources << EOF +Types: deb +URIs: http://download.proxmox.com/debian/pve +Suites: trixie +Components: pve-no-subscription +Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg +EOF +``` +ワイはcephを使ってないのでceph系はそもそもファイルがないですね。 +私の環境だと行間に空白行があってaptから認識されない形式になっちゃったので、viで適宜修正しながら`apt update`がちゃんと実行されるのを待つだけです。 +ちゃんとリポジトリを取ってこれてそうだったら次です。 +## `dist-upgrade` +Ubuntuの`do-release-update`みたい! +なんか途中でニュースが表示されたが、知らん。へーそうなんだ~って読んで(Shift+G)、qキーで閉じてたら実行が再び進む。 +途中でなんか出てきたので、見てみる。 +### `/etc/issue` Update +`/etc/issue`の変更みたいですね。変更をDで確認すると、元のProxmoxのヤツのほうがいいからNとします。 +``` +Configuration file '/etc/issue' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** issue (Y/I/N/O/D/Z) [default=N] ? D --- /etc/issue 2025-11-07 12:56:29.654409431 +0900 ++++ /etc/issue.dpkg-new 2025-08-25 01:20:00.000000000 +0900 +@@ -1,10 +1,2 @@ +- +------------------------------------------------------------------------------- +- +-Welcome to the Proxmox Virtual Environment. Please use your web browser to +-configure this server - connect to: +- +- https://192.168.0.15:8006/ +- +------------------------------------------------------------------------------- ++Debian GNU/Linux 13 \n \l + + +Configuration file '/etc/issue' + ==> Modified (by you or by a script) since installation. + ==> Package distributor has shipped an updated version. + What would you like to do about it ? Your options are: + Y or I : install the package maintainer's version + N or O : keep your currently-installed version + D : show the differences between the versions + Z : start a shell to examine the situation + The default action is to keep your current version. +*** issue (Y/I/N/O/D/Z) [default=N] ? N +Installing new version of config file /etc/issue.net ... +``` +### `/etc/lvm/lvm.conf` Update +続きましては`/etc/lvm/lvm.conf`らしいです。 +``` +Configuration file '/etc/lvm/lvm.conf' + ==> Modified (by you or by a script) since installation. + ==> Package distributor has shipped an updated version. + What would you like to do about it ? Your options are: + Y or I : install the package maintainer's version + N or O : keep your currently-installed version + D : show the differences between the versions + Z : start a shell to examine the situation + The default action is to keep your current version. +*** lvm.conf (Y/I/N/O/D/Z) [default=N] ? D +--- /etc/lvm/lvm.conf 2025-04-26 20:47:17.070430178 +0900 ++++ /etc/lvm/lvm.conf.dpkg-new 2025-08-11 17:46:22.000000000 +0900 +``` +こっちはめちゃ長い! +コメントの綴ミスがほとんどだけど、最後にコメントアウトされてない設定が消されてました。 +``` +-devices { +- # added by pve-manager to avoid scanning ZFS zvols and Ceph rbds +- global_filter=["r|/dev/zd.*|","r|/dev/rbd.*|"] +-} +``` +これはpve-managerが追加したみたいなので、消したくないよー。修正されたオプションや綴ミスだけを取り入れてこの設定だけは残したいところ。 +ま、むりなんで元のバーションを残します。こういうときにgitのコンフリクトを込んだ画面みたいにしててくれたら直しやすいのになーって思います。 +ということでなんやかんやあって、PVEの更新完了! +## 更新チェック +``` +root@pve01:~# pveversion +Target Packages (pve-no-subscription/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 +Target Packages (pve-no-subscription/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 +Target Translations (pve-no-subscription/i18n/Translation-en_US) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 +Target Translations (pve-no-subscription/i18n/Translation-en) is configured multiple times in /etc/apt/sources.list:8 and /etc/apt/sources.list.d/proxmox.sources:1 +pve-manager/9.0.11/3bf5476b8a4699e2 (running kernel: 6.8.12-14-pve) +``` +バージョンを確認したらちゃんと上がっとります。 +何故かsshが切れなかったので、念の為にtmuxを張っていたけど切れなくて良かったです。 +# Ref [公式ドキュメント(In-place_upgradeの章)](https://pve.proxmox.com/wiki/Upgrade_from_8_to_9#In-place_upgrade) \ No newline at end of file diff --git a/public/redox_os_on_pve_vm.md b/public/redox_os_on_pve_vm.md @@ -1,95 +1,95 @@ ---- -title: "Redox OS on PVE VM" -emoji: "🌀" -type: "tech" -topics: - - "qemu" - - "pve" - - "redox" -published: true -published_at: "2026-02-20 22:24" ---- - -# 対象読者 -PVEについてQEMUやddコマンドを扱う技量のある方 - -# Redox OS とは -> Redox OSTM is a complete Unix-like microkernel-based operating system written in Rust, with a focus on security, reliability and safety. Offering source compatibility and a full set of programs, Redox is intended to be a complete alternative to Linux and BSD, in the cloud and on the desktop. - -意訳:Redox OS(以下Redox)はUnixに似たマイクロカーネルなRustで書かれたOSです.セキュリティ・信頼性・安全性を重視しています.ソースコード互換性と充実したプログラムセットを備えたRedoxは,クラウドでもデスクトップでも,LinuxやBSDの完全な代替となることを目指しています. - -ということで,Rust製のOSということです. -Rustの向いている用途として,巨大で速度と安全性の両立が挙げられると思っているので,これは適任じゃないかなと目を向けています. -(RustでKernelを自作しようかなと検索をしていたら見つけました) - -# PVEでの難しいところ(TL;DR) - -Redoxは仮想環境上と実機での動作が確認されているようです. -[公式ドキュメント-VM上での実行](https://doc.redox-os.org/book/running-vm.html)に仮想環境,VirtualBoxとQEMUでの実行の仕方がコマンド付きで載っています. -しかし,PVEとは少々異なるところがあって苦労したので,そこについて述べていきます. - -## コマンドが`qm`じゃない - -QEMUのコマンドには2つあって,`qm`コマンドとそれぞれのアーキテクチャのついた`qemu-system-x86_64`コマンドなどがあります.公式ドキュメントは`qemu-system-x86_64`コマンドにオプションを指定してVMを実行すると書いています.これをしたところ,PVEから走ったVMが認識されなくて,コンソールに入れなかったです. - -## ディスクを認識しない - -これ,私,10時間程度格闘して,最終的に,改善しなかった問題です. -`qm`コマンドから実行することを諦めて,私はPVEのGUIからVMを作って,Redoxのlivecdをマウントし,ようやっとPVEから確認できるRedoxのVMをつくりました. -ここから,ハードディスク上にRedoxをインストールできたら良いなって思いました. -[公式ドキュメント-ドライブにRedoxをインストール](https://doc.redox-os.org/book/installing.html) -このドキュメントにある`redox_installer_gui`というものを使ってみました. -ちなみにこの時点でRedox OSの側がlivecdとは別にVMに接続したHDDを認識していませんでした. -この状態でも`redox_installer_gui`はこのHDDを認識して,色々と書き込んで,bootableなディスクを作ってくれました. -(ちなみに`redox_installer_tui`コマンドはRedoxOSがHDDを認識していないせいなのか`no device found`と言ってこの時点でだめでした) - -しかーし,bootableなはずのHDDの起動順位をPVE側で1番目にしても,ルートファイルシステムが存在しません.って言って,止まっちゃったんです. - -ええ,もちろん設定を色々と変えました.HDDをSATAにしてみたり,SCSIにしてみたり,でも,この状態を変えることは無かったです. - -マシーン設定を`i449fx`から`q35`にしたらlivecdの読み込みは早くなりましたが,オーディオデバイスのエラーでブートがストップしましたね.それ以外は,上に書いた状態から変化することはなかったです. - -# どうやったら動いたか - -結論,pveのシェルでpveのシステムにVMのドライブをマウントして,`dd`でRedox OSのイメージを流し込みました.イメージというのは,[公式ドキュメント-実機で動かす-BootableなUSBを作成](https://doc.redox-os.org/book/real-hardware.html#creating-a-bootable-usb-drive)に示されたリンクの中の,`harddrive.img.zst`とついたやつです.これは実際に動作しているディスクの中身まるままです.これをHDDの中に流し込むことで,動きます(当然) - -## これにたどり着いた経緯 - -どうしてもVMに繋げたHDDをRedox OSから認識しない割に`redox_installer_gui`が成功したというログを出すので,これが非常に怪しいなと気になって,書き込んだHDDの中身を見てやろうと思ったのがきっかけです.しかし,Redox OSから認識していないので,`redoxfs`でマウントしてlsしまくるみたいなことはできません. -なので,pveのシステムのコマンドを使ってVMに繋げた仮想HDDの中身を覗いてやろうと思ったのです. -```bash -# fdisk -l /dev/pve/vm-104-disk-0 -Disk /dev/pve/vm-104-disk-0: 32 GiB, 34359738368 bytes, 67108864 sectors -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 65536 bytes / 65536 bytes -Disklabel type: gpt -Disk identifier: EF3ABDF1-F2AB-419E-BD11-102BE79A0040 -Device Start End Sectors Size Type -/dev/pve/vm-104-disk-0p1 34 2047 2014 1007K BIOS boot -/dev/pve/vm-104-disk-0p2 2048 4095 2048 1M EFI System -/dev/pve/vm-104-disk-0p3 4096 67106815 67102720 32G Linux filesystem - -Partition 1 does not start on physical sector boundary. -``` -という応答が返ってきました.ちなみにredoxを入れているVMのidは104です. -どうやら本当に書き込みは成功しているみたいです. -~~もうめんどくさいからGentooみたいに手動でやらせてくれ~~ -`hexdump`の結果も -```bash -00000000 52 65 64 6f 78 46 53 00 06 00 00 00 00 00 00 00 |RedoxFS.........| -``` -みたいな感じでした.SeaBIOSなのでEFIシステムいらない気が…… -でも一個気になる結果が -``` -# strings /tmp/mbr.bin -}fAf -?wlf -wcf= -Stage -ERROR -``` -ということで,どうやらRedox OSのブートローダーが上手く入ってくれなかったみたいです. -(GRUBも使えるようにしといてほしい.設定次第では使えるのかな?) - +--- +title: Redox OS on PVE VM +tags: +- qemu +- pve +- redox +private: false +updated_at: 2026-02-20 22:24 +id: null +organization_url_name: null +slide: false +--- +# 対象読者 +PVEについてQEMUやddコマンドを扱う技量のある方 + +# Redox OS とは +> Redox OSTM is a complete Unix-like microkernel-based operating system written in Rust, with a focus on security, reliability and safety. Offering source compatibility and a full set of programs, Redox is intended to be a complete alternative to Linux and BSD, in the cloud and on the desktop. + +意訳:Redox OS(以下Redox)はUnixに似たマイクロカーネルなRustで書かれたOSです.セキュリティ・信頼性・安全性を重視しています.ソースコード互換性と充実したプログラムセットを備えたRedoxは,クラウドでもデスクトップでも,LinuxやBSDの完全な代替となることを目指しています. + +ということで,Rust製のOSということです. +Rustの向いている用途として,巨大で速度と安全性の両立が挙げられると思っているので,これは適任じゃないかなと目を向けています. +(RustでKernelを自作しようかなと検索をしていたら見つけました) + +# PVEでの難しいところ(TL;DR) + +Redoxは仮想環境上と実機での動作が確認されているようです. +[公式ドキュメント-VM上での実行](https://doc.redox-os.org/book/running-vm.html)に仮想環境,VirtualBoxとQEMUでの実行の仕方がコマンド付きで載っています. +しかし,PVEとは少々異なるところがあって苦労したので,そこについて述べていきます. + +## コマンドが`qm`じゃない + +QEMUのコマンドには2つあって,`qm`コマンドとそれぞれのアーキテクチャのついた`qemu-system-x86_64`コマンドなどがあります.公式ドキュメントは`qemu-system-x86_64`コマンドにオプションを指定してVMを実行すると書いています.これをしたところ,PVEから走ったVMが認識されなくて,コンソールに入れなかったです. + +## ディスクを認識しない + +これ,私,10時間程度格闘して,最終的に,改善しなかった問題です. +`qm`コマンドから実行することを諦めて,私はPVEのGUIからVMを作って,Redoxのlivecdをマウントし,ようやっとPVEから確認できるRedoxのVMをつくりました. +ここから,ハードディスク上にRedoxをインストールできたら良いなって思いました. +[公式ドキュメント-ドライブにRedoxをインストール](https://doc.redox-os.org/book/installing.html) +このドキュメントにある`redox_installer_gui`というものを使ってみました. +ちなみにこの時点でRedox OSの側がlivecdとは別にVMに接続したHDDを認識していませんでした. +この状態でも`redox_installer_gui`はこのHDDを認識して,色々と書き込んで,bootableなディスクを作ってくれました. +(ちなみに`redox_installer_tui`コマンドはRedoxOSがHDDを認識していないせいなのか`no device found`と言ってこの時点でだめでした) + +しかーし,bootableなはずのHDDの起動順位をPVE側で1番目にしても,ルートファイルシステムが存在しません.って言って,止まっちゃったんです. + +ええ,もちろん設定を色々と変えました.HDDをSATAにしてみたり,SCSIにしてみたり,でも,この状態を変えることは無かったです. + +マシーン設定を`i449fx`から`q35`にしたらlivecdの読み込みは早くなりましたが,オーディオデバイスのエラーでブートがストップしましたね.それ以外は,上に書いた状態から変化することはなかったです. + +# どうやったら動いたか + +結論,pveのシェルでpveのシステムにVMのドライブをマウントして,`dd`でRedox OSのイメージを流し込みました.イメージというのは,[公式ドキュメント-実機で動かす-BootableなUSBを作成](https://doc.redox-os.org/book/real-hardware.html#creating-a-bootable-usb-drive)に示されたリンクの中の,`harddrive.img.zst`とついたやつです.これは実際に動作しているディスクの中身まるままです.これをHDDの中に流し込むことで,動きます(当然) + +## これにたどり着いた経緯 + +どうしてもVMに繋げたHDDをRedox OSから認識しない割に`redox_installer_gui`が成功したというログを出すので,これが非常に怪しいなと気になって,書き込んだHDDの中身を見てやろうと思ったのがきっかけです.しかし,Redox OSから認識していないので,`redoxfs`でマウントしてlsしまくるみたいなことはできません. +なので,pveのシステムのコマンドを使ってVMに繋げた仮想HDDの中身を覗いてやろうと思ったのです. +```bash +# fdisk -l /dev/pve/vm-104-disk-0 +Disk /dev/pve/vm-104-disk-0: 32 GiB, 34359738368 bytes, 67108864 sectors +Units: sectors of 1 * 512 = 512 bytes +Sector size (logical/physical): 512 bytes / 512 bytes +I/O size (minimum/optimal): 65536 bytes / 65536 bytes +Disklabel type: gpt +Disk identifier: EF3ABDF1-F2AB-419E-BD11-102BE79A0040 +Device Start End Sectors Size Type +/dev/pve/vm-104-disk-0p1 34 2047 2014 1007K BIOS boot +/dev/pve/vm-104-disk-0p2 2048 4095 2048 1M EFI System +/dev/pve/vm-104-disk-0p3 4096 67106815 67102720 32G Linux filesystem + +Partition 1 does not start on physical sector boundary. +``` +という応答が返ってきました.ちなみにredoxを入れているVMのidは104です. +どうやら本当に書き込みは成功しているみたいです. +~~もうめんどくさいからGentooみたいに手動でやらせてくれ~~ +`hexdump`の結果も +```bash +00000000 52 65 64 6f 78 46 53 00 06 00 00 00 00 00 00 00 |RedoxFS.........| +``` +みたいな感じでした.SeaBIOSなのでEFIシステムいらない気が…… +でも一個気になる結果が +``` +# strings /tmp/mbr.bin +}fAf +?wlf +wcf= +Stage +ERROR +``` +ということで,どうやらRedox OSのブートローダーが上手く入ってくれなかったみたいです. +(GRUBも使えるようにしといてほしい.設定次第では使えるのかな?) + みたいなことがあって,じゃあもう折角マウントしてるしddで流し込むかって事になりました. \ No newline at end of file diff --git a/public/rename-zenn.py b/public/rename-zenn.py @@ -1,4 +1,3 @@ - import os import re import glob @@ -14,7 +13,7 @@ def to_snake_case(text): text = re.sub(r'\s+', '_', text.strip()) return text -def rename_zenn_articles(): +def convert_zenn_to_qiita(): translator = GoogleTranslator(source='ja', target='en') for filepath in glob.glob("*.md"): @@ -22,37 +21,53 @@ def rename_zenn_articles(): with open(filepath, 'r', encoding='utf-8') as f: content = f.read() - # フロントマターの抽出 match = re.match(r'^---\s*\n(.*?)\n---\s*\n', content, re.DOTALL) if not match: continue - front_matter = yaml.safe_load(match.group(1)) - title = front_matter.get('title') + zenn_matter = yaml.safe_load(match.group(1)) + body = content[match.end():] + title = zenn_matter.get('title', '') if not title: continue - # 翻訳処理 if has_japanese(title): english_title = translator.translate(title) else: english_title = title if not english_title: - print(f"Failed to translate: {title}") + print(f"Failed to translate title for: {filepath}") continue - # スネークケース変換とリネーム safe_name = to_snake_case(english_title) new_filename = f"{safe_name}.md" + qiita_matter = { + 'title': title, + 'tags': zenn_matter.get('topics', []), + 'private': False, + 'updated_at': zenn_matter.get('published_at', ''), + 'id': None, + 'organization_url_name': None, + 'slide': False + } + + new_front_matter_text = yaml.dump(qiita_matter, allow_unicode=True, sort_keys=False) + new_content = f"---\n{new_front_matter_text}---\n{body}" + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(new_content) + if filepath != new_filename: os.rename(filepath, new_filename) - print(f"Renamed: {filepath} -> {new_filename}") + print(f"Processed & Renamed: {filepath} -> {new_filename}") + else: + print(f"Processed: {filepath}") except Exception as e: print(f"Error processing {filepath}: {e}") if __name__ == "__main__": - rename_zenn_articles() + convert_zenn_to_qiita() diff --git a/public/ssh_from_internet_via_cloudflare_zero_trust.md b/public/ssh_from_internet_via_cloudflare_zero_trust.md @@ -1,39 +1,39 @@ ---- -title: "SSH from Internet via Cloudflare Zero Trust" -emoji: "⛩️" -type: "tech" -topics: - - "cloudflare" - - "zerotrust" - - "openssh" -published: true -published_at: "2025-07-29 19:09" ---- - -# TL;DR -https://zenn.dev/jij_inc/articles/659fe35813b940 -この記事の方がわかりやすいです。 -当記事は、上記の記事を既に理解しているが、手順や細かいパスなどを忘れてしまった人が、確認をするための記事です。 - -# 新規クライアント追加手順 -1. Install cloudflared -1.5. Check Where cloudflare binary file -2. edit `$HOME/.ssh/config` -``` -Host ssh-server - HostName <subdomain.domain.tld> - ProxyCommand <path to cloudflared binary> access ssh --hostname %h -``` - -# Cloudflare Zero Trustの設定 -1. Add public host name(may be it through cloudflare tunnel) with subdomain you like. -2. Create Access Application and set policy you like. - -__NOT SETTING AS A BROUWSER RENDERING!!!!__ - -# Attention of this article -この記事の項目の順番は、自分が確認する頻度順であります。 -実行手順としては、 -1. Cloudflare Zero Trustの設定 -2. 新規クライアント追加手順 +--- +title: SSH from Internet via Cloudflare Zero Trust +tags: +- cloudflare +- zerotrust +- openssh +private: false +updated_at: 2025-07-29 19:09 +id: null +organization_url_name: null +slide: false +--- +# TL;DR +https://zenn.dev/jij_inc/articles/659fe35813b940 +この記事の方がわかりやすいです。 +当記事は、上記の記事を既に理解しているが、手順や細かいパスなどを忘れてしまった人が、確認をするための記事です。 + +# 新規クライアント追加手順 +1. Install cloudflared +1.5. Check Where cloudflare binary file +2. edit `$HOME/.ssh/config` +``` +Host ssh-server + HostName <subdomain.domain.tld> + ProxyCommand <path to cloudflared binary> access ssh --hostname %h +``` + +# Cloudflare Zero Trustの設定 +1. Add public host name(may be it through cloudflare tunnel) with subdomain you like. +2. Create Access Application and set policy you like. + +__NOT SETTING AS A BROUWSER RENDERING!!!!__ + +# Attention of this article +この記事の項目の順番は、自分が確認する頻度順であります。 +実行手順としては、 +1. Cloudflare Zero Trustの設定 +2. 新規クライアント追加手順 の順で実行することをおすすめします。 \ No newline at end of file diff --git a/public/stuck_of_zed_remote.md b/public/stuck_of_zed_remote.md @@ -1,48 +1,48 @@ ---- -title: "Stuck of Zed Remote" -emoji: "🙆" -type: "tech" -topics: - - "remote" - - "zed" -published: true -published_at: "2026-02-28 10:47" ---- - -# 想定読者 -ZedのRemote機能の利用者 - -# 経緯(TL;DR) -インストーラのTUIで実機に`debian`をインストールし,その環境のコードを弄りたかったのでWindowsのZedからリモートとして接続しようとしました. -debianのインストール時,幾つかのライブラリを選択的に入れられるのですが,私はssh connectionのみを入れて,それ以外のdesktop env等は省きました. -`curl`も`net-tools`も入っていないまっさらなdebian環境にzedからリモートでつなごうとすると,バイナリのダウンロードが失敗しました.`curl`が必要みたいです.私は`wget`を使って色々とダウンロードしてたので気づきませんでした.それからbunのインストール用にと`unzip`もついでに入れて接続すると,サーバーのセットアップができたと言ったので早速,フォルダを追加しようとadd folderボタンを押してssh keyのパスワードを入れて…… -ずっと`connecting`で止まってるんです.謎でした. -`ldd`コマンドで必要なライブラリが抜けてるのかなとか調べましたが`statically linked`って言われます.[公式のドキュメント](https://zed.dev/docs/remote-development)を見ても64bitのLinuxで動くよとしか書いてなくて困った. -以前,LXCのAlpine Linuxで似たような症状が出たときはnetbaseを入れたら治ったのですが,既に入ってました. -logを漁ってみたんですけど,セットアップが成功しただけだったんですよね -```log -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":463,"message":"(remote server) starting up with PID 12272:\npid_file: \"/home/ user/.local/share/zed/server_state/setup-1/server.pid\", log_file: \"/home/ user/.local/share/zed/logs/server-setup-1.log\", stdin_socket: \"/home/ user/.local/share/zed/server_state/setup-1/stdin.sock\", stdout_socket: \"/home/ user/.local/share/zed/server_state/setup-1/stdout.sock\", stderr_socket: \"/home/ user/.local/share/zed/server_state/setup-1/stderr.sock\""} -{"level":3,"module_path":"crashes","file":"/home/runner/work/zed/zed/crates/crashes/src/crashes.rs","line":87,"message":"(remote server) spawning crash handler process"} -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":520,"message":"(remote server) gpui app started, initializing server"} -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":323,"message":"(remote server) accepting new connections"} -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":330,"message":"(remote server) accepted new connections"} -{"level":3,"module_path":"util","file":"/home/runner/work/zed/zed/crates/util/src/util.rs","line":389,"message":"(remote server) set environment variables from shell:/bin/bash, path:/home/ user/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"} -{"level":3,"module_path":"crashes","file":"/home/runner/work/zed/zed/crates/crashes/src/crashes.rs","line":95,"message":"(remote server) connected to crash handler process after 100ms"} -{"level":3,"module_path":"crashes","file":"/home/runner/work/zed/zed/crates/crashes/src/crashes.rs","line":139,"message":"(remote server) crash handler registered"} -{"level":2,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":374,"message":"(remote server) error reading message on stdin, dropping connection."} -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":323,"message":"(remote server) accepting new connections"} -{"level":2,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":334,"message":"(remote server) timed out waiting for new connections after 600s. exiting."} -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":309,"message":"(remote server) app quitting. sending signal to server main loop"} -{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":594,"message":"(remote server) gpui app is shut down. quitting."} -``` -ということで,他にこのフォルダーの中になんかないかなと思って`tree`コマンドを打って,システムに存在しなかったから`sudo apt install tree`をして,なんでだろうなーって思って実行したら,動いたんですよ.つまりRemoteされる先にtreeコマンドが存在してないと動かないってことです.正直,lddで見れない分,もっとたちが悪いです. -みなさんも気をつけてください. -# 教訓 -ZedのRemoteされる側に,少なくとも -``` -ssh netbase curl tree -``` -コマンドが使える状態じゃないと駄目ってことです. -きっと`std::process::Command`で叩いてるんだろうなーって. -それはそうと,requirementとしてドキュメントに書くべきだと思うんですよ.(個人の感想です) +--- +title: Stuck of Zed Remote +tags: +- remote +- zed +private: false +updated_at: 2026-02-28 10:47 +id: null +organization_url_name: null +slide: false +--- +# 想定読者 +ZedのRemote機能の利用者 + +# 経緯(TL;DR) +インストーラのTUIで実機に`debian`をインストールし,その環境のコードを弄りたかったのでWindowsのZedからリモートとして接続しようとしました. +debianのインストール時,幾つかのライブラリを選択的に入れられるのですが,私はssh connectionのみを入れて,それ以外のdesktop env等は省きました. +`curl`も`net-tools`も入っていないまっさらなdebian環境にzedからリモートでつなごうとすると,バイナリのダウンロードが失敗しました.`curl`が必要みたいです.私は`wget`を使って色々とダウンロードしてたので気づきませんでした.それからbunのインストール用にと`unzip`もついでに入れて接続すると,サーバーのセットアップができたと言ったので早速,フォルダを追加しようとadd folderボタンを押してssh keyのパスワードを入れて…… +ずっと`connecting`で止まってるんです.謎でした. +`ldd`コマンドで必要なライブラリが抜けてるのかなとか調べましたが`statically linked`って言われます.[公式のドキュメント](https://zed.dev/docs/remote-development)を見ても64bitのLinuxで動くよとしか書いてなくて困った. +以前,LXCのAlpine Linuxで似たような症状が出たときはnetbaseを入れたら治ったのですが,既に入ってました. +logを漁ってみたんですけど,セットアップが成功しただけだったんですよね +```log +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":463,"message":"(remote server) starting up with PID 12272:\npid_file: \"/home/ user/.local/share/zed/server_state/setup-1/server.pid\", log_file: \"/home/ user/.local/share/zed/logs/server-setup-1.log\", stdin_socket: \"/home/ user/.local/share/zed/server_state/setup-1/stdin.sock\", stdout_socket: \"/home/ user/.local/share/zed/server_state/setup-1/stdout.sock\", stderr_socket: \"/home/ user/.local/share/zed/server_state/setup-1/stderr.sock\""} +{"level":3,"module_path":"crashes","file":"/home/runner/work/zed/zed/crates/crashes/src/crashes.rs","line":87,"message":"(remote server) spawning crash handler process"} +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":520,"message":"(remote server) gpui app started, initializing server"} +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":323,"message":"(remote server) accepting new connections"} +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":330,"message":"(remote server) accepted new connections"} +{"level":3,"module_path":"util","file":"/home/runner/work/zed/zed/crates/util/src/util.rs","line":389,"message":"(remote server) set environment variables from shell:/bin/bash, path:/home/ user/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"} +{"level":3,"module_path":"crashes","file":"/home/runner/work/zed/zed/crates/crashes/src/crashes.rs","line":95,"message":"(remote server) connected to crash handler process after 100ms"} +{"level":3,"module_path":"crashes","file":"/home/runner/work/zed/zed/crates/crashes/src/crashes.rs","line":139,"message":"(remote server) crash handler registered"} +{"level":2,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":374,"message":"(remote server) error reading message on stdin, dropping connection."} +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":323,"message":"(remote server) accepting new connections"} +{"level":2,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":334,"message":"(remote server) timed out waiting for new connections after 600s. exiting."} +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":309,"message":"(remote server) app quitting. sending signal to server main loop"} +{"level":3,"module_path":"remote_server","file":"crates/remote_server/src/server.rs","line":594,"message":"(remote server) gpui app is shut down. quitting."} +``` +ということで,他にこのフォルダーの中になんかないかなと思って`tree`コマンドを打って,システムに存在しなかったから`sudo apt install tree`をして,なんでだろうなーって思って実行したら,動いたんですよ.つまりRemoteされる先にtreeコマンドが存在してないと動かないってことです.正直,lddで見れない分,もっとたちが悪いです. +みなさんも気をつけてください. +# 教訓 +ZedのRemoteされる側に,少なくとも +``` +ssh netbase curl tree +``` +コマンドが使える状態じゃないと駄目ってことです. +きっと`std::process::Command`で叩いてるんだろうなーって. +それはそうと,requirementとしてドキュメントに書くべきだと思うんですよ.(個人の感想です) これで何回目だって気分になってきたので,issueを書こうと思います.(気力があれば) \ No newline at end of file diff --git a/public/synapsematrix_on_docker_compose.md b/public/synapsematrix_on_docker_compose.md @@ -1,214 +1,214 @@ ---- -title: "Synapse(Matrix) on Docker Compose" -emoji: "💬" -type: "tech" -topics: - - "docker" - - "matrix" - - "selfhosted" - - "synapse" -published: true -published_at: "2025-11-10 21:49" ---- - -# 想定読者 -- Synapseのバックエンドをセルフホステッドする人 -- まともにCLI onlyのサーバを運用する人 -# Ref -- [公式のDockerComposeについてのドキュメント](https://github.com/element-hq/synapse/tree/develop/contrib/docker) -- [EclipseのSynapseリポジトリ](https://gitlab.eclipse.org/eclipsefdn/it/releng/chat-service/chat-service-provisioner) - -## edit docker-compose.yaml - -docker-compose.yamlを完全に設定します。 -生成コマンドによって出力されたファイル数にはシークレット鍵等々の情報が記載されるので、あとからdocker-compose.yamlを変更することは非常に推奨されません。 -サンプル - -```YAML -# This compose file is compatible with Compose itself, it might need some -# adjustments to run properly with stack. - -services: - - synapse: - build: - context: ../.. - dockerfile: docker/Dockerfile - image: docker.io/matrixdotorg/synapse:latest - # Since synapse does not retry to connect to the database, restart upon - # failure - restart: unless-stopped - # See the readme for a full documentation of the environment settings - # NOTE: You must edit homeserver.yaml to use postgres, it defaults to sqlite - environment: - - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml - volumes: - # You may either store all the files in a local folder - - ./files:/data - # .. or you may split this between different storage points - # - ./files:/data - # - /path/to/ssd:/data/uploads - # - /path/to/large_hdd:/data/media - depends_on: - - db - # In order to expose Synapse, remove one of the following, you might for - # instance expose the TLS port directly: - ports: - - 8448:8448/tcp - - 8008:8008/tcp - - db: - image: docker.io/postgres:15-alpine - # Change that password, of course! - environment: - - POSTGRES_USER=synapse_user - - POSTGRES_PASSWORD=changeme - # ensure the database gets created correctly - # https://element-hq.github.io/synapse/latest/postgres.html#set-up-database - - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C - volumes: - # You may store the database tables in a local folder.. - - ./schemas:/var/lib/postgresql/data - # .. or store them on some high performance storage for better results - # - /path/to/ssd/storage:/var/lib/postgresql/data -``` - -## generate homeserver files - -次にこのdocker-composeファイルを使って必要なファイル群を生成します。 -サーバー名のところは適宜書き換えてください。 - -``` -docker compose run --rm -e SYNAPSE_SERVER_NAME=my.matrix.host -e SYNAPSE_REPORT_STATS=yes synapse generate -``` - -## edit homeserver.yaml - -生成された`file`フォルダの中にあるhomeserver.yamlに必要な設定を書き込んでいきます。 -少なくとも必要な設定は以下です。 - -```diff -- listeners: -- - port: 8008 -- tls: false -- type: http -- x_forwarded: true -- resources: -- - names: [client,federation] -- compress: false - -+ listeners: -+ - port: 8008 -+ tls: false -+ type: http -+ x_forwarded: true -+ resources: -+ - names: [client] -+ compress: false -+ -+ - port: 8448 -+ tls: false -+ type: http -+ x_forwarded: true -+ resources: -+ - names: [federation] -+ compress: false - ------------------------------------ - -- database: -- name: sqlite3 -- - -+ database: -+ name: psycopg2 -+ args: -+ user: synapse_user -+ password: changeme -+ dbname: synapse_user -+ host: db -+ cp_min: 5 -+ cp_max: 10 -``` - -この設定で細かなSynapseの動作を設定します。 -たとえばTokenの所持者のみ自己登録を可能にするなど。 -詳しい設定は公式ドキュメントを見てください。 -[Configuration Manual](https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html) - -### deploy synapse - -これらの設定が終了すれば、docker-compose.yamlのあるディレクトリに戻って、サーバーのデプロイを実行します。 - -``` -sudo docker compose up -d -``` - -サーバーが無事に動いているかのテストは、curlを使うことで可能です。 - -``` -curl localhost:8008 -``` - -``` -curl localhost:8448 -``` - -成功している場合の返答は以下のようになります。 - -``` -$ curl localhost:8008 -<html> - <head> - <meta http-equiv="refresh" content="0;URL=/_matrix/static"> - </head> - <body bgcolor="#FFFFFF" text="#000000"> - <a href="/_matrix/static">click here</a> - </body> -</html> -$ curl localhost:8448 -<html> - <head><title>404 - No Such Resource</title></head> - <body> - <h1>No Such Resource</h1> - <p>Sorry. No luck finding that resource.</p> - </body> -</html> -``` - -## Setting Cloudflare Tunnel - -Cloudflare One のダッシュボードからnetwork以下にあるtunnel項目を開き、tunnelの設定を開きます。 -「公開されたアプリケーション」タブに移動し、synapseのホスト名(とfederation用のホスト名)を追加します。 -フェデレーション用のホスト名にはhttpHostHeaderをsynapseのホスト名に設定します。 - -## .well-known/matrixの設定 - -Cloudflare workersで適当なものを立ち上げます。 -worker.js - -```JavaScript -const HOMESERVER_URL = "https://my.matrix.host.net:443"; -const IDENTITY_SERVER_URL = "https://vector.im"; -const FEDERATION_SERVER = "my.matrix.host.net:443"; - -export default { - async fetch(request, env) { - const path = new URL(request.url).pathname; - switch (path) { - case "/.well-known/matrix/client": - return new Response( - `{"m.homeserver": {"base_url": "${HOMESERVER_URL}"},"m.identity_server": {"base_url": "${IDENTITY_SERVER_URL}"}}` - ); - case "/.well-known/matrix/server": - return new Response(`{"m.server": "${FEDERATION_SERVER}"}`); - default: - return new Response("Invalid request"); - } - }, -}; -``` - -適宜、以下のページに示されているクライアント向けにE2EEを無効化する設定を追加してください。 - +--- +title: Synapse(Matrix) on Docker Compose +tags: +- docker +- matrix +- selfhosted +- synapse +private: false +updated_at: 2025-11-10 21:49 +id: null +organization_url_name: null +slide: false +--- +# 想定読者 +- Synapseのバックエンドをセルフホステッドする人 +- まともにCLI onlyのサーバを運用する人 +# Ref +- [公式のDockerComposeについてのドキュメント](https://github.com/element-hq/synapse/tree/develop/contrib/docker) +- [EclipseのSynapseリポジトリ](https://gitlab.eclipse.org/eclipsefdn/it/releng/chat-service/chat-service-provisioner) + +## edit docker-compose.yaml + +docker-compose.yamlを完全に設定します。 +生成コマンドによって出力されたファイル数にはシークレット鍵等々の情報が記載されるので、あとからdocker-compose.yamlを変更することは非常に推奨されません。 +サンプル + +```YAML +# This compose file is compatible with Compose itself, it might need some +# adjustments to run properly with stack. + +services: + + synapse: + build: + context: ../.. + dockerfile: docker/Dockerfile + image: docker.io/matrixdotorg/synapse:latest + # Since synapse does not retry to connect to the database, restart upon + # failure + restart: unless-stopped + # See the readme for a full documentation of the environment settings + # NOTE: You must edit homeserver.yaml to use postgres, it defaults to sqlite + environment: + - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml + volumes: + # You may either store all the files in a local folder + - ./files:/data + # .. or you may split this between different storage points + # - ./files:/data + # - /path/to/ssd:/data/uploads + # - /path/to/large_hdd:/data/media + depends_on: + - db + # In order to expose Synapse, remove one of the following, you might for + # instance expose the TLS port directly: + ports: + - 8448:8448/tcp + - 8008:8008/tcp + + db: + image: docker.io/postgres:15-alpine + # Change that password, of course! + environment: + - POSTGRES_USER=synapse_user + - POSTGRES_PASSWORD=changeme + # ensure the database gets created correctly + # https://element-hq.github.io/synapse/latest/postgres.html#set-up-database + - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C + volumes: + # You may store the database tables in a local folder.. + - ./schemas:/var/lib/postgresql/data + # .. or store them on some high performance storage for better results + # - /path/to/ssd/storage:/var/lib/postgresql/data +``` + +## generate homeserver files + +次にこのdocker-composeファイルを使って必要なファイル群を生成します。 +サーバー名のところは適宜書き換えてください。 + +``` +docker compose run --rm -e SYNAPSE_SERVER_NAME=my.matrix.host -e SYNAPSE_REPORT_STATS=yes synapse generate +``` + +## edit homeserver.yaml + +生成された`file`フォルダの中にあるhomeserver.yamlに必要な設定を書き込んでいきます。 +少なくとも必要な設定は以下です。 + +```diff +- listeners: +- - port: 8008 +- tls: false +- type: http +- x_forwarded: true +- resources: +- - names: [client,federation] +- compress: false + ++ listeners: ++ - port: 8008 ++ tls: false ++ type: http ++ x_forwarded: true ++ resources: ++ - names: [client] ++ compress: false ++ ++ - port: 8448 ++ tls: false ++ type: http ++ x_forwarded: true ++ resources: ++ - names: [federation] ++ compress: false + +----------------------------------- + +- database: +- name: sqlite3 +- + ++ database: ++ name: psycopg2 ++ args: ++ user: synapse_user ++ password: changeme ++ dbname: synapse_user ++ host: db ++ cp_min: 5 ++ cp_max: 10 +``` + +この設定で細かなSynapseの動作を設定します。 +たとえばTokenの所持者のみ自己登録を可能にするなど。 +詳しい設定は公式ドキュメントを見てください。 +[Configuration Manual](https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html) + +### deploy synapse + +これらの設定が終了すれば、docker-compose.yamlのあるディレクトリに戻って、サーバーのデプロイを実行します。 + +``` +sudo docker compose up -d +``` + +サーバーが無事に動いているかのテストは、curlを使うことで可能です。 + +``` +curl localhost:8008 +``` + +``` +curl localhost:8448 +``` + +成功している場合の返答は以下のようになります。 + +``` +$ curl localhost:8008 +<html> + <head> + <meta http-equiv="refresh" content="0;URL=/_matrix/static"> + </head> + <body bgcolor="#FFFFFF" text="#000000"> + <a href="/_matrix/static">click here</a> + </body> +</html> +$ curl localhost:8448 +<html> + <head><title>404 - No Such Resource</title></head> + <body> + <h1>No Such Resource</h1> + <p>Sorry. No luck finding that resource.</p> + </body> +</html> +``` + +## Setting Cloudflare Tunnel + +Cloudflare One のダッシュボードからnetwork以下にあるtunnel項目を開き、tunnelの設定を開きます。 +「公開されたアプリケーション」タブに移動し、synapseのホスト名(とfederation用のホスト名)を追加します。 +フェデレーション用のホスト名にはhttpHostHeaderをsynapseのホスト名に設定します。 + +## .well-known/matrixの設定 + +Cloudflare workersで適当なものを立ち上げます。 +worker.js + +```JavaScript +const HOMESERVER_URL = "https://my.matrix.host.net:443"; +const IDENTITY_SERVER_URL = "https://vector.im"; +const FEDERATION_SERVER = "my.matrix.host.net:443"; + +export default { + async fetch(request, env) { + const path = new URL(request.url).pathname; + switch (path) { + case "/.well-known/matrix/client": + return new Response( + `{"m.homeserver": {"base_url": "${HOMESERVER_URL}"},"m.identity_server": {"base_url": "${IDENTITY_SERVER_URL}"}}` + ); + case "/.well-known/matrix/server": + return new Response(`{"m.server": "${FEDERATION_SERVER}"}`); + default: + return new Response("Invalid request"); + } + }, +}; +``` + +適宜、以下のページに示されているクライアント向けにE2EEを無効化する設定を追加してください。 + https://github.com/element-hq/element-web/blob/develop/docs/e2ee.md \ No newline at end of file diff --git a/public/those_days_when_i_was_playing_scratch.md b/public/those_days_when_i_was_playing_scratch.md @@ -1,39 +1,39 @@ ---- -title: "Scratchで遊んでいたあの頃" -emoji: "😽" -type: "idea" -topics: - - "scratch" -published: true -published_at: "2025-12-21 12:13" ---- - -※この記事は元々仲間内でAdvent Calendarを作るために書いたものですが,計画が頓挫したので,こっちで公開しています. - -せっかくの機会ですので,私の昔話をしようと思います. -私がまだ,小学生だった頃,Scratchでシューティングゲームを作る本を買ってもらって,それにかじりついていました. - -当時読んでいた本はこれです.まだ売ってるんですね.もうどういう経緯で買ってもらったのか覚えてないくらいなのに. -- [Scratchではじめよう! プログラミング入門](https://bookplus.nikkei.com/atcl/catalog/15/B29200/) - -当時はプログラミングを学ぶという気はなくて,新しいおもちゃを手に入れたみたいな感覚でした. -私の昔からの癖なのですが,本の通りに作るのって,完成したものを見ると作りたいって思うんですけど,いざ本の通りに作りはじめると,単なる作業になってしまうので,本のとおりに作らなかった記憶があります.Scratchをやる前(始めた後もかな)LEGOで遊んでたんですけど,本の通りに作って,ちょっと遊んだらすぐに部品取りにしてたましたね. - -本に使われてるアセットが配布されていたんですけど,あんまりブラウザに明るくなかったので,自分で敵の絵を描いてみたいなことをしてました.それで見た目もあんまりだし,敵の動きが単純化されすぎていて,規則的で面白みがないなぁと思ってしまって.まともに完成させてプレイをするまえに改造に入ってましたね.でも自律的なプログラムを書くには技量が無かったので,その方面での改造は諦めました. - -ただ,シューティングゲームが好きだったんです.StarWarsのXウィング,当時はあれが好きで,ああいうことができるゲームが作りたくて,自機が前に進んでいって,矢印キーで左右にカーブして,前にビームを放つ方法を思いついたんです.そこからは本とか無視してひたすらプログラムと向き合ってましたね.でも,Scratchってオブジェクトの管理が基本的には絶対的な座標なので,打ったときの自機の向きでビームを発射する方法が思いつかなくて,そんなときに自機の向きを参照する(エンジニア向けに言うとオブジェクトのプロパティを参照する)ブロックをビームのオブジェクトの向きにぶち込むと良いことに気づきまして.あれはとんでもなくおっきな発明だったと思いますが,今からすれば「関数」そのものですね. - -あとは,当時見てたテレビ番組で「プロジェクトX」のタイトル?のパロみたいなのが流れた事があって,それを任意の文字列で再現するやつとか作ってましたね.5000兆円ジェネレーターの動画版みたいなやつ. - -それと同時に小学校でViscuitというのを紹介されて,そこでジャッキーチェンみたいな動きをする棒人間アニメを作ってたんですが,集団行動っていう日体大かな?の演目の棒人間アニメをScratchで作ったりしてました.非常に懐かしいです. - -個人的に重宝したのが,黒板(ホワイトボード)ですね. -ペン機能をガッツリ使いたいと思って作ったのですが,友達と話してるときに図を書く用途で使ったりしてました. - -とまあ,昔話に花を咲かせましたところで,次への導入です. - -私は中学1か2年のときに,Scratchの重大な機能不足に直面しました. -3Dが恐ろしく扱いにくいんです.点の大きさと距離関係で遠近法を使い,透明なキューブをマウス操作でくるくる回せるプロジェクトを作ってる人はいましたが,3Dのオブジェクトを使ってなにかゲームを作るとかは非常に難しい! -そう思った私はググりまして,Unityという解決策に行き着きます. - +--- +title: Scratchで遊んでいたあの頃 +tags: +- scratch +private: false +updated_at: 2025-12-21 12:13 +id: null +organization_url_name: null +slide: false +--- +※この記事は元々仲間内でAdvent Calendarを作るために書いたものですが,計画が頓挫したので,こっちで公開しています. + +せっかくの機会ですので,私の昔話をしようと思います. +私がまだ,小学生だった頃,Scratchでシューティングゲームを作る本を買ってもらって,それにかじりついていました. + +当時読んでいた本はこれです.まだ売ってるんですね.もうどういう経緯で買ってもらったのか覚えてないくらいなのに. +- [Scratchではじめよう! プログラミング入門](https://bookplus.nikkei.com/atcl/catalog/15/B29200/) + +当時はプログラミングを学ぶという気はなくて,新しいおもちゃを手に入れたみたいな感覚でした. +私の昔からの癖なのですが,本の通りに作るのって,完成したものを見ると作りたいって思うんですけど,いざ本の通りに作りはじめると,単なる作業になってしまうので,本のとおりに作らなかった記憶があります.Scratchをやる前(始めた後もかな)LEGOで遊んでたんですけど,本の通りに作って,ちょっと遊んだらすぐに部品取りにしてたましたね. + +本に使われてるアセットが配布されていたんですけど,あんまりブラウザに明るくなかったので,自分で敵の絵を描いてみたいなことをしてました.それで見た目もあんまりだし,敵の動きが単純化されすぎていて,規則的で面白みがないなぁと思ってしまって.まともに完成させてプレイをするまえに改造に入ってましたね.でも自律的なプログラムを書くには技量が無かったので,その方面での改造は諦めました. + +ただ,シューティングゲームが好きだったんです.StarWarsのXウィング,当時はあれが好きで,ああいうことができるゲームが作りたくて,自機が前に進んでいって,矢印キーで左右にカーブして,前にビームを放つ方法を思いついたんです.そこからは本とか無視してひたすらプログラムと向き合ってましたね.でも,Scratchってオブジェクトの管理が基本的には絶対的な座標なので,打ったときの自機の向きでビームを発射する方法が思いつかなくて,そんなときに自機の向きを参照する(エンジニア向けに言うとオブジェクトのプロパティを参照する)ブロックをビームのオブジェクトの向きにぶち込むと良いことに気づきまして.あれはとんでもなくおっきな発明だったと思いますが,今からすれば「関数」そのものですね. + +あとは,当時見てたテレビ番組で「プロジェクトX」のタイトル?のパロみたいなのが流れた事があって,それを任意の文字列で再現するやつとか作ってましたね.5000兆円ジェネレーターの動画版みたいなやつ. + +それと同時に小学校でViscuitというのを紹介されて,そこでジャッキーチェンみたいな動きをする棒人間アニメを作ってたんですが,集団行動っていう日体大かな?の演目の棒人間アニメをScratchで作ったりしてました.非常に懐かしいです. + +個人的に重宝したのが,黒板(ホワイトボード)ですね. +ペン機能をガッツリ使いたいと思って作ったのですが,友達と話してるときに図を書く用途で使ったりしてました. + +とまあ,昔話に花を咲かせましたところで,次への導入です. + +私は中学1か2年のときに,Scratchの重大な機能不足に直面しました. +3Dが恐ろしく扱いにくいんです.点の大きさと距離関係で遠近法を使い,透明なキューブをマウス操作でくるくる回せるプロジェクトを作ってる人はいましたが,3Dのオブジェクトを使ってなにかゲームを作るとかは非常に難しい! +そう思った私はググりまして,Unityという解決策に行き着きます. + ではまた次回お会いしましょう! \ No newline at end of file diff --git a/public/try_nexttypescript_wasmrust_vite.md b/public/try_nexttypescript_wasmrust_vite.md @@ -1,29 +1,31 @@ ---- -title: "Next(TypeScript) + WASM(Rust) + Vite をお試し" -emoji: "🐥" -topics: [] -published: false ---- - -# はじめに -最近何かと話題のRustをWebで使う手法として、WASMというものを知りました。 -正確にはWASMはブラウザで実行されるバイナリファイルであり、その規格でありますが、RustをそちらにコンパイルしてWeb側(Next.js)から呼び出せるようにしてみたいと思います。 -Rustでフロントをいじるactix-webのようなものとは違うという趣旨だけ、ご了承ください。 - -# 下準備 -PCを初期化したばかりだったので、いくつか入っていないツールがありました。入れときます。 -`winget install Oven-sh.bun` -またnode.jsを入れておきましょう(わたしはこれは入ってた) -WASMをRustで書くためにはRustのパッケージマネージャーとしてcargoやその他ツールチェーンを入れます。 -公式ページからインストールスクリプトを取ってきます。 -クイックインストール(Visual Studio経由)でやろうとするとWindows11 SDKを入れられそうだったので、マニュアルインストールにしました。Ubuntuに入れたときみたいな入り方で安心しました。 -ですが、次の手順にてエラーが出たので追加のダウンロードをしました。Visual Studio Build Toolsです。`C++デスクトップ開発`にチェックを入れて入れます。 -あとは`cargo install wasm-pack`もしてWASMに関係するツールも入れておきます。 -# init -## リポジトリ作成 -`npx create-next-app@latest` -を実行します。私はTypeScriptが好きなのでTypeScriptを選択します。 -また、見た目を工夫するような余力はないので余裕があればBootStrapでも導入しようかなと思っています。 -## Rust系のインストール -WASM系のものを作るコマンド`cargo new --lib wasm` -ビルドは`wasm-pack build --target web` +--- +title: Next(TypeScript) + WASM(Rust) + Vite をお試し +tags: [] +private: false +updated_at: '' +id: null +organization_url_name: null +slide: false +--- +# はじめに +最近何かと話題のRustをWebで使う手法として、WASMというものを知りました。 +正確にはWASMはブラウザで実行されるバイナリファイルであり、その規格でありますが、RustをそちらにコンパイルしてWeb側(Next.js)から呼び出せるようにしてみたいと思います。 +Rustでフロントをいじるactix-webのようなものとは違うという趣旨だけ、ご了承ください。 + +# 下準備 +PCを初期化したばかりだったので、いくつか入っていないツールがありました。入れときます。 +`winget install Oven-sh.bun` +またnode.jsを入れておきましょう(わたしはこれは入ってた) +WASMをRustで書くためにはRustのパッケージマネージャーとしてcargoやその他ツールチェーンを入れます。 +公式ページからインストールスクリプトを取ってきます。 +クイックインストール(Visual Studio経由)でやろうとするとWindows11 SDKを入れられそうだったので、マニュアルインストールにしました。Ubuntuに入れたときみたいな入り方で安心しました。 +ですが、次の手順にてエラーが出たので追加のダウンロードをしました。Visual Studio Build Toolsです。`C++デスクトップ開発`にチェックを入れて入れます。 +あとは`cargo install wasm-pack`もしてWASMに関係するツールも入れておきます。 +# init +## リポジトリ作成 +`npx create-next-app@latest` +を実行します。私はTypeScriptが好きなのでTypeScriptを選択します。 +また、見た目を工夫するような余力はないので余裕があればBootStrapでも導入しようかなと思っています。 +## Rust系のインストール +WASM系のものを作るコマンド`cargo new --lib wasm` +ビルドは`wasm-pack build --target web` diff --git a/public/updated_portage_on_gentoo_from_rsync_to_git.md b/public/updated_portage_on_gentoo_from_rsync_to_git.md @@ -1,34 +1,34 @@ ---- -title: "GentooのPortageのアップデートをrsyncからgitにした" -emoji: "🐧" -type: "tech" -topics: - - "gentoo" -published: true -published_at: "2025-09-01 17:46" ---- - -# TL;DR -1. 必要なパッケージを入れる -``` -emerge --ask app-eselect/eselect-repository dev-vcs/git -``` -2. 元あった設定をクリア -``` -eselect repository remove -f gentoo -``` -3. rsync -> git -``` -eselect repository add gentoo git https://github.com/gentoo-mirror/gentoo.git -``` -3.5. もし、途中で引っかかったら、 -``` -rm -r /var/db/repos/gentoo -``` -4. 更新 -``` -emaint sync -r gentoo -``` -# Ref -- https://wiki.gentoo.org/wiki/Portage_with_Git +--- +title: GentooのPortageのアップデートをrsyncからgitにした +tags: +- gentoo +private: false +updated_at: 2025-09-01 17:46 +id: null +organization_url_name: null +slide: false +--- +# TL;DR +1. 必要なパッケージを入れる +``` +emerge --ask app-eselect/eselect-repository dev-vcs/git +``` +2. 元あった設定をクリア +``` +eselect repository remove -f gentoo +``` +3. rsync -> git +``` +eselect repository add gentoo git https://github.com/gentoo-mirror/gentoo.git +``` +3.5. もし、途中で引っかかったら、 +``` +rm -r /var/db/repos/gentoo +``` +4. 更新 +``` +emaint sync -r gentoo +``` +# Ref +- https://wiki.gentoo.org/wiki/Portage_with_Git - [old resouse](https://www.jamescherti.com/gentoo-speed-up-emerge-sync-with-git/) \ No newline at end of file diff --git a/public/what_is_manufacturing.md b/public/what_is_manufacturing.md @@ -1,28 +1,28 @@ ---- -title: "「ものづくり」とは" -emoji: "🔧" -type: "idea" -topics: - - "ものづくり" -published: true -published_at: "2026-03-31 00:28" ---- - -# 結論 -__具現化__ - -## ものづくりの定義 - -インターネット上にあるいくらかの用法に共通する「ものづくり」の意味として「何らかを形作り、価値を生み出す行為」のようなものがあると述べた。 -しかしながら、この表現は多義的であり、部活動というよりは産業的な側面の強いものになっている。 -そこで、部活動や娯楽としての「ものづくり」にも触れながら、更に定義を明確にしていきたい。 - -部活動や娯楽としてのものづくりでは、一般には役に立たないようなものも作られており、作ったものの利用価値がものづくりに必須とは言えない。 - -ものづくりは、製品や機能を設計しそれを実現するまでの行為であることが必要である。 -ここで、製品や機能というのは、つくったものの利用価値であり、産業はこれの実装の対価として金銭が発生し、設計と実装の楽しみこそが部活動や娯楽目的のものづくりと捉え直すことができる。 - -以上を経てここで定義したいものづくりという言葉の定義は -「アイデアを、(有形無形を問わず)実現すること」 -である。 +--- +title: 「ものづくり」とは +tags: +- ものづくり +private: false +updated_at: 2026-03-31 00:28 +id: null +organization_url_name: null +slide: false +--- +# 結論 +__具現化__ + +## ものづくりの定義 + +インターネット上にあるいくらかの用法に共通する「ものづくり」の意味として「何らかを形作り、価値を生み出す行為」のようなものがあると述べた。 +しかしながら、この表現は多義的であり、部活動というよりは産業的な側面の強いものになっている。 +そこで、部活動や娯楽としての「ものづくり」にも触れながら、更に定義を明確にしていきたい。 + +部活動や娯楽としてのものづくりでは、一般には役に立たないようなものも作られており、作ったものの利用価値がものづくりに必須とは言えない。 + +ものづくりは、製品や機能を設計しそれを実現するまでの行為であることが必要である。 +ここで、製品や機能というのは、つくったものの利用価値であり、産業はこれの実装の対価として金銭が発生し、設計と実装の楽しみこそが部活動や娯楽目的のものづくりと捉え直すことができる。 + +以上を経てここで定義したいものづくりという言葉の定義は +「アイデアを、(有形無形を問わず)実現すること」 +である。 一語で言い換えると「具現化」とも言える。 \ No newline at end of file diff --git a/public/windows_pc_setup_script.md b/public/windows_pc_setup_script.md @@ -1,310 +1,312 @@ ---- -title: "Windows PC setupスクリプト" -emoji: "🙆♀️" -topics: [] -published: false ---- - -# 概要 -Windowsのセットアップを自動化する方式を検討する記事です. -# 対象読者 -- (ライトではない)windowsユーザー -- windowsが`\ちょっとできる`人 -# 現行方式 -## 保管方法 - -||| -|-|-| -|保管場所|GibHub Private リポジトリ| -|パッケージマネージャー|winget| - -てな感じです. - -## 複数PC運用について -みなさん,Windows機を複数持ってますよね?(唐突) -それを全て一つのリポジトリにするのもなんだし,でも,2つのPCにしちゃうのもなんだかなぁという感じだと思います. -そこで思いついたのは,`メインPC`は`main`ブランチに,ノートPCは`note`ブランチに分割しちゃう方法です.開発用が在る方は`dev`ブランチとかできて面白いですね.ただし,この運用は,複数に共通する設定の変更が絶望的にやりにくいことです.私はWindows機が2台しかない民なのでこの運用で耐えてますが,流石に3つ4つ出てくると厳しいかもです. - -## winget -最初はいちいちインストールを回すのがめんどくさくて,wingetのexport/import機能を使ってインストールされているアプリを一致させようとした感じです.ただ,色々と問題があったのでそれについて書きます. -### 既存パッケージ再インストール問題 -最初から標準で入っているパッケージをwingetが再インストールしようとする問題がありました. -時間がかかって非常にだるいので,毎回それが起こるようなパッケージ.jsonをつくって,exportされたjsonから削除するようなpythonスクリプトを書きました. -```python -import json -import os -from datetime import datetime - -# --- Configuration --- -INPUT_FILE = "winget.json" -REMOVE_LIST_FILE = "wingetRemoveList.json" -OUTPUT_DIR = "winget" -# --------------------- - -# Ensure the output directory exists -if not os.path.exists(OUTPUT_DIR): - os.makedirs(OUTPUT_DIR) - print(f"Created directory: {OUTPUT_DIR}") - -# Read the main winget file -try: - with open(INPUT_FILE, "r", encoding="utf-8") as fs: - wingetJson = json.load(fs) -except FileNotFoundError: - print(f"Error: Input file not found at '{INPUT_FILE}'") - exit(1) -except json.JSONDecodeError: - print(f"Error: Could not decode JSON from '{INPUT_FILE}'") - exit(1) - -# Read the remove list file -try: - with open(REMOVE_LIST_FILE, "r", encoding="utf-8") as fl: - wingetRemoveListJson = json.load(fl) -except FileNotFoundError: - print(f"Error: Remove list file not found at '{REMOVE_LIST_FILE}'") - exit(1) -except json.JSONDecodeError: - print(f"Error: Could not decode JSON from '{REMOVE_LIST_FILE}'") - exit(1) - -remove_identifiers = set(wingetRemoveListJson.get("wingetRemoveList", [])) -original_packages = wingetJson.get("Sources", [{}])[0].get("Packages", []) -packages_to_keep = [] -removed_count = 0 - -for package in original_packages: - if package.get("PackageIdentifier") in remove_identifiers: - print(f"Removing: {package.get('PackageIdentifier')}") - removed_count += 1 - else: - packages_to_keep.append(package) - -if removed_count == 0: - print("No packages were removed from the list.") - -wingetJson["Sources"][0]["Packages"] = packages_to_keep - -# Generate the output filename with the current date -today_str = datetime.now().strftime("%Y%m%d") -output_filename = os.path.join(OUTPUT_DIR, f"winget-{today_str}.json") - -# Write the modified data to the new file -with open(output_filename, "w", encoding="utf-8") as f: - json.dump(wingetJson, f, indent=4, ensure_ascii=False) - -print(f"\nSuccessfully created formatted winget file at: {output_filename}") -``` -コードはAIが書いたので,品質は保証しません.私の環境だと上手く動きました. -あと,現時点での`wingetRemoveList.json`の中身も貼っておきます. -```json -{ - "wingetRemoveList" : [ - "CPUID.CPU-Z.MSI", - "Microsoft.Office", - "Microsoft.VCRedist.2010.x64", - "Microsoft.VCRedist.2008.x64", - "Ubisoft.Connect", - "Python.Launcher", - "Microsoft.VCRedist.2015+.x64", - "Microsoft.VCRedist.2008.x86", - "Microsoft.VCRedist.2010.x86", - "Microsoft.DotNet.DesktopRuntime.8", - "Microsoft.VCRedist.2015+.x86", - "Python.Python.3.10", - "OffSec.KaliLinux", - "Microsoft.UI.Xaml.2.7", - "Microsoft.UI.Xaml.2.8", - "Microsoft.VCLibs.Desktop.14", - "Microsoft.WSL", - "Microsoft.WindowsTerminal" - ] -} -``` -## 種々の設定 -私はこれら以外にも割と様々にWindowsの設定を施しているので,それらも入れたいなーとか思いました. -具体的に言うと, -- powershellの使い心地をbashに寄せるためのプロファイル適用 -- タスクバーの時計に秒数を追加 -- 高速スタートアップの無効化 -- 視覚効果を無効化 -- ダークモード -- システムサウンドの無効化 -これらを全部やるようなスクリプトを作っちゃいました. -AIに書かせると楽ですね.この程度なら容易にレビューができるし,ハルシネーションの影響も割合,少なくて済むので有り難いです. -なんか`-Force`が多用されてて怖いですけどね.windowsはもともと品質がよろしくはないので良いかななんて() -`setup.ps1` -```powershell -<# -.SYNOPSIS - PCのセットアップを自動化します。 -.DESCRIPTION - このPowerShellスクリプトは、以下のセットアップ処理を実行します: - - Windowsテーマのダークモードへの変更 - - PowerShellプロファイルの更新 - - パフォーマンス向上のための視覚効果の無効化 - - タスクバー時計への秒表示の有効化 - - 高速スタートアップの無効化 - - システムサウンドの無効化 - - 最新のwinget JSON構成ファイルを使ったアプリケーションのインストール - - shortcutsフォルダのユーザーPATHへの追加 -.NOTES - このスクリプトは管理者権限で実行する必要があります。 -#> - -# スクリプトが管理者として実行されているか確認 -if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { - Write-Warning "このスクリプトは管理者権限が必要です。管理者として再起動します..." - # 管理者としてスクリプトを再実行 - Start-Process pwsh -Verb RunAs -ArgumentList "-NoProfile -File `"$PSCommandPath`"" - exit -} - -# スクリプトの場所を基準に動作するようにカレントディレクトリを変更 -$scriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path -Set-Location -Path $scriptRoot - -Write-Host "PCセットアップスクリプトを開始します..." -ForegroundColor Green -Write-Host "------------------------------------------------------------" - -# 1. Set system and apps to Dark Mode -try { - Write-Host "[1/8] Windowsとアプリのテーマをダークモードに設定しています..." -ForegroundColor Cyan - $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" - # 0 = Dark, 1 = Light - Set-ItemProperty -Path $regPath -Name "AppsUseLightTheme" -Value 0 -ErrorAction Stop - Set-ItemProperty -Path $regPath -Name "SystemUsesLightTheme" -Value 0 -ErrorAction Stop - Write-Host " テーマをダークモードに設定しました。" -} -catch { - Write-Error "ダークモードへの設定に失敗しました: $_" -} - -# 2. PowerShellプロファイルに内容を追記 -try { - Write-Host "[2/8] PowerShellプロファイルを更新しています..." -ForegroundColor Cyan - $profileSourcePath = ".\Microsoft.PowerShell_profile.ps1" - - if (-not(Test-Path -Path $profileSourcePath)) { - throw "プロファイルソースファイルが見つかりません: $profileSourcePath" - } - - $profileContent = Get-Content -Path $profileSourcePath -Raw -ErrorAction Stop - - # プロファイル用のディレクトリが存在しない場合は作成 - $profileDir = Split-Path -Path $PROFILE -Parent - if (-not (Test-Path -Path $profileDir)) { - New-Item -Path $profileDir -ItemType Directory -Force | Out-Null - } - - # プロファイルファイルが存在しないか、内容がまだ含まれていない場合に追記 - if (-not (Test-Path $PROFILE) -or -not ((Get-Content $PROFILE -Raw) -like "*$($profileContent)*")) { - Add-Content -Path $PROFILE -Value $profileContent - Write-Host " PowerShellプロファイルを更新しました。" - } else { - Write-Host " プロファイルは既に更新済みです。スキップします。" -ForegroundColor Yellow - } -} -catch { - Write-Error "プロファイルの更新に失敗しました: $_" -} - -# 3. パフォーマンスのために視覚効果を無効化 -try { - Write-Host "[3/8] 視覚効果をパフォーマンス優先に設定しています..." -ForegroundColor Cyan - $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" - Set-ItemProperty -Path $regPath -Name "VisualFxSetting" -Value 2 -ErrorAction Stop - Write-Host " 視覚効果を「パフォーマンスを優先する」に設定しました。" -} -catch { - Write-Error "視覚効果の無効化に失敗しました: $_" -} - -# 4. タスクバーの時計に秒を表示 -try { - Write-Host "[4/8] タスクバーの時計に秒を表示する設定を有効にしています..." -ForegroundColor Cyan - $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" - if (-not (Test-Path $regPath)) { - New-Item -Path $regPath -Force | Out-Null - } - Set-ItemProperty -Path $regPath -Name "ShowSecondsInSystemClock" -Value 1 -ErrorAction Stop - Write-Host " タスクバーの時計に秒が表示されるようになります。" -} -catch { - Write-Error "時計の秒表示設定に失敗しました: $_" -} - -# 5. 高速スタートアップを無効化 -try { - Write-Host "[5/8] 高速スタートアップを無効化しています..." -ForegroundColor Cyan - $regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" - Set-ItemProperty -Path $regPath -Name "HiberbootEnabled" -Value 0 -ErrorAction Stop - Write-Host " 高速スタートアップを無効化しました。" -} -catch { - Write-Error "高速スタートアップの無効化に失敗しました: $_" -} - -# 6. システムサウンドを無効化 -try { - Write-Host "[6/8] システムサウンドを無効化しています..." -ForegroundColor Cyan - $schemePath = "HKCU:\AppEvents\Schemes" - Set-ItemProperty -Path $schemePath -Name "(Default)" -Value ".None" -ErrorAction Stop - Write-Host " サウンド設定を「サウンドなし」に変更しました。" -} -catch { - Write-Error "システムサウンドの無効化に失敗しました: $_" -} - -# 7. 最新のwinget JSONファイルからパッケージをインストール -try { - Write-Host "[7/8] Wingetによるアプリケーションのインストールを開始します..." -ForegroundColor Cyan - $latestWingetFile = Get-ChildItem -Path ".\winget" -Filter "winget-*.json" | Sort-Object Name -Descending | Select-Object -First 1 - if ($latestWingetFile) { - Write-Host " 最新の構成ファイルが見つかりました: $($latestWingetFile.Name)" - Write-Host " インポートを開始します。完了まで時間がかかる場合があります..." - winget import -i $latestWingetFile.FullName --accept-package-agreements --accept-source-agreements - } else { - Write-Warning " 'winget-*.json' ファイルが見つかりませんでした。アプリケーションのインストールをスキップします。" - } -} -catch { - Write-Error "Wingetでのアプリケーションインストールに失敗しました: $_" -} - -# 8. shortcutsフォルダをPATH環境変数に追加 -try { - Write-Host "[8/8] 'shortcuts' フォルダをPATH環境変数に追加しています..." -ForegroundColor Cyan - $shortcutsPath = Join-Path -Path $scriptRoot -ChildPath "shortcuts" - - if (-not (Test-Path -Path $shortcutsPath)) { - Write-Warning " 'shortcuts' フォルダが見つかりません。スキップします。" - } - else { - $currentUserPath = [System.Environment]::GetEnvironmentVariable("Path", "User") - if ($currentUserPath -notlike "*$shortcutsPath*") { - $newPath = $currentUserPath.TrimEnd(';') + ";" + $shortcutsPath - [System.Environment]::SetEnvironmentVariable("Path", $newPath, "User") - $env:Path = $newPath # 現在のセッションにも反映 - Write-Host " 'shortcuts' フォルダをユーザーのPATHに追加しました。" - } else { - Write-Host " 'shortcuts' フォルダは既にユーザーPATHに存在します。スキップします。" -ForegroundColor Yellow - } - } -} -catch { - Write-Error "'shortcuts' フォルダのPATHへの追加に失敗しました: $_" -} - -Write-Host "------------------------------------------------------------" -Write-Host "セットアップスクリプトが完了しました。" -ForegroundColor Green -Write-Host "UI関連の変更を適用するためにExplorerを再起動します。" -ForegroundColor Yellow -Stop-Process -Name explorer -Force -Write-Host "すべての変更を確実に適用するために、コンピューターの再起動を推奨します。" -ForegroundColor Yellow -``` -私は画面が2つある関係でwallpaperの自動設定は諦めました.そもそもは動画をwallpaperにするよう試みたりしてたので,その辺りは今後気が向けばやります. -あとはpowershellのプロファイルの中にインストールが必要なモジュールがあった気がするので,それもこのスクリプトに入れておくと便利かななどと思ってます. - -# まとめ -これでPC初期化は怖くない! +--- +title: Windows PC setupスクリプト +tags: [] +private: false +updated_at: '' +id: null +organization_url_name: null +slide: false +--- +# 概要 +Windowsのセットアップを自動化する方式を検討する記事です. +# 対象読者 +- (ライトではない)windowsユーザー +- windowsが`\ちょっとできる`人 +# 現行方式 +## 保管方法 + +||| +|-|-| +|保管場所|GibHub Private リポジトリ| +|パッケージマネージャー|winget| + +てな感じです. + +## 複数PC運用について +みなさん,Windows機を複数持ってますよね?(唐突) +それを全て一つのリポジトリにするのもなんだし,でも,2つのPCにしちゃうのもなんだかなぁという感じだと思います. +そこで思いついたのは,`メインPC`は`main`ブランチに,ノートPCは`note`ブランチに分割しちゃう方法です.開発用が在る方は`dev`ブランチとかできて面白いですね.ただし,この運用は,複数に共通する設定の変更が絶望的にやりにくいことです.私はWindows機が2台しかない民なのでこの運用で耐えてますが,流石に3つ4つ出てくると厳しいかもです. + +## winget +最初はいちいちインストールを回すのがめんどくさくて,wingetのexport/import機能を使ってインストールされているアプリを一致させようとした感じです.ただ,色々と問題があったのでそれについて書きます. +### 既存パッケージ再インストール問題 +最初から標準で入っているパッケージをwingetが再インストールしようとする問題がありました. +時間がかかって非常にだるいので,毎回それが起こるようなパッケージ.jsonをつくって,exportされたjsonから削除するようなpythonスクリプトを書きました. +```python +import json +import os +from datetime import datetime + +# --- Configuration --- +INPUT_FILE = "winget.json" +REMOVE_LIST_FILE = "wingetRemoveList.json" +OUTPUT_DIR = "winget" +# --------------------- + +# Ensure the output directory exists +if not os.path.exists(OUTPUT_DIR): + os.makedirs(OUTPUT_DIR) + print(f"Created directory: {OUTPUT_DIR}") + +# Read the main winget file +try: + with open(INPUT_FILE, "r", encoding="utf-8") as fs: + wingetJson = json.load(fs) +except FileNotFoundError: + print(f"Error: Input file not found at '{INPUT_FILE}'") + exit(1) +except json.JSONDecodeError: + print(f"Error: Could not decode JSON from '{INPUT_FILE}'") + exit(1) + +# Read the remove list file +try: + with open(REMOVE_LIST_FILE, "r", encoding="utf-8") as fl: + wingetRemoveListJson = json.load(fl) +except FileNotFoundError: + print(f"Error: Remove list file not found at '{REMOVE_LIST_FILE}'") + exit(1) +except json.JSONDecodeError: + print(f"Error: Could not decode JSON from '{REMOVE_LIST_FILE}'") + exit(1) + +remove_identifiers = set(wingetRemoveListJson.get("wingetRemoveList", [])) +original_packages = wingetJson.get("Sources", [{}])[0].get("Packages", []) +packages_to_keep = [] +removed_count = 0 + +for package in original_packages: + if package.get("PackageIdentifier") in remove_identifiers: + print(f"Removing: {package.get('PackageIdentifier')}") + removed_count += 1 + else: + packages_to_keep.append(package) + +if removed_count == 0: + print("No packages were removed from the list.") + +wingetJson["Sources"][0]["Packages"] = packages_to_keep + +# Generate the output filename with the current date +today_str = datetime.now().strftime("%Y%m%d") +output_filename = os.path.join(OUTPUT_DIR, f"winget-{today_str}.json") + +# Write the modified data to the new file +with open(output_filename, "w", encoding="utf-8") as f: + json.dump(wingetJson, f, indent=4, ensure_ascii=False) + +print(f"\nSuccessfully created formatted winget file at: {output_filename}") +``` +コードはAIが書いたので,品質は保証しません.私の環境だと上手く動きました. +あと,現時点での`wingetRemoveList.json`の中身も貼っておきます. +```json +{ + "wingetRemoveList" : [ + "CPUID.CPU-Z.MSI", + "Microsoft.Office", + "Microsoft.VCRedist.2010.x64", + "Microsoft.VCRedist.2008.x64", + "Ubisoft.Connect", + "Python.Launcher", + "Microsoft.VCRedist.2015+.x64", + "Microsoft.VCRedist.2008.x86", + "Microsoft.VCRedist.2010.x86", + "Microsoft.DotNet.DesktopRuntime.8", + "Microsoft.VCRedist.2015+.x86", + "Python.Python.3.10", + "OffSec.KaliLinux", + "Microsoft.UI.Xaml.2.7", + "Microsoft.UI.Xaml.2.8", + "Microsoft.VCLibs.Desktop.14", + "Microsoft.WSL", + "Microsoft.WindowsTerminal" + ] +} +``` +## 種々の設定 +私はこれら以外にも割と様々にWindowsの設定を施しているので,それらも入れたいなーとか思いました. +具体的に言うと, +- powershellの使い心地をbashに寄せるためのプロファイル適用 +- タスクバーの時計に秒数を追加 +- 高速スタートアップの無効化 +- 視覚効果を無効化 +- ダークモード +- システムサウンドの無効化 +これらを全部やるようなスクリプトを作っちゃいました. +AIに書かせると楽ですね.この程度なら容易にレビューができるし,ハルシネーションの影響も割合,少なくて済むので有り難いです. +なんか`-Force`が多用されてて怖いですけどね.windowsはもともと品質がよろしくはないので良いかななんて() +`setup.ps1` +```powershell +<# +.SYNOPSIS + PCのセットアップを自動化します。 +.DESCRIPTION + このPowerShellスクリプトは、以下のセットアップ処理を実行します: + - Windowsテーマのダークモードへの変更 + - PowerShellプロファイルの更新 + - パフォーマンス向上のための視覚効果の無効化 + - タスクバー時計への秒表示の有効化 + - 高速スタートアップの無効化 + - システムサウンドの無効化 + - 最新のwinget JSON構成ファイルを使ったアプリケーションのインストール + - shortcutsフォルダのユーザーPATHへの追加 +.NOTES + このスクリプトは管理者権限で実行する必要があります。 +#> + +# スクリプトが管理者として実行されているか確認 +if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { + Write-Warning "このスクリプトは管理者権限が必要です。管理者として再起動します..." + # 管理者としてスクリプトを再実行 + Start-Process pwsh -Verb RunAs -ArgumentList "-NoProfile -File `"$PSCommandPath`"" + exit +} + +# スクリプトの場所を基準に動作するようにカレントディレクトリを変更 +$scriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path +Set-Location -Path $scriptRoot + +Write-Host "PCセットアップスクリプトを開始します..." -ForegroundColor Green +Write-Host "------------------------------------------------------------" + +# 1. Set system and apps to Dark Mode +try { + Write-Host "[1/8] Windowsとアプリのテーマをダークモードに設定しています..." -ForegroundColor Cyan + $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" + # 0 = Dark, 1 = Light + Set-ItemProperty -Path $regPath -Name "AppsUseLightTheme" -Value 0 -ErrorAction Stop + Set-ItemProperty -Path $regPath -Name "SystemUsesLightTheme" -Value 0 -ErrorAction Stop + Write-Host " テーマをダークモードに設定しました。" +} +catch { + Write-Error "ダークモードへの設定に失敗しました: $_" +} + +# 2. PowerShellプロファイルに内容を追記 +try { + Write-Host "[2/8] PowerShellプロファイルを更新しています..." -ForegroundColor Cyan + $profileSourcePath = ".\Microsoft.PowerShell_profile.ps1" + + if (-not(Test-Path -Path $profileSourcePath)) { + throw "プロファイルソースファイルが見つかりません: $profileSourcePath" + } + + $profileContent = Get-Content -Path $profileSourcePath -Raw -ErrorAction Stop + + # プロファイル用のディレクトリが存在しない場合は作成 + $profileDir = Split-Path -Path $PROFILE -Parent + if (-not (Test-Path -Path $profileDir)) { + New-Item -Path $profileDir -ItemType Directory -Force | Out-Null + } + + # プロファイルファイルが存在しないか、内容がまだ含まれていない場合に追記 + if (-not (Test-Path $PROFILE) -or -not ((Get-Content $PROFILE -Raw) -like "*$($profileContent)*")) { + Add-Content -Path $PROFILE -Value $profileContent + Write-Host " PowerShellプロファイルを更新しました。" + } else { + Write-Host " プロファイルは既に更新済みです。スキップします。" -ForegroundColor Yellow + } +} +catch { + Write-Error "プロファイルの更新に失敗しました: $_" +} + +# 3. パフォーマンスのために視覚効果を無効化 +try { + Write-Host "[3/8] 視覚効果をパフォーマンス優先に設定しています..." -ForegroundColor Cyan + $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" + Set-ItemProperty -Path $regPath -Name "VisualFxSetting" -Value 2 -ErrorAction Stop + Write-Host " 視覚効果を「パフォーマンスを優先する」に設定しました。" +} +catch { + Write-Error "視覚効果の無効化に失敗しました: $_" +} + +# 4. タスクバーの時計に秒を表示 +try { + Write-Host "[4/8] タスクバーの時計に秒を表示する設定を有効にしています..." -ForegroundColor Cyan + $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" + if (-not (Test-Path $regPath)) { + New-Item -Path $regPath -Force | Out-Null + } + Set-ItemProperty -Path $regPath -Name "ShowSecondsInSystemClock" -Value 1 -ErrorAction Stop + Write-Host " タスクバーの時計に秒が表示されるようになります。" +} +catch { + Write-Error "時計の秒表示設定に失敗しました: $_" +} + +# 5. 高速スタートアップを無効化 +try { + Write-Host "[5/8] 高速スタートアップを無効化しています..." -ForegroundColor Cyan + $regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" + Set-ItemProperty -Path $regPath -Name "HiberbootEnabled" -Value 0 -ErrorAction Stop + Write-Host " 高速スタートアップを無効化しました。" +} +catch { + Write-Error "高速スタートアップの無効化に失敗しました: $_" +} + +# 6. システムサウンドを無効化 +try { + Write-Host "[6/8] システムサウンドを無効化しています..." -ForegroundColor Cyan + $schemePath = "HKCU:\AppEvents\Schemes" + Set-ItemProperty -Path $schemePath -Name "(Default)" -Value ".None" -ErrorAction Stop + Write-Host " サウンド設定を「サウンドなし」に変更しました。" +} +catch { + Write-Error "システムサウンドの無効化に失敗しました: $_" +} + +# 7. 最新のwinget JSONファイルからパッケージをインストール +try { + Write-Host "[7/8] Wingetによるアプリケーションのインストールを開始します..." -ForegroundColor Cyan + $latestWingetFile = Get-ChildItem -Path ".\winget" -Filter "winget-*.json" | Sort-Object Name -Descending | Select-Object -First 1 + if ($latestWingetFile) { + Write-Host " 最新の構成ファイルが見つかりました: $($latestWingetFile.Name)" + Write-Host " インポートを開始します。完了まで時間がかかる場合があります..." + winget import -i $latestWingetFile.FullName --accept-package-agreements --accept-source-agreements + } else { + Write-Warning " 'winget-*.json' ファイルが見つかりませんでした。アプリケーションのインストールをスキップします。" + } +} +catch { + Write-Error "Wingetでのアプリケーションインストールに失敗しました: $_" +} + +# 8. shortcutsフォルダをPATH環境変数に追加 +try { + Write-Host "[8/8] 'shortcuts' フォルダをPATH環境変数に追加しています..." -ForegroundColor Cyan + $shortcutsPath = Join-Path -Path $scriptRoot -ChildPath "shortcuts" + + if (-not (Test-Path -Path $shortcutsPath)) { + Write-Warning " 'shortcuts' フォルダが見つかりません。スキップします。" + } + else { + $currentUserPath = [System.Environment]::GetEnvironmentVariable("Path", "User") + if ($currentUserPath -notlike "*$shortcutsPath*") { + $newPath = $currentUserPath.TrimEnd(';') + ";" + $shortcutsPath + [System.Environment]::SetEnvironmentVariable("Path", $newPath, "User") + $env:Path = $newPath # 現在のセッションにも反映 + Write-Host " 'shortcuts' フォルダをユーザーのPATHに追加しました。" + } else { + Write-Host " 'shortcuts' フォルダは既にユーザーPATHに存在します。スキップします。" -ForegroundColor Yellow + } + } +} +catch { + Write-Error "'shortcuts' フォルダのPATHへの追加に失敗しました: $_" +} + +Write-Host "------------------------------------------------------------" +Write-Host "セットアップスクリプトが完了しました。" -ForegroundColor Green +Write-Host "UI関連の変更を適用するためにExplorerを再起動します。" -ForegroundColor Yellow +Stop-Process -Name explorer -Force +Write-Host "すべての変更を確実に適用するために、コンピューターの再起動を推奨します。" -ForegroundColor Yellow +``` +私は画面が2つある関係でwallpaperの自動設定は諦めました.そもそもは動画をwallpaperにするよう試みたりしてたので,その辺りは今後気が向けばやります. +あとはpowershellのプロファイルの中にインストールが必要なモジュールがあった気がするので,それもこのスクリプトに入れておくと便利かななどと思ってます. + +# まとめ +これでPC初期化は怖くない! みなさんも1年くらいの周期で初期化していると思うので,この機会にぜひとも自動セットアップを構築して,やってみてください.私は今度は大量のVMのパッケージのバージョンを何とかするansibleを作るかもしれないです.乞うご期待!(のんびりやります) \ No newline at end of file diff --git a/public/windows_update_fail_with_0x800f0983.md b/public/windows_update_fail_with_0x800f0983.md @@ -1,85 +1,85 @@ ---- -title: "Windows Update fail with 0x800f0983" -emoji: "🪟" -type: "tech" -topics: - - "windows11" - - "0x800f0983" -published: true -published_at: "2025-10-17 19:52" ---- - -# What is this article -これは、一人でWindowsを保守できる程度の技量を持ち合わせた人間向けの文章です。 -Windows Updateが以下の文言と共に失敗しました。 -``` -Install error - 0x800f0983 -``` -今回はこれに関して収集した情報を書きます。 -# 状況詳細 -``` -2025-10 Cumulative Update for Windows 11 Version 24H2 for x64-based Systems (KB5066835) (26100.6899) -``` -install fail with this -``` -Install error - 0x800f0983 -``` -- 以前にWindows Updateを停止しませんでした -- 前回の初期化から1年近く経っているので、そろそろ初期化の時期かもしれません -## device specification -``` -Device name DESKTOP-MINERVA -Processor AMD Ryzen 9 3900XT 12-Core Processor (3.80 GHz) -Installed RAM 32.0 GB -System type 64-bit operating system, x64-based processor -Pen and touch No pen or touch input is available for this display -``` -# 問題点 -[ms QA](https://learn.microsoft.com/en-us/answers/questions/3891780/0x800f0983) -QAの記事にあるように ->エラー コード 0x800f0983 は、コンポーネント ストア (WinSxS) の破損を示します。 - -らしいです。 -# solution 1 (DISM) -大人しくQAにあるコマンドを実行します。 -``` -Dism /Online /Cleanup-Image /StartComponentCleanup -``` -私はtermにalacrittyを使っているのですが、権限昇格とかの機能がないので、sudoを使ったらfileのRL権限がないと怒られました。大人しくalacritty自体をRun as administorします。 -なんか59.9%でスタックしてました。長いなぁと思ってたら100%に。やった!って思ったら75%くらいに巻き戻ってゆっくり進み始めました。なんだこりゃ。 -``` -Deployment Image Servicing and Management tool -Version: 10.0.26100.5074 - -Image Version: 10.0.26100.6584 - -[==========================100.0%==========================] -The operation completed successfully. -``` -らしいので、健康にしていきます。 -``` -Dism /Online /Cleanup-Image /RestoreHealth -``` -こんどはスムーズ -``` -Deployment Image Servicing and Management tool -Version: 10.0.26100.5074 - -Image Version: 10.0.26100.6584 - -[==========================100.0%==========================] The restore operation completed successfully. -The operation completed successfully. -``` -再起動します。 -`Retry`します。 -失敗します。 -ま、Dismコマンドでうまくいったことなんて一度も無かったので、そうだよなって感じですね。 -# solution 2 (Reinstall windows) -In settiong, System -> Recover -> Reinstall -でボタンをポチッとします。 -あとは1.5時間くらい放置です。 -壁紙が吹き飛んでましたが、他は設定が変わってるとかはなく、最新の状態になってました。 -そういえば、Retryする前に候補に上がっていた25H2は設定のwin update画面からは見えなくなってますね。なんででしょう。 -ま、治ったんで良かったです。 -# 余談 +--- +title: Windows Update fail with 0x800f0983 +tags: +- windows11 +- '0x800f0983' +private: false +updated_at: 2025-10-17 19:52 +id: null +organization_url_name: null +slide: false +--- +# What is this article +これは、一人でWindowsを保守できる程度の技量を持ち合わせた人間向けの文章です。 +Windows Updateが以下の文言と共に失敗しました。 +``` +Install error - 0x800f0983 +``` +今回はこれに関して収集した情報を書きます。 +# 状況詳細 +``` +2025-10 Cumulative Update for Windows 11 Version 24H2 for x64-based Systems (KB5066835) (26100.6899) +``` +install fail with this +``` +Install error - 0x800f0983 +``` +- 以前にWindows Updateを停止しませんでした +- 前回の初期化から1年近く経っているので、そろそろ初期化の時期かもしれません +## device specification +``` +Device name DESKTOP-MINERVA +Processor AMD Ryzen 9 3900XT 12-Core Processor (3.80 GHz) +Installed RAM 32.0 GB +System type 64-bit operating system, x64-based processor +Pen and touch No pen or touch input is available for this display +``` +# 問題点 +[ms QA](https://learn.microsoft.com/en-us/answers/questions/3891780/0x800f0983) +QAの記事にあるように +>エラー コード 0x800f0983 は、コンポーネント ストア (WinSxS) の破損を示します。 + +らしいです。 +# solution 1 (DISM) +大人しくQAにあるコマンドを実行します。 +``` +Dism /Online /Cleanup-Image /StartComponentCleanup +``` +私はtermにalacrittyを使っているのですが、権限昇格とかの機能がないので、sudoを使ったらfileのRL権限がないと怒られました。大人しくalacritty自体をRun as administorします。 +なんか59.9%でスタックしてました。長いなぁと思ってたら100%に。やった!って思ったら75%くらいに巻き戻ってゆっくり進み始めました。なんだこりゃ。 +``` +Deployment Image Servicing and Management tool +Version: 10.0.26100.5074 + +Image Version: 10.0.26100.6584 + +[==========================100.0%==========================] +The operation completed successfully. +``` +らしいので、健康にしていきます。 +``` +Dism /Online /Cleanup-Image /RestoreHealth +``` +こんどはスムーズ +``` +Deployment Image Servicing and Management tool +Version: 10.0.26100.5074 + +Image Version: 10.0.26100.6584 + +[==========================100.0%==========================] The restore operation completed successfully. +The operation completed successfully. +``` +再起動します。 +`Retry`します。 +失敗します。 +ま、Dismコマンドでうまくいったことなんて一度も無かったので、そうだよなって感じですね。 +# solution 2 (Reinstall windows) +In settiong, System -> Recover -> Reinstall +でボタンをポチッとします。 +あとは1.5時間くらい放置です。 +壁紙が吹き飛んでましたが、他は設定が変わってるとかはなく、最新の状態になってました。 +そういえば、Retryする前に候補に上がっていた25H2は設定のwin update画面からは見えなくなってますね。なんででしょう。 +ま、治ったんで良かったです。 +# 余談 WinSxSっていうのはWindowsの根幹のコンポーネントが入ってるフォルダーらしいのですが、中身(`C:\Windows\WinSxS\`)dllファイルしか見当たらないし、これをダウンロードし直すだけで良いような気もするんですけどね。Windowsは複雑怪奇。 \ No newline at end of file