[
  {
    "title": "バイブコーディング時代、ゴッドオブジェクトは本当に悪なのか。LLMでコードを書くと、なぜ設計はゴッド化しやすいのか",
    "url": "/blog/llm-god-object-technical-report/",
    "description": "LLM時代の開発では、ゴッドオブジェクトは小規模な試作や一人開発では速い一方、機能、権限、秘密、監査が増えると急に壊れやすくなります。バイブコーディングとの相性、分割へ移る判断基準、代替設計まで簡単に整理しました。",
    "tags": [
      "LLM",
      "アーキテクチャ",
      "ゴッドオブジェクト",
      "バイブコーディング",
      "AIエージェント"
    ],
    "date": "2026年4月5日15時58分",
    "content": "ゴッドオブジェクト（god object）とは、本来は別々の責務に分けるべき処理・データ・状態を、ひとつの巨大なクラスやモジュールに詰め込んでしまった設計のことです。本来は分けるべき役割（ui、永続化、権限、外部apiなど）が、ひとつの巨大なクラスやモジュールに全部入っており、あらゆる変更がそこに集中します。その結果、影響範囲が読みにくくテストもしづらく、バグや設計の腐敗が進みやすい、というのが問題とされる点です。 ゴッドオブジェクトは悪い設計とされつつも、バイブコーディングでコード生成のやり方が変わる中では処理が一箇所にあるぶんllmにも追いやすいのでは？という疑問があります。小規模・一人・試作では入口が一つにまとまっているほうが速いことも多いです。 以上から試作ではゴッド寄りの集約でもよいが、恒久設計として優れているわけではないことや、ツール・状態・権限・秘密・永続化が増えたら責務分離が必要になります。最初は大きめでもよいが長く育てるなら外はシンプルなまま中は少しずつ分けていくのが良い結論です。機能や連携が増えると一つに詰め込んだ設計は急に直しにくく壊れやすくなります。 なぜllmはコードをゴッド化しやすいのか llmは、今見えている範囲に新しい機能を継ぎ足すのが得意です。既存の大きなクラスやファイルがあると、そこへ続きを書くほうが最短で動く答えになりやすいです。認証も状態管理も外部apiも、ひとつの中心に集まりやすくなります。分割された設計では、責務の置き場や依存の扱いまで考える必要があり、動くコードを早く返すことより難しいので、中央集権的な形に流れやすいです。 さらに、バイブコーディングでは「これを追加して、この関数から呼んで」と頼むと、llmは最短経路でつなぎ込みます。設計の美しさより、いま動くことが優先されます。テストも、動いた・通った・便利、で先へ進みやすいため、構造的な悪化はかなり育つまで気づきにくいです。 要するに、llmは責務を分けて育てるより、見えている中心へ最短で機能を足すほうが得意だから、コードはゴッド化しやすいのです。 ゴットオブジェクト化の具体例 ゴッドオブジェクト型にすると、部品のほとんどを一つのクラスに寄せて一つの入口だけで動かす形になります。下のコードはそのイメージです。モデル、文章の組み立て、検索、ツール、ログ、許可、状態の保存などを、 godagent が持ちます。 # python: 典型的なゴッドオブジェクト的 agent class godagent: def __init__(self, model_client, prompt_builder, retriever, tools, logger, auth, state_store): self.model = model_client # llmモデルクライアント self.prompt = prompt_builder # プロンプト生成 self.retriever = retriever # rag検索器 self.tools = tools # ツール名→実行関数マップ self.logger = logger # ログ/監査 self.auth = auth # 認可チェック self.state = state_store # セッション状態保存 async def run(self, user_input, user_id, session_id): # 履歴・状態復元 history = await self.state.load(session_id) docs = await self.retriever.search(user_input) prompt = self.prompt.build(input=user_input, history=history, docs=docs) # llm呼び出しループ resp = await self.model.chat(prompt, tools=[name for name in self.tools.keys()]) while resp.tool_call: name = resp.tool_call.name args = resp.tool_call.args # 認可チェック self.auth.check(user_id, name, args) # ツール実行 result = await self.tools[name](args, user_id) self.logger.log_tool(name, args, result) resp = await self.model.chat(resp.next_prompt, tool_output=result) # 結果保存 await self.state.save(session_id, resp.text) return resp.text 上記のように、godagentクラスが各機能の責務を持つため、呼び出し側は単一の run メソッドのみを操作すれば全処理が完結します。一見コードがまとめやすく開発は高速化されますが、内部は多数の依存とロジックが混在しており、役割が肥大・複雑化しています。 利点と欠点 ゴッドオブジェクト型と、仕事ごとに分けた設計を表で比べます。小さく試すときは、ゴッドオブジェクト型のほうが速く動かせることが多いです。長く育てると、直しにくさや安全の弱さが目立ちます。機能を足すたびに、同じ中心が太っていくので、あとからの負担が急に重くなります。表の読み方は、速さや試作なら左の列、長く使う・チームで書く・安全を重んじるなら右の列、と思ってもらうとわかりやすいです。 観点 ゴットオブジェクト型設計 分割・モジュール化設計 性能 メソッド呼び出しやdiオーバーヘッドが減り単純処理は高速な場合もあります。マイクロコントローラ的環境では一元化による最適化が可能です。 個別コンポーネント間の通信や抽象化コストが増えますが、並列実行やキャッシュ効果、スケールアウトで総合性能を向上できます。 保守性 初期はコードが少なく保守が容易に見えますが、規模が大きくなると依存関係が複雑化し、変更の影響範囲が広がります。 関心事ごとに変更でき、コードの責務分離によって変更影響を局所化しやすいです。各部品でチーム分担しやすいです。 テスト容易性 単体テストはgodagent全体の振る舞いを検証する必要があり、モック範囲が巨大になりがちです。ユニットテストでテストが結合テスト化する恐れがあります。 各コンポーネントが小さく疎結合なので、ユニットテストやモックが容易です。個別テストで不具合切り分けや再利用もしやすいです。 セキュリティ 全権限を中央で管理するため、万一流出すると大規模な被害につながるリスクが高いです。権限分離が困難で、秘密情報も一箇所に集中しやすいです。 役割ごとに権限を細分化しやすく、最小権限原則を適用可能です。秘密管理も機能単位に分けられ、局所的な監査が可能です。 拡張性 新機能追加はgodagentクラスの肥大として現れます。コード間の依存を意識しないとすぐに複雑化します。 新しいツールや機能は独立したモジュールを追加するだけで済み、既存部分への影響が少ないです。機能拡張が安全に行えます。 デバッグ性 ログが集中していれば追跡は可能ですが、状態と処理が絡まり合うと再現が困難です。副作用の全体把握が難しいです。 各コンポーネントの入出力が明確なため、原因追跡がしやすいです。明示的なインターフェースでデバッグ範囲を絞り込めます。 チーム開発 変更点が1箇所に集中し競合しやすいです。クラス所有者が曖昧になりがちで、レビュー対象が膨大になります。 担当範囲が明確になり、チーム間の衝突を低減できます。複数人が並行して開発できます。モジュールオーナー制やインターフェース契約が明確になります。 バイブコーディング コードが一箇所にまとまり、プロンプト入力→即時実行で動作確認しやすいため、迅速なプロトタイピングに向きます。 一度設計を分割・抽象化するコストがかかるため、初動は遅く感じますが、反復性が高い大規模開発では安定感が出ます。 トレードオフと判断基準 いつゴッド寄りでいいかは、次のような条件で考えるとよいです。最初は速くてシンプルに見えますが、大きくなるほど壊れやすく運用も重くなります。だから機能が少ない試作や、人が少ない実験のときだけに寄せて、長く続くなら分ける準備をしておくのがおすすめです。 かんたんに言えば、一人でお試しならまとめてもよいが、大人数・本番・秘密が多いなら分ける。速さと安全のトレードオフ、ということになります。 プロジェクト規模・複雑度 : 小規模で機能が少ないpocやプロトタイプ開発では、ゴッドオブジェクトで迅速に動作させたほうが開発スピードが速い場合があります。一方、機能数が増え続ける大規模開発ではアーキテクチャが破綻しやすいです。 チーム体制 : 開発者が少人数で役割分担が明確ならゴッド化で開発速度を優先できます。大人数や部門横断型開発では責任分界が曖昧になり衝突するため避けるべきです。 バイブコーディングの優先度 : 要件定義が流動的でとにかく早く動くものを見たいフェーズ、すなわちバイブコーディングでは中央集約型が楽に感じられます。しかし要件が固まりci/cd適用が必要な段階では、分割化してテスト可能性と安全性を確保した方がよいです。 セキュリティ・コンプライアンス要件 : マルチテナント、厳格な監査ログやデータ保持方針が求められる環境では、権限境界をはっきり切らないゴッドオブジェクトはリスクが大きいです。支払・医療など機密性の高い領域では基本的に避けるべきです。 パフォーマンス要求 : リソース制限のある組み込み環境など、単一プロセスでの軽量高速処理が絶対に必要な場合は、設計をシンプルにし中央管理を認めることも検討できます。 既存資産との親和性 : 既存に共通モジュールやインフラがあればそれを流用し、ゴッドオブジェクトにせずとも開発できます。逆に既存がない場合は一時的にまとめて実装し、後で分割するというアプローチもあります。 代替設計パターンと移行 全部を一つの箱にしないで済ませる、よくある作り方を並べます。名前は難しく見えますが、やっていることは、仕事を分ける・入口だけ一つに見せる・外から部品を差し込むのどれかです。 モジュール化・依存性注入 : 機能ごとにクラスやサービスを分割し、依存性注入、diコンテナで組み立てます。semantic kernelのkernelオブジェクト例では、aiサービスやプラグインをkernelに登録し、diコンテナで単一インスタンスを共有する設計が取られています。これはゴッドオブジェクト的に見えますが、役割ごとに明確に分かれた複数インスタンスを注入して組み合わせる形でゴッド化の弊害を抑制する手法です。 ファサード : システムの入口を単一に見せつつ、内部で複数のサービスに処理を委譲します。いわばゴッドオブジェクトに見えるインターフェースを残し、裏では分散処理する方法です。バイブコーディングの体験を維持しつつ、実装は分割できます。facadeパターンは、service layerやadapterパターンと組み合わせて用いられます。 コマンドパターン : ツール呼び出しをコマンドオブジェクトとして抽象化し、実行器、invokerで各コマンドを処理します。ツール名・入力スキーマをコマンドクラスに持たせ、invoker側が許可チェックと実行を担うことで、godagent内部でのツール実行ロジック集約を防げます。 ワークフロー/オーケストレーター : 関数呼び出しの流れをワークフローエンジンで定義し、ノード単位で役割分担します。langchainのagent実装がこれに近く、モデルノード、ツールノード、ミドルウェアノードなどをノード化して処理しています。これにより動的フローが可視化され、godobject的な集中ロジックを回避できます。 マイクロサービス : 大規模なシステムではサービス単位でapi化し、各サービスがそれぞれモデル呼び出しやログを持つ形に分割します。サービス間通信でデータを渡すため、単一プロセス化はされませんが、責務境界が明確になります。 プラグインアーキテクチャ : ツールや拡張機能をプラグインとして扱い、外部から登録・呼び出します。openaiのfunction callingはアプリ側のカスタム関数をモデルに呼ばせる仕組みです。mcp（model context protocol）は、serverがtools・resources・promptsを公開し、clientがそれらを利用する構造です。いずれの場合も、ツール実装はgodagentの外部にあり、godagentは単にプラグインの呼び出し側となります。 どのパターンも、外から見た一か所管理のわかりやすさは残しつつ、中身は分けやすくする、という方向です。semantic kernelのkernelのように中心はあるが、プラグインや履歴は別クラス、という形も典型です。 セキュリティ上の注意点 全部が一つに集まると、安全の面でもリスクが出やすくなります。 権限分離の欠如 : すべての処理を1つのオブジェクトが担うと、権限チェックが一元化され分散しません。結果として、万が一認可ミスやバグがあればアプリ全体に影響します。最小権限の原則を適用し、機能ごとに権限を細分化することが重要です。 秘密情報管理 : apiキーやモデルトークン、データベース接続情報などの機密情報をgodagentに埋め込むと、漏洩時の影響が大きいです。秘密は分離管理し、環境変数やシークレットマネージャー経由で参照すべきです。 プロンプト/設定漏洩 : プロンプトやシステムメッセージに機密データを含める運用は危険で、ゴッドオブジェクト化でこの情報がさらに集中します。アクセスログでプロンプトを平文保存せず暗号化や取り扱い規定を設ける必要があります。 監査ログ不足 : 動作が一箇所で行われるため、誰がどの機能をいつ呼んだかを個別に追いにくくなります。運用では、ユーザid・セッションid・コンテキストをログに含め、監査証跡を確実に取ることが重要です。 過剰な権限 : ゴッドオブジェクトにより処理が多くの機能を持つと、意図しない行動をするリスクが増大します。各機能呼び出しには最小権限の許可を設定し、与える権限を厳しく絞る必要があります。 入力妥当性検証 : システム全体を一箇所が管理するため、どの入力がどの機能に渡されるか監査が必要です。特にマルチテナント環境では、他テナントのデータを誤って参照しないよう、入力検証を徹底します。攻撃者が悪意ある命令を注入してデータ漏洩や不正行動を誘発する可能性を抑える工夫が必要です。 実例調査 世の中のllm向けライブラリを見ると、中心を一つに見せつつ、中は分けていく例が増えています。最初は一つに見えるが、育つほど分ける、という方向に寄せていく例が多いです。 semantic kernel (microsoft) : kernelオブジェクトがモデル呼び出しとプラグイン管理を担う中心コンポーネントと位置づけられています。開発者はkernelにaiサービスやプラグインを登録し、依存性注入で単一インスタンスを共有する設計となっており、一見ゴッドオブジェクト的ですが、プラグインは独立クラスであり、kernelは実行の中心点に留めています。 openai agents sdk : 専門化したエージェントへの処理委譲や、エージェント間のhandoffsを実装しやすくする構成を推奨しています。複数の専門エージェントを組み合わせる設計が想定されており、単一の巨大エージェントを作ることは推奨されていません。 langchain agents : 近年の実装では、内部でlanggraph、ワークフローグラフを使い、プロンプトや状態の分離を図る設計が増えています。各エージェントはapi呼び出しやツール実行をノードとして扱い、ノード化しやすい構造になっています。 autogpt / babyagi (2023-2024年頃の初期バージョン) : これらの初期バージョンでは、agentクラスがゴッドオブジェクト的に作られていることが多かったです。具体的には1つのagentでplan/exec/tool全て処理するケースです。後続のコミュニティ版では機能を分割し、taskmanagerやmemorymanagerを導入する流れがあります。 なお、規制産業（金融や医療など）では、権限の分離と監査性の確保が重要視される傾向があります。複数の機能を一つに集める設計より、役割ごとに分けた構成が好まれる場合が多いです。 短期～中長期の推奨事項 短期的対応 : まずはgodagentのような入口を一つ残しつつ、中身はサービスやヘルパーに任せる形から始めるとよいです。特に、ツールの実行、誰に何をさせるか、秘密の情報は、早めに分けます。プロンプトは型を決めて版を付け、出した結果は記録しておきます。バイブコーディングの速さは残しつつ、急な肥大を抑えられます。 中長期的対応 : 流れ全体をワークフローツールや状態機械で表し、司令塔と仕事別のエージェントに分けていく計画を立てます。ci/cdに品質と安全の関所を入れ、テストと攻撃想定の練習を回します。権限分離や監査性のガイドラインは、レビューの話題出しに使えます。 参考資料 https://learn.microsoft.com/en-us/semantic-kernel/overview/ https://platform.openai.com/docs/guides/function-calling https://github.com/modelcontextprotocol/specification https://python.langchain.com/docs/concepts/architecture/ https://www.nist.gov/itl/ai-risk-management-framework https://en.wikipedia.org/wiki/god_object https://en.wikipedia.org/wiki/vibe_coding"
  },
  {
    "title": "DRY修正とは何か──言葉の意味と進め方を紐解く",
    "url": "/blog/dry-refactoring-technical-report/",
    "description": "DRY, Don't Repeat Yourselfとは、コードや仕様・ドキュメントなどに散らばる知識の重複を減らす設計の指針である。本記事ではDRY修正を、そうした重複を見つけ、抽出・ライブラリ化・テンプレートや設定への寄せ集めなどで解いていくリファクタリングと設計判断と定義し、静的解析・レビュー・メトリクスによる検出、手法ごとのトレードオフ、LLM/AI 開発で増えやすい重複、安全な手順とテスト、ツール・CI、チームでの続け方までを要約してつなぐ。WET や行き過ぎた抽象化にも触れ、ゴールは原則の盲信ではなく重複コストと設計コストのバランスだと締めくくる。",
    "tags": [
      "DRY",
      "リファクタリング",
      "ソフトウェア設計",
      "LLM",
      "静的解析"
    ],
    "date": "2026年4月5日10時30分",
    "content": "dry修正とは何か──言葉の意味と進め方を紐解く 現場ではdry に反しているから直してほしい、dry 修正をお願いしたいといった会話がよく出てくる。一方で、dry 修正と一言で述べても、何をどこまでやればよいのかは人によって幅がある。 この記事の目的は、次の問いに答える形で内容をつなげることである。 dry 修正とは具体的に何を指すのか どのような重複が問題となり、どう見つけるのか 修正時にどのような手法があり、何に気をつけるのか llm や ai を使う開発では、何が足を引っ張りやすいのか 以下では、まず dry 原則の意味を押さえたうえで、修正が指しうる作業の範囲を広げて見ていく。そのあと検出・手法・実践手順・ツール・チームの仕組みへと進む。 まず押さえる：dry 原則と「dry 修正」のイメージ dry, don't repeat yourselfは、プログラミングにおいて情報や知識をシステム内の単一箇所に確実に保持し、重複を排除するという設計の指針である。1999 年に andy hunt らのthe pragmatic programmerで広く知られるようになり、同じルールが複数箇所にばらけていると変更コストや不整合が増えやすいという問題意識が背景にある。対比として wet, write everything twice などやdry の行き過ぎへの批判も議論されている。 dry 違反とは、同じビジネスルールやロジックが複数箇所にちぐはぐな形で実装されている状態を指すことが多く、保守性を下げる要因となる。対象はソースコードに限らない。設計図・データ定義・ドキュメント・プロンプトなど、知識が重複して散乱している状態も dry の観点では問題になりうる。特に llm や ai 支援の開発では、既存コードを十分参照できないまま似た処理が増えやすく、気づかないうちに重複が広がりやすいという側面がある。 ここまでを踏まえると、この記事でいう dry 修正 は、ざっくり次のような意味にまとめられる。 dry 原則に従い、システム内の知識の重複を減らすための設計判断とリファクタリング、すなわち抽出・共通化・整理のこと。 その中には、静的解析やレビューで重複を見つけること、関数やモジュールへの抽出、ライブラリ化、設定への寄せ集めなど、さまざまな具体策が含まれる。ただし抽象化には結合度の上昇などのトレードオフもあるため、チームやプロダクトの状況に応じて、どこまで dry に寄せるかを調整することも、健全な修正の一部である。 用語の整理：重複の種類と、dry がきつく効くところ dry 原則, don't repeat yourselfは、情報の重複を減らし、知識をできるだけ一意に保つというソフトウェア設計の考え方である。コピー＆ペーストの禁止だけではなく、ビジネスルール・データ定義・ドキュメント・テストなど、知識の重複全般を減らすことが狙いだと言われている。 dry と対になる発想として、wet, write everything twice や write everything thrice などや aha, avoid hasty abstractions なども知られている。wet は、文脈ごとにあえて重複を残し独立性を保つ考え方である。例えばバリデーションがサービスごとに微妙に違うなら、無理に一つにまとめないという具合である。dry は万能ではなく、重複がはっきりしていて、まとめてメンテナンスする前提がそろっているときに共通化が効きやすいという整理がよくされる。 重複の種類として、次のような分け方がある。 コード重複：同じ、またはよく似た処理が複数箇所にある状態。sql 文や関数のコピペなど。必ずしもすぐ dy 違反とは言えないが、抽出や共通化の候補になりやすい。 設計重複：似た役割のコンポーネントが分散している状態。例として、差の小さいマイクロサービスが並んでいるなどがある。 知識重複：ルールや仕様が複数の実装に分散している状態。dry がもともと強く効かせたいのはここで、例えば同じ認証ルールがサービスごとに別実装されるのは典型的な知識重複として、どちらかに寄せるあるいは共通モジュールにまとめるといった修正の対象になる。 テンプレートやジェネリクス、db の正規化など、言語や設計の世界でも「一か所に寄せる」発想は広く使われており、知識重複を減らすことは信頼性や保守性に効く、という説明がよくされます。 dry 違反をどう見つけるか 重複を洗い出す主な経路は、静的解析ツール、コードレビュー、メトリクスである。 静的解析ツール sonarqube、pmd/cpd、spotbugs、eslint などには、コピペに近い重複コードを検出する機能があることが多い。sonarqube は言語横断で類似コードを拾い、重複率、duplication% としてレポートする例もある。github の sider や clang-tidy なども、クローン検出に近い機能を持つ。コード行のうち重複が占める割合を数値化し、閾値を超えたら課題にするといった運用が可能である。 メトリクス 重複率のほか、保守性指数やテストカバレッジとあわせて見ることがある。codacy などでも重複が多いとサイズ・複雑度・工数が増えやすいと説明されており、duplication はチームの健全性を見る指標の一つとして扱われる。リファクタリングの前後で重複率がどう変わったかを追うのにも使える。 コードレビュー レビュー項目に同様の処理や定義が他にないか、文字列や定数のコピペが増えていないか、共通化の候補はないかを入れておくと、ツールが拾いにくい知識重複にも気づきやすくなる。llm が出したコードは、既存ロジックと重複していないか、意識的に確認しておく価値がある。 動的解析 テストのカバレッジと照らして、重複したコードが実際にどれだけ実行パスに乗っているかを見るといった使い方もある。 ソースコード以外にも、データベースや api 仕様・ドキュメントの変更履歴を追うとよいという話がある。clonetracker のように git と連携していつどこでコピペが増えたかを可視化する仕組みもあり、機能追加のたびに重複の妥当性を話し合いやすくなる。 dry 修正で取りうる手法（とトレードオフ） dry 違反を減らす代表的手法を、短く整理する。いずれもメリットだけでなくデメリットもあるので、それがまさに dry 修正の設計判断になる。 手法 概要 メリット デメリット 抽出, extract method/class 重複処理を関数・メソッド・クラスに切り出す。 コード量が減り、変更箇所がまとまりやすくなる。再利用が明示的になる。 呼び出し元と抽出先の結合が強まる。影響範囲が広がる。過剰な一般化のリスクがある。 共通ライブラリ化 共有処理をパッケージやライブラリにまとめる。 一か所のメンテで複数機能に反映しやすくなる。 バージョン管理や互換維持が必要。単一障害点やモノリス化の懸念がある。 テンプレート / ジェネリクス 型パラメータやテンプレートで似たコードをまとめる。 インラインの重複を減らせる。 言語に依存する。複雑になると読みにくくなる。 メタプログラミング マクロやコード生成で共通部分を埋め込む。 強い抽象化で大量の冗長を削れる。 学習コストとデバッグ難度が上がりやすい。 dsl ドメイン向けの言語や記法でルールを一か所に寄せる。 仕様の言い回しを揃えやすくなる。 設計・実装コストが高くなりがち。 ポリシー化 / 設定化 定数やルールを設定ファイルや db に出す。 環境差分やルール変更を一か所で扱いやすくなる。 コードと設定の対応を追う手間が増える。 単純な抽出やライブラリ化は手順が分かりやすく効果も出やすい一方、dsl やメタプログラミングはコストとリスクが大きくなりがちである。抽象化すれば変更は一か所にまとまりやすいが、依存が強くなり小さな変更でも波及しやすいというトレードオフがよく言われる。マイクロサービスでは、あえて重複を残してサービス間の独立性を優先するという選択もある。 設計例の図示（mermaid） 機能 a と b が同じ処理 x を二重に持っているとき、共通モジュールに寄せるイメージである。 flowchart lr subgraph before a[機能a] --> d(重複処理x) b[機能b] --> d end subgraph after a --> e(共通処理x) b --> e end after では共通モジュールだけ直せば a ・ b の両方に反映しやすくなる。 llm / ai 支援コーディングで増えやすい重複 ai でコードを書く場面では、通常の開発とは少し違う重複リスクがある。llm は開発者が書いた既存の関数やライブラリを常に参照しているわけではないので、同じロジックを再生成させてしまうことがある。copilot 利用者の抽象化に時間をかけたのに、ai がすぐに似たコードを出すので既存を直すより生成し直した方が早いという話は、その緊張関係を表している。 また、文脈が長く保持されないため、チームが過去に書いた汎用コードを踏まえずに、別ファイルや別サービス向けに再び一から似た実装が増えることもある。プロンプトがバラバラだと、プロンプト自体の重複やテンプレ肥大化も起きやすく、出力の構造も似通いがちです。 一方で、将来の分岐が大きい、チームやリリースのタイミングがずれるといった状況では、無理に一つにまとめず独立した記述を残した方が保守しやすいという指摘もある。ai がdry を徹底せよと言ってきても、要件を踏まえて判断することが大切である。 ai 支援では開発速度が優先されがちなので、リファクタリングを計画しテストで守りながら重複をコントロールする仕組みを用意しておくというのが dry 修正の現実的な線になる。 実践的な進め方とテスト dry 違反が見えたら、次のような順序で進めると安全です。 重複の識別と分類 知識重複か、コードの表面的な重複かを分ける。知識重複は優先度を上げやすく、単なる定型の繰り返しは次のメンテのタイミングまで待つという切り分けもある。コード以外に、ドキュメント・db 定義・プロンプト設計も洗い出しの対象にする。 影響範囲の評価 バージョン、権限、環境、他機能への波及を確認する。共通処理にまとめると他モジュールへ影響が広がる場合は、分割やコピー維持を一時的に選ぶこともある。 ステージングやローカルでの検証 変更後も振る舞いが変わっていないか確認する。ai が生成したコードを直す場合は、仕様やテストとの整合も確認する。テストが薄いなら、まず既存動作を記録するリグレッションテストから始める。 ユニット / 統合テストの充実 まとめたロジックが元々のケースをすべて満たすかをテストで担保する。境界条件やエラー処理が落ちていないかも見る。 バックアップとロールバック 大きな変更では戻せるポイントと手順を決めておく。ci で落ちたら差し戻せるようにしておくと安心である。 振り返り 静的解析の重複メトリクスやカバレッジの変化を見て、レビューで新たな重複が入っていないか確認する。 ai を多用する開発では、モデルやプロンプトの変更が続きやすいので、ci で重複や定型パターンをある程度自動チェックする試み、evals や promptfoo なども参考になる。 コード例：重複除去のイメージ python と typescript で、insert が重複していた例を共通関数に寄せると次のようになります。 # before: 重複したsql挿入処理 def add_user(id, name): db.execute(f\"insert into users (id, name) values ({id}, '{name}')\") def add_product(id, name): db.execute(f\"insert into products (id, name) values ({id}, '{name}')\") # after: 共通関数に抽出してdry化 def insert_record(table, id, name): db.execute(f\"insert into {table} (id, name) values ({id}, '{name}')\") def add_user(id, name): return insert_record(\"users\", id, name) def add_product(id, name): return insert_record(\"products\", id, name) // before: 重複したsql挿入処理 function adduser(id: number, name: string) { db.execute(`insert into users (id, name) values (${id}, '${name}')`); } function addproduct(id: number, name: string) { db.execute(`insert into products (id, name) values (${id}, '${name}')`); } // after: 共通関数に抽出してdry化 function insertrecord(table: string, id: number, name: string) { db.execute(`insert into ${table} (id, name) values (${id}, '${name}')`); } function adduser(id: number, name: string) { return insertrecord(\"users\", id, name); } function addproduct(id: number, name: string) { return insertrecord(\"products\", id, name); } ツール・自動化・メトリクス dry 修正を支える例は次のとおりです。 重複コード検出 前述の静的解析に加え、github actions などの ci 用クローン検出もあります。java なら pmd cpd、js/ts なら eslint のルールなど。ai 向けレビューで dry チェックを掛け始めている製品も出てきています。 ci / cd ルール 重複率が閾値を超えたら失敗にする、pr テンプレに重複の確認や共通化の検討をチェック項目として入れるといった運用である。 メトリクス 重複率以外の指標や、テストカバレッジとのバランスも見る。codecov などで可視化し、修正の効果を共有しやすくする。 llm 支援ツール promptfoo や langfuse などで、プロンプト内の重複フレーズ検出や、生成コードの冗長パターン解析、ci 連携が進んでいるという話がある。 チームで続けるために dry を個人の努力だけにしないために、次のような仕組みが効きます。 コード所有権：共通ライブラリやインフラの責任者を決め、同じ重複に複数人がバラバラに手を出さないようにする。 レビュー基準：pr のチェックリストに dry 関連の項目を入れる。違和感のある重複は必ずコメントできるようにする。 教育とガイドライン：dry の意義に加え、抽象化しすぎの弊害やあえて複製する例も共有し、バランスの取り方を揃える。 ドキュメント：プロンプトや設定をバージョン管理し、再利用できるフレーズ集を用意する。 ci だけに頼らず、ペアプロやペアレビューで ai 生成コードの冗長さを人が拾うのも有効である。 チェックリストと、ゴールの持ち方 短期的には、はっきりした重複から少しずつ手を付け、テストと ci の重複検出を並行して強くしていく方法がある。ai を使うなら、プロンプトに既存の関数やライブラリを明示させる、重複生成を避ける指示を足すといった設計も有効である。 中長期的には、共通サービスや api、dsl、ポリシー管理などでビジネスロジックを一か所に寄せていく検討と、レビュー文化やテンプレートの整備が効いてくる。 pr 用チェックリストの例： 新規のコードやドキュメントに、既存と重複するロジック・定数・設定がないか確認したか 似た機能が他にある場合、共通化を検討し、残すならコメントで理由を書いたか 抽出・統合後もテストが通るか、必要なら追加・修正したか 静的解析で duplication の問題が出ていないか確認したか ai 用プロンプトが冗長になっていないか、テンプレ再利用できないか見直したか 最後に、ゴールは dry という言葉を盲信することではなく、重複による将来の手直しコストと抽象化や統合のコストのバランスを取ることだと考えてよいと思う。原則を手がかりとしつつ、ビジネスとメンテの計画に沿って設計していくという姿勢が、実務での dry 修正の落としどころになる。 参考資料、優先度順：以下は dry の原典やブログ、oss 関連などを参照して整理した内容である。詳細は各 url で確認できる。 https://en.wikipedia.org/wiki/don%27t_repeat_yourself https://www.faros.ai/blog/ai-generated-code-and-the-dry-principle https://thevaluable.dev/dry-principle-cost-benefit-example/ https://blog.codacy.com/code-quality-metrics https://arxiv.org/html/2502.04073v1 https://news.fixstars.com/3891/ https://dev.to/rakbro/beyond-dry-when-ai-generated-duplication-improves-maintainability-1daf"
  },
  {
    "title": "Webの更新もマークダウンで良いのでは？Markdownについて調べてみた。Markdown中心のMovable Type的発想で更新できるアプリをつくってみようかな",
    "url": "/blog/markdown-origins-to-ai-content-architecture/",
    "description": "AIの登場でMarkdownファイルに触れる機会が増え、Web更新も「もうMarkdownでよいのでは」と感じる場面が多くなりました。そうした流れの中で、WordPressの代わりに、現代的なMarkdown中心のMovable Type的発想で更新できるアプリを作れないかと考えるようになりました。そこであらためて「そもそもMarkdownとは何か」を整理したくなり、本記事を書いています。",
    "tags": [
      "markdown",
      "frontmatter",
      "AI",
      "ドキュメント",
      "考察"
    ],
    "date": "2026年3月31日22時25分",
    "content": "markdownがどう進化して、今なぜ重要で、実務でどう使うか aiの登場でmarkdownファイルに触れる機会が増え、web更新もmarkdownで足りるのではと感じる場面が増えました。そうした流れの中で、wordpressやmovable typeの代わりに、現代的なmarkdown中心のmovable type的発想で更新できる仕組みを考えています。本稿は、その前提としてmarkdownの起源・仕様・周辺フォーマット・ai時代の扱いやすさ・実務での構成の一例を順に整理するメモです。 markdownは2004年に、読みやすいプレーンテキストを構造的に妥当なhtmlへ変換する考え方で登場しました。その後は実装差が広がりましたが、書き方と変換結果をそろえる共通ルールのcommonmarkと、github上で表やチェックリストなどを扱う拡張ルールのgfmによって整理が進みました。 さらに実務では、markdown本文にui部品やjavascript記述を混ぜられるmdx、本文先頭のメタ情報を機械的に読めるfrontmatter、そして項目ルールを先に定義して入力ミスを自動検知する型つきコンテンツ層へと発展しています。つまりmarkdownは、単なる記法から「検証できるコンテンツ基盤」へ進化してきたといえます。 2020年代後半のmarkdown運用では、htmlの書き出しだけでなく、frontmatterとschemaを組み合わせて、項目・型・入力ルールを検証できる情報として扱う設計が増えています。あわせて、人間向けhtml、llm向けmarkdown、検索索引、構造化データjson-ldへ展開する運用も広がっています。 astroは、その流れを実装しやすくする代表例です。content collectionsでfrontmatterを整理し、zodで検証し、content layer apiでローカルとリモートのコンテンツを同じ形で読み込める流れが示されています。 ai時代にmarkdownが再評価される理由は、llm入力としての境界が見出し・段落・コードフェンスなどで取りやすいこと、html→markdownやpdf→markdownなど変換・抽出パイプラインの共通中間表現になりやすいこと、git差分・レビューにプレーンテキストとして強いことが、ベンダーのプロンプト指針や実運用に噛み合っているためです。具体例として、openaiやanthropicのガイド、next.jsのエージェント向けローカルmarkdown docs配布が挙げられます。 markdown中心の更新アプリを設計するとき、入力形式や方言差がそのままバグや表示ズレになります。次の節では、なぜcommonmarkやgfm、rfcの話がその前提整理に効くのかを、歴史と仕様の流れで押さえます。 起源と仕様の進化 markdownの原点 ― 2004年 markdownは、john gruber により「web writers 向けの text-to-html conversion tool」として2004年に提案され、可読性の高いプレーンテキストから構造的に妥当なhtmlを生成することを設計思想としていると述べられています。 ここで重要なのは、原典のmarkdownが万能な文書形式としてではなく、webライター向けのシンプルな text-to-html 変換道具として出発した点です。少なくとも出発点の思想は、「何でもmarkdownで表現する」ことではなく、読みやすいプレーンテキストでweb向け文章を書くことにありました。 この設計は、のちの「静的サイトジェネレーター」「ドキュメントサイト」「ai入力用中間表現」にもそのまま転用可能で、後述の「単一ソース→多出力」アーキテクチャと整合します。 ローカルルールの増加と、仕様化による収束：commonmark／gfm markdownは「非形式的な記述＋参照実装」に依存していたため実装が分岐しやすく、これを解決する目的でcommonmarkは「曖昧さのない仕様」＋「実装を検証する包括的テスト」を提案しています。 commonmark specは版管理されており、少なくとも 0.13・2014-12-10付から 0.31.2・2024-01-28付まで、仕様とテストの改良が継続していることが公式ページに明示されています。 一方、github上で広く使われるgfm＝github flavored markdownは、commonmarkをベースにした「formal specification」として定義され、2019-04-06版の0.29-gfmが明記されています。 この流れは、markdownをできるだけ簡潔に保ちたい原典の思想と、表・タスクリスト・脚注のような機能を求める実務の要求がぶつかった結果とも読めます。commonmarkやgfmは、原典の単純さをそのまま守るというより、広がってしまった実装差を現実的にそろえる試みでした。 「ファイル形式としてのmarkdown」を支えるietf/iana ― 2016年 2016年、rfc 7763により text/markdown メディアタイプが登録され、markdownはhtmlなどへ変換可能なプレーンテキスト形式として定義されました。 rfc 7763では、ianaに markdown variants レジストリ が設けられ、variant識別子によってmarkdownのローカルルールを区別する仕組みが定義されています。 このレジストリは2015-10-22に作成され、original、gfm、commonmark、pandoc、multimarkdownなどが登録されています。 またrfc 7764は、markdownの設計哲学、安定化戦略、および登録例についての補足ガイダンスを提供しています。 仕様進化の要点まとめ ― mermaidタイムライン timeline 2004 : markdown 公開（john gruber, daring fireball） 2014 : commonmark プロジェクト公開（仕様とテストスイート） 2015 : iana markdown variants registry 作成（2015-10-22） 2016 : rfc 7763（text/markdown 登録） 2016 : rfc 7764（markdown ガイダンス文書） 2017 : github が github flavored markdown formal specification 公開 2018 : mdx 公開（markdown＋jsx） 2019 : github flavored markdown spec 0.29-gfm（2019-04-06） 2020 : stack exchange commonmark 移行完了（2020-06-20） 2024 : astro 5 beta 公開（content layer api 含む） 2024 : llms.txt proposal 公開（2024-09-03） 2025 : mistral ocr 公開（markdown出力対応） 2025 : readerlm-v2 公開（html→markdown変換研究） 2026 : next.js 16.2 公開（agents.md とローカルmarkdown docs 同梱） 上記の各節は、markdown、commonmark、gfm、rfc、iana、mdx、stack exchange、astro、llms.txt、mistral ocr、readerlm-v2、next.jsなどの原典や公式情報に基づいて整理しています。細部や最新情報を確認したい場合は、参考リンク先の原文を参照してください。 近年の「markdown周辺フォーマット」発展 正本をmarkdownに置く構成では、本文だけでなくメタデータや型検証、編集uiまで含めて設計します。次の各節は、その部品候補として実務でよく出てくる周辺フォーマットを並べたものです。 言い換えると、ここから先で扱うmdx、frontmatter、content layer、git-backed cmsは、原典のmarkdownそのものというより、markdownを正本に据える実務の中で積み重なってきた拡張層です。 mdx：markdown + jsx + import/export ― 2018年〜 mdxは、文章の中に動く部品を入れられる書き方です。ふつうの説明文に、注意ボックスやタブを同じページで置けます。mdxは、markdown本文の中にjsxやjavascript式、esmの import / export を含められる「authorable format」として説明されています。 この性質は、ドキュメントサイトが「文章」と「uiコンポーネント、アラートやタブ・グラフなど」を同一ファイルで共存させたい場合に強く効きます。docusaurusはmdxのビルトインサポートを明記し、markdownファイルをmdxコンパイラでreactコンポーネントへ変換して「インタラクティブなドキュメント」を可能にすると説明しています。 next.jsも、mdxを「markdownのスーパーセット」として扱い、ローカル／リモートmdxをサーバー側で取得してhtmlへ変換できる、と公式に述べています。 frontmatter：本文の上に「メタデータ」を載せる慣習 ― jekyll起源と拡散 frontmatterは、記事のいちばん上に置く「説明カード」です。タイトルや日付、タグを先に書いておくと、機械が整理しやすくなります。 yaml frontmatterは、jekyllで普及した「markdownファイル先頭に置くキー・バリューのメタデータブロック」として、github docsの公式執筆規約でも説明されています。 静的サイトの代表格であるhugoは、frontmatterを「コンテンツの説明・拡張・関係付け・公開構造の制御・テンプレ選択に使うメタデータ」と定義し、yaml/toml/jsonのいずれでも書けるとしています。 ここで重要なのは、frontmatterが「人間のための装飾」ではなく、ビルド・検索・並べ替え・関連付け・権限制御など、機械処理のためのセマンティクス的な意味を担う点です。 content collections / content layer：markdownを「型付き・クエリ可能」にする ― astro markdownや記事データを「決めた形」にそろえ、プログラムから探したり並べたりしやすくする仕組みです。ルールに合わない項目があれば、だいたいビルドのときにエラーになり、公開前に気づけます。content collectionsでは、公式の説明どおり、zodなどのスキーマでfrontmatterやエントリを検証し、必要な項目だけを揃えたデータとして扱えます。 そのうえで、2024年の公式ブログでは、従来の「スキーマ・frontmatterの検証・typescript向けの検索api」に加え、ローカルだけでなくリモートのソースも同じ考え方で扱う「content layer」へ広げる、という方向が示されています。 content loader（content layerの入り口）のドキュメントでは、load()のなかで取得（fetch）→スキーマで読み取り・検証→データストアを更新までをまとめて担当すること、zodのスキーマを渡して検証に使えることも書かれています。 記事用markdownをルールどおりのデータにそろえ、ビルドの段階でミスに気づきながら、サイト側から一覧・参照・並べ替えしやすくする仕組みです。content layerは、そのやり方をローカルのファイルだけでなく、リモートから取ってきたコンテンツにも広げる、というイメージです。 git-backed cms：markdownを「gitのままui編集」する ― tinacms 昔のブログcmsのように記事を書いて公開する体験に近い一方で、本文はmarkdownファイルのままgitに残す、という発想です。movable type的な「下書き・公開・テンプレ」との対比で言えば、記事の正本をリポジトリ上のmarkdownに置き、ビルドやデプロイでhtmlへ出す、という現代的な形に近い例として読めます。 文章ファイルをそのまま残したまま、見た目で編集できる仕組みです。編集した内容はgitに保存されるので、だれが直したかあとで追えます。特別なデータベースに閉じこめられないので、引っこしもやりやすいです。 tinacmsは、自身を「オープンソースのgit-backedヘッドレスcms」と説明し、コンテンツをmarkdown/mdx/jsonファイルとしてgitで保持し、専用dbにロックインしないと明言しています。 さらに、tinacmsはgraphql apiによりmarkdownコンテンツをクエリ可能にし、参照やライブプレビュー等をreadmeで示しています。 post.author.firstname のようなフィールド参照が例として挙げられています。 astro公式ドキュメントにも、tinacmsを「git-backed headless cms」として統合手順が掲載されており、静的サイト系フレームワークの運用文脈で「markdown＋git＋編集ui」が一般化していることが読み取れます。要するに「cmsの使いやすさ」と「git運用の透明性」を両取りする仕組みです。 ai時代にmarkdownが強い理由 プロンプトやドキュメントでmarkdownを扱う機会が増えたからこそ、なぜ境界が読みやすいのかを押さえておくと、自分のエディタやプレビュー設計にも戻しやすいです。 ただし、これはmarkdownが万能という意味ではありません。複雑な構造や厳密なデータ交換では、xml、json、sql、専用cmsの方が向く場面もあります。ここで見たいのは、そうした形式がある中でも、markdownがどの役割で強いのかという点です。 llmが「境界」を読む：markdownはセクション分割の最小単位を備える openaiはプロンプトエンジニアリングのガイドで、markdownとxmlタグを組み合わせて「論理的境界」を明確にできると説明しています。またopenaiのgpt-4.1向けガイドは、区切りdelimitersの推奨として markdown→xml→json の順で述べ、markdownでは見出し階層、コードはバッククォート／コードフェンス、リストの活用を推奨しています。 これは「モデルがmarkdownを特別視している」というより、見出し・段落・箇条書き・コードブロックという境界が、llmにとっても人間にとっても解釈しやすい、という実務上の帰結として理解できます。 anthropic側も、複雑なプロンプトはxmlタグでコンテンツ種別をinstructions/context/inputなどに分けると誤解が減ると述べています。markdown単体ではなく、必要ならタグも併用する設計が現場で増える背景になります。 つまり実務では、まずmarkdownでわかりやすく構造化し、必要なところだけxml/jsonで厳密化するのが有効という話です。 トークナイゼーション観点：空白の有無より「再現可能な構造と繰り返しパターン」 トークナイザは、文章をaiが扱いやすい小さな単位に分ける仕組みです。日本語はスペースで単語を区切らないことが多いですが、最近の方式は空白の有無に強く依存しません。sentencepieceのように、単語分割前の生文（raw sentences）から直接学習できるものもあります。 bpe（byte pair encoding）は、よく一緒に出る文字の並びを少しずつ1つのかたまりにまとめる方式です。こうしてできた「サブワード」を使うことで、語彙サイズと文の長さのバランスを取りながら効率よく処理できます。 この点でmarkdownは有利になりやすいです。 # 、コードフェンス、 - などの記号が繰り返し現れ、空行で段落が区切られ、見出しで階層も明示されるため、トークン列の中に構造の手がかりが入りやすいからです。要するに、 markdownは日本語でも構造の目印が多く、aiが解釈しやすくなりやすい ということです。 html/pdfなど「ノイズの多い入力」からの共通中間表現としてのmarkdown ai時代の大きな変化は、markdownの役割が広がったことです。markdownは、人が直接書く形式であるだけでなく、htmlやpdfから内容を抜き出したあとに整える「共通の中間形式」としても使われるようになっています。 たとえばmistral ocrは、pdfからテキストや画像を抽出して、markdown fileとして出力する例を公式に示しています。readerlm-v2の2025年研究でも、ノイズの多いhtmlをcleanなmarkdownやjsonに変換することが、llmのgroundingに有効だと説明されています。 つまり、webやpdfをいったんmarkdownに変換してからrag・検索・qaに回す流れが、前処理の定番になりつつあるということです。 git差分・レビュー・履歴管理：プレーンテキスト資産としての強さ markdownはプレーンテキストであり、gitの差分表示やレビューに向く、というのは経験則として語られがちですが、git側のドキュメントは「バイナリファイルは差分が出にくい／diffのためにテキスト化フィルタを用意する」という前提を説明しています。つまり、テキストであること自体が差分・マージ可能性を上げるという構造です。 この性質は、ドキュメントをwordやpdfの「成果物だけ」で残す運用と対比すると、ai時代により重要になります。なぜなら、llmへの入力だけでなく、人間のレビュー・履歴・再利用や再ビルドが同時に必要になるケースが増えたためです。 具体例： 利用規約や社内ルールをmarkdownで管理すると、どの文言を誰がいつ修正したかをgitで追跡できます。 api仕様を複数人で更新するときも、差分レビューとマージがしやすく、変更理由を残しやすくなります。 rag用のfaqや手順書を更新したとき、変更箇所を確認してから再インデックスできるため、影響範囲を把握しやすくなります。 障害対応手順の改訂履歴をコミット単位で残せるので、あとから「どの版で復旧できたか」を再現しやすくなります。 1つのmarkdownからhtml・ai向けmarkdown・検索索引を生成する運用でも、入力差分が明確なため再ビルド管理がしやすくなります。 2020–2026の採用事例：一部紹介（代表5例） 以下は、公式・一次情報を中心にした採用事例の一部紹介です。全件一覧ではなく、代表的な5例に絞って掲載します。markdownは一部ではなく、q&a、公式ドキュメント、aiパイプライン、フレームワーク運用まで広く使われていることが分かります。 分野 採用例：プロダクト／組織 何をどう使っているか 日付・明示があるもの q&aネットワーク stack exchange ネットワーク全体をcommonmarkへ移行し、2020-06-20時点で全サイト移行完了と明記 2020-06-20・完了 ドキュメント執筆規約 mdn web docs ベースラインとしてgfmを採用し、必要に応じ拡張を追加と説明 最終更新 2025-07-22 aiドキュメントパイプライン mistral ai pdfから「markdown file」へ抽出する例を公式ブログで提示 2025-03-06・記事日付はページ上で明示 「ai向け入口」の提案仕様 llms.txt・jeremy howard提案 /llms.txt を追加し、背景・ガイダンス・詳細markdownへのリンクを提供、さらにページのクリーンな .md 版生成も提案 2024-09-03 エージェント最適化・フレームワーク側 next.js・vercel next.js 16.2で agents.md をcreate-next-appに同梱し、 node_modules 内に「plain markdown」のバージョン一致docsをバンドルする、と公式ブログで説明 2026-03-18 採用例のうち、日本語一次情報として、mdnの日本語執筆ガイドのgfmベース、stack overflow日本語メタのcommonmark切替告知などが確認できます。markdownが単なる記法ではなく、人間向け表示とai向け処理を両立するものとして定着してきているわけです。 事例はあくまで代表例であり、自サイトではスタックや規模で最適解は変わります。次の章では、markdownを正本に置く前提での構成の一例を書きます。自分が考えているmarkdown中心の更新フローが、どの部品に相当するかの当たりにも使えます。 実務での構成を考える 前節の採用事例を見ると、markdownは「書き方」だけでなく、公開・検索・ai利用まで含む運用基盤として使われていることがわかります。実務構成にはcms中心、db中心、html中心などさまざまな形があります。ここではその中の一例として、markdownファイルを正本にして用途別に出力を分ける考え方を見ていきます。 movable type的にいえば、記事本文とメタを一度正本にまとめ、テンプレートやビルドで人間向けhtmlや付帯ファイルへ出し分けるイメージに近いです。gitとmarkdownを組み合わせると、差分とレビューも取りやすくなります。 「単一ソースの.md」から多出力を考える markdownを正本とする運用では、single source of truthを1つにし、そこから用途別に出力を分ける形が管理しやすくなりやすいです。 index.html と index.md を別原稿として二重管理すると、更新ずれや修正漏れが起きやすくなります。以下では、そのズレを減らすための一つの構成例を示します。 /llms.txt 提案も、サイトにllmフレンドリーな入口を置き、必要なら各ページのクリーンなmarkdown版をurlに .md 付与で持つことを提案しています。つまり、正本から用途別のmarkdownを派生させる発想そのものは、仕様提案側にも見られます。 一例としての生成ターゲット整理：index.html / index.md / llms.txt / search-index / json-ld index.html ：人間向けの表示。markdownの原典思想であるtext→htmlに直結します。 index.md （公開ディレクトリ内）：ローカル運用上の「派生物」で、規格名ではありません。ナビ・装飾を落とし、見出し構造と要点を保ってllmが読みやすい「クリーン本文」にする用途です。根拠としては、html→markdownやpdf→markdownがllm向け前処理として使われる流れ、readerlm-v2やmistral ocrに整合します。 llms.txt ：ルートに置く「案内板」。仕様提案として、背景・ガイダンス・詳細markdownへのリンクを提供し、コンテキスト制約やhtmlノイズ問題を緩和する狙いが明記されています。 search-index.json または pagefindバンドル：全文検索用の索引。pagefindは「静的ジェネレータの後に実行し、生成済みサイトに静的検索バンドルを出力する。索引は生成済みサイトから自動生成される」と説明しています。 json-ld：htmlに埋め込む構造化データ。json-ld 1.1はw3c勧告で、既存jsonに統合しやすいlinked data表現として説明されています。 この例で挙げているもののうち、規格として策定されているのはjson-ld＝w3c recommendationで、llms.txtは提案仕様、公開用の index.md はローカル規約です。 フォルダ構成例：ページ単位とサイト共通を分離 この一例では、 test240205content/ にすべてを詰め込むより、ページ単位の成果物とサイト全体の成果物を分けるほうが管理しやすいと考えます。 llms.txt はルート配置を想定しています。pagefindも「ビルド後にサイト全体を索引化する」フローです。 例： repo/ content/ # 正本・編集対象 pages/ test240205content/ index.md # source.mdでも可＝正本 public/ # ビルド出力 test240205content/ index.html # 人間向け index.md # llm向けクリーン本文・派生、ローカル運用例 llms.txt # サイト共通・提案仕様 search-index.json # 自前の場合 pagefind/ # pagefind採用時のバンドル群 一方、外部検索エンジン・クローラはリンク構造やサイトマップ等に依存することが多く、発見性は別途設計が必要になります。本稿では主題外のため深入りせず、llms.txtやsitemap等の一般論に留めます。llms.txtは「llmが読む入口」として別レイヤーを用意する発想です。 形式比較とllm可読性 ここでは数値順の絶対順位ではなく、llm入力としての扱いやすさを用途別に並べた目安です。用途が変われば順位も入れ替わります。 形式の役割別整理：markdown / mdx / frontmatter / json-ld / 検索索引 / sql 形式がいろいろ出てきたので、役割ごとにざっと整理します。どれが本文向きで、どれがメタデータ向きか、用途の違いがひと目でわかるようにまとめました。 補足として、astroは将来的にコンテンツ層の内部ストレージとしてsqlite＝libsqlを探索し、より強力なクエリを提供できる可能性に言及しています。これは「sqlがmarkdownの代替」というより、markdownを起点に「内部表現としてのdb」を使う方向です。 形式 主用途 強み 弱み markdown 本文・人間・llm 読みやすいプレーンテキスト→htmlへ変換可能、見出し/段落/コード等の境界が明確 ローカルルールの違い・拡張差が出やすい。commonmark/gfmで緩和 mdx 本文＋ui部品・react/jsx jsxやimport/exportで「コンポーネント混在文書」を作れる 構文が厳格でツール互換性が落ちやすい。commonmarkとの差を明示する製品も yaml/toml/json frontmatter メタデータ・機械処理 タイトル・更新日・タグ等を機械が確実に拾える。静的生成やナビ構築、権限、関係付けに使える 仕様は慣習でツール依存。型・必須制約が無いと破綻 schema・zod/json schema等 制約と検証 「入力uiで揃える」より強く、ビルド時/保存時に不正を排除できる。例：astro 導入コスト。スキーマ進化の設計が必要 json-ld 構造化データ・seo/機械理解 w3c勧告。jsonに馴染む形でlinked dataを表現し、webサービスの相互運用性に寄与 本文ではない。設計しないと冗長 検索インデックス・pagefind等 全文検索 静的サイトの出力物から索引を自動生成できる。pagefind フォーマットはツール依存。sqlとは別物 sql クエリ言語・構造化データ 検索・集計・結合に強い・構造化 本文の表現には不向き。llm入力としては冗長・限定的 llm入力としての「読みやすさ」の目安として、次のような並びで整理してもよい、という一例です。用途によって逆転は普通にあります。 markdown・本文：openaiが区切りとしてmarkdownを推奨し、見出し階層やコードフェンス、リストが境界理解に寄与するとしているため。 markdown＋明確なメタ領域・frontmatter：本文のmarkdownとメタのyaml等を分離でき、処理が安定する。github docsやjekyll、hugoがこの慣習を前提化。 xml・タグ構造：openai/anthropicともに構造化に有効と述べるが、本文表現としてはmarkdownより書き手負担が増えやすい。 json・構造データ：openaiは構造化され理解されやすいが冗長でエスケープが必要と述べる。データ交換には強いが長文本文には不利。 mdx：人間には強いが、ツール互換や厳密構文のコストがあり、llm入力としては安全なmarkdown本文より扱いが難しい場面がある。docusaurusがcommonmark/mdx差を説明しているのは、その現実の反映。 sql：クエリとして強いが、説明本文には向きにくい。astroの文脈でも内部dbで高度クエリとして語られ、文章媒体そのものとは別レイヤー。 検索インデックス・pagefindバンドル等：llmが読む対象というより検索実行用データ構造。pagefindも索引を手で作る必要がないとし、サイト向けの機械資産。 スペースや区切りのない生文字列：トークナイザが言語非依存化しても、境界情報が薄く、意図したセクション理解が難しい。構造と境界を推奨するベンダーガイドからの帰結。 推奨frontmatter項目とサンプルファイル ここまでで、本文形式と補助形式の役割、そしてllm入力としての扱いやすさを整理してきました。次は、markdownを正本にする更新アプリやサイトを組むときの、実装イメージの一例として、運用時にぶれにくいfrontmatter項目と最小のサンプルを示します。採用する項目は規模と要件で変えて構いません。 推奨frontmatter ― 汎用 frontmatterの設計にはいろいろな形があり、用途によって必要な項目は変わります。ここでは、その中でもサイト生成・検索・ai利用を一緒に考えるときに使いやすい、汎用的な一例を挙げます。 id … 不変id title description … 短い要約 slug … url制御 status … draft / published / archived など created_at / updated_at tags … 配列 category … 単一分類 canonical_url … 正規url source_url … 外部ソースがある場合 language … 例 ja visibility … public / private / internal related … 関連idの配列 github docsはyaml frontmatterを「バージョニング、メタデータ、レイアウト制御」に使い、さらにfrontmatterを検証するschemaが存在すると明記しています。またmicrosoftの.net docsテンプレは、 title/description/author/ms.date 等のメタブロックを要求しています。つまりfrontmatterの中身は用途ごとに違っても、必要な管理情報を先頭でそろえて扱う考え方自体は広く共有されています。 つまり簡単にいうと、frontmatterは飾りではなく、公開や運用に必要な管理情報です。項目の組み方は使い方しだいですが、主要なドキュメント基盤では「必要な項目を決めて入れ、ルール違反は検証で防ぐ」という考え方が広く使われています。 サンプル：正本 index.md ここまでで、frontmatter項目の一例を整理しました。次に、実際にどのような形で書くかをイメージしやすいように、正本となる index.md の最小サンプルを示します。 --- id: test240205content title: テストページ description: このページはmarkdown→多出力のデモです。 slug: test240205content status: published created_at: 2026-03-31t00:00:00+09:00 updated_at: 2026-03-31t00:00:00+09:00 tags: [\"demo\", \"markdown\", \"ai\"] language: ja visibility: public --- # テストページ ## 概要 ここに人間が読む本文を書く。 ## 仕様 - 箇条書き - コードブロック - 見出し階層 ```ts export const hello = \"world\"; ``` サンプル：派生 index.md ― ローカル運用例 llm向けに、ナビ・余計なui文言を落として、必要なら「メタ要約」を先頭に置く例です。提案であり標準ではありません。 # テストページ メタ: - id: test240205content - slug: test240205content - updated_at: 2026-03-31 ## 概要 ここに人間が読む本文を書く。 ## 仕様 - 箇条書き - コードブロック - 見出し階層 サンプル： /llms.txt ― 提案仕様 llms.txt提案は、背景・ガイダンス・詳細markdownリンクを決まった順序で置くこと、そして「ページのクリーンmarkdown版、url+.md」の併設も提案しています。 # サイト名 ## background このサイトは〇〇に関するドキュメントです。htmlは人間向け、markdown版はllm向けに最適化されています。 ## guidance - まず /docs/index.html.md を読んで全体像を把握してください。 - 仕様は各ページの「## 仕様」セクションにあります。 ## docs - /test240205content/index.html.md - /products/index.html.md - /api/index.html.md サンプル：json-ld ― htmlに埋め込む json-ldはw3c勧告で、jsonベースでlinked dataを表現し、既存jsonへの統合のしやすさを狙うと説明されています。 <script type=\"application/ld+json\"> { \"@context\": \"https://schema.org\", \"@type\": \"techarticle\", \"headline\": \"テストページ\", \"description\": \"このページはmarkdown→多出力のデモです。\", \"datemodified\": \"2026-03-31t00:00:00+09:00\", \"inlanguage\": \"ja\", \"mainentityofpage\": { \"@type\": \"webpage\", \"@id\": \"https://example.com/test240205content/\" } } </script> 検索インデックス：sqlではなく「索引データ」 pagefindは、静的ジェネレータが吐いたhtmlを後段で解析して、検索バンドル＝索引を生成する、と説明しています。つまり索引は検索のためのデータ構造で、sqlのような汎用クエリ言語によるデータベースそのものとは役割が異なります。 ただし、astroが「内部ストレージとしてsqliteを使う可能性」に言及しているように、コンテンツ管理レイヤの内部表現としてsql/sqliteが出てくることはあり得ます。これは検索インデックスとは別の話です。 以上が、markdown中心のmovable type的更新を考えるうえでの前提整理です。入力形式の歴史と標準、周辺フォーマット、ai時代の扱いやすさ、採用の広がり、そして正本markdownからの多出力の一例までを一通りなぞりました。 今回調べてみて、いま作ろうとしているアプリは、単にmarkdownを編集する道具ではなく、markdownを正本にしてweb公開やai利用へつなぐための基盤として考えるのがよさそうだとわかりました。何でもmarkdownに寄せるのではなく、markdownが向く部分を中心に据えつつ、必要なところだけ別の仕組みで補う。そうした現代的なmarkdown中心のmovable type的発想として整理するのが自然です。 astroと類似アプリ その発想を実装するスタックとして、本稿ではastroを何度も例に出しました。content collectionsやcontent layer、frontmatterの検証といった流れが、正本markdownからビルドや多出力へつなげる話と重なりやすいからです。ただしastroが唯一の正解ではありません。同じ方向性は、静的サイトやドキュメント基盤の別製品にも別の形で見られます。 hugoはmarkdownとfrontmatterを中心にした静的サイト生成の代表例の一つです。docusaurusはmdxを前面に置き、ドキュメントとui部品を同一リポジトリで扱いやすいです。next.jsはastroやhugoのようなコンテンツ特化基盤そのものではありませんが、mdxや独自のコンテンツ処理を組み合わせて、markdown中心の公開基盤を構成する選択肢としてよく使われます。採用事例でも触れたエージェント向けのローカルmarkdown docsは、その延長線上の話です。 tinacmsは静的サイトジェネレータそのものというより、git上のmarkdownやmdxを編集uiから触るgit-backedヘッドレスcmsの代表例に近いです。astroなどと組み合わせて、正本をファイルに残しつつ執筆体験を補う、という位置づけになります。 pagefindはコンテンツ基盤ではなく、ビルド後のhtmlから検索用の索引を作る部品です。本稿の多出力の一つである検索層を、既存の静的サイト出力に後付けしやすい例として覚えておくとよいです。 自分でアプリを組む場合も、これらの製品が担う役割を分解して、エディタ・検証・ビルド・公開・検索のどこを自前にするかを決める、という読み方ができます。 参考リンク 仕様と標準化 commonmark spec 0.31.2 github flavored markdown spec rfc 7763: the text/markdown media type iana markdown variants registry 実務運用の実例 astro content collections api astro content layer: a deep dive pagefind docs next.js 16.2 ai improvements next.js ai coding agents guide mistral ocr tinacms repository プロンプト設計の指針 openai prompt engineering guide openai gpt-4.1 prompting guide anthropic prompting best practices: xml tags 周辺技術と補足根拠 daring fireball: markdown mdx documentation jekyll front matter hugo front matter git documentation: git-diff llms.txt トークナイザと前処理の参考 sentencepiece neural machine translation of rare words with subword units (bpe)"
  },
  {
    "title": "巨大範囲の素数リストを高速生成し、π(x) / Gap / Density / Spiralで可視化できるRust製Windowsアプリ Sosu-Seisei-2",
    "url": "/blog/sosu-seisei-2-prime-generator-analysis-tools/",
    "description": "巨大範囲の素数リストを高速に作れるGenerator機能と、素数の性質を体験できる分析ツール群 π(x) / Gap / Density / Spiral機能を備えています。手軽に高校～大学レベルの素数の分布を確認できます。起動もWidnowsでexeを実行するだけです。専用ツールをUbuntuなどでビルドしなくてすぐにWindowsで体験できます。",
    "tags": [
      "Rust",
      "素数",
      "データ可視化",
      "Windows",
      "作ったもの"
    ],
    "date": "2025年12月16日22時6分",
    "content": "月額200＄にてcursorアプリ制作チャレンジをしています。課金1ヵ月目のプロダクトは「sosu-seisei-2」です。フルrust製のアプリケーションです。 巨大範囲の素数リストを高速に作れるgenerator機能と、素数の性質を体験できる分析ツール群 π(x) / gap / density / spiral機能を備えています。 手軽に高校～大学レベルの素数の分布を確認できます。 起動もwidnowsでexeを実行するだけです。 専用ツールをubuntuなどでビルドしなくてすぐにwindowsで体験できます。 githubのリリースページからexeをdlできます。ソースコードも公開しています。 https://github.com/riragon/sosu-seisei-2 https://github.com/riragon/sosu-seisei-2/releases/tag/exe 巨大な素数リストを作れるgenerator機能は、だいぶ高速化してあります。 10の11乗 （1000億）に含まれる素数は約41億個あります。 1分ぐらいで生成できます。 さらに100倍ぐらいのサイズも作れるはずです。 簡単にこの量のデータをローカルで扱えること自体が珍しいでしょう。 この素数リストを自分の python / rust / c++ / gpu処理などに読み込めば、独自の切り口で分析できます。 使い方は簡単です。数字の範囲を指定してrunするだけです。オプションなど細かい機能もあります。指定したフォルダーに書き出せます。last prime onlyは書き出さないモードなので、書き出したいときは☑を外しましょう。 素数のフォーマットはtext、csv、json、binaryなどを選べます。binaryにすると無駄がなくて速いです。 たくさんの素数が一瞬で自分のデスクトップに作られます。次に体験できる分析ツールを紹介します。 π(x)タグで素数の法則性を体験 π(x)タブでは、1からxまでに素数が何個あるか（π(x)）を数えてグラフにします。 あわせて、だいたいこれくらいになりそうという予想（x/log x）とも比較できます。 比較の見せ方は2通りあり、π(x)とx/log xを重ねて表示するモードと、π(x)をx/log xで割った比率を表示するratioモードがあります。 ratioモードでは、1にどれだけ近いかが1本の線で分かります。 素数はバラバラに出てきて、次に出る素数は当てられません。でも、たくさん集めて数えると大きなルールが見えてきます。体感できる不思議さはここです。xを大きくすると、予想に対する比率は全体として1に近づく傾向が見えてきます。ただし近づき方は一直線ではなく、上下にゆらゆら揺れます。 [caption id=\"attachment_3190\" align=\"alignnone\" width=\"800\"] 図：1〜100 のグラフ 1〜100の範囲で、実際の素数の個数 π(x) が予想 x/log x より多めに出ている様子を示します。 比率 π(x)/(x/log x) は 1.1513 で、予想より約15%多い状態です。 小さい範囲では揺れが大きくなります。 [/caption] 素数1個ずつは気まぐれみたいなのに、全体ではちゃんと決まりがあります。 実は単純なx/log xという予想と驚くほど似ているんです。 素数は、近くを見ると読めないのに、遠くから見ると法則に従う。 そんな矛盾したような性格がπ(x)で見えてきます。 予測できない素数が x/log x とそっくりな不思議です。 何か素数には法則がある気がしませんか？ [caption id=\"attachment_3191\" align=\"alignnone\" width=\"800\"] 図： 1億までの範囲で、比率 π(x)/(x/log x) が 1.0537 となり、予想との差が約5%まで小さくなっている様子を示します。 xが大きくなるほど、比率は全体として1に近づいていきます。 [/caption] gapタブで素数の間隔の不思議を体験 gapタブでは、連続する素数同士の差、つまり素数ギャップを集めて、どのギャップがどれくらい出るのかをヒストグラムで表示します。表示はlinearとlogを切り替えられます。linearでは小さいギャップの多さが直感的に分かり、logでは回数の少ない大きなギャップまで形として見えます。 素数は次が分からないので、ギャップもバラバラに見えます。 ところが、たくさん集めてみると、よく出るギャップと出にくいギャップがはっきり分かれてきます。 さらに範囲を大きくすると、ギャップの平均は全体として大きくなっていきます。 それでも、ずっと小さいギャップが突然続いたり、急に大きな空白が出たりします。 素数の間隔は気まぐれに見えるのに、全体ではちゃんと傾向があるのが面白いところです。 [caption id=\"attachment_3195\" align=\"alignnone\" width=\"800\"] 図（scale: linear） gap histogram を線形目盛で表示した例。 小さいギャップ（特に6や2など）が圧倒的に多いことが一目で分かります。 一方で大きいギャップは回数が少ないため、右端側は低く見えます。 [/caption] 素数ギャップは、近くを見ると荒れているのに、別の角度で見ると形が整ってきます。そんな矛盾したような性格が、gapタブで見えてきます。出やすいgapと出にくいgapがあって不思議ですね。 [caption id=\"attachment_3196\" align=\"alignnone\" width=\"800\"] 図（scale: log） 同じ gap histogram を対数目盛で表示した例。 出現回数の少ない大きなギャップまで見やすくなり、分布が右側へ長く伸びる形（長い尾）として確認できます。 [/caption] もしかしたら最大ギャップの大きな空白区間には何か秘密があるかもしれません。いちばん多いギャップ6の直後に出やすいギャップは何か、ギャップ6が連続する区間のあとに何か出現の癖があるかもしれません。 双子素数（ギャップ2）が多い区間と少ない区間があるなら、その偏りに未発見の癖が隠れているかもしれません。こうした小さな違和感を拾い集めていくと、何か新しい素数の振る舞いが見つかるかも。 densityタブで素数の出現ムラを体験 densityタブでは、区間ごとに素数が何個出たかを数え、素数の密度をグラフにします。たとえば幅1000なら、1〜1000、1001〜2000のように区切って、それぞれの区間に素数が何個あるかを並べて見られます 素数は大きくなるほど出にくくなるので、密度は全体として下がっていきます。 ところが、区間ごとに見ると、いつも同じように減っていくわけではなく、濃い区間と薄い区間が交互に出てきます。 遠くから見ると減っていくのに、近くで見るとムラがある。 素数は気まぐれに見えるのに、全体ではちゃんと傾向があるという不思議を、密度の波として体験できます。 [caption id=\"attachment_3198\" align=\"alignnone\" width=\"800\"] 図 同じく区間幅1000で、1〜100,000の素数密度を表示。[/caption] 密度が急に低くなる谷はなぜ生まれるのか、密度が急に高くなる山は何が重なって起きているのか。密度の谷が続く区間では、gapタブで大きなギャップが増えていないか、山が続く区間では双子素数が増えていないか、といった関係も見えてくるかもしれません。 区間幅を変えて同じ現象が残るかを確かめるのも面白く、こうした小さな違和感を拾い集めていくと、誰も発見していない法則が見つかるかもしれません。 spiralタブで素数の模様を体験 spiralタブでは、数字をぐるぐる渦巻きの形に並べて、その中で素数だけを目印として表示します。数字を一直線に並べるのではなく、回転しながら外側へ広がる配置にすることで、素数がどこに集まりやすいのか、どこが空きやすいのかが模様として見えるようになります。 表示方法はsquare（ulam）とhex（honeycomb）を切り替えられ、同じ範囲でも格子の違いで模様の出方が変わるのも特徴です。必要に応じて渦巻きの経路線を重ねて表示し、数字がどの順番で配置されているかも確認できます。ulamの渦はただ見ているだけでも楽しめます。 [caption id=\"attachment_3202\" align=\"alignnone\" width=\"800\"] 図（square / ulam） 正方格子のulamスパイラルで素数を点表示した例。 斜め方向に筋のような並びが出やすく、素数の偏りが模様として見えてきます。 [/caption] 素数はランダム的なはずなのに、なぜか線や筋のように見えたり、逆にある方向だけ空いていたりします。この筋が見える理由は、そうなるのは明確な理由がありますが、どうしてそうなるのかを考えてみるのも面白いです。 [caption id=\"attachment_3203\" align=\"alignnone\" width=\"800\"] 図（square / ulam・経路線表示） 渦巻きの経路線を重ね、数字が中心から外へ並ぶ順番を可視化した拡大図。 素数が筋に集まる様子と、空きやすい方向がより分かりやすくなります。 [/caption] なぜ特定の方向には素数が少ないのか、筋が強く出る方向と弱い方向でどんな違いがあるのか。表示する範囲を広げたときに模様がどれくらい保たれるのか、squareとhexで模様の出方はどう変わるのかといった観察もできます。いろいろ探してみると誰も発見していない法則を発見してしまうかもしれません。 [caption id=\"attachment_3204\" align=\"alignnone\" width=\"800\"] 図（hex / honeycomb） 六角格子（蜂の巣状）に数字を渦巻き配置し、素数を点で表示した例。 同じ範囲でもsquareとは違う対称性の模様が現れます。 [/caption]"
  },
  {
    "title": "OvenMediaEngineで手軽に？WebRTCの送受信ができました。遅延0.5秒程度です。最近OBSがWHIPに対応しましたよね。コーデックはH264とH265で送信できました。個人レベルでWebRTCが利用できる時代です。",
    "url": "/blog/ovenmediaengine-how-to-webrtc/",
    "description": "",
    "tags": [
      "OvenMediaEngine",
      "作ったもの",
      "良かったもの"
    ],
    "date": "2025年9月15日23時4分",
    "content": "ovenmediaengineは、webrtcやllhlsなどのプロトコルに対応した、オープンソースの低遅延ライブストリーミングサーバーです。 rtmp、srt、rtspなど多様なプロトコルからの入力に対応し、アダプティブビットレート (abr) 変換も可能です。 実際の低遅延や規模や安定性に関しては構成やチューニング次第です。 ovenmediaengineのオープンソース版は無償で利用できます。 ライセンスはagpl v3.0です。 ちょっと使うなら便利でしょうけれど、ビジネスの中核として使うなら要注意です。 改変した部分は開示義務があります。 詳しくは自分で確認してください。 ovenmediaengineは、韓国のairensoft社が中心となって開発・公開しています。 もちろんオープンソース版とは別に、商用ライセンス、長期サポート、追加機能などを提供する「ovenmediaengine enterprise」も販売しています。 本格的に商用利用するならこちらも検討です。 ovenmediaengine はdockerを使うセットアップがあります。すぐに構築できるので便利ですが非dockerユーザーは、prerequisites.shなどを使って自分でビルドもできます。さっそく自分でビルドしてみましょう。用意した環境はubuntu24.04です。 ovenmediaengineのgitはこちら https://github.com/airensoft/ovenmediaengine ビルドに結構時間がかかります。sudo で実行しないとビルドが失敗します。sudo suで管理者になって実行しました。 sudo apt update sudo apt install -y build-essential nasm autoconf libtool zlib1g-dev tclsh cmake curl pkg-config git clone https://github.com/airensoft/ovenmediaengine.git cd ovenmediaengine ./misc/prerequisites.sh cd src make release bin/release/ovenmediaengine ができました。ポート開いたりシステムに登録して自動起動しました。 rtmp: 1935 srt: 9999 mpegts: 4000/udp webrtc signalling: 3333 (http), 3334 (https) webrtc ice: 10000-10004/udp tcp relay (turn): 3478 sudo ufw allow 3333 sudo ufw allow 3334 sudo ufw allow 3478 sudo ufw allow 1935 sudo ufw allow 9999 sudo ufw allow 10000 sudo ufw allow 10009 ovenmediaengineに動作に関しては、/etc/ovenmediaengine/server.xml に書かれます。 srtに関しては、なんか上手くつながりませんでした。 srtってサーバによって設定の癖があるので何かコツがわからないだけかもしれません。 rtmp→llhlsはすんなり動作しました。 webrtcを動作させてみましょう。 最近obsがwhipに対応しましたよね。簡単に映像をwebrtcで送信できます。コーデックはh264とh265で送信できました。 webrtcを受信できる再生アプリってweb向けの技術というだけあって、なかなか見つかりません。 ということでapache2サーバーのセットアップして、htmlでwebアクセスできるようにしました。 受信できるまで、turnとstunやiceの設定で苦労しました。 結局よくわかりませんが、やっぱりwebrtcはまだ難しさがあるなぁと思いました。 いろいろやって繋がりました。 3840×2160@60fpsで映像を送りました。 左が送信元、右がwebブラウザー受信側です。 600msというところで、まあローカル（送受信ともにwifi）環境としては、遅いけど送受信ともにすべてwifiでは検討しているのではないでしょうか。 サーバーもwifi環境というひどいものです。 まれにブロックのノイズがある程度です。 音も正常に送受信できました。 ovenmediaengineの記事としては中途半端な内容となりましたが、ovenmediaengineでwebrtcのサーバーおよび送受信できたという検証でした。 初めてwebrtcを接続できた（今まで概念が難しくて接続できませんでした。 ）ということで、webrtcにwhipとwhepができたことで、ずいぶんと簡単に利用できるようになったといえるかもしれません。 つまり手軽に1秒未満のwebブラウザーを経由した配信ができるというわけです。"
  },
  {
    "title": "Wordpressのクラシックエディターの編集画面の明朝体をPゴシックにするWPプラグインを作ったよ！",
    "url": "/blog/wp-classic-editor-gothic-font-plugin/",
    "description": "",
    "tags": [
      "Wordpress",
      "作ったもの",
      "良かったもの"
    ],
    "date": "2025年9月15日10時40分",
    "content": "私のwordpressのクラシックエディターは、いつも文字が明朝体になります。これが困ります。記事公開ではpゴシック調です。そのため記事作成中の文字のイメージと、実際の公開されたコンテンツのイメージが把握しづらいのです。 面倒なことにカスタムcssから、明朝体をpゴシックにできません。子テーマやfunction.phpなどをカスタマイズすれば、強制的に変更できるのですがテンプレートのアップデートに影響したり、そのカスタマイズを忘れがちです。長期的にメンテナンス性を下げます。 そこでプラグインを作って、クラシックエディター画面の明朝体を強制的にpゴシックにしました。これは快適です。最高です。 ブロックエディターを使えば、編集中もpゴシック調です。しかしwordpressのブロックエディターはとても使いづらい。どうしてあんなに分かりにくいのか。理解に苦しみます。くそみたいなエディターです。ブロックエディターのほうが良いとかカスタマイズ云々とかあるけどね。。。。 woredperssではクラシックエディターに戻すプラグインを使うのです。900万人も使っています。評価も星5です。どれだけの人がアンチブロックエディターなのかわかるでしょう。 https://wordpress.org/support/plugin/classic-editor/reviews/ みんなのコメントを見ていましょう。まったく同意見です。 さて私のwordpressのクラシックエディターは、いつも文字が明朝体になります。文字は補足なり、英数字は踊ります。なんか読みにくいため書きづらいのです。 公開記事はpゴシックです。 エディタもpゴシック調になると、すごくわかりやすくなりました。最高です。もう最高です。 カスタムcssでは、編集画面のcssは上書きできないので、プラグインで強制的に上書きする仕組みです。上書きするフォントは以下です。使っているワードプレスのテーマによっては、何か合わない問題があるかもしれませんね。 font-family: \"メイリオ\", meiryo, \"yu gothic\", \"yu gothic ui\", \"ｍｓ ｐゴシック\", \"ms pgothic\", sans-serif !important; もし自分好みに修正したい人は以下gitからdlしてください。 試したい人はgitからdlして自己責任でお試しあれ https://github.com/riragon/meiryo-sans-editor/"
  },
  {
    "title": "Claude Codeでubuntu24.04のマイクラサーバーを自動でアップデート＆Aikar's Flags改良しました。費用は１ドルでした。Clauda Code系は未来を感じるね",
    "url": "/blog/use-claude-code-minecraft-update/",
    "description": "Claude CodeでUbuntu 24.04上のMinecraftサーバーを自動アップデート。Aikar’s FlagsでJVMを調整し、低コストで高速化した手順と注意点を解説します。",
    "tags": [
      "minecraft",
      "作ったもの",
      "良かったもの"
    ],
    "date": "2025年9月14日23時24分",
    "content": "自宅のテスト用サーバー（ubuntu 24.04）を更新しました。 中にはminecraftサーバーも入っています。 claude codeでアップデートから最適化までやってみます。 claude codeは、エージェント型コーディングツールで、ターミナル内で動作します。 簡単に言えばubuntu内（ターミナル内）で動作するaiです。 claude codeについて https://docs.anthropic.com/ja/docs/claude-code/overview インストールは簡単です。説明は省略です。apiコンソールからapiコンソールに入れます。スタートは12.12＄の残額です。 さてubuntu24.04にclaude codeを入れました。claudeと入力すればスタートします。ターミナルから日本語で「システムをアップデートしてくれめんす」と入力しました。 現状の分析とminecraftサーバーの更新が提案されました。ほうほう。 ちょこちょこ進めて良いか確認が入ります。1でyesです。ちゃんとバックアップして作業するなんてしっかりしてます。 最新のminecraft serverをdlするようです。 ファイルがなかったのかエラーです。aiはwebにあるファイルの位置の特定が弱い傾向があります。 よくわからないけど、いろいろしてくれてます。 ファイルを見つけたようでインストールされて、設定ファイルなども調整してくれます。 minecraft serverを起動するときに引数みたいなオプションがあって、メモリのサイズなど指定してするのですが、モリモリのオプションを指定してくれました。元の人間をはるかに超えております。 なんのエラーだろう。と思いつつ。 なんか作業が済みました。 レポートです。 アップデートして改善もしてくれました。 aikar's flagsってなんだろうと調べました。 aikar's flags（アイカーズ・フラッグス）とは、minecraftサーバーのパフォーマンスを最適化するために特別に調整されたjava仮想マシン（jvm）の起動引数（フラグ）のセットのことだそうです。 へぇーためになりますねぇ。 さっきのオプションモリモリがこれだったようです。java -xmx4096m -xms4096mのように最大値と最小値を同じにする代わりに、最小値と最大値に差を設けます (-xmx6144m -xms2048m)。これにより、メモリを動的に割り当て、サーバーの負荷に応じて効率的にメモリを使用できるそうです。 起動テストもしました。 実際に最新の1.21.8でアクセスしてみます。 ちゃんとアクセスできました。すばらしい。 バックアップとか削除してもらいましょう。またどんな改良したか聞いてみます。なんか素晴らしく細かく設定してくれてます。もうわからない。情報がある分野ではaiには勝てませんね。 はい。仕様したapi料金の発表です。12.12→11.34なので、まあ約1ドルでした。150円。時間にして30分程度ですね。時給で考えたら安いですね。インド人を雇うより安いでしょう。 claude codeはsf的な未来を感じます。コンソールから対話するだけで、aiがコードを深く理解して実行してくれます。ある程度をわかっていれば何をするのか実行ごとに確認できます。もう趣味程度レベルでは、もうaiのほうがずっとレベルが高いので、正直なところ何を作業しているのかわかりません。 つまり劇的な破壊へ向かっていても把握できずに実行されてゆく恐怖はありますね。仕事の端末にぶち込んで作業するのはちょっと恐ろしいです。でもいずれそうなるでしょうね。だってさエラーだって設定だって、すべてaiのほうが深く理解しているからです。ということで、マインクラフトの更新をaiだけで1＄でやってくれました。 参考リンク（技術補足の根拠） claude code（概要/セットアップ/要件/ログイン） https://docs.anthropic.com/en/docs/claude-code/overview minecraft 1.21.8 リリースノート（2025-07-17） https://www.minecraft.net/en-us/article/minecraft-java-edition-1-21-8 サーバーdl（公式の配布とマニフェスト） https://www.minecraft.net/en-us/download/server aikar’s flags（papermcドキュメント、xmx/xmsの余白推奨など） https://docs.papermc.io/paper/aikars-flags/ zgc（jdk21以降のgenerational zgc、使うときの前提/思想） https://docs.oracle.com/en/java/javase/21/gctuning/z-garbage-collector.html"
  },
  {
    "title": "WebRTC（Web Real-Time Communication）とWHIPとWHEPについてまとめてみた。簡単にWebRTCが使えるようになったね",
    "url": "/blog/web-real-time-communication-whip-whep/",
    "description": "",
    "tags": [
      "その他"
    ],
    "date": "2025年9月13日23時58分",
    "content": "webrtc（web real-time communication）は、ウェブブラウザやモバイルアプリ間で、プラグイン不要のまま音声・映像・データをリアルタイムにやり取りできるオープンな技術群です。 双方向の通話やビデオ会議など、即時性が重要なユースケースに最適化されています。適切な条件下では、遅延を150ミリ秒未満に抑えることも現実的です。 ピア・ツー・ピア（p2p）のデータ伝送では、一度接続が確立されると、サーバーを介さずに当事者間で直接送受信が行われます。 ただし、接続を開始するための仲介役（シグナリング）はwebrtcの仕様外であり、従来は開発者が独自に実装する必要がありました。これがライブ配信分野での普及を阻む一因で、シグナリング設計が複雑になりがちだったのです。 仲介役（シグナリング）とは、webrtc通信を開始する前に、通信相手（ピア）どうしが接続に必要な情報を交換する仕組みを指します。イメージとしては、電話をかける前にまず番号を伝え合うようなものです。 webrtcとは webrtcの実データ転送自体はp2pで行われますが、接続を確立するまでの段階ではサーバー経由のシグナリングが不可欠です。このシグナリングは仕様で定義されていないため、実装方式はアプリやサービスごとに異なります。 シグナリングサーバーは、通話の開始・終了・変更などセッション状態の管理を担い、相手方のipアドレスやポート番号などの経路情報を交換します。 natやファイアウォール越えに必要な情報（ice候補）もここで扱われます。 また、利用する映像・音声コーデック、解像度、ビットレートなどメディア仕様に関する情報（sdp）も交換します。 この情報交換は、websocketやhttpなどを用いたシグナリングサーバー経由で行われます。 具体的には、オファーとアンサー、それに接続候補（ice候補）をやり取りし、p2p通信の準備を整えます。 シグナリングが完了して接続が確立されれば、その後のデータ転送に仲介サーバーは不要です。 whipやwhepは、まさにこのシグナリング手続きを標準化した仕組みです。 標準化以前は、サービスごとに実装がバラバラでツール間の相互運用性も乏しく、配信・再生の接続は非常に複雑でした。 結果として、独自実装やデバッグに多大な工数がかかり、ベンダーロックインやエコシステムの分断も生じていました。 whipとwhepはシグナリングをhttpベースで標準化することで、これらの課題を解消し、低遅延webrtcライブストリーミングの構築・運用を大幅に単純化しました。 従来はシグナリング専用のwebsocketサーバー等を別途用意する必要がありましたが、whip/whepの採用により、その要件を軽減できます。 whip（webrtc-http ingestion protocol）とは whipは、webrtcのストリームをライブ配信向けに「送り出す（ingestion）」ための標準的なシグナリングプロトコルです。従来、配信ツール（例：obs studio）からメディアサーバーへ映像を送る際は、サーバーごとに異なるシグナリング実装が必要でしたが、whipがこの手続きを標準化します。 httpのpostリクエストを用いてシグナリングを行うため、実装負担を減らし、rtmpに近いシンプルさで接続できます。開発・運用のハードルが下がるのが大きな利点です。 相互運用性の向上：obs studioをはじめ多くの配信ツールがwhipに対応し、さまざまなサーバーへwebrtcストリームを容易に配信できるようになりました。 whep（webrtc-http egress protocol）とは whepは、メディアサーバーから視聴者のクライアントへwebrtcストリームを「届ける（egress）」ための標準的なシグナリングプロトコルです。whipが配信側を担うのに対し、whepは視聴側の接続を標準化します。 whipと同様、httpベースの手順で視聴を開始できるため、開発者はwebrtcストリームをクライアントアプリに容易に統合可能です。 webrtcの仕組みが簡単になった webrtcがもつリアルタイム通信の強みを、whip/whepという「標準化されたつなぎ方」で活用することで、低遅延かつ高品質なライブストリーミングを、より簡潔かつ相互運用性高く実現できます。 例えばwhipとwhepを使うと、各コンポーネントが標準化手順で連携し、低遅延ライブ配信が組みやすくなります。 gstreamer → メディアサーバー（例：ovenmediaengine） → webアプリ の連携イメージ 送信側：gstreamer 役割：カメラやファイル入力からの映像・音声を取得しエンコード。プロトコル：whipクライアントとして動作し、webrtc形式でovenmediaengineへ送出。具体例：gst-plugins-rsに含まれるwhipsink要素で、webrtc送出パイプラインを構築可能。 メディアサーバー：ovenmediaengine 役割：whipで送られてきたwebrtcストリームを受信し、whepに対応したwebアプリ向けに配信。機能：シグナリング機能を内包しているため、別途シグナリングサーバーを用意しなくても運用しやすい。 受信側：webアプリ 役割：視聴者のブラウザでライブストリームを再生。 プロトコル：whepクライアントとして動作し、ovenmediaengineから映像・音声を受信。具体例：javascript製のwhepクライアントライブラリを用いれば、シンプルなhttpリクエストで再生を開始可能。 このように、whip/whepという共通規格があることで、gstreamerのような幅広いツール、ovenmediaengine、そしてwebブラウザといった異なるプラットフォーム間でも、互換性の問題を最小化してシームレスに連携できます。 * w3c webrtc wg（ブラウザapiの標準化）: (https://www.w3.org/groups/wg/webrtc/) * ietf rtcweb wg（プロトコル標準化）: (https://datatracker.ietf.org/wg/rtcweb/about/) * **「シグナリングは仕様外」「sdp/ice 交換」の根拠**（公式ドキュメント） * mdn: signaling とビデオ通話概説: (https://developer.mozilla.org/en-us/docs/web/api/webrtc_api/signaling_and_video_calling) * mdn: webrtc プロトコル（ice/sdp 等）: (https://developer.mozilla.org/en-us/docs/web/api/webrtc_api/protocols) * **遅延の目安（≈150ms）** * itu-t g.114（片方向遅延の推奨値）: (https://www.itu.int/rec/dologin_pub.asp?id=t-rec-g.114-198811-s%21%21pdf-e&lang=e&type=items) * **whip の正式仕様** * rfc 9725（webrtc-http ingestion protocol）: (https://www.rfc-editor.org/rfc/rfc9725.pdf) * **whep の現行ステータス** * ietf internet-draft（webrtc-http egress protocol）: (https://datatracker.ietf.org/doc/html/draft-ietf-wish-whep) * **p2pでもturn経由になり得る点の一次情報** * webrtc.org（turn サーバー解説）: (https://webrtc.org/getting-started/turn-server) * **「gstreamerでwhip送出可能」の根拠** * gst-plugins-rs（ whipsink 実装）: (https://github.com/gstreamer/gst-plugins-rs)"
  },
  {
    "title": "Gemini 2.5 Flash Image(Nano Banana)モードで写真を線画にしたら、だいぶ品質が良い線画が出力されました。UE5の背景を線画にして漫画のように合成してみた。",
    "url": "/blog/ue5-managa-nano-banana/",
    "description": "",
    "tags": [
      "UE5",
      "作ったもの",
      "良かったもの"
    ],
    "date": "2025年9月13日17時6分",
    "content": "生成系aiで漫画風の背景である線画を作る方法は無数にあります。stable diffusion、controlnet、chatgpt、clipdropなど。。。もっとあるでしょう実際にやってみるとフォトリアルだったり、細部がごちゃごちゃしたりします。イマイチです。設定を詰めてゆくと上手くゆくのかもですが。 さて2025年9月にgemini 2.5 flash image(nano banana)が登場しました。 フィギア風の絵を生成することで有名です。 これからも毎月さまざなaiが登場するのでしょう。 gemini 2.5 flash image(nano banana)モードで写真を線画にしたら、だいぶ品質が良い線画が出力されました。 記事後半ではue5の映像を線画にしてみました。 3つ写真を線画に変換テスト テストで以下３つの生成写真で線画にしてゆきます。ドローンとお墓の写真。 廃線になった線路の写真。 人類が滅んだ河川の写真。 それぞれの線画の変換結果は以下です。いい感じにデフォルメされながらも、ドローンなど形状がしっかり線画になりました。 電車も使いやすいイラスト的な線画になりました。 ビルがフォトリアルな感じもありますが、まあまあ良い感じです。 動画で線画と写真を比較してみよう 動画で写真と線画を比較してみます。写真に忠実ながら、正確に線画になっていることが分かります。 電車や地面のほどよい簡略化が素晴らしいです。曖昧にする部分の選択が人間のようなです。 ドローンとお墓も動画で比較してみると、遠い背景の線画を省略してみると漫画っぽいですね。このようにゴチャゴチャした写真をすっきり線画にできることが不思議でもあります。 ue5を背景素材として使えるか試してみよう ue5で上手く機能するか試してみましょう。街中をlit（照明）ありでキャプチャーします。 ue5の画面をスクリーンショットしました。 線画に変換です。ちょっと地面などのノイズがフォトリアルな感じで気になります。 ue5でunlit（照明なし）にしました。 unlitを線画にすると、とてもイラストっぽいです。 路面に面したカフェテラスのスクリーンショットです。 数回出力を試行錯誤しましたが、良い感じの線画になりました。ue5なので必要に応じて遠くのオブジェクトを消すなどして線画にすればより良いでしょう。 キャラクターとue5の背景線画を合成してみよう ゴリラを出力して、線画と合成するように指示しました。ゴリラが座ってます。物の前後の位置関係が少しおかしいですがちょっと修正すれば使えますね。 使用したプロントとはこんな感じです。 「この画像をバランスよく線画化してください。色は白黒です。線の太さは中くらいで、細かすぎる草や葉などのディテールは適度に省略してください。全体の印象として、漫画の背景として使いやすく、かつ情報量が多すぎないメリハリのある線画を希望します。色は白黒です。メリハリのある線画つくってね」 英語にしたり、もっと的確な指示プロンプトがあるでしょう。"
  },
  {
    "title": "2025年amazonアソシエイトのリンクをWebに掲載するときの注意事項：5年ぶりぐらいにAmazonアソシエイトを掲載しようかなと調べてみた件",
    "url": "/blog/guidelines-for-posting-amazon-associates-links-on-the-web-2025/",
    "description": "",
    "tags": [
      "その他"
    ],
    "date": "2025年8月30日23時38分",
    "content": "**景表法（ステルスマーケティング）**や 外部送信規律 の解釈は、個人ブログでも境界事例があります。 法的判断は記事ではなく最新の官公庁・amazon の記述・専門家 に依頼してください（本記事はあくまで当時の整理メモです）。 2025 年時点の「pr 表記を記事頭に」は安全寄りの運用例であり、 必須要件の網羅的リストではありません 。 2010年ぐらいにブログ（別のブログサイトですが）をはじめました。 2010年頃の空気は、naverまとめ、twitter、はてなブックマーク（はてブ砲）、rssなどありましたね。 そういえばイケハヤ（イケダハヤトさん）など暗黒面に落ちる前で「年収150万円で僕らは自由に生きていく」やブログやライターをしていて好印象な時代でもありました。 年収150万円で僕らは自由に生きていく https://www.amazon.co.jp/dp/4061385283/ gunosy（グノシー）とかもありましたね。当時は確かaiみたいな感じで個人の興味に合わせて最適化したニュースを届けるみたいなアプリが登場してこれは求めていたサービスか！と思っている内に、いつの間にか、色付きのキュレーション＆広告になってガッカリした記憶があります。今は知りません。 さて2010年ぐらいにブログを始めて2018年ぐらい一番アクセスがありました。月20万から30万pvぐらいあり、片手間ですがアフィリエイト収入が結構あったのです。仕事も忙しくなって更新をしなくなりました。その後は1年で半減、2年で1/4となった感じです。 ブログは更新を止めると、そのまま更新しなくなります。さらにアクセスが減って、やる気も減って閉鎖するというパターンが多いです。まあメンドクサイのです。 去年ぐらいから本ブログ（リラゴン）を、ぽつぽつと始めました。細々ですね。未だに昔のサイトからamazonアソシエイトから振り込みがあるので、久しぶりにログインして本ブログにもアフィリエイトを復活させようかなと思った次第です。5年ぶりぐらいにamazonアソシエイトを調べてみました。 ここ5年ぐらい変わったamazonアソシエイト 主な驚きが1商品あたりの紹介料上限1,000円が撤廃、ステルスマーケティング規制（景表法）が施行、「外部送信規律」（改正電気通信事業法）対応が必要、ということです。 amazonアソシエイトの紹介料は物販は相変わらず2～3％と低いのですね。でも紹介料上限1,000円が撤廃なので10万以上のノートパソコンとか紹介すれば2000円ぐらい入るのは結構ありかもです。 そのような流れで、2025年にamazonアソシエイトを始めるには、いくつかの注意が必要といえます。 まず基本はamazon適格販売の一文掲載 amazon アソシエイト・プログラム運営規約では、次の文言がサイトで明確に、目立つ場所に記載されていることが求められています。「amazon のアソシエイトとして、[自身の名称を挿入]は適格販売により収入を得ています。」 https://affiliate.amazon.co.jp/help/node/topic/gpxfhvyzmtgpumpe またステルスマーケティング規制（景表法）対策で記事ごとの「広告/pr」表示が必要のようです。 ただしよく読むと「景品表示法の対象となるのは事業者だけです。 」と書かれています。 企業から広告・宣伝の依頼を受けたインフルエンサー等の第三者は規制の対象とはなりません。 」ともあります。 じゃあ書かなくてもよいのかな？と思いますよね。 https://www.caa.go.jp/policies/policy/representation/fair_labeling/stealth_marketi 広告であるという表示は必須、違反があった場合に誰に処分が出るか（広告主＝事業者が対象）と、表示の必要性は別の話のようです。 記事の先頭に［pr］表記掲載 まあ安全寄りに考えれば、記事の先頭に［pr］表記というわけですね。 以上からamazon アソシエイト・プログラム運営規約から、「amazon のアソシエイトとして、[自身の名称を挿入]は適格販売により収入を得ています。 」の表示と、ステルスマーケティング規制（景表法）対策の記事ごとの「広告/pr」表示が必要ということです。 さらにうるさく解釈すれば、amazonアソシエイト・プログラム運営規約に規約4条（乙の保証）で適用法を守ることとあるので、「広告/pr」表示が必要といえますね。 https://affiliate.amazon.co.jp/help/operating/agreement/ 最後に改正電気通信事業法の外部送信規律掲載 改正電気通信事業法の外部送信規律への対応について、amazonの記述を読むのが早いでしょう。 https://affiliate.amazon.co.jp/help/node/topic/grend2bkke3nkp4c 「amazonは、特定のアソシエイトサイトが外部送信規律の対象になるか否か、アソシエイトパートナーによる具体的な対応についてコメントする立場にありません」とあります。 また「情報発信のためのウェブサイト等を運営する費用を賄うために少数の広告を掲載して収入を得ている程度である場合は、対象となりません。」ともあります。 外部送信規律（総務省公式ウェブサイ） https://www.soumu.go.jp/main_sosiki/joho_tsusin/d_syohi/gaibusoushin_kiritsu.html まあ、内容を察して問い合わせはしないで！ということですね。もしそのような通知ページを設ける場合は、以下のように掲載すればよいそうです。 外部送信プログラム名：amazonアソシエイトプログラム 送信先の会社名：アマゾンジャパン合同会社 アソシエイトパートナーの利用目的：閲覧の傾向や履歴の分析のため、広告効果の分析のため 送信する情報の内容：閲覧した内容についての情報 送信先の利用目的：自社の広告宣伝を目的とした広告情報の掲載のため、ウェブサイトやアプリの監視のため"
  },
  {
    "title": "超簡単！難解なGoogle Analytics 4(GA4) を AI（GPT）でアクセス分析＆対策できるワークフロー・BigQueryなしの最短セットアップを紹介",
    "url": "/blog/google-analytics-ga4-gpt-workflow-2025/",
    "description": "難解なGA4のデータをGPTに読み込ませて状況を解説してもらいました。結果、とても分かりやすくGOODでした。Google AnalyticsとAIを連携させるツールはいくつかあるようですが、多くはBigQueryとの連携やAPIを使うなど、少し難しいことが多いです。ここでは超簡単にGoogle AnalyticsをAIで分析してみます。",
    "tags": [
      "良かったもの"
    ],
    "date": "2025年8月30日17時5分",
    "content": "レポート項目名 （例:「ランディング ページ」の表記ゆれ）も変わりうるため、検索ワードは公式ヘルプ併用がおすすめです。 pdf やスプレッドシートを gpt に渡す 方式は、利用する ai サービスのファイル添付仕様・プライバシーポリシー の変更で運用できなくなる場合があります（社内データは特に注意）。 記事は bigquery なしの手作業エクスポート 前提です。規模が大きいサイトでは公式のデータ連携の方が向く場合があります。 2025年google analytics 4（アナリティクス／ga4）に移行してから、本当に難しくなったと感じます。専門的にkpiを定めて設計してから使う前提になり、画面を見ても正直よく分かりません。困ったものです。 そして、メガネをくいっと上げて早口で「指標を定義してkpiツリーにブレークダウンし、データ品質とアトリビューションを整流し、探索レポートをダッシュボードへ最適化します。ga4×bigqueryでクイックウィンから継続的にグロースさせます。ふう…」みたいな勉強をしたくありません。 そこで、難解なga4のデータをgptに読み込ませて状況を解説してもらいました。 結果、とても分かりやすくgoodでした。 google analyticsとaiを連携させるツールはいくつかあるようですが、多くはbigqueryとの連携やapiを使うなど、少し難しいことが多いです。 ここでは超簡単にgoogle analyticsをaiで分析してみます。 すでにgoogle analytics 4（以下、アナリティクス）を導入済みとします。まだ導入していない方は、以下のサイトなどを参照して導入してください。 google analytics 4（アナリティクス／ga4）導入 https://creatopia.jp/media/11048/ https://www.xserver.ne.jp/blog/sitekit-setting/ アナリティクスにログインします。 アナリティクスにログインします。「レポート」に入ります。以下リラゴンの実際のダッシュボードです。 ごちゃごちゃとして意味がわかりませんが安心してください。「ライブラリ」に入ります。 コレクションをすべて削除します。右上の縦三点（⋮）メニューから削除できます。 新しいコレクションを作成 すっきりした画面になりました。新しいコレクションを作成します。この「コレクション」で選んだ設定が、レポートのメニューに出てきます。これが分かりにくい原因です。 さらに「空白」をクリックして追加します。 2か所に名前を付けます（例：「ブログ」「解析」）。 ブログ用に入れておくと良い項目は以下です。「どこから来た → どの記事を見た → どのくらい読んだ → どんな人か」を一通り把握できます。ドラッグでコレクションに追加します。 トラフィック獲得 ユーザー獲得 ランディング ページ ページとスクリーン クエリ エンゲージメントの概要 ユーザー属性の詳細 ユーザーの環境の詳細 注意：「ランディングページ」で検索しても出てきません。「ランディング ページ」（スペースあり）でヒットします。不親切ですね。 保存すると、レポートが作成されます。 レポートのメニューに項目が登場 次にコレクションを「・・・メニュー」から公開にします。公開にすると、レポートのメニューに先ほどの項目が表示されます。これで準備完了です。本当にわかりにくいですね。 レポートのメニューに先ほどの項目が表示されるのでクリックします。分析したい日付を指定します。長期で分析したければ1年、初期設定は1か月です。 レポートをダウンロード 共有アイコンをクリックし、ファイルをダウンロードします。 chatgptで分析するならpdfがおすすめです。 googleスプレッドシートでも良いかもしれません。 csvにするとpythonのコードを書いて読み込もうとしたりして、あまりうまくいきませんでした。 aiエディターのcursorなどを使うなら、csvはうまく読めました。 各項目をpdfでダウンロードしていきます。ちょっと面倒ですが我慢です。 gptで分析 そのpdfをgptにドラッグ＆ドロップします。 うまく読めました。gptに気づいたことを分析してもらうと、「確かにね」という結果を出してくれます。いろいろ質問できるので、対策も簡単に分かります。内容が難しいときは、小学生向けに説明してとお願いしてください。 cursorでも分析 cursorでは1年分のcsvを分析しました。cursorのほうが細かく分析にするの向いている気がします。 本ブログの1年間40000ユーザー数を分析した結果は以下です。 検索に依存しているのは確かです。 snsがメンドクサイからです。 誰とも繋がりたくない。 。 。 edgeユーザが視聴時間がないのは面白い傾向です。 初心者が多いのかも。 タイトルとかurlは、本当に適当につけているので、課題が明確でした。 まあ客観的に分析してくれるのでありがたい。 全csvデータ分析：10行まとめ アクセス規模：年間 40,000ユーザー。日本 99.5%／chrome 75%／organic 94%。 ctr問題：平均 2–4%（業界平均 15%）。掲載順位は良いが、検索結果での見せ方が弱い。 人気コンテンツ：unreal engine 5／3dスキャン／iotが強く、エンゲージメント 60–130秒。 エンゲージメント格差：高品質記事（130秒）と低品質記事（25秒）で5倍の差。 新規ユーザー獲得：95%以上が新規。既存ユーザーの再訪が課題。 海外潜在力：フィリピン 86%／オーストラリア 65% の高エンゲージメント国あり。 ブラウザ特性：edgeユーザーが最も熱心（96秒）。モバイルsafariは安定。 成長傾向：organic search 4倍増／direct 2.6倍増。技術需要の拡大を示唆。 結論：日本中心の高成長サイト。質向上と海外展開でさらなる伸びが可能。 対策：10行まとめ ctr改善：タイトル／メタ改善、url構造見直し、検索結果での魅力度アップ。 コンテンツ充実：高エンゲージメント記事（94秒以上）のフォーマットを全記事へ横展開。 アクセス多様化：direct／referral増のため、sns・コミュニティ・メールマガジンを活用。 国際展開：英語化を開始し、フィリピン／オーストラリア市場を開拓。 ブラウザ最適化：edgeユーザー向けに技術深度を強化、モバイル体験も改善。 ランディング改善：新規ユーザー95%を獲得している記事の成功パターンを横展開。 seo内部対策：ページ速度、モバイル対応、内部リンクを強化。 技術的改善：サイト構造最適化、画像圧縮、cdn導入。 効果測定：kpi設定、a/bテスト、継続的モニタリング。 運用体制：品質管理体制を整備、定期レビュー、スケーラブルな仕組み化。 以上！aiでアクセス解析を分析すると簡単に状況がわかって、とても良い感じでした。もう人間がデータを読む時代は終わってるのですよ。"
  },
  {
    "title": "無償で使えるフォトグラメトリ最先端技術：RealityScan（旧RealityCapture）の使い方と3Dモデル作成のステップバイステップガイドで高品質な3Dモデルを作ってみよう！",
    "url": "/blog/realitycapture-3d-tukaikata/",
    "description": "今日はRealityScan（リアリティスキャン）で簡単に高品質な3Dモデルを作る操作方法を説明します。RealityScanは、さまざまな入門用チュートリアルがあります。大抵は難しく気持ちが萎えます。そこでもっとも簡単にかつ、その後の理解につながるポイントをしっかりと抑えた説明をします。",
    "tags": [
      "RealityCapture",
      "RealityScan",
      "UE5"
    ],
    "date": "2025年8月30日15時51分",
    "content": "今日は realityscan （リアリティスキャン、旧 realitycapture）で、高品質な 3d モデルを作る流れを説明します。入門チュートリアルは多いのですが、だいたい難しくて心が折れがちです。ここでは いちばん簡単に試せる手順 と、そのあと理解につながるポイントに絞って書きます。 2024 年 5 月に epic games の realityscan が 実質無料 になりました。ざっくり言うと、年間の売上が一定（公式では 100 万ドル未満など）であれば無料で使えるライセンスです。個人利用なら実質無料で使えます。 教育機関の学生にとっては、無償で最先端の技術を学べる大きな機会です。小学校から大学まで、教育機関の学生も無料で利用できます。今回は 小学生に説明するレベル で realityscan の使い方を紹介します。 ちなみに、pc 版の旧称は realitycapture でした。 モバイル向けアプリが realityscan だったのですがブランド統合で、どちらも realityscan という名前になっています。 pc は realityscan、モバイルは realityscan mobile です。 少し分かりにくい変更ですが、数年もすれば馴染むでしょう。 realityscan のライセンス（詳細） 過去 12 か月間の収益が 100 万ドル未満の個人・中小企業、教育機関・学生向けは無料で利用できます。 realityscan ダウンロード（公式） realityscan の準備 何事もまずは体験です。いちばん簡単な手順で、realityscan で高品質な 3d モデルを作ってみましょう。epic のサンプル gingerbread man をダウンロードします。ページを少し下までスクロールしてください。 gingerbread cookie a dataset of a gingerbread cookie with 158 images. download now [325 mb] realityscan サンプルデータセット ダウンロードすると、このような写真のセットになります。自分で一眼レフやスマートフォンで撮影して試しても構いません。 epic games ランチャーでインストール epic games ランチャー を用意します。fortnite などで遊んだことがあれば、すでに入っていることが多いです。ランチャーのタブに realityscan（旧 realitycapture） が追加されています。 epic games ランチャーをダウンロード タブを開いて realityscan をインストールします。起動できれば準備完了です。 レイアウトと日本語 ui 画面のレイアウトは左上から変更できます。次のタイプがおすすめです。 起動したら、まず 日本語設定 にしておくとよいです。メニューの一部が日本語になり、少しだけ意味が取りやすくなります（ほとんどは英語のままです）。 workflow → settings → ui language で「日本」に変更できます。 ワンクリックで体験 写真を realityscan に ドラッグ＆ドロップ で読み込みます。 開始 ボタンをクリックします。これで一通りの処理が走ります。まずはワンクリックで体験するのがおすすめです。 しばらく待ちます。スペックが低い pc だと、それなりに時間がかかります。 たったこれだけでフォトグラメトリの結果が出ます。3d モデルができ、自由に回転できるので、ちょっとした感動があるはずです。 マニュアルで工程を理解しよう ボタン一つで全部処理できますが、実物ではそううまくいかないことも多いです。ここからは 手動の流れ を追います。実務ではこのあたりが中心になります。 画像のインポート 改めて画像をインポートします。 アライメント アライメント を選び、 設定 を開きます。処理を軽くするため、 画像のダウンスケール係数を 2 にします。 アライメント を実行します。アライメントとは、画像を三角測量などで解析して 点群 を作る処理です。 終わると画像が コンポーネント に分かれます。1 回目ではまとまる枚数が少ないことがあるので、 2〜3 回 アライメントを繰り返します。 2 回繰り返すと、1 つのコンポーネントに含まれる枚数が増えた例です。これでよしとしましょう。まとまる枚数が多いほど、点群の完成度が上がります。できるだけ多く統合されるようにします。 メッシュモデル（mesh model） 次に mesh model を選びます。左下のメニューは、赤い × で閉じるとすっきりします。設定メニューが似て見えるので、関係ない項目は消した方がわかりやすいです。 mesh model の setting を開きます。ui 言語を日本語にしても、このあたりのメニューは英語のままのことが多いです。 メッシュモデルは、点群から メッシュ（三角形ポリゴン） を作る工程です。時間がかかるので、 通常モデル・画像の縮小を 2 くらいにしておくと負荷が下がります。 表示されているボックスは、メッシュ化する 範囲 です。必要な部分だけに絞ると処理も軽くなるので、クリックして小さくします。 クリックすると移動用のハンドルが出ます。マウスで掴んで位置を調整します。 土台は不要なので範囲を縮小します。本体の人形がきちんと収まっているか、角度を変えて確認しましょう。 normal detail をクリックして実行します。 分析が始まります。しばらく待ちます。 完了するとメッシュモデルができあがります。 アンラップ・カラー化・テクスチャ settings を開きます。 項目は多いですが、まずはそのままでよいです。 ジッター（jitter）だけ 1 にしておきましょう。 まず unwrap します。あとの処理の下準備になり、テクスチャの品質を事前に確認できます。 チェッカーボードをクリックすると、テクスチャが乗りにくい部分などが分かります。今回のモデルではチェック不要でした。 続けて colorize します。 最後に texture をクリックします。 ここまでで見た目の一通りは完成です。 書き出し モデルサイズを確認します。例では 2.8m あり、やや大きめですが、そのまま書き出してみます。 dense mesh model をクリックします。 はじめは obj が扱いやすいです。 fbx でも構いません。 テクスチャ付きで書き出します。迷ったら次の画面の設定を参考にしてください（初期設定を忘れたとき用です）。 ue5 への取り込み（参考） unreal engine 5 に取り込むと、ゲームやシミュレーションなどに使えます。今回は詳細は省略しますが、3d データを使うには調整や理解がそれなりに必要になります。 書き出した obj を コンテンツブラウザ にドラッグして取り込みます。 インポート を実行します。 レベル内に 3d モデルを置けました。本番では lit / unlit、メッシュ品質、マテリアル・テクスチャ などの理解が必要になってきます。今回は「3d 化して取り込める楽しさ」を体感するための説明でした。ue5 に慣れていないと、取り込みだけでも少し苦労するかもしれません。 realityscan のワークフロー一通りを体験できたでしょう。より高いレベルでは、設定やテクニカルな操作も必要になってきます。まずは全体の足がかりができたはずです。good luck!"
  },
  {
    "title": "AIと人間の文章は、もはや見分けがつきません。手書きかワープロかを比較した時代のように、もうすぐAIで書いている文章かどうかも問わない時代になると感じます。",
    "url": "/blog/ai-llm-seisei-shousetu/",
    "description": "",
    "tags": [
      "作ったもの"
    ],
    "date": "2025年3月9日10時27分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。本記事の手順・画面・バージョン表記・外部リンクなどは、公開時点のものです。ソフトウェアの更新・api変更・uiの改定などにより、 現在は当てはまらない・再現しない場合があります 。実機での作業や契約・課金に関わる内容は、必ず各公式の最新情報で確認してください。 aiと人間の文章は、もはや見分けがつきません。手書きかワープロかを比較した時代のように、もうすぐaiで書いている文章かどうかも問わない時代になると感じた件です。 最近の大規模言語モデル（llm）の進化は目覚ましく、aiが生成する文章と人間が書く文章の区別がほとんどつかなくなっています。私自身もaiの進化を日々感じていてopen ai社のo1 proやanthropicのclaude 3.7などの最新モデルを使用していますが、それでも今回の試したことには驚きました。 aiによる長文作成の従来の課題がありました。aiによる文章生成、特に小説などの長文には明確な弱点があります。このような問題はllm、生成系aiの特徴とされてきましたが、少し工夫をすれば問題が大幅に改善されています。 話の筋が途中で矛盾する 登場人物の設定や名前が突然変わる 物語の展開が停滞する 似たような内容が繰り返される 私は実際に、約2万文字・4章構成の小説「魔力枯渇問題で部長のノウハウを見せつけようとしたらわからせられた件」をaiに生成させました。 結果は驚くべきもので、最初から最後まで一貫したストーリーラインを維持し、前述のような矛盾点が見られない作品となりました。 それでも書き直したり修正したり1日かかっていますが、人間なら2週間は必要です。 作品は「カクヨム」プラットフォームで公開しています。 https://kakuyomu.jp/works/16818622170655777234/episodes/16818622170656589763 ai臭さを探してコメントしてみてください。 この小説を複数のai文章判定システムで分析しましたが、aiによる生成だと見抜くことができませんでした。 確かに「転生系」などの特定ジャンルでは、人間が書く文章もある程度パターン化されているため区別が難しいという側面もあるでしょう。 人間もクソみたいな文章を書きますから、クソの中にクソがあるとそれが犬か人間かなど見分けがつかないのと同じです。 2万文字の文章を生成してaiの癖に気が付いたこと 現状でも、ai生成文章には以下のような特徴が見られました。普通の小説より多く多用される印象です。この部分に注目して文章を見ると、なろう系小説においてaiかどうか疑えるかもしれません。でも学習に使われたデータにそれらの出現度が高かったのでしょう。便利なので素人小説によく使われそうです。 三点リーダー（「...」）の多用 感嘆符や疑問符の過剰な使用（「！？」など） これらの特徴は校正（これもaiを活用）によって容易に除去できます。aiに構成するときにそれらはできるだけ削除してと指示するだけです。 2万文字の文章を一貫させるために工夫したコツが以下です。 事前準備の充実：世界観やアイデアを明確に設定する キャラクター設定の詳細化：登場人物の性格や背景を具体的に決める シーン割り（脚本）の作成：物語の流れを事前に構造化する 適切な分量設定：一度に生成する文章を適切なサイズ（例：5,000文字程度）に区切る 物語の作り方を分析をしまして、初めにアイデア世界観の情報→キャラクター→800文字プロットを作り、面白いプロットができるまで世界観とキャラクターの修正を繰り返しました。 プロットが出来たら、アイデア世界観、キャラクターの情報を元に物語の構造を作りました。この構造まで作ると、aiが作った第2章はつまらない、第3章は物語が停滞する。などが見えてきます。人間がちょっと構造を作り変えて、変化のある構造にします。 その構造を元にシーン割り（脚本）を作り、シーンや登場人物を配置して明記してゆきます。シーン割り（脚本）を元に文章を出力させるとバランスの良い文章になりました。 プロット、構造、シーン割り（脚本）ですが、同じような内容が3つあることで、最後の第4章を書くときにとても混乱しました。シーン割り（脚本）が出来たらプロット、構造は捨てたほうがよいのかもしれません。もしくは構造だけで十分かもしれません。 これらの工夫により、aiによる文章生成で起こりがちな問題を大幅に減らすことができます。それぞれtxt形式にでもして、llmに文章を作ってもらうときに投げ込むだけです。 aiによる創作支援ツールは日々進化しており、今後もさらに人間の創作との境界が曖昧になっていくでしょう。こうした技術をどう活用していくかは、これからのクリエイティブ分野における重要な課題となっていくと考えられます。"
  },
  {
    "title": "数万個のファイル名を作っと書き換えできるミニアプリ",
    "url": "/blog/a-mini-application-that-can-create-and-rewrite-tens-of-thousands-of-file-names/",
    "description": "",
    "tags": [
      "Rust",
      "作ったもの"
    ],
    "date": "2025年2月11日22時27分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。本記事の手順・画面・バージョン表記・外部リンクなどは、公開時点のものです。ソフトウェアの更新・api変更・uiの改定などにより、 現在は当てはまらない・再現しない場合があります 。実機での作業や契約・課金に関わる内容は、必ず各公式の最新情報で確認してください。 数万個のファイル名をさくっと書き換えできるミニアプリですが簡単につくりました。大したものではありませんし何も動作保証もありません。以下からdlできます。windowsのみの動作です。使い方は簡単です。フォルダーを選択して、書き換えたいキーワードを設定して、実行するだけです。詳しい使い方は以下を読んでご確認ください。 https://github.com/riragon/filename-change/releases/tag/v1.0 対象フォルダの選択 directory:上部左側の「directory:」と表示されたテキストボックスに、ファイル名を変更したいフォルダのパスを直接入力するか、隣の browse ボタンをクリックしてファイルダイアログから対象フォルダを選択します。 選択したフォルダ内のファイルが読み込まれ、左側の original files リストに一覧表示されます。 検索・置換条件の設定 search:このテキストボックスには、変更対象となる文字列を入力します。 ※チェックボックス「use regex」をオンにしている場合は、正規表現パターンとして解釈されます。 replace:「search」で指定した文字列にマッチした部分を、ここで指定した文字列で置換します。 exclude:もし一部のファイルを変更対象から除外したい場合は、ここにカンマ区切りで除外したいファイル名の末尾パターン（例: .log, .bak など）を入力します。 ※除外パターンに一致するファイルは、読み込み時に除外され、一覧に表示されません。 オプション設定 右上のエリアには、動作に関する各種チェックボックスがあります。 use regex: チェックを入れると、「search」に入力した文字列を正規表現として扱います。 ※正規表現を使いたい場合にオンにしてください。 case sensitive: チェックを入れると、大文字と小文字を区別した検索になります。 ※例えば「abc」と「abc」を区別したい場合にオンにしてください。 include subdirectories: チェックを入れると、指定したフォルダ内のサブディレクトリも対象に含めてファイル一覧を作成します。 ※サブフォルダ内のファイルも一括変更したい場合にオンにしてください。 プレビューによる確認 上記でディレクトリと変更条件（検索文字列、置換文字列、除外パターン、各種オプション）の設定が完了したら、右上の preview ボタンをクリックします。 すると、設定内容に基づいて各ファイル名がどのように変更されるかが計算され、preview パネル（右側のリスト）に表示されます。 プレビューリストでは、新しいファイル名と共に、元のファイル名（「before: ○○」と表示）が確認できるため、どのファイルが変更対象になっているかを事前に確認できます。 実際の変更の適用 プレビューで変更内容を確認し、問題がなければ apply changes ボタンをクリックしてください。 クリックすると、内部で変更が必要なファイルのみを対象に実際のリネーム処理が開始されます。 画面上部には進捗バーが表示され、処理の進行状況（何％完了しているか、何ファイルが変更されたか）が確認できます。 処理が完了すると、ステータスメッセージに「renamed ○ files, ○ errors」といった内容が表示され、結果を確認できます。 処理中・完了後の注意点 処理中は進捗バーで状況を確認： リネーム処理は並列処理（rayon）で実行されるため、大量のファイルでも効率的に進みます。進捗バーとステータスメッセージで、何ファイルが完了したか確認できます。 対象ファイルの確認： リネーム対象となったファイルは、元のファイル名と変更後のファイル名が異なるものだけです。プレビューリストで変更内容に誤りがないかしっかり確認してください。 エラーが発生した場合： たとえば、ファイルがロック中やアクセス権が不足している場合、リネームに失敗することがあります。ステータスメッセージにエラー件数が表示されるので、必要に応じて対象ファイルや権限の設定を確認してください。 補足 安全に使うために： 実際に変更を適用する前に、必ず preview で変更内容を確認してください。誤った条件で変更してしまうと、元に戻すのが困難になる場合があります。 コードの仕組みについて： このアプリは rust の gui フレームワーク druid を使用して作成されています。ファイル一覧の取得には walkdir を、文字列の置換には regex を利用しており、リネーム処理自体は並列実行（rayon）で効率的に行っています。"
  },
  {
    "title": "Rustで電卓アプリを作る！プログラム未経験者でもRustでアプリを作って遊べるよ。初心者向けの簡単なRustビルド方法を説明します。難しい話はゼロ",
    "url": "/blog/rust-ai-make/",
    "description": "OpenAIのo1登場以降AIが素晴らしく偽プログラマーが大量に登場しております。そのような偽プログラマーの1人ですが、今日はRustでミニアプリを作ってみましょう。AIはdeepseekなり好きなものを使いましょう。o1が安定でしょうね。Ubuntu環境でもよいですが、結局のところ偽プログラマーとしてはWindowsが簡単でよいです。",
    "tags": [
      "Rust",
      "作ったもの"
    ],
    "date": "2025年2月11日13時33分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。本記事の手順・画面・バージョン表記・外部リンクなどは、公開時点のものです。ソフトウェアの更新・api変更・uiの改定などにより、 現在は当てはまらない・再現しない場合があります 。実機での作業や契約・課金に関わる内容は、必ず各公式の最新情報で確認してください。 aiで作った凄い！という記事にうんざりしていることでしょう。本記事も同じ趣旨ですが、rustでミニアプリを作りたい人は参考にどうぞ。便利なミニツールが作れて重宝しますよ。 openaiのo1登場以降aiが素晴らしく偽プログラマーが大量に登場しております。 そのような偽プログラマーの1人ですが、今日はrustでミニアプリを作ってみましょう。 aiはdeepseekなり好きなものを使いましょう。 o1が安定でしょうね。 ubuntu環境でもよいですが、結局のところ偽プログラマーとしてはwindowsが簡単でよいです。 rustとはなんでしょうか。pythonを例に考えてみましょう。pythonはインタプリタ型言語のためコードを一行ずつ読み取ってその場で実行します。コードを書いてすぐに結果を確認できる利点がありますが、毎回コードを解釈しながら実行するため処理速度が遅くなります。 rustはコンパイル型言語であり、コードを事前にコンパイルして実行可能なバイナリを生成します。 直接機械語に変換されるため、実行速度が速く、メモリ使用効率も高いです。 またrustはコンパイル時に型チェックが行われるため、型に関連するエラーを早期に発見できます。 そのためaiに作ってもらうなら、エラーがビルド時に表示されるほうが修正しやすいでしょう。 プロジェクトの要件や目的に応じて、pythonとrustを適切に選択することが重要です。 aiによるrust解説は以下です。 rustはメモリ安全性・並行性・パフォーマンスを兼ね備えたシステムプログラミング言語です。ガベージコレクション不要でメモリ管理をコンパイル時に保証し、ダングリングポインタやデータ競合を未然に防ぎます。c/c++に匹敵する高速性を持ちつつ、安全な並行処理を実現します。 クロスプラットフォーム対応でos開発からwebassembly、ネットワークサービスまで幅広く活用され、ツールチェーン（cargo/rustup）や活発なエコシステム（crates.io）も強みです。信頼性が求められるシステムやセキュリティクリティカルな領域で優れています。 cargoはrustの公式ビルドシステム兼パッケージマネージャーです。プロジェクトのビルド、テスト、実行を一元管理し、依存関係をcargo.tomlに記述して自動解決します。cargo newでプロジェクトを作成し、cargo buildやcargo runでビルド・実行が可能です。また、cargo testでテストを実行し、cargo docでドキュメントを生成します。crates.ioと連携し、ライブラリの公開・利用もサポート。rust開発を効率化する必須ツールです。 rustをwindowsにインストール 以下からインストーラーをダウンロードします。dlの直リンクです。 https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe 指示通り進めてインストール完了です。ああ簡単。poweshellを開いてrustc --versionと入力してバージョンが返ってくればインストール完了です。 電卓ミニアプリでも作ってみましょう。「cargo new」でプロジェクトの基礎ファイルを自動でつくってくれます。便利！！cargo new dentaku 自動でこのようなファイルが作られます。cargo.tomlとsrcにあるmain.rsが重要なファイルです。 cargo.tomlはこんなファイルです。cargo.tomlにはアプリ名やライブラリの読み込みや依存関係を整理してくれます。aiに作りたいアプリの概要を伝えて、cargo.tomlの内容をコピーペーストすればokです。 main.rsにはプログラム本体を書きます。簡単ですね。 先ほどのcargo new dentakuで dentakuフォルダーが出来ているのでcdで移動して、cargo runを実行します。いわゆるコンパイルです。 コンパイルすると、だいたいエラーが出ます。10回ぐらいエラーが出るぐらいの気持ちでゆきましょう。このエラーをコピーして、aiに質問します。そうするとaiがエラーを見て修正したコードを出してくれます。 ビルドが成功しました。電卓アプリの完成です。まずシンプルに動作させるようにしましょう。動いてから改良してゆきます。 アプリのアイデアをひねりだしましょう。電卓に計算履歴の機能をつけてみましょう。aiへ機能のリクエストをするだけです。書き出されたコードをコピペ―してビルドします。計算履歴が付きました。セーブしてロードして保存もできます。 バグやレイアウトなどいろいろ修正して完成です。 完成したらcargo run --releaseをします。このcargo run --releaseの意味を説明します。 deepseekに質問してみます。deepseekは、思考途中が見れるのでおもしろいです。 ユーザーが「cargo run --releaseってなんですか」と質問してきました。まず、このコマンドの基本的な意味を理解する必要があります。cargoはrustのビルドシステム兼パッケージマネージャーなので、cargo runはプロジェクトの実行を担当します。--releaseオプションが付いているので、リリースビルドに関連していると推測できます。 次に、ユーザーの背景を考えます。前回の会話でrustのインストール方法を尋ねていたので、rust初心者である可能性が高いです。そのため、専門用語を避けつつ、分かりやすく説明する必要があります。 「--release」フラグの役割を説明する際には、デバッグビルドとの違いを明確にします。最適化やコンパイル時間とのトレードオフについて触れるべきです。また、リリースビルドの出力先（target/releaseディレクトリ）にも言及すると良いでしょう。 ユーザーが実際にこのコマンドを使うシナリオを想定し、例を挙げながら説明することで理解を深められます。例えば、プログラムの実行速度を上げたい場合や、最終的な配布用バイナリを作成する場合などが挙げられます。 さらに、関連するコマンドとしてcargo build --releaseとの違いについても説明が必要です。runがビルド後に実行するのに対し、buildはビルドのみを行う点を明確にします。 ユーザーがエラーに遭遇した場合のヒントも提供すると親切です。例えば、依存関係の問題やビルドエラーの対処法を簡単に述べます。 全体的に、簡潔で分かりやすい表現を心がけ、必要に応じて箇条書きやコード例を使用します。これにより、初心者でも理解しやすい回答を目指します。 初心者でも理解しやすい回答を見てみましょう。 cargo run --release は、rustプロジェクトをリリースモードでビルドし実行するためのコマンドです。デバッグ用の情報を省略し、コードを最大限に最適化します実行ファイルの速度が向上します代わりにコンパイル時間が長くなります。 ということで、リリースビルドするとデバック情報など簡略化された高速な実行ファイルが書き出されるのです。※exeファイルは野良アプリと一緒なのでたまにセキュリティに引っ掛かり起動しなくなったります。 この実行ファイルをクリックすれば、作ったアプリを起動できます。 このようにaiを使えば、自分性能のアプリが作れてしまうのです。私も10個ぐらいアプリを作りましてとても便利に使っています。blenderのアドオン、wordpressのプラグインも作れました。"
  },
  {
    "title": "プロジェクト全体の情報をJsonファイルにしてChatGPT o1やo1 Proへ伝える便利ツール「gpt-text-read」",
    "url": "/blog/gpt-text-read/",
    "description": "",
    "tags": [
      "Rust",
      "作ったもの"
    ],
    "date": "2025年1月13日15時4分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 chatgpt のモデル名・添付ファイル可否・コンテキスト上限 は記事執筆（o1 / o1 pro 言及）以降も変わっています。同じワークフローがそのまま使えない場合があります。 gpt-text-read 自体は github の readme とリリースで最新の挙動を確認してください（ui や設定ファイル形式が更新されている可能性）。 秘密情報を json に含めない 注意は不変ですが、クラウド ai への貼り付けは組織ポリシーで禁止されていることが多いです。 copilot・エージェント型ツールの普及で、「リポジトリ全体を読ませる」手段も増えており、記事の前提は古く見える場合があります。 最近はgptでコードを書くのが当たり前になり、プログラマーでも自力でコードを書かない人が増えてきました。 プログラムができなくてもgptのおかげでそれなりに形にできる時代です。 o1などのaiはどんどん進化していますが、o1など最新のバージョンはファイルをアップできなかったり、web情報を直接読み込めなかったりと制限もあります（いずれ解消されるはずです）。 このまま進めば1～2年で、人間が関わらなくてもaiだけで解決できる課題が増えていくでしょう。私もrustで色々とアプリを作りますが、cargo.tomlとmain.rsの概念しか知らない程度です。 問題は、生成してもらったプログラムが大きくなると、chatgpt o1やo1 proへ上手く伝えられなくなる点ですが、これも近々解消されると思います。プログラムができる人はgithub copilotなどのツールで、こうした初心者的な悩みもないでしょう。 そういったプログラムをchatgpt o1やo1 proへ上手く伝えるためのツールを作りました。生成系aiしか使えない「ニセ自称プログラマー」向けに作ったのが「 gpt-text-read 」です。 フォルダ内のテキストファイルを正規表現でまとめてguiに表示し、json形式でコピーや保存でき、そのままchatgpt o1やo1 proへ貼り付けるとプロジェクト全体の情報をgptへ伝えることができます。生成系aiしか使えない「ニセ自称プログラマー」には、とても便利です。 「 gpt-text-read 」はgitでもコードを公開しています。 （実はgitの使い方もよくわかっていないのは内緒です。） https://github.com/riragon/gpt-text-read gpt-text-read を実際に使ってみよう 例えばこのような感じでプログラムをaiで開発しているとします。 プログラムも大きくなり分割して複数ファイルで構成されているとします。 アプリを起動します。 インターフェースが開きます。 プロジェクトがあるフォルダートップを選択します。 読み込むファイルを追加してゆきます。 読み込まないフォルダー（実行ファイルなどやログなど、プログラムと関係のない大量のファイルを含むものなど）を追加します。 読み込み実行をするとファイルを読み込みgptが読みやすいjsonファイルに変換してくれます。あとはコピーして貼り付けるだけです。ツリー表示にチェックを入れると、フォルダー構成も出力してくれます。 gptに聞くとファイル情報がしっかり読めたと回答がありました。これでプロジェクト全体を伝えやすくなりました。地味に便利です。 秘密の鍵や、外部に漏れるとよろしくない情報がある場合は、よく注意して対象ファイルを選択してください。 gpt-text-read はgitでもコードを公開しています。 https://github.com/riragon/gpt-text-read プロジェクト概要 このプロジェクト「gpt-text-read」は、フォルダ内のテキストファイルを収集し、 その内容をjson形式で表示・コピー・テキスト出力できるguiツールです。 ユーザーは正規表現パターンを使って対象ファイルや除外ファイルを柔軟に指定できます。 また、gui上でフォルダを選択・ファイルを追加・フォルダ除外などを行うことで、 簡単にパターンの編集を行うことができます。 主な機能 プロジェクトディレクトリの選択： 「 プロジェクト選択 」ボタンを使ってフォルダを選ぶと、 指定フォルダ内に text-read-settings.txt がない場合は初期設定ファイルを自動生成します。 存在する場合は、その内容（ファイルマッチパターンや出力先パスなど）を読み込みます。 ファイル追加ボタン： 「 ファイル追加 」ボタンで実際のファイルを選択すると、 そのファイル名にマッチする正規表現パターン（ ^ファイル名$ ）が text-read-settings.txt のincludeパターンへ追記されます。 フォルダ除外ボタン： 「 フォルダ除外 」ボタンを押すと、フォルダ名に対する除外パターン（ ^foldername/.*$ ）を text-read-settings.txt のexcludeパターンへ追記できます。 デフォルトでは .git や target が自動的に除外パターンに含まれます。 ツリー表示チェック： 「 ツリー表示 」チェックボックスを有効にすると、 フォルダの階層構造をテキストツリーとして取得できます。 設定保存ボタン： 「 設定保存 」ボタンにより、現在guiで編集したパターン内容を text-read-settings.txt へ書き戻します。 また、テキスト出力した際も、出力先フォルダが output_path として保存されます。 読み込み実行ボタン： 「 読み込み実行 」ボタンで、現在のパターンにマッチするファイルを再帰的に探索し、 対象ファイルの内容をjson形式でウィンドウ上に表示します。 （ツリー表示がonならディレクトリ構造も表示します） コピー機能： 「 コピー 」ボタンで、表示されたjsonテキストをクリップボードへコピーできます。 テキスト出力： 「 テキスト出力 」ボタンで、表示中のjsonテキストを任意のパスに出力できます。 出力先フォルダが text-read-settings.txt の output_path に自動保存され、 次回以降の保存先の初期値として利用されます。 利用手順 プロジェクトフォルダを選択する： 「 プロジェクト選択 」ボタンを押し、対象とするフォルダをダイアログから選びます。 初回は text-read-settings.txt が自動作成され、初期除外パターンやコメントが含まれます。 ファイル追加・フォルダ除外・パターン編集を行う： 「 ファイル追加 」や「 フォルダ除外 」ボタンで実際のファイル・フォルダを追加/除外すると、 そのパターンが pattern_input （guiエリア）に自動的に追加されます。 また、gui上でパターンを手動編集することもできます。 設定を保存する： 「 設定保存 」ボタンで現在のパターンを text-read-settings.txt へ保存します。 読み込みを実行する： 「 読み込み実行 」ボタンでパターンにマッチしたファイルを読み込み、 json形式で結果を表示します。 また、 ツリー表示 チェックがonの場合はディレクトリ構造が合わせて表示されます。 コピーまたはテキスト出力： jsonをコピーしたい場合は「 コピー 」ボタンを押します。 テキストファイルとして出力したい場合は「 テキスト出力 」ボタンを押し、 出力先フォルダを指定します。その後の出力先は設定ファイル output_path へ保存されます。 依存関係・ビルド このプロジェクトはrustで開発されており、 cargo.toml の例は以下の通りです： [package] name = \"gpt-text-read\" version = \"0.1.0\" edition = \"2021\" [dependencies] walkdir = \"2\" regex = \"1\" serde = { version = \"1\", features = [\"derive\"] } serde_json = \"1\" rfd = \"0.8\" fltk = { version = \"1\", features = [\"fltk-bundled\"] } chrono = \"0.4\" cargo build や cargo run でビルド・実行できます。 コード構成 main.rs にguiの初期化、ボタンコールバック、ファイルパターンの読み込み・保存、 およびファイル収集処理が記述されています。 text-read-settings.txt にはincludeパターンとexcludeパターン、そして output_path が含まれ、 guiからの編集によって内容が更新されます。 fileops.rs には、指定フォルダを再帰的に探索してマッチするファイルを集める機能や、 ディレクトリツリーを構築する機能が定義されています。 settings.rs には、 text-read-settings.txt の読み書きロジックがあり、 includeパターン・excludeパターン・出力先パス( output_path )を管理します。"
  },
  {
    "title": "ゴミのような中華系4G LTE Wifi USBドングルが本当に動作するか試してみた",
    "url": "/blog/4g-lte-wifi-usb/",
    "description": "そこでAmazonで購入したゴミのような中華系4G LTE Wifi USBドングルが本当に動作するか試してみました。USBドングル系では、ピクセラなどが有名ですが10000円以上するので買う気になりません。LTEバンドが適合すれば、それなりに通信するでしょう。Amazonで購入したゴミのような中華系4G LTE Wifi USBドングルは4000円ぐらいです。",
    "tags": [
      "リモート操縦",
      "良かったもの"
    ],
    "date": "2024年11月3日22時36分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 モバイルルータ・usb ドングルの型番・バンド対応・ファームはキャリアとメーカー更新で変わります。購入前に最新の仕様表を確認してください。 apn・ipv6・sim ロックの扱いは契約プラン次第です。記事の設定例は当時のキャリア向けです。 電波品質と速度は設置場所に強く依存します。記事の測定値は参考程度にしてください。 リモート操作するrcカーのlte通信を出来るだけ安くしたく、お金をかけずに使えるsimモバイル端末を探しました。 理想のsimモバイルルータを購入すると数万円になります。 ちょっと高いです。 本当はlanコネクタ接続できるタイプが理想ですがusbで妥協します。 wifiでの接続は望ましくありません。 リモート操作用なので有線であることが条件です。 そこでamazonで購入したゴミのような中華系4g lte wifi usbドングルが本当に動作するか試してみました。 usbドングル系では、ピクセラなどが有名ですが10000円以上するので買う気になりません。 lteバンドが適合すれば、それなりに通信するでしょう。 amazonで購入したゴミのような中華系4g lte wifi usbドングルは4000円ぐらいです。 同じ形状のものが2000円からありますが、選別して4000円のものを買ってしまいました。 b1 b3 b5 b7 b8 b20 b28 b38 b40 b41とバンドの対応が多かったのです。 https://www.amazon.co.jp/gp/product/b0ck9hwywg/ たぶん2000円ぐらいでも同じじゃないかな。★1つや★2を見ると怖くて購入できませんでした。 中華系4g lte wifi usbドングル仕様 アイテムタイプ: 4g lte usb 材質: abs モデル: mf89u ハードウェア仕様: 直接 usb 電源 カード スロット: マイクロ sim 4g lte 帯域: b1 b3 b5 b7 b8 b20 b28 b38 b40 b41 ピーク レート: ダウンロード レート最大 150mbps 共有: 最大 8 ユーザー : 802.11 b g n をサポート<アンテナ: 内蔵 1 x 2.4g、4g: 2t2r 伝送速度: 11b: 1/2/5.5/11mbps 11g: 6/9/12/18/24 /36/48/54mbps 11n: 最大 150mbps 周波数範囲: 2.4-2.4835ghz データ暗号化: wpa psk wpa2 psk、wpa wpa2 4g ネットワーク規格: cat 4 製品サイズ: 約。 97 x 33 x 10mm / 3.8 x 1.3 x 0.4 インチ 使用方法: 背面カバーをスライドさせて着脱し、 sim カードをロードすれば準備完了です。 simカードは、怪しいバルクsimカード 10gb 180日 国内データ通信専用 nttドコモ回線（docomo 回線） lte simカードは、yahooショッピングでプリペイドsimカード 10gb 180日 国内データ通信専用 nttドコモ回線（docomo 回線） lteを購入しました。2000円ぐらいです。こちらもゴミのようなsimカードでした。くそみたいなマニュアルを見ながら設定します。スマホでも利用できました。 中華系4g lte wifi usbドングルはペラッペラのプラスチックです。中身もカスカスですが、貧弱なsimスロットにsimカードを装着しました。 プラスチックがペラペラすぎて、一度フタをあけたら閉まらなくなりました。まあどうでもよいです。 usbでパソコンに接続します。192.168.0.1でusbドングルにアクセスできます。httpで接続するように注意してください。admin/adminでログインできます。 設定画面は意外とよくできていてapnの設定を何もしなくても接続できました。自動です。素晴らしい！！ 接続と通信が上手く行くと赤ランプから緑ランプになります。接続が成功しているのか一目でわかります。素晴らしい！ 通信速度のテストをしてみました。5mbpsから10mbpsでこんなものでしょう。ダウンロードよりアップロードが強いという使用です。rcカー用で映像を送信するのでむしろありがたい。レイテンシ26ミリと悪くないですね。 10gbだけですが最大180日間2000円でsimドングルとして使えるならまあよかったのではないでしょうか。速度が遅いのは端末が原因なのかsimが原因なのかはっきりしません。スマホにsimを指しても10mbpsぐらいだったのでsimが遅いのかもですね。まあこのドングルも高速ではないでしょう。 ちなみにrcカーの通信速度は1mbpsです。1mbpsで1時間通信すると、約500mb（約0.42gb）のデータ容量です。10gb使えるので、20時間ぐらい通信できるはずです。rcカー自体はテストで数10分ぐらいの動作ですから、3か月ぐらいはいろいろテストできるのではないでしょうか。まあ安く収まったのでは？"
  },
  {
    "title": "素数の出現比率の偏りを検証してみた！20秒で1から100億（10,000,000,000）の11桁の自然数の中から、素数4億5505万2,511（455,052,511）個を見つけるRustプログラム。巨大な素数生成アプリとしても使えます",
    "url": "/blog/ssosu-kenshou-sakusei-katayori/",
    "description": "20秒で1から100億（10,000,000,000）の11桁の自然数の中から、素数4億5505万2,511（455,052,511）個を見つけるRustプログラムを作ってみました。ネットワークやGPUを使ったりアルゴリズムを改良することでもっと高速になるでしょう。\n本記事の趣旨は、ChatGPTなどのAIの可能性についてです。プログラムが有無を問わず、何か専門分野の研究などを加速させる力があるでしょう。学生や子供でも世界的な発見ができる新しい時代を感じます。まさに新しいツールです。",
    "tags": [
      "Rust",
      "素数",
      "作ったもの"
    ],
    "date": "2024年11月3日19時44分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 rust のコンパイラ・標準ライブラリ・最適化の挙動は版で変わります。記事のビルドコマンドとベンチ数値は再計測してください。 素数探索の実装はアルゴリズムと並列化次第で桁違いに速くなります。記事は当時の単一マシン向けサンプルです。 公開している実行ファイルや配布ページの url・利用条件は変更されることがあります。 改良したアプリをこちらに掲載 https://riragon.com/sosu-seisei-sieve/ 20秒で1から100億（10,000,000,000）の11桁の自然数の中から、素数4億5505万2,511（455,052,511）個を見つけるrustプログラムを作ってみました。ネットワークやgpuを使ったりアルゴリズムを改良することでもっと高速になるでしょう。 本記事の趣旨は、chatgptなどのaiの可能性についてです。aiにはプログラムの有無を問わず専門分野の研究を加速させる力があるでしょう。学生や子供でも世界的な発見ができる新しい時代を感じます。まさに新しいツールです。 私は素数やrustに関しては初心者です。プログラムもpythonのひどく疎かな基礎知識しかありません。素数が1とその数自身でしか割り切れない数であることを昨日初めて学びました。そして今日プログラムを作ったのです。 またwebでは素数のサンプルは5000万個ぐらいまでしかdlできません。自分でコードを作成すれば好きなだけ素数のサンプルを出力できます。 巨大な素数生成実行ファイル 巨大な素数生成アプリが公開されていない気がするので、今回作成した素数生成実行ファイル（windows用sosu.exe）をついでにアップしておきます。80億個ぐらいの素数を10分ぐらいで出力できました。もっと大きなファイルも作れるでしょう。あらゆる点において野良アプリなので自己責任でつかってください。 巨大な素数生成アプリsosu.exe https://drive.google.com/file/d/11agm0k1s4dkwndos4q2oj93bkbao7vje/view?usp=drive_link 素数のおもしろい特徴 素数は数字の末尾がかならず1、3、7、9になります。その1、3、7，9だけに注目すると出現比率は大体25％になり、素数はランダムに見えます。しかし2016年にサウンダララジャン氏が末尾の数字が連続した場合、次に同じ数字がくる確率が低いことを論文として発表しました。 https://arxiv.org/abs/1603.03720 以下記事など分かりやすく紹介されています。※もし完全にランダムであれば、同じ数字が連続した場合でも次にくる数字の出現頻度は同じになるのです。 https://www.itmedia.co.jp/news/articles/2407/04/news044.html https://www.gizmodo.jp/2016/03/prime-number-not-so-random.html 2016年以前からも素数には何らかの潜在的な規則性やパターンが存在するとされており、リーマン予想や素数定理、ハーディ・リトルウッド予想などが知られています。まあ、意味が良く分からないですよね。こんなことプログラムも数学もできない庶民には、1mmも理解できません。 今の時代はchatgpt o1-previewやo1-miniがあるじゃないですか。実際に素数がランダムではないということを検証してみましょう。つまりchatgpt o1-previewやo1-miniがあれば、小学生でも2016年に発見したことを発見できてしまう可能性があるということです。 rustで素数を発見するプログラムを作る 素数を効率よく見つけるために、もっとも一般的なエラトステネスのふるいを使用しています。素数は末尾が1、3、7、9になり、4で割った余りが1または3です。もっと簡単に言えば素数が2の倍数（偶数）でも5の倍数でもないということです。プログラムでは、2と5の倍数を計算対象から初めから除外しています。 さらにプログラムはエラトステネスのふるいを改良して、指定した個数まで小さな素数を事前に計算しメモリ内のベクターに保存します。これらの倍数を大きな数範囲の素数探索に利用しています。 複数のcpuを同時に使えるように並列処理、エラトステネスのふるいのセグメント化、バッファリング、設定項目の外部ファイル化などを実装しました。以下rustのコードです。 rust コード（google ドキュメント） 使い方を簡単に紹介します。rustの環境をubuntuで構築します。 curl --proto '=https' --tlsv1.2 -ssf https://sh.rustup.rs | sh source $home/.cargo/env sudo rustup target add x86_64-pc-windows-gnu sudo apt install mingw-w64 cargo new sosu cd sosu cargo.tomlとsrc/main.rsをコピーして、実行すれば計算が開始されます。windows用の実行ファイルとしてexeファイルも書き出せますが今回は説明しません。 cargo run --release cargo run --releaseで実行するとsettings.txtが作成されます。 これが初期設定です。 設定を変えたい場合は書き換えてください。 primes.txtには発見した素数が記載されています。 巨大なので普通のエディタでは開けません。 ※primes.txtを普通のエディタで開きたいときはprime_maxを1000とか10000ぐらいに小さくしてください。 prime_cache_sizeも100とか1000とか。 文字化けするかも。 なにかエディタツールで開くのがよいでしょう。 settings.txtの項目説明 prime_cache_size = 100000 segment_size = 10000000 chunk_size = 16384 writer_buffer_size = 8388608 prime_max = 10000000000 prime_cache_size = 100000 最初に生成する素数の数を指定します。この値までの素数を計算しメモリ内にキャッシュします。これらの素数は後続の計算で、より大きな数の範囲における素数判定の基準として使用されます。小さい素数のエラトステネスのふるいを用いて大きな数の範囲内で素数の倍数を除外することで、計算量が大幅に削減され、全体の効率が向上します。 segment_size = 10000000 セグメント化されたエラトステネスのふるいで一度に処理する数の範囲を定義します。セグメント化することにより、メモリ使用量を管理しやすくなり、大きな数範囲を効率良く処理できるようになります。各セグメントは独立して処理できるため、並列処理や分散処理にも適しています。 chunk_size = 16384 並列処理する際に分割する各チャンクのサイズを指定します。プログラムは、セグメント内の数をさらにこのサイズのチャンクに分割し、それぞれのチャンクを個別に並列処理します。チャンクサイズを適切に設定することで、多核プロセッサの能力を最大限に活用でき、ロードバランシングを改善し、処理速度を向上させることができます。 writer_buffer_size = 8388608 ファイルへの書き込みを行う際に使用するバッファのサイズ（バイト単位）を指定します。ここでは8mbのバッファが割り当てられます。ファイルi/oの効率を向上させるために、大きなバッファを使用してディスクへの書き込みをバッチ処理します。これにより、i/oの待ち時間が減少し、全体のパフォーマンスが向上します。 prime_max = 10000000000 プログラムが探索する最大の数を定義します。素数探索の範囲を事前に定義することで、プログラムの実行計画を適切に立て、必要なリソースを見積もり、期待される結果を計画的に得ることができます。10000000000は100億です。 利用する環境に合わせて数値を調整できます。 rustで素数を発見してみよう 素数のテキストは思ったより容量が大きいのです。webで素数のダウンロードを検索しても最大で5,000万個ぐらいの素数しか見つかりません。少ない？自分でプログラムを走らせれば、20秒ぐらいで4億個ぐらい発見できます。 100億の数字の中から、25秒で455052511個の素数を発見しました。cpuはgen intel(r) core(tm) i9-13980hxです。ちなみにテキストのファイルサイズは4.6gbもあります。無駄に大きい！ サウンダララジャン氏が末尾の数字が連続した場合、次に同じ数字がくる確率が低いことを検証してみた 455052511個の素数が入手できたので、末尾の数字が連続した場合、次に同じ数字がくる確率が低いことを再検証してみました。455052511個の素数を分析します。 ※普通に1、3，7，9の出現率を求めたところ数を増やすと、ほぼ25%の出現比率でした。 10桁の素数（404204977個）に対する各桁位置の数字出現頻度（％）とカウント: 末尾の数字の出現頻度（％）とカウント: 数字 0: 0.00% (0) 数字 1: 25.00% (101050133) 数字 2: 0.00% (0) 数字 3: 25.00% (101053126) 数字 4: 0.00% (0) 数字 5: 0.00% (0) 数字 6: 0.00% (0) 数字 7: 25.00% (101051725) 数字 8: 0.00% (0) 数字 9: 25.00% (101049993) 以下455052511個中、連続した末尾の場合何が来るか出現頻度を求めたものです。1、3，7，9，それぞれで10回連続まで求めました。プログラムは掲載しません。気になる人はコードを作ってお試しください。 末尾が1 末尾が1の素数が1回連続で終わった後の次の素数の末尾の総数: 113761519 次の素数の末尾の出現頻度: 末尾が1: 18.83% (21423878) 末尾が3: 29.43% (33479893) 末尾が7: 29.62% (33692895) 末尾が9: 22.12% (25164853) 末尾が1の素数が2回連続で終わった後の次の素数の末尾の総数: 21423878 次の素数の末尾の出現頻度: 末尾が1: 16.88% (3615401) 末尾が3: 31.29% (6704060) 末尾が7: 28.78% (6166159) 末尾が9: 23.05% (4938258) 末尾が1の素数が3回連続で終わった後の次の素数の末尾の総数: 3615401 次の素数の末尾の出現頻度: 末尾が1: 16.40% (592917) 末尾が3: 31.53% (1139757) 末尾が7: 29.50% (1066418) 末尾が9: 22.58% (816309) 末尾が1の素数が4回連続で終わった後の次の素数の末尾の総数: 592917 次の素数の末尾の出現頻度: 末尾が1: 15.64% (92705) 末尾が3: 31.78% (188433) 末尾が7: 29.57% (175306) 末尾が9: 23.02% (136473) 末尾が1の素数が5回連続で終わった後の次の素数の末尾の総数: 92705 次の素数の末尾の出現頻度: 末尾が1: 15.21% (14097) 末尾が3: 31.66% (29347) 末尾が7: 29.77% (27602) 末尾が9: 23.36% (21659) 末尾が1の素数が6回連続で終わった後の次の素数の末尾の総数: 14097 次の素数の末尾の出現頻度: 末尾が1: 15.06% (2123) 末尾が3: 31.40% (4426) 末尾が7: 30.03% (4233) 末尾が9: 23.52% (3315) 末尾が1の素数が7回連続で終わった後の次の素数の末尾の総数: 2123 次の素数の末尾の出現頻度: 末尾が1: 16.63% (353) 末尾が3: 30.90% (656) 末尾が7: 29.82% (633) 末尾が9: 22.66% (481) 末尾が1の素数が8回連続で終わった後の次の素数の末尾の総数: 353 次の素数の末尾の出現頻度: 末尾が1: 16.71% (59) 末尾が3: 28.33% (100) 末尾が7: 30.03% (106) 末尾が9: 24.93% (88) 末尾が1の素数が9回連続で終わった後の次の素数の末尾の総数: 59 次の素数の末尾の出現頻度: 末尾が1: 8.47% (5) 末尾が3: 30.51% (18) 末尾が7: 45.76% (27) 末尾が9: 15.25% (9) 末尾が1の素数が10回連続で終わった後の次の素数の末尾の総数: 5 次の素数の末尾の出現頻度: 末尾が1: 0.00% (0) 末尾が3: 20.00% (1) 末尾が7: 60.00% (3) 末尾が9: 20.00% (1) 末尾が3 末尾が3の素数が1回連続で終わった後の次の素数の末尾の総数: 113765625 次の素数の末尾の出現頻度: 末尾が1: 24.19% (27517671) 末尾が3: 18.23% (20741925) 末尾が7: 27.97% (31818060) 末尾が9: 29.61% (33687968) 末尾が3の素数が2回連続で終わった後の次の素数の末尾の総数: 20741925 次の素数の末尾の出現頻度: 末尾が1: 25.24% (5234812) 末尾が3: 17.13% (3553485) 末尾が7: 28.06% (5819248) 末尾が9: 29.57% (6134380) 末尾が3の素数が3回連続で終わった後の次の素数の末尾の総数: 3553485 次の素数の末尾の出現頻度: 末尾が1: 25.40% (902745) 末尾が3: 16.45% (584632) 末尾が7: 28.40% (1009296) 末尾が9: 29.74% (1056812) 末尾が3の素数が4回連続で終わった後の次の素数の末尾の総数: 584632 次の素数の末尾の出現頻度: 末尾が1: 25.89% (151361) 末尾が3: 15.71% (91818) 末尾が7: 28.59% (167125) 末尾が9: 29.82% (174328) 末尾が3の素数が5回連続で終わった後の次の素数の末尾の総数: 91818 次の素数の末尾の出現頻度: 末尾が1: 26.07% (23937) 末尾が3: 15.07% (13838) 末尾が7: 28.71% (26363) 末尾が9: 30.15% (27680) 末尾が3の素数が6回連続で終わった後の次の素数の末尾の総数: 13838 次の素数の末尾の出現頻度: 末尾が1: 25.69% (3555) 末尾が3: 15.17% (2099) 末尾が7: 28.72% (3974) 末尾が9: 30.42% (4210) 末尾が3の素数が7回連続で終わった後の次の素数の末尾の総数: 2099 次の素数の末尾の出現頻度: 末尾が1: 25.77% (541) 末尾が3: 14.58% (306) 末尾が7: 28.54% (599) 末尾が9: 31.11% (653) 末尾が3の素数が8回連続で終わった後の次の素数の末尾の総数: 306 次の素数の末尾の出現頻度: 末尾が1: 27.45% (84) 末尾が3: 14.71% (45) 末尾が7: 23.86% (73) 末尾が9: 33.99% (104) 末尾が3の素数が9回連続で終わった後の次の素数の末尾の総数: 45 次の素数の末尾の出現頻度: 末尾が1: 24.44% (11) 末尾が3: 20.00% (9) 末尾が7: 28.89% (13) 末尾が9: 26.67% (12) 末尾が3の素数が10回連続で終わった後の次の素数の末尾の総数: 9 次の素数の末尾の出現頻度: 末尾が1: 33.33% (3) 末尾が3: 11.11% (1) 末尾が7: 33.33% (3) 末尾が9: 22.22% (2) 末尾が7 末尾が7の素数が1回連続で終わった後の次の素数の末尾の総数: 113764039 次の素数の末尾の出現頻度: 末尾が1: 25.46% (28959412) 末尾が3: 26.89% (30589282) 末尾が7: 18.22% (20731084) 末尾が9: 29.43% (33484260) 末尾が7の素数が2回連続で終わった後の次の素数の末尾の総数: 20731084 次の素数の末尾の出現頻度: 末尾が1: 24.67% (5114113) 末尾が3: 26.74% (5543259) 末尾が7: 17.13% (3551409) 末尾が9: 31.46% (6522303) 末尾が7の素数が3回連続で終わった後の次の素数の末尾の総数: 3551409 次の素数の末尾の出現頻度: 末尾が1: 24.54% (871366) 末尾が3: 27.04% (960152) 末尾が7: 16.46% (584595) 末尾が9: 31.97% (1135296) 末尾が7の素数が4回連続で終わった後の次の素数の末尾の総数: 584595 次の素数の末尾の出現頻度: 末尾が1: 24.56% (143572) 末尾が3: 27.06% (158217) 末尾が7: 15.79% (92316) 末尾が9: 32.58% (190490) 末尾が7の素数が5回連続で終わった後の次の素数の末尾の総数: 92316 次の素数の末尾の出現頻度: 末尾が1: 25.03% (23104) 末尾が3: 27.07% (24991) 末尾が7: 15.22% (14047) 末尾が9: 32.69% (30174) 末尾が7の素数が6回連続で終わった後の次の素数の末尾の総数: 14047 次の素数の末尾の出現頻度: 末尾が1: 25.55% (3589) 末尾が3: 26.80% (3764) 末尾が7: 15.13% (2125) 末尾が9: 32.53% (4569) 末尾が7の素数が7回連続で終わった後の次の素数の末尾の総数: 2125 次の素数の末尾の出現頻度: 末尾が1: 26.40% (561) 末尾が3: 27.81% (591) 末尾が7: 15.01% (319) 末尾が9: 30.78% (654) 末尾が7の素数が8回連続で終わった後の次の素数の末尾の総数: 319 次の素数の末尾の出現頻度: 末尾が1: 27.90% (89) 末尾が3: 29.78% (95) 末尾が7: 13.17% (42) 末尾が9: 29.15% (93) 末尾が7の素数が9回連続で終わった後の次の素数の末尾の総数: 42 次の素数の末尾の出現頻度: 末尾が1: 35.71% (15) 末尾が3: 19.05% (8) 末尾が7: 16.67% (7) 末尾が9: 28.57% (12) 末尾が7の素数が10回連続で終わった後の次の素数の末尾の総数: 7 次の素数の末尾の出現頻度: 末尾が1: 28.57% (2) 末尾が3: 28.57% (2) 末尾が7: 28.57% (2) 末尾が9: 14.29% (1) 末尾が9 末尾が9の素数が1回連続で終わった後の次の素数の末尾の総数: 113761326 次の素数の末尾の出現頻度: 末尾が1: 31.52% (35860558) 末尾が3: 25.45% (28954524) 末尾が7: 24.19% (27521999) 末尾が9: 18.83% (21424245) 末尾が9の素数が2回連続で終わった後の次の素数の末尾の総数: 21424245 次の素数の末尾の出現頻度: 末尾が1: 33.71% (7222175) 末尾が3: 24.47% (5241940) 末尾が7: 24.95% (5345419) 末尾が9: 16.87% (3614711) 末尾が9の素数が3回連続で終わった後の次の素数の末尾の総数: 3614711 次の素数の末尾の出現頻度: 末尾が1: 34.43% (1244546) 末尾が3: 24.55% (887541) 末尾が7: 24.60% (889325) 末尾が9: 16.41% (593299) 末尾が9の素数が4回連続で終わった後の次の素数の末尾の総数: 593299 次の素数の末尾の出現頻度: 末尾が1: 34.93% (207221) 末尾が3: 24.45% (145062) 末尾が7: 24.97% (148169) 末尾が9: 15.65% (92847) 末尾が9の素数が5回連続で終わった後の次の素数の末尾の総数: 92847 次の素数の末尾の出現頻度: 末尾が1: 35.16% (32648) 末尾が3: 24.62% (22858) 末尾が7: 25.14% (23340) 末尾が9: 15.08% (14001) 末尾が9の素数が6回連続で終わった後の次の素数の末尾の総数: 14001 次の素数の末尾の出現頻度: 末尾が1: 35.06% (4909) 末尾が3: 25.16% (3523) 末尾が7: 25.11% (3516) 末尾が9: 14.66% (2053) 末尾が9の素数が7回連続で終わった後の次の素数の末尾の総数: 2053 次の素数の末尾の出現頻度: 末尾が1: 34.53% (709) 末尾が3: 25.38% (521) 末尾が7: 26.21% (538) 末尾が9: 13.88% (285) 末尾が9の素数が8回連続で終わった後の次の素数の末尾の総数: 285 次の素数の末尾の出現頻度: 末尾が1: 33.68% (96) 末尾が3: 24.56% (70) 末尾が7: 31.58% (90) 末尾が9: 10.18% (29) 末尾が9の素数が9回連続で終わった後の次の素数の末尾の総数: 29 次の素数の末尾の出現頻度: 末尾が1: 41.38% (12) 末尾が3: 27.59% (8) 末尾が7: 27.59% (8) 末尾が9: 3.45% (1) 末尾が9の素数が10回連続で終わった後の次の素数の末尾の総数: 1 次の素数の末尾の出現頻度: 末尾が1: 0.00% (0) 末尾が3: 100.00% (1) 末尾が7: 0.00% (0) 末尾が9: 0.00% (0) 以上からとても面白い特徴が分かります。もしランダムなら数字が連続する場合に他の数字より出現頻度が下がることはありません。明らかに何か法則があるので出現が下がるといえます。 1、3、7，9の出現はほとんどランダムに近いです。しかし連続する場合は、連続する数字が出にくくなり、他の数字が出やすく循環するような出現になっています。そのため連続する場合は数字に偏りがあるが、1、3、7，9の出現はほとんどランダムに近いということが分かります。おもしろいですね。 また同じ数字が続く場合、さらに出現しにくくなります。素数の数がある程度大きくなるとその傾向はなくなりそうです。 まったくの数学初心者＆プログラム初心者がわずか２日でここまで分析できました。もし1カ月ぐらい毎日何か法則を探したら、いまだ発見されていない傾向を見つけられるかもしれません。 小学生でも2016年の発見のように、わかりやすい面白い今までの概念を覆す何かを見つけられるかもしれません。もちろん数学や学術的な基礎がなければ、それを見つけても何も証明できないでしょう。すごい時代が来ましたね。 最後に検証で780秒、200,000,000,000（2千億）で、8,007,105,059個の素数でした。ファイルサイズは92gbです。すべての数字が正しいかは未検証ですが、たぶん正しいのでは？小さい数字では確認しました。"
  },
  {
    "title": "第4回：RCカーをリモート操作、送信機と受信機を作りネットワーク越し/5G/VPNでRCカーを操作してみよう",
    "url": "/blog/04-network-remote-rccar-test/",
    "description": "",
    "tags": [
      "リモート操縦",
      "作ったもの"
    ],
    "date": "2024年9月29日10時39分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 raspberry pi os・python・各種ライブラリの版は更新されます。公式のセットアップ手順とパッケージ名で再確認してください。 rc 用モータードライバ・ゲームパッド・配線は型番によって仕様が異なります。電源容量と実機接続を必ず見直してください。 通信は wi-fi・モバイル回線・ルーター設定に依存します。記事内のコマンド例は当時の環境向けです。 送信機と受信機を作りネットワーク越しでrcカーを操作してみます。 前回はrcカーのサーボとモーターをusbゲームパットで操作しました。 今回はネットワーク経由で送信側と受信側を分けて小さなリモート操作のテストをしてみます。 送信側はwindowsでもスマートフォンでも良いのですが、今回はraspberry pi5を送信機にします。 raspberry pi5（ubuntu24.04）で以下のセットアップします。 usbゲームパットの信号を送るだけですから環境は単純なものです。 第4回はさまざまな試行錯誤をしています。そのためまとまりがない記事で参考にならないでしょう。混乱する内容であり、経過としてみてください。雑記です。リモート操縦するための原理の検証が出来ました。 raspberry pi5を送信機にセットアップ sudo apt update && sudo apt upgrade sudo apt install python3-pip python3-venv build-essential git python3 -m venv myenv source myenv/bin/activate pip3 install inputs ネットワークで送受信をするためにipを設定します。 適宜環境に合わせてください。 記事当初はシンプルなネットワーク経由の信号送受信チェックの記事にする予定でしたが、さまざまな問題があり以下コードは改良したものになります。 そのためコードが長く複雑になっています。 未知のエラーや不要なブロックなどもあるでしょう。 例えばサーボに関しては、1～-1ではなく、0.5～－0.5にするべきですが改善していません。 サーボが回転し過ぎてギリギリっとなっています。 raspberry piを使ってゲームパッドの操作信号を受け取り、udpソケットを介して別のraspberry piへ送信するためのものです。 raspberry piの送受信コード send.pyとreceive.py ワードプレスに張り付けるとインデントがどうしても削除されてしまいます。どうやらコード内の<と、離れた場所の>があるため、掲載すると一行になるという現象です。google docに貼り付けました。 send.py / receive.py（google ドキュメント） コードの作成で考慮したこと リアルタイム性を重視するためにudp（user datagram protocol）を使用してデータを送信しています。udpの特性として、非接続型プロトコルであるため接続確立の遅延がなく、低オーバーヘッドでデータを送受信でき、データの損失を許容しながらも即時性を確保することが可能です。 これにより遠隔操作されるrcカーへの指令を迅速かつ連続的に送ることができ、応答性を最大化しています。 送信側が信号を出しながら突然切断が発生した場合に、rcカーは走り続けてしまうことがあります。完全な仕組みではありませんが、簡易的なタイムアウトと安全モードを入れてあります。 最後の受信時刻から一定期間データが受信されない場合（タイムアウト）、デバイスを安全な状態（モーターを停止状態に）に設定します。 これにより、予期せぬ動作や事故を防ぐことができます。 ネットワークが切断されるとすぐに停止状態になります。 ネットワークが切断には、急発進を防ぐためにbボタンを1秒以上を押すと解除されます。 まだまだ改善する部分は多いでしょう。 vpn環境を作って5g/4gなど無線環境で操作するための準備 次はvpn環境を作って5g/4gなど無線環境で操作するための準備をしましょう。wireguardで構築します。ubuntu24.04で準備します。 sudo apt update && sudo apt upgrade sudo apt install openssh-server sudo ufw allow 22 sudo apt install nano 以下の記事を参考にwireguardセットアップです。セットアップしたものをサーバーの下にぶら下げます。chuwiのミニpcは安い割に良い感じです。サーバーとして十分に性能が良いのです。 ubuntu24.04/ubuntu22.04にwireguardをインストール https://riragon.com/ubuntu22-04wireguard/ vpnの簡単な図 10.0.1.1－vpnサーバー 10.0.1.201－raspberry pi4受信側 (ip:192.168.10.201) 10.0.1.202－raspberry pi5送信側 (ip:192.168.10.202) とこんな感じの接続になります。 前回のコードのipをvpnに書き換えます。そしていろいろ改良しました。ワードプレスに貼るとインデントが崩れるのでgoogle docです。 vpn対応版コード（google ドキュメント） rcカーの配線周りの整理整頓 熱で縮小するチューブでジャンパ線（ジャンバケーブル、テストケーブル）の接続などを外れないようにします。 ヒートガンも使いました。 ピンをまとめて蓋をします。 こういった3ピンなどは作業をしていると、接続がポロポロとれます。これにチューブを通して熱します。 こんな感じに養生できました。安心感がありますね。 ラズパイ用の電源も載せられます。いったん仮設置は完了です。 5gでリモート操作のテスト rcカーに5g携帯を載せてraspberry pi4にテザリングします。5gネットワークから、vpnを経由してraspberry pi5と接続されます。raspberry pi5からusbゲームコントローラでrcカーを制御します。 片手なので上手く操作できていませんが、5gネットワークとvpnを通して操作しても十分に操作できる品質でした。サーボが左に傾いていたり、細かい微調整は必要ですが原理的には完成です。 つまり5g/4gの電波があるところなら、どこでもリモート操作ができるrcカーが完成しました。 操作側をラズパイ5からモニター付きミニpcに変更 操作しているときにいろいろな情報を見たいためラズパイ5からモニター付きミニpcに変更しました。昔購入して使っていないnetbook onegx1 proを使います。 netbook onegx1 proレビュー ubuntu24.04をインストールします。特別な設定なくインストールできます。ログイン時は画面が横になりますが問題ありません。そしてサーボ動作をギリギリと限界まで動いていたので45°に制限しました。 サーボ制限など（google ドキュメント） rc側のラズパイ4にシャットダウンボタンを装着 モニターが無いrc側の電源オンオフが面倒なのでシャットダウンスイッチをつけてみました。どのラズパイでもgpioピンがあれば同じでしょう。ブートディスクをssdにすると、電源ぶち切りしてもほぼ壊れませんが、microsdを起動ブートにしていると、たまに壊れます。 ラズパイでリモート操縦のrcカーを作っています。rcカー側のラズパイはモニターやキーボードが付いていません。ssh接続などで操作すのですが「sudo shutdown -h now」を入力するのがめんどくさいのです。そこで物理的にシャットダウンスイッチを付けました。 たまたま？昔購入した中にky-004ボタンモジュールがありました。 ky-004モジュールは、プッシュボタンキースイッチであり、押されると回路を閉じて、arduino、raspberry pi、esp32などのマイクロコントローラーに高信号を送信します。 ky-004モジュール仕様 タイプ: プッシュボタンキースイッチ 最大操作力: 180/230(±20gf) 耐久性: 100,000サイクル 動作電圧: 3.0v から 5.5v 温度測定範囲: -55°c から 125°c 測定精度: ±0.5°c 基板寸法: 18.5mm x 15mm ky-004モジュールのピン配置 ky-004キースイッチモジュールのピン配置は以下の通りです。raspberry piでのボタンの使用においては、電源ピンに+5vを接続する必要がないことがあります。gpioピンの電圧変化だけでボタンの状態を検出することができます。 ピン (s): シグナル→ gpio17に接続（11番） ピン (中央): +5v→ 接続しない ピン (-): gnd→ groundに接続（9番） プッシュボタンを押すとシャットダウンする機能を作成 sudo apt update sudo apt install python3-rpi.gpio 以下のプログラムを作成しました。 nano /home/riragon/switch-shutdown.py import rpi.gpio as gpio import time import os # gpioの設定 button_pin = 17 # gpioピン番号を設定（ボタンが接続されているピン） gpio.setmode(gpio.bcm) # gpio番号でピンを指定 gpio.setup(button_pin, gpio.in, pull_up_down=gpio.pud_up) # プルアップ抵抗を有効 def button_callback(channel): print(\"ボタンが押されました。シャットダウンします。\") os.system(\"sudo shutdown -h now\") # シャットダウンコマンドを実行 # イベント検出の設定 gpio.add_event_detect(button_pin, gpio.falling, callback=button_callback, bouncetime=200) try: while true: # 無限ループで実行 time.sleep(1) # cpuの使用を減らすためにスリープ finally: gpio.cleanup() # gpio設定をクリーンアップ chmod +x switch-shutdown.py 実行権限をつけたのでサービスに登録して、サービスの自動起動を設定します。 sudo nano /etc/systemd/system/switch-shutdown.service [unit] description=button shutdown service after=multi-user.target [service] type=simple execstart=/usr/bin/python3 /home/riragon/switch-shutdown.py user=root workingdirectory=/home/riragon restart=on-failure restartsec=10 [install] wantedby=multi-user.target sudo systemctl daemon-reload sudo systemctl enable switch-shutdown.service sudo systemctl start switch-shutdown.service sudo systemctl status switch-shutdown.service スイッチを固定するために便利な「やわらかプラスチック」を使います。お湯に入れると透明になりくっつきます。冷えるとプラスチックになります。 こんな感じにスイッチをプラスチックに接着します。強く動かせば外せますが、それなりに固定されます。 冷えると白くなり固まります。見た目は悪いですが仮設置にはとても便利です。 gstreamerとusbカメラを設置 いろいろと思考錯誤しながら操縦系は動作したので映像系をテストで実装しました。配線系を整理してラズパイ用のバッテリーをつめるようにして、テスト通信用（テザリング）のスマホの設置場所を作りusbカメラを搭載しました。 スマホを載せてテザリングがもっとも簡単な5g化です。やわらかプラスチックで適当に固定部分を作ってゆきます。 バッテリーとスマホを搭載して完成です。 usbカメラを適当に固定しました。ランチボックスは中にいろいろ設置できるので、やわらかプラスチックも一緒につかうことで、素早い構築ができます。本当は3dプリンターなど使うのが良いのですが、とりあえず作るということで。 usbカメラの送信は、以下コードで仮で作成しました。 gst-launch-1.0 -v rtpbin name=rtpbin \\ v4l2src device=/dev/video0 ! \\ image/jpeg,width=640,height=480 ! \\ jpegdec ! \\ videorate ! video/x-raw,framerate=30/1 ! \\ videoconvert ! \\ x264enc tune=zerolatency bitrate=1800 speed-preset=ultrafast key-int-max=5 ! \\ rtph264pay config-interval=1 pt=96 ! \\ rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! \\ rtpulpfecenc pt=127 percentage=1 ! \\ udpsink host=10.0.10.202 port=5000 buffer-size=65536 以上でとりあえずは動作する原理の確認ができました。配線やusbルーターやいろいろ調整しております。 カバーもつきます。動作も完全にワイヤレスです。 操作端末もスマートフォンのテザリングです。動作も完全にワイヤレスです。 はい、送受信ともに無線（4gと5g）環境で問題なく操舵できました。さまざまな改良を得てだいぶ実用的な操作ができるようになりました。次回から個別にそれらの紹介をしてゆきます。"
  },
  {
    "title": "第3回：RCカーをリモート操作、Raspberry PiにてTAMIYA1/12RC XBランチボックスのモーターとサーボを動かしてみよう",
    "url": "/blog/03-rccar-remote-moter-sarvo-test/",
    "description": "",
    "tags": [
      "リモート操縦",
      "作ったもの"
    ],
    "date": "2024年9月28日9時44分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 raspberry pi os・python・各種ライブラリの版は更新されます。公式のセットアップ手順とパッケージ名で再確認してください。 rc 用モータードライバ・ゲームパッド・配線は型番によって仕様が異なります。電源容量と実機接続を必ず見直してください。 通信は wi-fi・モバイル回線・ルーター設定に依存します。記事内のコマンド例は当時の環境向けです。 第1回、第2回でサーボやモーターをraspberry piに接続したusbゲームコントローラーから操作してみました。今回は、raspberry piにてtamiya1/12rc xbランチボックスのサーボとモーターを同時制御してみましょう。 groundは適当なピンから、gpio12をサーボに、gpio13をモータに接続します。サーボやモーターへの電源は、受信機 (tru-08)から取り回します。 各種資料 tamiya1/12rc xb(完成モデル) ランチボックス (item 57749) https://d7z22c0gz59ng.cloudfront.net/cms/japan/download/rcmanual/58347.pdf 〇バッテリー：7.2vニカドバッテリー https://www.tamiya.com/japan/products/55085/index.html 〇esc：tble-04s https://d7z22c0gz59ng.cloudfront.net/cms/japan/download/rcmanual/45069.pdf 〇サーボ：tsu-01 https://www.tamiya.com/japan/products/10318/index.html 〇モーター：540 https://www.tamiya.com/japan/products/54358/index.html 〇受信機 (tru-08) https://d7z22c0gz59ng.cloudfront.net/cms/japan/download/rcmanual/45053.pdf 前回からのプログラムを改良 第1回、第2回のプログラムを使ってサーボとモーターを同時に制御するようにします。エラーハンドリングと終了処理を追加しています。 sudo nano joystick_controltest.py import inputs from gpiozero import pwmoutputdevice from gpiozero.pins.pigpio import pigpiofactory import time import sys # gpioの設定（pigpiofactoryを使って精密制御） factory = pigpiofactory() # サーボとescの初期化 try: # サーボ（gpioピン12） servo = pwmoutputdevice(12, pin_factory=factory, frequency=50) # 50hzのpwm信号 # esc（gpioピン13） esc = pwmoutputdevice(13, pin_factory=factory, frequency=50) # 50hzのpwm信号 except exception as e: print(f\"gpioの初期化中にエラーが発生しました: {e}\") sys.exit(1) def set_servo_angle(angle): \"\"\" サーボの角度を設定します。角度は-90度から90度の範囲です。 \"\"\" # 角度をデューティサイクルに変換 min_pulse_width = 0.5 / 1000 max_pulse_width = 2.4 / 1000 frame_width = 1 / 50 # 50hzのフレーム幅 pulse_width = ((angle + 90) / 180) * (max_pulse_width - min_pulse_width) + min_pulse_width duty_cycle = pulse_width / frame_width servo.value = duty_cycle def set_esc_speed(pulse_width_ms): \"\"\" escの速度を設定します。パルス幅はミリ秒単位で指定します。 \"\"\" # パルス幅をデューティサイクルに変換 pulse_width_s = pulse_width_ms / 1000 # パルス幅を秒単位に変換 frame_width_s = 1 / 50 # フレーム幅（秒） duty_cycle = pulse_width_s / frame_width_s # デューティサイクルの計算 esc.value = duty_cycle def initialize_devices(): \"\"\" サーボとescを安全な初期状態に設定します。 \"\"\" set_servo_angle(0) # サーボを中央に設定 set_esc_speed(1.5) # escを停止状態に設定 time.sleep(1) # 安定するまで待機 def shutdown_devices(): \"\"\" サーボとescを安全な停止状態に設定します。 \"\"\" set_servo_angle(0) # サーボを中央に設定 set_esc_speed(1.5) # escを停止状態に設定 time.sleep(1) # 安定するまで待機 servo.close() esc.close() def main(): print(\"ジョイスティックを監視中...\") # デバイスの初期化 initialize_devices() # ゲームパッドの取得 try: gamepad = inputs.devices.gamepads[0] print(f\"ゲームパッドが接続されました: {gamepad}\") except indexerror: print(\"エラー: ゲームパッドが接続されていません。プログラムを終了します。\") sys.exit(1) try: while true: # イベントの取得 events = gamepad.read() for event in events: if event.ev_type == \"absolute\": if event.code == \"abs_x\": # サーボ操作 axis_value = event.state / 32767 # -1 から 1 の範囲に正規化 angle = axis_value * 90 # -90度から90度の範囲に変換 # 角度を -90 から 90 に制限 angle = max(min(angle, 90), -90) set_servo_angle(angle) #print(f\"サーボの角度を {angle:.1f} 度に設定\") elif event.code == \"abs_ry\": # モーター操作 axis_value = event.state / 32767 # -1 から 1 の範囲に正規化 # デッドゾーンの設定 dead_zone = 0.05 if abs(axis_value) < dead_zone: axis_value = 0 # パルス幅を1.4msから1.6msにマッピング pulse_width = 1.5 + (axis_value * 0.1) # パルス幅を1.4msから1.6msに制限 pulse_width = max(min(pulse_width, 1.6), 1.4) set_esc_speed(pulse_width) #print(f\"escパルス幅を {pulse_width:.2f} msに設定\") # cpu使用率を下げるための短いスリープ time.sleep(0.001) except keyboardinterrupt: print(\"\\nプログラムを終了します...\") except oserror: print(\"エラー: ゲームパッドが切断されました。プログラムを終了します。\") except exception as e: print(f\"エラーが発生しました: {e}\") finally: # デバイスを安全な状態にシャットダウン shutdown_devices() print(\"デバイスを安全な状態に設定しました。\") if __name__ == \"__main__\": main() 配線の簡単な説明 groundは適当なピンから③④から取りました。gpio12①をサーボに、gpio13②をモータに接続します。サーボやモーターへの電源は、受信機 (tru-08)から取り回します。 サーボ側の3ピン（黒、赤、白）も、黒はground、赤は電源、白はpwmです。 esc側（モーター）の3ピン（黒、赤、白）は、黒はground、赤は電源、白はpwmです。 raspberry piのgpio12番①をサーボ側の3ピンの白へ、raspberry piのgpio13番②をesc側の3ピンの白へ、tru-08の1番の真ん中の電源ピン⑤をサーボ側の3ピンの赤へ、tru-08の2番の真ん中の電源ピン⑥をesc側の3ピンの赤へ。図にすると複雑で分かりにくいですね。 python3 joystick_controltest.py よし動いた！"
  },
  {
    "title": "第2回：RCカーをリモート操作、Raspberry PiにてTAMIYA1/12RC XBランチボックスのモーターを動かしてみよう",
    "url": "/blog/02-raspberry-pi-rc-tamiya-moter-usb/",
    "description": "",
    "tags": [
      "リモート操縦",
      "作ったもの"
    ],
    "date": "2024年9月25日10時43分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 raspberry pi os・python・各種ライブラリの版は更新されます。公式のセットアップ手順とパッケージ名で再確認してください。 rc 用モータードライバ・ゲームパッド・配線は型番によって仕様が異なります。電源容量と実機接続を必ず見直してください。 通信は wi-fi・モバイル回線・ルーター設定に依存します。記事内のコマンド例は当時の環境向けです。 tamiyaの定番rcカーであるランチボックスには、ecsやサーボやモーターなど含まれています。raspberry piでリモート操作をしようという記事の第２回です。前回はサーボを動かしました。今回はusbゲームコントローラとraspberry piにてランチボックスのモータを動かしてみましょう。 各種資料 tamiya1/12rc xb(完成モデル) ランチボックス (item 57749) https://d7z22c0gz59ng.cloudfront.net/cms/japan/download/rcmanual/58347.pdf 〇バッテリー：7.2vニカドバッテリー https://www.tamiya.com/japan/products/55085/index.html 〇esc：tble-04s https://d7z22c0gz59ng.cloudfront.net/cms/japan/download/rcmanual/45069.pdf 〇サーボ：tsu-01 https://www.tamiya.com/japan/products/10318/index.html 〇モーター：540 https://www.tamiya.com/japan/products/54358/index.html 〇受信機 (tru-08) https://d7z22c0gz59ng.cloudfront.net/cms/japan/download/rcmanual/45053.pdf 各種資料からプログラムの仕様を策定 escはtble-04sです。標準的なescやサーボは20ms（50hz）です。たぶん同じでしょう。多くのジョイスティックでは、軸の値は-32767 から 32767 の範囲になります。大抵は-1 から 1 の範囲に正規化します。 axis_value = event.state / 32767 ジョイスティックを最も上に倒したとき（前進）: axis_value = -1 ジョイスティックを中央に戻したとき（ニュートラル）: axis_value = 0 ジョイスティックを最も下に倒したとき（後退）: axis_value = 1 最小パルス幅: axis_value = -1 のとき: pulse_width = 1.5 + (-1 * 0.1) = 1.4ms 最大前進 の状態です。 ニュートラル: axis_value = 0 のとき: pulse_width = 1.5 + (0 * 0.1) = 1.5ms モーターは 停止 します。 最大パルス幅: axis_value = 1 のとき: pulse_width = 1.5 + (1 * 0.1) = 1.6ms 最大後退 の状態です。 そのような感じで、1.5msがescのニュートラル（停止）状態になります。またフルスピードで動作するとぶっ飛んでゆきますので、パルス幅を1.4msから1.6msに制限することで、モーターの速度を全体の 20% 程度 に抑えゆっくりスタートできるようになります。 パルス幅をフレーム幅（20ms）で割ることで、デューティサイクルを求めます。これにより0から1の範囲でデューティサイクルを設定できます。デューティサイクルとは、一定周期で連続するパルス波において、パルスがオンになる時間とオフになる時間の比率のことです。 def set_esc_speed(pulse_width_ms): pulse_width_s = pulse_width_ms / 1000 # パルス幅を秒単位に変換 frame_width_s = 1 / 50 # フレーム幅（秒）= 20ms duty_cycle = pulse_width_s / frame_width_s # デューティサイクルの計算 esc.value = duty_cycle # escにデューティサイクルを設定 以上でジョイスティックで前進後退を制御するプログラムを作成します。 sudo nano joystick_motertest.py from inputs import get_gamepad from gpiozero import pwmoutputdevice from gpiozero.pins.pigpio import pigpiofactory import time # gpioの設定（pigpiofactoryを使って精密制御） factory = pigpiofactory() esc = pwmoutputdevice(12, pin_factory=factory, frequency=50) # 50hzのpwm信号 def set_esc_speed(pulse_width_ms): # パルス幅をミリ秒からデューティサイクルの値に変換（フレーム幅は20ms） pulse_width_s = pulse_width_ms / 1000 # パルス幅を秒単位に変換 frame_width_s = 1 / 50 # フレーム幅（秒） duty_cycle = pulse_width_s / frame_width_s # デューティサイクルの計算 esc.value = duty_cycle # escにデューティサイクルを設定 def main(): print(\"ジョイスティックを監視中...\") while true: events = get_gamepad() for event in events: print(event.ev_type, event.code, event.state) if event.code == \"abs_y\": # ジョイスティックのy軸が動いた場合 axis_value = event.state / 32767 # -1 から 1 の範囲に正規化 # パルス幅を1.4msから1.6msにマッピング（前進または後退の速度を制限） pulse_width = 1.5 + (axis_value * 0.1) # パルス幅をミリ秒単位で計算 set_esc_speed(pulse_width) # escにパルス幅を設定 print(f\"escパルス幅を {pulse_width:.2f} msに設定\") if __name__ == \"__main__\": try: main() except keyboardinterrupt: print(\"\\nプログラムを終了します...\") gpio 12からpwm信号を発信 今回テストなのでgpio 12から信号を出します。ラズパイ4のground、gpio12をescの黒と白に接続します。黒はground、白はpwmです。下記図参考です。3vと5vは使いません。rc側のバッテリー側から使います。 ①がgnd、②がgpio12（pwm）です。 esc側の3ピン（黒、赤、白）に接続します。黒はground、白はpwmです。黒に先の①ピンから、白に先の②gpio12番です。 esc側から3ピン（黒、赤、白）がこんな感じに出ています。黒はground、赤は電力、白はpwmです。赤の部分は、rcカーのバッテリーから取りたいので、2.4ghzユニットに赤いピンを繋ぎます。 電力は受信機（tru-08）から取得 このtru-08の2番の真ん中のピンを赤に接続します。受信機（tru-08）の3ピンの真ん中のピンは、サーボやescに電力を提供している電源ピンです。 通常のrcカーでは受信機がサーボやescに電源を供給します。受信機はバッテリーから電力を受け取り、その電力をサーボやescに配分します。 受信機の3ピンコネクタは一般的に以下のようになっています。 外側: gnd（グランド） 中央: ＋電源（通常は5v程度） 内側: 信号線（pwmなど） raspberry piの電圧3.3vや5vピンの電流は相当低いです。raspberry piから電力を共有するとまともに動かないか、何かのタイミングで壊れる可能性もあります。なので受信機からの電源を使います。 説明だと分かりにくいですが、全体的にはこんな配線です。 gndとpwmはraspberry piからです。 raspberry piからescやサーボに制御信号（pwm）を送信する場合、送信側（raspberry pi）と受信側（escやサーボ）のグランド（gnd）が共通である必要があります。 グランドが共通でないと、信号が正しく伝達されない可能性があります。 共通というのはraspberry piから信号を送ったらgndもraspberry piのものを使うという意味です。 ゲームパットでモーターが動いた！！"
  },
  {
    "title": "第1回：RCカーをリモート操作、Raspberry PiにてGPIOでサーボを動かしてみよう",
    "url": "/blog/01-raspberry-pi-4-usbpad-sarvo/",
    "description": "",
    "tags": [
      "リモート操縦",
      "作ったもの"
    ],
    "date": "2024年9月23日18時30分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 raspberry pi os・python・各種ライブラリの版は更新されます。公式のセットアップ手順とパッケージ名で再確認してください。 rc 用モータードライバ・ゲームパッド・配線は型番によって仕様が異なります。電源容量と実機接続を必ず見直してください。 通信は wi-fi・モバイル回線・ルーター設定に依存します。記事内のコマンド例は当時の環境向けです。 第1回：rcカーをリモート操作、raspberry piにてgpioでサーボを動かしてみよう tamiya 1/12rc xb ランチボックスカーをリモート操作するまえに、raspberry pi 4にusbゲームパットを接続してpythonでサーボモーターを操作してみます。 サーボモーターはsg90です。安価なサーボモーターです。usbゲームパット、raspberry pi 4、python、サーボモーターを使うことで全体の検証ができます。 データシートを見ると茶色がgnd、赤が電源、オレンジがpwmです。tamiya 1/12rc xb ランチボックスカーのサーボも似たようなものです。sg90を上手く動かせばランチボックスのサーボも制御できるでしょう。 usbゲームパットは、logitech gamepad f310です。安価なタイプです。xboxタイプの共通コントローラーです。どれでも大体一緒です。 gpioは以下を使います。縦ですが、実機と比べるときは左に回転して比較してください。①3.3v、②gpio12、③gndです。 細いケーブルのオスメスをいくつか揃えておくと便利です。 本環境はraspberry pi 4（ubuntu22.04）です。アップデート、ssh接続、22番ポートを開けました。ご自身の使いやすい形で実行ください。最近ではstart sshやinstall ufwやufw enableは不要ですね。初期設定で入っているはずです。 sudo apt update && sudo apt upgrade sudo apt install openssh-server sudo systemctl start ssh sudo apt install ufw sudo ufw enable sudo ufw allow 22 sudo apt install nano ubuntu24.04ではpipやpigpioでいろんな注意やエラーがでます。python環境がより厳密になったからです。本環境はubuntu22.04ですが仮想環境で構築します。ubuntu24.04でも実行できるでしょう。 pythonのパッケージマネージャーpipを入れます。aptみたいなものです。pythonのインストールを管理してくれます。python3-venvはもっとも標準的なpythonの仮想環境パッケージです。開発環境用にbuild-essentialとgitです。 sudo apt install python3-pip python3-venv build-essential git venvを使ってmyenvという仮想環境を作ります。myenvは自由な名称でつくれますが定番の書き方がmyenvです。source myenv/bin/activateで、仮想環境を実行します。 python3 -m venv myenv source myenv/bin/activate 仮想環境でpipを使うことでpip install によるシステム全体への影響を防ぎます。wheelは何やらインストールの高速化、inputsは入力デバイスのライブラリ、piozeroとpigpioはgpioピンの制御のパッケージです。 pip3 install wheel pip3 install inputs pip3 install gpiozero pip3 install pigpio pigpio及びpigpiodがすごく分かりにくいのですが、上記pip3でインストールしたpigpioはpythonからgpioピンの制御で、pigpiodはシステムからのgpioピンの制御のためのようです。 pip3 install pigpioだけでは、pigpiodが動かないので仮想環境ではなく以下でインストールします。 ※raspberry pi 5（ubuntu2x.04）では、pigpioがraspberryとしてはハードウェアを認識せずに上手く行きませんでした。ubuntuを使ったのがいけないのか素直にraspiosを使うべきなのだと思います。 git clone https://github.com/joan2937/pigpio cd pigpio make sudo make install sudo usermod -ag input $user いったん再起動して上手く動作するか試してみましょう。 sudo reboot 再起動したら仮想環境を立ち上げてpigpiodデーモンを起動します。問題なくpigpiodが動けばokです。エラーが起きたらgptにエラーを見せれば解決するはずです。 source myenv/bin/activate sudo pigpiod 次は、pythonのプログラムを準備をします。get_gamepad関数はゲームパッドのイベントの取得につかいます。angularservoクラスはサーボモータを制御に使います。pigpiofactoryはgpioピンのpwm制御精度を高めるために使います。それらを使うために環境を準備します。 sudo nano joystick_test.py 以下内容です。gpioピン12に接続されたangularservoオブジェクトを作成します。サーボモータの角度範囲を-90度から90度に設定し、パルス幅の最小値と最大値を指定します。frame_widthはパルスの間隔を指定し、pin_factoryにfactoryオブジェクトを指定して、精密制御を実現します。 from inputs import get_gamepad from gpiozero import angularservo from gpiozero.pins.pigpio import pigpiofactory import time # gpioの設定（pigpiofactoryを使って精密制御） factory = pigpiofactory() servo = angularservo( 12, min_angle=-90, max_angle=90, min_pulse_width=0.5 / 1000, max_pulse_width=2.4 / 1000, frame_width=1 / 50, pin_factory=factory ) def main(): print(\"ジョイスティックを監視中...\") while true: events = get_gamepad() for event in events: print(event.ev_type, event.code, event.state) if event.code == \"abs_y\": # ジョイスティックのy軸が動いた場合 # 状態は -32768 から 32767 の範囲; 中央が0 axis_value = event.state / 32767 # -1 から 1 の範囲に正規化 angle = axis_value * 90 # 軸の値を角度に変換（-90度から90度） # 角度を -90 から 90 に制限 if angle < -90: angle = -90 elif angle > 90: angle = 90 servo.angle = angle print(f\"サーボの角度を {angle:.1f} 度に設定\") if __name__ == \"__main__\": try: main() except keyboardinterrupt: print(\"\\nプログラムを終了します...\") 忘れない内にファイルに実行権限をつけて、python3 joystick_test.pyをテストします。 sudo chmod +x joystick_test.py python3 joystick_test.py inputsライブラリではなくpygameを使う方法もありますがビデオシステム関連でエラーが起きました。raspberry pi5（ubuntu24.04）ではpygameの方が上手く動作しました。このあたりもう少し検証する時間を作りたいところです。 inputsライブラリは、ハードウェア入力（ジョイスティックやゲームパッドなど）を扱い役立ちます。ヘッドレス（ディスプレイのない）設定でも正常に動きます。低レベルなハードウェアアクセスが可能です。依存関係が少ないです。リアルタイム入力に優れています。 仮想環境やsudo pigpiodを自動化 仮想環境やsudo pigpiodは毎回実行が必要です。自動起動させるには少し手間が必要です。pigpiodのsystemd サービスファイルは多分存在しないので自分で作る必要があります。 sudo nano /etc/systemd/system/pigpiod.service [unit] description=pigpio daemon after=network.target [service] execstart=/usr/local/bin/pigpiod execstop=/bin/systemctl kill pigpiod type=forking pidfile=/var/run/pigpio.pid [install] wantedby=multi-user.target sudo systemctl daemon-reload サービスを有効化して起動します。状態が正常であれば成功です。 sudo systemctl enable pigpiod sudo systemctl start pigpiod sudo systemctl status pigpiod 仮想環境の方は、最終的なjoystick_test.pyが完成したらexecstartで仮想環境を指定してあげればよいはずです。 execstart=/path/to/myenv/bin/python /path/to/joystick_test.py ハードウェアpwmをサポート サーボをなめらに操作するには、pwmがよいです。pwmはソフトウェアとハードウェア制御があります。ハードウェア制御の方がより安定して負荷が少ないそうです。raspberry pi4では一部のピンだけハードウェアpwmをサポートしています。 gpio 12 pwm0 gpio 13 pwm1 ハードウェアpwmをサポートしているようで、pwm0とpwm1の二つのチャンネルにマップされています。 2チャンネルの制御になるため、同時に使えるのは2つのピンになるようです。 2つのサーボモータを異なる角度で独立して制御したい場合は、一つをpwm0チャンネル（例：gpio 12）、もう一つをpwm1チャンネル（例：gpio 13）に接続するという考え方になります。 gpio 12とgpio 13を使うことで、サーボとモーターを同時に制御できます。さて実行してゲームパットでサーボを操作してみましょう。いい感じにサクサク動きました。 tamiya 1/12rc xb ランチボックスカーのサーボに繋いでみる 問題なく動いたらtamiya 1/12rc xb ランチボックスカーのサーボに繋いてみましょう。①のサーボの3ピンは②に接続されています。 これを引き抜きます。①がgnd、①が電源、③がpwmです。ここにraspberry pi 4のgpioピンをさします。 サーボの3ピンに同じように①gnd、②電源、③pwmがくるようにピンを接続します。 はい。このようにtamiya 1/12rc xb ランチボックスカーのサーボを操作できました。 簡単ですね。電源が3.3vは正しくないようで、動作はぎこちないです。これも最終的にはrcカー側のバッテリーで動作させるので問題はなくなります。 usbコントローラとラズパイで、gpioピンからハードウェアpwmを出力することで操作できるということがなんとなく理解できました。 次回に続く"
  },
  {
    "title": "第0回：RCカーをリモート操作：Raspberry Pi4でTAMIYA 1/12RC XB ランチボックスカーをリモート制御する準備",
    "url": "/blog/00-raspberry-pi4-remote/",
    "description": "RCカーをリモート操作：Raspberry Pi4でTAMIYA 1/12RC XB ランチボックスカーをリモート制御する準備\nRCカーやローバーなどリモート操作を学んでゆきます。リモート操作に関する技術は、多種多様な方法があります。目的によっても使用するべき技術は変化するでしょう。わかりやすく初級から上級までの段階ごとに説明しています。",
    "tags": [
      "リモート操縦",
      "作ったもの"
    ],
    "date": "2024年9月23日15時3分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 raspberry pi os・python・各種ライブラリの版は更新されます。公式のセットアップ手順とパッケージ名で再確認してください。 rc 用モータードライバ・ゲームパッド・配線は型番によって仕様が異なります。電源容量と実機接続を必ず見直してください。 通信は wi-fi・モバイル回線・ルーター設定に依存します。記事内のコマンド例は当時の環境向けです。 rcカーをリモート操作：raspberry pi4でtamiya 1/12rc xb ランチボックスカーをリモート制御する準備 rcカーやローバーなどリモート操作を学んでゆきます。リモート操作に関する技術は、多種多様な方法があります。目的によっても使用するべき技術は変化するでしょう。わかりやすく初級から上級までの段階ごとに説明しています。 まず初級段階では、**raspberry piやesp-32系（arduino・m5stack）を使用したリモートカーの操作です。**これらは一般的に安く入手しやすい部品で、初心者にも扱いやすいです。しばらくこの記事を書いてゆきます。 中級段階では、より高性能な組み込み向けの基盤、例えばnvidia jetsonを使って映像処理やai処理を行い、esp-32系でセンサーやモーターの制御をします。**さらにpixhawk、mission planner、ardupilotを用いて遠隔操作や自律制御を実施します。よくある高度なリモートプロジェクトは、だいたいこれです。**数十万以上の予算は必要でしょう。ここまでは到達したいところです。esp-32系などは結局使わないかも。 最上級段階では、カスタムハードウェア基盤（fpgaやsoc）を用い、リアルタイムオペレーティングシステム（rtos）と高度な通信プロトコルを駆使して低遅延での制御を目指します。これは非常に高度であり到達できないでしょう。大きな予算（数百万～）も必要です。個人では無理です。 入門としてamazonで売っているよく見るタイプもあります。私も昔購入しました。性能は低く実用性は劣るしソフトウェアは複雑なので、それ以上の発展はありませんでした。それでは意味がないので、もう少し実用的にtamiyaのrcカーとraspberry piを使って5g/4gなどのネットワーク経由で操作するプロジェクトにします。pythonなどを使って制御します。 入門となる初級で必要となる知識と箇条書きしてみました 。多くの前提となる知識が必要ですが、自分の習得のための記事なのでraspberry piの知識、ubuntuの知識、pythonの知識などの説明は省略します。他のサイトを参考ください。 raspberry piの知識 ubuntuの知識 pythonの知識 gpioピンや信号の入出力 rcカーのesc、サーボ、モーターの知識 バッテリーの知識 ケーブルやピンの知識 無線通信の知識 カメラモジュールの知識 センサーの知識 電気回路の基礎知識 モータードライバーの知識 ネットワークとプロトコルの知識 基本的な安全知識 私に不足している知識として、**gpioピンや信号の入出力、rcカーのesc、サーボ、モーターの知識、バッテリーの知識、ケーブルやピンの知識などです。**まずはそこから学んでゆきます。pythonなどプログラムはaiの力を借りて構築してゆきます。 初級向けリモート車両の購入 raspberry piやarduinoを使った入門系リモート車両記事では、安価なサーボやモーターを使ってフレッツボードに接続して動作される記事が多いです。仕組みの勉強になるのですが、その先の実用的な動作には遠いです。 入門ですが実用的なリモート車両動作に近い環境にしたいためにrcカーを選定しました。 tamiya 1/12rc xb(完成モデル) ランチボックス (item 57749) https://www.amazon.co.jp/dp/b0bd3bvf7y tamiyaを選んだ理由は、主流のrcカーであるため情報が多いことです。サーボやモーターやescなど不明な点があるときに情報を探しやすいです。世界のtamiyaです。 ランチボックスを選んだ理由は、基盤など追加で乗せるスペースが大きそうだからです。そしてなるべく安いものを選びました。 本当は完成済みではなく組み立てタイプがよかったのですが、在庫がなかったり完成品より高かったので完成品を選びました。 組み立てモデルもあります。組み立てモデルの場合は、サーボやescも自分で適切なものを購入して設置する必要があります。良く分からない場合は「 ファインスペック2.4g 電動rcドライブセット」を購入すればokです。 1/12rc ランチボックス https://www.tamiya.com/japan/products/58347/index.html ファインスペック2.4g 電動rcドライブセット https://www.tamiya.com/japan/products/45053/index.html 完成品なので、すでにサーボやescも設置されています。カバーを外せばすぐにアクセスできるのも良い点です。以下すでにいろいろ検証した後の写真です。 2.4g無線ユニット モーターなども最初から完璧に設置されています。 バッテリーも繋ぐだけです。 サーボも設置済みです。 ちなみにrcカーには、電源とモーター以外にさまざまな機器が必要です。rcカーを使ったことがないと知りえない部品です。主な部品として、esc、サーボ、ニッカドバッテリーなどがあります。 esc（electronic speed controller）は、rcカーのモーターの回転速度を電子的に制御する装置です。rcカーやドローンなどのリモート制御車両に使われ、特に電動モーターを動作させる際に不可欠です。rcカーの頭脳ともいえるescです。 サーボモーター（servo motor）は、rcカーやロボットなどで特定の角度や位置を精密に制御するために使われるアクチュエータです。ハンドルステアリング制御に使われます。 今回付属していたバッテリーは、ニッカドバッテリーでした。軽量で高出力を求められる場合にはニッカドからリポバッテリー（リチウムポリマー）が使用されることが多いです。 rcカーを持っていない人種は、バッテリーといってもモバイルバッテリーの使い方を想像します。rcカーのニッカドやリポバッテリーは制限と注意事項だらけです。間違って使うとすぐに使用不能になります。びっくりしますよね。 以下電動rcカーの基礎知識から引用です。 電動rcカーの基礎知識 - タミヤrcスタートガイド https://www.tamiya.com/japan/cms/rcstartguide.html バッテリーは使い終えてから充電する まず大切なのは「バッテリーは使い終えてから充電する」ということ。使いかけのバッテリーを充電して使うということを繰り返すと徐々にバッテリーの電圧低下が早くなり、充電しても満足に走れない状態になります（メモリー効果と呼びます）。これを予防するための基本的な使用法は、rcカーはある程度バッテリーを消費すると走行スピードが急激に落ちるので、これを目安に走行をやめ、時間をおいてから充電するというもの。よりていねいに行うならば、使用後には放電器（ディスチャージャー）で適切に放電させて、その後バッテリー内部が安定するまで時間をおいて（1日程度）から充電することでよりよいコンディションを保つことができます。なお、メモリー効果が発生した場合は、上記のような適切な使用サイクルを何度か繰り返すことでコンディションを整えることができます。 連続使用も寿命を縮める ニカドバッテリーは、走行→即充電→走行→即充電…といったように、極端に短いスパンでの使用を繰り返すとバッテリーをいためます。サーキットで終日練習するような場合にはやむを得ず現地で再充電するといった場合もあるでしょうが、バッテリーを長持ちさせるという意味では、1日に何度も充電するような使い方は避けたほうがよいでしょう。 **ちなみにバッテリー残量が何％なのかも知ることはできません（電圧で推測します）。**そういう仕組みなのです。スマートフォンなどのバッテリーを使っている感覚からするとビックリします。なんて使いずらい問題だらけのバッテリーなのだろうと。 また**バッテリーを完全に使い切ると、内部で化学的損傷が生じ、回復不可能な状態になることがあります。**なんかもっとスマートなバッテリーシステムはないのでしょうか。ankerモバイルバッテリーみたいなのがあれば欲しいです。なぜないのでしょうか。私も素人です。 こういったrcカーのバッテリーは特殊であることが理解できればokです。 本格的なリモート操作できたらどれだけ楽しいか サーボやescやバッテリーの知識を学びながら、こんな本格的な走行が可能な車両をリモート操作できたらどれだけ楽しいことでしょう。夢は膨らみます。 youtube（参考動画） raspberry系の購入 raspberry pi 4とraspberry pi 5をすでに持っていました。raspberry pi 4×２台でも、なんでもよいです。入門プロジェクトではraspberry pi を使ってゆきます。 消費電力と発熱がすくないraspberry pi 4を車両側に設置することにしました。raspberry pi 5は操縦側のシステムとして利用します。 gpioピンを使うので、ピンにアクセスしやすいケースを購入するのがよいでしょう。 このようにランチボックスにgpioピンをつないで制御後を試すことができます。 ランチボックスの動作原理を説明 小さな箱を車両の下に置くとテストしやすいです。 カバーを外せばすぐに内部にアクセスできます。原理的な仕組みを説明しましょう。 バッテリーからそれぞれの機器に電力が共有されています。その説明は省略します。 rcカーを操作できるリモコン（プロポ）からの信号を②tru-08で受信します。その信号は①サーボと③escへ伝わることで、サーボが動きモーターが回転します。このケーブルは、3ピンで黒: グランド（gnd）、 赤: 電源（vcc、+電圧）、白: pwm信号となっています。 tru-08を見ると1と2に3ピンが接続されています。 プロポからのpwm信号を受け取って、以下の動画のように動作するわけです。 つまりpwm信号を何かしらで生成して、何かしらで送ってやれば、リモート操作ができるようになります。原理的には簡単ですね。 次回に続く"
  },
  {
    "title": "UDPソケットで信号をリアルタイム処理",
    "url": "/blog/udp%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%81%A7%E4%BF%A1%E5%8F%B7%E3%82%92%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E5%87%A6%E7%90%86/",
    "description": "",
    "tags": [
      "作ったもの"
    ],
    "date": "2024年9月21日23時14分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 python の版により socket / asyncio の推奨パターンや非推奨 api が変わります。公式ドキュメントで確認してください。 遅延・ジッター・パケットロスはネットワーク環境に強く依存します。本番相当の負荷では別途計測してください。 記事のサンプルを運用に載せる場合は、認証・暗号化・再接続処理を別途設計してください。 usbジョイスティックを接続したraspberry pi 5（ubuntu24.04）ip 192.168.10.202から、サーボモーターsg90を接続したraspberry pi 4（ubuntu22.04）、ip 192.168.10.201へ、ネットワークを経由して操作信号を送ります。 tcpで定期的に信号を送る仕組みでは、サーボがカクカクして、動作も遅くリモート操作としては悪い状況です。udpベースにしたらとても上手く動きました。 raspberry pi 5（ubuntu24.04）、ip 192.168.10.202 send.py import socket from inputs import devices, get_gamepad import sys # 送信先のipとポート server_ip = \"192.168.10.201\" server_port = 5000 # ソケットの設定（udp） sock = socket.socket(socket.af_inet, socket.sock_dgram) print(\"接続待機中...\") # ゲームパッドの取得 try: gamepad = devices.gamepads[0] print(f\"ゲームパッドが接続されました: {gamepad}\") except indexerror: print(\"エラー: ゲームパッドが接続されていません。プログラムを終了します。\") sys.exit(1) print(f\"{server_ip}:{server_port} にデータを送信します。\") print(\"接続が確立されました。操作信号を送信します。\") try: while true: # イベントの取得 events = get_gamepad() for event in events: if event.ev_type == \"absolute\" and event.code in [\"abs_x\", \"abs_ry\"]: # 値を正規化 axis_value = event.state / 32767 # -1 から 1 の範囲に正規化 # データの作成（例: \"abs_x:0.5\"） message = f\"{event.code}:{axis_value:.3f}\" # データの送信 sock.sendto(message.encode('utf-8'), (server_ip, server_port)) # 操作信号の表示 print(f\"送信: {message}\") except keyboardinterrupt: print(\"\\nプログラムを終了します。\") except exception as e: print(f\"エラーが発生しました: {e}\") finally: sock.close() raspberry pi 4（ubuntu22.04）、ip 192.168.10.201 receive.py import socket from gpiozero import pwmoutputdevice from gpiozero.pins.pigpio import pigpiofactory import time import sys # ソケットの設定 local_ip = \"0.0.0.0\" local_port = 5000 sock = socket.socket(socket.af_inet, socket.sock_dgram) sock.bind((local_ip, local_port)) print(f\"ポート {local_port} でデータを待機しています...\") print(\"接続待機中...\") # gpioの設定（pigpiofactoryを使って精密制御） factory = pigpiofactory() # サーボとescの初期化 try: # サーボ（gpioピン12） servo = pwmoutputdevice(12, pin_factory=factory, frequency=50) # 50hzのpwm信号 # esc（gpioピン13） esc = pwmoutputdevice(13, pin_factory=factory, frequency=50) # 50hzのpwm信号 except exception as e: print(f\"gpioの初期化中にエラーが発生しました: {e}\") sys.exit(1) def set_servo_angle(angle): \"\"\" サーボの角度を設定します。角度は-90度から90度の範囲です。 \"\"\" min_pulse_width = 0.5 / 1000 max_pulse_width = 2.4 / 1000 frame_width = 1 / 50 pulse_width = ((angle + 90) / 180) * (max_pulse_width - min_pulse_width) + min_pulse_width duty_cycle = pulse_width / frame_width servo.value = duty_cycle def set_esc_speed(pulse_width_ms): \"\"\" escの速度を設定します。パルス幅はミリ秒単位で指定します。 \"\"\" pulse_width_s = pulse_width_ms / 1000 frame_width_s = 1 / 50 duty_cycle = pulse_width_s / frame_width_s esc.value = duty_cycle def initialize_devices(): \"\"\" サーボとescを安全な初期状態に設定します。 \"\"\" set_servo_angle(0) set_esc_speed(1.5) time.sleep(1) def shutdown_devices(): \"\"\" サーボとescを安全な停止状態に設定します。 \"\"\" set_servo_angle(0) set_esc_speed(1.5) time.sleep(1) servo.close() esc.close() def main(): # デバイスの初期化 initialize_devices() connection_established = false try: while true: # データの受信 data, addr = sock.recvfrom(1024) message = data.decode('utf-8') if not connection_established: print(f\"送信元 {addr[0]} と接続が確立されました。\") connection_established = true if \":\" in message: code, value = message.split(\":\") axis_value = float(value) if code == \"abs_x\": angle = axis_value * 90 angle = max(min(angle, 90), -90) set_servo_angle(angle) print(f\"受信: {message} -> サーボ角度を {angle:.1f} 度に設定\") elif code == \"abs_ry\": if abs(axis_value) < 0.05: axis_value = 0 pulse_width = 1.5 + (axis_value * 0.1) pulse_width = max(min(pulse_width, 1.6), 1.4) set_esc_speed(pulse_width) print(f\"受信: {message} -> escパルス幅を {pulse_width:.2f} msに設定\") except keyboardinterrupt: print(\"\\nプログラムを終了します。\") except exception as e: print(f\"エラーが発生しました: {e}\") finally: # デバイスを安全な状態にシャットダウン shutdown_devices() sock.close() print(\"デバイスを安全な状態に設定しました。\") if __name__ == \"__main__\": main() サーボモーターの制御が素早く滑らかにするためinputsライブラリにより、ジョイスティックが変化した時だけイベントを送信することで、処理を軽くしつつシステムのリアルタイム性が向上しました。 データ転送にudpソケットを使用しました。udpはコネクションレスプロトコルであり、コネクションの確立や状態管理が不要なため、tcpよりもオーバーヘッドが少なくデータ送受信が速く行えます。 受信側では非ブロッキングソケットを設定し、データがない場合でも処理が停止することなく、サーボモーターの位置を連続して更新できるようにしました。これにより、サーボの反応性が向上し、システム全体の反応性も良くなりました。"
  },
  {
    "title": "超簡単、設定不要、UE5でVirtual Camera VCAM（バーチャルカメラ、仮想カメラ）の簡単なセットアップ方法",
    "url": "/blog/ue5-virtual-camera-vcam-settei-tukaikata/",
    "description": "Unreal Engine 5.4でVirtual Camera（Vcam）の簡単な使い方を紹介します。数年前は複雑な設定が必要でしたが今は何も設定が不要です。VCAM（バーチャルカメラ、仮想カメラ）とは、UE5内のカメラをiPhoneやiPadを使って、UE5内の仮想カメラを操作できます。",
    "tags": [
      "UE5"
    ],
    "date": "2024年8月31日23時20分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 virtual camera・live link・関連プラグインの ui は ue の版で移動します。該当バージョンのドキュメントを参照してください。 スマートフォンアプリ側の接続手順と権限はアップデートで変わります。記事のアプリ版前提を確認してください。 遅延と解像度は usb / wi-fi の品質に依存します。本番では有線接続の検討を推奨します。 unreal engine 5.4でvirtual camera（vcam）の簡単な使い方を紹介します。 数年前は複雑な設定が必要でしたが、今は何も設定がイリマセン。vcam（バーチャルカメラ、仮想カメラ）とは、iphoneやipadを使ってue5内のカメラを操作できる機能です。 仕組み的には、iphoneやipadなどのデバイスに内蔵されているジャイロスコープや加速度センサーを利用して、デバイスを動かすだけで仮想空間内のカメラを直感的に操作することが可能です。さっそくvcamの設定をしてみましょう。 live link vcamをiphoneなどにインストール live link vcam https://apps.apple.com/jp/app/live-link-vcam/id1547309663 live link vcamの以下説明を見てみましょう。要はiphoneからue5のカメラを操作できます。以下引用です。 live link vcam for unreal engine はバーチャルプロダクションに対応したリアルタイム撮影をあなたの ipad や iphone で行うことを可能にします。 カメラレンズ、フレーム、移動といった従来の映画制作コンセプトを unreal engine のデジタルの世界に適用しましょう。 リアルなカメラテイクを記録したら、エディタ内でさらに細かく調整し、unreal engine のシーケンサーで洗練された最終構成を組み上げましょう。 レンズを通して初期のセット環境をレビュー、撮影前のショットカメラに対するプレビズ、主要撮影での実際のテイクの撮影、ポストプロダクションでの追加ショット作成など、すべてを行うことが可能です。 arkit によるカメラ移動: ● ネットワークの live link で unreal engine インスタンスに位置、回転データをライブでストリーミング送信 ● リアルタイム環境内の 3d カメラを操作 ● カメラデータを take recorder で記録して、シーケンサーで使用 unreal engine からカメラビューをライブストリーム: ● ipad や iphone 上で正確な被写体深度のショットをビジュアライズ ● 即座にフィードバックを確認しながらレンズフォーカス、絞り、ズームといったカメラパラメータを調整可能 ● 以前に記録したテイクの確認、ワールドの興味深い位置をブックマークとして保存 複数デバイス同期のためのタイムコードサポート: ● iphone のシステム時計、ntp サーバー、ステージ上のマスタークロックに接続する tentacle sync を使用可能 とまあ、いろんなカメラ操作をiphoneやipadなどで出来るようになります。 ue5を起動する 「映画、テレビ、ライブイベント」を選択します。あとはブランクでもなんでも良いです。今回はブランクを選択します。「映画、テレビ、ライブイベント」を選択すれば、すでにvcamがセットアップされているわけです。 左上のメニューの「 □+ 」をクリックして、「バーチャルプロダクション」を選択します。そのなかのvcamアクタを追加します。これで準備完成です。 ※「バーチャルプロダクション」の項目が表示されない場合は、設定のプラグインから**「virtual camera」「live link」take recorder」**のプラグインが有効になっているか確認してください。 ue5を動かしているパソコンのipを調べる いろんな方法がありますが、ue5を動かしているパソコンにて、コマンドプロンプトを開いてipconfigと入力します。自分のipが「192.168.10.16」だったとします。メモっておきましょう。 iphone/ipadのlive link vcamを起動する **iphone/ipadのlive link vcamを起動して「192.168.10.16」と入力して、接続します。**接続されない場合はネットワーク設定などに間違いがあるかもしれません。以上で接続完了です。vcamを操作していろいろ試してみてくださいませ。"
  },
  {
    "title": "Raspberry Pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた",
    "url": "/blog/minecraft-server-raspberry-pi-5-java-edition/",
    "description": "Raspberry Pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作りました。数年ぶりにサーバーを立てて遊ぼうとなりまして、使い道に困っているRaspberry Pi 5を使います。マインクラフトは、いろいろなタイプがあります。PCで遊ぶ向けのJava Edition、ゲーム機で遊ぶConsole Editionです。どうやら最近はBedrock Editionという両プラットフォームで遊べるタイプもあるようです。以下は昔ながらのJava Editionでubuntu24.04にインストールします。",
    "tags": [
      "minecraft",
      "作ったもの"
    ],
    "date": "2024年8月31日8時38分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 minecraft java edition のサーバー jar・推奨 jvm・必要メモリはアップデートで変わります。公式 wiki とリリースノートを確認してください。 raspberry pi 5 上の性能はワールド規模と mod で大きく変わります。記事の jvm オプション等は出発点として最新の推奨値と照合してください。 jdk の配布元・ライセンス・入手手順は更新されます。利用条件は oracle / 各ディストリの最新情報で確認してください。 raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作りました。 数年ぶりにサーバーを立てて遊ぼうとなりまして、使い道に困っているraspberry pi 5を使います。 マインクラフトは、いろいろなタイプがあります。 pcで遊ぶ向けのjava edition、ゲーム機で遊ぶconsole editionです。 どうやら最近はbedrock editionという両プラットフォームで遊べるタイプもあるようです。 以下は昔ながらのjava editionでubuntu24.04にインストールします。 電源を入れるとマインクラフトサーバーが自動起動するようにします。 まずjdkをインストールします、16とか17では上手く行かず、新しい21にしました。 sudo apt update sudo apt install openjdk-21-jdk minecraft-serverというフォルダを作ります。 mkdir minecraft-server cd minecraft-server java editionの最新版を調べます。wgetでファイルをゲットします。urlを調べて変更してください。 https://www.minecraft.net/en-us/download/server リンク先の「download minecraft_server.1.21.4.jar and」部分にあるリンク先をコピーして以下のようにダウンロードします。 wget https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar 以下コマンドでセットアップします。初回は必ず失敗します。 java -xmx1024m -xms1024m -jar server.jar nogui eulaテキストの以下部分を変更して同意します。 sudo nano eula.txt eula=false を eula=true に変更 もう一回セットアップします。 java -xmx1024m -xms1024m -jar server.jar nogui 無事起動できたことでしょう。stopなどで停止しましょう。raspberry pi 5のメモリは8gbあります。メモリの割り当てを4gbにします。 java -xmx4096m -xms4096m -jar server.jar nogui サーバーが起動している間にコンソールからゲームルールにて、マインクラフトで物を無くさない設定にしました。 /gamerule keepinventory true 自動起動用にminecraft-start.shを作ります。ユーザー名など環境に合わせて適宜作成してください。つまり「riragon」というユーザー名を自分のユーザー名に変更します。url階層も適宜調整ください。 sudo nano /home/riragon/minecraft-server/minecraft-start.sh 起動コマンドを書いておきましょう「riragon」というユーザー名を自分のユーザー名に変更を忘れずに。 #!/bin/bash cd /home/riragon/minecraft-server java -xmx4096m -xms4096m -jar server.jar nogui 実行権限をつけましょう。以下「riragon」というユーザー名を自分のユーザー名に変更します。 chmod +x /home/riragon/minecraft-server/minecraft-start.sh 次はシステムサービスです。以下にminecraft-start.serviceを作ります。 sudo nano /etc/systemd/system/minecraft-start.service 以下設定です。urlは実際の環境に合わせてください。「riragon」というユーザー名を自分のユーザー名に変更します。以下は[service]のところに3箇所「riragon」があるのでよく見てください。 [unit] description=minecraft server after=network.target [service] user=riragon workingdirectory=/home/riragon/minecraft-server execstart=/home/riragon/minecraft-server/minecraft-start.sh restart=always [install] wantedby=multi-user.target サービスを自動起動にして、スタートします。ステータスで動作を確認します。 sudo systemctl enable minecraft-start.service sudo systemctl start minecraft-start.service sudo systemctl status minecraft-start.service リブートして正しく起動するか確認しましょう。自動起動にするとコンソールから管理者的なコマンド入力が出来ないので、何か操作できる仕組みを入れたいところですが、簡易サーバーだからこれでいいでしょう。 java editionをインストールしました。 最新版を起動してマルチプレイヤーを選択します。 サーバーのipを入力します。ポート開放などは適宜行ってください。 無事に接続できました。 ここまでがriragonお届けの記事です。 さらに深堀してみよう 上記では情報が足りないなと思った人は以下も参考にチャレンジしてみましょう。gptのdeepサーチによる結果のコピーペーストです。riragonの記事もai検索結果に組み込まれておりますね。ai検索の良いところは、普段しらないカテゴリの情報も出てくることです。 raspberry pi 5でjava版のマインクラフトサーバーを構築し、楽しむためのテクニックを調査します。 調査内容には、以下のポイントを含めます。 サーバーのセットアップ手順 （osの選定、必要なパッケージのインストール、javaの適切なバージョン選定） パフォーマンス最適化 （メモリ設定、オーバークロック、軽量osの活用） modやプラグインの導入方法 （papermcやspigotなど） ネットワーク設定 （ポートフォワーディング、ddns、セキュリティ対策） バックアップと管理方法 （自動バックアップ、遠隔管理） 調査結果がまとまり次第、お知らせします。 raspberry pi 5でのminecraftサーバー構築とパフォーマンス最適化 raspberry pi 5 の高性能化により、小規模なminecraft(java版)サーバーを動かすことが可能になりました。 ただし、安定した動作と快適なプレイのためには適切な設定と最適化が重要です。 以下では、軽量osの選定からjavaのインストール、サーバーソフトの導入、メモリ・cpuのチューニング、ネットワーク設定、バックアップ、管理ツール、そして raspberry pi 5ならではのポイント まで、順を追って詳しく解説します。 軽量なraspberry pi osの選定 minecraftサーバーを動かすには、できるだけ無駄のない軽量なos環境が望ましいです。 raspberry pi os lite (64ビット版) を使用することが強く推奨されています ( self hosted minecraft server on raspberry pi with spigotmc ) ( raspberry pi 4b でちゃんと動くminecraft serverを作りたい )。 デスクトップ環境を含まないlite版なら、guiによるメモリ消費やcpu負荷を省き、サーバーにリソースを集中できます。 「デスクトップ環境は不要！」という意気込みでlite版を選択しましょう ( raspberry pi 4b でちゃんと動くminecraft serverを作りたい )。 また 64ビットos を使うことで、raspberry pi 5のメモリをフル活用できます。 64ビット版のraspberry pi osを選択するか、32ビットosの場合は /boot/config.txt に arm_64bit=1 を追記して64ビットカーネルを有効にすると良いでしょう ( self hosted minecraft server on raspberry pi with spigotmc )。 osインストール後はまずパッケージを最新にアップデートしてください ( sudo apt update && sudo apt upgrade -y ) ( self hosted minecraft server on raspberry pi with spigotmc )。 他のosの選択肢 : ubuntu server など64ビット対応の他ディストリも利用可能ですが、raspberry pi公式osは軽量最適化されており情報も豊富なため初心者には扱いやすいです。必要最低限のサービスのみ有効化し、不要なサービスは停止することでさらに軽量化できます。 javaの適切なバージョンとインストール minecraft(java版)サーバーを動かすには対応するjavaランタイムが必要です。 最新のminecraftサーバーでは java 17 以上が必要となっています（minecraft 1.19以降はjava 17が必須）。 raspberry pi os (bookworm以降)では標準でopenjdk 17が利用可能で、特に追加インストールなしでもjava 17が使える場合があります ( raspberry pi minecraft server - pi my life up )。 念のため以下のコマンドでjavaをインストールまたは確認しましょう: sudo apt update sudo apt install openjdk-17-jdk java -version # バージョン確認 上記でjava 17が入るはずです。 java -version で「17.x」のバージョンが表示されればokです。 より新しいjavaが必要な場合 : もし今後のminecraftアップデートや最新のサーバーバージョンで java 21 などが要求される場合、openjdk 21を導入します。 例えばubuntu 23.10以降では sudo apt install openjdk-21-jdk でインストールできます ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )。 raspberry pi osでjava 17より新しいバージョンが必要な場合は、adoptiumやbellsoftなどからarm64向けjdkのバイナリを入手して手動インストールする方法もあります ( self hosted minecraft server on raspberry pi with spigotmc ) ( self hosted minecraft server on raspberry pi with spigotmc )。 javaのインストール後は、 java -version で目的のバージョンになっていることを確認してください。 メモ: サーバー用途ではjdk(開発キット)ではなくjre(実行環境)で十分ですが、spigotのビルドなどを行う場合はjdkが必要になります。基本的に上記コマンドでjdkを入れておけば問題ありません。 minecraftサーバーのダウンロードとインストール java環境の準備ができたら、minecraftサーバー本体を導入します。以下の手順で公式のサーバーソフトウェアをセットアップできます。 サーバー用ディレクトリの作成 : ホームディレクトリ等にサーバー用のフォルダを作成します。例: mkdir ~/minecraft-server && cd ~/minecraft-server 。 サーバーjarファイルのダウンロード : minecraft公式サイトからサーバーjarをダウンロードします。 ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )公式サイトの「 download minecraft_server.<バージョン>.jar 」というリンクを取得し、 wget コマンドでダウンロードします。例: wget https://launcher.mojang.com/v1/objects/＜ハッシュ値＞/server.jar 上記urlの部分は公式サイトからコピーしてください ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )。 （※バージョン番号やurlは適宜読み替えてください。 ） サーバーの初回起動（ファイル生成） : ダウンロードしたjarファイルを一度起動し、初期ファイルを生成します。メモリ割り当ては最小限で構いません。例: java -xmx1024m -xms1024m -jar server.jar nogui ※ nogui オプションを付けることでサーバーのgui画面を表示せずに動作させます（軽量化のため必須です）。 初回起動時は 利用規約に同意していない ため必ず失敗して終了します ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )。 同時に eula.txt というファイルなどが生成されます。 eula（利用規約）への同意 : 初回起動で生成された eula.txt を開き、 eula=false となっている行を eula=true に変更して保存します ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )。これで利用規約に同意したことになります。 サーバーの本起動 : 再度サーバーjarを起動します。先ほどと同じコマンドで構いませんが、後述のメモリ割り当て最適化に合わせて -xmx の値を増やしても良いでしょう。例えばメモリ4gbのpiの場合は -xmx3g 程度に変更します。起動コマンド例: java -xms512m -xmx1008m -jar ~/minecraft-server/server.jar nogui （※上記はraspberry pi 2〜5の1gbモデル向け推奨値の例です ( raspberry pi minecraft server - pi my life up )。 pi 4/5の2gb以上モデルでは -xmx 値はさらに増やせます。 ） 正常に起動すればコンソール上にログが流れ始め、ワールド生成が開始されます。初回ワールド生成には数分かかる場合があります。 完了メッセージ （example: done (12.345s)! for help, type \"help\" or \"?\" ）が表示されればサーバー起動成功です。 6. サーバー設定の調整（必要に応じて） : server.properties ファイルを編集してサーバー設定を変更できます。例えばサーバー名、最大プレイヤー数、オンラインモード（認証の有無）などを設定可能です。特に プレイヤー許可リスト（whitelist）や難易度 などは必要に応じて設定しておきましょう（セキュリティ対策は後述）。設定変更後はサーバー再起動が必要です。 以上で基本的なminecraft公式サーバーが稼働します。ただしこのままではraspberry pi上で快適に動作させるには不十分な場合があります。次章以降でパフォーマンス最適化のポイントを詳述します。 メモリ・cpu設定の最適化 raspberry piでminecraftサーバーをスムーズに動作させるには、限られたリソースを効率的に使う工夫が必要です。ここではメモリ割り当てやcpu負荷の対策、オーバークロック設定など、主な最適化項目を挙げます。 メモリ割り当て調整 : javaのヒープメモリ( -xmx オプション)を適切に設定します。サーバーに割り当てすぎるとosが不足し不安定になりますが、少なすぎてもパフォーマンスが低下します。目安として、 4gb ramのモデルでは2～3gb程度 , 8gbモデルでは4～6gb程度 を上限に割り当てると良いでしょう ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )。例えば8gb搭載のpi 5では実際にヒープサイズ4gbで運用して問題なく動作した報告があります ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた )。なお最小値 -xms は小さめ(512mb程度)で十分です。割り当て後、稼働中のメモリ使用量を htop コマンドなどで観察し、余裕と無駄がないか確認してください。 ビュー距離・シミュレーション距離の調整 : サーバー設定の view-distance （視野距離）および simulation-distance （シミュレーション距離）を小さめに設定するとcpu負荷を大幅に減らせます。デフォルトは10前後ですが、 4～6程度 まで下げると軽量化に効果的です ( raspberry pi minecraft server - pi my life up )。実際にpi上では視野距離を4チャンクに下げ、最大プレイヤー数も5人程度に制限する設定例があります ( raspberry pi minecraft server - pi my life up )。シミュレーション距離も同様かそれ以下に設定し、遠方のチャンクでの動作計算を抑制しましょう。これにより特に複数プレイヤーが各地を動き回る際の負荷が軽減されます。 オーバークロックの活用 : raspberry pi 5は標準で最大2.4ghz駆動ですが、オーバークロックによりさらに高速化が可能です。cpuクロックを例えば 2.8～3.0ghz 程度まで引き上げることでサーバーのtps向上が期待できます ( how to overclock a raspberry pi 5 | tom's hardware )。オーバークロックの手順は /boot/firmware/config.txt （pi osの場合）に以下の行を追加します（例では3.0ghzに設定） ( how to overclock a raspberry pi 5 | tom's hardware ): arm_freq=3000 ※pi 5の個体差により安定動作する上限周波数は異なります。 無理に3ghzを狙わず、まずは2.5～2.7ghz程度から試すのが安全です ( how to overclock a raspberry pi 5 | tom's hardware )。 オーバークロックする際は 十分な冷却対策 と自己責任をお忘れなく。 冷却対策 : 小型筐体であるraspberry piは熱による性能低下（サーマルスロットリング）に注意が必要です。pi 5には公式の**アクティブクーラー（冷却ファン付きヒートシンク）**が用意されており、これを使用することで高負荷時の温度上昇を大幅に抑えられます ( minecraft server on raspberry pi 5 : r/admincraft )。実際、pi 5用クーラーを取り付けた場合とそうでない場合では長時間動作時の安定性に差が出ます。「高温でcpuクロックが制限されパフォーマンスが頭打ちになる」といった事態を防ぐため、できれば公式クーラーあるいは同等のヒートシンク＋ファンを取り付けましょう ( how to overclock a raspberry pi 5 | tom's hardware )。 gpuメモリの最小化 : raspberry piはデフォルトでメインメモリの一部をgpu用に確保しています。サーバー用途ではグラフィックスを使わないため、この**gpuメモリ割り当てを最小（16mb）**に減らしてramを解放します ( self hosted minecraft server on raspberry pi with spigotmc )。raspberry pi osでは raspi-config ツールの「performance」メニューからgpuメモリを16mbに設定できます（または /boot/config.txt の gpu_mem 設定を16に）。これにより数十～数百mbのramを節約できます。 スワップ領域の調整 : メモリ不足時の保険としてスワップサイズを増やしておくと安心です。特にメモリが限られる4gb以下のモデルでは、 スワップを1gb程度に拡張 しておくとメモリ逼迫時にプロセスが落ちるのを防げます ( self hosted minecraft server on raspberry pi with spigotmc )。ただしスワップ（ストレージ上の仮想メモリ）は極力使わないのが前提です。スワップに頼る状況は著しい性能低下を招くため、基本は物理ram内で収まるよう運用し、スワップは緊急避難用と考えてください。 チャンクの事前生成 : ワールド探索時に新しい地形（チャンク）が生成されるとサーバーcpuに大きな負荷がかかり、ラグの原因になります。対策として、あらかじめスポーン地点周辺のチャンクを**事前に生成（プリジェネレート）**しておく方法があります。spigot/paper系サーバーであればプラグイン「chunky」などを導入し、半径○ブロックの範囲を事前生成するといった運用が可能です ( build a minecraft server on raspberrypi 4 ) ( build a minecraft server on raspberrypi 4 )。例えば半径5000ブロックをpi 4で生成するのに約10時間かかった報告がありますが ( build a minecraft server on raspberrypi 4 )、範囲を狭めれば時間短縮できます。事前生成により初回探索のカクつきを防ぎ、ディスクアクセスも平準化されるメリットがあります（ただしワールドサイズは大きくなります ( build a minecraft server on raspberrypi 4 )）。 以上のような最適化を施すことで、raspberry pi上でもかなり快適なminecraftサーバー運用が可能になります。 元々「5人以上だとカクついて2～3人が限度」と言われていたraspberry piでのサーバーも、こうしたチューニング次第で改善が見込めます ( raspberry pi minecraft server - pi my life up )。 spigotやpapermcなど軽量カスタムサーバーの導入 よりパフォーマンスを向上させるには、公式のバニラサーバーより 軽量化されたサーバーソフト を利用するのが効果的です。代表的なものに spigot や papermc があります。これらは公式サーバーの改良版で、大幅な最適化や追加機能が施されています。 spigot : bukkit系プラグインに対応したサーバーソフトで、公式より動作が軽く安定性が高いとされています。実際、ラズパイ上で公式サーバーが不安定だったケースでもspigotに置き換えたらクラッシュが減り安定したという報告があります ( raspberry pi minecraft server - pi my life up )。spigotの入手にはビルドツール（buildtools.jar）を使って自分でコンパイルする必要があります ( raspberry pi minecraft server - pi my life up )。手順としてはgitとjavaを用意した上で、buildtoolsをダウンロードして実行し、spigot.jarを生成します ( raspberry pi minecraft server - pi my life up )。生成されたjarファイルを先ほどのserver.jarと差し替えて起動すればspigotサーバーとして動作します。 papermc : spigotをさらに高速化し機能拡張したサーバーソフトで、現在最もおすすめの選択肢です。paperはspigotの全プラグインを互換しつつ、より高度なパフォーマンス調整項目（設定ファイル上でエンティティ処理負荷の軽減やメモリ節約設定など）が追加されています。paper自体の導入は簡単で、公式サイトからpaperサーバーjar（対応minecraftバージョンのもの）を直接ダウンロードできます ( build a minecraft server on raspberrypi 4 )。例えばpaper 1.20.1のjarを入手したら、それを server.jar として起動するだけでokです。paperは開発が活発でバグ修正も早く、raspberry piのようなローエンド環境でも効率よく動作するよう調整されています。 上記どちらを使う場合も、 基本的な使い方は公式サーバーと同じ です。 起動コマンドや設定ファイルの構成もほぼ共通なので、乗り換えても大きく迷うことはないでしょう。 特にpapermcはデフォルト設定でもかなり最適化されていますが、さらに踏み込んだ調整が可能です（例えば paper.yml や spigot.yml でモブの処理間隔を伸ばす、不要なティックを削減する等）。 性能比較 : 一般に papermc > spigot > バニラ公式サーバー の順で軽量高速と言われます。 例えばraspberry pi 4でもpaper 1.16なら問題なく動作したという報告があります ( minecraft server on raspberry pi 5 : r/admincraft )。 また、プラグインを必要としない場合には fabricサーバー＋最適化mod という選択肢もあります。 fabricは軽量なmodローダーで、「lithium」（サーバー最適化mod）や「ferritecore」（メモリ最適化mod）などを導入することでバニラの挙動を変えずに高tpsを実現できます ( minecraft server on raspberry pi 5 : r/admincraft )。 実際、pi 5上でpaperやバニラよりfabric＋lithiumの方が安定して 常時20tpsを維持できた との報告もあります ( minecraft server on raspberry pi 5 : r/admincraft )。 ただしfabricの場合はbukkit系プラグインが使えないため、必要な機能に応じてpaperと使い分けてください ( minecraft server on raspberry pi 5 : r/admincraft )。 まとめ : ラズパイで運用するなら、まずpapermcを検討すると良いでしょう。 paperはシステム資源の効率的な利用に優れており、コミュニティによる最適化ガイドも充実しています。 またプラグインを活用すれば、チャンクの事前生成やバックアップ自動化など便利な機能も取り入れられます。 軽量サーバーソフトの活用は、限られたハードウェアで最大限のパフォーマンスを引き出す鍵と言えます。 ネットワーク設定（ポート開放、ddns、セキュリティ対策） 自宅のraspberry piをサーバーとして運用する場合、ネットワークの設定も重要です。ローカルネットワーク内だけで遊ぶ場合はシンプルですが、インターネット越しにフレンドと遊ぶ場合は ルーターの設定 や セキュリティ対策 が必要になります。 ローカルipの固定 : まずraspberry piに固定のローカルipアドレスを割り当てましょう。これはルーターのdhcp予約機能を使うか、raspberry pi側で静的ipを設定します ( raspberry pi minecraft server - pi my life up )。固定ipにしておくと、再起動時にpiのipが変わらず、後述のポート転送設定が無効化されるのを防げます。 ポートフォワーディング（ポート開放） : インターネットから接続できるようにするには、ルーターで 25565ポート を開放し、raspberry piのipに転送します ( self hosted minecraft server on raspberry pi with spigotmc )。具体的にはルーターの設定画面で「ポート転送（port forwarding）」の設定を行い、外部ポート25565をpiのローカルipの25565ポートにマッピングしてください。こうすることで、外部からあなたのグローバルipの25565宛の通信がpiのサーバーに届くようになります ( self hosted minecraft server on raspberry pi with spigotmc )。ポート番号はデフォルト25565のままで問題ありませんが、もし変更している場合はその番号を開放します。なお、自宅ネット環境によってはisp側でポート開放が制限されていたり、ipv6環境の場合ポート転送の扱いが異なることがありますので注意してください。 ddnsの利用 : 家庭用回線ではグローバルipアドレスが固定ではなく変動することがあります。その場合、**dynamic dns (ddns)**サービスを利用すると便利です。no-ipやdyndns、duckdnsなどの無料ddnsサービスに登録し、自宅ipに自動でドメイン名をひも付けておけば、フレンドにはそのドメインでサーバーに参加してもらうことができます。raspberry pi上にクライアントを入れて定期的にipを通知することで、ipが変わっても常に最新のipがドメイン名に対応するようになります。 ファイアウォールとsshセキュリティ : サーバー機としてpiを公開するなら、最低限のセキュリティ対策も行いましょう。raspberry pi osであれば ufw （uncomplicated firewall）を導入して不要なポート通信を遮断するのがおすすめです。 sudo apt install ufw でインストールし、 sudo ufw allow 22/tcp （ssh用）や sudo ufw allow 25565/tcp （minecraft用）など必要なポートだけ許可、最後に sudo ufw enable でファイアウォールを有効化します。これにより基本的に外部からのアクセスはminecraftサーバー用ポートとssh管理用ポート程度に限定できます。また、piのデフォルトユーザー( pi )のパスワード変更や、ssh鍵認証の導入など基本的なセキュリティ設定も忘れずに。 オンラインモードと認証 : server.properties の online-mode はデフォルトで true になっており、これは必ず trueのまま 運用しましょう。オンラインモードtrueではminecraft公式のアカウント認証が行われ、不正ユーザーのログインを防げます。万一offlineモード(false)にすると誰でもなりすましてログインできてしまうため非常に危険です（特殊な用途でない限り触れないでください）。 ホワイトリスト（許可リスト）の活用 : サーバーをインターネットに公開する場合、**ホワイトリスト（ホワイトリスト方式の参加許可）**を有効にすることを強く推奨します。minecraftサーバーの25565番ポートは有名で、インターネット上では自動スクリプトによるポートスキャンの対象になりやすいです ( build a minecraft server on raspberrypi 4 )。悪意ある第三者があなたのサーバーに侵入しようと試みる可能性もあります。ホワイトリストを有効にしておけば、事前に許可したプレイヤー以外はサーバーに入れないので安全です ( build a minecraft server on raspberrypi 4 )。設定方法は server.properties で white-list=true とし、サーバーコンソール上またはops権限を持つプレイヤーから /whitelist add <プレイヤー名> コマンドで友人のminecraftユーザー名を登録します ( build a minecraft server on raspberrypi 4 )。登録されていないユーザーが接続しようとすると「あなたはホワイトリストにありません」という旨のメッセージが表示され、接続できなくなります ( build a minecraft server on raspberrypi 4 )。 rconのセキュリティ : 後述するrconを有効化する場合、そのポート(デフォルト25575)にも注意しましょう。基本的にrconはサーバー内限定で使い、インターネットから直接rconポートにアクセスさせないのが安全です。どうしても外部からrconを使う必要がある場合は、ファイアウォールで信頼できるipだけrconポートを許可するか、sshトンネル経由でrcon接続するなど工夫してください。また rconパスワード は推測されにくい強度の高いものを設定しましょう。 以上のネットワーク設定とセキュリティ対策により、外部から安心してminecraftサーバーに接続できるようになります。特にホワイトリストとオンラインモードtrueの組み合わせで、不特定多数や不正クライアントからのアクセスをシャットアウトできる点は重要です。 バックアップ方法とワールド管理 minecraftの世界データはかけがえのないものです。万一に備えて 定期的なバックアップ を実施しましょう。バックアップの頻度はサーバーの変更頻度によりますが、少なくとも週1、可能なら毎日1回は行うのが理想です。 バックアップの基本 : サーバーのバックアップはシンプルに言えば、 ワールドデータフォルダを丸ごとコピー して保管しておくことです。 minecraftサーバーでは、デフォルトのメインワールドはサーバーディレクトリ内の world というフォルダに保存されています（ネザーやエンドは world_nether , world_the_end など）。 これらを含むサーバーフォルダ全体を圧縮して保存しておけば、いつでもその状態に復元可能です ( build a minecraft server on raspberrypi 4 )。 具体的な手順例: サーバーの停止 : バックアップを取る前に、可能であればサーバーを一時停止/停止します。コンソール上で stop コマンドを実行し、サーバーが正常終了するのを待ちます。プレイヤーがいない深夜などに停止するのが良いでしょう（難しい場合は少なくともワールドをセーブする save-all コマンドを実行してください）。 フォルダのアーカイブ : サーバーディレクトリに移動し、圧縮コマンドで全体を一つのファイルにまとめます。例えばサーバーフォルダが /opt/minecraft にある場合、以下のようにtarコマンドを使います ( build a minecraft server on raspberrypi 4 ): cd /opt tar -zcvf minecraft_backup_$(date +%y%m%d).tar.gz minecraft こうすると minecraft フォルダ全体が日時付きの名前で圧縮アーカイブされます ( build a minecraft server on raspberrypi 4 )。 容量節約のため、圧縮(zipやtar.gz)することをおすすめします。 バックアップの保管 : 作成したバックアップファイルは 別の場所に保管 しましょう。同じsdカードやssd上に置いておくだけでは、メディア故障時にバックアップごと失う可能性があります。別pcにコピーする、外付けドライブに保存する、クラウドストレージにアップロードする等が考えられます ( build a minecraft server on raspberrypi 4 )。定期的にバックアップを取得し、世代管理（例えば直近7日分を保持して古いものは削除）すると、万一ワールドが壊れたり間違って消してしまった場合でも任意の時点に戻せて安心です。 自動バックアップ : 毎回手動でバックアップするのが難しい場合、linuxの cron 機能を使って自動化できます。例えば毎日深夜4時に上記tarコマンドを実行し、自動でバックアップを取得するようにスクリプトを組むことも可能です。スクリプト内で世代管理（古いファイルの削除）も行えば、一定のローテーションでバックアップを維持できます。 バックアップからの**リストア（復元）**も簡単です。 サーバーが不調になった場合、一度サーバーフォルダを別場所へ移動/待避し、保存しておいたバックアップアーカイブを解凍するだけです ( build a minecraft server on raspberrypi 4 ) ( build a minecraft server on raspberrypi 4 )。 復元後にサーバーを起動すれば、バックアップ取得時点の状態でワールドが読み込まれます。 但しバックアップ以降の進捗は失われますので、やはり定期的に行うことが重要です。 サーバー管理ツールの活用（rconやweb ui） minecraftサーバーを長期運用するにあたり、 管理を簡便にするツール も活用しましょう。ここでは、リモートコンソール操作を可能にする rcon と、ブラウザ上でサーバー管理ができる web uiツール について説明します。 rcon（リモートコンソール） : rconを有効にすると、サーバーのコンソールにリモートからコマンドを送信したりログを取得したりできます。minecraftサーバーの設定ファイル server.properties で enable-rcon=true にし、 rcon.password=<任意のパスワード> を設定、 rcon.port=25575 （必要ならポート変更可）を指定すれば機能がオンになります ( minecraft server rcon/query utility - minecraft tools - mapping and modding: java edition - minecraft forum - minecraft forum )。rcon有効化後、pcから mcrcon 等のクライアントソフトを使ってpiのサーバーに接続し、コンソールコマンドを遠隔実行できます。例えば外出先からスマホでサーバーを管理したい場合や、サーバーを画面なしで起動していて直接コンソールを開けない場合などに便利です。rconを使用する際は先述のとおりパスワード管理とアクセス制限に注意してください。 webベースの管理ツール : 専用のweb ui（ダッシュボード）を導入すると、ブラウザ経由でサーバーの状態監視や操作が可能になります。人気のあるオープンソースのパネルとして crafty controller や mineos があります。たとえばcrafty controllerは自宅サーバー上で動作するウェブ管理ツールで、複数のminecraftサーバーの起動・停止、プレイヤー管理、コンソール操作、設定ファイル編集、バックアップ実行など多彩な機能を提供します ( crafty controller )。craftyはpython製ですがdockerコンテナとして提供されており、raspberry pi 5上でもdocker経由で問題なく動作する報告があります（実際にpi 5 + crafty + paperサーバーで重いmodパックを安定稼働させた例もあります） ( raspberry pi 5 runs minecraft modpack server with excellent performance! - statictics (stoneblock 2 + crafty controller) : r/raspberry_pi ) ( raspberry pi 5 runs minecraft modpack server with excellent performance! - statictics (stoneblock 2 + crafty controller) : r/raspberry_pi )。mineosはnode.js製のサーバーパネルで、こちらもraspberry piにインストールしてサービスとして動かすことで、ブラウザからサーバー追加・設定・ログ閲覧・コンソール操作ができるようになります。 これらの管理ツールを使うことで、コマンドラインになじみのないユーザーでも比較的直感的にサーバーを扱えるようになります。 ただし、web ui自体がpi上で動作するため 追加のリソース消費 があります。 pi 5なら余裕がありますが、可能な限り軽量に保ちたい場合は導入を検討しましょう。 最小限の管理で良い場合、単にsshでpiに入り、 screen や tmux でサーバーをデタッチ実行しておき必要時にアタッチして操作する、といった方法でも十分です ( build a minecraft server on raspberrypi 4 )。 要件に応じて便利なツールを取り入れてください。 raspberry pi 5ならではの注意点と追加の最適化 最後に、 raspberry pi 5特有のポイント や恩恵について触れておきます。 pi 4からの性能向上 : raspberry pi 5は前世代と比べcpu性能が大きく向上しており、minecraftサーバー運用でもその差は歴然です。あるユーザーはpi 4でやや力不足だったサーバーをpi 5に移行したところ、「pi 5のサーバー性能には驚かされた。pi 4では難しかった14～16チャンクの視野距離も、pi 5では約5人のプレイヤー環境で維持できる」 と報告しています ( minecraft server on raspberry pi 5 : r/admincraft )。プレイヤー数が増える場合でも8～10チャンク程度に抑えれば問題なく動作するとのことです ( minecraft server on raspberry pi 5 : r/admincraft )。このようにpi 5なら少人数向けサーバーであれば十分実用的なパフォーマンスを発揮できます。 ストレージの高速化 : pi 5ではusb3.0に加えてpcie接続の nvme ssd が利用可能になりました。microsdカードに比べ、ssdは圧倒的に高速なランダムアクセス性能を持っています。サーバーのワールド読み書きやチャンクロードはストレージ性能に依存する部分も大きいため、可能であればシステムとサーバーデータをssd上で運用することをおすすめします。実際にpi 5でnvme ssdを使用すると、サーバーの起動時間短縮やチャンクロードのスムーズさといった効果が体感できます ( minecraft server on raspberry pi 5 : r/admincraft ) ( minecraft server on raspberry pi 5 : r/admincraft )。sdカードでも動作はしますが、ランダムアクセスが多い状況（例えば複数人が別々の方向に高速移動して新規チャンクを生成する場合など）では差が出ます ( minecraft server on raspberry pi 5 : r/admincraft )。ssd運用する場合は十分な電源供給と放熱に留意し、信頼性の高いメディアを使いましょう。 電源と安定性 : pi 5は性能向上に伴いピーク消費電力も増加しています。純正の定格電源アダプタを使用し、特にオーバークロック時やusbデバイス接続時に電圧低下しないよう留意してください。電源が不安定だと高負荷時に再起動がかかったり、最悪データ破損の可能性もあります。長時間の連続稼働が前提となるため、安定した電源供給とups（無停電電源装置）の導入も検討すると安心です。 ネットワーク帯域のボトルネック : pi 5自体はギガビットethernetを備え、かつusbと独立した新設計によりネットワークとストレージi/oの干渉が少なくなっています。これによりディスクアクセスしながらでも通信が頭打ちになりにくい利点があります。ただし、インターネット越しのプレイでは自宅回線の アップロード帯域 がボトルネックになる場合があります。プレイヤー数が多いと上り通信量も増えますので、自宅のネット契約（上り速度）も念頭に置いてください。一般的な光回線で数人規模なら問題ありませんが、モバイル回線テザリング等では厳しいこともあります。 ソフトウェアのアップデート : pi 5は新しいボードゆえに対応ソフトウェアのアップデートが活発に行われています。raspberry pi os自体やjavaランタイム、papermcなどサーバーソフトも定期的に更新をチェックし、適用するようにしましょう。特にpapermcは頻繁にビルドが更新されるので、管理ツールの自動アップデート機能や手動でjarを入れ替える手順で最新バージョンを取り入れると、パフォーマンス改善や不具合修正の恩恵を受けられます ( build a minecraft server on raspberrypi 4 )。 以上、raspberry pi 5でのminecraftサーバー構築と最適化のポイントを網羅しました。 適切なosとjava環境のもと、リソースを無駄なく活用し、必要に応じてカスタムサーバーソフトや管理ツールを組み合わせれば、小規模ながら安定したminecraftマルチプレイ環境を実現できるでしょう。 ぜひ快適なminecraftサーバー運用を楽しんでください。 参考資料: raspberry pi公式フォーラム, 他ユーザーのラズパイサーバー運用事例 ( minecraft server on raspberry pi 5 : r/admincraft ) ( minecraft server on raspberry pi 5 : r/admincraft ) ( minecraft server on raspberry pi 5 : r/admincraft ) peppe8o (self hosted minecraft server on raspberry pi) ( self hosted minecraft server on raspberry pi with spigotmc ) ( self hosted minecraft server on raspberry pi with spigotmc ) pi my life up (raspberry pi minecraft server) ( raspberry pi minecraft server - pi my life up ) ( raspberry pi minecraft server - pi my life up ) linuxnorth (raspberrypi 4 minecraft server guide) ( build a minecraft server on raspberrypi 4 ) ( build a minecraft server on raspberrypi 4 ) reddit (r/admincraft 他) raspberry pi 5でのパフォーマンス報告 ( minecraft server on raspberry pi 5 : r/admincraft ) ( minecraft server on raspberry pi 5 : r/admincraft ) riragonブログ (ラズパイ5でminecraftサーバー構築記録) ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた ) ( raspberry pi 5（ラズパイ5）でマインクラフトサーバー（minecraft-server）を作って、サービスを自動起動させてみた ) crafty controller公式ドキュメント ( crafty controller ) 他"
  },
  {
    "title": "WindowsでFAT32フォーマットするならRufus。簡単にしっかりFAT32でフォーマットできます。",
    "url": "/blog/fat32-windows-rufus/",
    "description": "未だに古いシステムでSDなどのメディアを使うときにFAT32へのフォーマットが必要になります。困りますよ。WindowsだとなぜかFAT32のフォーマットが出てきません。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年8月27日22時54分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 os のバージョンによっては、エクスプローラーのフォーマットで fat32 が選べるケース もあります（記事は「選べない前提」の回避策）。 rufus の画面構成・推奨オプションは更新で変わります。公式 / 紹介ページのスクリーンショットとずれる場合があります。 大容量メディアの fat32 （単一ファイル 4gb 制限など）は用途によっては exfat の方が適切なこともあります。 未だに古いシステムでsdなどのメディアを使うときにfat32へのフォーマットが必要になります。困りますよ。windowsだとなぜかfat32のフォーマットが出てきません。 それで困って、検索するとi-o dataやバッファローのフォーマッターが出てきますが、i-o dataのストレージしかフォーマットできなかったりします。ムムム。良いのがあったぞ！とfat32formatterなどをインストールするも、なんかエラーが出たり上手くフォーマットできません。なぜだ！！ そんなときですよ。rufus。rufusはisoイメージファイルを作るソフトウェアですが、fat32フォーマッターとして利用できる優秀なソフトウェアです。 rufusのダウンロードはこちら https://forest.watch.impress.co.jp/library/software/rufus/ githubはこちら https://github.com/pbatard/rufus fat32フォーマットもできるrufus 利用したいデバイスによっては設定が異なるかもしれませんが、freedosでfat32フォーマットすると上手く行きました。設定は以上です。非ブートの方がいいのかな？"
  },
  {
    "title": "UE5の統計データstat unitの読み方や、負荷・ボトルネックの調べ方の基礎を説明、毎回自動的に統計データを表示する方法を紹介",
    "url": "/blog/ue5-fukatokutei-statunit-yomikata/",
    "description": "UE5にて動作がカクツクとき、何が原因で負荷が発生しているのか調べる必要があります。本記事では統計データであるstat unitの項目の読み方、統計データから負荷ボトルネックを特定する基本、統計データの毎回自動表示する方法を説明します。\n動作のボトルネック調査の第一歩は「stat unit」など統計データです。コンソールに「stat unit」を入力する方法もありますが、①画面の左上のメニューをクリックします。②統計データ、③Engine、④FPSにチェック、⑤UnitとUnitGraphにチェックを入れます。簡単な方をお使いください。",
    "tags": [
      "UE5"
    ],
    "date": "2024年8月25日17時30分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 stat unit などコンソール統計の意味はレンダリングパス（deferred / lumen 等）で解釈が変わります。版ごとの説明を確認してください。 閾値の「良し悪し」はプロジェクト規模とターゲット fps に依存します。記事は入門向けの目安です。 ボトルネック特定には unreal insights 等のプロファイラ併用が推奨です。 ue5にて動作がカクツクとき、何が原因で負荷が発生しているのか調べる必要があります。 本記事では統計データであるstat unitの項目の読み方、統計データから負荷ボトルネックを特定する基本、統計データの毎回自動表示する方法を説明します。 動作のボトルネック調査の第一歩は「stat unit」など統計データです。コンソールに「stat unit」を入力する方法もありますが、①画面の左上のメニューをクリックします。②統計データ、③engine、④fpsにチェック、⑤unitとunitgraphにチェックを入れます。簡単な方をお使いください。 右側に細かい数字が出てきます。frame、game、draw、rhit、gpu time、dynres、draws、primsなどの項目です。 これら数字からゲームスレッド（ゲームロジックやプレイヤーの入力処理など）、レンダリングスレッド（3dモデルのレンダリング、テクスチャの適用、シェーダーの計算、光源の処理など）、またはgpuのいずれかにパフォーマンスのボトルネックがあるか判別に役立ちます。 公式の説明 https://dev.epicgames.com/documentation/en-us/unreal-engine/stat-commands-in-unreal-engine#unit frame（フレーム） フレーム時間は、ゲームの1フレームを生成するのにかかった総時間です。ゲームスレッドと描画スレッドはフレームを終える前に同期するため、フレーム時間はこれらのスレッドのいずれかの表示時間に近くなることが多いです。 game（ゲーム:） フレーム時間がゲーム時間に近い場合、ゲームのパフォーマンスはおそらくゲームスレッドによってボトルネック（負の影響を受けている）になっています。 draw（描画） フレーム時間が描画時間に近い場合、ゲームのパフォーマンスはおそらくレンダリングスレッドによってボトルネックになっています。 gpu time（gpu時間） デオカードがシーンをレンダリングするのにかかる時間を測定します。gpu時間はフレームに同期されているため、フレーム時間と似たようなものになる可能性が高いです。 rhit rhiスレッド時間はフレームに同期され、フレーム時間と似ている可能性が高いです。 dynres サポートされている場合（および有効になっている場合）、動的解像度は主画面のパーセンテージを副画面のパーセンテージで表示します。 以下画面の一番上に数値が、このプロジェクトの実際のfpsです。60fps出るはずが、何かがボトルネックになっており、48fpsしか出ていません。何がボトルネックなのでしょうか。 まずフレーム時間とゲームスレッドの比較 フレーム時間がゲーム時間に近い場合、それはゲームスレッドがパフォーマンスのボトルネックになっている可能性が高いです。ゲームスレッドは、ゲームロジック、aiの計算、物理演算などを処理します。この時間が全体のフレーム時間に占める割合が大きい場合、ゲームスレッドの最適化が必要です。 実際に以下を見ると、frameとgameは近くないので、ゲームスレッドがボトルネックではないと判断できます。 フレーム時間と描画スレッドの比較 フレーム時間が描画時間に近い場合、描画スレッドがボトルネックであることを示します。描画スレッドは、3dモデルのレンダリング、テクスチャのマッピング、シェーダーの適用など、画面に表示するための計算を行います。この時間がフレーム時間に占める割合が大きければ、描画関連の最適化が求められます。 実際に以下を見ると、frameとdrawはとても近いです。レンダリングスレッドがボトルネックになっている可能性が高いです。 gpu時間の確認（gpu time） gpu時間もフレーム時間と同様に、グラフィックカードがシーンをレンダリングするのにかかる時間です。 gpu時間がフレーム時間に近い場合、gpu処理がボトルネックとなっている可能性があります。 rhiスレッドの時間（rhit） rhi（render hardware interface）スレッドは、レンダリングを制御するための低レベルapiと通信します。この時間がフレーム時間に近い場合、レンダリングapiの呼び出しに問題がある可能性が指摘されます。以下は近くないので問題がなさそうです。 動的解像度の監視（dynres） 無効になっていますが動的解像度が有効な場合、パフォーマンスを維持するために解像度が動的に変更されます。この設定の有効化とその効果もパフォーマンス分析に重要です。 毎回自動でエディタに統計データを表示する方法 エディタを再起動すると表示が消えてしまいます。消えないようにする方法はエディタの環境設定から、ビューポート、ルック＆フィール、エンジン統計の保存をクリックします。これでエディタを再起動しても再表示されます。 アプリで書き出したり実行しながら統計データを確認 簡易なプレビューではなく、実際にアプリで書き出した時にも統計データをチェックしたいことがあります。 実際に操作するとまた挙動が異なるものです。 ブループリントにて、stat unitが実行されるようにします。 execute console commandを設定して、そこにstat unitなど統計データのコマンドを入力します。 riragonの記事はここまで。以下deepサーチ検索結果です。本記事で発見できない項目など見つかるかもしれません。ai検索のよいところは、知りえなかった情報が見つかることです。 もっと深堀してみよう！ ue5において stat unit の項目の詳細な読み方、ボトルネックの特定方法、および関連する統計データについて調査します。また、パッケージ化後の実行やvr環境での最適化に関する情報、ハードウェアの影響、および効果的な最適化手法についても調査し、包括的にまとめます。 ue5におけるパフォーマンス計測とボトルネック分析 1. stat unit 各項目の意味とボトルネックの見分け方 unreal engine 5では、コンソールコマンド stat unit を実行するとフレーム時間の内訳が表示されます。表示される主な項目は「frame」「game」「draw」「gpu」「rhit」「present」です。それぞれの意味は以下の通りです。 frame （フレーム時間）: 1フレーム全体にかかった時間（ms）です。これは実質的に他の値の中で最大のものになり ( meaning of frame, game, draw when using stat unitgraph - debugging, optimization, & profiling - epic developer community forums )、fpsの逆数（例: 33msなら約30fps）に相当します ( measuring performance - unreal art optimization )。frame時間が目標値（例えば60fpsなら16.67ms）を超えている場合、何らかのボトルネックが発生しています。 game （ゲームスレッド時間）: ゲームスレッドでの処理時間です。ゲームプレイのコード（c++やブループリント）、ai、物理演算などcpuで行われるゲームロジックの時間を示します ( measuring performance - unreal art optimization ) ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。この値がframeとほぼ同じくらい大きい場合、ゲームスレッド（cpu）の処理がボトルネックでフレームレートを制限している可能性があります ( profiling & optimizing for the best performance in unreal engine )。 draw （レンダースレッド時間）: 描画スレッドでの処理時間です。cpuがレンダリングのためにデータを準備しコマンドを発行する処理時間を示します ( measuring performance - unreal art optimization )。この値がframe時間に近い場合、cpuのレンダリング処理（描画スレッド）がボトルネックとなっている可能性があります ( profiling & optimizing for the best performance in unreal engine )。 gpu （gpuレンダリング時間）: gpuがフレームの描画に費やした時間です ( measuring performance - unreal art optimization )。gpuはcpuとは非同期並列に動作しますが、現在のフレームのgpu処理が完了し表示されるまで次のフレームに進めないため、gpu時間が長いとそれがフレーム全体を押し延ばします ( measuring performance - unreal art optimization )。gameやdrawがいずれもframeより十分小さい一方でgpu時間がframeに近い場合、gpu側にボトルネック（ビデオカードが処理しきれない負荷）があると判断できます ( profiling & optimizing for the best performance in unreal engine )。 rhit （rhiスレッド時間）: レンダリング・ハードウェア・インターフェース スレッドの処理時間です。direct3d12やvulkanなど低レベルapi向けに実装されたスレッドで、レンダースレッドと並行してgpuコマンド送信を行います ( profiling & optimizing for the best performance in unreal engine )。通常この値はframe時間とほぼ同程度かわずかに小さいくらいで、特定の重い処理がない限り大きな負荷にはなりません ( amd lança hoje patch especifico para unreal engine 4, seu calcanhar de aquiles, será que a partir de agora vai?????w | fórum outer space - o maior fórum de games do brasil )。極端にrhitが大きい場合はドライバ処理やgpu待ちが発生している可能性があります。 present （プレゼント時間）: 画面表示のための処理や、gpuの処理完了を待機している時間です。 stat unit のオンスクリーン表示そのものには出ない場合もありますが、 stat scenerendering など詳細な統計で「present」時間が計測されることがあります ( unreal engine performance guide - amd gpuopen )。 present が高い場合、レンダリングスレッドがgpuの完了待ちでブロックされていることを意味し、実質的にはgpuボトルネックの兆候です ( what is present time in d3d11rhi? - rendering - epic developer community forums )。例えばdirectxでは、gpuの処理が遅いとcpu側がpresent（表示）で待たされるため、この値がフレーム時間を押し上げます。 以上の項目の中で 最も時間のかかっている部分がボトルネック です。 実際のframe時間は、game・draw・gpuのいずれか遅い方によって決まります ( meaning of frame, game, draw when using stat unitgraph - debugging, optimization, & profiling - epic developer community forums )。 したがって、 stat unit を見て frameとほぼ同じ値を示している項目 がボトルネック要因であり、そのスレッドないしデバイス（cpuゲーム処理・cpu描画処理・gpu）の最適化が必要になります ( profiling & optimizing for the best performance in unreal engine )。 例えば「game: 25ms, draw: 5ms, gpu: 4ms, frame:25ms」であればcpuのゲームロジックが足かせになっており、「gpu: 30ms, game:10ms, frame:30ms」であればgpuがボトルネックだと判断できます。 2. stat unit 関連の統計データ活用方法 ( stat fps , stat gpu , stat scene rendering など) パフォーマンスを詳しく分析するには、 stat unit 以外にもunreal engineの各種統計コマンドを組み合わせて使います。それぞれの用途と読み取り方は以下の通りです。 stat fps – 現在のfpsとフレームタイム（ms）を簡易表示するコマンドです ( measuring performance - unreal art optimization )。ゲーム全体のパフォーマンスの目安になりますが、cpu/gpuのどちらが原因かまでは分かりません ( measuring performance - unreal art optimization )。まずfpsが目標を下回っている場合に、 stat unit で原因を掘り下げるという使い方になります。 stat unitgraph – stat unit と同じ情報（frame, game, draw, gpu時間）をリアルタイムグラフで表示するコマンドです ( measuring performance - unreal art optimization )。ゲーム中にカメラを動かしたりシーンを移動したりしながら実行すると、どのタイミングでフレーム時間が悪化するか（スパイクが出るか）視覚的に捉えやすいです ( measuring performance - unreal art optimization )。緩やかな負荷と比較して急激にframeが跳ね上がる場面があれば、その瞬間に重い処理（ヒッチ）が発生していることを意味します。 stat scenerendering – シーンレンダリング統計を表示します。描画関連の高レベルな情報が一覧でき、例えば現在の draw calls（描画呼び出し回数）や描画プリミティブ数（三角形数） 、ライティングやオクルージョンの状況などが分かります ( profiling & optimizing for the best performance in unreal engine )。また present 時間（cpuがgpu待ちする時間）などレンダリング全体の内訳も表示され ( unreal engine performance guide - amd gpuopen )、ボトルネックの概観を掴むのに役立ちます。「動的ライトがいくつあるか」「半透明オブジェクトの負荷」なども示されるため、レンダリングパイプラインのどこに負荷が集中しているかを特定する手がかりになります ( amd lança hoje patch especifico para unreal engine 4, seu calcanhar de aquiles, será que a partir de agora vai?????w | fórum outer space - o maior fórum de games do brasil )。例えば stat scenerendering で描画呼び出し（draws）が極端に多い場合は、オブジェクト数やマテリアル数の多さ（描画コール過多）がcpu負荷につながっている可能性があります。 stat gpu – gpu側の処理時間内訳 をテキスト表示するコマンドです ( measuring performance - unreal art optimization )。gpuが1フレーム内でどの処理に何msかけているか（例: ベースパス描画○ms、シャドウマップ○ms、ポストプロセス○ms など）を一覧できます ( measuring performance - unreal art optimization )。いわば簡易版の「gpuビジュアライザ」機能で、どの描画パスが特に重いかを数値で把握できます ( measuring performance - unreal art optimization )。gpuボトルネックが疑われる場合、この出力から どのレンダリングパスが支配的か を見極めます。例えば“translucency”にgpu時間を多く消費していれば半透明オブジェクトの描画負荷が高いことが分かります。なお、 stat gpu を使用するには一部の環境で r.gpustatsenabled 1 の設定が必要な場合があります ( amd lança hoje patch especifico para unreal engine 4, seu calcanhar de aquiles, será que a partir de agora vai?????w | fórum outer space - o maior fórum de games do brasil )。 stat rhi – rhi (rendering hardware interface)レベルの情報 を表示するコマンドです。現在使用中のレンダリングリソース（レンダータargetやテクスチャなど）のメモリ使用量やドライバの統計情報が得られます ( unreal engine performance guide - amd gpuopen )。例えば「render target memory」が表示する値から、gバッファやシャドウマップなどレンダーターゲットがどれくらいvramを消費しているか分かります。メモリ不足によるパフォーマンス低下や、vram使用率が異常に高くなっていないかを確認するのに有用です ( unreal engine performance guide - amd gpuopen )。 これらの統計コマンドを組み合わせることで、まず cpuとgpuのどちらにボトルネックがあるか把握し（stat unit） 、次に 問題の詳細を深掘り できます ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。 例えば「gpuがボトルネックだ」と判明したら stat gpu でどの描画処理に時間がかかっているか調べたり、「cpuのgameが重い」場合は stat game やunreal insightsでゲームコード中の重い関数を探す、といった流れです ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。 また stat scenerendering の情報（draw call数やライティング負荷など）は、シーンの設計レベルでの最適化ポイント（オブジェクト数削減やライト設定の見直し）を考える材料になります ( amd lança hoje patch especifico para unreal engine 4, seu calcanhar de aquiles, será que a partir de agora vai?????w | fórum outer space - o maior fórum de games do brasil )。 補足として、 stat startfile / stat stopfile コマンドで統計情報をログに記録し、session frontendやunreal insights で詳細解析する方法もあります（後述） ( profiling & optimizing for the best performance in unreal engine ) ( profiling & optimizing for the best performance in unreal engine )。 短時間の統計をファイル出力し、後からグラフ表示や詳細な関数単位の分析が可能です。 3. パッケージ化後の実行時におけるパフォーマンス計測と問題特定 エディタ上での計測だけでなく、実際に**パッケージ化したビルド（実行ファイル）上でパフォーマンスを測定することは非常に重要です。 理由として、エディタでは各種オーバーヘッドやエディタ専用処理があるため、実行性能やメモリ使用量が実ビルドと異なる場合があるからです。 実際、「エディタでの実行」と「パッケージ後の実行」ではメモリ使用量が大きく異なったり、ストリーミングによるスタッター（カクつき）の発生状況が変わる**ことがあります ( unreal engine game optimization on a budget - tom looman )。 そのため 最終的なパフォーマンス検証はパッケージビルドで行う のが望ましく、エディタ上で得た最適化策もパッケージ版で効果を確認する必要があります ( unreal engine game optimization on a budget - tom looman )。 パッケージビルド上で統計情報を確認する方法: 開発ビルドでのコンソール使用: パッケージ作成時にdevelopmentビルドまたはdebugビルドを選択すると、実行時にチートコマンドやコンソールが有効な状態でゲームを起動できます。その状態でゲーム中に~キー（または適宜設定したキー）でコンソールを開き、エディタ同様に stat unit や stat fps 等のコマンドを実行すれば、オンスクリーンにパフォーマンス指標を表示できます。これによりパッケージ後でもリアルタイムな計測が可能です。 ただしshippingビルド（出荷用ビルド）ではデフォルトでコンソールやstatコマンドが無効 になる点に注意が必要です ( how to profile shipping build? - unreal engine forums )（本番用ではチートが使えなくなるため）。最終的な製品ビルドではなくパフォーマンス解析が目的であれば、developmentビルドで実行するか、あるいは defaultengine.ini に一時的に設定を入れてコンソールを有効化するとよいでしょう。 統計ファイルの記録 ( stat startfile ): ゲーム実行中にコンソールから stat startfile コマンドを入力すると、そこから stat stopfile を実行するまでの間、詳細なパフォーマンス統計をファイルに記録できます ( profiling & optimizing for the best performance in unreal engine )。記録が終了すると、プロジェクトの saved/profiling/unrealstats/ フォルダに拡張子 .ue4stats のファイルが出力されます ( profiling & optimizing for the best performance in unreal engine )。このファイルをエディタの「 session frontend 」（ window → developer tools → session frontend ）で開くか、あるいは unreal insights ツールでロードすると、記録されたcpu・gpu各スレッドの詳細なプロファイルを解析できます ( profiling & optimizing for the best performance in unreal engine )。これによりパッケージ実行環境で発生しているボトルネックを後からじっくり分析可能です。unreal insightsはue4後期～ue5で導入された強力なプロファイリングツールで、スタンドアロン実行されたゲームにもアタッチしてトレースを取得できます（例えばコマンドライン引数に -trace=cpu,render,gpu 等を付与して起動し、insightsで接続）。パッケージ版で再生中の動作を記録しておけば、あとでエディタに戻って詳しくボトルネック原因を調査できるわけです。 ターゲットプラットフォーム固有のツール: 場合によっては、プラットフォーム固有のプロファイラも役立ちます。例えばモバイル向けにパッケージした場合はandroidの systrace やgpuベンダー提供のツール、コンソール機では各社の開発者ツールを用いてcpuやgpuの使用率、描画コール数、メモリ使用量などを計測する方法もあります。しかし一般的なpc環境であれば、前述のunreal engine標準のstatファイル＋insightsで十分詳細な情報が得られます。 パッケージ実行時の問題特定ポイント: エディタ実行との違いに注目しましょう。 例えばエディタでは問題なかったのにパッケージ後に 急にfpsが低下 する場合、エディタでは無効化されていたフルスクリーン独自の負荷や、ビルド設定によって有効になった機能（例: lumenのqualityレベル差異）などが影響している可能性があります。 また ロード時のカクつき はパッケージ時に顕在化しやすい問題です。 エディタではすでにロード済みだったアセットも、パッケージ環境ではディスクから読み込むため、ストリーミング負荷が直接体感されます。 このような ストレージやメモリ起因のボトルネック は ( unreal engine game optimization on a budget - tom looman )、統計ファイルをとって loadtimeやfile i/oイベントを解析 したり ( unreal engine game optimization on a budget - tom looman )、ログ出力（例えば log logcontentpolling や log logstreaming ）から診断できます。 特定のタイミングでframeが跳ね上がる場合、その前後で「どのファイルを読み込んでいたか」「gc（ガベージコレクション）は走っていないか」などを調べることで原因を突き止められます。 4. vr環境でのボトルネック特定と最適化ポイント vr（仮想現実）向けアプリケーションでは、 非常に高いフレームレート（90fpsや120fpsなど）と低遅延 が要求されるため、通常のゲーム以上にボトルネックの把握と最適化が重要です。 またhmd（ヘッドマウントディスプレイ）向けでは 両目分の描画 が必要で処理負荷が増える点にも注意する必要があります。 以下にvr特有のボトルネック診断法と最適化ポイントをまとめます。 ● ボトルネックの診断（cpu or gpu）: 基本的な手順は通常のケースと同じく、まず stat unit でcpuとgpuのどちらに余裕がないかを確認します ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。 vrでは特に gpu負荷がボトルネックになりやすい 傾向があります。 高解像度で両目分のレンダリングを行うため、ピクセル描画量が膨大になりがちだからです。 一方で、cpu側もvr固有のオーバーヘッド（例: 両目分の描画コール、トラッキングデバイスの更新など）はありますが、gpuに比べればボトルネックになるケースは少なめです。 いずれにせよ、game・draw・gpuの値を確認し、どれがフレーム時間を占有しているかで判断します。 もし gpu時間がframeと同程度 ならgpuボトルネック、 gameまたはdrawが長ければcpu側 のボトルネックです。 gpuがボトルネックの場合、 stat gpu でどのレンダリングパスが時間を食っているか詳しく確認します。vrでは ピクセル描画負荷 が高い（＝シェーダやポストプロセスが重い）か、 ジオメトリ描画負荷 が高い（＝描画物が多すぎる）かを切り分けることが大切です。ひとつの手法として、極端にレンダリング解像度を下げてみるというものがあります。例えば vr.pixeldensity 0.5 （もしくは r.screenpercentage で50%程度に解像度縮小）を一時的に適用すると、それまでgpuがピクセル処理に費やしていた時間が大幅に減少します。もしこの操作でフレームレートが大きく向上するなら、 ピクセルシェーダ/描画解像度寄りの負荷 がボトルネックだったことが示唆されます。一方、解像度を下げてもフレームレートがほとんど変わらない場合、 ジオメトリやcpu側の負荷 が支配的である可能性が高いです ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。このようにしてボトルネックの性質を掴んだ上で、次の最適化策を講じます。 ● vrパフォーマンス最適化の主なポイント: 描画コールの削減（instanced stereoやmulti-viewの活用）: vrでは左右2つの目のために同じシーンを2回描画する必要があります。標準のレンダリングでは描画コールも2倍になりますが、ueの instanced stereo（インスタンシングステレオ）機能を使うとcpuの描画処理を1回で両目分行えるため、レンダリングスレッドの負荷を大幅に減らせます ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。pc向けvrではプロジェクト設定の「engine > rendering > vr」内でinstanced stereoを有効にしましょう ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。モバイルvr（例: oculus quest）ではmobile multi-view という同様の最適化を利用できます ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。これらにより draw（レンダースレッド）時間の短縮 が期待できます。 固定フォービエイテッドレンダリング (ffr) の利用: oculus questなどスタンドアロンvrでは、視野の中心以外を低解像度でレンダリングする 固定フォービエイテッドレンダリング 機能があります。ueでは「dynamic fixed foveation」を有効にすることで利用可能です ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。これによりプレイヤーの視線の周辺部のピクセルを削減し、 gpuのピクセル描画負荷を軽減 できます。特にスタンドアロンvrデバイスではgpu性能が限られるため、品質と性能のバランスを取る有効な手段です。 レンダリングパイプラインの選択: vrでは フォワードレンダリング が推奨される場合があります。デフォルトの遅延レンダリングは多数の動的ライトやポストプロセスに強力ですが、vrにおいては解像度優先・動的ライト最小構成が多いためフォワードシェーディングの方が高速になる傾向があります ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。プロジェクト設定のレンダリング設定で forward shading を有効にし、アンチエイリアスも msaa を使用するとよいでしょう ( github - authortom/notes-on-vr-performance: how to optimise vr performance )（vrでデフォルトのtaaはブレやゴーストが目立つため画質的にもmsaaが適します）。フォワードレンダリング＋msaaにすることで描画の単純化と画質向上を両立できます。 描画負荷（オブジェクト数・ポリゴン数）の削減: できるだけ描画コール数を減らし、ポリゴン数も適切に抑えること が重要です。特にスタンドアロンvrでは描画コール数が100を超えると厳しいとも言われており、oculus quest 2では 1フレームあたり100未満 に抑えることが推奨されています ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。オクルージョンカリングやフラスタムカリングを駆使してカメラに映らないオブジェクトは描画しない、レベルストリーミングやlodを利用して距離に応じポリゴン数を減らす、といった施策が必要です。また nanite が利用可能な環境なら積極的に活用し、遠距離のポリゴン数を自動で圧縮するのも有効でしょう。実例として、quest 2クラスではシーン全体の三角形数を 75万～100万程度 に抑えるのが目安とされています ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。こうした目標値を参考に、自分のvrコンテンツがジオメトリ過多でないかチェックします。 ライティングとポストプロセスの最適化: 動的シャドウや複雑なポストプロセスはvrではできる限り控えます。可能な範囲でライティングはベイクしておき、 動的ライトの数を極力減らす （必要な場合も影の解像度やカスケード数を下げる）ことが望ましいです。またポストプロセス効果（ブルーム、被写界深度、モーションブラーなど）はvrでは効果が出にくいか酔いやすくなるため、 品質よりパフォーマンスを優先してオフにする 判断も重要です。これらの効果を削減すれば、その分gpuの余裕を確保できます ( measuring performance - unreal art optimization )。 vrプラットフォーム固有のツール : 実機でのボトルネック確認には、プラットフォーム提供ツールも活用しましょう。pc vrの場合、steamvrの frame timing グラフで「アプリケーション（ゲーム側）」「コンポジター（vr合成側）」のどちらが遅延しているか確認できます。またoculusデバイスでは ovr metrics tool でhmd上にcpu/gpuの利用率や熱状況を表示できます ( github - authortom/notes-on-vr-performance: how to optimise vr performance ) ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。こうしたツールとueの stat コマンドを併用し、どの部分に余裕がないかを継続的にモニタリングすると効果的です。 5. ハードウェア要因とそれぞれのボトルネック判別方法 パフォーマンスのボトルネックは大きく cpu 、 gpu 、 メモリ 、 ストレージ のどこに起因するかに分類できます。それぞれの典型的な症状と見分け方を整理します。 cpuボトルネック: cpu側（ゲームスレッドまたはレンダースレッド）がフレームレートの足を引っ張っている状態です。 stat unit で gameまたはdrawの値がframeと同程度 になっている場合はcpuボトルネックと判断できます ( profiling & optimizing for the best performance in unreal engine )。原因となるcpu処理として多いのは、 ゲームロジックの負荷（aiの思考や大量のイベント処理） 、 物理演算のコスト 、 アニメーション更新 、 オブジェクト数過多によるコリジョン判定負荷 などです ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。まずは stat game でゲームスレッド内訳を見たり、 stat physics で物理エンジンの更新時間を確認するなど、どのカテゴリに時間がかかっているかを突き止めます ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。ゲームスレッド自体が問題であれば、unreal insightsのcpuプロファイルや profilegame コマンドで数秒間の詳細な関数トレースを取得し、特定の関数（例えば毎フレーム重いtickを持つblueprintなど）を特定します ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。レンダースレッド（draw）が重い場合は、描画コール数やオクルージョン、バッチングの状況を見直します。 cpuボトルネックの対処 としては後述のようにコードの最適化（計算量削減や並列化）、不要なtickの削除、blueprintからc++への置き換え、描画コール削減などが有効です。 gpuボトルネック: gpuのレンダリング処理がフレームレートを制限している状態です。 stat unit で gpuの値がframeに近い 場合がこれに該当します ( profiling & optimizing for the best performance in unreal engine )。典型的な原因は、 シーンが複雑すぎる（ポリゴン数過多） 、 描画範囲が広大でピクセル数が多い 、 マテリアル/シェーダが複雑（オーバードローや重いエフェクト） 、 高解像度テクスチャやポストプロセスによる負荷 、 パーティクルなどのエフェクト過多 などです ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。 stat gpu やgpu profiler（ ctrl+shift+, で開くビジュアライザ）を使って、どの描画パスに時間がかかっているかを確認します。例えば basepass が大半を占めるならジオメトリ量が原因、 postprocessing が大きければポストエフェクトが原因、といった具合です。gpuボトルネック時は 画質設定を下げることで改善するか 試すのも有効です。もしテクスチャやライティング品質を下げたり解像度を落としてfpsが向上するようであれば、まさしくgpu負荷過多だったわけです。対処法としては後述のとおり描画負荷削減（ポリゴン数・描画コール数の削減）、シェーダ最適化、不要なエフェクトを切る、解像度や品質設定の見直しなどが効果的です。 メモリボトルネック: メインメモリ（ram）またはgpuメモリ（vram）が不足または帯域不足になっている状態です。メモリ自体が不足してフレームレートが常に低下するケースは稀ですが、 メモリ不足は断続的なスタッターやガベージコレクション起因のフレーム低下 となって現れます。例えば「一定時間ごとに一瞬カクつく」場合は、ヒープメモリ確保やgcが走っている可能性があります。 stat memory でメモリ使用量を監視したり、 memreport -full で詳細なメモリレポートを出力して、どのリソースがメモリを圧迫しているか調査します ( unreal engine game optimization on a budget - tom looman )。またgpuのvram不足も問題で、vramが満杯になるとテクスチャストリーミングが追いつかず画質低下やスワップが発生します。ログに「texture pool size exceeded」等の警告が出ていないか確認し、出ている場合は r.streaming.poolsize 拡大やテクスチャ縮小を検討します。 stat rhi で 現在のvram使用量 を把握できるので参考にします ( unreal engine performance guide - amd gpuopen )。メモリ関連のボトルネックは 直接fps低下というよりは不定期なヒッチ として表れることが多いため、症状に応じてプロファイルデータ中の memory や loading トレースをチェックすることが重要です ( unreal engine game optimization on a budget - tom looman )。 ストレージ（io）ボトルネック: 読み込みストレージ（hdd/ssd）の速度が原因で発生するボトルネックです。これもfpsが常時低いというより、 ロード時にフレームが止まる といった形で現れます。大量のアセットをストリーミング読み込みするオープンワールドなどでは、ディスクioが追いつかずフレームが一時的に停止するケースがあります。これを特定するにはunreal insightsで file トレースを有効にしておき、問題の起きたフレーム前後のファイル読み込みイベントを確認します ( unreal engine game optimization on a budget - tom looman )。またログに logstreaming をverbose以上で出力し、長時間かかっているロードがないか探すのも有効です。対策としては、あらかじめ必要なデータを読み込んでおく（ロード画面を設ける、 loadlevelstreaming を早めに仕掛ける）、ストリーミングするオブジェクト数を減らす、圧縮を減らして読み込み展開コストを下げる、といった方法があります。幸い近年はnvme ssdなど高速ストレージが普及し、ストレージ速度が描画のボトルネックになるケースは少なくなっています（標準的なssdならストレージは 滅多にボトルネックにはならない ）とも言われています ( how do you speed up unreal? - getting started & setup - epic developer community forums ) ( how do you speed up unreal? - getting started & setup - epic developer community forums )。しかし低速hdd環境や非常に大量のデータを扱う場合は無視できないため、必要に応じてストレージの性能改善（ssd化など）も検討しましょう。 6. 効果的な最適化手法 ボトルネックが特定できたら、それに対処するための最適化を行います。unreal engineで効果的な最適化手法には大きく エンジン設定の調整 、 アセット（コンテンツ）の最適化 、 コードやアルゴリズムの最適化 の3つがあります。それぞれ具体的な施策を以下に提案します。 エンジン設定・レンダリング設定の見直し: 不要な高負荷機能をオフにし、適切な品質設定に調整します。例えばue5であれば、重い lumen（全局照明）を無効化してスクリーンスペースgiに切り替える 、 ハードウェアレイトレーシングを使っていないならオフにする といった設定変更だけでも大幅に軽量化できます ( how do you speed up unreal? - getting started & setup - epic developer community forums )。また vsyncの無効化 （テスト時）、 スムースフレームレートの無効化 （エンジンが自動調整しないようにする）もプロファイリング時には重要です ( unreal engine game optimization on a budget - tom looman )。加えて シャドウ品質やポストプロセス品質を下げる こともgpu負荷軽減に直結します。必要以上に高い解像度のレンダリングやアンチエイリアス設定も見直しましょう。プロジェクト設定の スケーラビリティ 設定（epic/high/mediumなど）をターゲットハードに合わせて調整し、ターゲットfpsで動作する最低限の品質に留めることが安定したパフォーマンスに繋がります。 アセットの最適化（lod・ポリゴン・テクスチャ）: モデルやテクスチャなど美術アセット面での最適化です。 高ポリゴンモデルにはlod（レベルオブディテール）を設定 し、距離に応じてポリゴン数を減らします ( 10 tips for improving performance in unreal engine - leartes studios )。遠景に細密なモデルをそのまま描画すると無駄が大きいため、自動lod生成機能やsimplifierを用いてポリゴン数を削減します。また視界に入らないオブジェクトは ヒエラルキーlod（hlod）やインスタンシング でまとめることで、レンダリング負荷と描画コールを削減できます ( 10 tips for improving performance in unreal engine - leartes studios )。テクスチャについても、解像度が過剰に高いものは適切なサイズに落とすか圧縮設定を調整し、メモリと描画の帯域負荷を下げます。モバイルやvr向けであれば、使用しないmipmapはストリッピングするなどメモリ節約も効果的です。さらに、 不要な透明素材や過度なパーティクル はシーンから取り除くか簡略化します（透明オブジェクトは描画順序制御やオーバードローの関係で特に重いため、必要最低限に抑える）。 オブジェクト数と描画コール削減: cpu描画負荷を下げるために、 描画コール（draw calls）の数を減らす工夫 が必要です。大量の小オブジェクトがある場合、それぞれ個別に描画するのではなく メッシュを結合 してひとつにまとめることを検討します ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。動的に変更がない背景オブジェクト群は、dccツール側でひとつのスタティックメッシュに結合して配置すれば、1回のdraw callで描画可能になります ( understanding performance bottlenecks? - udk programming and unrealscript - epic developer community forums )。unreal engineは自動的に 同じマテリアルのメッシュをバッチング する仕組みがありますが ( github - authortom/notes-on-vr-performance: how to optimise vr performance )、それでもなお膨大な数のオブジェクトが存在すると限界があります。階層lod（hlod）システムを有効化すれば、距離に応じて建物などをまとめた簡易メッシュに置き換えることで描画コール数を減らせます。一方、動的に移動するオブジェクトが多数ある場合は インスタンシング や instanced static mesh コンポーネントを使うのも有効です ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。数十個～数百個の同種メッシュを個別のアクターで配置する代わりに、1つのアクターでインスタンス配列として保持すれば描画コールは飛躍的に減ります。 不可視オブジェクトのカリング: カメラに映らないオブジェクトを描画しない 工夫も重要です。エンジンはデフォルトでビューカリング（視錐台カリング）やオクルージョン（遮蔽）カリングを行いますが、レベルデザインによってはカメラ後方のオブジェクトまで存在している場合があります。必要に応じて cull distance volume を配置して遠距離の小オブジェクトを強制的に非表示にしたり、 primitivecomponent の mindrawdistance / maxdrawdistance を設定して距離で描画を切ることを検討します ( 10 tips for improving performance in unreal engine - leartes studios )。また、ポータルや遮蔽物を利用できるなら 手動のビューブロッカー を活用して、あるエリアでは別エリアのオブジェクトを描画しないといった仕組みもパフォーマンスに寄与します。 ライティングの最適化: ライティングは 静的照明の活用 が基本です。可能な限り 静的ライト や ベイクしたライトマップ を使い、 動的な影の数を削減 します ( 10 tips for improving performance in unreal engine - leartes studios )。動的ライティングが必要な場合でも、その影の解像度や更新頻度を下げてコストを抑えます。例えばプレイヤー周辺の限られたライトのみを可動ライトにし、他は静的にする、影を落とすオブジェクトを限定する、といった調整です。また 距離によるシャドウのフェードアウト （シャドウカスケードの遠距離フェード）も利用しましょう。加えて 反射 も計算コストが高いため、必要に応じてplanar reflectionの解像度を下げたり、skylightの更新をリアルタイムではなく静的にするなどしてチューニングします。ライティングビルドをしっかり行い、 lightmap uvや解像度の最適化 もメモリ・描画負荷の軽減に繋がります。 ポストプロセス効果の削減: ポストプロセッシングは視覚効果向上に有用ですが、過剰に使うとgpu負荷が大きくなります。被写界深度やモーションブラー、ブルーム、レンズフレア、スクリーンスペース反射(ssr)、アンビエントオクルージョン(ssao)など、 シーンに大きな影響を与えない効果は思い切ってオフにする ことも検討しましょう ( 10 tips for improving performance in unreal engine - leartes studios )。特にvrや性能ギリギリの環境では、ポスト効果を切るだけで数ms節約できる場合があります。どうしても必要な効果についてもクオリティ設定を落とす（例: ssrを低品質にする、モーションブラーのサンプル数を減らす）ことで性能を稼げます。 blueprintとコードの最適化: ゲームのロジック部分での最適化です。 毎フレーム実行される不要な処理を削除・抑制 するのが第一です。多数のアクターでtickイベントを使っているなら、本当にtickが必要か見直し、必要な場合も更新頻度を下げられないか検討します（例えば「毎フレームではなく0.1秒おき実行」等タイマーに置き換える）。blueprintの実行はc++に比べてオーバーヘッドがあるため、 頻繁に呼ばれるblueprintロジックはc++化 （またはブループリントナティファイ（nativization））するのも有効です ( 10 tips for improving performance in unreal engine - leartes studios )。特に算術計算やループ処理など負荷の高い部分はc++で書き直すと劇的に軽くなる場合があります。またueには マルチスレッドタスク （asynctaskや並列フォーイーチなど）を活用できる場面も多いので、ゲームスレッド一本で処理していたものを非同期処理に分散することも検討します。さらに、物理演算やコリジョン判定もチューニング可能です。剛体オブジェクト数を減らしたり衝突判定の頻度を下げる、collisionチャンネルを細かく設定して無駄な衝突チェックをしないようにする、などの工夫でcpu負荷を下げられます。アニメーションでは、必要のない骨はupdateしない設定（masterposecomponentの利用やupdate rate optimizations）を使う、複雑なスケルタルメッシュは画面外でtickしないようにする、といった最適化があります。 その他の最適化テクニック: 上記以外にも様々なテクニックがあります。例えば シグニフィカンスマネージャ を導入して視界外や遠距離のアクターの更新を自動スローダウンする、広大なマップでは レベルストリーミング でエリアごとに区切って必要な部分だけ読み込む ( 10 tips for improving performance in unreal engine - leartes studios )、圧縮技術（oodleなど）でロード時間を短縮する、エフェクト用のパーティクルはlodやカリング距離を設定する ( 10 tips for improving performance in unreal engine - leartes studios )、など挙げれば切りがありません。重要なのは、 プロファイリングで得られたデータに基づいてボトルネックに直結する部分から優先的に手を入れる ことです。一通り最適化を施したら再度プロファイルを取り、効果を検証します ( github - authortom/notes-on-vr-performance: how to optimise vr performance )。この計測→改善→検証のサイクルを繰り返し、小さな積み重ねでパフォーマンスを目標値まで引き上げていくことが肝要です。 以上、ue5における stat unit の読み取り方から始まり、関連統計コマンドの活用、ビルド後の計測方法、vr特有の留意点、ハードウェア別の診断と最適化手法について詳しく解説しました。 ボトルネックを正しく特定し、適切な対策を講じることで、フレームレートの向上と安定化が図れるでしょう。 ゲームの規模やターゲットプラットフォームに応じて最適な手法を選び、快適な体験を提供できるよう最適化を進めてください。 各種ツール（unreal insights等）や統計コマンドを駆使して分析を行い、ボトルネックに対処することが、ue5で高性能なコンテンツを制作する鍵となります。 参考資料: epic games 公式ドキュメントおよびコミュニティフォーラム、unreal engineパフォーマンスガイド ( unreal engine performance guide - amd gpuopen ) ( unreal engine performance guide - amd gpuopen )、有志による技術ブログ記事 ( measuring performance - unreal art optimization ) ( amd lança hoje patch especifico para unreal engine 4, seu calcanhar de aquiles, será que a partir de agora vai?????w | fórum outer space - o maior fórum de games do brasil )など."
  },
  {
    "title": "AmazonでおなじみのELPのUSBカメラ：Ubuntuにてカメラ設定を変更するコマンド一覧",
    "url": "/blog/amazon-elp-usb-ubuntu/",
    "description": "",
    "tags": [
      "その他"
    ],
    "date": "2024年8月18日21時8分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ubuntu のカーネル・v4l2・udev の挙動は版により変わります。カメラが認識しない場合はリリースノートとドライバ情報を確認してください。 uvc カメラの解像度・フレームレート・同期方式は機種依存です。ベンダー仕様と v4l2-ctl 等での実測を併用してください。 記事は特定の elp モデル前提です。別型番では pid/vid や対応フォーマットが異なる場合があります。 elpのusbカメラ。実にたくさん所有しています。安くてきちんと動作する良きusbカメラです。 raspberry pi 5でubuntu24.04で接続しました。v4l-utilsでカメラを操作するときのメモです。まずelpのusbカメラの認識を確認します。elpはusb接続のいわゆる中華カメラです。amazonなどで販売されています。 種類によって項目はそれぞれ若干ことなりますが、おおむね大体似たような項目になっていると思います。露出オートやマニュアルの切り替え、明るさやホワイトバランスなどubuntuのターミナルからの操作方法となります。elpというよりv4l-utilsの操作ですね。 elpのusbカメラメーカサイト https://www.webcamerausb.com/ lsusb bus 002 device 002: id 05a3:9230 arc international camera bus 004 device 002: id 32e4:9230 hd usb camera hd usb camera v4l-utilsをインストールします。 sudo apt install v4l-utils list-devicesで接続されているカメラを確認します。 v4l2-ctl --list-devices usb 2.0 camera: hd usb camera (usb-xhci-hcd.0-2): /dev/video2 hd usb camera: hd usb camera (usb-xhci-hcd.1-1): /dev/video0 /dev/video0などの情報からカメラのフォーマットを確認します。 v4l2-ctl --device=/dev/video0 --list-formats-ext ioctl: vidioc_enum_fmt type: video capture [0]: 'mjpg' (motion-jpeg, compressed) size: discrete 1920x1080 interval: discrete 0.033s (30.000 fps) size: discrete 1280x720 interval: discrete 0.017s (60.000 fps) size: discrete 1024x768 interval: discrete 0.033s (30.000 fps) size: discrete 640x480 interval: discrete 0.008s (120.101 fps) size: discrete 800x600 interval: discrete 0.017s (60.000 fps) size: discrete 1280x1024 interval: discrete 0.033s (30.000 fps) size: discrete 320x240 interval: discrete 0.008s (120.101 fps) [1]: 'yuyv' (yuyv 4:2:2) size: discrete 1920x1080 interval: discrete 0.167s (6.000 fps) size: discrete 1280x720 interval: discrete 0.111s (9.000 fps) size: discrete 1024x768 interval: discrete 0.167s (6.000 fps) size: discrete 640x480 interval: discrete 0.033s (30.000 fps) size: discrete 800x600 interval: discrete 0.050s (20.000 fps) size: discrete 1280x1024 interval: discrete 0.167s (6.000 fps) size: discrete 320x240 interval: discrete 0.033s (30.000 fps) 次はカメラのユーザーコントロールこと設定情報を調べてみます。 v4l2-ctl --device=/dev/video2 --list-ctrls user controls brightness 0x00980900 (int) : min=-64 max=64 step=1 default=0 value=0 contrast 0x00980901 (int) : min=0 max=64 step=1 default=32 value=32 saturation 0x00980902 (int) : min=0 max=128 step=1 default=60 value=60 hue 0x00980903 (int) : min=-40 max=40 step=1 default=0 value=0 white_balance_automatic 0x0098090c (bool) : default=1 value=0 gamma 0x00980910 (int) : min=72 max=500 step=1 default=100 value=100 gain 0x00980913 (int) : min=0 max=100 step=1 default=0 value=0 power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1 (50 hz) white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=1 default=4600 value=4500 sharpness 0x0098091b (int) : min=0 max=6 step=1 default=2 value=2 backlight_compensation 0x0098091c (int) : min=0 max=2 step=1 default=1 value=1 camera controls auto_exposure 0x009a0901 (menu) : min=0 max=3 default=3 value=1 (manual mode) exposure_time_absolute 0x009a0902 (int) : min=1 max=5000 step=1 default=157 value=100 exposure_dynamic_framerate 0x009a0903 (bool) : default=0 value=0 上記の設定情報について解説とそれぞれの設定変更コマンドを掲載します。これは実行するとその設定値が保存されます。初期設定に戻すのはマニュアルで戻す必要があります。 brightness (輝度)：min=-64, max=64, step=1 輝度を調整します。値を増減させることで映像の明るさが変わります。 v4l2-ctl --device=/dev/video0 --set-ctrl=brightness=0 contrast (コントラスト)：min=0, max=64, step=1 コントラストを調整します。値を高くすると、明暗の差がはっきりします。 v4l2-ctl --device=/dev/video0 --set-ctrl=contrast=32 saturation (彩度)：min=0, max=128, step=1 色の鮮やかさを調整します。値を高くすると、色がより鮮明になります。 v4l2-ctl --device=/dev/video0 --set-ctrl=saturation=60 hue (色相)：min=-40, max=40, step=1 色相を調整します。値を変更すると、色合いが変わります。 v4l2-ctl --device=/dev/video0 --set-ctrl=hue=0 white_balance_automatic (自動ホワイトバランス) オン (1) またはオフ (0) を選択できます。オンの場合、カメラが自動的に色温度を調整します。 v4l2-ctl --device=/dev/video0 --set-ctrl=white_balance_automatic=1 gamma (ガンマ)：min=72, max=500, step=1 ガンマ値を調整して、中間色の明るさを制御します。 v4l2-ctl --device=/dev/video0 --set-ctrl=gamma=100 gain (ゲイン)：min=0, max=100, step=1 映像のゲイン（感度）を調整します。値を高くすると、暗い環境での視認性が向上しますが、ノイズが増える可能性があります。 v4l2-ctl --device=/dev/video0 --set-ctrl=gain=0 power_line_frequency (電源周波数) 選択肢: 0 (オフ), 1 (50 hz), 2 (60 hz) 電源周波数によるフリッカー（ちらつき）を防ぎます。 v4l2-ctl --device=/dev/video0 --set-ctrl=power_line_frequency=1 white_balance_temperature (ホワイトバランス温度)：min=2800, max=6500, step=1 色温度を手動で調整します。値を変えることで、色味が変わります。 v4l2-ctl --device=/dev/video0 --set-ctrl=white_balance_temperature=5000 sharpness (鋭さ)：min=0, max=6, step=1 映像のエッジの鋭さを調整します。 v4l2-ctl --device=/dev/video0 --set-ctrl=sharpness=3 backlight_compensation (バックライト補正)：min=0, max=2, step=1 逆光時の映像を改善するための設定です。 v4l2-ctl --device=/dev/video0 --set-ctrl=backlight_compensation=2 camera controls：auto_exposure (自動露出) 1がマニュアル、3がオート 露出モードを選択します。マニュアルモードでは露出時間を自分で設定できます。 v4l2-ctl --device=/dev/video0 --set-ctrl=auto_exposure=1 exposure_time_absolute (露出時間)：min=1, max=5000, step=1 マニュアル露出モード時に露出時間をミリ秒単位で設定します。露出オート時には無効です。 v4l2-ctl --device=/dev/video0 --set-ctrl=exposure_time_absolute=1 exposure_dynamic_framerate (露出によるフレームレート調整) bool型で、オン (1) またはオフ (0) 露出時間に基づいてフレームレートが動的に調整されるかどうかを設定します。 v4l2-ctl --device=/dev/video0 --set-ctrl=exposure_dynamic_framerate=1"
  },
  {
    "title": "朝までしっかり寝れた：エアコンの動作音がうるさくて寝れない。そんな時はシリコン粘土みたいな耳栓macksのearplugで騒音を低減できた",
    "url": "/blog/nerenai-eakon-urusai-mimisen/",
    "description": "",
    "tags": [
      "後悔したもの"
    ],
    "date": "2024年8月16日16時15分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 イヤホン・ケーブルの型番・販売終了・代替品はメーカー方針で変わります。仕様表は公式の最新情報を確認してください。 エアコンの電源周波数ノイズ対策は設置環境と配線経路に依存します。記事の対策はあくまで一例です。 聴感の評価は再生機器と聴力に依存します。医療的な聴覚の問題は専門家に相談してください。 最近の夏は熱帯夜が続いております。**2～3年前に花粉症の関係からエアコンにシャープairest（エアレスト）を購入しました。**空気清浄機能とカビが生えにくい特徴がある機種です。2～3年前たってもカビが生えず素晴らしいエアコンです。花粉の時期も症状が軽減されました。 しかしairestの動作音が馬鹿でかいのです。 静音モードで普通の家庭用エアコンぐらいの音です。 最大にするとテレビも聞こえないぐらいの音量です。 「**ギュオーンゴーゴーゴーッゴゴゴゴゴゴ」ぐらいの勢いです。 **夏は熱帯夜が続いておりますので、airestをつけっぱに寝れません。 消すと暑くて寝れません。 寝れない日々が続いています。 いわゆる寝フォンとしてanker soundcore liberty 4を使っています。ノイズキャンセルを使うことで、エアコンの音が気にならなくなります。でも横を向いたりすると枕にあたって尋常ではありません。つけたままでは、寝れません。 同じankerからsoundcore sleepという睡眠用のイヤフォンも発売されています。 薄いイヤフォンで寝たときに横を向いても違和感がでない設計だそうです。 よくよく調べるとノイズキャンセルは非搭載でホワイトノイズ音を出すことで、睡眠用として動作しているようです。 それじゃ耳栓と同じでは？という思いから購入をしませんでした。 過去に通常の耳栓や、イヤフォン機能がないイヤフォンっぽい耳栓など購入したことがあります。いずれも気になって寝れなかったり、イヤフォンっぽい耳栓は朝になると取れていたり、上手くいったことがありませんでした。 シリコン粘土みたいな耳栓macksのearplug そこでmacksのearplugを見つけました。シリコン粘土タイプのもです。購入して使ってみると、今までで一番よい結果でした。 macksのearplugのメーカ説明を見てみましょう。 https://www.macksearplugs.com/product-category/earplugs-for-sleeping/ 「アメリカのベストセラーで医師も勧める最高の耳栓ブランドです。 mack's社は1962年以来、高品質で革新的な聴覚保護、睡眠補助、スイミング用耳の保護製品を可能な限り最高の価値でお届けするよう努力しています。 ミュージックシーンはもちろん、睡眠、水泳、シャワー、学習、旅行、騒音、飛行機での不快感などの対策にご利用下さい。 交換時期は、耳栓が汚れてきて粘着力がなくなるまで使えますが、**最高5回程度が目安です。 **」とのこと。 昔から定番の耳栓のようです。 **たった５回しか使えません。 ** 1ケース12個6セットですが、一カ月分ということです。600円から1000円程度なので安いとみるかどうか。**1個を半分にちぎっても使えます。そうすれば2倍です。**まるまる1個を1つの耳につかったほうが清音性は高い印象でした。 見たまま柔らかいシリコンです。まるくして耳の穴をカバーする感じです。 noise reduction rating (nrr) – 22 decibels この耳栓ですが、装着すると-22デシベルだそうです。nrrとはnoise reduction ratingのことで騒音減衰率だそうです。デシベルは、音の強さを表す単位で、騒音の目安として以下のように分類できます。 0 db: 最小限に聞こえる音（人間の聴覚の限界） 10 db: 風のささやき、非常に静かな音 20 db: 木の葉が触れ合う音、極めて静かな室内 30 db: 図書館、ささやき声、非常に静かな環境 40 db: 静かな住宅の内部、落ち着いたオフィス 50 db: 静かな会話、一般的なオフィスの背景音 60 db: 通常の会話、エアコンの通常運転 70 db: 車の通行音、掃除機、うるさいエアコン macksのearplugで完全に無音になるわけではなく、-22デシベルだから「60 db: 通常の会話、エアコンの通常運転」の音が、**「30 db: 図書館、ささやき声、非常に静かな環境～40 db: 静かな住宅の内部、落ち着いたオフィス」**ぐらいになるということです。 macksのearplugを装着すると、エアコン音は聞こえるもののうるさく無いレベルになります。「 ギュオーンゴーゴーゴーッゴゴゴゴゴゴ」から、「コーーーーーーーーーー」になります。騒音からホワイトノイズぐらいのレベルになりました。 「コーーーーーーーーーー」ぐらいのエアコンの音は、ほぼ無音になります。 実際に装着して寝てみたら朝まで気にならずにグッスリ眠れました。 実際に装着して寝てみたら朝まで気にならずにグッスリ眠れました。人によっては、合わない人もいるようです。amazonのレビューの★1や2の投稿を見ると主に次のようなコメントがあります。 ①防音性が足りない云々。 -22デシベルだから近くで話かけられたりすれば聞こえるし、エアコンの音も無音になるわけではないので、静穏性が足りないと感じる人もいるようです。装着に失敗している可能性もありますが音がゼロになるわけではないのです。 ②ぼろぼろになる。柔らかく気になる云々。 最大で5回しか使えないのです。劣化しやすくゴミが付きやすいのです。使い捨て消耗品です。一カ月つかっているという猛者もいました。長く使えばボロボロに。すぐ汚い感じになります。 ③装着するとき鼓膜が空気で圧迫されて嫌 装着するときに密閉されます。そして耳の中に収めようとすると圧迫されます。急いで耳に入れると鼓膜が痛くなります。ゆっくりモミモミと耳につければ問題ありませんが、苦手な人がいることも確かだと思います。 ④蒸れる 耳の穴がふさがれるので蒸れる人は蒸れます。外したあとの解放感は確かにあります。 使用1日目、自分で使ったものだから気持ち悪くないけど、人のだったらとても気持ち悪い感じ。 どれも確かに感じるマイナス点ですが、他の耳栓のように寝ている間に取れないし、横になっても違和感が少ないし、確実に静かになったので良い睡眠アイテムでした。お試しあれ！ 追記：使用２日目 2日目も快適に使うぞ！と就寝しましたが。音が聞こえることと、耳への装着感と、ベトベトすることが気になって寝れませんでした。結局、外して寝ましたとさ。不眠は別の要素かもしれませんね。 追記：使用1週間 つけていると睡眠が深くなることは確かです。良く寝れる。しかし蒸れて耳の中が痒くなり、よる起きてしまうこともあります。 追記：数カ月後 結局、耳に入れていると気になって寝れず、使わなくなりましたとさ。購入するほどのものではないですね。"
  },
  {
    "title": "Raspberry Pi 5でRTMP配信、HVECやハードウェアエンコードできないなんて、、、どうしたものだろうか。",
    "url": "/blog/raspberry-pi-5-rtmp/",
    "description": "",
    "tags": [
      "gstreamer",
      "Raspberry Pi 5",
      "後悔したもの"
    ],
    "date": "2024年8月15日22時2分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 raspberry pi os・ffmpeg などの版とパッケージ構成は変わりやすいです。公式リリースノートと推奨ビルド手順で確認してください。 rtmp 配信は配信先サービスの仕様変更の影響を受けます。エンドポイント・認証・非推奨化の有無を最新ドキュメントで確認してください。 発熱と電源要求は世代とケースで異なります。長時間配信時は温度と電流容量を実測で確認してください。 raspberry pi 5でusbカメラを接続してエンコードして配信テストします。 **実はraspberry pi 5はハードウェアエンコードが無くなりました。 **ソフトウェアエンコードしかできないため高負荷なhvec（h265）の対応も厳しいです。 これはきつい。 raspberry pi 4の方がハードウェアエンコードがあるため低負荷で動画を配信できます。 raspberry pi 5は高いし、発熱するし、ハードウェアエンコードないし。 。 。 。 まあraspberry pi 4のハードウェアエンコードは性能が低く画質が綺麗ではないため、raspberry pi 5でソフトウェアエンコードしたほうが画質は良好です。 またcpuパワーが増しているので、ソフトウェアエンコードを使えばいいよね！という話ですが、まあ実際にraspberry pi 5でrtmp配信してみます。 osはubuntu24.04です。 usbカメラを接続 usbカメラを接続しました。認識しているかコマンドで確認します。 lsusb bus 002 device 003: id 32e4:9230 hd usb camera hd usb cameraとカメラを認識しました。カメラのドライバー的なv4l-utilsをインストールします。 sudo apt install v4l-utils カメラデバイスとして認識したか確認します。 ls /dev/video* 次のようにビデオがたくさん表示されましたが、video0があるので認識しました。 /dev/video0 /dev/video22～～～/dev/video27 /dev/video32～～/dev/video37 video0のフォーマットを確認してみます。 v4l2-ctl --list-formats-ext --device /dev/video0 mjpgで1920×1080で30fpsが上限であることが分かりました。 [0]: 'mjpg' (motion-jpeg, compressed) size: discrete 1920x1080 interval: discrete 0.033s (30.000 fps) size: discrete 1280x720 interval: discrete 0.017s (60.000 fps) size: discrete 1024x768 interval: discrete 0.033s (30.000 fps) size: discrete 640x480 interval: discrete 0.008s (120.101 fps) size: discrete 800x600 interval: discrete 0.017s (60.000 fps) size: discrete 1280x1024 interval: discrete 0.033s (30.000 fps) size: discrete 320x240 ffmpegでも良いですが、gstreamerをインストールします。主要以外のバージョンも適当に入れます。これだけ入れておけば、大体の機能が動くでしょう。 sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly 動くか確認します。以下コマンドで画像が出てきました。 gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink youtubeへrtmp送信します。mjpgを使うことで滑らかになります。配信urlは適宜差し替えてください。*************でマスクしています。h264をcpu処理するしかないです。 gst-launch-1.0 -e v4l2src device=/dev/video0 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegparse ! jpegdec ! videoconvert ! x264enc bitrate=2500 speed-preset=veryfast tune=zerolatency ! h264parse ! flvmux streamable=true name=mux ! rtmpsink location='rtmp://a.rtmp.youtube.com/live2/************* live=1' audiotestsrc wave=sine freq=440 ! audioconvert ! voaacenc bitrate=128000 ! mux. cpu負荷率50%ぐらいでrtmp配信できました。60分続けても問題ありませんでした。raspberry pi 5は、どうも中途半端です。"
  },
  {
    "title": "Raspberry Pi 5を密閉された防水ケースに入れて、CPU負荷を100％にして温度上昇を調べてみた。Raspberry Pi 5はかなり熱くなるなぁ",
    "url": "/blog/raspberry-pi-5-bousui-case/",
    "description": "",
    "tags": [
      "Raspberry Pi 5",
      "作ったもの",
      "後悔したもの"
    ],
    "date": "2024年8月15日10時55分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 防水ケースの型番・公称規格（ip 等）はメーカー表記と取り付け条件に依存します。購入ページの仕様とレビューを改めて確認してください。 raspberry pi 5 の発熱と端子配置は公式ボードと筐体設計で干渉しやすいです。実物でのクリアランスを確認してください。 筐体メーカーの互換表は更新されます。対応モデル名は最新の互換リストで照合してください。 raspberry pi 5を購入しました。実のところ購入するつもりはありませんでした。なぜならいわゆるミニpcの方が、より快適にパワフルに動くからです。 機種によりますがlanコネクタもusbコネクタも多いです、価格も2～5万ぐらいで適当なものがあります。 例えばintel n100です。raspberry pi 5に必要な周辺機器をそろえると価格もあまり変わりません。単純な比較を見るとintel n100はraspberry pi 5より2倍ぐらい高性能です。限られた用途で無い限りわざわざraspberry pi 5を購入する意味がありません。ミニpcの方が便利です。 raspberry pi 5 vs intel n100 図の引用元 https://www.cnx-software.com/2024/04/29/raspberry-pi-5-intel-n100-mini-pc-comparison-features-benchmarks-price/ 今回は限られた用途のために、raspberry pi 5を使うことにしました。 gpioピンを使いたいとか、低消費電力に抑えたいとか、そういった理由です。 ミニパソコンchuwi larkbox x amd ryzen 3750uを使って環境を構築していたのですが、密閉したboxに入れたところ内部の温度が100°に到達しました。 これはダメだとraspberry pi 5です。 raspberry pi 5の詳しいレビューはメディアのレビュー参考です。 raspberry pi 5 hothotレビュー https://pc.watch.impress.co.jp/docs/column/hothot/1584619.html 本記事後半では密閉された防水boxに入れて、raspberry pi 5にcpu100負荷をかけて、内外の温度とcpu温度の上昇を調べました。果たしていかに！！ raspberry pi 5の概観とセットアップ さて実際のraspberry pi 5を見てみます。raspberry pi 4から久しぶりのraspberryです。基盤とか全体の作りこみが良くなった印象です。洗練された感じです。 カメラのリボンコネクタが2つになり、２つのカメラが使えるとか。用途によっては面白そうですね。 lanの後ろにあるのが、システムファン用のコネクタだとか。 電源用typecコネクタ raspberry pi 5はraspberry pi 4より発熱するようなので、評価の良いアルミケース付きを購入しました。ずっしり重量感があり良いケースです。これをファンレスで使うタイプもあるようですが、ファン付きにしました。さらに安心です。 主要のチップに熱伝導シートを配置します。 システムファンを接続します。 それぞれ位置を合わせてケースを閉じるだけです。 がっちりアルミケースです。内部に静かなファンもあり良いケースでした。 定番のインストーラを使います。 raspberry pi 5を選択します。 raspberry pi osより、いつもubuntuを使っていますのでubuntuを入れます。raspberry pi osの方が不具合は少ないだろうけど、とりあえずubuntuを。 ちょうど1tbのssdが余っていましたので、そちらにインストールしました。 raspberry pi 5からusb3.0にusbストレージを接続するだけで、そこからbootできるようです。簡単で素晴らしいですね。 適当な周辺機器を接続してセットアップします。 よくわかりませんがインストールが、まったく進みません。ネット接続を解除したら進みました。その後もちょくちょく停止します。困ったものです。 うまくインストールが進まず。。電源が原因か usb電力を5v3aしか準備できず、raspberry pi 5は5v5a必要です。 30w出力できるpd電源アダプターを使っても、5vに関しては3aのみの出力製品がほとんどです。 ankerなどもすべてそのような仕様です。 なので、ちょっと電源不足なのかもしれません。 **ということでamazonで専用の5v5a電源アダプターを購入しました。 ** インストール時には、電源スイッチを押すことで警告を無視して5v3aでもインストールを進めることができます。でもとても不安定になるようで、専用アダプターの購入は必須でしょう。 とりあえず動作させてゆきます。まず基本的なアップデートです。アップデートとても時間がかかりました。1～2時間ぐらい？でしょうか。 sudo apt update sudo apt upgrade ssh接続で設定作業したほうが楽なので、openssh-serverを入れようとしたところエラーがでました。コンフィグが壊れているとかで、以下コマンドを入れて修復しました。そのあとにsshをインストールしました。 sudo dpkg --configure -a sudo apt --fix-broken install sudo apt install openssh-server ufwでsshのポートを開けます。ついでに固定ipにしました。 sudo ufw allow 22 今回は温度を調べておきたいので、現状の温度を表示してみましょう。どうやらcpuぐらいしかわからないようです。小型のシステムなのでcpuの温度をシステム全体として見てもよいでしょう。 sudoを使わずに表示するには以下です。ミリ度（ミリセルシウス）で表されるため、正しい温度（セルシウス度）を得るには、得られた値を1000で割る必要があります。44.1°でした。 cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000 \"°c\"}' cpuに負荷をかけるツールをインストールします。 sudo apt-get install stress cpu４つに対して、600秒間の負荷をかけ続けてみます。 stress --cpu 4 --timeout 600 きちんとcpuに負荷がかかっています。 1分ぐらいで40°から60°に上がりました。raspberry pi 5の温度に関して調べてみるとcpuは85°でサーマルスロットリング（熱による性能制限）が発生するようです。 raspberry pi 5レビュー記事参考 https://www.switch-science.com/blogs/magazine/raspberry-pi-5-review 85°がraspberry pi 5の上限といってもよいでしょう。寿命などを考えると70°ぐらいでしょうか。15分ぐらいcpuの負荷をかけ続けると73°です。まだ温度上昇が止まりません。もっと続けてみましょう。 70°が続くとケースは、長く触っているとヤケドするほどの温度です。とてもあつい。30分ほど続けると80°前後で上昇が止まりました。室内の温度は28°ぐらいです。密閉空間になければ、有用なケースであることが分かりました。もう少し冷やしたいところではありますが。 アルミヒートシンク、防水ケース、acアダプタ5v5a購入 密閉空間の場合の温度上昇を調べたくて防水ボックスを購入しました。安いけどよくできているboxです。ac電源ぐらいの太さでもアチコチからケーブルの外に引き回せます。 アルミの大型のヒートシンクも流用します。 5v5aのacアダプタ、わざわざ購入しないといけない電源アダプター。2000円ぐらいします。こういった周辺機器が必要なことがラズパイ5の残念なところ。 セットアップ＆密閉 念のためcpuの設定がフルパワーになっているか確認します。catを実行したところ4コアすべてperformanceです。 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor performance performance performance performance 防水ケース＆cpu負荷100％にて5秒ごとに温度を更新 ストレスをかけて5秒ごとに温度を更新します。ケースの外と内には温度計を設置して温度を取得します。 stress --cpu 4 --timeout 6000 watch -n 5 \"cat /sys/class/thermal/thermal_zone0/temp | awk '{print \\$1/1000 \\\"°c\\\"}'\" スタート30分：ケース外気温26°、ケース内温度30°、cpu温度68° スタート50分：ケース外気温27°、ケース内温度31°、cpu温度72° スタート70分：ケース外気温27°、ケース内温度32°、cpu温度74° スタート90分：ケース外気温27°、ケース内温度33°、cpu温度74° 74°で温度上昇が安定してきました。ケース内温度はまだまだ上がっています。サーマルスロットルリングが発生しているようにも見えません。大型のアルミフィンを一緒に入れたのがよかったのかもしれません。 スタート110分：ケース外気温27°、ケース内温度33°、cpu温度75° とこの辺りで終了にします。 以上から密閉にしてもある程度は大丈夫であることが分かりました。システムとしての寿命には問題はありそうですが、まあ常時cpu負荷率100％は通常ならんですし、まあ良いとします。 防水ケースもプラではなく、ステンレスのケースなどを選んだほうがよいのかもしれませんが、とりあえずはすぐに熱暴走するほどではないことが分かりました。もっと冷却は改善したほうがよいでしょう。raspberry pi 5はかなり熱くなるなぁ。 数カ月後 作ったときは良い買い物をした気がしまたが、けっきょく使わなくなりました。発熱＆消費電力を抑えたいときはラズパイ4を使っていますし、パワーが欲しいときはミニpcを使っています。ラズパイ5はいらなかったなぁ。。。ラズパイ5を使わなければ、防水ケースとかもシンプルで十分だろうし。"
  },
  {
    "title": "ChatGPTで生成したイラスト（サラリーマン）をCharacter Creator 4でフルCG化してみた",
    "url": "/blog/chatgpt-3dcgmodel/",
    "description": "Character Creator 4を使ってAIで作成したサラリーマンから3Dモデルを作成してみます。ChatGPTでサラリーマンを作成しました。これを3Dモデルにしてみましょう。Character Creator 4 (CC4) は、Reallusion が開発した3Dキャラクター作成ソフトウェアです。iClone 8と一緒に利用するソフトウェアです。",
    "tags": [
      "作ったもの"
    ],
    "date": "2024年8月13日21時49分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 chatgpt 等の生成モデルは版により出力形式・利用規約・課金体系が変わります。商用利用や学習データ方針は最新 tos を確認してください。 生成された 3d 手順やスクリプトは検証なしでは実行しないでください。ツールの版と前提がずれると壊れたデータになることがあります。 外部サービスへの入力データには機密を含めない運用を推奨します。 character creator 4を使ってaiで作成したサラリーマンから3dモデルを作成してみます。 chatgptでサラリーマンを作成しました。 これを3dモデルにしてみましょう。 character creator 4 (cc4) は、reallusion が開発した3dキャラクター作成ソフトウェアです。 iclone 8と一緒に利用するソフトウェアです。 chatgptでサラリーマンの画像を生成しました。 chatgptでは、顔の片側に影が発生しがちで消えません。顔の影があると3dモデルの顔も黒くなってしますので、フォトショップで合成して影を消します。 headshot v2を使います。これも当然ですが有料のプラグインです。200ドルだったか忘れてしまいました。写真から3dモデルを作ることができます。reallusion のソフトウェアであるcharacter creator 4 は、iclone 8同様で、何をするにも追加のプラグインで課金が必要になります。 写真をドロップします。あとは適当に設定します。 しばらく計算が入ります。 はい3dモデルが完成しました。まあまあ似ていますよね。 近い雰囲気の髪の毛を装着します。ああ。。これも有料です。100ドルだったかいくらだったか？ひげも装着しました。多分これも有料だったはず。 数百ドル（キャンペーンやクーポン多数ある）のcharacter creator 4だけでは、このような作業はできず追加で数百ドル課金することで機能を楽しめます。素晴らしいですね。あ！まだ裸ですね。 洋服を着せてあげましょう。スーツも課金です。100ドルぐらいだったかな？ パンツも装着です。 顔を比べてみると、エラが足りてないようです。エラをたしましょう。 こめかみを減らして、エラを最大化しました。別のパラメータを探せばもっと近づけるかもしれません。 なんかちょっと違うけど、たいぶ良いのではないでしょうか。おでこの形や、みみ、あごなど細かく短く調整すればもっと似せることができるでしょう。 横からのアングルはaiのイメージにとても近いです。 いい感じです。 はい。このようにchatgptで作ったサラリーマンを、character creator 4を使うことでフル3dcg化できました。あとは課金する勇気があれば、なんでもできる！ iclone8で動かしてみました youtube"
  },
  {
    "title": "VOICEPEAKとiClone8を使って3Dキャラクターをリップシンクをして自由にしゃべらせてみた！金、金、金、課金課金課金、強化強化強化。。",
    "url": "/blog/voicepeak-iclone8/",
    "description": "VOICEPEAKとiClone8で3Dキャラクターをしゃべらせてみます。iClone 8とCharacter Creator 4 を一言でまとめると、リアルタイム3Dアニメーションとキャラクター作成ソフトウェアです。ちなみにreallusionのiClone8とCharacter Creator4は、一見いいな～と思っても購入しない方が良いです。50％OFFクーポンとか、組み合わせで割引があって600ドルぐらいで永久ライセンスが購入できるように見えます。しかし満足に何かをするには、金、金、金、金、購入、購入、購入が必要です。2000ドルぐらい使ってもいいけど～。という覚悟をもった人にお勧めです。",
    "tags": [
      "後悔したもの",
      "良かったもの"
    ],
    "date": "2024年8月13日6時37分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 voicepeak・iclone・関連プラグインの版と ui は更新されます。公式リリースノートと対応表で確認してください。 音声ライブラリやキャラクター素材の利用規約は製品・dl コンテンツごとに異なります。再配布や商用利用前に最新規約を確認してください。 記事内の画面キャプチャは当時の版向けです。メニュー名やワークフローが変わっている場合があります。 voicepeakとiclone8で3dキャラクターをしゃべらせてみます。 iclone 8とcharacter creator 4 を一言でまとめると、リアルタイム3dアニメーションとキャラクター作成ソフトウェアです。 ちなみにreallusionのiclone8とcharacter creator4は、一見いいな～と思っても購入しない方が良いです。 50％offクーポンとか、組み合わせで割引があって600ドルぐらいで永久ライセンスが購入できるように見えます。 しかし満足に何かをするには、金、金、金、金、購入、購入、購入が必要です。 2000ドルぐらい使ってもいいけど～。 という覚悟をもった人にお勧めです。 何をするために何が必要か、さまざまなストアから何を買えば適当なのか、有料オプションを購入しなければ、髪型すらまとめに選べなかったりします。 髪型と思って有料素材を購入したらモミアゲだけだったみたいなこともあり、とにかく何かしたいことに対してすべてお金がかかると思ってよいでしょう。 良いソフトウェアではあると思いますが、600ドルぐらいでは何もできず、2000ドルぐらいお金を使わないと何もできないと思って購入するのはokです。 3dキャラクターがしゃべったぞ さて、voicepeakとiclone8を使ってキャラクターを自由にしゃべらせてみましょう。voicepeakで音声を作成します。 いつしか無料配布で貰った0円のアロハじいさんを使います。カッスカスな無料配布がありますが、エピックストアー（アンリアルエンジンの毎月無料素材）のような本気の配布は無いように見えます。 アニメーションのクリエータースクリプトからaudio fileを選択します。取り込み方はいろいろな方法があります。 以上で完了です。こんな感じにしゃべります。当然こまかい調整もできます。結構よいですよね。より高度なaccufaceのプラグイン（カメラを使えるなど）もありますが、もちろん有料です。数百ドル。 youtube（しゃべりサンプル） 次はちょっと表情をつけてみました。この表情をつける素材がとても便利ですが、ソウルナントカという有料素材です。100ドルか200ドルぐらいだったような。 youtube（表情） 動きもつけてみます。あ、もちろん有料です。セットでいくらだったか？一部無料もあったりしますが、まともなものは有料です。あとバンドルとか割引とかで、とにかくごちゃごちゃです。購入したものはcontentに自動で入ります。 youtube（動き） という感じで基本的に課金をすることで強くなってゆくソフトウェアです。良いソフトウェアだと思うのですが、なぜでしょうね。すごく吐き気がします。こんなに簡単に音声付きの3dアニメーションが作成できますので、いいんだけれどね。有料部分に吐き気が。。。。 課金要素が大好きな方や、そういう仕打ちでやる気が出る人にはとてもおすすめなソフトウェアです。課金課金課金、強化強化強化！！！！！！ ue5とかaudio2faceを使っても同じようなことができると思いますが、なんか設定が小難しいですよね。iclone8に課金しちゃったからやめられない。おわり。"
  },
  {
    "title": "想像より自然で購入してしまったVOICEPEAK、いわゆるAI音声合成ソフトです。買い取り＆商用可能であることも良い点です。実際にテキストを音声にしてみました。ご確認あれ",
    "url": "/blog/voicepeak_onsei_sample_review/",
    "description": "1年ぐらい前にテキストを音声にするVOICEPEAKを購入しました。いわゆるAI音声合成ソフトです。AI音声はさまざまなタイプがあり、昔ながらのロボットみたいな読み上げソフトもあれば、ボーカロイド、ゆっくりなど様々です。いろいろ比べた結果、バランスが良く高品質だったのでVOICEPEAKを購入しました。また買い取り＆商用可能であること良い点です。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年8月12日23時18分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 voicepeak のプリセット・発音記号・ui は版で変わります。公式アップデート情報とマニュアルを確認してください。 レビュー対象のサンプル音声の提供条件や製品ラインは変更されることがあります。購入ページの説明を優先してください。 聴感の評価は再生環境（ヘッドホン・dac）に依存します。記事はあくまで当時の主観的メモです。 1年ぐらい前にテキストを音声にするvoicepeakを購入しました。 いわゆるai音声合成ソフトです。 ai音声はさまざまなタイプがあり、昔ながらのロボットみたいな読み上げソフトもあれば、ボーカロイド、ゆっくりなど様々です。 いろいろ比べた結果、バランスが良く高品質だったのでvoicepeakを購入しました。 また買い取り＆商用可能であること良い点です。 購入したのはvoicepeak 商用可能 6ナレーターセットです。追加でvoicepeak フリモメンと宮舞モカも購入しました。上記テキストを読み上げてみましょう。以下、特に設定をせずに適当に再生したものです。どうですか、なかなか素晴らしいですよね。 フリモメン読み上げ動画 youtube 宮舞モカ読み上げ動画 youtube 声の設定 設定もいくつかあります。まず右側に声の設定と感情です。設定は速さ、ピッチ、ポーズ、音量。感情はキャラクターよって少し違うようです。ポーズの違いがよく分かりませんでした。実際に聞きながら調整するのが良いでしょう。 youtube（声の設定） アクセントの設定 次にアクセントとイントネーションと長さを調整できます。違和感があるときに調整するとよいでしょう。アクセントとイントネーションの違いが分かるけど、はっきりどうしたらよいか分からないので、いろいろ試すとよいでしょう。 youtube（アクセント） 辞書機能 読み上げでwavと入力すると、ダブリューエーブイと読み上げてしまいますが、辞書を作成することでワブと読ませることができます。便利です。 オーディオデータ出力 作成したテキスト音声は、出力からwav等で出力できます。ブロックごとの保存や命名ルールなども設定できます。 youtube（オーディオ出力） テキストの読み上げですが、最近のai音声は優れていますよね。使える品質だと感じませんか。思ったより自然です。すごい時代になったものです。ライセンスに関しては細かい区分があるようでして、実際に利用する際には要注意です。 個⼈商用ライセンス利用範囲 https://www.ssw.co.jp/products/talk/voicepeak_una/voiceperak_personal_commercial_license.pdf voicepeak https://www.ah-soft.com/"
  },
  {
    "title": "子供の家のドアの鍵閉め忘れを無くせる！玄関のドアをオートロック化できるSwitchBot スマートロックPro",
    "url": "/blog/ddoa-simewasure-nakusu-switchbot/",
    "description": "玄関のドアをオートロック化できるSwitchBot スマートロックProを購入しました。購入した理由は、子供たちが家のドアに鍵を閉め忘れるからです。果たして役に立つのか？？ITホームデバイスであるスマートロックは、従来のアナログな玄関ドアの鍵をデジタル化できるアイテムです。鍵による物理的な開錠から、指紋認証や番号やカードキーで開錠できるようになります。",
    "tags": [
      "SwitchBot",
      "後悔したもの",
      "良かったもの"
    ],
    "date": "2024年8月12日14時54分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 switchbot 公式 api とアプリの画面・認証方式は更新されやすいです。開発者向けドキュメントとアプリの変更履歴を確認してください。 自作連携（スクリプト・通知）は端末 os の省電力・通知権限の仕様変更の影響を受けます。動作確認は現行環境で行ってください。 外部サービス（メール・webhook 等）の仕様も変わります。連携先の最新ドキュメントを参照してください。 購入から3カ月後、トラブルがあっていったん取り外しています。また指紋認証ボタンも白く酷い状態に。。。何か起きたのでしょうか。記事最後に続きます。あとから様々な後悔がありました。 玄関のドアをオートロック化できるswitchbot スマートロックproを購入しました。 購入した理由は、子供たちが家のドアに鍵を閉め忘れるからです。 果たして役に立つのか？？itホームデバイスであるスマートロックは、従来のアナログな玄関ドアの鍵をデジタル化できるアイテムです。 鍵による物理的な開錠から、指紋認証や番号やカードキーで開錠できるようになります。 https://www.switchbot.jp/ 2024年5月時点では、2種類のラインナップが用意されています。 switchbotロックとswitchbotロックproです。 後発の機種であり上位機種でもあるのがswitchbotロックproです。 主な違いは、バッテリーの寿命、アタッチメントの他機種対応などが大きな違いです。 機能も増えているようです。 価格は4,000円程度の差ですのでproを買うのがよろしいのではないでしょうか。 switchbot ロック pro ¥15,980 (税込) switchbot ロック ¥11,980 (税込) ロックとロックproの相違点 / ロック ロックpro デザイン クラシックノブデザイン 丸型ノブデザイン クイックキー：ワンタッチで施解錠 ボディには航空宇宙産業レベルのアルミニウムを使用 アタッチメント s/m/lの3サイズ用意 特殊な構造のツマミは3dプリンター部品で適応可能 無段階可変構造 非常に稀な特殊構造のツマミは3dプリンター部品で適応可能 解錠方法 スマホアプリ apple watch 遠隔操作 音声操作 ウィジェット操作 指紋解錠 パスワード nfcカード解錠 期間限定パスワード/指紋解錠 ワンタイムパスワード解錠 鍵の共有 1ドア2ロック対応 nfcタグ解錠 リモートボタン操作 物理鍵もそのまま使用可能 スマホアプリ apple watch 遠隔操作 音声操作 ウィジェット操作 指紋解錠 パスワード nfcカード解錠 期間限定パスワード/指紋解錠 ワンタイムパスワード解錠 鍵の共有 1ドア2ロック対応 nfcタグ解錠 リモートボタン操作 物理鍵もそのまま使用可能 バッテリー寿命 6カ月（長寿命リチウム電池2つ-cr123a） 9カ月（単3電池4つ） 充電バッテリー(別売） / 12カ月（abバッテリー） 予備バッテリー搭載のab二系統分散型 微電流解錠 / ○ （微電流解錠機能で、電池残量が不足している場合でも、30秒間だけ応急で鍵を解錠できます） 磁気感知式オートロック ドアの開閉状態を感知して、 自動で施錠を行ないます ドアの開閉状態を感知して、 自動で施錠を行ないます ロックやドアの開閉状態を常時把握 ロックされていない、 またはドアが開いている場合、 自動で通知を送信し、 リマインドを行ないます ロックされていない、 またはドアが開いている場合、 自動で通知を送信し、 リマインドを行ないます バッテリー残量低下のお知らせ機能 アプリ通知*、メール通知*、バッテリー残量低下アラート アプリ通知*、メール通知*、バッテリー残量低下アラート 指紋認証パッドとの連携でできること 仮想パスワード、緊急パスワード/緊急指紋、連続入力ミス警報、連続入力ミス通知* 仮想パスワード、緊急パスワード/緊急指紋、連続入力ミス警報、連続入力ミス通知* データの保護 銀行にも導入されているaes-128暗号化アルゴリズムを採用 銀行にも導入されているaes-128暗号化アルゴリズムを採用 エコシステム matter/alexa/google assistant/siri shortcuts/ifttt matter/alexa/google assistant/siri shortcuts/ifttt 設置方法 3mテープで貼付け ネジで固定 3mの粘着テープv2.0 粘着効果が2倍に（粘着面積73.9%増加、粘着剤、固定補強テープ付属） ネジで固定して設置 玄関のドアの内側にswitchbotロックproを設置して、外側にswitchbot指紋認証パットを設置すれば、指紋認証でドアを開錠できる仕組みです。指紋認証パッド は約1万円なのでちょっと高いです。でも指紋認証がないとね。 switchbot 指紋認証パッド ¥9,980 (税込) switchbot キーパッド ¥4,980 (税込) また大抵の場合は、ドアの上下に鍵がついているでしょう。そこでswitchbot ダブルロックproセットがあります。連携して同時に動作するようになっています。購入時は少し割引されました。 https://www.switchbot.jp/products/switchbot-2lock-pro-combo 購入する前の不安点 子供と年寄りも使えるのか？指紋認証など使いこなせるのか？ もともとの鍵でも開くのか？ ダブルロックは2個は連動するのか？ 鍵を閉めなしで、そのまま出たら鍵は自動でロックされるのか？ 設置できるのか？ なんだかアプリなどの登録めんどくさい？ こんな感じでした。結論としては問題ありませんでした。 ・子供と年寄りも使えるのか？指紋認証など使いこなせるのか？ →問題なし、指紋認証を触れば数秒後に開きます。もしくは番号入力で開きます。それでも難しい場合はカードキーで開きます。 ・もともとの鍵でも開くのか？ →問題なし、ダブルロックの片側を回すと、連動してもう一つも自動的に回ります。 ・ダブルロックは2個は連動するのか？ →問題なし、まれに連動しないこともありが。。。 ・鍵を閉めなしで、そのまま出たら鍵は自動でロックされるのか？ →問題なし、自動でロックされるのもうカギを閉める必要なし。アプリからロックされる秒数なども指定できるので柔軟です。 ・設置できるのか？ →→問題なし、内側の鍵の形状がつかめる形であり、つかめる幅であれば、たいていは適合するでしょう。あとは適宜バランスを調整して、強力な3m両面テープで固定される感じです。外側に設置するリモコンも両面テープで固定です。ネジなどもいろいろ付属しています。仕組みがわかるまでは、まごまごするでしょう。 ・なんだかアプリなどの登録めんどくさい？ →問題なし、switchbotのアプリはよくできています。仕組みがわかるまでは、まごまごしますが、慣れると素晴らしいアプリです。 スマート家電は安心の日本企業を スマートデバイスは、海外を含めたさまざまな企業から発売されています。 ひどいものになると、サポートが終了したり、企業がなくなったり、セキュリティに問題があったりするでしょう。 また残念ならが日本企業のアプリは、クソみたいなものが多いのですが、このswitchbotはアプリなどテクノロジーが素晴らしく洗練されています。 日本企業なのに驚きです。 そう思ってちょっと検索したら、switchbot（スイッチボット）は、東京都渋谷区に拠点を置く 中国のテクノロジー企業 の日本法人でした。だからアプリの出来が素晴らしいわけですね。ずーーと日本企業だと思っていました。。。。。過去に8製品ぐらいかっています。 switchbot 設立 2015年 本社 深圳市、中国 所有者 connery lee ウェブサイト us.switch-bot.com switchbot.jp 別途記事にする予定ですが、こういったスマートデバイスとしては珍しくswitchbotは、apiなどがしっかり公開されています。 それで、pythonなどからapiを通じてswitchbotが操作できちゃうんです。 しかもapiの利用料もかからないのです。 日本企業にしては、珍しくすごいなぁ。 すごいなぁと思っていましたら案の定！！ 中国であれど、日本やヨーロッパで展開している国際企業として、セキュリティやプライバシーの管理は大丈夫って思いましょう。ネットワークカメラなどは、中国が進んでおりますね。 実際に設置 こんな感じに上下に設置しました。switchbotロックproの近くに付属の磁石を設置します。この磁石によってドアの開閉を検知できます。 ドアの鍵部分を、はさむような機構になっています。マージンがしっかり設けてあるので、いろいろなタイプに設置できるでしょう。 ドアの外側にワイヤレスのswitchbot指紋認証パットを設置します。ちなみにこちらの電池は約2年間もつそうです。 アプリからさまざまな情報が見れます。 たまに指紋認証が無反応なことがあります。原因がよくわからないところです。なんか通信上の問題にも見えますが、その場合は番号で入力するなど別の手段を使えばいいかなって感じです。 以上！購入してとても便利になった！おすすめです。 追記：使用2週間後。。。 なぜかバッテリーが急激に減る症状が発生。サポートセンターに交換の連絡をするも再現性の確認を求められ、その後は上手く再現できず。。バッテリーが急激に減るのですが、実際には減っていないようで、電池を交換したり、上下のバッテリーユニットを入れ替えてみたり、色々するもよくわからず。 また粘着テープがはがれて脱落するなども発生。これらは正確にきちんと設置しないことがで発生しているように思えます。まあ2個もあるから、 何か不具合も２倍出ている感じです。 うーん。。。２個が良いと思ったけど、１個だけにしたほうがトラブルが少ないのかも。いずれの問題も未解決で1週間に一回は何かトラブルが発生中です。 追記：使用2カ月後。。。 「バッテリーが急激に減る症状」の発生理由が徐々に判明。どうやら設置時点に、少し斜めに設置してしまったことで粘着部分が、徐々に剥がれてきた様子。脱落はしないもの斜め（本当に少し）になり、鍵が回転する部分に何かしら負荷が発生することで、「バッテリーが急激に減る症状」が出るようです。 もしくはドア素材のためか、最近の気温が高いためか、斜めを修正するために貼りなおしたため粘着力が低下したためか、子供達が出入りするときにぶつかっているためか、そもそも構造的に落ちてくるのか不明ですが、以下のように少しづつ「斜め」になり、「バッテリーが急激に減る症状」が出て、ロック機能が停止しました。 1～2週間ごとに発生します。 そして上下２個もついているから、どちらかが斜めになり、「バッテリーが急激に減る症状」が発生するという悪循環です。うーん。設置方法が悪かった可能性が高いですが、完璧な設置など果たしてできるのでしょうか。 現状は取り外しています。3mの強力な両面テープを購入して、ふたたび貼り付けて設置をする予定。そして1台のみで運用を再開する予定です。 便利ではあるのですが、とても残念です。2個を同時に動かすことは素晴らしいように見えまずが、トラブルが2倍です。 外側の指紋認証キーですが、1日の間に少しだけ日光があたります。 わずか１か月ですぐ白く劣化しました。 ２か月でさらに激しく劣化中です。 日光がまったく当たらない玄関などあるのでしょうか。 もし設置する場合は、日光が当たらないようにbox？などに入れるべきのようです。 白くなっているので、暗証番号もバレそうです。 普段おしている番号が見えてきますよね。 購入するときは、指紋認証キーは日が絶対当たらない場所へ。ロックは2個連動するとトラブルが2倍になることや設置する際に徐々に剥がれる現象があると、さまざまな停止が発生しするので要注意です。 ドアのツマミが、ちょっと丸みがあって、ロック側のツマミが徐々に押し出されているのが原因なのかな。わからない。もっと深く設置すれば改善できるのか？対象外のドアなのか？ドアの型番ってどうやって調べるのだ？などなど。上手く設置できないので、3m強烈テープで改善できるか後日テスト予定。 スマートロック1個で再設置 3mテープを購入しました。しかしamazonで急いで購入したので、あああ。。。。偽物っぽい。よく見るとurlもtaobaoのサブドメインみたいだし。。。テープが全体的にべっとべとです。両面もはがれにくい。。3mという3mとは関係のない3m中国が作っているテープ3mのようです。 あらためてamazonのページを見ると写真以外は一言も3mと書いてありませんでした。これは自分が悪いですね。偽物なら200円ぐらいにしてほしいです。1000円と高額で購入してしまいました。かなしい。 またスマートロックを回しても、カチャカチャ無限に回転してしまいロックされない現象も発生しました。真ん中ののネジを締めたら治りました。 中国製品なので中国純正の両面テープで補強します。これぞ地産地消の組み合わせです。 今度は横にして貼り付けみました。横の方が脱落しないのかも。と思いまして。今回は何日もつかな？ また2日後に停止 また2日後に停止。どうやら開錠と閉錠の位置に誤差が出てきたことにより、閉錠エラーが発生して、閉まっていない判定で動作が停止しました。閉まっているのに、閉まっていない判定されたことで、ボタンを押しても開かないという動作です。 横向きがよくなかったようです。縦に戻し再設定しました。 鍵を摘む部分がゆるかったことで、位置のずれが発生したと推測しました。両面テープをすべてはがしてニセ3mで再設置しました。**このニセ3mは、がっちり接着できています。すごく良い感じです。**設置位置やネジなどを再調整して再設置しました。 また7日後に停止 ニセ3mが突然剥がれおちました。 ニセ3mをもう一度貼り直して良い感じです。ニセ3ｍを信じている。 7日後に停止 ニセ3mが突然剥がれおちました。やはり偽物はダメなようです。。。。 3mストアーから正規品の本物を購入して再設置しました。重力の関係で剥がれるような向きなんですよね。。。。。 謝罪！逆さに付けていた 自分がバカでした。逆さに付けていたから、剥がれ落ちたのだと気が付きました。なぜ商品が逆さなのに気が付かなかったのでしょう。 まっすぐ設置したら安定した？ 本当の3mのテープを購入しました。スリーエムストアから購入すれば偽物を購入することもありません。 このように正しく設置しました。やっぱり何度が落ちましたが、だんだんコツが分かってきました。 横から見て少しだけハの字になるように設置したところ自然で脱落するバランスと剝がれないバランスが取れたようです。 こんな感じです。ロック解除を子供達も含めて乱雑に押すわけです。家に入るときに鞄がぶつかったりもします。いろいろな衝撃に対してバランスが良い状態になったようです。 鍵なしで指紋認証で家に出入りできるメリットは大きくとても便利です。これだけ脱落を繰り返しても使用したく、やっと安定しました。購入から６カ月たちました。 さらに安定した設置をするには、このように3dプリンターなどで補助設置する機構を加えるのがよいと思います。 例えば1人暮らしであれば、装置のボタンの押し方など加減が分かりますし不用意な衝突もありません。これだけ脱落することもないでしょう。家族で使う場合は、さまざまな衝突があります。それらの影響も大きいでしょう。 最後に2個セットは不要でした。鍵を2個同時にロックしたい気持ちはありますが、 トラブルも2倍ですし、下側のカギはドアノブに干渉するため上下逆さにしないと設置できません。※ドアによって異なります 以上！使い方に問題があったことも原因ですが、トラブルが多かったものの使えるようになりました。めでたしめでたし。"
  },
  {
    "title": "7年前に総額70万円ぐらいで購入したSony α7R3を7年間使ってみた思い出を振り返る：高い買い物で損をしたのかどうか？",
    "url": "/blog/2017-sony-%CE%B17r3/",
    "description": "2017年発売のSony α7R3を購入してから7年もたちました。7年前に購入したSony α7R3が良かったものか振り返ってみます。当時のメディアの記事を見ると37万です。レンズも24-70mmのFE 24-70mm F2.8 GMレンズを同時に購入しました。25万ぐらいでしょうか。ストレージや周辺機器も購入して70万ぐらいだった記憶です。高いですね。。。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年7月25日14時54分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 α7r iii のファームウェア・レンズ補正・周辺機器は公式サポートで更新されます。撮影前に最新版のリリースノートを確認してください。 raw 現像ソフトのデフォルト解釈はアップデートで変わります。同じ raw でも見え方が異なる場合があります。 中古相場・互換バッテリー・アクセサリは流通で変わります。安全性は純正・正規品の注意書きを優先してください。 2017年発売のsony α7r3を購入してから7年もたちました。 7年前に購入したsony α7r3が良かったものか振り返ってみます。 当時のメディアの記事を見ると37万です。 レンズも24-70mmのfe 24-70mm f2.8 gmレンズを同時に購入しました。 25万ぐらいでしょうか。 ストレージや周辺機器も購入して70万ぐらいだった記憶です。 高いですね。 。 。 当時のsony α7r3のニュース https://dc.watch.impress.co.jp/docs/news/1087850.html しかしながら2024年現在も同じカメラを使っています。日常では画質や解像度にまったく不足を感じないからです。解像度も約4240万画素（7952×5304ピクセル）もあります。むしろどうでも良い写真ならsサイズで使っているぐらいです。バッテリーの持ちも連射も近代のカメラに見劣りしません。まだまだ使えそうです。 2024年に中古で購入するとsony α7r3は16万、gmレンズ14万ぐらいのようです。カメラの値段は意外と保たれています。60万（当時）－30万（現在）で、30万を7万で割ると年間4万円ぐらいです。ほとんど使い捨てとなるパソコンよりはパフォーマンスが良いです。 現在はミラーレスが主流です。当時はまだまだマイナーなミラーレスでした。ミラーレスカメラはフランジバック（レンズマウントとセンサーとの距離）が短いため、多くの異なる種類のレンズをアダプターを使用して装着することができます。当時はいろいろなものを装着して楽しみました。振り返ってみましょう。 楽しみ1：オールドレンズを装着 オールドレンズ入門として定番のレンズpentax m42 smc takumar 50mm f1.4があります。当時pentax m42 smc takumar 50mm f1.4です。amazonやヤフーオークション等で5000～10000円で販売されいました。今も変わらない程度の価格です。 約30年前のレンズですが、絞れば現代のレンズにも近いシャープな画質で撮影できます。一方でオールドレンズの味わいも手軽に得られます。入手しやすく、安く、シャープでボケも楽しめるため人気なのです。 オールドレンズを最新機種で利用する最大のメリットは電子ファインダーです。ピーキングやピント拡大でピントをしっかりと合わせて撮影することができます。レンズ変色しているので色温度がちょっと温かい感じです。味わいです。 f1.4では周辺にむけて流れが大きくなり背景のボケも気持ちが良いです。光量が落ち込むのも味です。f2.8まで絞ればレンズのシャキッとします。撮影したサンプルを見て、いいな～と思ったら好きなオールドレンズを購入してみると楽しめます。 マウントアダプトとかカメラが良くわからない人は、sony eマウントカメラとm42の変換マウントを購入すればよいです。 「 m42 eマウント 」でamazonで検索すれば出てくるでしょう。 電子接点は使えなくなりますので、マニュアルレンズ（フォーカスおよび絞り）として楽しめます。 楽しみ2：マクロ顕微鏡レンズを装着 オールドレンズと同じように、いろいろなレンズを工夫すれば装着できます。マクロ撮影の歴史は古くさまざまな拡大方法が存在しています。ベローズ+対物レンズ、写真引き延ばしレンズ+ベローズ、広角レンズのリバース、昔のマクロレンズ、テレコンバージョンなどなど。 詳しくは説明しますが、cマウントなど互換性が高い形式につながるように様々な変換を繰り返すことで、だいたいのレンズを装着できます。フレンジバックを調整するためにヘリコイド（レンズの奥行きを調整できる機構）を組み合わせるのが一般的です。 こんな感じに繋げたりします。 ダニとか撮影できます。被写界深度が浅いので、いろいろ工夫が必要になりますが面白い趣味の分野です。 もっとも簡単な方法としては、エキステンションチューブ（接写できるように焦点距離は調整するアダプタ）を加えることです。 これだけでも随分とマクロ撮影ができます。コインや花などクローズアップで撮影できます。 楽しみ3：変態レンズを装着 カラーフィルターが内蔵された変態オールドレンズがございます。 janpol color pzoです。janpol color pzoは80mmのm42マウントレンズです。enlarger lensのためフォーカスリングが付いていません。ヘリコイドが必要です。 janpol color pzoのレンズ先端のダイヤルを回すだけで、青、黄、紫のフィルターがレンズの前後に出てきます。カラフルでレトロな写真が取れます。元は引き伸ばし機で使われていたレンズです。引き伸ばし機は、写真を拡大して印画紙に焼き付けるための機械だったそうです。 詳細はwikiを参考です。 https://ja.wikipedia.org/wiki/引き伸ばし機 janpol color pzoは、レンズの左右にカラーフィルムの調整ダイアルがあります。加えてプラスチックのスタンドが謎です。 カラーフィルムは後ろ側のレンズの前後に設置されています。カラーはシアン、イエロー、マゼンタです。 janpol color pzoの絞りは5.6、8、11、16です。たった4種類しかありません。 カラーフィルターはシアン、イエロー、マゼンタです。シアンとイエローを使うとグリーンになります。組み合わせて使うのも面白いです。 フォーカスリングがありませんので、ヘリコイド（筐体の長さを調整する）が必要です。ヘリコイドというと難しいそうですが、要は回すと伸びる筒です。m42－m42マウントのヘリコイドを購入して装着しました。これでピントの調整が可能になります。 このままm42→eマウント変換のマウントアダプタを装着してsony α7で利用するのもよいのです。80mmとちょっと望遠なので、フォーカルレデューサーアダプター、いわゆる縮小光学系アダプターを使うことにしました。 80mmの0.7倍で56mmの感覚で使えます。大きくケラレます。それでも80mmよりは良いかなと考えたわけです。m42→eマウントのフォーカルレデューサーアダプターを購入して使えば良いのですが、m42のために数万円するマウントアダプターを購入するのは悔しいです。 どのレンズもいったんefにすること、いろいろなレンズやアダプタを共有できます。m42→efマウントのマウントアダプターを購入。m42に装着することでefマウントになりました。 次に中一光学 lens turbo ii ef-nexを装着します。 これで下準備が完了です。janpol color pzoにはレンズキャップがありません。canonの50mmについていたレンズキャップを付けたら、とりあえずつきました。すぐ取れますけど。 こカラフルな写真が撮影できます。 以上からsony α7r3を購入して7年がたちますが、いろいろと楽しめた気がします。いまから中古で買って魔改造して楽しむのもよいでしょう。sony αシリーズも最新世代だと50～100万と結構な金額ですからね。"
  },
  {
    "title": "Unreal Engine 5でWindows向けVRアプリのパッケージ化：パソコンとHMDでVRアプリを作って簡単に視聴してみよう",
    "url": "/blog/ue5-pcvr-app-pack/",
    "description": "Unreal Engine 5 (UE5) を使用して、Windows環境でヘッドマウントディスプレイ（HMD）対応のアプリケーションを作成し、パッケージ化する方法について説明します。パッケージ化すると他のWindowsマシンで実行可能になります。システムやゲームとして配布することができます。VR設定を適用することで、HMDを使った体験が可能になります。",
    "tags": [
      "UE5"
    ],
    "date": "2024年7月21日21時6分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 meta quest 本体 os・pc 向け openxr / steamvr・unreal の xr プラグインは頻繁に更新されます。各リリースノートの対応表を確認してください。 パッケージング・署名・配布要件はストアとプラットフォームポリシーで変わります。記事は開発向けの手順前提です。 推奨スペックとエンコード設定は gpu 世代で最適値が変わります。実機で再プロファイルしてください。 unreal engine 5 (ue5) を使用して、windows環境でヘッドマウントディスプレイ（hmd）対応のアプリケーションを作成し、パッケージ化する方法について説明します。 パッケージ化すると他のwindowsマシンで実行可能になります。 システムやゲームとして配布することができます。 vr設定を適用することで、hmdを使った体験が可能になります。 本記事で紹介するのは、低レベルですがwindows環境でパッケージ化されたプロジェクトをhmdで見る方法です。 いわゆるpcvrです。 イベントやちょっとしたプロジェクトをパソコンで見せたい場合に便利です。 pcvrは動作にパソコンが必要になりまして手軽ではなりませんが、スタンドアローン動作より簡単にパワフルに動くので簡単です。 またもっとも簡単なunreal engine 5でwindows向けにhmd対応のvrアプリケーションを快適に動作させるための設定を最適化する方法も紹介します。 windows環境でパッケージ化するためには、visual studioの開発環境が必要になります。 visual studioのインストールやセットアップに関しては以下サイトがとても分かりやすいです。 今となってはvisual studio2019より、visual studio 2022をインストールする方がよいでしょう。 https://ue5study.com/how/unrealengine-packaging-visualstudio-settings/ 合わせて公式もチェックしましょう。 https://dev.epicgames.com/documentation/ja-jp/unreal-engine/setting-up-visual-studio-development-environment-for-cplusplus-projects-in-unreal-engine まずはvisual studio 2022をインストール 詳しくは先のサイト参照ですが、要は以下のチェック項目でvisual studio 2022をインストールすればokです。 プロジェクト作成とvrセットアップ まあ適当にue5のプロジェクトを作ります。映画→ブランクで作りました。 art gallery museumを使います。 説明は省略しますが、取り込んだアセットをmainコンテンツに上書きします。art gallery museumのデモから起動するようにしました。 プロジェクトのマップ＆モードにて、mainをスタートマップとデフォルトマップに設定します。 さてvrへの対応を準備します。ワンクリックでセットアップできます。コンテンツ追加をクリックして**「機能またはコンテンツパックを追加」**を選択します。 バーチャルリアリティをプロジェクトに追加します。 vrに必要なプラグインが自動で入ります。簡単ですね。隠れていますが右下にokボタンがありますので、それらを押してください。ue5の環境準備完了です。 meta quest3を接続 パッケージ化の前に動作テストをします。まずmeta quest3を接続します。windows pcに有線接続（oculus link）します。無線のoculus airなどは、動作がカクカクしますので有線が推奨です。oculus linkの接続に関しては、この記事では細かく説明しません。適宜検索してください。 oculus linkの接続ができていれば、プラットフォームにvrプレビューが登場します。このvrプレビューの動作は、エンジンの拡張機能設定で調整可能です。 エンジンの拡張機能設定を変更して、vrプレビューを試してみてください。いろいろ試してみると、グローバルイルミネーションの負荷が一番大きく、ここを中以下にするとカクカクが解消されて、すんなり動きました。グローバルイルミネーションは、lumenが大きく関連しています。中以下はlumenをオフにする設定です。 エンジンの拡張機能設定は、あくまでもプレビュー用の設定です。パッケージ化した設定とは別です。そのため、この設定で動作が快適になってもパッケージ化したあとはカクカクして上手く動作しないということもあります。 hmdが動作するようにブループリントを作成 次はパッケージ化したあとにhmdが動作するようにブループリントを作ります。初期設定のままでは、vrプレビューは動作してもパッケージ化で動作させた場合は、vr機能が起動しません。 レベルブループリントを開きます。 event beginplayにenable hmdを繋げます。 **enableにチェックを忘れないでください。 **これでパッケージ化したプロジェクトが実行されたときにhmdが起動するようになります。 ゲームを停止するために何かキーをquit gameに割り当てると便利です。 以下参考に設定してコンパイルして保存してください。 プラットフォームからwindowsにて、プロジェクトをパッケージ化してください。これでwindows環境で配布用の動作ファイルができます。 exeを実行することで、hmdで見れるue5が書き出されます。ゲームパットを接続すれば、ゲームパットで移動もできます。もしくは本記事設定と同じであれば、wasdで移動できるはずです。qeで上昇加工なども。 実行してhmdによる動作を確認してください。 結構カクカクするので、バランスの調整が必要です。 軽量な動作をするための設定はいろいろとあります。 細かく調整したい場合は、下記リファレンスなど参照ください。 ただほとんど、動作に効果があるのか無いのか分からないでしょう。 動かない場合に劇的にすぐ改善できる項目は見つからないでしょう。 xr パフォーマンス機能 https://dev.epicgames.com/documentation/ja-jp/unreal-engine/xr-performance-features-in-unreal-engine xr ベスト プラクティス https://dev.epicgames.com/documentation/ja-jp/unreal-engine/xr-best-practices-in-unreal-engine oculus 向けの開発 https://dev.epicgames.com/documentation/ja-jp/unreal-engine/developing-for-oculus-in-unreal-engine プロジェクト設定のレンダリングのvrなどのオプションも効果があったり、無かったり、上手く動かなかったりします。今一歩、効果が明確にわかりません。 簡単にできる快適な動作設定 プロジェクトの負荷によっては、細かい設定で解決できることも多いでしょう。いろいろ設定を変えても、あまり良い結果になりませんでした。よりよい方法があるのかもしれませんが、もっとも簡単に効果がある方法を紹介します。 まずグローバルイルミネーションのlumenの影響が大きいので、lumenの設定を切ります。プロジェクト設定→レンダリング→グローバルイルミネーションのダイナミックと反射メソッドをlumenからnoneに変更します。 これでプロジェクトをパッケージ化してみて動作を試してみます。lumenはリアルタイムでリアルな照明を表現する機能です。なのでlumenを切ると、古いcgみたいな絵になります。 このようなリアルな感じから このような寂しい感じになります。 このような表現でも良い場合は、lumenを切ることで快適な動作になります。どうしてもlumenを使いたい場合は、次の方法です。lumenの設定を元に戻します。 meta quest3側に解像度を下げます。meta quest linkアプリを開きます。デバイス設定から使っているquest3を選択します。 グラフィックス設定を選択します。 グラフィックスのレンダリング解像度は初期設定では1.0になっています。 これを最小まで下げてみましょう。これで動作を試して、快適に感じるレベルまで上げてゆきます。解像度を下げることでlumenがonでも快適に動作する可能性があります。"
  },
  {
    "title": "ダークウェブに流出した情報からパスワードを守るSticky Password（スティッキーパスワード）ダークウェブにパスワードが流出しても自己防衛できる。めずらしい買い取り永久ライセンスでありがたい",
    "url": "/blog/protect-your-passwords-from-information-leaked-on-the-dark-web/",
    "description": "Sticky Password（スティッキーパスワード）は、パスワード管理ソフトです。Sticky Passwordにアクセスするマスターキーを一つ設定することで、さまざまなパスワードにアクセスできる仕組みです。\nSticky Passwordのダークウェブ監視機能があります。この機能を使えば、 Crossword Cyber​​security PLC によるダークウェブモニタリングで、ダークウェブに流出しているパスワードをチェックして警告してくれます。ダークウェブにパスワードが流出しても変更して自己防衛できます。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年7月6日11時46分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 パスワードマネージャーや os のパスワード提案機能は製品版で ui と同期方式が変わります。公式のセキュリティガイドを確認してください。 漏洩情報の検索サービス・通知機能の提供条件は各社で更新されます。記事内のサービス名は当時の例です。 セキュリティのベストプラクティス（mfa・バックアップキー等）は勧告の更新があります。最新の勧告を参照してください。 sticky password（スティッキーパスワード）は、パスワード管理ソフトです。**sticky passwordにアクセスするマスターキーを1つ設定するだけで、さまざまなパスワード呼び出せる仕組みです。**もう6年も使い続けています。 sticky passwordにはダークウェブ監視機能があります。ダークウェブに流出しているパスワードをチェックして警告してくれます。パスワードが流出してもパスワードを変更することで自己防衛できます。 めずらしい買い取り永久ライセンスsticky password 近年は何でもサブスクリプションです。パスワード管理ソフトも同じです。できるだけ永久ライセンスを選びたいところです。 sticky passwordは買い取り型の永久ライセンスです。 sticky passwordは、lamantine software（ラマンティンソフトウェア：本社チェコ共和国）のソフトウェアです。 主要メンバーは、過去にavg technologiesというウィルス対策ソフトを開発していたとのこと。 sticky passwordは2001年に発表されているので23年以上の実績があるソフトウェアです。 その分野では老舗中の老舗でプロフェッショナルなのでしょう。 sticky password https://www.stickypassword.com/ チェコ共和国というのが珍しいですよね。チェコ共和国はセキュリティソフトウェア分野で有力な企業が多いだとか。 sticky passwordは大丈夫なの？？？安全なの？ ちょい複雑ですがsticky passwordのjpアカウントは、代理店である株式会社komodoが運営しています。 **なのでsticky passwordで日本語で検索すると株式会社komodoが表示されます。 **sticky password本社のページ（https://www.stickypassword.com/）から日本語サイトをクリックしても株式会社komodoのページに飛ばされます。 **以下説明にあるように「製品紹介サイト」という関係で、いわゆる代理店としてよくあるパターンです。 ** 日本語メーカサイトとして見てしまうと、**2016年から記事が更新されていなかったり、セキュリティソフトなのに大丈夫なの？？？**と心配になります。紹介サイトですから、時間がたてば更新しなくなるものです。販売の窓口が代理店ですから、サイトなど更新しなくなるのもよくあることです。 本記事は2024年7月6日時点に作成しています。 **なぜか昨日ぐらいからhttps://www.stickypassword.jp/にアクセスできなくなりました。 **他のブラウザやipが異なるスマホからアクセスしても一緒です。 **なのでブロックではないと思いますが。 。 **サイトがメンテナンス中なのか、何かドメインや証明書が失効したのか。 。 。 。 代理店サイトですから、本社とは関係ないはずですが、**大丈夫なはずです。 そのうち復旧するでしょう。 。 ** **日本語サイトを見ていると不安になるので、本社のサイトを確認してみましょう。**blogなども更新されておりセキュリティやパスワードについても専門的な論議がされています。 https://www.stickypassword.com/blog/ ソフトウェアの更新も頻繁（最終更新日2024/07/01）です。安心。ちゃんとしています。 https://play.google.com/store/apps/details?id=com.stickypassword.android&hl=ja sticky passwordの仕組みをざっくり説明 パスワードを支援する仕組みとして、自動フォーム記入、パスワード生成、複数デバイス間でのセキュアなデータ同期などの機能があります。ユーザーデータを保護するために軍事グレードのaes-256暗号化を使用するほか、セキュリティを向上させるために生体認証や二段階認証のオプションも提供しています。 sticky passwordは、windows、mac、android、iosなどのさまざまなプラットフォームに対応しており、ほとんどの主要なウェブブラウザで使用できます。 ソフトウェアは、クラウドベースの同期、ローカルwifi同期、または手動オフライン同期など、異なる同期オプションを提供し、ユーザーのプライバシー設定に合わせて選択できます。 その他の機能として、オンラインで情報が侵害された場合にユーザーに警告するダークウェブモニタリング、信頼できる人が緊急時にアクセスできるようにする緊急アクセス機能があります。まあパスワードを管理する便利な機能がだいたいあるということです。詳しくは直接webをみてください。 2023年1月にダークウェブ監視機能を追加 今回、説明をしたかったのが2023年1月に追加されたダークウェブ監視機能です。つい先日のkadokawaのランサムウェア攻撃による情報漏洩がありました。ほかにも日々あとこちから情報が大量に流出しています。 kadokawaのランサムウェア攻撃による情報漏洩 https://tp.kadokawa.co.jp/.assets/240703_release_mrugoqz3.pdf 今後もこれらの情報流出は、止まることはないでしょう。あちこち漏れまくりで、ほぼすべて漏れているといっても過言ではないはずです。これらの情報流出の懸念事項は、情報がダークウェブに掲載されて悪用されることでしょう。 ダークウェブ上の通信は暗号化されており、ユーザーの匿名性が保たれます。これにより、アクセスするユーザーや運営者の身元を特定することが非常に困難です。そのため悪い側面では、身元が特定されないため違法的な情報が掲載されやすく犯罪の温床にもなります。 良い側面は、情報の自由やプライバシーの保護といった側面もあり、国や政府の監視・検閲を逃れジャーナリスト、告発者などが情報を共有するためのプラットフォームとしても利用できます。 われわれ一般人は、tor browserなど使ってダークウェブ上から情報を探すことは困難です。できる対策といえば、流出したパスワードを確認して変更することぐらいです。自分の情報を電子化しなことがベストですが、山で暮らすわけにはいきません。文明で暮らすには電子化は必須です。 そこでsticky passwordのダークウェブ監視機能があります。この機能を使えば、 crossword cyber​​security plc によるダーク ウェブモニタリングで、ダークウェブに流出しているパスワードをチェックしてくれます。実際にarcを初めてonにしてみました。 しばらく経過すると39のパスワードで流出が確認されました。というのも流出してもよいサービスには、超簡単なパスワードを使いまわしていたからです。へへへ。この機会にパスワードをすべて変更しました。 こんな感じで、角川などから情報が流失して第三者が悪用できるような情報掲載が起きた場合にcrossword cyber​​security plc にリストアップされれば、警告がsticky passwordに出てくるので自分で防衛できます。個人でとれる対策はそれぐらいでしょう。 sticky passwordを購入したのは2018年5月 私がsticky passwordを購入したのは2018年5月です。それからずーーーと使っています。調べてみるとamazonで6000円ぐらいで購入したようです。そこから一度も課金していません。今が2024年ですから6年間使い続けています。安い！！ ちなみにsticky passwordにすべてのログイン情報（銀行からどうでも良いサービスまで）を入れています。 もしsticky passwordがハッキングされたら破産です。 そう考えると恐ろしいですが、sticky passwordがないと管理できないぐらい依存しているので、何かあればsticky passwordと共に滅ぶ予定です。 なので安心してください。 もしあなたがsticky passwordを使って問題が起きたら、私もめっさつされます。 処刑！ さてそのような心配から、企業が安定して存続するようにsticky passwordにちょっと投銭しておこうと思いまして、dark web monitoringはサブスクリプションで年額12ドルで提供されておりましたので、課金しました。 購入内容の詳細 dark web monitoring - 2 year license renewal $24.00 usd 合計 $24.00 usd ￥4,050 jpy = $24.00 usd 1 jpy = $0.0059 usd 強制サブスクリプションより、投銭のほうが気持ちがよいですよね。まあ結局サブスクしたという。 sticky passwordの使い心地・主に悪い点 sticky passwordですが、超使いやすいわけではありません。**windowsで使っていますが起動が遅いです。**起動する際にマスターパスワードを入力する必要があります。パスワードを使いたいときに、以下のような作業になります。 起動→マスターパスワード入力（なぜか閉じる）→もう一度起動→使いたいパスワード検索→サイトへ入力 といった感じです。**若干もたもたして繰り返し入力が必要なので、いらいらします。**もちろん自動起動の設定などもありますが、 使わないときに毎回起動するとウザイです。 **それと頻繁にバージョンアップのアラートが出てきます。**最初は更新していたのですがあまりに頻繁なので、更新をやめました。たまに更新します。アップデートの更新が普通にインストールが始まるので、 バックグラウンドによる自動更新ではないことがあります。それが面倒で面倒で面倒で。。。。。 あとidやパスワード入力欄への自動入力支援機能があります。**一見便利なようですが、オートフィル機能がガンガンガンガン動くことがあり。そのアカウントでログインしたくないの。。。。 なぜログインするんだとイライラします。クロムなどの場合は、毎回更新が必要だったりメンテが大変です。 また 自動入力がすごい速度で動くので、止められずにガンガンログインされて迷惑です。**複数アカウントなど管理している場合は使いずらいです。なので機能をカットしています。 つらつらと悪い面ばかり書いていますが、**マルチプラットフォームで複数のシステムに同時にインストールできるので、すごく便利です。**どこかで新しいパスワードを保存すれば、他のデバイスからも参照できます。もうこれがなかったら管理できません。非常におすすめ！！パスワードも自動で生成してくれます。 sticky passwordは複数サイトで販売しています。たぶんどこで買っても同じです。一度買えば永久に使えます！ ちなみにgoogleなどもパスワード管理機能がありますが、あれは実は恐ろしくてアカウントと紐づけされていますから、ちょっと誰かのpcを借りてログインなど作業しているとクロムブラウザーにすべて情報が移籍されてしまうことがあるのです。たぶん何か操作が関連していると思うのですが、気が付かないことが多いのです。 gmailからはログアウトしているのに、クロムブラウザーにログインが残り（右上のログインアイコン）、ブックマークやパスワードがすべて残ってしまうことがあるのです。意外と気が付かずログアウトを忘れてしまうという。。。 仕事などで他の人にノートパソコンを渡すことがあり、他の人のgoogleアカウントが紐づけされていたことがあります。gmailからはログアウトしていたものの、クロムブラウザーのほうを消し忘れたようで銀行からすべてのアクセスがブックマークされていました。 パスワードもオートフィルです。アダルトなショップのリンクも入っていたりして。気の毒なので黙ってログアウトして削除しておきました。googleの場合、こっそりそういうことが起きるから恐ろしいですよね。"
  },
  {
    "title": "簡単にUE5でディスプレイメントマップ（Displacement Map）を設定追加する方法、難しいブループリントやTessellationの設定も不要",
    "url": "/blog/ue5-kantan-displacementmap/",
    "description": "UE5で簡単にディスプレイメントマップ（Displacement Map）を設定する方法を紹介します。ディスプレイメントマップは、テクスチャのマップを使用してオブジェクトのメッシュの実際の形状を変形させることで、表面に本物の凹凸を作り出します。これによりリアルな影や光の反射が生成されます。それと比較して、ノーマルマップはオブジェクトの実際の形状を変えることなく、影の濃さなどを変化させることで、視覚的に凹凸があるように見せます。",
    "tags": [
      "UE5",
      "テクスチャー"
    ],
    "date": "2024年6月30日20時3分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ワールドディスプレイスメントやマテリアルノードの名称・既定値は ue の版で変わります。該当リリースのドキュメントを参照してください。 メッシュの細分化（tessellation 相当）とパフォーマンス特性はハードウェア世代で大きく変わります。 高解像度のディスプレイスメント用テクスチャは容量とストリーミング設定の影響を受けます。 **ue5で簡単にディスプレイメントマップ（displacement map）を設定する方法を紹介します。 **ディスプレイメントマップは、テクスチャのマップを使用してオブジェクトのメッシュの実際の形状を変形させることで、表面に本物の凹凸を作り出します。 これによりリアルな影や光の反射が生成されます。 それと比較して、ノーマルマップはオブジェクトの実際の形状を変えることなく、影の濃さなどを変化させることで、視覚的に凹凸があるように見せます。 ue4では、ディスプレイメントマップを簡単に使用することができたのですが、ue5からはディスプレイメントマップが簡単に使えなくなりました。lumenやnaniteが導入されたことで、非常に高いディテールを持つジオメトリを処理することが可能になったからです。 とはいえどもpbrマテリアルテクスチャー素材を使ったときに、テクスチャー素材だけだと凹凸の表現がノーマルマップだけになるのは寂しいです。何かもっと簡単にue5でディスプレイメントマップ（displacement map）を使えないものかと調べてみました。 **難しい設定をすればue5でもディスプレイメントマップ（displacement map）を使えるようですが、tessellationの設定が必要だったり、ブループリントの設定が必要だったり、defaultengine.iniの書き換えが必要であったりします。 今回それらの設定が使わずにディスプレイメントマップを設定します。 ** 参考 https://zenn.dev/posita33/articles/ue5-exp-displacement_tessellation https://metatimecg.com/ue5-displacement/ まずディスプレイメントマップ（displacement map）を用意します。 プラグインにてnanite displaced meshをオンにします。 ディスプレイメントマップ（displacement map）をue5に取り込みます。もちろんディフューズマップ (diffuse map)、ノーマルマップ (normal map)、ラフネスマップ (roughness map)なども設定済みとします。 スタティックメッシュにディスプレイメントマップを有効にする項目があります。マテリアルじゃなくてスタティックメッシュです。 naniteを有効にして、相対誤差をトリミング（0.1～0.いくつかで調整します）は、0.1なら角度ついた感じ、0.3など増やしていくと角度が弱くなる印象です。ディスプレイメントマップがあるので＋で項目を追加して、ディスプレイメントマップをドロップして追加します。 保存すると凹凸が反映されました。 おお！ボコボコ！！ブループリントもテキストファイルの書き換えもいりませんでした。 凹凸がある状態。 凹凸がない状態。 以上簡単にue5でディスプレイメントマップ（displacement map）を追加する方法でした。 ただし実験的な機能なようなので、すべてが正しく動くか未検証です。 またue5.4などでは新しいディスプレイメントマップの代わりになる機能が追加されたり、パララックスオクルージョンマッピングを使うなどいろいろな方法があるようで、まだまだ定まらない機能なのかもしれません。"
  },
  {
    "title": "UE5のマテリアル設定（テクスチャー）でノーマルマップ (Normal Map)、ラフネスマップ (Roughness Map) の強さを数字で変更する方法を紹介",
    "url": "/blog/ue5-nomalmap-henkou/",
    "description": "UE5のマテリアル設定（テクスチャー）で、ノーマルマップ (Normal Map)、ラフネスマップ (Roughness Map) の強さを数字で変更する方法を紹介します。簡易な調整になりますがノーマルマップ の画像を変更せずに、影の濃さなどを簡単に調整できます。\nまず石柄の3つのテクスチャーを用意しました。ディフューズマップ (Diffuse Map)、ノーマルマップ (Normal Map)、ラフネスマップ (Roughness Map) です。",
    "tags": [
      "UE5",
      "テクスチャー"
    ],
    "date": "2024年6月30日19時32分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 静的メッシュの法線インポートオプションとマテリアル ui は ue の版で変わります。該当バージョンのインポート設定を確認してください。 dcc 側の法線・接線スペースと ue の前提がずれると縫い目やライティング不整合が出ます。エクスポートプリセットを再確認してください。 ノーマルマップの圧縮設定はターゲットプラットフォームで推奨が異なります。 ue5のマテリアル設定（テクスチャー）で、ノーマルマップ (normal map)、ラフネスマップ (roughness map) の強さを数字で変更する方法を紹介します。簡易な調整になりますがノーマルマップ の画像を変更せずに、影の濃さなどを簡単に調整できます。 まず石柄の3つのテクスチャーを用意しました。ディフューズマップ (diffuse map)、ノーマルマップ (normal map)、ラフネスマップ (roughness map) です。 マテリアルにそれぞれを設定します。 今回使用したラフネスマップ (roughness map) は、赤いです。赤いラフネスマプは、何かrgbaにラフネス以外も割り当てされているのかなと思っています。もっと正しい使い方があるのかもですが、知識不足ですいません。 たぶんrに白黒のラフネスマップがあるようにみえます。 ということでrからラフネスマップに接続しました。 設定1と設定2を作りました。今は同じものです。これから設定を変えてゆきますので、比較となるように1と2を作りました。玉の数でわかるようにしています。設定を変更してゆくのは2のほうです。 マテリアルの設定2にて、ラフネスマップ (roughness map)とノーマルマップ (normal map)の強さを変更できるようにノートを作ってテストしてみたいと思います。右クリックで、powerと検索して追加します。 expを0ならラフネスなし、1はそのまま、それ以上は効果が強くなります。 0ラフネスなしです。 10でかなり強くしてラフネスの効果を確認できました。これでちょうどよいバランスに簡単に変更できます。 次はノーマルマップの強度を変更できるようにしてみます。flatと検索してflatennomalを追加します。 次にoneminusを追加します。 constantを追加します。 以下のようにノードを繋げます。これで1ならそのままのノーマルマップ、それ以上ならノーマルマップが強くなります。 まずはそれぞれ1にします。 設定1と2を比較します。同じように見えます。 ノーマルマップを2に強化します。色が変わりました。 ライティングなしにすると、同じ色であることが分かります。ライティングの影響により色見が変わったのです。 拡大してみると、影の要素の濃さが変わったことが分かります。ノーマルマップの強さ＝影の濃さ＝凹凸の表現という理解でよいのかな？たぶん。つまりノーマルマップを強くすればするほど、影の表現が強くなり、凹凸が強化されるという理解になりました。 1.5ぐらいが良い感じかな。 以上で簡単にラフネスとノーマルマップの強さをコントロールできるようになりました。簡単でよいです。全体を作りながらテクスチャーの凹凸感を手軽に調整できるのは便利ですね。 マテリアルインスタンスを併用しても便利でしょう。"
  },
  {
    "title": "2つの3Dモデルの位置ズレを解消！CloudCompareを使った精密位置合わせガイド、3Dモデルをぴったり重なるように合わせる方法を紹介",
    "url": "/blog/fix-misaligned-3d-models-with-cloudcompare/",
    "description": "このブログでは、CloudCompareを使用して2つの3Dモデルの位置ズレを解消する方法を紹介します。特徴点を比較し、精密に位置を合わせる手順をわかりやすく解説します。フォトグラメトリや他の3Dソフトウェアで作成したモデルの位置合わせに役立つガイドです。",
    "tags": [
      "その他"
    ],
    "date": "2024年6月30日15時31分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 cloudcompare はバージョンでメニュー名・アイコン配置が変わります（ edit → normals など）。 本文で触れている 整列ダイアログの「初期で reference / aligned が逆になる」挙動 は、バグ修正や設定変更で変わっている可能性があります。常に どちらのメッシュが動くか を確認してください。 点群とメッシュのバージョン差・ファイル形式によっては、同じ手順でも結果が異なる場合があります。 cloudcompare（クラウドコンペア）を使って、2つの3dモデルを精密に位置合わせをする方法を紹介します。主体となる3dモデルの位置に、別の3dモデルをぴったり重なるように合わせる方法です。cloudcompareは3d点群データとメッシュデータの処理や解析ができるオープンソフトウェアです。 フォトグラメトリなど3dモデルを作る場合、複数のソフトウェアを使うことが多いです。いろいろな3dデータをやり取りするうちに、時間をかけて作った修正済みの3dモデルのサイズや位置が、微妙（もしくは大きく）にズレてしまうことがあります。手動で合わせようとして、サイズと位置が異なると合わせるのが至難の業です。 cloudcompareで2つの3dモデルの特徴点を比較して、位置を合わせて、さらに細かく調整することで、同様の位置に合わせることができます。主体の3dモデルの位置は動かさずに、もう一つの3dモデルの位置を移動させます。 cloudcompare https://www.danielgm.net/cc/ cloudcompareは各種osに対応しています。今回は、windows版をダウンロードしてインストールします。 fileを選択します。 2つの3dモデルを選択します。位置を動かさないモデルと、位置を動かして重ねたいモデルの名称を明確にすることが重要です。今回はmaster-modelが位置を動かないモデル、modelが修正済みで位置がずれてしまい位置を動かして重ねたいモデルです。 取り込むと形状が分からない緑色になります。見やすくするために2つのモデルを選択します。 2つのモデルを選択しながら、edit、normals、computeを選択します。 pre-vertexを選択します。 画面は、本当にちょっとだけ2つのモデルの位置が異なっています。プレビューではわからないほど少しです。2つのモデルを分かりやすいように位置を移動します。masterモデルは移動してはいけません。要注意です。移動したいモデルを選択して、赤い矢印のアイコンをクリックします。 分かりやすいように上に移動しました。 右上に位置を確定するチェックボタンがあります。クリックして確定します。 2つのモデルの特徴点を選択して比較するデータを作ります。2つのモデルを選択して、青と赤のアイコンをクリックします。 ここで注意が必要です。select to be aligned entities(整列するエンティティ）を選択します。位置合わせで移動したい方を選択します。 対象となる特徴的な部分を選択して、同じ位置を選択するとa0：r0といった感じに特徴点が追加されます。最初にto be aligned entities（整列するエンティティ）、そのあとにreference entities（リファレンスするエンティティ）を選択します。 複数の地点を選択できたら、alignをクリックします。 位置合わせがokなら、チェックをクリックして確定します。 okを押します。このあとより細かく位置合わせをします。 二つのモデルを選択します。 緑と赤が重なったアイコンを選択します。 ここが要注意です。ソフトウェアのバグなのか、初期設定で逆配置でモデルが設定されます。to be aligned（整列する方）に、マスターモデルが来ないようにします。マスターを移動すると位置が合いません。混乱するのでよく確認します。 配置が逆であることが認識できたらswapボタンをおします。 正しい位置にモデルが配置できました。referenceにマスターモデルが来るようにします。わかりやすいファイル名が重要です。okボタンを押します。 さらに細かくに位置を合わせる処理が開始されます。 より正確に位置合わせが完了しました。同様の処理を2回程度おこなうとより良いようです。2回実施しました。これでほぼ完璧に位置が合いました。2回目もモデルの位置が逆になるので要注意です。 位置を移動したモデルは、リネームされます。2回実施したのでregistered,registeredとなっています。 モデルを選択して、保存アイコンを押します。obj等で書き出して完了です。 フォトグラメトリなどでは、写真から構築した3dモデルを修正しないと使い物になりません。修正したモデルを元に戻して、テクスチャーを貼る作業をします。その途中に位置がズレてしまうとやり直さなければいけませんでした。この方法を使えば、位置を再び合わせることができるので、やり直しが大変な場合は有効な手段になるかもしれません。"
  },
  {
    "title": "商用OK完全無料の3DモデルをPoly HavenからDLしてUE5に取り込んで使ってみよう！",
    "url": "/blog/3dmodels-free-ue5/",
    "description": "3Dアセットや3Dモデルを無料で配布しているPoly Havenの3Dモデル素材を実際に使ってみます。Poly Havenは無料でありながらクオリティがとても高いのが特徴です。Poly Havenについて詳しく見てみましょう。",
    "tags": [
      "blender",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年6月23日14時44分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 無料モデルサイトのライセンス（クレジット表記・商用可否・改変可否）はアセットごとに異なります。ダウンロードページの最新規約を確認してください。 ue のインポートパイプライン（fbx / gltf）とマテリアル自動生成は版で挙動が変わります。 記事で挙げたサイトの url 構成や検索 ui は変更されることがあります。 3dアセットや3dモデルを無料で配布しているpoly havenの3dモデル素材を実際に使ってみます。poly havenは無料でありながらクオリティがとても高いのが特徴です。poly havenについて詳しく見てみましょう。 poly haven https://polyhaven.com/ poly havenの読み方は、ポリーヘブン（もしくはヘイブン）でしょうか。poly havenは非営利団体で高品質な3dアセット、テクスチャ、hdriを無料で提供し、アーティストや業界全体の発展に貢献するというコンセプトのようです。 **何よりも凄い点が、すべてクリエイティブ・コモンズのcc0ライセンスで素材が提供されていることです。 **cc0ライセンスとは、no rights reservedとして作品の著作権者は著作権を放棄して、事実上パブリックドメインに近い状態にしています。 パブリックドメインを日本語にすると公共領域のことであり、著作権や特許権などの知的財産権が存在しない、またはそれらの権利が失効または放棄された作品や情報のことを指します。 パブリックドメインに属する作品は、誰でも自由に使用、再配布、改変することができ、その利用に際して著作権者からの許可を得る必要がありません。 これにより誰でも何の制限もなく、商業的利用を含めてその作品を自由に使用、変更、再配布できます。 つまりpoly havenの3dアセット素材を全部dlして、かってに再販することだって可能です。 素材配布サイトは再配布を禁止しているところがほとんどなので、すごいことですよね。 実際にそのようなことをする場合は、倫理的な問題となります。 より詳しく確認したい場合はライセンスを参照ください。 またpoly havenを支援することに興味があれば、早期アクセス有料会員、blender add-on、スポンサーなどの支援も可能です。 https://polyhaven.com/license https://polyhaven.com/about-contact https://www.patreon.com/polyhaven poly havenから3dモデルをダウンロードしてue5で使ってみよう poly havenにアクセスして、3dモデルをクリックします。 まだ3dアセットの数は少なく347個あるようです。3dモデルは岩や木、古めの家具などが多いです。低品質な寄せ集めの3dアセットではなく、それぞれ完璧ともいえる3dモデルです。いろいろな用途に活用できそうですね。 この3dモデルをダウンロードしてみましょう。 テクスチャーサイズは4kです。 ファイルは、blender形式の中心に複数用意されています。 いろいろなマップもあります。 ダウンロードするとブレンダーのファイルとテクスチャーフォルダが表示されました。 マップは、diffuseマップ、normalマップ、roughnessマップ、metalマップなど。 blender上で表示してみました。 ue5に取り込むためfbxで書き出します。 fbxでドロップします。 いくつかエラーが出ていますが気にするほどではなさそう。 机のそれぞれのパーツが取り込まれました。このモデルは複数構成でできているようです。 テクスチャーでエラーが出ていました。 テクスチャーファイルを再び取り込み、それぞれのリンク先に接続しました。 ue5でこんな感じ。 位置をすべて0に合わせると、家具がセットの位置に収まりました。 すばらしい3dモデルです。すばらしい！ ちょっとテクスチャーを変更してみましょう。 扉の模様を変更したり。 大理石風に変更したりできます。これもuvマップなどの品質が素晴らしいので、変更も簡単にできそうです。 このような品質を持つ3dモデルがすべて無制限で無料という素晴らしい結果でした。"
  },
  {
    "title": "Unreal Engine 5のHDRI Backdropの使い方とメリット | 簡単リアルライティング",
    "url": "/blog/unreal-engine-5-hdri-backdrop/",
    "description": "unreal engine 5のHDRI Backdrop（High Dynamic Range Image バックドロップ）は、360°エクイレクタングラ形式のHDR画像を背景として利用します。背景画像を環境光として扱えるため、複雑な設定なくリアルなライティングを簡単に再現できます。\n全天球に最適なエクイレクタングラ形式を使いますが、宙に浮いた映像ではなく地面に影を落とす使い方をすることが多いでしょうから半球的なドームもしくはキューブマップを利用することになります。EnviroDome、EnviroBoxSharp、EnviroBoxなどが用意されています。",
    "tags": [
      "HDRI",
      "UE5"
    ],
    "date": "2024年6月23日13時50分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 hdri backdrop・スカイライト・露出まわりの ui は ue の版で移動・改名されることがあります。該当リリースのドキュメントを参照してください。 hdr テクスチャの色空間（aces / ocio の有無）はプロジェクト設定に依存します。版ごとのカラー設定を再確認してください。 背景球のスケールやシャドウの扱いはレンダリングパスで差が出ます。記事は特定の ue 版前提です。 unreal engine 5のhdri backdrop（high dynamic range image バックドロップ）は、360°エクイレクタングラ形式のhdr画像を背景として利用します。背景画像を環境光として扱えるため、 複雑な設定なくリアルなライティングを簡単に再現できます。 全天球に最適なエクイレクタングラ形式を使いますが、宙に浮いた映像ではなく地面に影を落とす使い方をすることが多いでしょうから半球的なドームもしくはキューブマップを利用することになります。envirodome、enviroboxsharp、enviroboxなどが用意されています。 hdri backdropを使うメリット レンダリング品質の向上 ：hdri backdropを使うことで、背景にリアルな環境の光を反映することができます。これにより、レンダリングされたシーンのリアル感が向上し、より美しい結果を得ることができます。 レンダリング時間の短縮 ：hdri backdropを使うことで、背景のライティングを手動で設定する必要がなくなります。そのため、レンダリング時間が短縮されます。 ワークフローの改善 ：hdri backdropは、プロジェクトに必要な背景のイメージを直接インポートできます。これにより、プロジェクト内で必要な作業時間を短縮し、ワークフローを改善することができます。 柔軟性の向上 ：hdri backdropは、光源としても使用できます。また、調整可能なパラメーターを備えているため、シーンに最適なライティングを調整することができます。 unreal engine 5.3ドキュメント hdri backdrop ビジュアリゼーション ツール 細かい説明はドキュメントを参考 https://dev.epicgames.com/documentation/ja-jp/unreal-engine/hdri-backdrop-visualization-tool-in-unreal-engine?application_version=5.3https://docs.unrealengine.com/5.1/ja/hdri-backdrop-visualization-tool-in-unreal-engine/ hdri backdropセットアップ 編集→プラグイン→rendering→hdribackdropにチェックを入れます。 hdri backdrop環境構築 新規で空のレベル（何も入っていない状態）を選択します。左上メニューにある追加ボタンから、すべてのクラス→hdri backdropを選択ドロップします。 ※以下動画は、「すべてのクラス→hdri backdrop」からではなく、過去の履歴からhdri backdropを選択していますが、「すべてのクラス」から探すとできます。 ※すべてのクラス→hdri backdrop hdri backdrop用のhdr画像の作成 32bitのhdr形式が必要です。32bitのhdr形式になっていない場合は、例えばphotoshopなどで開き変更できます。 イメージ→モード→32bitに設定します。ファイル別名で保存にて、hdrで保存します。コンテンツブラウザーにドロップしてそこから、hdri backdropの詳細にあるマップ画像エリアにドロップします。すべて保存をすることで確定されます。 hdri backdrop用の歪みを無くす 配置が中央になっていない場合は、360°エクイレクタングラー形式の歪みが発生します。例えばカメラを選択します。xとyの位置を0にします。カメラの高さは、エクイレクタングラー形式画像のカメラの高さに合わせるとよいでしょう。※hdri backdropの位置もゼロに、高さは適宜です。 もしくはhdribackdropの詳細設定にある**「use camera projection」**にチェックを入れてください。これにチェックを入れると、必ずカメラがエクイレクタングラーの正しい位置から見た映像になります。用途に合わせて違和感が少ない馴染む方を使うとよいでしょう。 hdri backdropのメッシュは３種類 詳細のmeshからメッシュを変更できます。enviroと検索することで候補が出てきます。envirodome、enviroboxsharp、enviroboxの3種類です。壁がある環境ならbox、広い場所ならdomeを使います。検索で出てこない場合は、設定からエンジンのコンテンツを表示を選択します。 envirodome、enviroboxsharp、enviroboxでそれぞれ光の反映が異なります。使っているhdriによって効果が異なるでしょう。例えばenviroboxだと逆光が強くなりました。メッシュのドーム自体のサイズを変更することでも印象が変わります。 enviroboxsharpだとこんな感じに変化しました。 envirodomeだとさらにソフトな感じになりました。ちょっと印象が変わります。それぞれ試してお好みがよいでしょう。 hdri backdropのドロップシャドウ調整設定 lightings distance factorを5にすると、地面に強くドロップシャドウが発生します。 0にすると影が少なくなります。 無理やりhdri backdropに追加影シャドーを設定する方法 diretionallightやskylightを追加することは基本的には推奨されていませんが、意図的に影を追加したい場合には有効でしょう。例えばdiretionallightで影を落とします。太陽からの直射です。 skylightで空からの反射光（影部分にあたる光）を設定します。とりあえずこの2つを設定することで、光が当たる部分と影の明るさや色、光が当たらない部分の影の明るさや色を設定できます。 hdri backdropの明るさを調整 hdri backdropのintensityで背景自体の発光を調整できます。 hdri backdropの照明だけではなく、もうちょっとなんかしたいときには無理やりdiretionallight、skylightのintensityで影の明るさや、ホワイトバランスなど調整できます。 **これをやるとhdri backdropを使う意味がない？という気もしないでもありませんが、**diretionallight、skylightを入れないと、なんか光の具合が上手くゆきません。 我の技術が足りてないからでしょう。 結局diretionallight、skylightなど入れてゆくとよい感じになります。 hdri backdropだけでどうやってうまく管理するのだろう。 hdri backdropの真の解像度を引き出す設定 ドキュメントにhdri backdropの最高の解像度を引き出す設定が紹介されています。この設定をしなくても元の画像と同じ解像度で見れたので不要なのかもしれません。hdriをbackdropに設定します。 cubemapをダブルクリックして、設定画面に入ります。 16384が最大の解像度であれば、ミップ全般設定を nomipmaps に変更します。そしてしばらく待ちます。処理が終わったらnum cinematic mip levels に 16384 と入力して保存します。"
  },
  {
    "title": "商用OK完全無料のPBRマテリアルテクスチャーをPoly HavenからDLしてUE5に取り込んで使ってみよう！",
    "url": "/blog/free-pbr-poly-haven/",
    "description": "Poly HavenからPBRテクスチャーをダウンロードしてUE5で使ってみよう\nPoly Havenにアクセスして、Texturesをクリックします。",
    "tags": [
      "blender",
      "UE5",
      "テクスチャー",
      "作ったもの"
    ],
    "date": "2024年6月22日23時28分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 poly haven のダウンロード ui・素材セットの構成（付属マップ名）は更新で変わります。 blender のエクスポート（fbx）→ ue5 インポート 時の normal / roughness の誤リンク は依然よくある話ですが、blender・fbx・ue の版の組み合わせで挙動が変わります。 マテリアルエディタの texturecoordinate・custom rotator まわりのノード配置は ue5 のバージョンで ui が異なる場合があります。 cc0・非営利の説明 は、現在の公式 about / license と突き合わせるのが安全です（組織・提供形態の変更に注意）。 pbrマテリアル（physically based rendering material、物理ベースレンダリングマテリアル）テクスチャーを無料で配布しているpoly havenのテクスチャー素材を実際に使ってみます。 poly havenは無料でありながらクオリティがとても高いのが特徴です。 poly havenについて詳しく見てみましょう。 poly haven https://polyhaven.com/ poly havenの読み方は、ポリーヘブン（もしくはヘイブン）でしょうか。poly havenは非営利団体で高品質な3dアセット、テクスチャ、hdriを無料で提供し、アーティストや業界全体の発展に貢献するというコンセプトのようです。 **何よりも凄い点が、すべてクリエイティブ・コモンズのcc0ライセンスで素材が提供されていることです。 **cc0ライセンスとは、no rights reservedとして作品の著作権者は著作権を放棄して、事実上パブリックドメインに近い状態にしています。 パブリックドメインを日本語にすると公共領域のことであり、著作権や特許権などの知的財産権が存在しない、またはそれらの権利が失効または放棄された作品や情報のことを指します。 パブリックドメインに属する作品は、誰でも自由に使用、再配布、改変することができ、その利用に際して著作権者からの許可を得る必要がありません。 これにより誰でも何の制限もなく、商業的利用を含めてその作品を自由に使用、変更、再配布できます。 つまりpoly havenのテクスチャー素材を全部dlして、かってに再販することだって可能です。 素材配布サイトは再配布を禁止しているところがほとんどなので、すごいことですよね。 実際にそのようなことをする場合は、倫理的な問題となります。 より詳しく確認したい場合はライセンスを参照ください。 またpoly havenを支援することに興味があれば、早期アクセス有料会員、blender add-on、スポンサーなどの支援も可能です。 https://polyhaven.com/license https://polyhaven.com/about-contact https://www.patreon.com/polyhaven poly havenからpbrテクスチャーをダウンロードしてue5で使ってみよう poly havenにアクセスして、texturesをクリックします。 このテクスチャーを壁として使います。 右からダウンロードします。 blenderを基本的に使うみたいですね。まあテクスチャーだけあればue5上でテクスチャーを自分で設定してもよいでしょう。せっかくですからblenderで開いてfbxファイルで書き出します。 exportからfbxファイルとして書き出します。fbxならファイルにテクスチャーも含まれるのでシンプルです。 ue5を起動します。書き出したfbxをコンテンツブラウザーにドロップします。 fbxをインポートすると、マテリアルとテクスチャーが取り込まれました。 テクスチャーを見ると左からdiff、nor、roughとなります。dlする素材によって、付属するテクスチャーの構成も変わります。今回dlした素材に関してはこの3つで構成されていました。それぞれdiffuse、normal、roughnessのですね。 ソフトウェアなどによってマップの名称はさまざまです。diffuseマップとは、base colorやalbedoともいいます。基本色のことです。 normalマップは、物体の表面の微細な凹凸をシュミレーションするマップです。リアルなディテールを加えるために使用されます。法線マップともいいます。たぶん同じもの？ roughnessマップは、表面の粗さを示します。この値が高いほど表面は粗く、光を広範囲に散乱させ、低い値では光をより集中して反射します。 次はマテリアルをクリックします。 なぜかnormalマップとroughnessマップがエラーです。blenderから取り込むとよくあることです。 roughnessマップがなぜかメタリックにリンクされていたりもしました。 テクスチャーをマテリアルに張り直します。 リンクもやり直します。roughnessマップをちゃんとラフネスに接続しました。blenderを経由しないでマテリアルを作って、テクスチャーを取り込む方法でもよいでしょう。blenderの正しい書き出し方法もあるのかもしれません。マテリアルを保存します。 キューブを作ってマテリアルをドロップすれば、テクスチャーが反映されます。 壁を作りたいので横長にキューブを変形します。1：10：5にしました。厚み1m、高さ5ｍ、幅10mの壁です。壁が横に引き伸ばされているのが気になりますね。マテリアルの編集に戻ります。 texturecoordinateを追加します。 テクスチャーのuvsに接続します。texturecoordinateは、uvの縦と横の比率を設定できます。 utilingsを1の場合 utilingsを2の場合、横に引き伸ばされました。こんな感じに希望するバランスに調整できます。 しかし、キューブを無理やり変形しているので、テクスチャーのバランスがおかしいことになっています。これはキューブを変形してもuvマップは正方形の比率のままなので、バランスが悪くなってしまうのです。 1：10：5に設定してバランスが良かったので、厚み1m、高さ5ｍ、幅10mの壁が欲しいとします。同じようにブレンダーでキューブを配置して、スケールを設定します。 適用からスケールを選択すると、スケールが実際のサイズとして提供されます。 これで厚み1m、高さ5ｍ、幅10mのオブジェクトになりました。 uvマップもそれに合わせて作成します。モデリングで全選択します。 スマートuv投影します。このあたりのやり方は、さまざまな方法があるでしょうから、好きな方法を選んでください。 uv編集を見ると、サイズに合わせたuvマップが作成されました。 書き出し取り込みました。fbxではなくobjで書き出したので、スケールを50倍にする必要がありました。また90°回転が入っています。fbxと違ってobjはスケールや向きの認識に違いがあることが多いです。 側面も正しい倍率に改善されました。ハッピーですね。 しかし面が90°回転しています。困ったものです。 またマテリアルを開いてcustom rotatorを追加します。これはuvを回転することができます。constantも追加して以下のようにつなげます。constant 0が0°、1が360です。0.25入力することで90°回転します。 以下のように数値を適当にいれました。 ノードは全体的にこんな感じです。 以上で意図するようにコントロールできるようになりました。めでたしめでたし。 でもここを横にしたいです。どうしたらよいんだろう。90°回転したから上にくる部分が横にきてしまい、このような結果に。。"
  },
  {
    "title": "商用OK完全無料のHDRI（High Dynamic Range Images）を無料で配布サイトPoly Havenから、実際にHDRIをDLしてUE5に取り込んで背景に使ってみよう！",
    "url": "/blog/free-hdri-ue5-tukaikata/",
    "description": "HDRI（High Dynamic Range Images）を無料で配布しているPoly HavenのHDRI素材を実際に使ってみます。Poly Havenですが無料で配布かつクオリティがとても高いのが特徴です。Poly Havenについて詳しく見てみましょう。",
    "tags": [
      "HDRI",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年6月22日13時48分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 poly haven のサイト構成・解像度オプション・**アーリーアクセス（会員向け）**の扱いは変更されうるため、ダウンロード ui は記事と異なる場合があります。 ue5 の hdribackdrop プラグイン の有効化手順やアクター配置はエンジンバージョンで差が出ます。 cubemap にドラッグできない hdr を photoshop で 32bit 再保存する回避策は、adobe 側の仕様変更で挙動が変わる可能性があります。 **ライセンス（cc0）**の解釈は最新の polyhaven.com/license で確認してください（運営・blenderkit 関連のニュースも参照）。 hdri（high dynamic range images）を無料で配布しているpoly havenのhdri素材を実際に使ってみます。poly havenですが無料で配布かつクオリティがとても高いのが特徴です。poly havenについて詳しく見てみましょう。 poly haven https://polyhaven.com/ おまけ：日本のhdri素材配布サイトopenreelもありました https://openreel.org/ poly havenの読み方は、ポリーヘブン（もしくはヘイブン）でしょうか。poly havenは非営利団体で高品質な3dアセット、テクスチャ、hdriを無料で提供し、アーティストや業界全体の発展に貢献するというコンセプトのようです。 **何よりも凄い点が、すべてクリエイティブ・コモンズのcc0ライセンスで素材が提供されていることです。 **cc0ライセンスとは、no rights reservedとして作品の著作権者は著作権を放棄して、事実上パブリックドメインに近い状態にしています。 パブリックドメインを日本語にすると公共領域のことであり、著作権や特許権などの知的財産権が存在しない、またはそれらの権利が失効または放棄された作品や情報のことを指します。 パブリックドメインに属する作品は、誰でも自由に使用、再配布、改変することができ、その利用に際して著作権者からの許可を得る必要がありません。 これにより誰でも何の制限もなく、商業的利用を含めてその作品を自由に使用、変更、再配布できます。 つまりpoly havenのhdriを全部dlして、かってに再販することだって可能です。 素材配布サイトは再配布を禁止しているところがほとんどなので、すごいことですよね。 実際にそのようなことをする場合は、倫理的な問題となります。 より詳しく確認したい場合はライセンスを参照ください。 またpoly havenを支援することに興味があれば、早期アクセス有料会員、blender add-on、スポンサーなどの支援も可能です。 https://polyhaven.com/license https://polyhaven.com/about-contact https://www.patreon.com/polyhaven poly havenからhdriをダウンロードしてue5で使ってみよう poly havenのサイトにアクセスします。hdrisをクリックします。 サムネイルを見て気に入ったものを選択します。新着は会員のみアーリーアクセスできるようですね。 左上のタブを見てみましょう。作品によってこれら選択できる項目は若干異なります。まず解像度ですが、16kが基準になっています。16k以上を選択できるものもあります。 ファイル形式ですがexrとhdrなどが選べます。同じような情報量の多いフォーマットです。exrファイルのほうが扱いやすければexrを、特にこだわりがなければhdrを選べばよいです。 矢印を選択すると、補足情報的なものを見れます。この作品の場合はカラーチャートが入っていました。 今回、8kでhdrでダウンロードします。 ue5を開いて新規レベルで、空のレベルを作ります。 プラグインからhdribackdropが有効になっている確認しましょう。 アクタを配置項目から、すべてのクラス、hdribackdropを選択します。 dlしたhdrをコンテンツブラウザーに取り込みます。 hdribackdropを選択して、テクスチャーをcubemapにドロップします。 ※もしここでcubemapにドロップ/適用できない場合は（たまにある）、フォトショップなどで開いて、32bitのhdrで再保存するとドロップできるようになります。 photoshopで開きイメージモード→32bitにします。 ファイル別名で保存で、hdr拡張形式で保存します。 コンテンツブラウザーにドロップしてそこから、hdri backdropの詳細にあるマップ画像エリアにドロップします。 すべて保存をすることで確定されます。 cubemapに適用されました。 hdriが適用されたので、hdri画像のダイナミックレンジの広さを体験してみましょう。 hdri（high dynamic range imaging）は、広い光の範囲を捉えることができる技術で、明るい部分と暗い部分の詳細を失わずに記録します。 この技術は3dモデリングや映画製作でリアルな照明効果を再現するのに使われ、ビジュアルエフェクトのリアリズムを向上させます。 大抵のhdriは、モニター表示できる明るさより、さらに広い範囲の明るさを持っています。intensityを1.0から下げてみましょう。 0.1にしてみると、白く飛んでいた太陽の周りまで色が出てきました。このように明るさを自由に調整できます。素晴らしいですね。背景用途に合わせて、このように適宜調整ができるのがhdriの魅力です。 こんな感じに明るさを調整できます。"
  },
  {
    "title": "実機レビュー2023年Vivobook Pro 16X OLED K6604JI、3か月使った良い点・悪い点、分解して増設もOK",
    "url": "/blog/vivobook-pro-16x-oled-k6604ji/",
    "description": "ASUS Vivobook Pro 16X OLED K6604JI (K6604JI-MX099W)の実機レビューです。3か月実際に使いました。良い点、悪い点など評価をお伝えいたします。また記事後半では、分解してメモリとストレージを増設する方法も紹介します。ASUS Vivobook Pro OLEDモデルを購入しようと考えている方は参考にどうぞ。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年6月17日13時54分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 k6604ji など型番ごとの仕様・bios・ドライバは asus 公式で更新されます。購入前は最新の仕様表を確認してください。 oled の省電力・焼き付き対策まわりの os 設定はアップデートで挙動が変わる場合があります。 価格・同梱品・販売チャネルは時期により変わります。記事の購入情報は参考程度にしてください。 asus vivobook pro 16x oled k6604ji (k6604ji-mx099w)の実機レビューです。 3か月実際に使いました。 良い点、悪い点など評価をお伝えいたします。 **また記事後半では、分解してメモリとストレージを増設する方法も紹介します。 **asus vivobook pro oledモデルを購入しようと考えている方は参考にどうぞ。 2023年9月にasus vivobook pro 16x oled k6604ji (k6604ji-mx099w) を購入しました。 発売日は2023年5月26日です。 価格は329,800円 （税込）ですが、**セール中で257,800円 （税込）で購入できました。 **core i9-13980hx+rtx4700に構成で26万円台は安いです。 追記2024/06/17：**amazonでは在庫が再入荷したようです。**今思うと当時は本当に安い価格で買えたものです。ラッキーでした。 https://www.amazon.co.jp/dp/b0c332kdj2 なぜかk6604ji-mx099wは、品切れ中が続いています。今は2023年12月ですがメーカ直販ページでは、在庫ありと表示されているものの、**購入ボタンがなく購入できません。**セール後に購入ができない状態が続いているので終息したのでしょうかね。良いノートパソコンなのに不思議ですね。 https://jp.store.asus.com/store/asusjp/ja_jp/pd/productid.5759538400 スペックはこんな感じです。asus vivobook pro 16x oled k6604ji (k6604ji-mx099w) 発売日：2023年5月26日 329,800円 （税込） インチ : 16.0型（120hz） cpu : インテル® core i9-13980hx os : windows 11 home メモリ : 32gb/64gb（標準/最大） ストレージ : ssd : 1tb オフィス : wps office 2 グラフィックス : nvidia® geforce rtx 4070 ノートパソコン選定の旅路 2週間ぐらいノートパソコンを探しました。映像を処理するのでgpuは必須です。ある程度は持ち運べる必要があります。経験から3kgのノートパソコンを持ち運ぶと背骨が歪みます。最大で2kgまでです。acアダプターの重さは黙認します。14インチはモニターが小さすぎ、17インチはデカすぎ、15～16インチの条件です。 **ノートパソコンの最大の悲しみは、数年で価値が無くなることです。 **超ハイエンドノートパソコンに50万、60万、70万とお金を注ぎ込みたい気持ちはありますが、2年で価値が半減で済めばよいほうです。 5年も経てば1/10の価格です。 **お金の無駄です。 **2023年時点におけるノートパソコンの最強gpuはrtx4090です。 モバイル版4090は、デスクトップ4080～4070性能しかありませんが、それでもズバ抜けた性能を持ちます。 条件さえ合えば・・・・と思いがよぎりますがrtx4090を搭載したノートパソコンは、3kgクラスが多く背骨が曲がります。サイズも大きいです。 https://kakaku.com/pc/note-pc/itemlist.aspx?pdf_spec119=59&pdf_so=p2 変ったもので2.5kgで水冷タイプのノートパソコン（daiv n6-i9g90bk-a）もありますが、別売りの水冷ユニットがないと、どのくらい性能が落ちるのか気になるところです。4090搭載で2.5kgでこの価格ならなかなか。。。。か、キワモノか？ 中には2.5kgのrtx4090を搭載したノートパソコンがあります。。。。予算を気にしないなら blade 16 rz09-0483ujj4-r3j1 なんか良い感じです。 https://www.razer.com/jp-jp/gaming-laptops/razer-blade-16 4090を選択すると67万です。このスペックで重さが2.4kgとは驚愕です。ぐぬぬ。。ほしいですね。まあ高すぎ。 rtx4070になると重さも軽量になり、2kg以下が増えてきます。 価格も30万円以下の製品も増えます。 **asus vivobook pro 16x oled k6604ji (k6604ji-mx099w) の重さは2.18kgです。 **cpuも第13世代 インテル core i9 13980hx(raptor lake) 24コアです。 cpuが最上位機種であるのはうれしいです。 https://kakaku.com/pc/note-pc/itemlist.aspx?pdf_spec119=61&pdf_so=spec303_a セールがなければ、rtx4060系を選んでいました。rtx4060系なら20万以下のものをチラホラ。 このrtx4060系のラインが一番お得なところでしょうね。 https://kakaku.com/pc/note-pc/itemlist.aspx?pdf_spec101=54&pdf_spec119=62&pdf_so=p1 実際にrtx4060とrtx4070の性能の違い（共にノートパソコン用）は、10%程度か15%ぐらいでしょうかね。 rtx 4070 mobile vs rtx 4060 mobile（比較ページ） 一番売れるメインストリームが台数も出るでしょうから価格的にも競争が多く、一番お買い得になっていることを考えると素直に4060系を買うのが無難でしょう。 4070系は中途半端でクソみたいなラインアップかもしれませんね。 asus vivobook pro 16x oled k6604ji 特徴 k6604jiの特徴を紹介しますが、**基本的なレビューは以下サイトが素晴らしいです。**さすが専門メディアです。 https://pc.watch.impress.co.jp/docs/column/hothot/1514892.html https://thehikaku.net/pc/asus/23vivobook-pro-16x.html https://ascii.jp/elem/000/004/142/4142409/ 続いて、**ざっと素晴らしい基本的な点を箇条書きしてゆきます。**ノートパソコンの性能としては文句なしです。 ・core i9-13980hx プロセッサー 現時点の最強のノートパソコンcpuなので文句なし ・32gbメモリ ノートパソコンにしては多いほうなので文句なし ・16.0型 oled (有機el) 3,200×2,000ドット (120hz) hdr対応の高輝度有機elモニターであり、3,200×2,000ピクセルあるので文句なし ・nvidia geforce rtx 4070 デスクトップ版rtx4060相当ですがノートパソコンなので文句なし ちなみにasusとは台湾に本社を置く、国際的に認知されたコンピュータハードウェアおよびエレクトロニクス企業です。 その高品質なマザーボード、パーソナルコンピュータ、ノートパソコン、グラフィックカード、モニター、およびさまざまなコンピュータ周辺機器で特によく知られています。 ノートパソコンに関しては、asusは幅広い市場に対応する多様な製品ラインを提供しています。 **高性能ゲーミングラップトップの「rog」「tuf」シリーズ、一般消費者向けの「vivobook」「zenbook」シリーズなどを展開しています。 ** 最初はハイエンドな「rog」「tuf」シリーズで探していました。 しかし有機elディスプレイ搭載もモデルは「vivobook」「zenbook」シリーズに限られている ようで、specや重量を見てゆくと「vivobook」のほうが高性能で軽かったりするんです。 **「vivobook」がいいじゃんとなったわけです。 ** 悪かった点 asus vivobook pro 16x oled k6604ji 3か月利用して実際に良かった点と悪かった点を紹介してゆきます。 まず悪かった点から紹介してゆきます。 悪い点1.最悪の悪行、モニターがテカテカ、つやっつや・・ 有機elディスプレイの特性なのか、**つやつやのテカテカディスプレイしか用意されていません。**ノングレア（非光沢）モデルがないのです。グレア（光沢）のみです。**非光沢と勘違いして購入しました。**光沢モデルを好んで買う人は、 イカれていると思っています。 pda工房から同シリーズ向けの反射低減のフィルムを購入しました。対象型番ではないですが、サイズもぴったりです。これで見やすいノングレア（非光沢）モデルに変りました。しかも液晶面を保護されて安心です。発色や輝度は落ちているのかもしれませんが、全く気になりません。 https://www.amazon.co.jp/gp/product/b09rsj3mjj/ フィルムのサイズもぴったりで、良い感じにノングレアになりました。 悪い点2.テンキーの並びが・・・ これは許容の範囲です。 **テンキーをたくさん使う仕事の人は要注意です。 **よくあることですが、コンパクトにするためかテンキーの並びが独自です。 目視しながら入力しなければなりません。 数字の並びは同じですがテンキーやエンターやマイナスなどの位置があれです。 「.」の位置にエンターがあるので、100パーセント打ち間違えます。 **点したいのにエンター！！！となります。 ** 悪い点3.ファン音がでかい rtx4070を積んでいるので当たり前です。まったく問題ありません。静音性を優先する設定も可能です。性能を最大にするためには、ファン性能も最大にします。**負荷が発生するとシュゴーーーーーーーーーーーーーという大きな音が出ます。**むしろ好感触です。しっかり冷却される点は素晴らしいです。 asus vivobook pro 16x oled k6604jiの悪い点は、これくらいしかありませんでした。細かい部分も含めて全体的に使いやすくかなり好印象です。 良かった点 asus vivobook pro 16x oled k6604ji 3か月利用して実際に良かった点を紹介してゆきます。細かい部分やspec的な素晴らしい部分は、専門メディアによるレビューにまかせます。基本的な性能や仕様はどれも満足がゆくものです。 良い点1.ちゃんとしている有機elモニター asusの有機elモニターは色も正確です。明るさも616nitあります。ちゃんとしているのです。この性能を持つモニターを購入しようと探しても10万円以上はするのではと思うほどです。有機elモニターもさまざまで、輝度が低く（ニトとカンデラは同じ）500nitもない製品が多くあります。3kモニターというのもありがたい。 https://www.asus.com/content/asus-lumina-oled-laptop/ 616ニト、10bit、120hz、hdr、正式なhdr認定とすばらしい。 後半は映像が**暗くて良くわからないことで有名な「機動戦士ガンダム 閃光のハサウェイ」**もこのモニターで見ると、ちゃんと見えます。暗い画面でわちゃわちゃしているのが、見えるのです。 良い点2.asusのあんしん保証 **「どんな壊れ方でも」原因不問で対応するというあんしん保証が提供されます。**素晴らしい保証です。自分でノートパソコンを増設しても、メーカーの保証内として処理してくれるのです（違っていたらごめんなさい）。 ノートパソコン購入後にオンライン登録しておく必要がありますが、**無料のあんしん保証なら1年間の保証期間な内であれば、部品代金の20％で修理してくれるというものです。**３年間保証も高くはなく、かつ修理費用が無料になります。ありかもしれない。 良い点３.頑丈な感じ ノートパソコンの外側はプラスチックですが、**ミリタリーグレード米国軍用規格準拠の耐久テストを複数項目をクリアしているとのこと。**そんな感じなので丈夫な安心感があります。 金属っぽく見える底面も塗装がない面を見ると、プラスチックであることが分かります。質感って重要ですね。 分解！増設！ **あんしん保証があるので、安心してノートパソコンを分解できます。 **もし壊してしまっても部品代の20％で修理できるのですから、ありがたいサービスです。 普通は開封防止のワランティーシールがついて破ると無保証ですが、このasus vivobook pro 16x oled k6604jiには、そのような封印シールはありません。 **半ば黙認なのでしょう。 ネジを外します。 ** 吸盤を使ってバリっと底面パネルをはがします。最悪保証が効くので、気兼ねなく剥がす作業ができます。 これでストレージとメモリを交換し放題です。 撮影時にはすでにssd交換済みです。 ssdもメモリスロットも一般的な構造です。 メモリ増設が初めての場合は、どのようにロックされているか理解するまで、少し時間がかかるでしょう。 メモリは左右のフックを外すと、メモリがポップアップするので、抜き差しできます。 cpuやgpuが異なる型番が違うタイプは、中のボードも違うので、レイアウトが異なるようです。 ノートパソコンを分解するのに分解ツールを購入しておくとgoodです。安いものでも、それなりにしっかりしています。これは良いかいものでした。 https://www.amazon.co.jp/gp/product/b0ccydb6t4/ メモリは、プリンストンの32gb×2枚を購入しました。プリンストンは信頼のメーカですし適度に安いのでこれにしました。64gbメモリです。128gb欲しいところですが、空きスロットが2つだけなので仕方ありません。 タスクマネージャー上は4スロットありますが、ノートパソコンの仕様的に2スロットに削減されているのが残念です。**ちなみにメモリを交換すると初回起動だけ時間が数分？程度かかります。**壊れたか！！！！とビビるでしょう。※ビビッて2時間ぐらい抜き差し試行錯誤してしまいました。。。。ちょっと待てば動きます。 https://www.amazon.co.jp/gp/product/b0cgxmf573/ ストレージは、cfdのnvmeを購入しました。 4tbモデルです。 1tbだとちょっと少ないんですよね。 2tbならsamsungなど高信頼製品でも高くはないので、そのあたりでもよいでしょう。 crucialやlexarなどの4tbモデルも安いのですが、tbw（total bytes written）が低めだったりします。 あんまり耐久性がないということです。 cssd-m2l4ksft6keは、2400 tbwとまあまあ良さそうなのでこれにしました。 https://www.amazon.co.jp/gp/product/b0cf1zkjxc/ 残念なことcfdにはosクローンツールは付属しません。macrium reflect free trialsは無料で使えるのでお勧めです。パーティションを変更したりいろいろできます。 https://www.macrium.com/reflectfree https://note.com/combat_travor/n/n931acb354e2d ストレージ4tbで、メモリ64gbに拡張できました。素晴らしい。タスクマネージャを見ましょう。cpuはcore i9-13980hxで32スレッドです。 メモリは64gbになりました。128gbは欲しいですが、ノートパソコンとしては64gbあれば御の字です。 ssdは随分やすくなっています。4tbのssdです。実際に利用できる容量は3.7tbです。これだけあると容量を気にしないで使えます。 4070のgpuです。専用gpuメモリが8gbしかないので、もう少し欲しいところですが。。。 以上asus vivobook pro 16x oled k6604ji (k6604ji-mx099w) の購入3か月のレビューでした。 追記：2024年6月17日から見ると、今のパーツはずいぶん値上がりしています。当時買ってよかった！今も順調に使っています。この最新世代のcpuはとても性能が高く満足です。"
  },
  {
    "title": "RealityCapture のAlignment Settings（アラインメントセッティング）について",
    "url": "/blog/realitycapture-alignment-settings/",
    "description": "フォトグラメトリーで一番最初に行うアライメント処理について説明します。アラインメント（Alignment ）とは、複数の画像からカメラの位置や向きを特定する処理です。alignment Settingsより、撮影方法が大切です。アライメントがダメなものはダメで、良いものは良い結果になります。設定を変えてもアライメントの結果はあまり変わりません。アライメントが上手くゆく撮影方法を確立するほうが重要です。",
    "tags": [
      "RealityCaputer",
      "その他"
    ],
    "date": "2024年6月16日22時11分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 realitycapture の ui 名・アライメントプリセット・ライセンス形態は版で変わります。公式リリースノートとマニュアルを確認してください。 最適な設定は被写体・撮影間隔・レンズ歪みの程度で大きく変わります。記事の値は出発点として扱ってください。 大規模プロジェクトではハード要件とクラウド処理の価格体系も更新されることがあります。 前回realitycaptureの概要を知るために作業の流れを紹介しました。今回はフォトグラメトリーで一番最初に行うアライメント処理について説明します。アラインメント（alignment ）とは、複数の画像からカメラの位置や向きを特定する処理です。 前回：realitycaptureの使い方と3dモデル作成のステップバイステップガイドクで高品質な3dモデルを作ってみよう！ https://riragon.com/realitycapture-3d-tukaikata/ 私は仕事で5年間ぐらいrealitycaptureを使っています。 **alignment settingsより、撮影方法が大切です。 ア**ライメントがダメなものはダメで、良いものは良い結果になります。 設定を変えてもアライメントの結果はあまり変わりません。 **アライメントが上手くゆく撮影方法を確立するほうが重要です。 ** **realitycaptureを使っている多くの人は、アライメント設定はおまじない程度の気持ちで適当に設定しているのではないでしょうか。 **ちなみに設定を変えなくても、大きく結果が異なる（稀にすごく良い結果になる）ので、アライメントはカオス的な処理です。 **とはいえアライメント設定方法を知っておくことで、役に立つこともあるでしょう。 ** alignment settingsメーカ説明サイトはこちらです。 https://rchelp.capturingreality.com/en-us/appbasics/alignsettings.htm アライメントの練習用に軽量なデータdl 実際にアライメントしてみることが近道です。軽量にダウンロードできるgingerbread manを以下からダウンロードします。数値をいろいろ変えてアライメントしてみよう！結果はたいして変わらないはず？ https://www.capturingreality.com/sample-datasets 画像をdlしたらrealitycaptureにドロップします。alignmentタブのsettingsをクリックします。メニューのしたに設定一覧が出てきます。 realitycapture alignment settings（アラインメントセッティング） 重要な用語がコンポーネントです。コンポーネントは、互いに重なり合う画像を通じて、相互に関連付けられたカメラのグループです。 複数のコンポーネントが存在する場合は、互いに関連付けられていない部分があるためです。不十分な画像のオーバーラップや特徴点の欠如などが原因です。つまり繋がらないってことです。 **アライメントの理想は、撮影した画像がすべて1つのコンポーネントになることです。**alignment settingsを工夫するより、 残念ですが、撮影方法を工夫したほうが大きく改善されます。 ①max features per mpx（メガピクセルあたり最大特徴点数） 初期設定は10000です。 1メガピクセル（例：1000ピクセル×1000ピクセルが1メガピクセル）あたりの特徴点の最大数です。 特徴点が多いほど処理速度は遅くなりますが、コンポーネントの数が少なくなる可能性があります。 コンポーネントの数が少なくなる＝分析が上手くゆくということです。 初期設定の倍の20000ぐらいに設定します。 根拠は何かのチュートリアルの設定です。 オマジナイです。 むやみに増やしても結果はほとんど変わりません。残念ながら。 ②max features per image（画像ごとの最大特徴点数） 初期設定は40000です。 画像ごとに使用される特徴点の絶対的な上限を定義します。 特定の画像で検出される特徴点の数を制限することで、計算の負荷を管理し、効率的な処理を実現します。 画像ごとの特徴点の絶対数の制限を定義します。 大きいサイズの画像でアライメントする場合は、こちらの設定が有効になるでしょう。 初期設定の倍の80000ぐらいに設定します。 根拠は何かのチュートリアルの設定です。 オマジナイです。 意識したことはありませんが、ある程度の大きな画像（例：2000ピクセル×2000ピクセル以上は4メガピクセル以上）は、max features per imageの設定が適用されるのではないでしょうかね。 ③image overlap（画像のオーバーラップ） 初期設定はmediumです。隣接する画像と画像がどの程度オーバーラップ（重なりがあるか）しているかを元に設定します。画像のオーバーラップが20%以下の場合は「low」に設定、60％以上ある場合は「high」に設定します。40％ぐらいの場合は「medium」です。 画像の共通エリアが大きいほど、realitycaptureがカメラのポーズを計算するのが容易になり、処理速度が向上します。オーバーラップが少なく十分な画像がない場合は、コンポーネントが分離しやすくなります。 つまり撮影する写真は、60％以上の重複があるように細かく撮影するべきです。 あまり気にせず「medium」で使っています。 繋がりが悪い場合（コンポーネットが複数になる）は、「low」に設定するとつながることがあります。 ④image downscale factor（画像のダウンスケール係数） 初期設定は1です。 アライメントの分析に利用する画像サイズの設定です。 最高の精度を得るためには、フル（ダウンスケール係数1）を使用します。 画像を縮小することで処理速度は向上しますが、解像度が低下するため、詳細の検出が難しくなります。 ダウンスケールなので2は1/2、3は1/3でしょう。 縦横の解像度が1/2になると、ピクセル数自体は1/4になります。 たぶん倍々に小さくなる仕組みと推測です。 アライメントの結果は、1でも2でも変わらない印象です。**2にすると処理がすぐ終わるので2で使っています。**複数回アライメントをする方が効果がある気がします。1だとコンポーネットが複数になるが、2にすると上手くまとまることも。謎です。運です。 ⑤max feature reprojection error（特徴点の再投影エラー） 初期設定は2です。 アラインメント中に使用される内部精度レベルです。 エラーを最大でも3ピクセル以内に保つことを推奨します。 この設定により、特徴点の再投影誤差が小さくなり、より精度の高いアラインメントが可能になります。 アライメント中に使用される内部精度レベルです。 最大値を3pxに設定し、この範囲でエラーを最大限に保つことをお勧めします。 何も考えずに2で使っています。 2より下げた方が良いという人もいます。 camera priors/control point prior settings 次はcamera priors/control point prior settingsです。測量系のフォトグラは経験したことがなく、初期設定のまま使っています。ドローンを使う場合も意識したことがありません。 地図上の正確な位置を特定するジオリファレンシングや地理情報システムgis、基準点グラウンドコントロールポイントから測定されたデータの正確性を調整したときに有効なようです。gps、rtk、ppkなどを利用する測量や土木工事プロジェクトで有効な設定かもしれません。 use camera priors for georeferencing （ジオリファレンシングのためのカメラの事前情報の使用） 画像の事前位置がアラインメントプロセスおよびシーンのジオリファレンシングに使用されます。 position accuracy位置の精度 カメラの事前位置の精度を指定します。これは、計算された位置が事前の値と等しいと考えられる範囲を定義します。 units （単位） カメラの事前情報及びその精度が表示される座標系の単位。 position prior hardness （位置事前の硬さ） 計算された位置が事前の位置にどれだけ近いかを定義する値。この値が大きいほど、計算された位置は事前の位置に近くなります。これにより、カメラ間の視覚的な接続が変わる可能性があります。 yaw/pitch/roll accuracy （ヨー/ピッチ/ロールの精度） カメラの事前の方向の精度を指定します。これは、計算された方向が事前の値と等しいと考えられる範囲を定義します。 orientation prior hardness （方向事前の硬さ） 計算された方向が事前の方向にどれだけ近いかを定義する値。この値が大きいほど、計算された方向は事前の方向に近くなります。これにより、カメラ間の視覚的な接続が変わる可能性があります。 画像計測の精度 [px]（image measurements accuracy [px]） 手動で配置されたコントロールポイントの画像内での偏差範囲を定義する値です。 位置精度（position accuracy） 各座標における基準点の位置の精度を指定します。 定義された距離精度（defined distance accuracy） 距離制約の通常の精度の値を設定します。 単位（units ） コントロールポイントの事前情報およびその精度が表示される座標系の単位です。 draft mode アライメントは、たいして時間が掛からないので、ドラフトモードは使っていません。数百枚から数千枚の場合は、アライメントの解像度を下げて確認しています。ドラフトでも速度は同じぐらいの印象です。超大規模（10000枚とか）のプロジェクトなら有効なのかもしれません。 以下の項目ですが、オーバーラップと、解像度は先と同じです。 最終モデル最適化（final model optimization）をyesにすると、バンドル調整が実行されるようです。 バンドル調整とは、複数の画像から得られる観測データを利用して、カメラの位置（ポーズ）とオブジェクトの3d座標を同時に最適化する処理のことです。 **まあ普通にアライメントすればよいのでは？と思います。 ** advanced settings advanced settingsには、期待できそうな項目が並びます。。上手くできないとき、いろいろ変更してみる項目です。結果はあまり変わらない？ アライメント後に再構築領域を追加（add a reconstruction region after alignment） yesにすると、アライメント完了後に再構築領域が自動的に作成されます。範囲指定が自動のほうが便利ですから、※いつもyesです。 測定提案を有効にする（enable measurement suggestions） 3dからの画像測定の提案を有効にすることができます。※いつもenableのまま。 コンポーネントの再マッチを強制（force component rematch） アプリケーションはより良い接続を見つけるために、画像/カメラ間で再アライメントを行います。新しいマッチを見つけるためにカメラのポーズを使用します。※説明を見るとよさそうな機能ですが、どうにもならないときは、tureにしてもどうにもならない。効果があるのかな？ 背景特徴検出（background feature detection ） システムにプロセッサの優先度を低くして背景の特徴点を自動検出させるかどうかを選択します。例えば、コントロールポイントを設置する場合に便利です。コンピュータが画像を事前処理し、結果として時間を節約できます。※コントロールポイントを設定するときに、この設定を意識したことがありません。意味あるのかな？ 背景スレッドの優先度（background thread priority） 背景検出の優先度です。低または通常から選択できます。※背景をトラッキングの要素にしたいときに有効なのでしょうけれど、意識して使ったことがありません。 プリセレクター特徴（preselector features ） 初期設定が10000です。検出された特徴からアライメントに使用される特徴の数です。最適には検出された特徴の1/4から1/2に設定します。※なので20000ぐらいにするというのが定説です。 検出器の感度 低／中／高／超高（detector sensitivity ） 超高に設定すると、テクスチャが弱い場所でより多くの特徴点を検出します。これにより、画像のノイズによるテクスチャがあるかもしれない点も追加されます。一方、低に設定すると、画像登録に使用できる特徴点を捨てることになります。※繋がらないときに低にしたり高にしたりしますが。。。 ジオリファレンスされたコンポーネントのマージ（merge georeferenced components ） 同様に、アラインされたシーンが複数のコンポーネントに分かれ、それらすべてがジオリファレンスされている場合、共通の視覚的交差がなくても、アプリケーションはそれらを結合します。※繋がらないときonにしますが。。。。 歪みモデル（distortion model ） 使用したい歪みモデルを定義します インポート時に画像を特徴として優先する（prefer images as feature during import） realitycaptureは.zfprjモザイク画像をインポートし、アライメントプロセス中に特徴源として使用すること。※意味が不明ですが、効果があるのかな？モザイク画像って何だろう。 歪みモデル（distortion model ）について詳しく見てゆきましょう カメラのレンズに関して重要な項目ですが、うまく撮影できたものはどの設定でも大体上手くゆきます。 一般的にはスマホやgoproで撮ったらdivision、一眼レフだったらbrown3、いわゆるバナナエフェクト（直線が曲がる）を感じたらbrown3 with tangential2って感じです。 division divisionは単純な歪みを確実にカバーし、フィッシュアイオプティクス（例えばgopro）にも非常に効果的です。この歪みは単一パラメータの除算モデルによってモデル化されます。 brown3 brown3は世界で最も人気のある歪みモデルです。180度未満の光学系に対応します。これは放射状歪みの多項式モデルで、3つのモデリングパラメータを持っています。デフォルトとして使用されます。 ※普通のちゃんとしたレンズの時に最適な設定という理解です。 brown4 brown4は、画像の中央と端で異なる歪みをカバーできます。これも放射状歪みの多項式モデルですが、4つの係数を持ちます。 ※たぶん安い歪みが変なレンズを使った場合に良い設定かな。 brown3 with tangential2 / brown4 with tangential2 brown3またはbrown4に接線方向の歪みを追加します。これにより、レンズのオフセットを補正できます。現在のほとんどの光学系では、接線方向の歪みは無視できるほど小さいです。 ※これはレンズの非対称配置、レンズマウントのずれなどがある場合に有効ってことでしょう。 k + brown3 with tangential2 / k + brown4 with tangential2 これらのモデルは、brownモデルにカメラキャリブレーション全体の最適化を加える可能性を提供します。これには、スキューとアスペクト比が含まれます。k + ...を使用しない場合、rcはデフォルトでスキューをゼロ、アスペクト比を1と仮定します。 ※異なるカメラが複数混じっている場合はこの設定がよいようですね。 いつもなんとなく brown3 with tangential2 を使っています。 ヒントに、最初はより単純なdivisionモデルから始めて、後でbrownに変更してデータを最適化します。とあるので、そのように作業するとよいのかもですね。まあ設定より撮影の方が重要な要素です。"
  },
  {
    "title": "三角メッシュを四角メッシュに変換する方法-Blender「Triangles to Quads」ツールでワンタッチでできます",
    "url": "/blog/sankaku-shikaku-mesh-henkan/",
    "description": "Blenderで「Triangles to Quads」を使うと三角メッシュを四角メッシュにできます。三角メッシュを四角メッシュに変換する方法を説明します。3DCGソフトウェアによって三角メッシュのみに対応しているものもあり、四角メッシュで取り込んでも三角メッシュに変換されたりします。",
    "tags": [
      "blender",
      "その他"
    ],
    "date": "2024年6月15日23時2分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 blender のモディファイア名・既定値・メッシュデータの内部表現は版で変わります。該当バージョンのマニュアルを確認してください。 三角化・四角化の結果はトポロジとシェーディングの意図に依存します。法線と uv の状態をエクスポート前に確認してください。 unreal 側へのインポートは fbx / gltf のエクスオプションで見え方が変わります。 blenderで「triangles to quads」を使うと三角メッシュを四角メッシュにできます。三角メッシュを四角メッシュに変換する方法を説明します。3dcgソフトウェアによって三角メッシュのみに対応しているものもあり、四角メッシュで取り込んでも三角メッシュに変換されたりします。 三角メッシュは、形状が柔軟で使いやすいとされ、任意の形状を作成しやすく、複雑なジオメトリでも安定して扱うことができるため、多くの場合に三角メッシュが使用されます。 四角メッシュは、テクスチャマッピングやライティングの処理において優れていることが挙げられます。四角メッシュはエッジループ（連続するエッジのループ）の管理がしやすく、特にアニメーションや詳細なモデリングが必要な場合に便利です。そのため、最終的なモデルで四角メッシュを使いたいと考えるのは一般的です。 早速こちらに三角メッシュになったuv球を用意しました。 モデリングに入り、ワイヤーがすべて見える状態に変更します。 すべて選択した状態で、alt ＋ jを押します。メニューからはface ‣ triangles to quadsを選択します。 このように緻密な三角形メッシュですが、alt ＋ j ワンタッチで処理できます。 ただし四角メッシュに変換できない部分はそのまま3角メッシュです。 「triangles to quads」ツールは、隣接する三角形を取り、共有エッジを削除して四角形を作成することにより、選択された三角形を四角形に変換します。この操作は、複数の三角形の選択に適用することができます。個々の面を気にする必要はありません。 四角形を作成するためには、少なくとも二つの隣接する三角形が必要です。選択された三角形の数が偶数である場合、四角形だけが得られるとは限りません。実際、このツールは与えられた三角形から最も均等な長方形の四角形を作成しようとしますが、いくつかの三角形が残ることもあります。左下にオプションがあります。 左下にオプションの内容は、 最大角度 この値は（0から180の間で）、隣接する三角形に対してこのツールが動作する閾値を制御します。閾値が0.0の場合、完全な長方形（すなわち、斜辺を共有する直角三角形）を形成する隣接する三角形のみを結合します。三角形の他の辺に比べて共有エッジが小さい場合は、より大きな値が必要です。 uvを比較する 有効にすると、アクティブなuvマップで隣接していない三角形の結合を防ぎます。 vcolsを比較する 有効にすると、色属性の色が一致しない三角形の結合を防ぎます。 シャープを比較する 有効にすると、シャープとしてマークされたエッジを共有する三角形の結合を防ぎます。 素材を比較する 有効にすると、同じ素材が割り当てられていない三角形の結合を防ぎます。 簡単に変換できるのでよいですね。変換したらuvマップがおかしくなりましたが、blenderの最新バージョンにしたら問題がなくなりました。お試しあれ。 https://docs.blender.org/manual/en/latest/modeling/meshes/editing/face/triangles_quads.html"
  },
  {
    "title": "完全な球体の3DモデルのUVマップを印刷向けに管理しやすい形に変換する方法",
    "url": "/blog/kyutai-insatuvmap/",
    "description": "球体のUVマップを印刷用にコントロールする方法のメモ書きです。UVマップは良くわからん勢なので、低レベルな解説です。UVマップを完全に理解している人には、単純な問題でしょう。\n完全な球体の3DモデルのUVマップを印刷向けに管理しやすい形に変換する方法を考えました。まずBlenderでUV球を作るとします。",
    "tags": [
      "3dcoat",
      "blender",
      "作ったもの"
    ],
    "date": "2024年6月9日19時42分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 blender・3d-coat のバージョンで リメッシュ・uv エディタ・ベイク の名称や既定挙動が変わります。スクリーンショットのメニューは当時の ui です。 本文の「 3d-coat に uv を自動で揃える機能がない 」は執筆時点の印象であり、 新版ではワークフローやプラグインで改善 している可能性があります。 エクイ矩形（hdri）素材 の入手元（poly haven など）の url・ライセンスは各自最新を確認してください。 印刷→実物への貼り付け は紙質・プリンタ・スケールで結果が変わる実験メモです。 球体のuvマップを印刷用にコントロールする方法のメモ書きです。uvマップは良くわからん勢なので、低レベルな解説です。uvマップを完全に理解している人には、単純な問題でしょう。 完全な球体の3dモデルのuvマップを印刷向けに管理しやすい形に変換する方法を考えました。まずblenderでuv球を作るとします。 頂点が三角と四角になります。この状態のuvマップを見てみます。 三角のギザギザになります。印刷を考えるとこのギザギザをどうしたらよいものか。 リメッシュで四角にしてみます。一見よい感じです。 上部部分を見るとメッシュが四角だと均等に埋まらず、有機的な形になります。もっとよい方法あるのかもですが、丸い部分を均等な四角で埋める方法が思いつかず。。 そこで三角と四角が混じった状態でuvマップを上手いこと編集できないものかと考えました。blenderから3d-coatにuv球を移動します。 テスト用のエクイレクタングラー形式の画像を用意しました。hdriヘブンからdlしました。 先ほどのuv球にエクイレクタングラー形式のデータを貼り付けます。上下がギザギザになります。 ここからuvをリマップします。あれこれ何時間も試行錯誤を続けました。 結果、球体のuvマップを野生の感で4分割しました。3d-coatはなぜかuvマップの配置を合わせる自動的な機能がなくて苦労しました。等倍にして、水平にするのがポイントでした。 こういった度数付きテクスチャーを用意して貼り付けました。 目視で1ドット1ドット、感覚だけで合わせました。uvマップとベイク処理が上手くできる人は、もっと簡単にできるのでしょう。blenderでのベイク処理があまりわからないので、こうなりました。 大体あったので完成です。 先ほどのエクイレクタングラー形式の画像を貼り付けました。 印刷しました。イラストレータなどに取り込めばuvマップのガイドラインが出るのかもしれませんが、未検証です。そうだだったらかなり印刷しやすいですね。 貼り付けて組み立て見ました。ハサミで荒く切りとり。。。おお！！つながりました。めでたしめでした。"
  },
  {
    "title": "UE5（Unreal Engine 5）で背景を綺麗なグリーンバック（クロマキー用の緑の背景）に設定する方法：影やグリーンの映り込みを無くしてみた",
    "url": "/blog/clean-green-screen-background-chroma-key-in-unreal-engine-5-ue5/",
    "description": "UE5（Unreal Engine 5）で背景をグリーンバック（クロマキー用の緑の背景）に設定する方法を説明します。グリーンバックの緑の映り込みや、影、光沢物への緑の反射などを無くす設定方法を紹介します。",
    "tags": [
      "UE5"
    ],
    "date": "2024年6月4日23時6分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 composure・クロマキー系ノードの名称と既定値は ue の版で変わります。該当バージョンのドキュメントを確認してください。 グリーンバックの品質は照明の均一性とカメラの色空間設定に強く依存します。記事のパラメータは出発点です。 髪の毛や半透明素材ではキーが抜けにくい場合があります。別コンポ手法の検討が必要になることがあります。 ue5（unreal engine 5）で背景をグリーンバック（クロマキー用の緑の背景）に設定する方法を説明します。グリーンバックの緑の映り込みや、影、光沢物への緑の反射などを無くす設定方法を紹介します。こんな感じにグリーン映り込みや影のない動画が書き出せました。 youtube（結果の動画） ue5内のカメラから背景をグリーンバックにした映像を書き出すことで、adobe after effects、adobe premiere pro、davinci resolveなどの編集ソフトでue5で書き出した映像を合成するなどの用途に最適です。 ue5におけるマスク処理やステンシル機能の使用は、技術的には優れた結果を提供しますが、これらの高度な機能は設定が複雑で理解しにくいことがあります。そのため、初心者やue5に不慣れなユーザーにとって、グリーンバックを使用することは、非常に簡単かつ効果的な方法です。 背景が緑になったと思ったら、影が出来てしまいました。影ぐらいならあとでキーを調整すれば、まだ抜けるかもしれません。 影はギリギリ処理できるとして、光沢の物体にグリーンが映り込むと絶望的です。編集ソフトウェアで高度なマスク処理が必要になるでしょう。 簡単にこれらの問題を解決してみましょう。まず邪魔な照明をすべて消します。環境照明を消してしますので用途によっては適さないでしょう。 形状から球を配置します。 球のサイズを100に設定します。 マテリアルのエレメントを適当な色を選択します。グリーンを適当に選びます。マテリアルをダブルクリックして、設定画面に入ります。 基本設定では、ベースカラーでdefault litになっていると思います。※下記図の囲み間違えました。 unlitにしてエミッシブカラーにします。litからunlitにすることで、このグリーン自体に影が落ちることがなくなります。またアンリットは自己発光する素材となります。明るさなども一定になる感じです。 球体を100にして大きくしたので、中から緑が見えません。そこでtwo sidedにします。そうすると中から緑が見えます。保存して戻ります。 真緑になりました。球体の緑がオブジェクトに反射しているのです。なんてことでしょう。 目に優しい世界ですが、全部抜けてしまいます。 球体を選んで1000ぐらいにしてみましょう。 緑の光が届かなくなりました。オブジェクトが黒くなりました。背景が緑なのに、もう緑の光は届かないのです。 ライトを入れて範囲を広げてソフトにするなど調整しましょう。ライトの数を増やすなど、適宜に良い感じに調整してください。 きれいにオブジェクトが表示されました。 光沢がある黒い物体も上手く表示できました。もう緑の影響はありません。これなら綺麗にグリーンが抜けるでしょう。 こんな感じに動画で書き出しできました。 youtube（書き出し結果）"
  },
  {
    "title": "コケリウム小型水槽をUSBペルチェクーラーで冷やしてみた。2度ぐらい冷えた。1か月使っても120円の電気代でお得なのか？",
    "url": "/blog/cokeriumu-peruche-reikyaku-test/",
    "description": "コケリウム※の小型水槽（3.5 リットル）ならペルチェである程度冷やせるのでは？という思惑から、タブレットを冷却するためのUSBペルチェクーラーを購入しました。自作も考えたのですが電源などの配線知識がないと危ないですから単純で安いUSBペルチェクーラーです。※ペルチェクーラーはとにかく貧弱ですから、水を冷やすのは無理でしょう。",
    "tags": [
      "作ったもの",
      "後悔したもの"
    ],
    "date": "2024年6月2日16時29分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ノート pc の熱設計・ファーム・電源プロファイルは機種と bios 更新で変わります。記事の温度ログは当時の環境向けです。 冷却パッドの効果は筐体底面の吸気構造と設置姿勢に依存します。メーカー公称値は再現条件を確認してください。 長時間高負荷は保証範囲外の劣化を早める可能性があります。メーカー推奨の運用条件を参照してください。 コケリウム※の小型水槽（3.5 リットル）ならペルチェである程度冷やせるのでは？という思惑から、タブレットを冷却するためのusbペルチェクーラーを購入しました。 自作も考えたのですが電源などの配線知識がないと危ないですから単純で安いusbペルチェクーラーです。 **※ペルチェクーラーは貧弱ですから、水を冷やすのは無理でしょう。 ** ペルチェクーラーの仕様は、24wというusbにしては電力高めタイプです。3500円くらいでした。 本製品は高性能ペルチェ素子(24w/40*40㎜tec)を内蔵されたiphonepromax,plusやタブレットクーラーです。電源を入れて3秒ほど驚異的な冷却効果を発揮します。 対応機種:タブレット/ipad/iphone12以降型番promax,plus/switch/kindle 冷却効果:本機40℃降下 冷却方式:ペルチェ素子 冷却モード:三段階(静音16w;4000rpm/冷却20w;6000rpm/極冷24w;8000rpm) 固定方式:ゴムベルト/磁気吸着式 寸法質量:約109g、約幅72×奥行72×高さ32mm(伸縮ゴムベルトを除く) コケリウムの苔ですが、30°以上になるとよくないそうです。コケの種類の影響も大きいでしょう。 https://www.y-michikusa.com/blog/blog/722/ １０～２５℃ 適温（気持ちよく成長） ３０～３４℃ 成長止まる（弱い種類は痛むものも） ３５℃以上 ダメージ発生の危険 そこで、コケリウムの小型水槽（3.5 リットル）なら、天板にペルチェクーラーをつけたら案外そこそこ冷えるのではないか？と思った次第です。それではテストしてみましょう。15cm×15cm×20cmの水槽です。 ペルチェクーラーは、よくわからないamazon中華ブランドです。こういった製品は中国以外は作っていないからオール中華ですね。 水槽に付属した段ボールに穴をあけてクーラーを設置しました。クーラーの冷却面には小型アルミフィンを4つ付けました。数分つけただけで激冷えして結露します。水分の供給にもなるでしょう。 水槽の中と外に温度湿度計を設置しました。中の温度湿度と外の温度湿度を比較します。 ガラスは熱の伝導率が低めだし、蓋は段ボールですが、小さい水槽ならそこそこ冷却されることを期待しています。 テスト1（1時間の実験）: 水槽内部 : 開始時の温度: 26.1度（15時） 1時間後の温度: 24.1度（16時） 水槽外部 : 開始時の温度: 26.5度（15時） 1時間後の温度: 27.0度（16時） 一時間後の水槽外部が27.0℃、水槽内部が24.1℃です。結果として3度近く低下したように見えます。スタート時点で温度湿度計の温度差が0.5度あります。誤差だとして、差し引くと2.5度です。 usbペルチェクーラーは、電源が入ると自動起動します。その時のモードは小モードで15w動作です。ボタンを押すと中20w、大25wと冷却がパワーアップします。スマートアダプターで単純な電源on/offはできますが、ボタンは押せないので15w動作でテストしました。 結果が怪しいと思い別の日にもう一度テストしました。 テスト2（4時間の実験）: 水槽内部 : 開始時の温度: 26.0度（12時） 4時間後の温度: 24.8度（16時） 水槽外部 : 開始時の温度: 27.7度（12時） 4時間後の温度: 28.5度（16時） **1時間ぐらいで水槽内の温度は下げ止まりです。 **1～1.5℃ぐらいは冷えるかなという感じでした。 ペルチェの限界なのか、水槽の保温性が低いから水槽の外との温度差の限界なのか不明です。 そんなものでしょう。 ペルチェですから。 usbタイプで**簡単なので、それを考慮するとよい結果になりました。 気休めで水槽を冷却できます。 ** 水槽内部と外部の温度差は、時差もあるようです。朝7:30分ぐらいには、水槽内部も外部も同じ温度を示していました。23℃です。水槽内は1時間ぐらい温度が遅れて上がるようです。 テスト3（4時間の実験）: 水槽内部 : 開始時の温度: 24.0度（12時） 4時間後の温度: 23.7度（16時） 水槽外部 : 開始時の温度: 24.5度（12時） 4時間後の温度: 26.6度（16時） 誤差なのか結局よくわからずですが、無いよりか2度ぐらい冷えるという結果でしょうか。電気の単価を1kwh（キロワット時）あたり27円と仮定します。1時間で0.4円（1kwh 単価27円計算）ぐらいだそうです。1日10時間つかって4円です。ずいぶんと安いが正しいのか？アダプタはアチアチになるので、どうなんでしょうね。 https://www.denkikeisan.com/?w=15&h=10&m=0&d=1&y=27&s=0 一日4円で2度ぐらい水槽内の気温を抑制できるusbペルチェクーラーでした。1か月使っても120円なら許されるのではないでしょうか。めでたしめでした。 数カ月後 今年は熱い夏が続きました。1～2冷えたところでへのツッパリにもならんですよ。夏が終わり涼しくなり冷静に考えると不要なものでした。"
  },
  {
    "title": "その3：SwitchBot プラグをSwitchBot APIを使って状態の情報と電源をONOFF操作する",
    "url": "/blog/switchbot-plug-mini-switchbot-api/",
    "description": "",
    "tags": [
      "Python",
      "SwitchBot",
      "作ったもの"
    ],
    "date": "2024年6月2日13時36分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 switchbot 公式 api のエンドポイント・トークン方式・レート制限・アプリ画面は変更されやすいです。開発者向けドキュメントの最新版を参照してください。 スマートプラグの消費電力・スイッチ状態の取得可否は機種とファームウェアに依存します。対応機能は公式仕様で確認してください。 記事中の python コードは当時の前提です。依存ライブラリの互換性を確認してください。 switchbot プラグ（switchbot-plug）、switchbotプラグミニ（switchbot-plug-mini）をpythonとswitchbot apiを使って状態の情報と電源をonoff操作してみます。 デバイスid取得方法は過去の記事を参考してください。 https://riragon.com/switchbot-api-python/ switchbot api v1.1 https://github.com/openwonderlabs/switchbotapi 以下pythonプログラムは、トークン、シークレットトークン、デバイスidは、ご自身の環境の数値を入れてください。このpythonスクリプトは、switchbot apiを使用してデバイスの状態を確認し、電源がオンならオフに、オフならオンに切り替えるコマンドを送信します。 必要な環境はpython 3.6以降で、インストールや仮想環境の準備など適宜に、requestsのパッケージも必要です。requestsのパッケージのインストール例です。python の環境は適宜に適宜してください。 pip install requests switchbot_plug_control.py import requests import time import uuid import hmac import hashlib import base64 def get_device_status(api_token, secret_token, device_id): url = f\"https://api.switch-bot.com/v1.1/devices/{device_id}/status\" t = int(time.time() * 1000) nonce = str(uuid.uuid4()) string_to_sign = f\"{api_token}{t}{nonce}\".encode('utf-8') secret_key = secret_token.encode('utf-8') signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest() sign = base64.b64encode(signature).decode('utf-8').upper() headers = { \"authorization\": api_token, \"content-type\": \"application/json\", \"t\": str(t), \"nonce\": nonce, \"sign\": sign } response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: return response.status_code, response.text def send_command(api_token, secret_token, device_id, command): url = f\"https://api.switch-bot.com/v1.1/devices/{device_id}/commands\" t = int(time.time() * 1000) nonce = str(uuid.uuid4()) string_to_sign = f\"{api_token}{t}{nonce}\".encode('utf-8') secret_key = secret_token.encode('utf-8') signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest() sign = base64.b64encode(signature).decode('utf-8').upper() headers = { \"authorization\": api_token, \"content-type\": \"application/json\", \"t\": str(t), \"nonce\": nonce, \"sign\": sign } body = { \"command\": command, \"parameter\": \"default\", \"commandtype\": \"command\" } response = requests.post(url, headers=headers, json=body) print(f\"sending {command} command: {response.text}\") time.sleep(5) return get_device_status(api_token, secret_token, device_id) # トークンとシークレットキーを設定 api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' secret_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' device_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' device_status = get_device_status(api_token, secret_token, device_id) if isinstance(device_status, dict) and device_status.get('statuscode') == 100: body = device_status['body'] print(f\"device id: {body.get('deviceid')}\") print(f\"device type: {body.get('devicetype')}\") print(f\"hub device id: {body.get('hubdeviceid')}\") print(f\"power status: {body.get('power')}\") print(f\"version: {body.get('version')}\") if body.get('power') == 'on': updated_status = send_command(api_token, secret_token, device_id, \"turnoff\") print(\"power status: off - turned off the device successfully.\") elif body.get('power') == 'off': updated_status = send_command(api_token, secret_token, device_id, \"turnon\") print(\"power status: on - turned on the device successfully.\") else: print(\"failed to retrieve device status. error:\", device_status) http getリクエストを送信し、成功すればjson形式でデバイス情報を返し、失敗した場合はステータスコードとエラーメッセージを返します。 指定したデバイスに対して操作コマンド（オンまたはオフ）を送信します。http postリクエストを使ってコマンドを送り、その結果を表示します。その後、デバイスの状態が更新されるのを待つために10秒間待機し、再度デバイスのステータスを取得します。 取得したデバイスステータスに基づき、デバイスid、タイプ、ハブデバイスid、電源ステータス、バージョンを表示します。その後、現在の電源状態（オンまたはオフ）に基づいて適切なコマンドを送信します。コマンドの結果としてデバイスがオフまたはオンになったことを確認し、成功した場合はその旨を出力します。 以上を実行するとこのように動作します。 device id: xxxxxxxxx device type: plug hub device id: xxxxxxxxx power status: off version: v1.7 sending turnon command: {\"statuscode\":100,\"body\":{\"items\":[{\"deviceid\":\"xxxxxxxxx\",\"code\":100,\"status\":{\"timestamp\":\"xxxxxxxxx\",\"wattage\":\"0\",\"current\":\"0\",\"consume\":\"35\",\"state\":\"0\",\"power\":\"on\",\"ipaddr\":\"xxxxxxxxx\",\"mac\":\"xxxxxxxxx\",\"voltage\":\"995\"},\"message\":\"success\"}]},\"message\":\"success\"} power status: on - turned on the device successfully."
  },
  {
    "title": "その2：SwitchBotの温湿度計（switchbot-meter）からPythonとSwitchBot APIを使って温度と湿度のデータを取得する",
    "url": "/blog/switchbot-meter-python-switchbot-api/",
    "description": "SwitchBotの温湿度計（switchbot-meter）を使って、PythonとSwitchBot APIにて温度と湿度のデータを取得します。MQTT（Message Queuing Telemetry Transport）を活用することで、IoTデバイス間で効率的に送受信することも可能です。",
    "tags": [
      "Python",
      "SwitchBot",
      "作ったもの"
    ],
    "date": "2024年5月31日23時33分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 switchbot 公式 api のエンドポイント・トークン方式・レート制限・アプリ画面は変更されやすいです。開発者向けドキュメントの最新版を参照してください。 温湿度計の応答間隔や取得できるフィールドはファームウェアで変わることがあります。アプリと api の説明を併せて確認してください。 記事中の python コードは当時の前提です。依存ライブラリの互換性を確認してください。 switchbotの温湿度計（switchbot-meter）を使って、pythonとswitchbot apiにて温度と湿度のデータを取得します。mqtt（message queuing telemetry transport）を活用することで、iotデバイス間で効率的に送受信することも可能です。 switchbot 温湿度計（switchbot-meter）、switchbot 温湿度計プラス（switchbot-meter）、switchbot 防水温湿度計(switchbot-indoor-outdoor-meter)は、同じようにデータを取得できるはずです。温湿度計と防水温湿度計で動作を確認しています。 switchbot温湿度計のデバイスidが分かれば、switchbot apiでデータを取得できます。ネットワーク経由で温度と湿度を取り出せるようになります。ほかのiotデバイスとpythonを組み合わせることでいろいろできそうですね。 デバイスid取得方法は過去の記事を参考してください。 https://riragon.com/switchbot-api-python/ switchbot api v1.1 https://github.com/openwonderlabs/switchbotapi 必要な環境はpython 3.6以降で、インストールや仮想環境の準備など適宜に、requestsのパッケージも必要です。requestsのパッケージのインストール例です。python の環境は適宜に適宜してください。 pip install requests pandas 以下pythonプログラムは、トークン、シークレットトークン、デバイスidは、ご自身の環境の数値を入れてください。 get_device_list() 関数を通じてデバイスのリストを取得し、指定されたデバイスの詳細情報を取得します。 またget_device_status() 関数を使用してデバイスの温度、湿度、バッテリーレベルを取得し、表示します。 switchbot_meter_data_retriever.py import requests import time import uuid import hmac import hashlib import base64 def get_device_status(api_token, secret_token, device_id): url = f\"https://api.switch-bot.com/v1.1/devices/{device_id}/status\" t = int(time.time() * 1000) nonce = str(uuid.uuid4()) string_to_sign = f\"{api_token}{t}{nonce}\".encode('utf-8') secret_key = secret_token.encode('utf-8') signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest() sign = base64.b64encode(signature).decode('utf-8').upper() headers = { \"authorization\": api_token, \"content-type\": \"application/json\", \"t\": str(t), \"nonce\": nonce, \"sign\": sign } response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: return response.status_code, response.text def get_device_list(api_token, secret_token): url = \"https://api.switch-bot.com/v1.1/devices\" t = int(time.time() * 1000) nonce = str(uuid.uuid4()) string_to_sign = f\"{api_token}{t}{nonce}\".encode('utf-8') secret_key = secret_token.encode('utf-8') signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest() sign = base64.b64encode(signature).decode('utf-8').upper() headers = { \"authorization\": api_token, \"content-type\": \"application/json\", \"t\": str(t), \"nonce\": nonce, \"sign\": sign } response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: return response.status_code, response.text # トークンとシークレットキーを設定 api_token = 'ｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘ' secret_token = 'ｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘ' device_id = 'ｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘ' device_list_data = get_device_list(api_token, secret_token) if isinstance(device_list_data, dict) and device_list_data.get('statuscode') == 100: device_list = device_list_data['body']['devicelist'] for device in device_list: if device['deviceid'] == device_id: device_info = { \"device id\": device.get('deviceid', 'n/a'), \"device name\": device.get('devicename', 'n/a'), \"device type\": device.get('devicetype', 'n/a'), \"cloud service enabled\": device.get('enablecloudservice', 'n/a'), \"hub device id\": device.get('hubdeviceid', 'n/a') } for key, value in device_info.items(): print(f\"{key}: {value}\") device_status = get_device_status(api_token, secret_token, device_id) if isinstance(device_status, dict) and device_status.get('statuscode') == 100: body = device_status['body'] if 'temperature' in body: print(f\"temperature: {body['temperature']}°c\") if 'humidity' in body: print(f\"humidity: {body['humidity']}%\") if 'battery' in body: print(f\"battery level: {body['battery']}%\") else: print(\"デバイスリストの取得に失敗しました。\") switchbot apiを使用してデバイスの状態データを取得し表示します。 必要なライブラリをインポートします。 requestsはhttpリクエストを送信するため、timeは時間関連の操作のため、uuidは一意の識別子を生成するため、hmacはhmac署名を生成するため、hashlibはハッシュ関数を提供するため、base64はbase64エンコードとデコードを行うために使用されます。 get_device_status 関数は、指定されたデバイスのステータスを取得します。 最初にapiエンドポイントのurlを設定し、次に現在のタイムスタンプをミリ秒単位で取得します。 一意の識別子としてuuidを生成し、署名生成用の文字列を作成します。 この文字列をhmac-sha256で署名し、署名をbase64エンコードします。 その後、ヘッダーを設定し、http getリクエストを送信します。 レスポンスが成功した場合、json形式のデータを返します。 成功しなかった場合は、ステータスコードとレスポンスのテキストを返します。 get_device_list 関数は、デバイスリストを取得します。 get_device_status関数と同様に、apiエンドポイントのurlを設定し、タイムスタンプ、一意の識別子、署名を生成します。 次に、ヘッダーを設定し、http getリクエストを送信します。 レスポンスが成功した場合、json形式のデータを返します。 成功しなかった場合は、ステータスコードとレスポンスのテキストを返します。 取得したデバイスリストの中から指定されたデバイスidに一致するデバイスを検索します。 見つかったデバイスの詳細情報を取得し、表示します。 その後、get_device_status関数を呼び出してデバイスのステータスを取得し、温度、湿度、バッテリーレベルを表示します。 もしデバイスリストの取得に失敗した場合は、\"デバイスリストの取得に失敗しました。 \"というメッセージを表示します。 以上を実行するとこのようにデータが取得できます。取れるデータはこれで全部だと思います。 python hoguhogu.py device id: abcdabcdabcd device name: 温湿度計 fa device type: meter cloud service enabled: true hub device id: abcdabcdabcd temperature: 25.2°c humidity: 65% battery level: 100%"
  },
  {
    "title": "その1：PythonでSwitchBot API v1.1を使う方法－トークンでデバイスリストを取得する",
    "url": "/blog/switchbot-api-python/",
    "description": "2024年5月時点で最新のswitchBot APIをpythonで使う方法を紹介します。まずはswitchBot API1.1を使い機器リストを取得するところからすべてが始まります。APIを利用するには、Open Tokenが必要です。Open Tokenの生成は、アプリ操作が必要です。",
    "tags": [
      "Python",
      "SwitchBot",
      "作ったもの"
    ],
    "date": "2024年5月31日17時47分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 switchbot 公式 api のエンドポイント・トークン方式・レート制限・アプリ画面は変更されやすいです。開発者向けドキュメントの最新版を参照してください。 記事中の python サンプルは当時のライブラリ前提です。依存パッケージのメンテ状況と推奨実装を確認してください。 デバイスファームウェアとアプリの組み合わせにより取得できる状態値が異なる場合があります。 2024年5月時点で最新のswitchbot apiをpythonで使う方法を紹介します。まずはswitchbot api1.1を使い機器リストを取得するところからすべてが始まります。apiを利用するには、open tokenが必要です。open tokenの生成は、アプリ操作が必要です。 まずapp storeやgoogle play storeでswitchbotアプリをインストールして、アカウントの登録やログインを済ませます。 open tokenの生成方法は以下です。 プロフィール > 設定に移動 アプリバージョンを10回タップ。開発者オプションが表示される 開発者オプションをタップ トークンを取得 これでトークン（open token）とクライアントシークレット（シークレットキー）が取得できます。 switchbot api v1.1 https://github.com/openwonderlabs/switchbotapi switchbot api v1.1では、apiを通じてプライベートデータにアクセスするために、トークンとクライアントシークレットを使用してユニークな署名を生成する必要があります。 リクエストを行う際、認証トークンと署名が同時に検証されます。 13桁のタイムスタンプを出力し、それをトークンと連結します。 シークレットキーと前のステップで作成した文字列を使用して署名を生成します。 署名を大文字に変換します。 必要な環境はpython 3.6以降で、インストールや仮想環境の準備など適宜に、requestsとpandasのパッケージも必要です。requestsとpandasのパッケージのインストール例です。python の環境は適宜に適宜してください。 pip install requests pandas 以下サンプルコードです。switchbot apiを使用してデバイスリストを取得し、結果をdataframeに変換して表示するスクリプトです。 api_tokenにトークン（open token）、secret_tokenにクライアントシークレット（シークレットキー）を入れてください。xxxxxxxで代入してあります。x部分にキーを入れます。カンマはそのまま残します。 switchbot_device_api_client.py import requests import time import uuid import hmac import hashlib import base64 import pandas as pd def get_device_list(api_token, secret_token): url = \"https://api.switch-bot.com/v1.1/devices\" t = int(time.time() * 1000) nonce = str(uuid.uuid4()) string_to_sign = f\"{api_token}{t}{nonce}\".encode('utf-8') secret_key = secret_token.encode('utf-8') signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest() sign = base64.b64encode(signature).decode('utf-8').upper() headers = { \"authorization\": api_token, \"content-type\": \"application/json\", \"t\": str(t), \"nonce\": nonce, \"sign\": sign } response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: return response.status_code, response.text api_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' secret_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' devices = get_device_list(api_token, secret_token) print(devices) if isinstance(devices, dict) and 'body' in devices and 'devicelist' in devices['body']: data = devices['body']['devicelist'] df = pd.dataframe(data, columns=['deviceid', 'devicename', 'devicetype', 'enablecloudservice', 'hubdeviceid']) print(df.to_string(index=false)) else: print(\"failed to retrieve the device list.\") コードの補足です。 import requests # httpリクエストを送信するためのライブラリ import time # 時間関連の関数を提供するモジュール import uuid # uuid（一意識別子）を生成するためのモジュール import hmac # hmac（ハッシュベースのメッセージ認証コード）を生成するためのモジュール import hashlib # ハッシュ関数を提供するモジュール import base64 # base64エンコード/デコードを行うためのモジュール import pandas as pd # データ操作と分析のためのライブラリ です。 get_device_list(api_token, secret_token)関数は、switchbot apiとの通信を行います。 switchbot apiへのセキュアなリクエストを行うためまずswitchbotデバイス情報を取得するapiエンドポイントのurlが指定されます。 次に、リクエストのタイムスタンプとして現在の時刻をミリ秒単位で取得し、安全性を高めるためにランダムなuuid（ノンス）を生成します。 これらをapiトークンと組み合わせて、署名用の文字列を作成し、シークレットトークンを用いてこの文字列をhmac-sha256で署名します。 最後に、この署名をbase64でエンコードし、大文字に変換してリクエストヘッダーに使用します。 次にswitchbot apiへのhttp getリクエストを送信するための準備を行います。 まず、リクエストに必要なヘッダーを設定します。 これにはapiトークン、コンテンツタイプ（json形式）、タイムスタンプ、一意の識別子（nonce）、そして署名が含まれます。 これらの情報をヘッダーに設定することで、認証とデータ整合性の保証が行われます。 次に、設定したヘッダーを使ってapiのurlに対してgetリクエストを送信します。 リクエストが成功（ステータスコード200）すると、apiはjson形式でデータを返します。 リクエストが失敗すると、ステータスコードとエラーメッセージが返されます。 実行するとdeviceid、devicename、devicetype、enablecloudservice、hubdeviceidを出力してくれます。 switchbot apiを使用すると、deviceidを利用して各デバイスを直接操作し、オン/オフ切り替えや設定の変更などのコマンドが実行できます。 さらに自動化ルールを作成し、他のシステムとの統合も可能でしょう。 pythonを用いてこれらの操作を行うことで、効率的かつ柔軟なスマートホーム環境を構築できます。 apiのリクエストは1日あたり10,000回まで、超えると認証エラーが発生します。特定のデバイスはcloud servicesを有効にする必要があるほか、一部のデバイスはハブを介してのみ操作が可能です。 switchbot api v1.1 https://github.com/openwonderlabs/switchbotapi"
  },
  {
    "title": "KB5034441解決方法：Windows 10 Version 22H2のセキュリティ更新プログラム（KB5034441）エラー",
    "url": "/blog/%E8%A7%A3%E6%B1%BA%E6%96%B9windows-10-kb5034441%E3%82%A8%E3%83%A9%E3%83%BC/",
    "description": "Windows 10 Version 22H2のセキュリティ更新プログラム（KB5034441）エラーが、ずーーーー～～～～～～～と出ていました。さてマイクロソフトに以下対応方法が掲載されています。これで解決！という人は少ないでしょう。なんでこんなに読みずらいのでしょうね。頭に文章が全く入ってこない。。。。天才か。書いている人は。",
    "tags": [
      "作ったもの"
    ],
    "date": "2024年5月25日23時58分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 windows update・回復パーティション・winre の要件は kb や新ビルドで変わります。該当 kb とマイクロソフト公式の現在の手順を優先してください。 記事内のファイル削除やパーティション操作はデータ損失のリスクがあります。実行前にバックアップを取ってください。 ディスク構成（oem リカバリ等）は機種により異なります。メーカー提供の注意事項も併せて確認してください。 windows 10 version 22h2のセキュリティ更新プログラム（kb5034441）エラーが、ずーーーー～～～～～～～と出ていました。 さてマイクロソフトに以下対応方法が掲載されています。 これで解決！という人は少ないでしょう。 なんでこんなに読みずらいのでしょうね。 頭に文章が全く入ってこない。 。 。 。 解決してから見ると、あれ？同じ内容だと気がつきます。 https://support.microsoft.com/ja-jp/topic/kb5028997-winre-%e6%9b%b4%e6%96%b0%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ab%e3%83%91%e3%83%bc%e3%83%86%e3%82%a3%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b5%e3%82%a4%e3%82%ba%e3%82%92%e6%89%8b%e5%8b%95%e3%81%a7%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b%e6%89%8b%e9%a0%86-400faa27-9343-461c-ada9-24c8229763bfhttps://oa-center.co.jp/2024/04/22/windowskb5034441/ さてchatgptに読ませて、わかりやすく指示してもらいました。 皆さんもお試しくださいませ。 ※システムがぶっ壊れる可能性があるので、自己責任です。 実際に修正が上手くゆきましたが！自己責任で実施くださいませ。 ちなみに原因はこちらの記事がわかりやすいです。 windows回復環境(winre)の容量が少ないことが原因なようです。 https://oa-center.co.jp/2024/04/22/windowskb5034441/ 実際に修正してみよう！ 管理者としてコマンドプロンプトを開きます。スタートメニューを右クリックし、「コマンドプロンプト（管理者）」または「windows powershell（管理者）」を選択します。私の環境が以下です。partition 4 回復 552 mb 930 gbに問題があります。実際の環境に合わせて適宜調整くださいませ。 diskpart> list part partition ### type size offset ------------- ------------------ ------- ------- partition 1 システム 100 mb 1024 kb partition 2 予約 16 mb 101 mb partition 3 プライマリ 930 gb 117 mb partition 4 回復 552 mb 930 gb ------------- ------------------ ------- ------ 1. 管理者としてコマンドプロンプトを開く スタートメニューを右クリックし、「コマンドプロンプト（管理者）」または「windows powershell（管理者）」を選択します。 2. winre状態を確認 reagentc /info 3. winreを無効化 reagentc /disable 4. ディスクパーティションを管理するためにdiskpartを使用 diskpart 5. ディスクの一覧を表示 list disk 6. osディスクを選択 以下のコマンドでosディスクを選択します（例: ディスク0の場合）。 select disk 0 7. パーティションの一覧を表示 list part 8. osパーティションを選択 osパーティションは私の場合は「partition 3 プライマリ 930 gb」なので、次のコマンドを実行します。 select part 3 9. osパーティションを縮小 250mbだけ縮小します。 shrink desired=250 minimum=250 10. winreパーティションを選択 winreパーティションは「partition 4 回復 552 mb」なので、次のコマンドを実行します。 select part 4 11. winreパーティションを削除 delete partition override 12. 新しい回復パーティションの作成 ディスクのパーティションスタイルを確認するため、次のコマンドを実行します。 \"gpt\"列にアスタリスク(*)がある場合、ディスクはgptです。それ以外の場合、mbrです。 私の場合はgptでした。 list disk 13. パーティションを作成 gptディスクの場合: create partition primary id=de94bba4-06d1-4d40-a16a-bfd50179d6ac gpt attributes=0x8000000000000001 ＜mbrディスクの場合:＞ create partition primary id=27 14. 新しいパーティションのフォーマット format quick fs=ntfs label=\"windows re tools\" ＜mbrディスクの場合の追加設定＞ set id=27 15. 新しいwinreパーティションが作成されたことを確認 list vol 16. diskpartを終了 exit 17. winreを再有効化 reagentc /enable 18. winreの場所を確認 reagentc /info この手順に従うことで、kb5028997のインストールに必要な回復パーティションのサイズが確保され、winreが再度有効になったはずです。再度windows updateを実行して、更新プログラムのインストールを試みてください。アディオス！"
  },
  {
    "title": "過去のCapture One pro（Capture One 3～最新バージョンまで）をダウンロードする方法、sony版などもありました。",
    "url": "/blog/capture-one/",
    "description": "個人所有のAdobe契約をやめました。もうフォトショップが使えない。。。ちょっとRAW画像を現像したく過去に購入したcapture one pro sony 12（2019年）を思い出して、ダウンロードを探すも見つかりませんでした。今はバージョンなども異なっていてサイトからDLが見つかりません。今はsonyがなくなったんですね。\n調べると過去のcapture oneを以下からダウンロードできることがわかりました。ログインすると過去のバージョンが出てきます。",
    "tags": [
      "その他"
    ],
    "date": "2024年5月19日10時57分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 capture one の ui・ショートカット・カタログ形式は版で変わります。公式リリースノートを確認してください。 カメラ raw の解釈はバージョンアップで微調整されることがあります。過去セッションの再現には版の揃え方に注意してください。 サブスクリプションと恒久ライセンスの提供形態は販売ポリシーで変わることがあります。 個人所有のadobe契約をやめました。 もうフォトショップが使えない。 。 。 ちょっとraw画像を現像したく過去に購入したcapture one pro sony 12（2019年）を思い出して、ダウンロードを探すも見つかりませんでした。 **今はバージョンなども異なっていてサイトからdlが見つかりません。 今はsony版がなくなっています。 ** 調べると過去のcapture oneを以下からダウンロードできることがわかりました。 ログインすると過去のバージョンが出てきます。 https://www.captureone.com/en/account/download/previous **2024年５月時点で以下バージョンのcapture one proダウンロードできます。**以下は、capture oneの過去のバージョン番号をリスト化したものです。これらをダウンロードできます。 capture one 23 16.4.1 16.4.0 16.3.8 16.3.7 16.3.6 16.3.5 16.3.4 16.3.3 16.3.2 16.3.1 16.3.0 16.2.6 16.2.5 16.2.4 16.2.3 16.2.2 16.2.1 16.2.0 16.1.3 capture one 22 15.4.3 15.4.2 15.0.0 capture one 21 14.4.1 14.1.1 capture one 20 13.1.4 capture one 12 12.1.5 capture one 11 11.3.2 capture one 10 10.2.1 capture one 9 9.3 capture one 8 8.3.5 8.3.4 capture one 7 7.2.4 capture one 6 6.4.5 capture one 5 5.2.1 capture one 4 4.8.3 capture one 3 3.7.9 db 3.7.9 pro 過去のバージョンディアクティベート方法 capture one pro sony 12を無事にインストールできました。 しかしライセンスが他のpcで使用されていて使えないという警告が出てきました。なんてことでしょう。再びwebサイトへログインしてyour plansをチェックするとディアクティブできることがわかりました。5年ぶりの起動です。ログインやパス、ライセンスーキーなどを保存しておいてよかったです。 無事に認証できました。 使い方を忘れていますが、無事に動作しました。めでたし。"
  },
  {
    "title": "systemdによりpythonのGStreamerをSRT送信を自動起動サービスとして登録",
    "url": "/blog/ubuntu-systemd-python-gstreamer-srt/",
    "description": "前回Ubuntu22.04にSRTが使えるGStreamerをセットアップしました。今回はPythonでUSBカメラの映像送信を行うサービスを作ります。まず以下のpythonをセットアップするのですが、ubutnu22.04にはほとんどインストールされていると思います。",
    "tags": [
      "gstreamer",
      "srt",
      "ubuntu",
      "作ったもの"
    ],
    "date": "2024年4月29日13時34分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 systemd のユニット文法・推奨ディレクティブ・セキュリティオプションは版で追加・非推奨化があります。ディストリの man とリリースノートを確認してください。 gstreamer・python ラッパーの api とパッケージ名は更新されます。長期運用する場合は依存の固定と再テストを推奨します。 サービス化したパイプラインはログローテーションとリスタート方針を別途設計してください。 前回ubuntu22.04にsrtが使えるgstreamerをセットアップしました。今回はpythonでusbカメラの映像送信を行うサービスを作ります。まず以下のpythonをセットアップするのですが、ubutnu22.04にはほとんどインストールされていると思います。 pygobjectを利用することで、pythonからc言語で書かれたライブラリ（gobjectベースのライブラリ）を直接使うためのバインディングを提供します。これにより、pythonプログラム内でgstreamerのようなマルチメディアフレームワークを操作することが可能になります。とても便利な仕組みです。 sudo apt-get update sudo apt install python3 sudo apt-get install python3-gi python3-gi-cairo gir1.2-gtk-3.0 python3-giは pygobject のpython 3向けのパッケージで、pythonプログラムからgobjectベースのライブラリを利用するためのインターフェースを提供します。 python3-gi-cairoは、pygobjectを使用しているpythonアプリケーション内で、cairo グラフィックスライブラリを利用するためのバインディングを提供します。cairoはベクターベースのグラフィックスを扱うための強力な2dグラフィックスライブラリです。 gir1.2-gtk-3.0はgtk+ 3.0のgobject introspection repository（gir）ファイルです。 gobject introspectionは、言語バインディングを生成するためのライブラリのapiを記述するメタデータを提供します。 このファイルをインストールすることで、そのライブラリの関数やクラスをpygobjectを通じてpythonから直接アクセスできるようになります。 今回はpythonでgstreamerを使うことが目的なので、以下のような機能を使います。 import giは、pythonで特定のプログラム（ここではgtkやgstreamerなど）を使えるようにするためのものです。 gi.require_version('gst', '1.0')は、gstreamer（ビデオやオーディオを扱うためのプログラム）のどのバージョンを使うかを明確に指定しています。 from gi.repository import gst, glibは、実際にビデオやオーディオの処理をするgstreamer（gst）と、プログラムの基本的な動作を管理するglib（glib）を使えるようになります。 今回usbカメラの映像を取得してsrtストリームに流すプログラムを作成します。自分の環境としてsrt://192.168.10.17:10000?mode=callerとしてますが、受信側のipとポートは適宜作成してください。gstreamerのパイプラインも利用環境によって適宜設定が必要でしょう。 sudo nano cam_stream.py import gi import sys import signal gi.require_version('gst', '1.0') gi.require_version('glib', '2.0') from gi.repository import gst, glib def handle_signal(sig, frame, pipeline): \"\"\" シグナルハンドラ：プログラムの終了処理を行う \"\"\" print(f\"received signal: {sig}. exiting...\") pipeline.set_state(gst.state.null) sys.exit(0) def on_bus_message(bus, message, pipeline): \"\"\" メッセージハンドラ：gstreamerバスからのメッセージを処理する \"\"\" msg_type = message.type if msg_type == gst.messagetype.error: err, debug_info = message.parse_error() print(f\"error: {err}, {debug_info}\") pipeline.set_state(gst.state.null) sys.exit(1) # エラー発生時には終了コード1で終了 def main(): # gstreamerの初期化 gst.init(none) # ストリーミングパイプラインの定義 streaming_pipeline_description = \"\"\" v4l2src device=/dev/video0 ! image/jpeg,width=1920,height=1080,framerate=30/1 ! jpegdec ! videoconvert ! videoflip method=rotate-180 ! clockoverlay halignment=left valignment=top font-desc=\"sans, 12\" time-format=\"%y-%m-%d %h:%m:%s\" ! x264enc bitrate=10000 speed-preset=ultrafast tune=zerolatency ! mpegtsmux ! srtsink uri=\"srt://192.168.10.17:10000?mode=caller\" \"\"\" pipeline = gst.parse_launch(streaming_pipeline_description) pipeline.set_state(gst.state.playing) main_loop = glib.mainloop() signal.signal(signal.sigint, lambda sig, frame: handle_signal(sig, frame, pipeline)) signal.signal(signal.sigterm, lambda sig, frame: handle_signal(sig, frame, pipeline)) bus = pipeline.get_bus() bus.add_signal_watch() bus.connect(\"message\", lambda bus, message: on_bus_message(bus, message, pipeline)) main_loop.run() pipeline.set_state(gst.state.null) if __name__ == \"__main__\": main() streaming_pipeline_descriptionは、gstreamerのコマンドほぼそのままです。 ビデオキャプチャデバイスからビデオを取得し、さまざまな変換を施した後、インターネットを介して特定のアドレスに送信する一連の指示です。 ビデオは180度回転され、時刻がオーバーレイされ、エンコードされてから送信されます。 pipeline = gst.parse_launch(streaming_pipeline_description)でパイプラインを作成し、pipeline.set_state(gst.state.playing)でビデオのストリーミングを開始します。 handle_signal関数であるシグナルハンドラを設定することで、プログラムを停止することができます。 またプログラムが終了する際に適切にリソースを解放するために設定されています。 on_bus_message関数は、ビデオストリーミング中に発生するエラーを検出して適切に処理するために使われます。 エラーが検出された場合、適切なメッセージを表示し、プログラムを終了します。 main_loop = glib.mainloop()でメインループを作成し、main_loop.run()でループを開始します。これにより、プログラムはイベントを継続的に監視し続けます。 エラー発生時には終了コード1で終了することで、、systemdでサービスとして管理する際に非常に役立ちます。これは、プログラムの終了が正常だったのか、あるいは何か問題があって終了したのかをsystemdが識別できるようにするためです。実行権限を付けます。 sudo chmod +x cam_stream.py 以下サービスを作ります。/yoururl/にはcam_stream.py/を保存した場所を入れます。カメラのストリームは継続的に動いてほしいのでrestart=alwaysに設定します。 nano /etc/systemd/system/cam-stream.service [unit] description=start camera stream wants=network-online.target after=network-online.target [service] environment=\"path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\" type=simple execstart=/usr/bin/python3 /yoururl/cam_stream.py restart=always restartsec=5s [install] wantedby=multi-user.target sudo chmod +x /etc/systemd/system/cam-stream.service systemdを使用すると、pythonスクリプト（.pyファイル）などををubuntu 22.04のシステムサービスとして設定し、管理することができます。 便利ですよね。 systemdは、linuxシステムの起動時に、必要なサービスやプロセスを適切な順序で開始します。 これにより、システムが速やかに起動し、安定して動作するようになります。 cam-stream.serviceを例にsystemdのコマンドをまとめるとこんな感じ。 sudo systemctl daemon-reload systemdの設定を更新するための重要なコマンドであり、サービスファイルを追加、変更、または削除するたびに実行する必要があります。 sudo systemctl enable cam-stream.service サービスを有効化します。システム起動時にサービスが自動的に開始されるようになります。 sudo systemctl disable cam-stream.service サービスを無効化します。システム起動時にサービスが自動的に開始されなくなります。 sudo systemctl start cam-stream.service サービスを開始します。 sudo systemctl stop cam-stream.service サービスを停止します。 sudo systemctl status cam-stream.service サービスの現在の状態を表示します。これには、サービスが実行中かどうか、最後に実行されたのはいつか、およびサービスに関連するログメッセージが含まれます。 sudo systemctl list-units --type=service システム上のすべてのサービスユニットを一覧表示します。これにより、現在実行中のサービスや、それらの状態を確認できます。 sudo journalctl システムログ（journal）の内容を表示します。これには、カーネルメッセージ、システムサービス、およびアプリケーションからのログメッセージが含まれます。 sudo journalctl -u cam-stream.service 指定したサービス（この場合はcam-stream.service）に関連するログメッセージのみを表示します。これにより、特定のサービスに関連する問題をトラブルシューティングするのに役立ちます。 実際に使うときは、このように使うでしょう。デーモンをリロード、サービスを有効、サービスを開始、サービスの状態を確認、エラーログを確認という感じです。 sudo systemctl daemon-reload sudo systemctl enable cam-stream.service sudo systemctl start cam-stream.service sudo systemctl status cam-stream.service sudo journalctl -u cam-stream.service 以上でusbカメラを毎回自動的に起動してsrtで繋がるまで再起動を繰り返すシステムができました。切断してもまたつながるまで繰り返します。"
  },
  {
    "title": "ubuntu22.04にてGStreamerでSRTの設定インストール方法を説明",
    "url": "/blog/ubuntu22-04-gstreamer-srt-install-howto/",
    "description": "ubuntu22.04にGStreamerをインストールしてSRTを使えるように設定します。GStreamerは、オーディオやビデオなどのマルチメディアデータを処理するためのマルチメディアフレームワークです。SRTは、信頼性の高いローレイテンシーのビデオストリーミングを実現するためのオープンソースのトランスポートプロトコルです。",
    "tags": [
      "gstreamer",
      "srt",
      "ubuntu",
      "作ったもの"
    ],
    "date": "2024年4月27日21時1分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 gstreamer のプラグイン名・パッケージ分割・推奨バージョンはディストリと upstream で更新されます。ubuntu 公式 / gstreamer ドキュメントで再確認してください。 srt の推奨パラメータやツールチェーンは仕様改訂の影響を受けます。配信・受信双方の版を揃えて検証してください。 記事は ubuntu 22.04 前提のコマンド例です。他環境ではパッケージ名が異なる場合があります。 ubuntu22.04にgstreamerをインストールしてsrtを使えるように設定します。 gstreamerは、オーディオやビデオなどのマルチメディアデータを処理するためのマルチメディアフレームワークです。 srtは、信頼性の高いローレイテンシーのビデオストリーミングを実現するためのオープンソースのトランスポートプロトコルです。 簡単にいえば、ffmpegとrtmpと同じような仕組みです。個人的な意見として、どちらでも同じような機能がありますがライブストリーミングならffmpegよりgstreamerって感じです。gstreamerはパイプラインが難解で嫌われがちです。こちらも読んでおくと良いでしょう。 https://github.com/haivision/srt.git ubuntu22.04にsrtをインストールする方法 gstremerの中にsrtを入れる方法とシステム全体にsrtを入れる方法があるようですが、システム全体にsrtを入れる方が簡単そうなので、そのようにします。まずsrtのインストールから。まずは、定番のubuntu更新です。 sudo apt update sudo apt upgrade srtをビルドするために必要な依存パッケージをインストールします。これにはビルドツール、ライブラリ、スクリプトエンジン、パッケージ構成管理ツールが含まれます。定型のインストールです。そしてgitをインストールします。 sudo apt install tclsh pkg-config cmake libssl-dev build-essential sudo apt install git githubからsrtのリポジトリをクローンして、ビルドディレクトリを作成し、そのディレクトリに移動します。cmakeを使ってビルドシステムを構成します。..は親ディレクトリです。 git clone https://github.com/haivision/srt.git cd srt mkdir build cd build cmake .. make sudo make install 環境変数を設定して、システムが/usr/local/libディレクトリにある共有ライブラリを見つけられるようにします。.bashrcファイルに設定を追加してシェルに適用します。 echo 'export ld_library_path=/usr/local/lib:$ld_library_path' >> ~/.bashrc source ~/.bashrc sudo ldconfig srtのインストール完了です。 ubuntu22.04にgstreamerのインストール gstreamerをインストールします。いろいろなツールやプラグインをまとめてインストールします。これで多様なメディアフォーマットの再生、エンコード、ストリーミングが可能になります。ちなみにsrtはgstreamer1.0-plugins-badが対応しています。 sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly ldconfigでシステムのキャッシュを更新します。これにより、新しくインストールされたライブラリが正しく認識されるようになります。正しくsrtが入ったかコマンドで確認します。 sudo ldconfig gst-inspect-1.0 srtsrc gst-inspect-1.0 srtsink 今回は適当なusbカメラを接続しました。以下コマンドで hd usb cameraを調べて設定に反映しています。接続するカメラによって異なるでしょうから参考までにどうぞ。 lsusb bus 001 device 002: id 32e4:9230 hd usb camera hd usb camera lsusb -v -d 32e4:9230 udevadm info -q all -n /dev/bus/usb/001/002 dmesg | grep -i usb srtの受信側を設定します。別のパソコンでobsを用意しました。ソースメディアでsrtの受信設定をします。pcのipは192.168.10.17です。obsを起動してメディアソースでsrtを受信できるようにします。 srt://192.168.10.17:10000?mode=listener mpegts セキュリティが疎通を邪魔することがあるので、いったんwindowsガードを全部切りましょう。 ubuntu22.04側に戻り以下コマンドをテストします。usbカメラは/dev/video0として認識しています。192.168.10.17のポート10000へ送信します。受信が確認できるでしょう。 gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1920,height=1080,framerate=30/1 ! jpegdec ! videoconvert ! x264enc bitrate=10000 speed-preset=ultrafast tune=zerolatency ! mpegtsmux ! srtsink uri=\"srt://192.168.10.17:10000?mode=caller\" 受信を確認できたのでちょっとカスタマイズします。現在の時間やカメラを180度反転を設定しました。 gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1920,height=1080,framerate=30/1 ! jpegdec ! videoconvert ! videoflip method=rotate-180 ! clockoverlay halignment=left valignment=top font-desc=\"sans, 12\" time-format=\"%y-%m-%d %h:%m:%s\" ! x264enc bitrate=10000 speed-preset=ultrafast tune=zerolatency ! mpegtsmux ! srtsink uri=\"srt://192.168.10.17:10000?mode=caller\" 以上でgstreamerでsrtを送受信できるようになりました。めでたしめでした。"
  },
  {
    "title": "ubuntu24.04/ubuntu22.04にWireGuardをインストール",
    "url": "/blog/ubuntu22-04wireguard/",
    "description": "",
    "tags": [
      "作ったもの"
    ],
    "date": "2024年3月2日22時30分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ubuntu のカーネル・パッケージ名・推奨ツールは lts のマイナーアップデートで変わることがあります。公式の wireguard セットアップ手順と照合してください。 鍵の取り扱い・ファイアウォール・nat は環境依存です。本番構成はセキュリティ要件に合わせ再設計してください。 記事内のコマンド例は ubuntu 22.04 系を想定しています。他版ではパスやサービス名が異なる場合があります。 ubuntu24.04/ubuntu22.04にwireguardをインストールします。 まずはパッケージリストの更新、システムの全アップグレード、そして不要になったパッケージの自動削除をします。 。 sudo apt -y update は利用可能なパッケージのリストを更新します。 sudo apt -y dist-upgrade は新しいバージョンのパッケージにシステムをアップグレードし、依存関係にあるパッケージも考慮します。 sudo apt -y autoremove はもはやシステムに必要ではなくなったパッケージを自動的に削除します。 sudo apt -y update && sudo apt -y dist-upgrade && sudo apt -y autoremove wireguard vpnソフトウェアをインストールします。 sudo apt -y install wireguard 管理者権限に移行します。sudo iを使うべきだという人もいるでしょう。セキュリティはご自身で考慮ください。 sudo su wireguardのフォルダーに移動します。 cd /etc/wireguard umask 077 を設定します。これにより、現在のシェルセッションで新しく作成されるファイルやディレクトリのアクセス権を設定します。rootのみが読み書きできる権限に設定しました。これでwireguardの秘密鍵や設定ファイルは、他のユーザーからは操作できません。 umask 077 秘密鍵と公開鍵を生成します。 wg genkey | tee privatekey | wg pubkey > publickey 秘密鍵と公開鍵を表示します。あとで使うのでコピーしてペーストで使うので、適宜メモってください。 サーバー側のprivatekey、サーバー側のpublickey 、と表現することにします。 cat privatekey cat publickey 次は、/etc/sysctl.d/99-sysctl.confをnanoやvimなどで開いて、net.ipv4.ip_forward 行の先頭にあるコメントアウト（#）を削除します。以下sadコマンドで同じことをしています。 sed -i '/^#net\\.ipv4\\.ip_forward/s/^#//' /etc/sysctl.d/99-sysctl.conf 次に/etc/wireguard/wg0.confを書きます。nanoで開きます。nanoの使い方は説明しません。 nano /etc/wireguard/wg0.conf 以下の設定をペーストします。 addressなど適宜設定してください。 wiregaredサーバのipです。 またpostupとpostdownにて、natルールに加えてforwardチェーンを使用したルールが使うことで、wireguardインターフェースから受信したトラフィックを、他のインターフェース（この場合は eth0）を通じて転送（フォワーディング）することを許可します。 つまり、vpnクライアントがサーバーを経由して他のネットワークへアクセスできるようになります。 **eth0は実際に使っているネットワークインターフェースに書き換えてください。 **[peer]は後ほど追加するクライアント側の設定です。 ip aなどで使っているlanポートの名称（ネットワークインターフェース）を必ず確認してください。 enp2s0など、pcによって結構違うことがあります。 **下記iptablesのeth0をその名称に書き換えてください。 ** [interface] address = 10.1.0.1 listenport = 51820 privatekey = ＜サーバー側のprivatekey＞ postup = iptables -a forward -i %i -o eth0 -j accept; iptables -a forward -i eth0 -o %i -j accept; iptables -t nat -a postrouting -o eth0 -j masquerade postdown = iptables -d forward -i %i -o eth0 -j accept; iptables -d forward -i eth0 -o %i -j accept; iptables -t nat -d postrouting -o eth0 -j masquerade [peer] publickey = ＜クライアント側のpublickey＞ allowedips = 10.1.0.2/32 wireguard vpnインターフェースwg0を起動し、設定ファイル(/etc/wireguard/wg0.conf)に基づいてvpn接続を確立します。インターフェースやiptablesルールが正しく設定されているか確認します。 wg-quick up wg0 ip addr show dev wg0 iptables -s 起動時に自動的に開始するように設定して確認します。 systemctl enable wg-quick@wg0 systemctl is-enabled wg-quick@wg0 /etc/sysctl.confファイル内のnet.ipv4.ip_forward=1行のコメントアウトを削除し、ipフォワーディングを有効にする設定のコメントを解除します。 sudo sed -i 's/^#\\(net\\.ipv4\\.ip_forward=1\\)/\\1/' /etc/sysctl.conf sudo sysctl -p リブートしてwireguardの状態を確認します。 reboot sudo wg 実際の環境に合わせてufwなど適宜設定してください。listenport = 51820を使っているのでポートを許可するなど。この辺りは詳しく説明しません。実際の環境によってさまざまだからです。 sudo ufw allow 51820 次にクライアント側を準備します。ubuntuで準備もできますがwindowsが簡単なのでwindowsで準備します。windowsのwireguardをインストールします。ubuntuで準備する場合はwireguardをインストールして、/etc/wireguard/wg0.confに以下設定を作ればokなはずです。 https://www.wireguard.com/install/ トンネルの追加を選択して空のトンネルを追加します。そうすると クライアント側のprivatekey、クライアント側のpublickeyが得られます。以下は使わないのでそのまま公開していますが、公開してはいけない表示です。 例えば以下のように設定します。address以下を追記します。 [interface] privatekey = ＜クライアント側のprivatekey＞ address = 10.1.0.2/32 [peer] publickey = ＜サーバー側のpublickey＞ allowedips = 10.1.0.0/24 endpoint = ＜サーバー側のip＞:51820 persistentkeepalive = 25 再びサーバー側に戻り、wg0.confファイルを開いて[peer]にクライアントの設定を追加します。クライアント側のpublickeyを追加します。クライアントを増やす場合は[peer]をどんどん追加すればokです。 nano /etc/wireguard/wg0.conf [interface] address = 10.1.0.1 listenport = 51820 privatekey = ＜サーバー側のprivatekey＞ postup = iptables -a forward -i %i -o eth0 -j accept; iptables -a forward -i eth0 -o %i -j accept; iptables -t nat -a postrouting -o eth0 -j masquerade postdown = iptables -d forward -i %i -o eth0 -j accept; iptables -d forward -i eth0 -o %i -j accept; iptables -t nat -d postrouting -o eth0 -j masquerade [peer] publickey = ＜クライアント側のpublickey＞ allowedips = 10.1.0.2/32 windows側でvpnを接続します。転送が少しでも受信の数値が出れば、成功です。ここが0だと何か間違っています。 ポートの開放、ポートフォワードの設定が必要になるので、つながらない場合はそれらの設定が上手くいっていないことが多いです。本記事で説明したいところですが、使っているルーターによって大いにことなることや、固定ipやawsなどサーバー環境によっても大きく違うので適宜設定が必要です。 例えば家のルーターの場合は、natエントリとして以下のような項目設定になります。51820ポートに来た通信は、192.168.10.203へ転送するよという設定です。 本記事でも、なぜかつながらず10時間ぐらい悩みました。その原因が以下です。 ①postup postdownの記述で、eth0としたものの、実際に使ったサーバーのネットワークインターフェースがeno1でした。 ②ポート51820を51280としていた。意外と気が付かないミスです。 またwireguardのサーバーを自宅に設置したのですが、なぜかローカルの機器からはvpn接続ができない現象が発生しました。これは同じ物理ネットワーク内のデバイスが、ネットワークの外部向けに公開されたipアドレス（例えば、vpnサーバーの公開ip）を使用して、そのネットワーク内のサーバーにアクセスできないためです。 それらを解決するためにnatループバック（またはヘアピンnat）をルーター側で設定するのですが、自宅のルーターにはそのような機能がありません。そのためhostsファイル（c:\\windows\\system32\\drivers\\etc\\hosts）に次のように設定して 192.168.10.21 myvpnserver.local エンドポイントを以下に設定して直接wireguardのサーバーに接続するようにしました。 endpoint = myvpnserver.local:51820 無事繋がりました。でもよく考えたらhostsファイルを使わなくてもこのようにすればよいですね。 endpoint = 192.168.10.21:51820 しかしこうすると、ローカルに接続した場合と、外のインターネットに接続した場合で毎回設定を変えなくてはいけません。とてもめんどくさい。そこで以下の対策をしたところ自動化できました。これがベストの方法とは思えませんがとりあえず自動で変更されます。 ユーザー名やフォルダーやファイルの位置は、ご自身の環境に合わせて調整してください。 sudo nano /home/riragon/wgchange.sh #!/bin/bash # 設定項目 local_ip=\"***********:51820\" # サーバーのローカルipとポート public_ip=\"***********:51820\" # サーバーのパブリックipとポート wg_interface=\"wg0\" # wireguardインターフェース名 server_pub_key=\"***********+**********************************\" # サーバー側のpublickey # ログファイルの設定 log_file=\"/var/log/wgchange.log\" # 現在の日時をログに記録 echo \"$(date '+%y-%m-%d %h:%m:%s') - スクリプト開始\" >> $log_file # ネットワーク内にルーターがいるか確認 # サーバーのローカルipを***********に入れる if ping -c 1 -w 1 *********** >/dev/null 2>&1; then # ローカルネットワーク内 endpoint=$local_ip echo \"$(date '+%y-%m-%d %h:%m:%s') - ローカルネットワークと判断。エンドポイントを $endpoint に設定します。\" >> $log_file else # 外部ネットワーク endpoint=$public_ip echo \"$(date '+%y-%m-%d %h:%m:%s') - 外部ネットワークと判断。エンドポイントを $endpoint に設定します。\" >> $log_file fi # wireguardの設定を変更 wg set $wg_interface peer $server_pub_key endpoint $endpoint if [ $? -eq 0 ]; then echo \"$(date '+%y-%m-%d %h:%m:%s') - wireguardのエンドポイントを $endpoint に設定しました。\" >> $log_file else echo \"$(date '+%y-%m-%d %h:%m:%s') - wireguardのエンドポイント設定に失敗しました。\" >> $log_file exit 1 fi echo \"$(date '+%y-%m-%d %h:%m:%s') - スクリプト終了\" >> $log_file 権限をあたえます。 sudo chmod +x /home/riragon/wgchange.sh ログの権限を与えます。 sudo touch /var/log/wgchange.log sudo chmod 644 /var/log/wgchange.log sudo chown root:root /var/log/wgchange.log サービス化します。 sudo nano /etc/systemd/system/wgchange.service 管理者権限で実行します。 [unit] description=wireguard endpoint change service after=network-online.target wants=network-online.target [service] type=oneshot execstart=/home/riragon/wgchange.sh remainafterexit=true [install] wantedby=multi-user.target サービスの自動起動を設定します。 sudo systemctl daemon-reload sudo systemctl enable wgchange.service sudo systemctl start wgchange.service sudo systemctl status wgchange.service 以下のようにローカル化どうかを判断して、エンドポイントを切り替えるスクリプトになります。 ● wgchange.service - wireguard endpoint change service loaded: loaded (/etc/systemd/system/wgchange.service; enabled; vendor preset: enabled) active: active (exited) since mon 2024-11-04 10:50:00 jst; 1s ago process: 12345 execstart=/home/riragon/wgchange.sh (code=exited, status=0/success) main pid: 12345 (code=exited, status=0/success) 2024-11-04 10:50:00 - スクリプト開始 2024-11-04 10:50:00 - ローカルネットワークと判断。エンドポイントを 192.168.10.203:51820 に設定します。 2024-11-04 10:50:00 - wireguardのエンドポイントを 192.168.10.203:51820 に設定しました。 2024-11-04 10:50:00 - スクリプト終了 という感じで自動的にipを判別して、エンドポイントを切り替えるスクリプトです。 これが良いかというと微妙な気もします。トラブルが起きたときに原因が分かりにくくなりそう。"
  },
  {
    "title": "NDIカメラ3つの映像を切り替えて表示できる監視カメラアプリっぽいものをUE5で作ってみた",
    "url": "/blog/ue5-camera-app-ndi/",
    "description": "",
    "tags": [
      "ndi",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年2月25日1時43分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ue 側の ndi 受信とモバイル送信アプリの組み合わせは版依存です。プラグインとアプリ双方のリリースノートを確認してください。 ios/android のカメラ権限・バックグラウンド挙動・解像度プリセットは os アップデートで変わります。 ndi の利用規約と帯域要件は環境ごとに再確認してください。 前回usbカメラ３台をndi化してネットワークに送信しました。それら３本の映像を受信して、点キーでカメラを切り替える表示アプリをue5で作ってみます。 前回usbカメラ３台をndi化してネットワークに送信 https://riragon.com/ubuntu22-04-gstreamer-ndi-sdk-gst-plugin-ndi/ ue5(unreal engine 5)でndiを受信して表示する方法 https://riragon.com/unreal-engine-5-ndi-reception-display-guide/ ue5.2を起動して、次のようなプロジェクトを作りました。cameraactorを4つ。ndiスクリーンを3つです。 事前にndiプラグインをonにしております。 ndiの受信設定も3つ作成しておきました。 点キーを押すとカメラが切り替わるブループリントを作成しました。 0なら全体。1なら左のカメラ、2なら中央、3なら右といった感じです。最初だけ全体を表示します。 映像に残像が出るので以下をnoneにしています。 こんな感じにndiカメラの映像を切り替えできました。実用性という点では、あまり良い使い方ではないかもしれません。 しかしndiioのエラー出てしまい、、アプリの書き出しができず。。。断念。それから30時間ぐらい思考錯誤にて解決しました。まず以下のndiioエラーが出てbuild failedします。 expecting to find a type to be declared in a module rules named 'ndiio'... this type must derive from the 'modulerules' type defined by unreal build tool uathelper: パッケージ化 (windows): build failed 正しくndiioプラグインをパッケージ化できていないようです。そこでue_5.2のフォルダー内にあったndiioをプロジェクト内に移動しました。コピーではなく移動です。元のフォルダーを残さないで移動します。 c:\\program files\\epic games\\ue_5.2\\engine\\plugins\\ndiio ↓ue5.2のプロジェクトフォルダーndiplayer05だった場合 c:\\users----\\documents\\unreal projects\\ndiplayer05 にpluginsを作成して、ndiioフォルダーを丸ごと移動しました。これでビルドできました。 以上からプラグインを移動したことで認識しました。"
  },
  {
    "title": "UE5(Unreal Engine 5)でカメラ映像をNDIにして送信する方法を説明、NDI Unreal Engine SDK公式ページからSDKをダウンロード",
    "url": "/blog/ue5-camera-ndi/",
    "description": "UE5(Unreal Engine 5)でカメラ映像をNDIにして送信する方法を説明します。2024年2月時点ではUE5.3.2バージョンはndi-unreal-engine-sdkに対応していません。UE5.3.1もしくはUE5.2などそれ以前のバージョンを使いましょう。HDMIやSDIなどを使わずに映像をUE5から外に出すことができます。映像出力のいろいろな活用ができるのではないでしょうか。まず、NDI Unreal Engine SDK公式ページからSDKをダウンロードします。必要事項を入力すると、ダウンロードリンクが表示されます。",
    "tags": [
      "ndi",
      "obs",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年2月24日11時36分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 virtual camera・ndi・live link まわりの推奨構成は ue とプラグインの版で変わります。該当バージョンのセットアップ手順を確認してください。 モバイル送信側アプリの api・ストア要件も更新されます。記事の端末 os 前提を確認してください。 ue5(unreal engine 5)で、カメラアクターの映像をndiにして送信する方法を説明します。hdmiやsdiなどを使わずに映像をue5から外に出すことができます。映像出力のいろいろな活用ができるのではないでしょうか。 まず、ndi unreal engine sdk公式ページからsdkをダウンロードします。必要事項を入力すると、ダウンロードリンクが表示されます。 https://ndi.video/for-developers/ndi-unreal-engine-sdk/ ダウンロードしたsdkのインストーラーを実行し、指示に従ってインストールを完了させます。 インストール時にue5のバージョンを選択できます。2024年2月時点ではue5.3.2バージョンはndi-unreal-engine-sdkに対応していません。ue5.3.1もしくはue5.2などそれ以前のバージョンを使いましょう。2024年2月以降のアップデートがあれば修正されるでしょう。 ndi-unreal-engine-sdkのドキュメントも読んでおくと良いでしょう。 ue5で新しいプロジェクトを作成し、プロジェクトを開きます。 プラグインを選択します。 プラグインセクションで「ndi io plugin」を検索し、チェックを入れてプラグインを有効にした後、ue5を再起動します。 ndi io pluginにチェックが入っているのを確認します。 ndi broadcast actorをドロップします。ndiを送出するカメラです。 ndi用のテクスチャーなどをいくつか必要なのでフォルダーを作成します。 ndi broadcast actorを選択して、ndi media sourceをクリックします。 ndi media senderをつくります。 さっき作ったフォルダーに保存します。 ndi broadcast actorのndi media sourceに追加されました。 追加されたndi media sourceをクリックします。 render targetをクリックします。 rnder targetを追加します。 フォルダーに保存します。 rnder targetが追加されました。 コンテンツドローワー内で右クリックをして、blueprint classを追加します。 actorを選択します。 作成したblueprint classをクリックします。 event graphを選択します。 addを押して、ndi broadcast componentを選択します。 ブループリント内で右クリックして、start broadcastingを選択します。 再生のトリガーが追加されました。 playと結びつけます。 保存とコンパイルします。 実行するとndiが流れました。遅延は前後しますが100～300msぐらいと低遅延な印象です。"
  },
  {
    "title": "UE5(Unreal Engine 5)でNDIを受信して表示する方法、ndi-unreal-engine-sdkを使います。",
    "url": "/blog/unreal-engine-5-ndi-reception-display-guide/",
    "description": "UE5(Unreal Engine 5)でNDIを受信して表示する方法を説明します。2024年2月時点ではUE5.3.2バージョンはndi-unreal-engine-sdkに対応していません。UE5.3.1もしくはUE5.2などそれ以前のバージョンを使いましょう。",
    "tags": [
      "ndi",
      "obs",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年2月24日0時41分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ue の ndi 連携（プラグイン・media framework）は版で手順が変わりやすいです。マーケットプレイスと epic のドキュメントを確認してください。 ndi sdk のライセンスと再配布条件は更新されることがあります。利用前に最新規約を確認してください。 ネットワーク帯域とファイアウォールがボトルネックになりやすいです。環境ごとに遅延とドロップを再計測してください。 ue5(unreal engine 5)でndiを受信して表示する方法を説明します。2024年2月時点ではue5.3.2バージョンはndi-unreal-engine-sdkに対応していません。ue5.3.1もしくはue5.2などそれ以前のバージョンを使いましょう。 まず、ndi unreal engine sdk公式ページからsdkをダウンロードします。必要事項を入力すると、ダウンロードリンクが表示されます。 ndi unreal engine sdk（公式） ダウンロードしたsdkのインストーラーを実行し、指示に従ってインストールを完了させます。 インストール時にue5のバージョンを選択できます。写真ではue5.3を選択していますが、ue5.3.2では動きません。2024年2月以降のアップデートがあれば修正されるでしょう。 ndi-unreal-engine-sdkのドキュメントも読んでおくと良いでしょう。 ue5で新しいプロジェクトを作成し、プロジェクトを開きます。 プラグインを選択します。 プラグインセクションで「ndi io plugin」を検索し、チェックを入れてプラグインを有効にした後、ue5を再起動します。 ndi tool本体のインストールがされてない場合は、以下のようなエラーがでます。ndi toolをインストールしましょう。 https://ndi.video/tools/ インストール後は登録画面など出てきますので設定を進めて再起動すれば上記エラーがきえるでしょう。 起動したらコンテンツブラウザで右クリックし、「media」から「ndi media receiver」を選択して、新しいndi media receiverアセットを作成します。 作成したアセットを開き、使用したいndiソースを選択します。 適宜ndiを選択します。 メディアプレートにndi media receiverアセットをドロップし、再生用のセットアップを完了させます。メディアプレートは、テクスチャなどの追加準備が不要なので簡単でいいですね。 メディアプレートで16:9などの比率を選択し、視聴しやすいように調整します。 設定が完了したら、再生してndiソースが正しく表示されるか確認します。 また、複数のソースの再生や、スムーズな再生が可能かどうかをテストします。 2つのndiソースをスムーズに再生できました。 この手順により、ue5でndiを受信して表示することができます。低遅延での再生が可能であり、バーチャルプロダクションやライブイベントなど、さまざまな用途に活用できる可能性があります。アイデア次第で、この技術を用いた革新的な利用方法が見つかるかもしれません。"
  },
  {
    "title": "WindowsやUbuntuにOBSを入れてUSBカメラの映像をNDI化、OBS-NDIプラグインやNDI SDKツールなど",
    "url": "/blog/windows-ubuntu-obs-ndi-sdk-install/",
    "description": "この記事では、WindowsまたはUbuntuにOBSをインストールし、USBカメラの映像をNDI化する手順を紹介します。OBSは無料で提供されている録画及びライブ配信ソフトウェアです。Windows版もUbuntu版もOBSの公式ウェブサイトからダウンロードできます。",
    "tags": [
      "ndi",
      "obs",
      "ubuntu",
      "作ったもの"
    ],
    "date": "2024年2月23日19時9分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 obs studio・ndi プラグイン・各 os のランタイムは更新が早いです。バージョン組み合わせごとの公式インストール手順を確認してください。 ndi sdk の配布条件・利用規約は変更されることがあります。再配布や商用利用前に最新規約を確認してください。 この記事では、windowsまたはubuntuにobsをインストールし、usbカメラの映像をndi化する手順を紹介します。obsは無料で提供されている録画及びライブ配信ソフトウェアです。windows版もubuntu版もobsの公式ウェブサイトからダウンロードできます。 obsにndiを追加するためには、ndiプラグインをインストールする必要があります。ndiは、ネットワーク経由でビデオとオーディオのストリームを送受信するための技術です。このプラグインをインストールすることで、obsでndiストリームを送信したり受信したりすることが可能になります。 obsとは obs（open broadcaster software）は、無料でオープンソースのビデオ録画およびライブストリーミングソフトウェアです。ソフトウェア開発者やストリーマー、ビデオ制作者など、さまざまなユーザーに幅広く使用されています。windows、macos、linuxの各プラットフォームで利用可能です。 ndiとは ndi（network device interface）は、newtekによって開発されたビデオストリーミング技術です。 この技術は、高品質のビデオをipネットワークを介して低遅延で送受信することを可能にします。 ndiは特に放送業界、ライブイベントのプロダクション、ビデオ会議、ライブストリーミングなどで広く利用されています。 ndiプラグインをインストールすれば、こんな感じにndiを扱えます。 usbカメラを選択します。 ndi outputを選択します。 main outputにチェックを入れます。 ndi として映像が流れました。簡単ですね。 それではwindowsとubuntuのobsとndiプラグインのインストール方法について説明しています。まずはwindowsから紹介します。 windowsにobsを入れてusbカメラの映像をndi化 obs (open broadcaster software) の公式ウェブサイトにアクセスします。 https://obsproject.com/ja/download windows版をダウンロードリンクを探してクリックします。これにより、最新バージョンのobs studioのインストーラがダウンロードされます。 :ダウンロードしたインストーラーを実行し、画面の指示に従ってインストールを完了させます。インストール中に設定をカスタマイズするオプションもありますが、初心者の方はデフォルト設定のまま進めることをお勧めします。 初期設定はキャンセルでokです。 obsにusbカメラの映像をndi化する機能を追加するには、ndiプラグインが必要です。obs-ndiを入れます。 https://github.com/obs-ndi/obs-ndi/releases 特にバージョンの希望がなければ、最新バージョンの実行ファイルをダウンロードします。windowsなのでobs-ndi-4.13.0-windows-x64-installer.exeを選択すればokです。exeファイルを実行するだけです。 obsを起動するとndiが使えるようになっています。ツールのndi outputからndiの出力ができます。ndi sdkも自動で入るから簡単ですね。 メディアからndi sourceを選択するとndiを受信できます。 以上でwindowsのobsのndiの設定完了です。次はubuntuです。 ubuntu22.04にobsを入れてusbカメラの映像をndi化 ubuntu22.04をインストールするハードウェアは、chuwi larkbox x amd ryzen 3750uです。 ndiのサイトから所定の登録を進めるとeメールでinstall_ndi_sdk_v5_linux.tar.gz をダウンロードできます。 ndi sdkのlinux版をダウンロードします。 バージョンによって名前やダウンロード方法など変わるでしょう。 https://ndi.video/download-ndi-sdk/ ダウンロードしたndi sdkのアーカイブを解凍します。ファイル名など適宜最適にしてください。 tar -xzvf install_ndi_sdk_v5_linux.tar.gz ndi sdkのインストーラースクリプトを実行します。インストール時の質問には10番までエンターでスキップしてから y を押して同意します。 10番を超えたら1回ずつエンターを押さないとスキップしてしまいます。 sudo ./install_ndi_sdk_v5_linux.sh ndi sdkのインストールディレクトリに移動します。ファイル名などバージョンによって若干ちがうかもしれませんので、lsなどで確認してください。要はlibのなかのx86_64-linux-gnuに進みます。 cd 'ndi sdk for linux' cd lib cd x86_64-linux-gnu ndiライブラリをシステムのライブラリディレクトリにコピーします。 ライブラリキャッシュを更新します。 直接ライブラリを移動すれば、環境変数など変更しなくてよいからです。 **lsでx86_64-linux-gnuのなかにlibndi.so.5.6.0などのファイルが3つぐらいあるはずです。 **それらを全部移動します。 **libndi.so.5.6.0だけ移動するのでもよいのかもしれません。 ** sudo cp libndi.so* /usr/local/lib/ sudo ldconfig /sbin/ldconfig.real: /usr/local/lib/libndi.so.5 はシンボリックリンクではありませんなど表示されるでしょう。libndi.so.5が実際のファイルであることを確認し削除します。 sudo rm /usr/local/lib/libndi.so.5 libndi.so.5.6.0への正しいシンボリックリンクを作成します。再度ldconfigを実行して、ライブラリキャッシュを更新します。エラーが無くなるはず。 sudo ln -s libndi.so.5.6.0 /usr/local/lib/libndi.so.5 sudo ldconfig 次にubuntuにobsをインストールします。 sudo add-apt-repository ppa:obsproject/obs-studio sudo apt update sudo apt install obs-studio ndiのプラグインobs-ndiを入れます。ubuntuなので、x86_64-linux-gnu.debを入れます。 https://github.com/obs-ndi/obs-ndi/releases インストーラーを実行します。 sudo dpkg -i obs-ndi-4.13.0-x86_64-linux-gnu.deb obsを起動するとndiが出てきました。obsの使い方はwindowsと共通です。 番外usbカメラの映像をndi化するならndi toolだけでもできる ndi toolは、windows向けに使いやすいツールをまとめられたソフトウェアです。同じく無料で使えます。windowsだけに提供されている機能も多いのです。いっけんわかりにくいのが特徴です。わかると簡単です。 https://ndi.video/tools/ インストールして、ndi toolでusbカメラの映像をndi化してみます。いっけんwebcamから作業するように見せかけて、実はスクリーンキャプチャーからndi化します。まさに予想外。 スクリーンキャプチャーをクリックすると、画面が立ち上がらず。。。実はwindowsの右下のタスクの隠れたところに出てきます。予想外！ 隠されたアイコンを右クリックするとメニューが出てきます。webカメラの部分を選択してカメラや解像度を指定します。 以上で完了です。usbカメラの映像がndiとして流れました。 ndiを使うことで、ネットワークで繋いだ複数のカメラからの映像をndiを通じて受信し、obsで切り替えながらライブ配信を行うことが可能です。ndiは高品質なビデオストリームをネットワーク経由で簡単に送受信できるため、様々な用途で活用できるでしょう。"
  },
  {
    "title": "ubuntu22.04でGStreamerとNDI SDKを使ってUSBカメラの映像をNDI化してネットワークに流してみた。gst-plugin-ndiなど。",
    "url": "/blog/ubuntu22-04-gstreamer-ndi-sdk-gst-plugin-ndi/",
    "description": "通常ではGStreamerにはNDIの機能はありませんが、NDI SDK（Software Development Kit）とGitで公開されているgst-plugin-ndiを使うことでGStreamerで取得したカメラ映像をNDI化してネットワークに流すことができます。",
    "tags": [
      "gstreamer",
      "ndi",
      "obs",
      "ubuntu",
      "作ったもの"
    ],
    "date": "2024年2月18日22時33分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ndi sdk・gstreamer プラグイン・パッケージ名は更新が早いです。newtek / 各配布元のインストール手順と対応版を確認してください。 ライセンス条項（sdk の利用範囲）は変更されることがあります。再配布や商用利用の前に最新規約を確認してください。 記事は ubuntu 22.04 前提です。カーネル・libndi の組み合わせでビルド要件が変わる場合があります。 通常ではgstreamerにはndiの機能はありませんが、ndi sdk（software development kit）とgitで公開されているgst-plugin-ndiを使うことでgstreamerで取得したカメラ映像をndi化してネットワークに流すことができます。 gstreamerでわざわざndiを使う理由は、2つあります。 異なる技術で比較するものではないのですが、rtsp/rtmpなどより低遅延で高品質です。 しっかりとした映像伝送を目的としているので、無線wifiなどのような通信が不安定な状況での利用には、あまり適していません。 施設内の映像伝送に使うには最適化もしれませんね。 ndiとして映像が流れてしまえば、ipの設定なども意識しなくてよいし、複数の端末から低遅延で高品質に映像を見ることができます。 直接gitを見てできる人はgst-plugin-ndiを見た方が早いでしょう。 https://github.com/teltek/gst-plugin-ndi gstreamerとは gstreamerは、マルチメディアコンテンツの作成、処理、および再生を扱うための強力なフレームワークです。 linux、windows、macosなど、さまざまなオペレーティングシステム上で動作し、高度なメディアハンドリングを可能にするオープンソースのライブラリとして設計されています。 ffmpegと同様に、gstreamerも多様なオーディオおよびビデオフォーマットをサポートし、エンコード、デコード、トランスコード、フィルタリング、ストリーミングなどの機能を提供しますが、そのアーキテクチャと使用法において独自の特徴を持っています。 https://gstreamer.freedesktop.org/ ndi とは ndi（network device interface）は、newtekによって開発されたビデオオーバーipのための技術です。 ndi sdk（software development kit）を使用すると、開発者はネットワーク経由で高品質のビデオとオーディオをリアルタイムで送受信できるアプリケーションを作成できます。 無線より有線で使うべき伝送技術で、有線ネットワークを介して使用することが推奨されており、映像の品質を重視したものです。 なので監視カメラの用途に最適化といえば、状況によるでしょう。 https://tricaster.jp/ndi-central/ os・usbカメラ・ハードウェア構成 usbカメラはelp usb webcamシリーズ、osはubuntu 22.04、ミニpcはchuwi larkbox x amd ryzen 3750u 最大4.0ghz 4コア8スレッド 8gb ram+256gbストレージtera term 5で作業するので最初にsshを入れています。 その辺は適宜設定してください。 ubuntu22.04でgstreamerとndi sdkを使ってusbカメラの映像をndi化してネットワークに流してみた。gst-plugin-ndiなど構築 opensshサーバーをインストール、ufw（uncomplicated firewall）をインストールして、ファイアウォール設定、ポート22（デフォルトのsshポート）への着信接続を許可します sudo apt install openssh-server sudo apt install ufw sudo ufw allow 22 パッケージリストを更新して、最新バージョンにアップグレードします sudo apt update sudo apt dist-upgrade gstreamerおよびその基本プラグイン、追加のメディアフォーマット用のプラグインをインストールします sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-ugly git、curlをインストールします sudo apt install git sudo apt install curl rustのインストーラーをダウンロードし、実行します。これにより、rust言語とcargoパッケージマネージャがインストールされます。1) proceed with installation (default)を選択します。rustの環境変数を現在のシェルセッションに読み込みます。 curl --proto '=https' --tlsv1.2 -ssf https://sh.rustup.rs | sh source $home/.cargo/env 以下サイトから所定の登録を進めるとeメールでinstall_ndi_sdk_v5_linux.tar.gz をダウンロードできます。ndi sdkのlinux版をダウンロードします。バージョンによって名前やダウンロード方法など変わるでしょう。 https://ndi.video/download-ndi-sdk/ ダウンロードしたndi sdkのアーカイブを解凍します。ファイル名など適宜最適にしてください。 tar -xzvf install_ndi_sdk_v5_linux.tar.gz ndi sdkのインストーラースクリプトを実行します。インストール時の質問には10番までエンターでスキップしてから y を押して同意します。 10番を超えたら1回ずつエンターを押さないとスキップしてしまいます。 sudo ./install_ndi_sdk_v5_linux.sh ndi sdkのインストールディレクトリに移動します。ファイル名などバージョンによって若干ちがうかもしれませんので、lsなどで確認してください。要はlibのなかのx86_64-linux-gnuに進みます。 cd 'ndi sdk for linux' cd lib cd x86_64-linux-gnu ndiライブラリをシステムのライブラリディレクトリにコピーします。 ライブラリキャッシュを更新します。 直接ライブラリを移動すれば、環境変数など変更しなくてよいからです。 **lsでx86_64-linux-gnuのなかにlibndi.so.5.6.0などのファイルが3つぐらいあるはずです。 **それらを全部移動します。 **libndi.so.5.6.0だけ移動するのでもよいのかもしれません。 ** sudo cp libndi.so* /usr/local/lib/ sudo ldconfig /sbin/ldconfig.real: /usr/local/lib/libndi.so.5 はシンボリックリンクではありませんなど表示されるでしょう。libndi.so.5が実際のファイルであることを確認し削除します。 sudo rm /usr/local/lib/libndi.so.5 libndi.so.5.6.0への正しいシンボリックリンクを作成します。再度ldconfigを実行して、ライブラリキャッシュを更新します。エラーが無くなるはず。 sudo ln -s libndi.so.5.6.0 /usr/local/lib/libndi.so.5 sudo ldconfig gstreamer用ndiプラグインのリポジトリをクローンします。cd ~で元の階層に戻ります。それでリポジトリのフォルダーに移動します。 cd ~ git clone https://github.com/teltek/gst-plugin-ndi.git cd gst-plugin-ndi rusのインストールマネージャーrustupをsnap経由でインストールします。cargo、rustのパッケージマネージャをインストールします。gstreamerのndiプラグインをビルドします。 sudo snap install rustup --classic sudo apt install cargo sudo cargo build --release sudo apt install cargoで動作が止まる（もしくは時間がかかる？）場合は、途中で中止にして、何度か入力すると設定が進みます。 次は、ビルドされたプラグインをgstreamerのプラグインディレクトリにインストールします。このコマンドにより、ビルドされたndiプラグインがgstreamerによって認識され、利用可能になります。これによって、gstreamerを使用しているアプリケーションでndiストリームの受信や送信が可能になるわけです。 sudo install -m 755 target/release/libgstndi.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/ sudo ldconfig 念のため現在のユーザーを video グループに追加します。ビデオ関連のデバイスへのアクセス権を与えるためです。 sudo usermod -ag video $user gstreamerフレームワーク内でndi関連のプラグインが機能しているか確認してみましょう。 gst-inspect-1.0 ndi gst-inspect-1.0 ndisrc gst-inspect-1.0 ndisink 正常に動作すれば完了です。usbカメラを接続します。 sudo apt install v4l-utils sudo v4l2-ctl --list-devices 大抵/dev/video00か1にusbカメラが来ているはずです。このカメラはvideo0とvideo1の二つが表示されますが、video0が映像のようですね。 映像を送信するコマンドを入れてみます。これでネットワーク内にcamera1のndiが流れます。 sudo gst-launch-1.0 -v v4l2src device=/dev/video0 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! ndisink ndi-name=\"camera1\" ndiを受信できました。gstreamerにndi sdk（software development kit）とgitで公開されているgst-plugin-ndiを使うことでgstreamerで取得したカメラ映像をndi化してネットワークに流すことができました。 圧縮したいが出来ない！！！ fhdサイズで80mbpsぐらいのデータ量です。もっと減らしたいと思い、h264やh265の圧縮も使ってみます。例えばこんな感じです。 gst-launch-1.0 -v v4l2src device=/dev/video0 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! x264enc bitrate=5000 speed-preset=ultrafast tune=zerolatency ! h264parse ! decodebin ! queue ! ndisink ndi-name=\"camera1\" warning: erroneous pipeline: エレメント \"h264parse\" がありませんとエラーが出ましたので以下のgstreamer1.0-plugins-badを追加します。 sudo apt-get update sudo apt-get install gstreamer1.0-plugins-bad ndi sdkでは、送信されるデータは圧縮されません。いろいろ試行錯誤しましたが、うまくいきませんでした。どうやらndi hxという規格が圧縮機能も備えたもので、企業向けに有料で提供されているようです。 ndi hxに対応しているエンコーダー製品には、ビットレートを設定できるものがあります。企業向けに有料で提供されるndi sdk advanceを使用することで、そのような機能が利用できるようです。つまり圧縮をかけて無線などでも軽量に扱えるようにするには、個人の自作だと難しいということですね。 https://ndi.video/advanced/ もしくはwindowsならndi toolに含まれるndi bridgeを使うと、圧縮のビットレートを指定することが可能です。こちらは無料で使えます。 カメラ何台まで同時に送信できるかテスト ハードウェアは、chuwi larkbox x amd ryzen 3750uです。2022年3月に4万円ぐらいで購入したものです。ubuntuのサーバー用にいろいろ使えて便利です。 lanが2個あり、usb3ポートも4つあります。fhdのusb2.0カメラを3つまで動作しました。エンコードの設定を工夫すれば4つも動きそうですが。。。どうでしょうね。 カメラ3つを接続してデバイスを確認します。 sudo v4l2-ctl --list-devices こんな感じでリストアップされます。たぶんcam 0/cam 2/cam5が映像が出てくるカメラだと思われます。 どの番号にカメラが来ても良いように.shファイルを作成しました。 #!/bin/bash sudo gst-launch-1.0 -v v4l2src device=/dev/video0 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera1\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video1 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera2\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video2 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera3\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video3 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera4\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video4 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera5\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video5 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera6\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video6 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera7\" & sudo gst-launch-1.0 -v v4l2src device=/dev/video7 ! \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! videoconvert ! timeoverlay ! ndisink ndi-name=\"camera8\" & wait camera.shを実行すると3つのusbカメラの映像がndiで流れます。 ./camera.sh こんな感じにndiを受信できました。 shファイルをサービス化して自動起動させれば、usbカメラを監視カメラのように扱うこともできるでしょう。もう少しcamera.shをスマートにします。 #!/bin/bash # カメラの数を定義 num_cameras=8 # カメラごとにループ for ((i=0; i<num_cameras; i++)); do # gstreamerのパイプラインを実行 gst-launch-1.0 -v v4l2src device=/dev/video$i ! \\ \"image/jpeg,width=1920,height=1080,framerate=30/1\" ! jpegdec ! \\ videoconvert ! timeoverlay ! ndisink ndi-name=\"camera$((i+1))\" & done wait 実行権限を付けます。 chmod +x camera.sh sudo usermod -ag video $user 以上です。"
  },
  {
    "title": "表面などメッシュがデコボコになるフォトグラメトリですがMeshmixerでメッシュをつるつる滑らかに簡単に修正できますし無料です",
    "url": "/blog/photogura-mesh-shusei/",
    "description": "Meshmixerは、メッシュの面を整える点においては、とても優れています。BlenderとZBrushでも同様のことができるのですが、薄い物体に関してはMeshmixerが一番優れているように感じます。さすがAutodeskのソフトウェアです。いや～便利ですね。フォトグラメトリと一緒につかう定番ですね。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年2月8日23時1分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 meshmixer は開発終了しており入手経路や代替ツールの状況が変わります。利用前に配布元とライセンスを確認してください。 フォトグラメトリ後処理のワークフローは meshroom / realitycapture 等の版で ui が変わります。記事は当時のツールチェーン前提です。 メッシュの修復結果は元データの解像度とノイズに強く依存します。パラメータは都度調整してください。 フォトグラメトリでデコボコのメッシュを滑らかに平らにできる無料のソフトウェアを紹介します。 meshmixerは、3dプリントの準備や修正、メッシュの編集などスカルプトツールとして使える無料のソフトウェアです。 いろいろな機能があり3dモデリングなどもできるようですが、そのような使い方をしたことがありません。 まあモデリングならbledner使った方がよいでしょう。 meshmixerは、メッシュの面を整える点においては、とても優れています。blenderとzbrushでも同様のことができるのですが、薄い物体に関してはmeshmixerが一番優れているように感じます。さすがautodeskのソフトウェアです。いや～便利ですね。フォトグラメトリと一緒につかう定番ですね。 例えば、フォトグラメトリしたものは、メッシュの面がボコボコになります。困ったものです。objなどで適宜書き出します。 meshmixerで開きます。meshmixerはこちらからダウンロードできます。なんだかあまりメンテナンスされていない感じのサイトになっていますが、問題なく使えます。 https://meshmixer.com/download.html objファイルをドロップすればokです。私のpcは何故かpdfに紐づけされていて、アイコンがpdfですが気にしないでください。 こんなにもメッシュ面がデコボコです。 スカプトルのブラシを選びます。ブラシの最後にあるボコボコを直すツールを選択します。これはメッシュをいい感じに凹凸をまっすぐにしてくれます。 奥行を-50にします。これで薄い物体でも穴が開きにくくなります。 簡単にツルツルです。 フォトグラメトリと一緒に使うと、デコボコ、ガタガタになりやすい面がまっすぐ滑らかになります。"
  },
  {
    "title": "UE5のムービレンダーキューで白黒のマスクを書き出す方法、マスキングができると動画の合成など、すごく便利で素晴らしいぜ",
    "url": "/blog/masking-with-video-in-ue5-unreal-engine-5-and-compositing-with-after-effects/",
    "description": "",
    "tags": [
      "UE5"
    ],
    "date": "2024年2月1日23時21分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ue のコンポジット・メディアパイプラインと after effects のエフェクト名は版で変わります。各ソフトのリリースノートを確認してください。 クロマキー品質は素材の解像度・圧縮・ライティングに強く依存します。記事のパラメータは出発点です。 カラーマネジメント（linear / srgb）の設定ズレで背景合成が不自然になることがあります。 ue5（unreal engine 5）は、その高品質な映像表現と柔軟な機能により、ゲーム開発者はもちろん映像制作者にとっても魅力なツールです。 例えば3dモデルやアセットを使用してシーンを構築し、シーケンサーからムービレンダーキューで、カメラの映像を高品質な動画素材として書き出すことができます。 さまざまなビジュアライゼーションとしても使えます。 動画素材の書き出しで、動画背景を透過させることもできます。合成作業を行う際に非常に便利です。しかし背景の透過設定を有効にするとアンチエリアス機能が使用できなくなることがあります。いろいろ使えない機能も出てきます。アンチエリアスは画像や映像のエッジを滑らかにする技術であり、映像素材として使う場合には必須の機能です。 そこでマスキングです。マスキングは、特定のオブジェクトやキャラクターを独立させ、背景や他の要素から分離する技術です。特定のエフェクトを適用する際に他のシーン要素に影響を与えずに済みます。ほかにもいろいろ便利です。以下、椅子だけマスクをかけてみました。 ue5でのマスキングと合成の利用は、映像制作プロセスにおいて、特にポストプロダクションの段階でその真価を発揮します。例えば、レンダリングされたシーンに後から特定のエフェクトを加えたり、実写映像を組み合わせる場合などが考えられます。使えるとスゲー便利という訳です。 そこで素晴らしい記事がこちらです。以下にue5のマスキング方法が説明されています。実際にやってみましょう。マスクを作って、そのあとアフターエフェクトでマスクをかける方法まで紹介します。 [ue5]ポストプロセスを使ったマスク作成 https://note.com/logic_magic/n/n37bd20b829e3 適当なシーンを作りイスを設定しました。手前にブロックも用意です。 コンテンツにマテリアルを作ります。 blendmodeをポストプロセスにします。 そして以下コードをマテリアルグラフに貼り付けます。図を見て自分で作ってもokですが、文字列をペースするだけでも貼り付けできるの知ってましたか？よくブループリントを作ってくださいと図が掲載あれますが、文字列で掲載してくれると便利です。 最後のif出力をのエミッシブカラーに接続してください。 https://docs.google.com/document/d/1x9iklewiujinuy2ucjaahaxjpq3fk7vr2qvmxwlhkqo/edit?usp=sharing ポストプロセスボリュームを作ります。分かりやすい適当な名前をつけます。 範囲を全体に設定します。 ポストプロセスボリュームのポストプロセスマテリアルのアレイに、先ほど作ったマテリアルを設定します。この辺が分からない場合は、先のマスク記事を参考にしてください。あちらの方が分かりやすいです。 設定が反映されて真暗です。 ライティングなしに設定します。 プロジェクト設定（エンジンレンダリング）にある「カスタム深度ステンシルパス」のプルダウンを開きます。 enabled with stencllにします。 マスクしたいイスを選択します。customで以下のように設定します。 ライティングありに戻すと、椅子だけ白くマスクされます。 手前のキューブに対してマスクを外したい場合は、手前の物体を選択して値を0にします。以下写真はチェックを外していますが、チェックを入れたまま、値を0が正しいかもです。 ムービーレンダーキューで書き出します。ムービーレンダーキューの使い方は説明しません。分からない場合は検索してください。マスクをかけた動画と、マスクなしの動画を書き出します。 マスクありと、マスクなしを書き出したました。連番のexrで書き出しています。 after effectsで静止画連番を取り込みます。この取り込み方法についても説明しません。分からない場合は、検索してください。 マスク有とマスク無をタイムラインに並べます。右クリックで、列を表示でモードとスイッチを表示します。 トラックマットで選択して、ルミナンスマットを選択するとマスクがかかり、背景が透過します。どっちを上にして、どっちをどうするか忘れてしまいました。分からない場合はぐぐってください。 という感じで、白黒のマスクで椅子だけくり抜けました。それでこんな風に動画を合成したりできます。"
  },
  {
    "title": "その5：3D-Coatで部屋の白い壁紙を撮影して、壁のPBR（物理ベースレンダリング）マテリアルを作成、UE5へ壁として設置してみた",
    "url": "/blog/3dcoat-pbr/",
    "description": "3D-Coatは、ウクライナのキエフに本社があるソフトウェア開発のスタジオPilgwayのソフトウェアです。 このソフトウェアを利用することでウクライナの応援にもなります。3D-Coatは、3Dモデリング、テクスチャリング、レンダリング、UVマッピングなど幅広い作業が可能です。",
    "tags": [
      "3dcoat",
      "blender",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年1月27日0時42分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 3dcoat の pbr ワークフロー・スマートマテリアル・エクスポートプリセットは版で ui が変わります。公式マニュアルを確認してください。 テクスチャの解像度とチャンネルパック方針は ue 側のマテリアル設計と整合させる必要があります。 ライセンス形態とアップデート権は販売ポリシーで変わることがあります。 3d-coatは、ウクライナのキエフに本社がある開発会社pilgwayのソフトウェアです。 このソフトウェアを利用することでウクライナの応援にもなります。3d-coatは、3dモデリング、テクスチャリング、レンダリング、uvマッピングなど幅広い作業が可能です。 競合製品としてzbrushやsubstance painterなどがあります。 それら製品より安い価格（永久ライセンスもしくはサブスクリプション）で使えます。 それぞれに素晴らしい得意な分野がありますが、3d-coatも劣らず使いやすいソフトウェアです。 私はスカプトルやテクスチャリングに使っています。 無料のblenderだけでも同様に作業できますが、いくつか使えるソフトウェアがあると、それぞれ得意な機能があるので作業がスムーズに進むことがあります。 3d-coat https://3dcoat.com/ 部屋の白い壁紙でbrマテリアルを作成 今回は、部屋の白い壁紙を撮影して、3dcoatで壁のpbrマテリアルを作成します。blenderで壁をつくって、壁にpbrマテリアルでテクスチャーを設定して、ue5に取り込んでみました。 pbr（物理ベースレンダリング）マテリアルは、物理に基づいたレンダリングのためのマテリアルのことです。 pbrは、光の物理的な挙動をシミュレートして、より現実的な3dグラフィックスを生成する技術です。 この手法は、光が物体の表面とどのように相互作用するかを数学的にモデル化し、リアルタイムグラフィックス（ゲームやインタラクティブメディア）および非リアルタイムレンダリング（映画やアニメーション）で広く使用されています。 壁をリピート素材にする まず壁を撮影。普通の白い壁です。この壁をリピート素材にしてpbrに取り込みます。 壁紙はこんな感じです。普通の白い壁です。これからリピート素材を作ります。端が端につながればリピート素材になります。 分かりやすく2000×2000ピクセルにします。中央にガイドを表示します。 リピート素材をつくるため、右下のマスを左上のマスへ移動します。。同様にすべてのマスを対角に移動します。 左下のマスを右上へ。 同様にマスを移動してゆきます。 これでリピート素材になりました。タイル状に並べたときつながればｏｋです。ほかにもいろいろなやり方があるでしょう。タイル状に並べてリピート素材（シームレステクスチャ）を作成するためのソフトウェアはいくつかあります。substance designer、gimp、pixplantなどです。 レイヤーを統合します。 張り替えて移動したので、色の違いが目立ちます。 色ムラを無くすために、レイヤーを複製して、水平と垂直反転をかけます。色の違いを打ち消すため反転させました。 不透明度を50％にします。色が混じるので色ムラがなくなります。ケースバイケースで作業します。模様がはっきりしている場合は上手くゆかないでしょう。この辺りはフォトショップの使い方ですね。 リピート面には、まっすぐな線が見えています。 画像を統合します。 選択した部分の自動修正ツールを選択します。このなぞった部分だけ修復してくるツールは、ちょっとした誤魔化しに最適です。 境界線をなぞります。 線の境が見えなくなりました。okなので画像を保存します。 気持ちデプスマップを作成します。デプスマップ（depth map）は、3dシーンや画像内の各点の距離情報を格納する画像データです。このマップは、一般的にグレースケール画像として表現され、明るい部分が近く、暗い部分が遠くを示します。壁紙は凹んでいる部分が陰になっているので、ちょうどよさそうです。彩度をゼロにします。 適当に色を調整します。 ２枚のテクスチャーが出来ました。 3dcoatでpbrマテリアルを作成 3dcoatのpbrマテリアルを選択します。 新規作成します。 名前をkabeとしました。カラーテクスチャーを読み込みます。 深度テクスチャーを読みます。3dcoatはノーマルマップは使わずにデプスマップを使います。もっと複雑な設定をすることで高度なpbrも作れるでしょう。 四角いブロックにぬります。 壁紙ができました。深度マップを無効にしているので平です。 深度マップも有効にすると、凹凸ができてザラツキが目立ちます。深度マップの強度を減らしてちょうどよくします。 設定からスケールを調整します。キューブは1mサイズでしょうか。壁1ｍぐらいでみた見た目に合わせます。 blednerで壁を作ります2m×4mです。 サイズを伸ばした分のuvメッシュを最適にするためctrl+aで、スケールを入れます。これでスケールで大きくした物体を実寸に変換できます。 スマートuv投影します。これでuvマップが自動で作成できます。 こんな感じにuvマップができました。 3dcoatへデータを移動します。pbrで壁を塗ります。部屋の壁ができました。 ファイルを書き出します。ue5に移動するときはfbxが推奨されていますが、objだとテクスチャーがそのまま取り込まれます。objで書き出します。 ue5へ取り込み ue5に取り込みます。実際の壁にそっくりな壁ができました。 テクスチャーの細かい設定も反映されています。細かすぎてよくわかりません。 写真で撮った壁を作ってue5に取り込めました。"
  },
  {
    "title": "その4：Blenderで小さなスイッチをモデリング、3Dcoatでテクスチャリングして、UE5で取り込み",
    "url": "/blog/modeling-small-switches-in-blender-texturing-in-3dcoat-importing-in-ue5/",
    "description": "",
    "tags": [
      "3dcoat",
      "blender",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年1月21日20時49分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 blender・3dcoat・unreal engine は版ごとに ui とエクスポート既定が変わります。各リリースノートでパイプラインを再確認してください。 pbr テクスチャの色空間とノーマル（opengl / directx）の取り扱いはツール間でズレやすいです。インポート設定を毎回確認してください。 3dcoat のライセンス形態とアップデート条件は変更されることがあります。 3d-coatは、ウクライナのキエフに本社がある開発会社pilgwayのソフトウェアです。 このソフトウェアを利用することでウクライナの応援にもなります。3d-coatは、3dモデリング、テクスチャリング、レンダリング、uvマッピングなど幅広い作業が可能です。 競合製品としてzbrushやsubstance painterなどがあります。 それら製品より安い価格（永久ライセンスもしくはサブスクリプション）で使えます。 それぞれに素晴らしい得意な分野がありますが、3d-coatも劣らず使いやすいソフトウェアです。 私はスカプトルやテクスチャリングに使っています。 無料のblenderだけでも同様に作業できますが、いくつか使えるソフトウェアがあると、それぞれ得意な機能があるので作業がスムーズに進むことがあります。 3d-coat https://3dcoat.com/ 小さなスイッチを3dモデリング 今日は、小さなスイッチを3dモデリングしてみました。blenderでモデリングして、3d-coatでテクスチャリングしてみます。私はcg初心者なので、もっと良い方法もあるでしょう。 スイッチの写真を撮影 まず簡単に上下左右正面の写真を撮りました。 blenderにて写真をガイドとして取り込みます。 取り込んだ写真のガイドを元にモデリングします。 コネクタ部分を押し込んで、筐体とコネクタの2つのモデルを作成します。 ac部分をちょっと押し出しました。 このledを光らせたいので、ここも押し込みます。 モデリング完成です。 あとでテクスチャーを貼り付けるとき、島を分かりやすくするため隙間をあけます。 3dcoatで画像を貼り付け 3dcoatにモデルを移動します。そしてコネクタ部分の写真を貼り付けます。 筐体のテクスチャーを作ります。リピート素材を作りました。 色の違いが目立つのなじませます。 素材完成です。 素材を3dcoatに取り込みます。 筐体にテクスチャーを貼り付けます。 細かい部分はフォトショップなどで微調整します。 書き出してue5に取り込みledも光らせてみました。 ue5上で、スイッチのシュミレーションの素材として使えそうですね。"
  },
  {
    "title": "その3：3DマウスをBlenderでモデリング、3D-Coatでテクスチャー、UE5に取り込み",
    "url": "/blog/3d-mouse-modeled-in-blender-textured-in-3d-coat-imported-into-ue5/",
    "description": "",
    "tags": [
      "3dcoat",
      "blender",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年1月21日13時14分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 blender・3dcoat・ue の版組み合わせでエクスポートオプションとマテリアル再現が変わります。各リリースノートを確認してください。 3d マウスデバイスのドライバと os サポートはメーカー更新の影響を受けます。記事の作業はモデリング手順の例です。 pbr セットの解像度と圧縮設定はターゲットプラットフォームのメモリ制約に依存します。 3d-coatは、ウクライナのキエフに本社がある開発会社pilgwayのソフトウェアです。 このソフトウェアを利用することでウクライナの応援にもなります。3d-coatは、3dモデリング、テクスチャリング、レンダリング、uvマッピングなど幅広い作業が可能です。 競合製品としてzbrushやsubstance painterなどがあります。 それら製品より安い価格（永久ライセンスもしくはサブスクリプション）で使えます。 それぞれに素晴らしい得意な分野がありますが、3d-coatも劣らず使いやすいソフトウェアです。 私はスカプトルやテクスチャリングに使っています。 無料のblenderだけでも同様に作業できますが、いくつか使えるソフトウェアがあると、それぞれ得意な機能があるので作業がスムーズに進むことがあります。 3d-coat https://3dcoat.com/ 3dマウスをblenderでモデリング 3dマウスをblenderでモデリングをして、3dcoatでテクスチャリングします。素材の質感が異なる部分を3つパーツに分離してそれぞれテクスチャーを貼り付けしてみます。blenderでガイドの写真を設置します。 円柱をおいて、あれやこれやします。 だいぶ似てきました。 スムースシェードを実行すると、滑らかになります。 3つのパーツが完成しました。 それぞれuvマップを作成します。 blenderからモデルを3dcoatに送ります。 3dcoatでテクスチャーを貼ります。 ロゴも貼り付けできます。それぞれのパーツに合わせてテクスチャーをペイントします。 blenderに戻すとこんな感じです。操作する部分はゴム、プラスティック、ステンレスなど設定しました。 ue5に取り込んでライティングでledの発光を再現しました。"
  },
  {
    "title": "その2：Blenderでオブジェクトを2分割して、2つのオブジェクトにするメモ書き",
    "url": "/blog/memo-note-to-split-an-object-into-two-objects-in-blender/",
    "description": "",
    "tags": [
      "3dcoat",
      "blender",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年1月20日23時3分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 blender のショートカット・メニュー名・編集モードの ui は版で変わります。該当バージョンのマニュアルを確認してください。 分離後の法線・マテリアルスロット・モディファイアの状態はトポロジに依存します。エクスポート前にシェードビューで確認してください。 記事はメモ的な短い手順です。大規模メッシュではパフォーマンスに注意してください。 3d-coatは、ウクライナのキエフに本社がある開発会社pilgwayのソフトウェアです。 このソフトウェアを利用することでウクライナの応援にもなります。3d-coatは、3dモデリング、テクスチャリング、レンダリング、uvマッピングなど幅広い作業が可能です。 競合製品としてzbrushやsubstance painterなどがあります。 それら製品より安い価格（永久ライセンスもしくはサブスクリプション）で使えます。 それぞれに素晴らしい得意な分野がありますが、3d-coatも劣らず使いやすいソフトウェアです。 私はスカプトルやテクスチャリングに使っています。 無料のblenderだけでも同様に作業できますが、いくつか使えるソフトウェアがあると、それぞれ得意な機能があるので作業がスムーズに進むことがあります。 3d-coat https://3dcoat.com/ オブジェクトをblenderで2分割して、切れてしまったメッシュを埋めて、二つのオブジェクトにする方法を説明します。二つのオブジェクトにする方法を利用してリモコンをモデリングして3dcoatでテクスチャリングしてみます。 blenderでキューブを2分割 blenderでキューブを2分割して、2つのオブジェクトにしてみます。オブジェクトを2分割すると、メッシュに穴が開きます。それを塞ぐ方法を説明します。 モデリングで2つにメッシュを分割します。 その部分の頂点を選択します。 右クリック、分離、選択するを選択します。 オブジェクトが2つにわかれました。しかし！ 切断の頂点だけ分離されてしまうので失敗です。 作業を戻して、分離したい側の全体を選択します。 右クリックして分離、選択します。 分離成功です。 2つに分かれてわかりやすくなりました。 片側のモデルを選択。切断面にはメッシュがないので、それらの頂点を選択します。 右クリックで、頂点から新規辺/面作成します。 オブジェクトが分離できました。 もう片側に同じ処理をします。 それぞれのオブジェクトのuvを作成します。 スマートuv投影を選択します。 3dcoatにオブジェクトを送ります。2つ同時に送るとテクスチャーがよくわからないことになるので、片側づつ3dcoatに送信しましょう。 色を付けて戻す。 色を付けて戻す。 ue5に取り込めました。 以上を応用して以下リモコンをモデリングします。 完了！"
  },
  {
    "title": "その1：Blenderと3D Coatを連動、Blenderでモデリングをして、3DCoatでテクスチャリングを検証",
    "url": "/blog/linking-blender-and-3d-coat-modeling-in-blender-and-verifying-texturing-in-3dcoat/",
    "description": "",
    "tags": [
      "3dcoat",
      "blender",
      "UE5",
      "作ったもの"
    ],
    "date": "2024年1月20日18時43分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 blender と 3dcoat の applink やファイル往復の手順は版で変わります。各公式の連携ドキュメントを確認してください。 fbx / obj など中間形式のスケール・法線・uv の扱いはエクスポートプリセットに依存します。 3dcoat の機能名とライセンス条件はアップデートで変更されることがあります。 3d-coatは、ウクライナのキエフに本社がある開発会社pilgwayのソフトウェアです。 このソフトウェアを利用することでウクライナの応援にもなります。3d-coatは、3dモデリング、テクスチャリング、レンダリング、uvマッピングなど幅広い作業が可能です。 競合製品としてzbrushやsubstance painterなどがあります。 それら製品より安い価格（永久ライセンスもしくはサブスクリプション）で使えます。 それぞれに素晴らしい得意な分野がありますが、3d-coatも劣らず使いやすいソフトウェアです。 私はスカプトルやテクスチャリングに使っています。 無料のblenderだけでも同様に作業できますが、いくつか使えるソフトウェアがあると、それぞれ得意な機能があるので作業がスムーズに進むことがあります。 3d-coat https://3dcoat.com/ blenderでモデリングをして、3dcoatでテクスチャリングをするためblenderと3d coatを連動してみます。そして実際に箱を作ってみます。 blenderと3d coatを連動 blenderと3d coatを連動させるためにパフォーマンスからプラグインを追加します。 3dで検索して、3d-coatを追加です。 3d-coatのタブが右側に出てきます。 書き出し先のフォルダーを特定のフォルダーを指定します。 exchangeのフォルダーを指定すればokです。 設定を保存。準備完了です。 バブのパッケージを撮影します。 切り抜いてそれぞれの側面を画像にします。 blednerでガイド画像を差し込むため、方向をまっすぐにします。 レイアウトのイメージから、リファレンスをクリックします。 参考画像を選択します。 参考画像が表示されます。 側面も同様にします。上下左右それぞれ正しい方向に設置されたことを確認します。 サイズなど調整して、こんな感じ。 ガイドを参考にキューブを作ります。 モデリングで頂点を透明にして、すべて選択します。 uvからスマートプロジェクトを実行します。 uvマップが作成されます。しかしこれでは面の比率が正しくありません。側面が小さいままです。 モデルを選択して3d-coatへ送ります。 先ほどの比率が違っていたので、テクスチャーの比率がおかしいです。 アイテムのスケールを見て、zが２倍になっているから、テクスチャの比率が合わないのです。 スケールを１倍に戻します。 頂点を移動して、サイズを大きくします。 今度は、１倍になりました。 もしくは、オブジェクトからスケールをリセットできます。こちらの方法が簡単でしょう。ショートカットctrl + aからも同様にできます。 モデルを選択してuvでスマートuvを選択します。 テクスチャーが同じサイズになりました。 データを送る。 ペイントすると、どこに何が来ているか分かります。 外部エディタで現在のレイヤーを編集することもできます。 フォトショップでテクスチャーを編集できます。 ワイヤーフレームのガイドが見えるので画像を張ります。 ガイドを元に全面に張り付けます。 完成したら、～へエキスポートを選択します。 blenderに取り込まれます。objやfbxで書き出します。fbxで書き出すとテクスチャーを再設定する必要があったります。objだと上手くいきます。 ue5で取り取り込みました。 完成！"
  },
  {
    "title": "一眼レフでRAWブラケット撮影で、HDR合成してHDR形式でHDRを書き出した32bitの幅広いダイナミックレンジを持つHDRデータで、明るさを全部保存",
    "url": "/blog/ichigan-raw-hdr-gousei/",
    "description": "RAWデータのHDR合成を紹介します。HDRはさまざまな種類がありすぎて、正直よくわかりませんよね。RAWデータのHDR合成とは、複数の露出レベルで撮影されたRAW画像データを組み合わせて、ハイダイナミックレンジ（HDR）の画像を作成するプロセスです。この手法は、通常の写真よりも広いトーンレンジと詳細を捉えることができます。",
    "tags": [
      "作ったもの"
    ],
    "date": "2024年1月14日14時21分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 adobe photoshop / camera raw の hdr 合成 ui （「最近追加された hdr」などの文言・パネル配置）はアップデートで大きく変わりうるため、手順は概念ガイドとして読んでください。 記事中の sony α7r iii はディスコン として書かれています。公式製品ページの url も変更・廃止されることがあります。 32bit hdr の表示 は os・モニターの hdr 設定・カラープロファイルに強く依存します。windows の hdr トグルや photoshop のカラー設定も版差があります。 カメラのブラケット枚数・ev ステップ は機種ファームウェアで選択肢が増減します。 rawデータのhdr合成を紹介します。 hdrはさまざまな種類がありすぎて、正直よくわかりませんよね。 rawデータのhdr合成とは、複数の露出レベルで撮影されたraw画像データを組み合わせて、ハイダイナミックレンジ（hdr）の画像を作成するプロセスです。 この手法は、通常の写真よりも広いトーンレンジと詳細を捉えることができます。 グタグタと前置きですが、色や形式や表示なども含めてhdrはいろいろあります。正直よくわかりません。よくあるhdrは、sdr形式でhdr合成したハイライトも下げて表示するhdr風だったりします。 格安のhdrモニターはとても怪しいものですし、真のhdrモニター（ソニーのマスモニとか）がなければ、本当のhdrの色を確認できませんし、rec.2020（またはbt.2020）は、非常に広範な色域をカバーしており現在の一般的なディスプレイ技術ではその全範囲を表示することが困難だったりします。 そして私たちがよく見ているテレビやスマホのほどんどは、sdrの709(srgb)というカラー環境が多いはずです。rawデータからちゃんとhdr合成をすると、数百万するマスモニの表示領域をも超える情報を持つデータになります。それをちょっと作ってみましょう。 撮影機材はsony α7rⅲ+fe 20mm f1.8 g カメラはすでにディスコンです。レンズは20mmの広角です。 https://www.sony.jp/ichigan/products/ilce-7rm3/ https://www.sony.jp/ichigan/products/sel20f18g/ hdr撮影をするときは、基本的にブラケット撮影をします。ブラケット撮影とは同じ場所で異なる露出設定で複数回撮影する方法です。基本的に一眼レフカメラならモードが用意されているはずです。 ブラケット撮影は、evのステップ数と何枚撮影するかで構成されます。今回はevのステップ数+1、9枚撮影にしました。この辺はカメラの設定を確認してください。室内から室外まで露出があった写真が撮れました。 photoshopで開きます。 camera rawで開かれます。 ブラケットで一番くらいカットでは、外の白い壁まで色が残っています。 一番あかるいカットでは、タイヤの暗い部分まで見えています。 ちなみに今みている映像はsdrです。右側のヒストグラムがsdrの範囲を示しています。 最近追加されたhdrをクリックします。 hdrモードに拡張されました。ヒストグラムが右側に4段ふえています。 左側がsdr、右側はhdrの色情報を示しています。 テレビや古いディスプレイでは、このsdrの領域で映像が表示されます。 最新のモニターでhdr対応でちゃんとしたものであれば、このぐらいまで表示されます。 hdrモードにして、9枚の写真を選択します。 右クリックしてhdr統合を選択します。 **「自動設定を適用にチェック」**を入れると色味が調整されてしますので注意です。色見が調整されるとhdr風になってしまいます。このほうが良い人もおおいでしょう。用途に合わせて設定してください。 hdr合成されました。ほとんど変化がありません。ライトの露出を下げてみましょう。 外側の色が出てきました。上手くhdr合成されています。 hdrに設定すると、32bitで書き出しできます。下にある設定で必要に応じてカラープロファイルを設定してください。 画像を開きます。 画面を統合したりすると、hdr形式で書き出せます。dngで書き出してもよいでしょうし用途に合わせて書き出すのがよいでしょう。 hdrで出てきました。hdrにおけるhdr形式のhdrです。これをhdrのディスプレイでwindowsをhdrモードに切り替えて、hdrで見ることでhdrで見れるのかもしれません。 hdrに幅広いダイナミックレンジがデータに含まれているか確認してみます。ダイナミックレンジが広すぎてモニターで表示されませんが、露出を上げ下げすると色が出てきます。 hdr風ではなく、hdrでちゃんと幅広いダイナミックレンジをもつ情報ができました。"
  },
  {
    "title": "デスクトップ画面を動画で軽量に素早くキャプチャーできるWebM（VP9対応）動画キャプチャーソフトウェアHoneycam",
    "url": "/blog/honeycam-desktop-capture/",
    "description": "Honeycamは、アニメーションGIFソフトウェアとして紹介されることが多いです。WebMの書き出しもできます。WebMのほうがずっと軽く滑らかな動画になるので、デスクトップ画面を動画で軽量に素早くキャプチャーできるソフトウェアとして優秀です。アニメーションGIFというより、軽量なWebM動画キャプチャーソフトウェアです。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年1月14日12時52分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 honeycam / bandicam の版によって 書き出し形式一覧（webm・avif・vp8/vp9 など）や ui が変わります。ファイルサイズ比較の数値は再現性のある実測ではなく当時の環境依存です。 無料版の制限 （録画時間・透かし等）や価格は公式で最新を確認してください。 wordpress で webm がそのまま埋め込めるか はテーマ・プラグイン・ホスティングの設定に依存し、ブラウザ対応も変化します。 vp9 より av1 等 が一般化するなど、コーデックの「おすすめ」は時代で変わります。 honeycamは、アニメーションgifソフトウェアとして紹介されることが多いです。 webmの書き出しもできます。 webmのほうがずっと軽く滑らかな動画になるので、デスクトップ画面を動画で軽量に素早くキャプチャーできるソフトウェアとして優秀です。 アニメーションgifというより、軽量なwebm動画キャプチャーソフトウェアです。 honeycam：制限がありますが無料でもお試しできます https://jp.bandisoft.com/honeycam/ デスクトップ画面を動画でキャプチャーするときは、obsやbandicamをよく使います。インターフェースや雰囲気が似ているなと思ったら同じ開発会社でした。ちなみにbandicamは韓国企業です。 https://www.24-7pressrelease.com/press-release/407612/bandisoft-released-honeycam-gif-maker-10-one-of-the-best-choices-for-fun-creators-in-the-internet-world なんとなくhoneycamより、bandicamを推しているなぁと感じますが、動画のみのキャプチャーならhoneycamがなかなか優秀です。静止画もキャプチャーも考えるとbandicamなのです。honeycamは静止画のキャプチャーが苦手です。 bandicamとhoneycamを用途に合わせて2つとも使っています。 購入してよかったソフトウェアです。 実際にhoneycamを使ってみます 起動すると画面はシンプルです。新しい録画でキャプチャーできます。 よくある感じのインターフェースです。 わかりやすい録画開始ボタンで録画を開始します。 10秒間だけ録画しました。保存可能なフォーマットを見てみましょう。 gif、webp、webm、mp4、apng、avifが選択できます。それぞれのサイズを見てみましょう。 gifは重たく61mbです。色数をもっと落とせば、もっと軽量にできますが、もう古い形式ですね。 webpはもう少し軽いです。画質の設定など同様ですが、前の履歴の画質設定になっているのか51ですが、同じ比較にしなければと思いつつ。gifもwebpも重たいという検証ということで詳しく比較しません。 webmは2.5mb軽い！！！ mp4が8mb。まあ普通！ avifも健闘ですが、この規格を使っている人はいるのでしょうか。 webmをもっと軽量にします。動きをみながらfpsを10に下げます。操作の動画キャプチャーは10fpsぐらいでもなんとかなります。1.44mbになりました。 映像サイズを小さくして700kbになりました。1344pxあれば十分でしょう。 保存することで保存できます。 保存だけではなく、いろいろ編集もできます。右したの編集をクリックします。 いろいろな編集メニューが存在ます。尺のカット機能しか使ったことがありません。細かく編集するなら編集ソフト使います。でもキャプチャー機能に加えて簡易編集もついているのは好印象です。 カットしてみます。 無駄な部分を選んで切り取りすればokです。 保存します。 短くなった分データが軽くなりました。 主要な設定を見てゆきます。初期設定では60秒しか録画できません。設定から最大で3600秒に延長できます。メモリにデータを保持する関係から録画時間に制限があるようですね。※無制限のmp4録画機能もありますが、その場合はobsとかbandicamを使ったほうが良いでしょう。 webm機能を見るとvp9に変更できます。 ちなみにvp8の場合は785kbあります。vp9にすると。。 vp9にすると、453kbまで小さくなります。動画なのにまるでjpeg１枚分のサイズです。 書き出した動画は、wordpressにドロップすれば、そのまま表示再生できます。それぞれの動画を以下にアップしました。 454kbのvp9データ（1344×756ピクセル）10fps 785kbのvp8データ（1344×756ピクセル）10fps 大き目なjpeg1枚の容量で、」10秒程度の動画を作れるキャプチャーソフトでした。"
  },
  {
    "title": "Unreal Engine 5で4K以上の高品質で高解像度な動画を再生したい場合はMP4やMOVよりEXRファイルがお勧め",
    "url": "/blog/exr-4k8k-h265h264-dougasaisei/",
    "description": "Unreal Engine 5で動画再生するときに、どんなフォーマットが良いか悩みます。MOVなどのコンテナをサポートしていなかったり４K以上の解像度を上手く再生できなかったりします。大容量で高速なストレージがあるならば、EXRファイル形式がおすすめです。静止画連番のように動画として再生できます。8Kの動画を再生できました。",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月13日16時33分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ue5 の メディア／imgmedia パイプライン と、 mp4・mov・h.264/h.265 の扱い はバージョンで変わりやすいです。 記事内の ウィンドウ名・メニュー（「1つのexr」など） は当時のエディタ ui です。現在のバージョンで公式ドキュメントを確認してください。 「4k 以上は連番 exr が向く」という方針は参考になりますが、 中間生成（premiere / after effects）の書き出しプリセット もアプリ版で異なる場合があります。 8k 再生は ディスク i/o・gpu メモリ に依存するため、同じ設定でも環境差が出ます。 unreal engine 5で動画再生するときに、どんなフォーマットが良いか悩みます。 movなどのコンテナをサポートしていなかったり４k以上の解像度を上手く再生できなかったりします。 大容量で高速なストレージがあるならば、exrファイル形式がおすすめです。 静止画連番のように動画として再生できます。 8kの動画を再生できました。 wikiによるとopenexr（オープンイーエックスアール）はハイダイナミックレンジイメージ（high-dynamic-range image, hdri）のための画像ファイルフォーマットで、オープン標準としてリリースされたものです。 映画産業で広く使用されており、特に視覚効果やデジタルインターミディエート、3dレンダリングなどの分野で重宝されています。 標準的なデジタルイメージングフォーマットよりも広い色と輝度の範囲をサポートしています。 rawやdngみたく情報量の多いデータです。 unreal engine 5でopenexr静止画連番を動画再生 premiere proやafter effectsなら動画をexrで書き出せます。今回は事前に準備してあります。テストフォルダーを作成しました。 事前にexr連番ファイルを準備しました。 ウィンドウのimgmediaから「1つのexr」を処理を選択します。 インポートソースでexrが入っているフォルダーを選びます。 一番先頭のファイル1つだけ選択すればokです。自動で連番を読み込みます。 出力先を設定します。 ue5のプロジェクトフォルダーの中の、先ほど作成したテストフォルダーを指定します。 画像を処理します。 インポートする時間がかかります。 次にコンテンツブラウザーのアイテムエリアにて、右クリックをして、メディアの中の、画像メディアソースを選択します。 作成された画像メディアソースをダブルクリックします。 取り込んだソースの先頭のファイルを選択します。 保存します。 画像メディアソースをドロップして設置します。 テストで再生してみると動画として処理されました。 exrは、rawやdngみたいな情報量の多いフォーマットです。h264やh265で圧縮されたファイルと比べるとファイルサイズは大きくなります。それゆえに再生には高速なストレージが必要です。pci4.0のnvmeストレージなどあるならば、exrの連番再生は劣化もしないのでとても良い感じですね。"
  },
  {
    "title": "UE5(Unreal Engine 5)で自由な形状に動画を表示できるカーブスクリーンの作り方を紹介します。",
    "url": "/blog/ue5-carve-screen/",
    "description": "UE5(Unreal Engine 5)で自由な形状に動画を表示できるカーブスクリーンの作り方を紹介します。前回記事のMedia Plate機能にて、記事内では紹介していませんが、メッシュ形状で球体を選んで角度を指定することで、カーブスクリーンにより簡単に動画を表示することも可能です。",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月9日23時14分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 geometry script やメッシュのブーリアン的操作はプラグインと ue の版で利用手順が変わります。該当バージョンのドキュメントを確認してください。 パフォーマンスはターゲットプラットフォームのポリゴン予算に強く依存します。 ue5(unreal engine 5)で自由な形状に動画を表示できるカーブスクリーンの作り方を紹介します。前回記事のmedia plate機能にて、記事内では紹介していませんが、メッシュ形状で球体を選んで角度を指定することで、カーブスクリーンにより簡単に動画を表示することも可能です。 より独自の形状を作りたい場合は、以下のカーブスクリーンの作り方をご参考くださいませ。 前回記事のmedia plate機能 https://riragon.com/ue5-douga-saisei-h265-mp4/ 自由な形状のカーブスクリーンをつくる 例えばblenderで円柱を作ります。blenderに関して難しい機能は使いませんが、細かい使い方も説明しませんので、はじめてblenderを使う人は簡単なチュートリアルをやっておくとよいでしょう。モデリングで円柱を加工してゆきます。 反対側のメッシュの点も選択できるように、この辺をクリックします。 頂点を削除などで要らない部分を消します。余分なものが残らないように上手く調整してください。 カーブ形状のスクリーンができます。 自由な形状に変更します。広げたり比率を変えたり。 uvを選択します。 展開をクリックします。メッシュが展開されます。 uvマップが表示されます。右の選択エリアに対して、左のuvマップが割り当てられているイメージです。 テクスチャーのサイズを設定するために新規をクリックします。 3840×2160ピクセルに設定しました。 左側のメッシュ回転したりサイズを合わせたりして、テクスチャーのサイズに合わせて調整します。以上で完了です。 レイアウトに戻ります。メッシュを選択してたぶん右クリックして、スムーズシェードにしてスムーズにしてみましょう。 素敵なカーブスクリーンができました。 fbxで書き出します。ジオメトリのスムージングを面にして、書き出します。これをチェックしておくと、ue5で取り込んだときに注意が出ない気がします。おまじないみたいなものです。 書き出したfbxをインポートします。適宜設定してください。 動画をドロップします。 動画をレベルにドロップします。media plateのおかで動画をドロップするだけで再生できるのは便利ですね。 球体から画角を指定してスクリーンを作ることもできるので試してみてください。エクイレクタングラーのマップなどを使うときは、球体から設定したほうが良い場合も多いでしょう。独自の形状を反映させたい場合は、その球体の隣のカスタムを選びます。 先ほどつくったfbxを取り込みます。 こんな感じのカーブスクリーンになっています。 動画を再生します。たいてい逆さになったり、裏返ったりします。blenderに戻りメッシュの形状を反転させてもよいです。 ue5内でメッシュの形状を反転させてもよいです。 以上で自由な形状にてスクリーンを作りたいときのヒントになれば幸いです。"
  },
  {
    "title": "UE5のレベル内に動画をアクター（スクリーン）に配置して再生する2つの方法。Media Plateを使うと簡単に動画を配置再生できます。",
    "url": "/blog/ue5-douga-saisei-h265-mp4/",
    "description": "2024年1月8日UE5.3.2を使った記事です。UE5のレベル内に動画をアクター（スクリーン）に配置して再生する方法を紹介します。動画を配置して再生する方法は大きく2つあります。古い方法は動画を読み込んでブループリントを設定して再生される方法です。新しい方法はMedia Plateを使う方法です。まずMedia Plateから紹介します。",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月8日20時1分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 windows / ue における h.265（hevc）のデコード可否は os・gpu・ストア拡張機能の組み合わせに依存します。公式の対応表を確認してください。 media player まわりの推奨コンテナとコーデックは ue の版で変わります。該当バージョンのメディアドキュメントを参照してください。 配信先やエンコードツールごとに要求されるプロファイルは更新されます。 2024年1月8日ue5.3.2を使った記事です。 ue5のレベル内に動画をアクター（スクリーン）に配置して再生する方法を紹介します。 動画を配置して再生する方法は大きく2つあります。 古い方法は動画を読み込んでブループリントを設定して再生される方法です。 新しい方法はmedia plateを使う方法です。 まずmedia plateから紹介します。 動画の基礎知識として、コンテナとコーデックがあります。コンテナはmp4やmovなど拡張子っぽい入れ物のことです。コーデックはh265やh264など圧縮方法です。ue5ではmp4を使ったほうがトラブルが少ないのでオススメです。mp4でh265を使うのがよいでしょう。 media framework の操作ガイドunreal engine 5 で media framework を使用するための操作ガイドのリンク集のue5ドキュメントも参照です。 https://docs.unrealengine.com/5.3/ja/working-with-media-in-unreal-engine/ media plateでue5のレベル内に動画をアクター（スクリーン）に配置して再生する方法 古い方法は、いろいろ面倒な作業をしましたがue5からmedia plate アクタを使うと簡単にできるようになりました。とても簡単です。 media plate アクタue5ドキュメントも参照 https://docs.unrealengine.com/5.1/ja/the-media-plate-actor-in-unreal-engine/ まずue5のコンテンツフォルダーの中に、適当な動画用のフォルダーを作ります。「エクスプローラで表示する」などを選び実際のフォルダーを表示します。apkファイルで書き出すときにコンテンツフォルダーの中に実際の動画がないとパッケージ化されないのでフォルダーに動画を配置する作業をしています。 作ったフォルダーに動画をドロップして移動します。ドロップした動画をコンテンツブラウザー内の対象のフォルダーにドロップして、ファイルメディアソースとなった動画をプレビューエリアにドロップするだけです。 制御関連もブループリントを作る必要がなくなりました。右側のパネルから設定できます。テストで動かすなら初期設定でよいです。 スクリーンの形状もより簡単に調整できるようになりました。自動アスペクト比にチェックが入っていれば、動画素材のサイズに自動で合わせてくれます。簡単ですね。手動で設定もできます。 apkで書き出す際に動画として機能させるために動画のurlの設定を確認します。ファイルメディアソースをタブルクリックします。 ファイルパスの右に「！」が出ていたら、参照しているurlではapkに動画をパッケージ化できないことを示しています。ue5のコンテンツフォルダーの中に移動したmp4を参照するようにします。 参照urlが、ディスクトップ上のフォルダー等を参照している場合は、パッケージ化ができないので注意です。 apkに書き出したら動画として見れました。これで完了です。簡単！！ 古い方法でue5のレベル内に動画をアクター（スクリーン）に配置して再生する方法 ue5のレベル内に動画をアクター（スクリーン）に配置して再生する古い方法を紹介します。動画を読み込んでブループリントを設定して再生される方法です。3840×1080の24p動画を作成しました。32:9のワイドな映像です。コンテナはmp4でコーデックはh265です。 movies等の適当なフォルダーを作ります。 moviesフォルダーを右クリックして、「エクスプローラーで表示する」を選択します。実際のリアルなフォルダーを開くためです。apkで書き出す場合に、実際のue5のコンテンツフォルダー内に動画がある必要があります。 moviesフォルダーに動画を移動します。 moviesフォルダーから、動画をue5のコンテンツブラウザーにドロップします。 コンテンツブラウザー内を右クリックして、メディアプレイヤーを追加します。 ビデオ出力mediatextureアセットにチェックを入れます。自動でテクスチャーをつくってくれます。 メディアプレイヤーを開きます。動画ファイルをクリックして、再生されるか確認します。コーデックなど再生できない場合は、electra playerなどを使う方法もあります。ここでは説明しません。 問題なく再生できたらレベルブループリントを開きます。 左下の変数の＋を押して、適当な変数名をつけます。 変数の型（booleanをクリック)をmedia playerにします。そのままオブジェクト参照型を選びます。 レベルプリント内（イベントグラフ）で右クリックをして、open sourceを追加します。※出てこない場合は、状況に合わせた表示のチェックを外します。 変数のmediaをレベルプリント内にドロップします。get mediaを選びます。 event beginplayとmediaとopen sourceを次のように繋げます。 いったんコンパイルを押します。 コンパイルを押すと、mediaの右側のデフォルト値が選択できるようになります。 先ほど作ったメディアプレイヤーを選びます。 media sourceのアセットを選択します。 動画のファイルソースを選択します。 保存、コンパイルをして完成です。 テストのためのスクリーンを用意します。planeを追加しました。 32:9になるように、サイズなど適当に調整します。 メディアテクスチャーを貼り付けます。適宜サイズ調整をします。 プレビュー...メニューから、androidの「プロジェクトをパッケージ化」で書き出し完了です。 新しいmedia plateを使うと簡単に動画を再生できます。その動画を細かく制御したい場合は、古いやり方のようにブループリントで再生等を管理する方がよいのかもしれません。"
  },
  {
    "title": "その4：2024年Unreal Engine 5.3を使用したOculus Meta Quest 3 MR（カラーパススルー）APKアプリ開発環境の構築と設定方法",
    "url": "/blog/oculus-meta-quest3-mrunreal-engine-5-3/",
    "description": "",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月4日22時0分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 記事タイトルどおり unreal engine 5.3 前提の手順です。5.4 以降では xr プラグインとプロジェクトテンプレートが変わっている場合があります。 meta quest 向けビルドは android / openxr のツールチェーン更新の影響を受けやすいです。公式の対応表を毎回確認してください。 パッケージングエラーのメッセージは版で文言が異なります。ログは参考として最新ドキュメントと照合してください。 前回、oculus meta quest 3の開発環境を整えるためにandroid toolsなどセットアップしました。今回は、カラーパススルー機能など動かしてみたいと思います。 oculus meta quest3でカラーパススルーで表示 unreal engine 5.3とoculus meta quest3でカラーパススルーで表示できるmrアプリのapkの書き出し方法を説明します。 quest3の目玉の機能は、カラーパススルーです。 カラーパススルーとは、仮想現実（vr）ヘッドセットを使っている際に、実際の周囲の環境をリアルタイムでカラー映像として表示する技術です。 これにより、ユーザーはvrの世界に没入しながらも、現実の環境を色付きで確認することが可能になります。 要は背景が透過しながら3dを表示できます。oculus meta quest3でmrのアプリを作る方法がさっぱりわからなかったので、unreal engine 5.3とoculus meta quest3でmrのアプリを制作する方法を調べました。 unreal engineのリソースをダウンロード oculus developer からunreal engineのリソースをダウンロードします。oculusデバイス向けの仮想現実体験を開発するためのツール、プラグイン、sdkが提供されています。unreal engine 5 integrationをクリックします。 https://developer.oculus.com/downloads/unreal-engine/ 2024年1月時点では60.0が最新版です。こちらをダウンロードします。 この60.0というバージョンはmeta questビルドバージョンと同一のようです。 meta questビルドバージョンが60.0に上がったら、unreal engine 5 integrationも60.0に上げる必要があるのでしょう。 meta questは自動でアップデートされるので、長期的な開発やサポートを考えると面倒ですね。 meta quest リリースノート unrealmetaxrplugin.60.0.zipを解凍して、unrealmetaxrplugin.60.0のファイルを「maketplace」のフォルダーを作り移動します。 c:\\program files\\epic gamesがインストールされているフォルダーを探してください。 通常はcドライブですが、意図的に別のドライブにインストールしている場合はこのような場合もあります。 例：x:\\ue_5.3\\engine\\plugins\\marketplace unrealmetaxrplugin.60.0.zipを解凍して、unrealmetaxrplugin.60.0のファイルを「maketplace」のフォルダーを作り移動するだけです。 パソコン側のoculusアプリを起動して、設定のベータの開発者ランタイム機能と、oculus link経由でのパススルーをオンにします。 oculus開発者の登録をしていなければ、ググって開発者登録をします。結構面倒です。 プロジェクトの作成と設定 ue5でバーチャルリアリティのプロジェクトを作成します。 編集からプラグインを開きます。 meta xrにチェックを入れます。必要に応じて再起動します。 現時点ではmeta xrにチェックを入れて、openxrにもチェックが入っていると機能しなくなります。openxrにもチェックを外します。openxrにもチェックを外すと、他の2つのチェックも外れます。 再起動します。 警告が出てきますが、無視します。プラグインの設定はいったん完了です。 編集からプロジェクト設定 編集からプロジェクト設定を選択します。 プラグインのmeta xrをクリックします。モバイル項目の下にあるsupported meta quest deviceの「＋」をクリックすると、meta quest 3が追加されます。 少し下の4つの項目のチェックを入れます。 最後の実験段階の機能にもチェックを入れます。 次はレンダリングの項目をクリックします。vrの次のカテゴリのポストプロセスのポストプロセスでのアルファチャンネルを有効の項目にて「allow through tonemapper」を選びます。設定完了です。 hmdの設定vrpawn 次は、hmdの設定を変更します。コンテンツドロワーの、vrtemplateのblueprintsのvrpawnをクリックします。 headmountsdisplaymessageを選択して、+追加をクリックします。 oculus xrpassthroughlayerを追加します。 子として追加されたことを確認します。 oculus xrpassthroughlayerをクリックして、右側の項目のステレオレイヤーのsupports depthとno alpha channelにチェックを入れます。 次の少し下ののstereo layer shapeのreconstructed passthroughを選択します。 stereo layer shapeを▽を開いて、undelayを選択します。 保存してコンパイルします。これでパススルーを試すことができます。 mrで透過させるために壁などを消します。 空があると透過しないので、空も削除します。真っ黒な空間が透過されます。 oculus linkで仮プレビュー oculus linkを起動して、メニューの上にある再生▼の右の...を開いて「vrプレビュー」を選択します。これでhmdでプレビューを見れます。 上手く背景が透過しない場合は、プレビューを停止して、もう一度プレビューをしてみたり、hmdを装着しない待機状態にしてからプレビューをしてみたりしてください。何度かやると上手くゆくでしょう。 apkを書き出して確認 このプレビューは、うまく機能しないことが多くあります。設定不足なのかよくわからない場合は、「androidのプロジェクトをパッケージ化」でapkを書き出して確認しましょう。 sidequestでapkをインストールします。sidequestの使い方やセットアップはググってください。 ここまでの記事を以下を参考にしています。上手くできない場合は、こちらをお試しください。 youtube（参考） 次に手の奥行きを有効にしてみます！ ハンドトラッキングや奥行きが有効になるとmrにて、オブジェクトの存在がリアルになります。これがなかなか複雑で完ぺきではないようですが、感動しますのでお試しください。 設定からプロジェクト設定に入ります。 プラグイン meta xrの hand trakingを有効にします。 一般の項目にあるcontroller pose alignmentをarmにします。 vrテンプレートのブループリントフォルダーのvrpawnをクリックします。 handleftとhandrightを選択します。 削除します。 cameraの子の子になっているoculusxrpassを、cameraの子に移動します。一つ上の階層にします。 こんな感じに並ぶようにします。 一度コンパイルをします。 エラーが出ます。ブループリントの下のほうの一群を削除します。 コンパイルをするとエラーが消えました。 motioncontrollerleftgripをleftにします。 同じようにもう一方をrightにします。 motioncontrollerleftgripに、＋追加をします。 handoと検索して、oculus xrhandを追加します。oculus xrhandleftとしましょう。 左右に同じように追加します。motioncontrollerrightgripにoculus xrhandrightにします。 leftの位置を －5.5 にします。 leftの位置を －6 にします。後で結果を見て適宜変更してみてください。 oculus xrhandleftのhand propetiesを変更します。 同じように反対側も変更変更します。 oculus xrhandleftを選択して、マテリアルオーバーライドを設定します。なしのところをクリックします。 わかりにくいですが、検索窓の横にネジアイコンがあります。そこをクリックします。 デベロッパーコンテンツを表示をクリックします。 エンジンコンテンツを表示をクリックします。 ついでにもう一つもチェック。 pokeと検索します。pokeaholematerialを選択します。 update hand scaleにチェックを入れます。 反対側も同じ設定にします。 pokeaholematerialをダブルクリックします。 ここのチェックが入っているか確認します。私も何をやっているのかよくわかっていませんねえ。 以上で設定完了です。保存、コンパイル、各種保存をしてください。 apkを書き出して確認 「androidのプロジェクトをパッケージ化」でapkを書き出して確認しましょう。今度はすぐに終わるでしょう。 sidequestでapkをインストールします。 以上でmrのプレビューができるようになりました。"
  },
  {
    "title": "その3：2024年Unreal Engine 5.3を使用したOculus Meta Quest 3 APKアプリ開発環境：Android Studio設定とUE5のSDK/NDK/JDKのバージョンや設定インストール方法",
    "url": "/blog/ue5-oculus-meta-quest-3-android-studio-sdk-ndk-jdk/",
    "description": "Unreal Engine 5.3を使用してOculus Meta Quest 3向けのAPKアプリを開発するための詳細な設定手順を紹介します。Windows 11上でAndroid Studioをインストールし、必要なSDK、NDK、JDKの選定と設定方法を解説。UE5の最新バージョン5.3.2に対応するAndroid SDKとNDKのバージョンの選択ポイントも提供します。エラー回避と効率的なビルドのための重要な情報が満載です。",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月4日0時34分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 android studio・sdk platform・ndk・jdk の推奨組み合わせは unreal engine の版ごとに指定が変わります。epic の android 向けドキュメントを毎回確認してください。 quest 向けビルドは meta の開発者向け設定名やツールチェーン更新の影響を受けやすいです。公式の quest 開発ガイドを併読してください。 gradle / agp のエラーメッセージは版で文言が変わります。記事のログ例と完全一致しない場合があります。 2024年1月3日時点の記事です。 前回はoculus linkを使いmeta3でvrプレビューをいろいろ試しました。 今度はmeta3にて、スタンドアローンでアプリを動作させたくue5で開発環境を整えました。 開発環境の準備は、慣れていない場合は時間がかかります。 はじめて設定する場合は、１日じっくり取り掛かる感じで、イライラせずに挑戦してみましょう。 oculus meta quest 3向けのapkアプリを開発 unreal engine 5 (ue5) を使用して、oculus meta quest 3向けのapkアプリを開発するための設定方法を検証します。 osはwindows 11です。 windows 10でも同様に確認できました。 ue5のバージョンは5.3.2です。 oculus meta quest 3は、androidベースのシステムです。 そのためandroid開発を行うためにandroid studioが必要です。 android studioをインストールして、必要なsdkコンポーネント（特にandroid sdkとndk）を設定します。unreal engine 5.3にて、各種設定が完了すれば、unreal engine 5.3を使用してandroid向けのアプリケーション開発を行う準備が整います。 unreal engine 5.3がサポートするandroid sdkとndkのバージョンなどが上手く合わないとエラーが出てビルドできないようです。1年も経過すれば設定が変わると思いますがandroid sdkとndkのバージョンのポイントは参考になると思います。 unreal engine 5 (ue5) を使用してoculus meta quest 3では、2024年1月3日時点の最新のsdk/ndk/jdkを使うのではなく、少し古いバージョンを使いインストールとue5の設定をします。参考になれば幸いです。 sdk platforms api level 32/ndk 25.1.8937393 android sdk command-line tools 8.0 jdk development kit 17 ue5のリファレンスサイトを確認 まずue5のリファレンスサイトをざっと確認しましょう。環境が変わった場合に有効な情報になるでしょう。unreal enginのリファレンスはちゃんとしています。 android クイック スタート https://docs.unrealengine.com/5.3/ja/setting-up-unreal-engine-projects-for-android-development/ 開発用 android デバイスの設定 https://docs.unrealengine.com/5.3/ja/setting-up-your-android-device-for-developing-applications-in-unreal-engine/ android sdk および ndk を設定する https://docs.unrealengine.com/5.3/ja/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/ quest 3開発者モード と oculus linkは事前に設定 ま事前の準備として 開発者モード と oculus linkの設定 を完了してください。開発者モードは、metaのvrヘッドセットで特別な開発者向け機能にアクセスするためのモードです。oculus linkは、oculus questをpcに接続して、pc向けのvrゲームやアプリを動作させるための機能です。 noteなどをみてquest3 開発者モードの設定をしてください。 https://note.com/search?q=quest%20%e9%96%8b%e7%99%ba%e8%80%85%e3%83%a2%e3%83%bc%e3%83%89&context=note&mode=search ue5.3.2もインストールを済ませてください。 ue5.3の開発要件の android studio バージョン 2024年1月3日時点、ue5.3の開発要件を見ると android studio バージョン：flamingo 2022.2.1 パッチ 2 が指定されています。それを入れてみます。 android studioの推奨バージョンをandroid studio のダウンロード アーカイブからダウンロードします。一番下までスクロールして同意します。 https://developer.android.com/studio/archive?hl=ja 検索して android studio バージョン：flamingo 2022.2.1 パッチ 2 を探します。 クリックするとwindowsに実行ファイルが出てきます。ダウンロードします。 android studio インストール ダウンロードが完了したら実行します。 指定された設定に従ってインストールを進めてください。 初めてインストールする際は、いくつかのダウンロードや確認が必要になることがあります。そのまま普通に進めればokです。 それぞれのライセンスに同意します。 こんなエラーが出ましたが気にせず。 android studio sdk manager設定 インストールが完了したあと、more actionsからsdk managerを選択します。 sdk platformsは、初期設定ではapi level 34だけでした。34だけではエラーがでますので、api level 32を追加します。なんか不安で29も追加しました。api level 32だけあればよいはずです。 android sdk command-line tools 8.0が重要 **重要なポイントです。 sdk toolsにて、 android sdk command-line tools を開き 「8.0のみ選択」**して、インストールを進めてください。 上記のような画面が出てない場合は、右下にチェックを入れてみてください。android studioのインストールはこれで完了です。 ue5.3のsetupandroid.batを編集 次にue5.3がインストールされているフォルダーを探します。 setupandroid.batを実行するためです。 epic gamesがインストールされているフォルダーを探します。 一般的には以下のような場所になります。 「c:\\program files\\epic games\\ue_5.3\\engine\\extras\\android」 unreal engine 5（ue5）のsetupandroid.batファイルは、windows上でunreal engineを使用してandroid向けのアプリケーションを開発する際に必要な環境設定を自動的に行うバッチファイルです。 setupandroid.batの内容を書き換えます。 何かメモ帳か、setupandroid.batを右クリックをして「その他のオプションを確認」を選択します。 編集を選択します。 ずっと下までスクロールして、「set sdkmanager=%studio_sdk_path%\\cmdline-tools\\latest\\bin\\sdkmanager.bat」を探します。 latestを8.0に変更します。「set sdkmanager=%studio_sdk_path%\\cmdline-tools\\8.0\\bin\\sdkmanager.bat」に変更して保存します。 setupandroid.batを実行 setupandroid.batファイルを書き換えたらクリックして実行してください。なぜか処理が終わらないこともあるので、進まなければ画面を閉じて再実行してください。 不安なので、setupandroid.batを２回実行しました。 jdk development kit 17.0.9をダウンロード 次にjdk development kit 17.0.9 をダウンロードします。いろいろなサイトで配布しています。好きなところからdlしてください。以下サイトでは「jdk17」を選択するとダウンロード先が出てきます。x64 installerをダウンロードします。 https://www.oracle.com/jp/java/technologies/downloads/#jdk17-windows そのままyesでインストールを完了させます。jdk17の環境変数は後で自分で設定する必要があります。いったんインストール完了です。 環境変数の設定、まずue5.3のバーチャルリアリティで作成 次にue5.3でプロジェクトを作ります。バーチャルリアリティを選択してください。スタートコンテンツは不要です。ue5.3を起動させると一部の環境変数が表示されます。なのでとりあえず起動します。 システム環境変数の編集 ue5.3が起動したら、windowsの検索から「システム環境変数の編集」を検索してクリックします。 環境変数をクリックします。 環境編集の確認 環境編集が自動で出てきます。jdk-17は手動で設定する必要があります。たぶんprogram files/jaba/jdk-17にインストールされています。自分で調べてjava_homeの値を変えてください。※初期設定ではユーザーフォルダーの通常のjdkに設定されているはずです。必ず変更してください。 ue5.3の編集から、プロジェクト設定を開いてください。 ue5のandroid 項目の設定 プラットフォームの項目を探し、そのなかのandroid sdkを開きます。ユーザー名など環境によって変化するので、sdk、ndk、jdkの設定は、以下のように環境変数を参考にするのがよいでしょう。実際の環境変数などもチェックして確認してください。 sdk c:/users/(ユーザー名)/appdata/local/android/sdk ndk c:/users/(ユーザー名)/appdata/local/android/sdk/ndk/25.1.8937393 jdk 米jdk17をンストールしたフォルダーを探してください。 c:/program files/java/jdk-17 ndi apiレベルをandorid-32にします。 次は同じくプラットフォームのandorid（左側メニューのandorid sdkの一つ上）を選択します。赤い部分の「今すぐ設定」をクリックします。 sdkバージョンを変更します。ターゲットsdkバージョンは25から32に変更してください。保存と再起動は不要かもしれませんが、最後にue5とwindowsを再起動しました。 apkファイルの出力先 プラットフォームからandroidを選択し、プロジェクトをパッケージ化を実行します。apkファイルの出力先として、新しくフォルダーを作成してください。 ファイルの書き出しには少し時間がかかります。初めての場合は1時間以上かかるかも。。。とにかく待ちます。途中で閉じても、途中から再開できるようです。 エラーなく書き出しできれば完成です。無事完了しました。 sidequestでapkファイルをインストール apkのインストール方法は複数あるようですので適宜設定ください。今回はsidequestを利用して、apkファイルをquest 3にインストールします。右上のメニューにsidequestからapkファイルする項目がありクリックしたらアップできました。 しばらく待つとインストールが完了しました。 インストール後に提供不明アプリが出てきます。 quest3でue5.3のバーチャルリアリティのテンプレートが動作しました。いやー驚き！！ sidequestとは、oculus quest、quest 2、quest 3などのvrヘッドセット用に非公式アプリやゲームをサイドロード（インストール）するためのツールです。 このプラットフォームは、oculus storeで公式に利用できないアプリや、開発中のアプリのテスト、vr体験のカスタマイズなどに使用されます。 sidequestのセットアップの詳細な手順については、以下のようなサイトを参考にしてみてください。直接の手順通りにはうまくいかなかったのですが、何度か挑戦してみることで、動作するようになりました。 sidequestのインストール方法（pc版・android版 https://orentame.com/how-to-install-sidequest/ metaquest3にapkファイルをインストールする方法を画像 https://viblog.jp/metaquest3-apkfile-install/ などなど 本記事を以下を参考にしています。以下youtubeではandroid studio バージョンが違うもの（android studio 4.0）を推奨しています。上手くapkをビルドできない場合は、こちらをお試しください。 youtube（参考） 次は、oculus meta quest 3の本命の機能である mr（カラーパススルー）apkアプリ開発環境の構築と設定方法を検証します。mrアプリを自分で動かしてみたいですよね。 その4：2024年unreal engine 5.3を使用したoculus meta quest 3 mr（カラーパススルー）apkアプリ開発環境の構築と設定方法 https://riragon.com/oculus-meta-quest3-mrunreal-engine-5-3/"
  },
  {
    "title": "シン・レンタルサーバーでWordPressとTCDを使って独自ドメインのブログサイトを構築",
    "url": "/blog/tcd-wordpress-shin-server/",
    "description": "5年ぶりにレビューサイトでも作ろうと思いまして、まずブログサイトを作ります。WordPressでWebサイト作りたいなって人は参考ください。ブログもさまざまなサービスがあります。",
    "tags": [
      "Wordpress",
      "作ったもの"
    ],
    "date": "2024年1月2日13時55分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 レンタルサーバー・php・wordpress・tcd テーマの推奨要件は随時更新されます。各公式の前提バージョンを確認してください。 .htaccess や php 設定はホスティング会社の管理画面と制約に依存します。記事の例は当時のプラン向けです。 本番移行時は ssl・バックアップ・ステージングの運用を現行のベストプラクティスに合わせてください。 ブログサービスの選択 5年ぶりにレビューサイトでも作ろうと思いまして、まずブログサイトを作ります。wordpressでwebサイト作りたいなって人は参考ください。ブログもさまざまなサービスがあります。 主なブログサービス wordpress - どんなサイトでも作れる超万能型。弱点はサーバーなど費用が掛かるしいろいろめんどくさい。 https://ja.wordpress.org/ blogger - googleの簡単ブログサービス。手軽で良いがマイナーで使っている人いるの？みたいな感じ。 https://www.blogger.com/ note - イケてる人や企業がクリエイティブな記事をアップしている。今風の俺かっこいい系のブログ。 https://note.com/ はてなブログ - 老舗ブログサービス。技術系の記事や個人の日記など幅広いが老人の愚痴みたいなサイト。 https://hatenablog.com/ レンタルサーバーの選定 noteなんか最近の流行りですよね。でも自由にドメインを取ったりする楽しみがあるど定番のwordpressでブログをつくります。次はどこのレンタルサーバーを借りるかです。 ロリポップ https://lolipop.jp/ さくらのレンタルサーバ https://rs.sakura.ad.jp/ エックスサーバー https://www.xserver.ne.jp/ kagoya https://www.kagoya.jp/ エックスサーバーとシン・レンタルサーバー 10年前はじめての初心者は、まずロリポップという風潮がありました。最近はどうでしょうか。だいたい、いつも、どこも何か割引サービスをやっています。だいたいどこを選んでも、だいたい同じではないでしょうか。 私はエックスサーバー派なので、エックスサーバを選びますが。。最近シン・レンタルサーバが出てきました。 エックスサーバとシン・レンタルサーバーは、違いが分かりにくいです。ざっくりいえば、少しサービスレスの代わりに少し安い設定なのがシン・レンタルサーバーってことでしょうかね。 シン・レンタルサーバーのキャンペーン ちょうどシン・レンタルサーバーが半額キャンペーンをやってました。ふむふむ。 ベーシックで36カ月契約をすると、一カ月たった385円になります！安い！ vcpu6コア、メモリ8gb、容量300gbあれば十分です。ベーシックプランが通常770円ですが、今なら385円で利用できます。 半額キャッシュバックで実質385円です。かなりの確率でキャッシュバック申請を忘れてしまうでしょう。 ドメインサービス レンタルサーバーを利用するときに、忘れてはいけないのが無料ドメインサービスです。これを利用すると、さらにお得になります。 さまざまな方法で誤認させて細かい費用を取ることで有名な（自分のなかで）お名前ドットコムのドメイン維持費用のページを見てみましょう。ドメインの維持費用が年間1500円ぐらいです。ということは13860円に3年間分のドメイン費用も含まれますから、実質10000円ぐらいで、3年間レンタルできるわけです。 レンタルサーバーの設定 申し込みしました。こんなログイン画面です。 シンプルなレンタルメニューです。ドメイン費用も無料となっています。嬉しい！ 管理パネルはこんな感じです。 wpxのように、wordpress簡単インストールもできます。 wordpressテーマのインストール 登録時にwordpressのサイトも作成できます。できたwordpressのログイン画面です。 cloudsecureというサービスが付属しています。wordpressは不正アクセスが多いので、こういったセキュリティがあると安心です。無料で使えます。 シン・レンタルサーバーでは「wordpressテーマインストール」機能があり、有料のテンプレートを簡単に使えたりします。3種類ぐらいしかなくて、良く分からん機能です。 tcdテーマの購入と設定 tcdというwordpressテーマを販売しているサイトがあります。海外からwordpressテーマを買う方法もありますが、日本語化すると変になったりします。tcdは日本の会社なので安心です。数万円しますが、それなりに高品質なテンプレートが揃っています。 tcdのテンプレートの細かい設定は、実際に購入してみないと正直なところ分かりません。なので2つ3つ買うぐらいの気持ちで購入してみましょう。 今回は、とにかくシンプルなブログが良いのでquadraを購入しました。15000円です。まあ高いですね。tcdの中では安いほうです。 購入するとテンプレートをダウンロードできます。自分の購入履歴を見ると、随分かっています。 テンプレートはzipファイルのままでokです。外観からテーマをアップするだけで完了です。簡単です。 テーマが適用できました。 サイトのロゴとキャッチフレーズ tcdテーマというデザイン等の設定ができる項目が表示されます。 色や項目などさまざまに変更できます。テンプレートによって、いじれる部分が微妙に違ったりします。なので実際に買ってみて試してみるしかありません。 ちゃちゃっと設定しました。どうですか。それなりに良いでしょう。 サイトのロゴは、chatgptを自分仕様にカスタマイズしたggt4に頼んで作りました。 ブログの最適化 メニューやキャッチフレーズも変更します。 はい。こんな感じです。 ブログなどを始めるときは、最小の構成からスタートした方が良いのです。 プラグインの管理 次は、プラグインです。akismetなどいらないプラグインを削除します。余計なプラグインは削除が基本です。 wordpressのエディタが数年前（もっと前か？）に新しくなってから、意味が分からなくて全くつかっていません。あれは何でしょうか。上手く使える人がいるのでしょうか。なので、まずclassic editorを入れます。 記事の複製が出来た方が良いので、duplicate postも入れます。 ディスカッション機能は、すべて削除です。基本的に迷惑コメントしか来ません。 tcdのテンプレートは、さまざまなことに使えるように、固定ページや、記事、ブログ、お知らせなどの項目が用意されています。単純にブログで使うときは、間違うのでメニューの位置を変えておきます。ggt4に良いプラグインを聞きました。 メニューも使いやすく調整しました。 はい。ブログを書く準備ができました！そのあとこの記事を書きました。"
  },
  {
    "title": "買うと絶対後悔する10インチ以下の超小型ノートパソコンNetbook OneGx1 Pro",
    "url": "/blog/one-netbook-onegx1-pro/",
    "description": "買うと絶対後悔するのが、10インチ以下の超小型ノートパソコン（もしくはネットブック）です。2021年10月に仕事で小型のシステムで4K60pの映像を処理する何それがありまして、検証のためにOne-Netbook OneGx1 Proを購入しました。",
    "tags": [
      "後悔したもの"
    ],
    "date": "2024年1月2日13時53分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 onegx1 pro の国内流通・保証・付属品は時期により変わります。販売店と公式・コミュニティの最新情報を照合してください。 windows と linux（steamos 等）ではドライバ・入力デバイスの扱いが異なります。記事の前提 os を確認してください。 携帯ゲーム機としての実用性はタイトルと解像度設定に強く依存します。記事の数値は当時の環境向けです。 買うと絶対後悔するのが、10インチ以下の超小型ノートパソコン（もしくはネットブック）です。2021年10月に仕事で小型のシステムで4k60pの映像を処理する何それがありまして、検証のためにone-netbook onegx1 proを購入しました。 再びネットブックタイプというのは静かな終わりを迎え、近年ではスレートにゲームパットが付いたゲーム機タイプに移り変わっています。 one-netbook onegx1 pro（すでに販売終了） https://www.one-netbook.jp/landing/onegx1-pro/ 当時amazonで箱破損品が出ており2万円ぐらい安く購入した気がします。当時いくらだったのかなーと検索しておりましたら、2023年12月時点で未だに在庫を持っている店舗がありました。もう時代がパワフルハラハラがngの時代ですので、家電量販も仕入れ先へ売れ残り品を強制的な返品が出来ず、死蔵化する在庫がある日常ですね。 one-netbook onegx1 proのspec説明 one-netbook onegx1 proですが、今でもspecは魅力です。cpu 第11世代インテル® core™ i7-1160g7 第11世代インテル® core™ i7-1160g7、メモリ 16gb(lpddr4 3200mhz) 16gb です。いまだに良い製品に見えます。 【驚異のパフォーマンスを発揮】tigerlakeにあたるインテル第11世代core i7-1160g7 は、最大4コア/8スレッド、その最大クロックは4.40ghz。 one-netbook社の独自技術によりtdp20wまで拡張し、10nm +プロセスで製造され、省電力ながら強力で安定性が高くスムーズな処理を実現しました。 想像を超えるパフォーマンスを体感できるでしょう。 【小さくても、パワフルで高性能】重量わずか620g、7インチモニターは手のひらに収まるサイズです。ショルダーバックや小さなポーチに入れて、通勤や旅行、または新幹線や飛行機で、どこでもさっと取り出して使うことができます。 ここがダメだよ！ネットブックone-netbook onegx1 pro 小型なネットブックの最大の魅力は、夢があることです。小さいのに高性能、軽いのに高性能、小型なのにゲームもできるみたいなロマンスです。実際に購入してみると実用性というレベルでは、クソみたいな感じで、いつの間にかゴミになってしまう悲しみがあります。夢はまぼろし～ 1. ここがダメだった：小さすぎるキーボード 小さいことが最大の魅力である小型のネットブックなので、当然キーボードも小さくなります。one-netbook onegx1 proでテキストを入力したり、キーボードによる操作をすると10分ぐらいの作業で肩がガチガチにこります。もうこりごりです。 ミニキーボードの宿命でもあるfn+機能も、目で見てじっくり探す必要があります。カッコ、スラッシュ、アンダーバーなども変則的です。エンターが小さいのもつらい。すべてが辛い。。。これは小さいパソコンの宿命です。 2. ここがダメだった：少なすぎるコネクタ 背面に3つusbコネクタがあります。1つは電源接続で使います。usbコネクタ2つしか使えないのです。まあ7インチの小型pcです。しかたありません。そういうものです。 3. ここがダメだった：バッテリーと排気の問題 排気部分の設計が悪いようで。。。この熱の問題とはたぶん無関係ですが、バッテリーに問題が発生しました。たった1年でバッテリーが膨らみ始めました。バッテリーの膨らみのせいで、キーボードがゆがみ蓋が閉まりません。 バッテリーの膨らみはよくある症状で、非公式の交換用バッテリーがamazonで販売されています。1万円ぐらいしますが費用を追加でかける気になりませんでした。バッテリーだけ取り出しました。捨て方が分からず困ったものです。 という感じで、14～15万も出して購入したのは、もったいなかったなあと思う次第です。 ここが素敵だよ！ネットブックone-netbook onegx1 pro そんな使いにくいone-netbook onegx1 proですが、バッテリーを外したことで重量は500g以下です。ある意味でモニターもキーボードもついた頑丈な小型システムです。cpu内蔵のiris xe graphicsが意外と性能がよいのです。たしか4k60pの動画も配信できた気がします。 例えば、キャプチャーユニットをつけてobsを入れて小型の配信パソコンにしたり、ubuntuを入れることができるのでubuntuを入れて配信サーバーにしたり、そういった楽しそうな遊び方ができます。 今は、ubuntuにマインクラフトを入れてマインクラフトサーバーにしています。不思議なもので、こうやってみるとちょっとほしくなりませんか？購入できますよ！ビックカメラで。"
  },
  {
    "title": "Einstar 3D Scanner実機レビュー2022-2023年でもっともコストパフォーマンスに優れた使える（かもしれない）レベルの格安3Dスキャナーかも。がしかし！！",
    "url": "/blog/einstar-3d-scanner/",
    "description": "2022年から2023年にかけて1000ドルクラスの3Dスキャナー市場で注目されているのがEinstar 3D Scannerです。このスキャナーはShining 3Dによって製造され、同社の高額なEinScanシリーズの技術をより手頃な価格で提供しています。\n2024年はこういった低価格ながら、使える（かもしれない）レベルの格安3Dスキャナーが登場するでしょう。現在は2023年12月ですが、ちょうど1年前にEinstar 3D Scannerを直販サイトで購入しました。",
    "tags": [
      "後悔したもの"
    ],
    "date": "2024年1月2日13時52分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。ハードウェア実機レビュー（執筆当時は 2023 年 12 月前後の認識）です。 価格・スペック表・推奨 pc 要件 はメーカー改定で変わっている可能性があります。購入・導入前に einstar.com 等で最新仕様を確認してください。 付属ソフトの dl ページや ui はアップデートで変わりうるため、手順は参考程度にしてください。 低価格帯スキャナー市場の 競合製品 は 2024 年以降も増えており、「フォトグラメトリとの比較」は傾向として読むのがよいです。 **2022年から2023年にかけて1000ドルクラスの3dスキャナー市場で注目されているのがeinstar 3d scannerです。**このスキャナーはshining 3dによって製造され、同社の高額なeinscanシリーズの技術をより手頃な価格で提供しています。 **2024年はこういった低価格ながら、使える（かもしれない）レベルの格安3dスキャナーが登場するでしょう。**現在は2023年12月ですが、ちょうど1年前にeinstar 3d scannerを直販サイトで購入しました。 einstar 3d scannerは、0.1mmの精密な解像度と、多彩なスキャンモードを持ち、使いやすいインターフェースを提供しています。しかしeinstar 3d scannerを最大限に活用するためには、処理が重たいため比較的ハイエンドなパソコンが必要です。 einstar 3d scanner https://www.einstar.com/ einstar 3d scannerは、業界をリードするshining 3d社によって製造されたコストパフォーマンスに優れたモデルです。shining 3d社は、高品質な業務用3dスキャナーであるeinscanシリーズを市場に提供しており、これらのモデルは一般的に100万円から200万円の価格帯に設定されています。 総合的に見ると、einstar 3d scannerは、3dスキャンを始めたい初心者や趣味で使用するユーザーにとっては非常に適した選択です。仕事などでしっかりと使いたい人は、100万円以上する高価なモデルの方が適しているかもしれませんね。 実物をチェック！いい感じのソフトbox 実際に内容を確認してみましょう。このソフトboxは、hmdやdjiのドローンが収められているような洗練されたデザインで、第一印象は非常に良いです。 開けると、ぎっしりと物が入っています。本体、電源、キャリブレーションボード、マーカシール、袋などです。ただし、ケーブルなどの小物は一度取り出すと元通りに収めるのが少し難しくなります。 einstar 3d scannerの本体は、高品質な素材で作られており、手に取ると重厚感があります。また、デバイスを保護するための柔軟なシリコン製ソフトカバーが付属しています。 einstar 3d scannerは、その0.1mmの高解像度と多彩なスキャンモードで優れており、直感的で使いやすいインターフェースを提供しています。 scan mode structed light scan point distance 0.1 mm ~ 3 mm light source infrared vcsel structured light working distance effective working distance: 160mm-1400mm; optimal working distance: 400mm depth of field 160-1400mm maximum fov 434mm*379mm (under optimal work distance) scan speed 980,000points/s, up to 14fps align modes feature alignment, hybrid alignment, texture alignment, global markers safety eye-safe texture scan yes outdoor scanning yes interface usb2.0 or above output formats obj; stl; ply; p3; 3mf scanner size 220mm*46mm*55mm carrying case size 245mm*245mm*90mm scanner body weight 500g operating temperature range 0-40℃ operating humidity range 10-90% certifications ce, fcc, rohs, weee, kc recommended configuration os: win10/11, 64 bit; graphics card: nvidia gtx1060; video memory: ≥6gb; processor: i7-11800h; memory: ≥32gb basic computer configuration os: win10, 64 bit; graphics card: nvidia gtx1050; video memory: ≥4gb; processor: i7-7700h; memory: ≥16gb einstar 3d scannerで実際に3dスキャン！ einstar 3d scannerで実際に3dスキャンしてみましょう。ソフトウェアをダウンロードします。2023年にいろいろソフトウェアがアップデートされたました。性能は随分よくなりました。 https://support.einstar.com/support/solutions/articles/60000782576-einstar-software-download einstar 3d scannerは、パソコンと接続して利用します。電源ケーブルとusbケーブルは1本化されています。しかしごちゃごちゃします。 core i9＆rtx4070クラスのノートパソコンであれば、快適に動作します。 本体は、やはりかっこ良いです。 付属しているキャリブレーションボードで、キャリブレーションしてから使用します。ソフトウェアの指示通りにすれば完了です。 einstar 3d scannerのスキャンの流れを動画に スキャンの流れを動画にしました。、スキャンしやすい素材で、トラッキングを失わないように養生シートも入れたり、少しインチキっぽいことをしています。つまり撮りやすい素材でテストしています。ゲタを履かせた検証です。 youtube（スキャンの流れ） メッシュを減らして書き出さないと巨大なファイルになります。 そのため500k（500000）ぐらいに減らしました。 ざっくりですが、ハイエンドなゲーミングpcで5m（5000k）トライアングル、高性能なモバイル端末で400kトライアングル、webで軽量に表示するなら100kトライアングルぐらいが目安なのかなと思います。 諸説あります。 以下、500kトライアングルで書き出した3dモデルです。**なかなか細部もよくデータ化できています。**まっすぐな線がまっすぐなので、素晴らしいです。 持ちての内側なども形状がはっきりしています。ちゃんと3dスキャンできています。 このように、1000ドルという価格設定の中で、einstar 3d scannerを初めて使用した際には、その性能の高さに正直驚かされました。ただし、素晴らしいとはいえこのレベルであれば、フォトグラメトリーだけでも似たような結果が得られるのではないかと思います。これは私の率直な印象です。 ではフォトグラメトリでテストしてみよう！ フォトグラメトリは、写真を用いて物体の形状や大きさ、位置を測定し、3次元データを作成する技術です。この手法は、複数の角度から撮影された写真から、物体の3次元の形状や空間内の位置を精密に再現することができます。すごく適当に100枚ぐらい写真を撮りました。フォトグラメトリしてみましょう。 適当にフォトグラメトリします。写真から点群データを作成してメッシュ化しました。 写真をテクスチャーにします。 以下フォトグラメトリで作成した3dモデルです。 フォトグラメトリは、まっすぐな線がガタガタしやすいですね。もっとしっかり撮影をすれば、もっと綺麗になるでしょう。後処理もじっくりやれば改善できます。 テクスチャーは写真から生成されるので高品質です。 こういった写真も綺麗に再現できます。またフォトグラメトリなら、費用はほとんどかかりません。コストとしては1ドルぐらいですかね。 **私の場合はフォトグラメトリを頻繁に使用しているため、einstar 3d scannerが無くても同じことが出来ます。 フォトグラメトリで出来ないことをeinstar 3d scannerならできるかと言えば、そこまでの性能ではない感じです。ですがダメというほどダメではなく、むしろ1000ドルにしては高性能。 以上から フォトグラメトリはやりたくないけど、3dスキャナーを体験してみたい人にはお勧めできるeinstar 3d scannerでした。**また実用的な性能を求めると少なくとも100万円以上する3d scannerが必要なのかなと思う今日この頃です。 買わなくてよかったかな。。。"
  },
  {
    "title": "Unreal Engine 5.3 (UE5.3) を使用してHigh Dynamic Range（HDR）の中間データを作成してみた＆UE5で高品質な映像を書き出すための追加設定",
    "url": "/blog/ue5-hdr-ocio-st2084-p3-d65/",
    "description": "本記事は、2023年12月24日時点のものです。UE5.3（unrealengine5.3.2）の映像をOpenColorIO (OCIO)の設定を利用して、ST2084-P3-D65の設定にてHigh Dynamic Range (HDR)の中間データとしてMovie Render Queueで書き出してDaVinci Resolve STUDIOにて、UE5.3（unrealengine5.3.2）の画面と同じsRGBの色に戻るか検証しました。もっと正しい設定があるのかもですが満足です。",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月2日13時51分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 ocio・aces・hdr 表示まわりのプロジェクト設定は ue の版で移動・改名されることがあります。該当バージョンのカラー文書を確認してください。 st2084 / p3-d65 などのモニタ前提は os・gpu ドライバの設定に依存します。目視のみの判断は避け校正環境を整えてください。 ndisplay や出力デバイス連携はプラグインとファームの組み合わせで挙動が変わります。 本記事は、2023年12月24日時点のものです。 ue5.3（unrealengine5.3.2）の映像をopencolorio (ocio)の設定を利用して、st2084-p3-d65の設定にてhigh dynamic range (hdr)の中間データとしてmovie render queueで書き出してdavinci resolve studioにて、ue5.3（unrealengine5.3.2）の画面と同じsrgbの色に戻るか検証しました。 もっと正しい設定があるのかもですが満足です。 unreal engine 5（ue5）を使用して映像素材を制作し、そのデータを他の映像制作プロジェクトで利用できるように、幅広いダイナミックレンジを持つ中間データとしてhdr映像を書き出しすことで、後の制作プロセスで多くの柔軟性を提供します。 映像制作者は、より広いダイナミックレンジを活用して、異なる視聴環境やフォーマットに最適化した最終出力を生成できるかもしれません。 st2084-p3-d65の選択が正しかったのか、ue5から素材としての書き出しは単純にアントーンマップで、使いやすい色で出せば十分なのかもしれません。まあopencolorio (ocio)とrender queueの勉強ということでよく分からない検証をしましたとさ。 unreal engineを起動 ue5.3（unrealengine5.3.2）を使います。 アセットにはgladiator arena environment kitを使います。 https://www.unrealengine.com/marketplace/ja/product/ca891e17730b47a2945fb69adb7ef741/questions ue5のカメラとシーケンス初期設定 下準備として、cinecameraactorを追加します。カメラ設定は、フルサイズのセンサーに12mmレンズの設定にしました。逆光環境を作成し、カメラのハイライトからシャドーまでのダイナミックレンジをテストします。逆光環境は、カメラとレンダリングシステムのダイナミックレンジの能力を試すのに最適な環境です。 動画を書き出すためにシーケンサーを設定します。シーケンサーの設定に関しては、ここでは説明しません、適宜調べて適応してください。書き出しのテストのために1フレームだけにしています。 ue5の必要なプラグイン設定 プラグインの設定を確認します。プラグインは設定から入れます。 movie render queueとmovie render queue additional render passesのチェックを入れます。高品質な映像やアニメーションをレンダリングするためのプラグインです。 opencolorioのチェックも入れます。 必要に応じて再起動して適用してください。 opencolorio (ocio) は、映像制作やゲーム開発において色の管理と変換を行うために使用されるオープンソースソフトウェアです。 主に、異なるデバイスやソフトウェア間での色の一貫性を保つために使われます。 これにより、色空間の違いによる色の歪みを防ぎ、特に映画やゲームのポストプロダクションで重要な役割を果たします。 ocioは、複数の色空間を管理し、異なるソフトウェアやデバイスで同じ色見えを実現することを可能にします。 opencolorio コンフィギュレーション アセットを作成 ocio を使用する前に、opencolorio コンフィギュレーション アセットを作成する必要があります。 opencolorio コンフィギュレーション アセットを作成するには、以下の手順を実行します。 「コンテンツ ブラウザ」でコンテキスト メニューを右クリックし、[miscellaneous (その他)] > [opencolorio configuration (opencolorio コンフィギュレーション)] の順に選択して opencolorio コンフィギュレーション アセット を作成します。 より詳しい説明はドキュメントを参照です。 https://docs.unrealengine.com/5.3/ja/opencolorio-quick-start-for-unreal-engine/ コンフィグは初期設定（デフォルト）を使います。 ・destination color space (変換先色空間)：変換先となる出力色空間。 ・destination display view (ターゲット表示ビュー)：色を変換する表示ビュー。 ですが、他の入力ソースからの映像ではなく、プロジェクト内からの映像なのでワーキングカラースペースを変換元色空間として選択しました。この辺は専門分野によってさまざまな設定があることでしょう。 映像業界では普通の色は709ですが、windowsやゲーム画面はsrgbです。rec. 709 は主に放送やビデオ用の色空間として設計されており、srgb はウェブとコンピュータディスプレイ用に設計されています。 709=srgbみたいなものです。 rec. 709 と srgb の主な違いはガンマ曲線にあります。 rec. 709 はビデオ用の色空間で、約2.4のガンマ値を使用します。 一方、srgb はウェブとコンピュータディスプレイ用で、約2.2のガンマ値と線形区間を持っています。 色域自体は非常に似ているため、多くの場合、これらの違いは目立たない場合もあります。 一つ目の設定として、srgb-display -un-tone-mappedを選択しました。 画面の色をそのまま出力します。 かつハイライトの情報もすべて残すためにun-tone-mappedにしました。 「srgb-display -un-tone-mapped」での「アントーンマップ（untone mapped）」は、high dynamic range (hdr) のイメージを standard dynamic range (sdr) のイメージに変換するプロセスを指していないことを意味します。 通常、hdrイメージはより広い輝度範囲を持ちますが、sdrディスプレイで適切に表示するためには、トーンマッピングと呼ばれる処理が必要です。 アントーンマップという用語は、このトーンマッピングの処理を施していない状態を指します。 つまり、hdrのデータ範囲がそのまま保持されている状態です。 srgbのカラーでハイライトの情報を持つデータということです。 srgbでもよいのですが、中間データとして別のソフトウェアにデータを渡したときに、ハイライトを戻す作業をしなくても情報を渡せる方が良いと考えて、hdrの形式が何かないかなとdavinci resolve 18にて色味を再現確認するため、同一の項目を探しました。 同じ項目で見つかったのがst2084-p3-d65は、hdr（high dynamic range）ビデオのための色空間と輝度の規格です。 st2084はhdrに関連する輝度レベルの規格を示し、p3は広い色域をカバーする色空間を指します。 d65は白色点の標準で、6500kの色温度を示します。 この規格は、hdr映像で豊かな色彩と高いコントラストを表現するために使用され、映画や高品質なビデオ制作において重要です。 bt.2020 と p3-d65 の主な違いは色域の広さにあります。 bt.2020はultra hdテレビや4k/8k放送で使用される色空間で、非常に広い色域を持っています。 一方、p3-d65はデジタル映画制作用の色空間で、bt.2020よりは狭いものの、従来のsrgbやrec.709よりは広い色域をカバーしています。 d65は両方の色空間で用いられる白色点の標準を指します。 映像規格のhdr系はとても難しいです。 記事を書いておきながら、わからないことばかりです。 私はカメラ側の業界知識なのでカラーはrec.2020にしたかったのですが、ue5の初期設定のopencolorio (ocio) には、rec.2020がありません。 より上位的なrec.2100はあるのですが、リゾルブのカラーマネージメントにacesのなかにrec.2100がありません。 困ったものです。 opencolorio コンフィギュレーションの設定はこんな感じです。 など、いろいろ試してみたらよくわからなくなったので、p3-d65 st2084の設定が一番しっくりきました。以上からst2084-p3-d65のaces1.1選択しました（rawを選ぶべきだったかなと一瞬かんがえましたが）。 シーケンサーmovie render queueの書き出し設定 シーケンサーの書き出しを行います。 書き出し設定の変更は設定コンフィグをクリックします。 まず先ほど設定したカラー変換をするためにカラー出力を設定か追加選択します。 カラーにて、先ほど設定したコンフィギレーションソースを選択します。変換元と変換先の選択を忘れずに。srgbでは上手く動作することを確認しましたので、st2084を検証します。 もしst2084が怖い人は、srgbにしてください。そのままの色で出てきます。 適用のチェックを忘れずに。 jpegは、圧縮時にデータの一部を失うため、情報量が限られます。 一方、exr（openexr）フォーマットは高い色深度（通常16ビットまたはそれ以上）をサポートし、より多くの色情報とダイナミックレンジを保持できます。 これにより、rawデータに近い柔軟性と詳細を提供し、特にポストプロダクションや映像制作で有効です。 exrは、特に高度なカラーグレーディングや合成作業において、jpegよりも優れた選択肢となります。 設定からexrを追加して、jpegをoffにします。 テキスト書き出しなので、その他の設定をせずに書き出します。 davinci resolve studioで色の再現を確認 davinci resolve studioを起動します。バージョンは18.6です。 先ほどのexrを取り込みます。静止画連番で書き出せば動画になります。 映像の取り込みができました。まずカラー設定を変更します。 davinci resolve studio color management設定 プロジェクトセッティングからcolor management タブを選択します。 ここで、異なるカラースペースやカラーマネージメントのオプションにアクセスできます。 aces color scienceを選択します。 aces (academy color encoding system) は、映像業界で広く使われている高度なカラーマネージメントシステムです。 aces 1.1を選択します。 output color spaceとしてp3-d65 st2084を選択します。 p3-d65は広色域のカラースペースであり、st2084はhdrコンテンツのための標準ダイナミックレンジを定義します。 この組み合わせにより、より豊かな色とコントラストの映像が得られます。 sdrのモニターですが、ハイライトからシャドーまで情報を持っているようなlogやrawのような映像になりました。いいかんじです。スコープを見ても良い感じです。 ue5の画面では、このようにsdrモニターに合わせて適宜トーンマップで表示されています。つまり書き出した情報はrawのようなハイライトまで含む情報となっていることが確認できました。 では、st2084をsrgbで表示する設定にしてみます。 左側のdavinci resolvと右側のunreal engine 5でほぼ同じ色味を再現できたということは、両方のソフトウェアで効果的なカラーマネージメントが行われていることを示しています。 こんな流れができるということです。 st2084でのue5からの書き出し : st2084はhdr（high dynamic range）コンテンツのための標準です。この設定でue5から映像を書き出すことにより、高いコントラストと豊かな色彩を保ったまま、中間データ（つまり、次のステップでさらに加工するための映像ファイル）を生成します。 中間データの渡し : この中間データは、リゾルブなどの他のカラーグレーディングソフトウェアに渡すことができます。ここで重要なのは、ue5とリゾルブ間で一貫したカラーマネージメントを行うことです。これにより、色の再現性が保たれ、異なるソフトウェア間での色のブレが最小限に抑えられます。 色空間の変換 : リゾルブでは、st2084の中間データを受け取り、それを別のカラースペース（例えばrec. 709やsrgb）に変換できます。rec. 709は放送用の標準カラースペースで、srgbはウェブや一般的なディスプレイ用です。この変換プロセスを通じて、異なる配信プラットフォームや表示デバイスの要件に応じて、映像の色調を調整することが可能です。 柔軟性の確保 : この方法では、ue5で作成した映像を、さまざまなカラースペースやダイナミックレンジの要件に合わせて柔軟に調整することができます。これにより、映像制作者は、特定のプラットフォームや視聴環境に最適化された映像を作成することが可能になります。 ue5で高品質な映像を書き出すための追加設定 unreal engine 5（ue5）で高品質な映像を書き出すための設定には、アンチエイリアス、ゲームオーバーライド、および高解像度の設定がオススメです。 アンチエイリアス (anti-aliasing): アンチエイリアスは、映像のエッジやテクスチャに発生するジャギーやステアリングを減らします。 ゲームオーバーライド (game overrides): ゲームオーバーライド設定を使用すると、映像の書き出し時にゲームの設定を上書きして、より高品質な映像を生成できます。 これには、影の品質、テクスチャ解像度、ビュー距離、ポストプロセス効果などが含まれますゲームオーバーライドを活用することで、リアルタイムレンダリング時とは異なる、より詳細で洗練されたビジュアルを作成することが可能です。 高解像度 (high resolution): 高解像度設定を使用すると、標準の1080pや4kを超える解像度で映像を書き出すことができます。 ただし、高解像度の映像を生成すると、ファイルサイズが大きくなり、レンダリング時間も長くなる可能性があるため、プロジェクトの要件とリソースを考慮する必要があります。 アンチエイリアスは、テンポラルサンプリングを使います。32ぐらい。あとはオーバーライド設定をします。このあたりの設定シーンによってさまざまですので、適宜調べて調整してください。 ゲームオーバーライドは、初期設定で最高品質になっているそうです。よくわからないのでそのままの設定で使います。 高解像度設定は、標準の1080pや4kよりも高い解像度の映像を出力したい場合に特に有用です。ただし、既に目的の解像度が決まっている場合、この設定は必ずしも必要ではありません。たとえば、4kで出力する予定であれば、標準の4k設定で十分です。 タイリングカウントは、画像を何分割してレンダリングするかを決定する設定です。例えば、タイリングカウントを2に設定すると、画像は縦横それぞれ2分割され、合計4つのセクションでレンダリングされます（四分割）。 オーバーラップは、タイリングされた各セクションがどの程度重なるかを決定する設定です。 この値は0から0.5の範囲で設定でき、0は全く重ならないことを意味し、0.5はセクションが半分重なることを意味します。 オーバーラップは、タイリングされたセクションの境界部分で発生する可能性のある視覚的な不一致を最小限に抑えるために使用されます。 適切なオーバーラップ値を設定することで、セクション間のシームレスな結合を確保できます。 出力から解像度を指定できます。8kにしたら処理が終わらないので、実際には4kにしました。3840×2160ですね。 設定による画質の違いをチェック 出力の違いを見てみましょう。まずは最初の設定を入れずに書き出した映像です。シャギーやブツブツが目立ちます。 設定を入れた画像では、なめらかになっています。 設定なしの全景。 設定ありの全景。レンズフレアが左右に分かれています。アンチエイリアスか高解像度設定の影響と思われます。こういった部分も検証してから書き出しが必要です。 設定なしでは、像のミミのあたりの色味が不自然です。 設定ありでは自然な感じです。 連番で書き出すことで、中間データとして使える動画ができました。めでたしめでたし。 youtube 以下の公式の情報も参考ください。 opencolorio クイック スタート https://docs.unrealengine.com/5.3/ja/opencolorio-quick-start-for-unreal-engine/ ue5 シーケンサーと movie render queue の使い方 https://www.docswell.com/s/epicgamesjapan/z7v32w-cinematicdive-epic#p38"
  },
  {
    "title": "フォトグラメトリ撮影を効率化！ベルボンのマルチアングルユニットV4-unit IIレビュー。無くても良いけどあると便利ですな",
    "url": "/blog/velbon-v4-unit-ii-multi-angle-unit-for-photogrammetry/",
    "description": "卓上フォトグラメトリに最適なマルチアングルユニットを紹介します。ベルボン（Velbon）のマルチアングルユニット「V4-unit II」です。これがあるとフォトグラメトリの撮影作業の効率化が図れます。すごく便利です。\nフォトグラメトリは複数の写真から物体の3Dモデルを作成する技術です。建築、製造、ゲーム開発、映像制作など、多岐にわたる分野で利用されています。高品質な3Dモデルを作成するためには、被写体を多角度から撮影する必要があります。",
    "tags": [
      "良かったもの"
    ],
    "date": "2024年1月2日13時51分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 製品仕様・耐荷重・付属品はメーカー表記が改訂されることがあります。velbon 公式の該当型番を確認してください。 写真測量での運用はカメラ・レンズ重量と重心で快適域が変わります。実機バランスと安定性を再確認してください。 ソフトウェア側の再投影やマーカーレス手順はツールの版で ui が変わります。記事は当時のワークフロー前提です。 卓上フォトグラメトリに最適なマルチアングルユニットを紹介します。ベルボン（velbon）のマルチアングルユニット「v4-unit ii」です。これがあると フォトグラメトリの撮影作業の効率化が図れます。すごく便利です。 **フォトグラメトリは複数の写真から物体の3dモデルを作成する技術です。**建築、製造、ゲーム開発、映像制作など、多岐にわたる分野で利用されています。高品質な3dモデルを作成するためには、被写体を多角度から撮影する必要があります。 ベルボン（velbon）のマルチアングルユニット「v4-unit ii」 https://www.amazon.co.jp/dp/b09vx127kv マルチアングルユニットとは、カメラの撮影角度を調整するための雲台みたいな一脚みたいなユニットです。 三脚に取り付け、さまざまな方向への稼働を可能にするアイテムです。 グリップを回すだけでエレベーターの角度を変更でき、約20cmの範囲で伸縮調整も可能です。 ベルボン（velbon）のマルチアングルユニット「v4-unit ii」の仕様を見てみましょう。 積載質量は3kgです。それなりの一眼レフに、それなりのレンズを載せることができます。 ■サイズ（幅） : 352mm(エレベーター収納時) ■サイズ（奥行） : 147mm ■サイズ（高さ） : 91mm ■evスライド : 205mm ■底面径 : 44mm ■左右方向 : 360度回転 ■上下方向 : ＋90°（仰角） -90°（俯角） ■質量 : 613g ■推奨積載質量 : 3kg ■雲台取付ネジ : unc1/4（細ネジ） ■三脚取付ネジ穴 : unc1/4、unc3/8両対応 ■発売日 : 2020年5月 説明書から、使い方を簡単に説明します。クランクハンドルがある部分を三脚に接続して使います。雲台取付ネジ部分にカメラを設置します。操作グリップでチルト操作やチルトの固定ができて、クランクハンドルを回すとギヤエレベータが上下する感じです。 操作グリップで、チルト操作やチルトの固定ができます。 クランクハンドルを回すとギヤエレベータが上下します。 グルグルと伸びる。 説明通り20cmぐらい伸びます。 この組み合わせが、卓上のフォトグラメトリ撮影に最適なのです。撮影したい小物があれば一周をぐるりと撮影します。 ギアを上げて少しカメラを高くして、雲台で下にカメラを振り、また撮影してゆきます。 さらにカメラを上げて、同じように撮影します。 実際にこんな感じに撮影しました。 細かくエレベーターできるので、綺麗に写真が並びます。いいですね。 写真の並びも綺麗に効率よく撮影できるので、フォトグラメトリも高品質になります。 別にマルチアングルユニットが無くても三脚と雲台があれば、高さとカメラの角度を調整できるので 無くてもよいのですが、マルチアングルユニットがあると撮影が効率よく進められます。良いアイテムです！"
  },
  {
    "title": "UE5（Unreal Engine5）マテリアルのインスタンス化を使うと、3Dモデルのメタリック（Metallic）やラフネス（Roughness）の数値をスライドで変更して、目で見ながら馴染みを確認できます。便利ですね。",
    "url": "/blog/unreal-engine5-roughness-metallic-instance/",
    "description": "",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月2日13時47分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 マテリアルエディタ・デフォルトライティング・プロジェクト設定は unreal engine の版で変わります。該当バージョンのドキュメントで確認してください。 roughness / metallic の切り替えは forward / deferred や lumen の有無で見え方が変わる場合があります。 記事のノード配置は当時の ue 向けです。同名ノードでも既定値や推奨ワークフローが更新されていることがあります。 ue5（unreal engine5）で、マテリアルのインスタンス化を使うと、少し簡単だけ簡単にメタリック（metallic）やラフネス（roughness）の数値をスライドで変更できます。 マテリアルのプロパティを効率的に管理するための機能で、基本マテリアルを直接変更することなく、metallicやroughnessのような特定のプロパティを調整できます。 複数のオブジェクトに対して異なる見た目を迅速に適用することが可能になります。 マテリアル インスタンスを作成して使用する unreal engine 5.3 ドキュメント（マテリアルインスタンス） まず基本的な操作をきわめて簡単に説明します。例として、球を追加して、マテリアルのエレメントを開きます。scalar parameter(スカラー パラメータ)を追加します。名前を分かりやすくするためroughnessにします。そしてラフネスに接続します。 設定が分かりやすくなるように黒色に変更しました。scalar parameter(スカラー パラメータ)を選択して、デフォルト数値と、最小、最大数値を決定します。ラフネス（roughness）は、0～1の設定範囲で使用します。 コンテンツブラウザーのマテリアルの元を探します。そして「マテリアルインスタンスを作成」します。このマテリアルインスタンスをクリックすると、先ほど設定した項目をスライダーで簡易的に変更できます。 同じようにfbx素材を取り込みscalar parameter(スカラー パラメータ)を設定して、マテリアルインスタンスを作成すると、3dモデルが違和感がないようにメタリック（metallic）やラフネス（roughness）の数値をスライドで変更して、目で見ながら馴染みを確認できます。便利ですね。 さらに発展させてみます。cgソフトで、冷蔵庫の一部を金属質に設定して、テクスチャーでラフネスマスクを作成します。金と銀部分です。 ラフネスマスクは、こんな感じの白黒の画像になります。黒い部分がラフネスですね。逆かな？ラフネスは0が有効で、1が無効？かな。黒と白どちらが有効なのか良く分からなくなります。 ラフネスマスクの有効を0％から100％にしたい場合は、少し複雑ですがいくつかのノードを繋ぎます。以下でマテリアルのノード画面で、右クリックで検索すれば出てきます。 ①linear interpolate （lerp） linear interpolate（lerp）は、二つの値の間で線形補間を行う関数です。 指定された比率（通常0から1の間の値）に基づいて、二つの入力値aとbの間で滑らかに遷移させる値を計算します。 例えば、alphaが0の場合、lerpの結果はaになり、alphaが1の場合はbになります。 alphaが0.5の場合、aとbの中間の値を返します。 これはゲーム開発やグラフィックスで、時間経過による滑らかな変化などを表現するのによく使用されます。 ②constant unreal engineのマテリアルエディタにおいて、「constant」ノードは、変化しない固定値を表します。 スカラー（1つの浮動小数点値）、ベクター（2つ、3つ、または4つの浮動小数点値のセット）、または色など、さまざまなタイプの定数があります。 マテリアルのプロパティに「constant」ノードを接続すると、そのプロパティは他の要因の影響を受けずに、指定された値を常に持つことを意味します。 これはシェーダー作成において基本的だが不可欠なコンポーネントで、マテリアルグラフ内で静的な値を定義するために使用されます。 ③scalar parameter マテリアルのプロパティ値を動的に変更するためのパラメータです。 これを使用すると、マテリアルインスタンスを通じて、マテリアルが適用されるオブジェクトに対して、エディタやゲーム実行時にプロパティ（例えばラフネスや光沢度）の値を調整することができます。 scalar parameterを利用することで、単一のマテリアルから様々なバリエーションを容易に生成することが可能になります。 linear interpolate、constant、scalar parameterの接続など 実際に設定してみます。※ scalar parameterの名前は適宜設定しましょう。"
  },
  {
    "title": "その2：Unreal Engine 5 (UE5)とmeta Quest 3で一人称視点で、自由にVRワールドをHMDで視聴するセットアップ方法",
    "url": "/blog/unreal-engine-5-ue5-meta-quest-3-hmd2/",
    "description": "前回の記事では、UE5（Unreal Engine 5）のVR（HMD）プレビューの表示方法を三人称視点で説明しました。今回は一人称視点に変更して、キャラクターも変更する方法について説明します。UE5（Unreal Engine 5）で予め用意されているバーチャルリアリティの初期テンプレートを使うと、移動方式がポイントを指定するワープで自由に動くことができないのです。それを様々な視点で自由に動かすための設定です。今回もmeta Quest3とを使います。",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月2日13時44分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 quest 3 と pc 向け ue の推奨バージョン・xr 設定は更新が早いです。epic と meta の開発者向け情報を併せて確認してください。 トラッキングやレンダリングの挙動は本体ファームと gpu ドライバで変わることがあります。 記事は連載の続編です。前提となる前回の手順と版の整合を取ってください。 前回の記事では、ue5（unreal engine 5）のvr（hmd）プレビューの表示方法を三人称視点で説明しました。 今回は一人称視点に変更して、キャラクターも変更する方法について説明します。 ue5（unreal engine 5）で予め用意されているバーチャルリアリティの初期テンプレートを使うと、移動方式がポイントを指定するワープで自由に動くことができないのです。 それでいろいろ試しています。 前回：unreal engine 5 (ue5)とmeta quest 3で高品質で自由にvrワールドをhmdで視聴するセットアップ方法 https://riragon.com/blog/unreal-engine-5-ue5-meta-quest-3-hmd/ 途中まで前回と同じ作業 まずサードパーソンで新規ワールドを作ります。 「機能またはコンテンツパックを追加」を選択します。 ここでバーチャルリアリティを追加します。 vr表示に不足しているプラグインを自動で入れてくれます。便利ですね。右下に出てくる「不足しているものを有効にする」をクリックします。 キャラクターも変更してみよう プラグインを有効にするため再起動します。再起動の際にマーケットプレイスからキャラクターを追加してみます。ue5のテスト用のキャラクターは互換性があるものならばそのまま差し替えて使えます。 oculus meta quest3を接続して、quest link（またはoculus link）でパソコンと接続します。 quest linkは、スタンドアロンvrヘッドセットを、pc上の高性能なvrゲームやアプリケーションと接続して使用できる機能や技術のことを指します。 この機能により、questユーザーは独立型モードで使うだけでなく、高品質なpcベースのvr体験も楽しむことができます。 quest linkを接続して、バーチャルリアリティが追加されていれば、vrプレビューの表示が選べるようになります。 hmdで見るとこのように第三者視点で見れます。 この表示をカスタマイズしてみます。サードパーソンのブループリントのフォルダーを開きます。ここにいろいろな設定が入っています。 ビューポートを選択します。 ビューポートを見るとカメラとキャラクターの関係が見えます。 bpのメッシュを選択するとキャラクターを変更できます。 先ほどインストールした海賊のキャラクターを探します。 ちょうど頭がないモデルがありました。それを選択するとキャラクターを変更できます。適度にアセットを探してゆけば、使いたいキャラクターも見つかるでしょう。 設定を反映させるために保存とコンパイルを必要に応じて押してゆきます。 このようにキャラクターが変わりました。 カメラを一人称視点から三人称視点に変更 ほかにもやり方はいろいろあるでしょう。頭の悪いやり方かもしれません。カメラブームは、キャラクターに接続されているとキャラクター周りの当たり判定をもって周回するため動いてしまい一人称視点になりません。どうしたものでしょう。そのためスフィアをカプセルの階層に追加します。 追加したスフィアに、カメラブームとフォローカメラを一緒に選択して、一緒にドロップします。 スフィアの下にカメラブームとカメラが来ているか確認します。スフィア／カメラブーム／フォローカメラという構造を作ります。 プレビューで正しく配置している確認します。 カメラブームのトランスフォームに数字が入っている場合はゼロにします。 一人称視点に変更するためカメラブームの距離を変更します。unreal engine（ue）のカメラブーム（camera boom）は、ゲーム内視点と視野の制御に使用されます。プレイヤーキャラクターに連動し、動きに追随し、視点を移動できます。 カメラブームはカメラとプレイヤーキャラクターの距離と高さを調整し、最適な視野を確保できる機能です。初期設定ではキャラクターの距離が400になっています。距離をゼロにします。カメラが股間に来ました。 カメラコリジョンのプローブサイズもゼロにします。しなくてもよいかも。 スフィアを選択してサイズを0.1にします。カメラもカメラムーブもサイズが0.1に縮小されます。無理やり小さくすることで動かないカメラムーブにしました。カメラムーブじゃなくて、もっと適切な機能選択があるでしょう。 スフィアの高さを80ぐらいにして、頭の高さにします。 一人称視点のhmdになりました。でも一人称視点は酔いやすいですね。 vrの処理を軽くします。以下前回と同じ内容です。プロジェクト設定を選択します。 レンダリングをクリックします。 vrの項目を探してください。 ステレオ中心窩イメージングレベルをミディアム（適宜）に、ダイナミック中心窩イメージングにチェックを入れます。 処理が重たい場合は、右上にある設定からエンジンの拡張機能設定を選択して、スケーラビリティグループを適宜調整してください。 さらに処理が重たい場合は、描写の負荷を減らしてみることもできます。postprocessvolumeを探すもしくは追加してください。 bloomの強度を0。 その他いろいろな負荷がかかりそうな効果を0にします。 infiniteextentにチェックを入れます。これで効果が全域に反映されます。 さてoculus linkによるプレビューに飽きてきました。スタンドアローンでmeta3で見たくなりました。unityじゃなくてunrealでapkを書き出せるの？という感じです。次はue5でmeta3のためにandoridの開発環境を検証してみました。 その3：2024年unreal engine 5.3を使用したoculus meta quest 3 apkアプリ開発環境：android studio設定とue5のsdk/ndk/jdkのバージョンや設定インストール方法 https://riragon.com/ue5-oculus-meta-quest-3-android-studio-sdk-ndk-jdk/"
  },
  {
    "title": "その1：Unreal Engine 5 (UE5)とmeta Quest 3で三人称視点で、自由にVRワールドをHMDで視聴するセットアップ方法",
    "url": "/blog/unreal-engine-5-ue5-meta-quest-3-hmd/",
    "description": "",
    "tags": [
      "UE5"
    ],
    "date": "2024年1月2日12時46分",
    "content": "note ! 本記事は公開から 1年以上 経過しています。 quest 本体 os・pc ランタイム・unreal の xr プラグインは頻繁に更新されます。各リリースノートの対応表を確認してください。 開発者向けメニューや usb デバッグ手順は meta のドキュメント改訂の影響を受けます。 記事の画面は当時の hmd / pc 環境向けです。ui 名称が変わっている場合があります。 meta quest3とunreal engine 5 (ue5) を使ってワールドを自由に移動できるvrプレビューの設定方法を検証します。 windows環境にてoculus linkで検証しました。 最新のmeta quest 3を使って、好きなバーチャル空間を自由にhmdで見て動いてみたい。 そんな感じで高品質なmeta quest 3とunreal engine 5 (ue5) の組み合わせでvrを試したい人は多いでしょう。 ue5バーチャルリアリティテンプレートにがっかり ue5にはバーチャルリアリティのための専用テンプレートがあります。このvrテンプレートは、vr環境での基本的な動作やインタラクションを容易に実装できるように設計されています。 このvrテンプレートは、移動方法が古くワープポイント移動（あるポイントから別のポイントへ瞬時に移動する方法）や水平45度ごとの視点変更にしか対応していません。 がっかりvr体験 になります。せっかくのvrですから、自由な移動したいものです。まずこの機能を使ってがっがりして見てください。 ue5バーチャルリアリティテンプレートを改良？ vrテンプレートを改良して、自由に移動できる方法の紹介も数多くされています。しかし1人称視点では、強烈に酔います。設定も複雑です。困ったものです。 youtube もっと簡単に自然？な方法は もっと簡単にmeta quest3で、かつ自由にvrをhmdで見れないものか調べて検証しました。3人称視点でhmdで操作すると比較的に酔いが少なくて実現できました。できるだけ簡単に、自由なワールドを入れて、自由に移動できる設定方法です。 まず最初にサードパーソンでワールドを作ります。 起動したらmainなど適当に名前を付けて保存しましょう。テンプレートのままでもokです。扱いやすいように設定しましょう。 コンテンツブラウザの追加から**「機能またはコンテンツパックの追加」**を選びます。 ここでバーチャルリアリティをプロジェクトに追加します。 プラグインがありませんと表示されるので「不足しているものを有効にする」を選択します。これでhmdで見るvrに必要なプラグインを全部入れてくれます。簡単です。再起動をして反映します。 実際にhmdでプレビューしてみよう！ 事前にoculus meta quest 3のquest linkの設定しておきます。 vrの移動操作をしやすくするためxbox互換コントローラを用意しておきます。3000円ぐらの安いタイプでokです。純正xboxコントローラはお高いですからね。これで環境は整いました。 起動して「vrプレビュー」を実行します。 meta3のhmdでvr視聴できました。xboxコントローラで自由に操作もできます。 stat fpsと入力してfpsの表示を確認するのもよいでしょう。 右上にfpsが表示されます。fpsが低い場合は負荷が少ない設定に変更するのがよいでしょう。検証のpc環境はrtx 2080 tiです。もう古いですね。いったん閉じます。 豪華なvrをhmd体験してみよう 「cyberpunk - cyber city」をプロジェクトに追加しました。 https://www.unrealengine.com/marketplace/ja/product/cyberpunk-cyber-city cyber cityのdemomapを開きます。そしてオブジェクトをすべて選択します。コピーします。 元のサードパーソンのマップを開いてコピーしたデータを貼り付けします。もともとのサードパーソンのライティングなどの設定は削除すると良いでしょう。2つのマップを一つにするので、重複する余計な設定を削除するとよいでしょう。 vrで見てみたい環境の移植が完了です。vrプレビューで動作するか見てみましょう。 ちょっとカクカクしますが動作しました。次は設定の最適化をしてみましょう。 プロジェクト設定を選択します。 レンダリングをクリックします。 vrの項目を探してください。 ステレオ中心窩イメージングレベルをミディアム（適宜）に、ダイナミック中心窩イメージングにチェックを入れます。気持ち処理が軽くなる気がします。しかし画面の端がチラチラする気もします。難しいものですね。 処理が重たい場合は、右上にある設定からエンジンの拡張機能設定を選択して、スケーラビリティグループを適宜調整してください。 さらに処理が重たい場合は、描写の負荷を減らしてみることもできます。postprocessvolumeを探すもしくは追加してください。 bloomの強度を0。 その他いろいろな負荷がかかりそうな効果を0にします。 infiniteextentにチェックを入れます。これで効果が全域に反映されます。 hmdで見ることができました。しかし不思議なことにモニターで見た方が画質が綺麗なのです。hmdで見ると画質や描写が落ちるのです。次は、やっぱり一人称視点で見たいので検証です。続く。 その2：unreal engine 5 (ue5)とmeta quest 3で一人称視点で、自由にvrワールドをhmdで視聴するセットアップ方法 https://riragon.com/unreal-engine-5-ue5-meta-quest-3-hmd2/"
  }
]
