OmniAICreator/Qiita-1.07M huggingface dataset:
個別エラーメッセージ変更「パスワード → 新しいパスワード」【Laravel】

# やりたいこと
プロフィールページ、パスワード再設定ページで、
バリデーションエラーメッセージのデフォルトが「パスワード」になっている。
これを「新しいパスワード」とユーザーにとってわかりやすいデザインにしたい。


## ビフォーアフター例
### プロフィール画面
↓ 編集前
![スクリーンショット 2025-04-27 18.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/1ec4b247-f6b9-4f8f-9da5-9bbcd4ea26e7.png)

↓ 編集後
![スクリーンショット 2025-04-27 18.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/144ae0be-15d2-432f-a0f1-8de77c233c9f.png)


### パスワード再設定画面
↓ 編集前
![スクリーンショット 2025-04-27 19.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/1fe5ab21-69b6-469f-804c-6b100ce2182c.png)

↓ 編集後
![スクリーンショット 2025-04-27 19.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/3dc8f507-1bd3-4776-9e3f-62073e102940.png)



# ⚠️ 最初に注意点
以下4点を元に実装していく。
✅ nameは変えない
✅ labelはOK
✅ langで共通
✅ コントローラーで個別



# ✅ 手順：プロフィール画面
## ① /Http/Controllers/Auth/PasswordController.php を開く
パスワード更新（変更）の処理をしてるのは、
PasswordController の update() メソッド！

（ファイルパス例👇）
```bash
/app/Http/Controllers/Auth/PasswordController.php
```


## ② update() メソッドでバリデーション個別指定を書く
```/Http/Controllers/Auth/PasswordController.php
public function update(Request $request)
{
    $request->validate([
        'current_password' => ['required', 'current_password'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ], [
        'current_password.required' => '現在のパスワードを入力してください。',
        'current_password.current_password' => '現在のパスワードが正しくありません。',
        'password.required' => '新しいパスワードを入力してください。',
        'password.min' => '新しいパスワードは8文字以上で指定してください。',
        'password.confirmed' => '新しいパスワードと新しいパスワード(再確認)が一致しません。',
    ]);

    // パスワード更新ロジック
}
```

### ここでポイント
| 項目 | 内容 |
|:-----------|:------------|
| name="password"はそのまま | Laravelの標準通り(new_passwordなど変更しない) |
| 表示だけ「新しいパスワード」 | 日本語として自然に読める |
| 特定画面だけ変えたいときは、コントローラーのバリデーション第2引数で個別指定 | 特定画面だけ対応できる(共通エラーメッセージは /lang/ja/validation.php ) |


## ③ ゴール
![スクリーンショット 2025-04-27 18.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/144ae0be-15d2-432f-a0f1-8de77c233c9f.png)



# ✅ 手順：パスワード再設定画面
## ① /Http/Controllers/Auth/NewPasswordController.php を開く
ファイルパス例：
```bash
/app/Http/Controllers/Auth/NewPasswordController.php
```
ここに「パスワードリセット（再設定）」の処理がある！


## ② store() メソッドを修正する
エラーメッセージ個別指定つきに修正
```Http/Controllers/Auth/NewPasswordController.php
public function store(Request $request)
{
    $request->validate([
        'token' => ['required'],
        'email' => ['required', 'email'],
        'password' => ['required', 'confirmed', 'min:8'],
    ], [
        'email.required' => 'メールアドレスを入力してください。',
        'email.email' => '正しいメールアドレス形式で入力してください。',
        'password.required' => '新しいパスワードを入力してください。',
        'password.min' => '新しいパスワードは8文字以上で指定してください。',
        'password.confirmed' => '新しいパスワードと新しいパスワード(再確認)が一致しません。',
    ]);

    // パスワードリセット処理...
}
```


## ③ ゴール
![スクリーンショット 2025-04-27 19.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/3dc8f507-1bd3-4776-9e3f-62073e102940.png)



# 関連
https://qiita.com/honaki/items/369953f2be6085387c86
反応型コンポーネントを使用した画面フローの作成 


# ヘルプ

+ [反応型コンポーネントを使用した画面フローの作成 (正式リリース)](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_build_screen_flows_with_reactive_components_generally_available.htm&release=246&type=5)

# 質問

+ [フロー - 選択した日付の値をテキストフィールドにすぐに表示する](https://salesforce.stackexchange.com/questions/423403/flow-display-selected-date-value-immediately-in-a-text-field)

:::note
リアクティブスクリーンコンポーネントがSFDCスクリーンフローに最近追加されました（Winter 24 V59.0リリースノート）。スクリーンフローで使用されているAPIバージョンを確認し、V59.0より前のバージョンの場合は、最新のSFDC PRODバージョン（本稿執筆時点ではV61）にアップデートすることをお勧めします。
:::
フロー画面表示コンポーネント:繰り返し



+ [【ヘルプ】フロー画面表示コンポーネント:繰り返し](https://help.salesforce.com/s/articleView?id=platform.flow_ref_elements_screencmp_repeater.htm&type=5)
+ [親オブジェクトに子オブジェクトの項目の値を表示したい](https://qiita.com/Keiji_otsubo/items/95dbe279be8c6a746db9)


# エラー

+ [数式内でスクリーンフローリピーターセクションフィールドを参照する方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clNXISA2
)
ChatGPTを使用したアプリ開発記【Reacrtアプリの作成開始】

## MacでChatGPTがダウンロードできた
macOSのバージョンが古いからダウンロード出来ないと思っていましたが、下記赤枠からダウンロードすると使えました。(バージョン14.6.1)
![スクリーンショット 2025-04-26 9.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/0c69dd01-d76e-4940-bb38-01186f5fbb00.png)
## 日本中で使われるようなアプリを作る
やるならこれしかない。SNSアプリで目指します。(できれば全人類が使う様なアプリを目指す。)


## Reacrtアプリを作る
下記の指示をもらいました。(ちなみにReactは使ったことがありません。)
![スクリーンショット 2025-04-26 10.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/9f896e75-14f5-4b8f-80ca-e5fea2046fa9.png)
【初心者学習まとめ】DYA4 ： Ruby on Rails 初学者まとめ (エラー / MVC / フォーム / ルーティングなど)

Ruby on Rails 初学者まとめ (エラー / MVC / フォーム / ルーティングなど)

はじめに

これは Ruby on Rails を学び始めた方向けのまとめ記事です。
特に「エラーの読み方」「MVCの役割」「フォームの作り方」「paramsの使い方」など、初心者がつまずきやすいポイントを中心に、覚える順番で整理しています。

🔰【1】エラーの読み方とよく出るエラー

例: ruby test.rb

=> test.rb:3:in `<main>': undefined local variable or method `x' for main:Object (NameError)

このエラーの分解：

test.rb:3: → test.rbファイルの3行目で発生

in '<main>' → エラー発生箇所（今回はトップレベル）

undefined local variable or method 'x' → xが定義されていない

(NameError) → エラーの種類

✅ よく出るエラー一覧

エラー名

意味

NameError

存在しない変数やメソッドを使おうとした

NoMethodError

存在しないメソッドを呼び出した

SyntaxError

文法ミス（カンマ忘れ、end抜けなど）

ArgumentError

メソッドの引数の数が正しくない

TypeError

型が合わない（例: 数値 + 文字列）

📦【2】MVCの基礎構造と役割

MVC とは？

Railsは「MVC」という構造でアプリケーションを作ります。

役割

説明

Model

データベースの操作、ビジネスロジックを担当

View

ユーザーに見せる見た目（HTMLなど）を担当

Controller

リクエストを受け取り、ModelやViewと連携する

全体の流れ（例：/users にアクセス）

ルーティングで UsersController#index に処理が渡る

コントローラーがモデル（User.all）でデータ取得

ビューがそのデータを表示

🌐【3】ルーティング（routes.rb）

Rails.application.routes.draw do
  get 'users', to: 'users#index'
  get 'users/new', to: 'users#new', as: 'new_user'
  post 'users', to: 'users#create'
end

/users → 一覧表示

/users/new → フォーム表示

POST /users → フォームの送信（createアクション）

📂【4】コントローラーの役割と記述

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_path, notice: "ユーザーが作成されました！"
    else
      render :new
    end
  end

  private
  def user_params
    params.require(:user).permit(:name, :email)
  end
end

@user = User.new → 空のUserオブジェクト

@user.save → 保存（バリデーションも実行）

user_params → paramsから必要な値だけ取り出す（Strong Parameters）

🗃【5】モデルとバリデーション（models/user.rb）

class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true, uniqueness: true
end

presence: true → 入力必須

uniqueness: true → 重複禁止（ユニーク制約）

🖼【6】ビューとERB記法（views/users/index.html.erb）

<h1>ユーザー一覧</h1>
<%= link_to "新しいユーザーを作成", new_user_path %>

<ul>
  <% @users.each do |user| %>
    <li>名前: <%= user.name %>, メール: <%= user.email %></li>
  <% end %>
</ul>

✅ ERBタグの違い

タグ

用途

<% %>

処理のみ。ブラウザには表示されない

<%= %>

結果を表示したいときに使う（例: 変数）

🧾【7】form_with でフォーム作成（views/users/new.html.erb）

<h1>新しいユーザーを作成</h1>

<%= form_with model: @user, local: true do |form| %>
  <div>
    <%= form.label :name, "名前" %><br>
    <%= form.text_field :name %>
  </div>

  <div>
    <%= form.label :email, "メールアドレス" %><br>
    <%= form.text_field :email %>
  </div>

  <div>
    <%= form.submit "作成" %>
  </div>
<% end %>

🧭【8】paramsとは何か？

def create
  @user = User.new(params[:user]) # 非推奨（Strong Parametersを使う）
  # 正しい書き方は user_params を使う
end

✅ paramsの役割

ユーザーが送信したデータを受け取るハッシュのようなもの

例：フォームで送られたnameやemailの値が入る

よく使う書き方

params.require(:user).permit(:name, :email)

✅ おわりに

このまとめは毎日の復習やQiita投稿の土台として使えます。
不明点があれば気軽に追記や質問をしてOKです！
Railsは繰り返し手を動かして覚えるのが一番のようなきがしたので、
この順番で小さなアプリを作ってみると理解が深まるとおもいました。
 💻✨
Geminiで人間の勇者が活躍する小説の概要を書いてみた。

# 概要

Geminiで人間の勇者が活躍する小説の概要を書いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
人間の勇者が活躍する小説の概要を書いてください。
```

## 人間の勇者が活躍する小説の概要：『灰色の勇者と七色の絆』

舞台: かつて魔法文明が栄華を極めたが、大厄災によってそのほとんどが失われた世界「アースガルド」。魔法の残滓は僅かに残り、人々は剣と武術、そして失われた魔法技術の断片を頼りに生きていた。そんな中、各地に異形の魔物「ヴォイド」が出現し、人々の生活を脅かしていた。

主人公: レオナルド（レオ）。灰色の瞳を持つ、ごく普通の村の青年。特別な力を持つわけではないが、持ち前の正義感と諦めない心、そして何よりも「人」を信じる強い意志を持つ。幼い頃にヴォイドによって故郷を失い、生き残った人々との絆を何よりも大切にしている。魔法への憧れはあるものの、才能は皆無に等しい。

物語の始まり: レオの住む小さな村もまた、強力なヴォイドの襲撃を受ける。魔法使いや熟練の戦士たちが次々と倒れていく中、レオは無力感に苛まれながらも、村人を守るために必死に立ち向かう。その時、彼の内に眠っていた、決して特別な力ではないが、強い「想い」に応えるかのような微かな力が目覚め始める。

物語の展開:

仲間との出会い: 故郷を失ったレオは、各地を旅する中で様々な背景を持つ仲間たちと出会う。
・魔法の才能は高いが過去に囚われた少女魔法使い。
・失われた魔法文明の知識を持つ寡黙な研究者。
・卓越した剣技を持つが、他人を信用しない女剣士。
・獣のような力を持つが、心優しい獣人。 彼らはそれぞれ過去の傷や葛藤を抱えながらも、レオの持つ「人の可能性」を信じる力に惹かれ、共にヴォイドに立ち向かうことを決意する。

ヴォイドの謎: 旅の中で、レオたちはヴォイドがただの破壊者ではないことに気づき始める。その出現パターン、行動原理、そして時折見せる知性のようなもの。失われた魔法文明との関係も示唆され、彼らはヴォイドの謎を解き明かそうとする。

試練と成長: 強力なヴォイドとの戦いや、過酷な環境での旅を通して、レオは自身の弱さと向き合いながら、勇気と決断力、そして仲間との絆を深めていく。特別な力に頼るのではなく、知恵や工夫、そして何よりも仲間の力を信じることで、数々の困難を乗り越えていく。

七色の絆: レオと仲間たちの間には、友情、信頼、愛情など、様々な形の強い絆が生まれていく。それぞれの持つ色が合わさることで、単独では成し遂げられない力を発揮していく。この「七色の絆」こそが、特別な力を持たないレオの最大の武器となる。

世界の真相と戦い: ヴォイドの謎を追ううちに、レオたちはアースガルドを襲った大厄災の真相、そしてヴォイドの真の目的を知る。それは、想像を絶するほど過酷な現実だった。最終的に、レオたちはそれぞれの絆を力に変え、絶望的な状況の中で最後の戦いに挑む。

物語の結末:

・レオと仲間たちは、それぞれの「人」としての強さと絆を信じ、強大な敵に立ち向かう。
・彼らの戦いを通して、アースガルドの人々は再び「信じる心」を取り戻していく。
・必ずしも勝利だけが描かれるとは限らない。時には大きな犠牲を払いながらも、彼らが残した「想い」が未来へと繋がっていく可能性も示唆される。
・主人公レオは、特別な力を持たない普通の人間でありながら、その強い意志と仲間との絆によって、世界を救う「勇者」となるのか、あるいは別の形で人々の希望となるのか。

テーマ:

・人間の可能性と、決して諦めない心の強さ
・絆の力、信じることの大切さ
・失われた過去からの学びと、未来への希望
・特別な力を持たない者が、いかにして英雄となり得るのか

この物語は、派手な魔法や圧倒的な力を持つ主人公ではなく、等身大の人間が、仲間との絆を深め、困難に立ち向かう姿を描くことで、読者の心に深く訴えかけることを目指します。

# まとめ

小説でも書いてみようかと思いました。
何かの役に立てばと。
MySQLのJSON型の特定要素の更新

JSON型の特定要素のみの更新についてのメモ

## ■準備
jsonを持つテーブルを用意
```sql
CREATE TABLE `test` (
   `col` JSON NULL DEFAULT NULL
);
INSERT INTO test (col) values (null);
```

## ■UPDATE分
`test`テーブルの`col`カラムの`key1`という要素を更新
```sql
UPDATE test SET
 col = JSON_SET(
   IFNULL(col, '{"key1":null}'),
   '$.key1',
   CAST('[{"name":"なまえ1","text":"テキスト1"}]' AS JSON)
 )
```
:::note alert
`JSON_SET`は`null`の場合、値の設定が出来ません。
その為、`IFNULL`を使用して`null`の場合にデフォルト値を使用するようにしています。

`json`文字列を設定する場合、`CAST`が必要になります。
`json`文字列を直接記述していますが、`JSON_OBJECT`を使用することも可能です。
※プログラムで文字列を生成することを考えています。
:::


## ■PHPから更新
`test`テーブルの`col`カラムの`key1`という要素を更新
```php
// SQL文字列を作成
$sql = sprintf(
    'UPDATE test SET col = JSON_SET(IFNULL(col, \'%s\'), \'$.key1\', CAST(\'%s\' AS JSON))',
    json_encode(['key1' => null]),
    json_encode(['name' => 'テスト'], JSON_UNESCAPED_UNICODE),
);
// SQLを実行
...
```

:::note note
`IFNULL`のデフォルト値は（複数）階層になりますので、`json_encode`で配列を渡しています。
設定値の`json_encode`の`JSON_UNESCAPED_UNICODE`は設定しないとエスケープされます。
:::
Data Cloudに非構造化データを取り込む



+ [【ヘルプ】チャンク戦略](https://help.salesforce.com/s/articleView?id=data.c360_a_search_index_supported_chunking_strategies.htm&type=5)
+ [Data Cloud でのAmazonS3 接続](https://qiita.com/Keiji_otsubo/items/33ddd7bfc09f3c9280b7)

# 機能しない AWS S3を使った場合

+ [非構造化データをデータクラウドに取り込むことができない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mLLA0A2)
+ [RAGとAWSを使ったデータクラウドには助けが必要: データはデータクラウドに表示されません](https://www.reddit.com/r/salesforce/comments/1jvvoyt/data_cloud_with_rag_and_aws_need_help/?rdt=44392)

:::note
エンタープライズ環境では、サービスがすべてセキュリティポリシーに準拠していることを確認する必要があったため、スクリプトで求められている以上の作業を行う必要がありました。残念ながら、私のアドバイスとしては、a) 積極的に AWS のトラブルシューティングに取り組んで、お気に入りの AI ツールを使用してエラーの理解を深めるか、b) AWS に精通していて適切な設定をサポートしてくれる人に相談するかのどちらかです。この方法では、動作を妨げる要因が数多くあるため、正直なところ、より専門的な知識が必要です。
:::

+ [Unstructured data from AWS S3 to Data Cloud](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MbL6F)
「SAP Joule」の基本的なことのまとめ

# はじめに

2022年末のChatGPT公開以降、AI業界は生成AI一色となり、その勢いは今なお衰えることなく着実に進化を続けています。これは単なるバズワードではなく、真に世の中に革新をもたらす技術であることを示しています。SAP社も「SAP Business AI」としてさまざまな製品・サービスを展開しており、その中核となるのが「Joule」です。本シリーズでは、このJouleについて理解しておくべき基本的な知識をまとめていきます。記事は順次リリースしていきますので、ぜひお付き合いください。

また、リリースした記事の数が多くなってきたため、皆様にご参照いただけそうな記事を整理し、この[まとめページ](https://qiita.com/Yanagawa_Yoshihisa/items/a1e3806bad9d32100f37)を作成しました。情報検索の際にお役立てください。

# SAP Jouleとは

SAP Jouleとは、SAP社が提唱するAI アシスタントの総称（ブランド）です。マイクロソフトのCopilotに近い概念と考えていただけるとわかりやすいと思います。機能ではなく総称であるため、さまざまなSAP社の製品に組み込まれるAIアシスタントは基本的にはJouleと呼ばれることになり、アプリケーションの横などに出現し、ユーザの業務の実施（システム操作）をサポートします。

「Joule」はSAP社の製品に横断的に組み込まれることが発表されています。その領域は非常に幅広いため、数回の記事に分けて、詳細を深掘りしていきます。

# 目次

[S/4HANAにおける「SAP Joule」の基本的なことのまとめ](https://qiita.com/Yanagawa_Yoshihisa/items/b1e50c8805d1a4eecc84)
Unable to find an element with the text: 45. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

# はじめに
JestでDOMを取得する際に遭遇したエラーを共有します。

# 問題
以下のコードでタイトルのエラーが出ます。
```jsx
const newTimes = screen.getAllByText(newTodoTime);
```
これは ```newTodoTime=45``` つまり "45" というテキストが複数のDOMノードに分割されている可能性があるからです。
例えば、
```jsx
<span><strong>4</strong>5</span>  // DOM的には 2つのノードに分割されている
```
これに対して ```getAllByText("45")``` は失敗します。


# 解決方法
関数によるテキストマッチャーを使用します。
```jsx
screen.getAllByText((content, element) =>
  element.textContent === "45"
);
```
または ```includes``` を使う場合
```jsx
screen.getAllByText((content, element) =>
  element.textContent?.includes("45")
);
```

# おわりに
Allって書いてるのに、そこは対応できないんかい...って思いましたが
なるほど。
【学び】Dockerコンテナの履歴を整理したい‼

## はじめに

Dockerコンテナの履歴が溜まると、ストレージを圧迫する原因になります。特に `Exited` 状態のコンテナや不要なイメージを削除することで、ディスク容量を節約できるそうです。
あまりにもコンテナの履歴がたまりすぎて、正直何が何なのか、ブラックボックス状態だったので一度整理したいと思ったのが、今回記事をかこうと思ったきっかけです💦
どんなコマンドを使用すればいいのかを簡単にまとめてみました。



## **Dockerのストレージを整理する方法**
### **① `Exited` したコンテナを削除**

**まずは不要なコンテナを削除**
以下のコマンドで、**終了した (`Exited`) コンテナを一括削除** できます。

```bash
docker container prune
```
✅ **確認メッセージ** が出るので、`y` を入力すると削除されます。

---
### **② 使っていないDockerイメージを削除**
Dockerは**コンテナの元となる「イメージ」も保存** しており、不要なものが溜まるとディスク容量を圧迫します！！
まず、現在のイメージ一覧を確認：
```bash
docker images
```
`<none>` となっているイメージ（未使用のイメージ）があれば、以下で削除できます
```bash
docker image prune
```

全く使っていないイメージを**すべて削除する**場合は
```bash
docker image prune -a
```
**⚠️ ただし、`-a` は現在のコンテナで使っているイメージも消す可能性があるので注意！**

---

### **③ 使っていないボリュームを削除**

Dockerはデータを保持するために「ボリューム」を使います。
使われていないボリュームを削除するには
```bash
docker volume prune
```

---

### **④ 使っていないネットワークを削除**
Dockerのネットワークも不要なものを削除可能です。
```bash
docker network prune
```

---

### *⑤ **全ての不要データを一括削除**
以下のコマンドを実行すると、**コンテナ・イメージ・ボリューム・ネットワークを一括で削除** できます。
```bash
docker system prune -a
```
**⚠️ ただし、実行前に本当に不要なものか確認してください！**

---

## **ディスク使用量を確認する方法**
削除前後のストレージ使用状況を確認したい場合は、以下のコマンドを実行します
```bash
docker system df
```
どれだけ容量を削減できたか確認できます。

---

### **まとめ**

| やりたいこと | コマンド |
| --- | --- |
| 終了したコンテナを削除 | `docker container prune` |
| 未使用のイメージを削除 | `docker image prune` |
| すべての未使用イメージを削除 | `docker image prune -a` |
| 使っていないボリュームを削除 | `docker volume prune` |
| 使っていないネットワークを削除 | `docker network prune` |
| すべて一括で削除 | `docker system prune -a` |
| ストレージ使用量を確認 | `docker system df` |

---

本来であれば定期的に確認整理するのがベストだと思います。
コンテナの名前を指定したりするとより管理もしやすいのでしょうが、いかんせん、名前の付け方など、まだDocker周りの知識が不十分なので、、
公式や記事を読み漁りたいと思います。
【Docker】開発用コンテナとアプリケーションコンテナの違いと役割整理

## はじめに
開発をDocker上で行う際、  
「開発用コンテナ」と「アプリケーション用コンテナ」をきちんと分けて管理する設計がとても重要です。  
本記事では、両者の違いや役割について整理し、実際に遭遇しやすい問題とその対処法も紹介します。

---

## 1. 開発用コンテナとは

開発用コンテナとは、  
**エディタやターミナル、ビルドツールなど開発に必要なツール群**をまとめたコンテナです。

### 具体例
- VSCode Server
- Node.js, Python, Javaなどの開発言語
- Docker CLI（場合によって）
- Make, Git, curl などのCLIツール

### 開発用コンテナの目的
- **ホスト環境を汚さずに**開発を進める
- 誰が開発しても**同じ環境を再現**できる
- 開発用ライブラリと実際のアプリ実行環境を**分離**する

### イメージ
```
🐳 開発用コンテナ（devenv）
├── VSCodeやターミナルが動く
└── 開発ライブラリがインストールされている
```

---

## 2. アプリケーション用コンテナとは

アプリケーション用コンテナとは、  
**実際にサービスを提供するために動かすアプリケーション専用のコンテナ**です。

### 具体例
- フロントエンド（例：React / Vite）
- バックエンド（例：FastAPI / Node.js API）
- AI推論サーバー（例：AI関係 APIサーバー）

### アプリケーションコンテナの目的
- サービスを**本番同様の形で起動**する
- アプリケーション単体で**独立して動かせるようにする**
- 最小限必要なライブラリだけを入れ、**セキュアかつ軽量に保つ**

### イメージ
```
🐳 フロントエンドアプリケーション
🐳 バックエンドAPIサーバー
🐳 AI推論サーバー
（それぞれが独立して起動）
```

---

## 3. よくある質問：「開発用コンテナの中でさらにDocker buildしたい」

### 問題
開発用コンテナ（devenv）内では通常、  
**Dockerエンジンがインストールされていないため、`docker build` ができない**  
という問題に直面します。

### 原因
- コンテナの中にDocker自体が入っていない
- DockerはホストOS上で動く「デーモン型サービス」だから

### 解決策
| 方法 | 解説 |
|:---|:---|
| ホスト側で直接 `docker build` する | 最もシンプルで安全な方法 |
| docker.sockをマウントしてコンテナ内からdockerコマンドを叩けるようにする | 上級者向け（セキュリティリスクあり） |

---
#### 例：ホスト側でbuildするパターン
```bash
cd frontend/
docker build -t my-frontend-app .
docker run -d -p 5173:5173 my-frontend-app
```

これで開発用コンテナはあくまで「作業場」に徹し、  
アプリケーションコンテナは独立して起動できます。

---

## 4. 環境変数エラーと `.env` ファイルの重要性

Docker Composeを使う際によく出るエラー例：

```bash
WARN The "POSTGRES_USER" variable is not set. Defaulting to a blank string.
env file .env not found
```

### 原因
- `.env` ファイルが存在しない
- docker-compose.yml 内で `POSTGRES_USER` 等の環境変数を参照している

### 対応策
1. プロジェクトディレクトリ直下に `.env` を作成
2. 必要な環境変数を記述する

#### 例：最低限必要な.env
```dotenv
POSTGRES_USER=example_user
POSTGRES_PASSWORD=example_password
POSTGRES_DB=example_db
POSTGRES_HOST=db
POSTGRES_PORT=5432
```

これでdocker-compose起動時のエラーは解消します。

---

## 5. 現実的な進め方

**開発スピード重視なら一旦ホストを汚してもOK。**

- プロジェクト完成を優先
- 最後にまとめて環境掃除する（Dockerイメージ・コンテナの整理）

### Docker環境の掃除コマンド（あとで使える）
```bash
# 未使用コンテナ削除
docker container prune

# 未使用イメージ削除
docker image prune

# 未使用ボリューム削除
docker volume prune
```

---

## まとめ

| 項目 | ポイント |
|:---|:---|
| 開発用コンテナとは？ | エディタやビルドツールをまとめた作業場 |
| アプリ用コンテナとは？ | サービス提供するためのアプリ本体 |
| docker buildはどこで？ | 基本はホスト側 |
| 環境変数管理は？ | .envファイルで統一 |
| 進め方のコツ | 汚れは気にせず、まずはPJT完成を最優先！ |

---

# 🚀 おわりに

開発用コンテナとアプリケーションコンテナをきちんと分けて考えるだけで、  
- 環境管理
- チーム開発
- 本番リリース後のトラブル防止

すべてがスムーズになります。

最初は手間でも、後々**圧倒的に楽**になるので、ぜひ意識して運用していきましょう！

---

✏️ この記事は、これまでの実践経験をもとにまとめました。  
もしこの記事が役に立ったら、いいねやフォローもぜひお願いします！🚀
サポートケースが発行できない


# 本番環境のサポート

+ [Unable to see my salesforce support open cases](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UrwAlSAJ)



# Trailheadでケースを作成できません

+ [Trailheadでケースを作成できません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvY5TSAV)
Java解説 20250426

### static変数
クラスロード時に初期化される。インスタンス生成時には初期化されない。
### 非static変数
インスタンスが生成される度に初期化される。
### クラス内のメンバ間アクセスルール
(a)インスタンスメンバは、staticメンバにアクセスできる。
(b)staticメンバは、インスタンス化しtからインスタンスメンバにアクセスする。

<br>

[オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-818/dp/479816206X/ref=pd_lpo_d_sccl_1/357-5313211-9846263?pd_rd_w=VQCzo&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=JRR4W9RKV32K4AXF1WRZ&pd_rd_wg=l7VoD&pd_rd_r=1d465f85-0562-4b51-b523-77f8486c1508&pd_rd_i=479816206X&psc=1 "オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)")
windows11で、sketchup6 その83

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
解決できていない、課題がある。
Geminiに、聞いてみた。

# プロンプト

sketchupで、entities.intersect_withを使って交差を削除するrubyスクリプト

# 回答

はい、SketchUpで `intersect_with` を使って交差部分を削除するRubyスクリプトの基本的な例をご紹介します。

このスクリプトでは、選択された2つのグループ（またはコンポーネントインスタンス）の交差部分を見つけ、その交差部分を削除します。

```ruby
# 選択されているエンティティが2つであることを確認
selection = Sketchup.active_model.selection
if selection.length != 2
	UI.messagebox("2つのグループまたはコンポーネントを選択してください。")
	return
end

# 選択された2つのエンティティを取得
entity1 = selection[0]
entity2 = selection[1]

# エンティティがグループまたはコンポーネントインスタンスであることを確認
unless (entity1.is_a?(Sketchup::Group) || entity1.is_a?(Sketchup::ComponentInstance)) &&
			 (entity2.is_a?(Sketchup::Group) || entity2.is_a?(Sketchup::ComponentInstance))
	UI.messagebox("選択されたエンティティはグループまたはコンポーネントである必要があります。")
	return
end

model = Sketchup.active_model
entities = model.active_entities

# 交差部分のジオメトリを作成するための新しいグループを作成
intersection_group = entities.add_group

# intersect_withメソッドを使って交差部分のジオメトリを生成
intersection_group.intersect_with(entity1.transformation, entity1.entities, entity2.transformation, entity2.entities)

# 交差部分の面を取得
intersection_faces = intersection_group.entities.grep(Sketchup::Face)

# 交差部分の面を削除
model.start_operation("交差部分を削除", true)
intersection_faces.each do |face|
	face.erase!
end
intersection_group.erase! # 交差部分のグループを削除
model.commit_operation

UI.messagebox("交差部分を削除しました。")
```

**スクリプトの解説:**

1.	**選択の確認:** 最初に、ユーザーが2つのエンティティを選択しているかどうかを確認します。
2.	**エンティティの取得:** 選択された2つのエンティティを変数に格納します。
3.	**エンティティの種類の確認:** 選択されたエンティティがグループまたはコンポーネントインスタンスであることを確認します。`intersect_with` メソッドは、グループまたはコンポーネントインスタンスに対して使用するのが一般的です。
4.	**モデルとエンティティの取得:** 現在のモデルとアクティブなエンティティのコレクションを取得します。
5.	**交差部分のグループ作成:** 交差部分のジオメトリを一時的に格納するための新しいグループを作成します。
6.	**`intersect_with` の実行:**
		* `intersection_group.intersect_with(...)` を呼び出し、2つの選択されたエンティティの交差部分のジオメトリを `intersection_group` 内に生成します。
		* 引数には、それぞれのエンティティの変換（位置や回転など）とエンティティのコレクションを指定します。
7.	**交差部分の面の取得:** `intersection_group` 内に生成された面（交差部分）を取得します。
8.	**交差部分の面の削除:** トランザクションを開始し、取得した交差部分の面を一つずつ削除します。
9.	**交差部分のグループの削除:** 一時的に作成した `intersection_group` を削除します。
10. **トランザクションの完了:** 削除操作を確定します。
11. **メッセージ表示:** 処理が完了したことをユーザーに通知します。

**使い方:**

1.	このRubyスクリプトをSketchUpのRubyエディタにコピー＆ペーストします。
2.	SketchUpで、交差部分を削除したい2つのグループまたはコンポーネントインスタンスを選択します。
3.	Rubyエディタでスクリプトを実行します。

**注意点:**

* このスクリプトは、選択された2つのグループまたはコンポーネントインスタンスの**面と面**の交差部分を削除します。複雑な形状の場合、期待通りに動作しないことがあります。
* 交差部分の削除は、元のグループやコンポーネントのジオメトリを直接変更するわけではありません。交差部分のジオメトリが新しいグループ内に作成され、それが削除されることで、視覚的に交差がなくなったように見えます。
* より複雑な交差処理や、元のジオメトリを直接編集したい場合は、より高度なスクリプトが必要になる場合があります。

このスクリプトが、あなたの目的に合う第一歩となれば幸いです。もし、より具体的な要件があれば、それに応じてスクリプトを調整できますので、お気軽にお知らせください。


以上。
goimportmaps: Goパッケージ依存を可視化・バリデートするCLIツール

きらぼしシステム株式会社でエンジニアをしている mickamy です。
今期の目標で、当社のプレゼンスを高める、というものをおいたので、開発を行う上で得た知見をご紹介したいと思います。
以下、都合により言い切り（ですます調にあらず）です。

---

## 🎯 なぜ作ったか

Goプロジェクトが大きくなると、

- どのパッケージがどこに依存しているか分からなくなる
- 本来「ハンドラー → ユースケース → リポジトリ」と分けているはずなのに、直接リポジトリをimportしてしまう
- アーキテクチャ崩れに気づきにくくなる

こうした問題を解決するため、**プロジェクト内部のパッケージ依存を可視化し、設計違反を検出するツール**「goimportmaps」を作った。

https://github.com/mickamy/goimportmaps

---

## 🚀 goimportmapsとは？

`goimportmaps`は、Goプロジェクトの内部パッケージimportを解析し、

- 📊 依存グラフの可視化（Mermaid、Graphviz、HTML対応）
- 🚨 禁止されたimportルールの検出（正規表現対応）
- ✅ 違反があればexit 1でCI/CDでも検出可能
- 🧠 クリーンアーキテクチャ、ヘキサゴナルアーキテクチャ向けにも使える

を実現するCLIツール。

---

## 🛠 インストール

```bash
bash
コピーする編集する
go install github.com/mickamy/goimportmaps@latest

```

---

## ⚡️ 基本の使い方

```bash
goimportmaps ./...

```

実行するだけで、

- テキスト形式の依存リスト
- 禁止されたimport違反の検出
- 違反件数のサマリ

をまとめて出力できる。

---

## 📈 可視化例（HTMLレポート）

- `-format=html` を指定すると、**静的なHTMLレポート**を生成できる。

```bash
goimportmaps ./... --format=html > report.html
```

ブラウザで開くと、

- Mermaidグラフで依存関係を視覚化
- 違反ノードを赤くハイライト
- 違反件数サマリも表示

などが一目で分かるレポートになる。

---

## 🎯 まとめ

- Goプロジェクトの設計を守りたい人におすすめ
- プロジェクトの健全性を保つための「設計ヘルスチェックツール」として活用できる
Pythonの開発環境を構築する

### Windows環境へのインストール

* [pyenv-win](https://github.com/pyenv-win/pyenv-win) (Windows版Pyenv) をインストールするとPythonのバージョン切り替えが簡単にできて便利だが、pyenv-winはwingetでのインストールには対応していない。

* バージョン切り替えの頻度が多くない場合は、wingetで公式のPythonパッケージをインストールする方法も手軽である。

  * [Python 3.12](https://winget.run/pkg/Python/Python.3.12)

  * [Python 3.11](https://winget.run/pkg/Python/Python.3.11)

### 依存関係（仮想環境）の管理

* 標準の `vnev` を使いやすくするツールである `pipenv` や `poetry` を使うのが主流である。
  * 参考：[ゼロから学ぶ Python](https://rinatz.github.io/python-book/ch04-04-venv/)
* PEPで標準化された [pyproject.toml](https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/) を使い機能豊富なであることから、poetry の人気が高まっているようである。将来的にはvenvで十分となるかもしれない。
  * 参考：[そのPythonパッケージ管理、venv + pipでよくないですか? in 2023/1](https://zenn.dev/peacock0803sz/articles/python-packaging-2023-01)

### Visual Studio Codeでの開発

* 下記のプラグインの組み合わせが定番となる。
  * [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
  * [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)
  * [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy)
  * [Black Formatter](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter)
  * [autoDocstring](https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring)

* 参考
  * [Python in Visual Studio Code](https://code.visualstudio.com/docs/languages/python)

### Dev Containerでの開発

サンプルプロジェクト [python-playground](https://github.com/unhurried/python-playground) を参照。
ICU ロケールの問題

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


---------------
+ [ICU ロケール形式の有効化の準備](https://qiita.com/Keiji_otsubo/items/6eef4378ba18b54c3804)
+ [JDK ロケール形式の廃止と ICU ロケール形式の有効化リリース更新でのエラー通知](https://qiita.com/Keiji_otsubo/items/54f46b5f3d31198bbd82)


# 個人設定にも注意

+ [画面コンポーネントの日付形式が間違っており、困っています。2つの異なる組織、同じフロー、同じロケール設定を使用しているのですが、片方の画面コンポーネントでは日付がyyyy/mm/dd（想定通り）の形式で表示され、もう片方の画面コンポーネントではdd/mm/yyyyの形式で表示されます。原因は何でしょうか？](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MZhxy)

:::note
セットアップの「ユーザー インターフェイス」の下にある「en_CA ロケールの ICU 形式を有効にする」チェックボックスをオフにすると、動作しました。
:::
windows11で、sketchup6 その82

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
解決できていない、課題がある。

# 課題
オブジェクトでオブジェクトを削除する。

# できた所
オブジェクトでオブジェクトに跡を付ける。

# できない所
オブジェクトでオブジェクトの交差を削除する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/74493f28-39a7-47b4-9b6c-37518e679713.png)

# サンプルコード

```
def cuttest1
	model = Sketchup.active_model
	entities = model.entities
	basegroup = entities.add_group
	basegroupentities = basegroup.entities
	p1 = Geom::Point3d.new(0, 0, 0)
	p2 = Geom::Point3d.new(20, 0, 0)
	p3 = Geom::Point3d.new(20, 1, 0)
	p4 = Geom::Point3d.new(0, 1, 0)
	p5 = Geom::Point3d.new(0, 0, 0)
	points = [p1, p2, p3, p4, p5]
	base = basegroupentities.add_face points
	normal = base.normal
	if normal == [0, 0, -1]
		base = base.reverse!
	end
	base.pushpull 10
	base_trans = basegroup.transformation
	cutgroup = entities.add_group
	cutgroupentities = cutgroup.entities
	p1 = Geom::Point3d.new(5, -1, 5)
	p2 = Geom::Point3d.new(15, -1, 5)
	p3 = Geom::Point3d.new(15, 2, 5)
	p4 = Geom::Point3d.new(5, 2, 5)
	p5 = Geom::Point3d.new(5, -1, 5)
	points = [p1, p2, p3, p4, p5]
	base = cutgroupentities.add_face points
	normal = base.normal
	if normal == [0, 0, -1]
		base = base.reverse!
	end
	base.pushpull 10
	cut_trans = cutgroup.transformation
	cutgroupentities.intersect_with false, cut_trans, basegroup, base_trans, true, basegroup
	basegroup.explode
	UI.messagebox("Click to delete cut group.")
	cutgroup.erase!
end

```

以上。
windows11で、sketchup6 その81

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
パイプを描く、rubyスクリプトを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9dde200f-0e06-451f-ba3b-73c2bc36ac2f.png)

# サンプルコード

```
def create_pipe2
	entities = Sketchup.active_model.entities
	tube = entities.add_group
	tube_inner = tube.entities.add_circle Geom::Point3d.new(0, 0, 0), Geom::Vector3d.new(0, 0, 1), 4, 24
	tube_outer = tube.entities.add_circle Geom::Point3d.new(0, 0, 0), Geom::Vector3d.new(0, 0, 1), 8, 24
	cross_section_face = tube.entities.add_face tube_outer
	inner_face = tube.entities.add_face tube_inner
	tube.entities.erase_entities inner_face
	cross_section_face.pushpull -20, false
end
```

以上。
windows11で、sketchup6 その80

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
丸い穴を開ける、rubyスクリプトを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1cc734df-26d7-49c0-9864-227065691241.png)


# サンプルコード

```
def create_donut2
	entities = Sketchup.active_model.entities
	tube = entities.add_group
	tube_inner = tube.entities.add_circle Geom::Point3d.new(0, 0, 0), Geom::Vector3d.new(0, 0, 1), 4, 24
	tube_outer = tube.entities.add_circle Geom::Point3d.new(0, 0, 0), Geom::Vector3d.new(0, 0, 1), 8, 24
	cross_section_face = tube.entities.add_face tube_outer
	inner_face = tube.entities.add_face tube_inner
	tube.entities.erase_entities inner_face
end

```

以上。
macOSのlaunchctlコマンド

# macOSのlaunchctlコマンド活用Tips

macOSでサービスを管理するための`launchctl`コマンドは、デーモンやエージェントの制御に欠かせないツールです。この記事では、よく使うlaunchctlコマンドとそのオプションについて解説します。

## 基本コマンド

### サービスの登録と開始

```bash
# 基本的なロード
sudo launchctl load /Library/LaunchDaemons/com.example.service.plist

# 永続的に有効化してロード
sudo launchctl load -w /Library/LaunchDaemons/com.example.service.plist
```

`-w`オプションは重要です。これによりサービスが恒久的に有効化され、システム再起動後も自動的に起動するようになります。

### サービスの停止と登録解除

```bash
# 基本的なアンロード
sudo launchctl unload /Library/LaunchDaemons/com.example.service.plist

# 永続的に無効化してアンロード
sudo launchctl unload -w /Library/LaunchDaemons/com.example.service.plist
```

`-w`付きでunloadすると、サービスが恒久的に無効化され、システム再起動時に自動起動しなくなります。

### サービスのステータス確認

```bash
# 登録されているサービスの一覧表示
sudo launchctl list

# 特定のサービスの状態確認
sudo launchctl list | grep example
```

出力の見方：
- 最初の列はプロセスID（実行中の場合）または`-`（停止中の場合）
- 2列目は終了コード（0は正常、それ以外はエラー）
- 3列目はサービス名

### サービスの手動起動と停止

```bash
# 登録済みサービスの起動
sudo launchctl start com.example.service

# 登録済みサービスの停止
sudo launchctl stop com.example.service
```

## 詳細な情報取得

```bash
# サービスの詳細情報を表示
sudo launchctl print system/com.example.service
```

## よくあるトラブルシューティング

### サービスが起動しない場合

1. plistファイルの権限確認
   ```bash
   sudo chmod 644 /Library/LaunchDaemons/com.example.service.plist
   sudo chown root:wheel /Library/LaunchDaemons/com.example.service.plist
   ```

2. ログの確認
   ```bash
   # システムログの確認
   sudo log show --predicate 'eventMessage contains "example"' --last 10m
   
   # 標準出力・標準エラー出力の設定
   # plistファイルに以下を追加
   <key>StandardOutPath</key>
   <string>/tmp/example.out</string>
   <key>StandardErrorPath</key>
   <string>/tmp/example.err</string>
   ```

3. デバッグモード有効化
   ```bash
   # plistファイルに以下を追加
   <key>Debug</key>
   <true/>
   ```

### リスタートループ対策

一部のサービスではリスタートループ（起動→即終了→再起動の繰り返し）が発生することがあります。特にデーモン化するプロセスでは、以下の対策が有効です。

1. フォアグラウンドモードで実行
   多くのデーモンプログラムには、フォアグラウンドで動作させるオプション（-f, --foreground など）があります。
   LaunchDaemonと併用する場合は、このオプションを指定することでリスタートループを解消できることが多いです。

2. ThrottleInterval設定
   ```bash
   # plistファイルに以下を追加（単位は秒）
   <key>ThrottleInterval</key>
   <integer>60</integer>
   ```
   これにより、短時間での再起動を抑制できます。

## ユーザー権限に関するTips

特定のユーザーでサービスを実行するには、plistファイルに以下の設定を追加します。

```bash
<key>UserName</key>
<string>username</string>
<key>GroupName</key>
<string>groupname</string>
```

これにより、rootユーザーではなく指定したユーザーとグループでプロセスが実行されます。

## まとめ

macOSのlaunchctlコマンドは強力ですが、適切に使うには様々なオプションと設定を理解する必要があります。特に`-w`オプションの使用や、フォアグラウンドモードでの実行などは、サービスの安定稼働に大きく貢献します。

サービス管理で問題が発生した場合は、適切なログ設定とデバッグオプションを活用することで、トラブルシューティングが容易になります。
読書感想文「実践！プロジェクト管理入門」　ch3~5

# 書籍名「実践！プロジェクト管理入門」　ch3~5
著者：梅田 弘之
翔泳社

章ごとに分割して投稿します

https://qiita.com/RYA234/items/495f534798aa347ce44c

# 印象に残った部分

## p46 スパイラルモデルの特徴
スパイラルモデルは、プロトタイプ方式ともいわれる方法である。「まず、作ってみて」というのがスパイラルモデルの特徴であるが、
だからと言って事前の計画無しで良いわけではない。

## p47 「計画」と「評価」を成果物に
開発プロジェクトのスケジュール表を作成する際は、単に作業内容を記述するだけではなく、その作業で作成される成果物をはっきりさせることがポイントである。
例えば、
基本設計工程では基本設計書
結合テスト工程では、結合テスト計画書と結合テスト結果書が成果物となる。


## p50 スパイラルモデルのスケジュール表
プロトタイピング手法の良さは、ユーザのニーズをこまめに、取入れられるという点なので各ラウンドの中でもこまめにユーザを確認してもらいながら、
プロトタイプの作成を進めるのである。つまり、大きな節目として、3ラウンドを計画しながらその中で細やかなスパイラルが日常的に行われるのが重要である。

## p56 WBSによる機能・作業分割
適正な作業の分割を行うのに、WBS（Work Breakdown Structure ）という手法が使われることがある。必要な工程、作業をトップダウンで分析し、階層構造で表現したものである。
階層の上部は機能別の分割となるが、下部になるにつれて細分化された作業が示されることになる。
プロジェクトの段階によって　プロジェクトWBS フェーズＷＢＳ　タスクＷＢＳに分かれる。


## p76-78 品質管理は日本の得意分野
電化製品や自動車など日本の製造業が国際競争力が持てるようになったのは、価格競争力に優れていたこともあるが、一番の武器は品質だ。
日本のソフトウェアは体系的に品質をコントロールするという発想に欠ける。

PMBOKなおｄの米国流プロジェクト管理を盲目的に追従するのではなく、日本の強力な武器であるＱＣ/TQCの「いいとこ取り」して世界一の品質を誇れるようになる気概を持ちたいものである。

## p79 品質改善活動と品質安定活動
一方、近代的な品質管理では「品質＝ユーザ満足度」と定着とされる。
つまりバグが無いだけでは十分とは言えず、ユーザの使い勝手の良いシステムを提供できて初めて品質の良いソフトウェアとなるのである。
一般の品質管理活動は、プロジェクトメンバーが自主的により　よい品質を目指す「品質改善活動」と全社的に一定の品質を安定して維持する「品質安定活動」の２つからなる。

## p80 品質に関する意識改善
プロジェクト全体の品質を改善する土壌を作り上げる。「バグのないこと」という低次元な意識から「ユーザの使う立場をイメージした」使いやすいソフトウェアを作るプロ意識を全員が持つ必要が有る。

## p85 単体テスト/結合テストとテスト仕様書
テストを行う際には「テスト計画書」を作成し、その内容に基づいてテスト作業を行う。
テスト計画書を作成するのは大変な作業であり、どの程度細かく書くべきかの判断が難しい。
しかし、テスト計画書があればテスト漏れを防止できるし、書く行為そのものがテスト項目の整理と洗い出しにも役立つ。



## p89 テストは疑心の強い老婆の気持ちで
「バグがなければいいなぁ」という気持ちでテストに入ると、不思議とバグは見つけられない。「絶対バグがあるはずだ」とプログラマとして自分を否定する気持ちに切り替えると面白いほどバグが見つかる。

# 実践できること or 感想

## 感想

スケジュール管理、品質管理はIT以外の他の業界（工業製品の製造業、食料品製造）でも実践されている分野だと感じました。

著者の梅田さんは20代の内は東芝で働いており、そこで品質管理や外注管理の基礎を磨いていたから本書を書く下地になったのかなと思いした。前職の経験も考えようになって無駄にならないと本書を読んでいて思いました。

最新のテクニカルなキャッチアップも大事だが、本書で紹介されている基本的な項目も習得する必要があると感じました。
特に品質管理についてはある程度しっかり掘り下げないとバグを減らすことはおろか、お客様が満足するようなアプリケーションを作るのは難しいと感じました。

他業種でスケジュール管理、品質管理をしっかりやっていた人はその点習熟してるので、ＩＴエンジニアに転職するにしても強みになると感じました。
（自分を含め苦手意識があるのか、できない人が多いので…）

## 実践できること
・ＱＣ検定3級の資格の本を買って読む。（資格を取るとは言ってない）
・個人開発でテスト計画書を書く
・ＴＱＣの本を買って読む
競プロ日記#25/04/25

# アルゴ式-[パスワードの可能性 (Ex)](https://algo-method.com/tasks/776)
- 未提出（提出しましょう）
- すべての位の数字が異なるという条件が漏れていた
```
// nPmの順列(階乗や0!にも対応)
long long funcPermutation(int N,int M){
    if (N == 0 & M == 0){
        return 1;
    }
    long long ans = 1;
    for (int i = 0;i < M;i++){
        
        ans = ans * (N - i);
        
    }
    return ans;
}


int main() {
    int N;
    cin >> N;
    cout << N * funcPermutation(9, N - 1) << endl;
}
```

# アルゴ式-[Grouping1](https://algo-method.com/tasks/783)
- 未提出（提出しましょう）
- 高校数学の重複組合せを頑張って思い出してた
```
// nPmの順列(階乗や0!にも対応)
long long funcPermutation(int N,int M){
    if (N == 0 & M == 0){
        return 1;
    }
    long long ans = 1;
    for (int i = 0;i < M;i++){
        
        ans = ans * (N - i);
        
    }
    return ans;
}

// nCmの組合せ(funcPermutationを使う)
long long funcCombination(int N,int M){
    return funcPermutation(N,M) / funcPermutation(M,M);
}

int main() {
    int N,M;
    cin >> N >> M;

    cout << funcPermutation(N+M,N+M) / (funcPermutation(N,N) * funcPermutation(M,M)) << endl;
}
```

# アルゴ式-[巡回セールスマン問題の近似解](https://algo-method.com/tasks/365)
- 貪欲法の実装。解説を見ました。

```
int main() {
    // 入力
    int N;
    cin >> N;
    vector<double> X(N), Y(N);
    for (int i = 0; i < N; ++i) cin >> X[i] >> Y[i];

    // 二頂点間の距離を求める関数
    auto calc = [&](int i, int j) -> double {
        return sqrt((X[j]-X[i]) * (X[j] - X[i]) + (Y[j] - Y[i]) * (Y[j] - Y[i]));
    };

    // 答え
    double res = 0.0;

    // used[v] ← 頂点 v をすでに訪れたか
    vector<bool> used(N, false);
    used[0] = true;

    // 前回の頂点
    int prev = 0;

    // 毎回貪欲に頂点を選んでいく
    for (int i = 0; i < N - 1; ++i) {
        // 残っている頂点で最も近いところを探す
        int nex = -1;
        double min_dis = 1000000;
        for (int j = 0; j < N; ++j) {
            // すでに訪れた頂点はスキップ
            if (used[j]) continue;
            double dis = calc(prev, j);
            if (min_dis > dis) {
                min_dis = dis;
                nex = j;
            }
        }
        
        // 新たに頂点 nex を訪れる
        used[nex] = true;
        res += min_dis;

        // 前回頂点を更新
        prev = nex;
    }

    // 最後に頂点 0 へ戻る
    res += calc(prev, 0);

    // 小数点出力
    cout << fixed << setprecision(10) << res << endl;
}
```

# アルゴ式-[グループ分け (1)](https://algo-method.com/tasks/2f391c217964f112)
- 貪欲法あんまり得意じゃない

```
int main() {
    int N;
    cin >> N;
    vector<int> A(N);

    for ( int i = 0; i < N; ++i) {
        cin >> A[i];
    }
    sort(A.begin(), A.end());

    int ans = 0;
    while(A.size()){
        ans++;
        auto it = A.begin();
        int m = *it;

        while(it != A.end()){
            if((*it) % m == 0){
                it = A.erase(it);
            }else{
                ++it;
            }
        }
    }

    cout << ans << endl;
}
```

# アルゴ式-[グループ分け (2)](https://algo-method.com/tasks/4904d273a9c27b11)
- 問題の意味を正しく読み取れていなかった。
- 解説だけ読んでも実装の意図が良くわからなかったのでChatGPT先生に聞いてやっと理解した
Zabbix Agent 1 (zabbix_agentd) から Agent 2 (zabbix-agent2) への移行

## ✅ 1. まず「古いAgent1」を**止めて、無効化**します

Agent 1 (`/usr/local/zabbix-agent`) がまだ動いていると、  
ポート10050を握ってしまうので、**完全に止める＆無効化**します。

### 古いAgentの停止

```bash
sudo systemctl stop zabbix-agent
```

### 古いAgentの自動起動を無効化

```bash
sudo systemctl disable zabbix-agent
```

これで、再起動してもAgent1は立ち上がらなくなります。

---

## ✅ 2. 次に「新しいAgent2」を**起動＆有効化**します

### Agent2の設定ファイルを必要に応じて確認・修正

設定ファイルはここです

```bash
/etc/zabbix/zabbix_agent2.conf
```

ポイントだけ：

- `Server=`
- `ServerActive=`
- `Hostname=`

が正しいかだけは念のため再確認してください

---

### Agent2を起動

```bash
sudo systemctl start zabbix-agent2
```

### Agent2を自動起動有効化

```bash
sudo systemctl enable zabbix-agent2
```

これで再起動してもAgent2が自動で上がるようになります。

---

## ✅ 3. 動作確認

Agent2のステータスをチェックします：

```bash
sudo systemctl status zabbix-agent2
```

→ `active (running)` になっていればOK

さらにログを見る

```bash
tail -f /var/log/zabbix/zabbix_agent2.log
```

→ ここで

```plaintext
active check configuration update from [zabbix.net:10051] is OK
sending [agent.ping] to server is successful
```

が出たらOK

---

# ✅ まとめ

| ステップ | コマンド |
|:--|:--|
| 古いAgent1を止める | `sudo systemctl stop zabbix-agent` |
| 古いAgent1を無効化 | `sudo systemctl disable zabbix-agent` |
| 新しいAgent2を起動 | `sudo systemctl start zabbix-agent2` |
| 新しいAgent2を自動起動化 | `sudo systemctl enable zabbix-agent2` |
| ステータス確認 | `sudo systemctl status zabbix-agent2` |
| ログ確認 | `tail -f /var/log/zabbix/zabbix_agent2.log` |
Geminiでフルートを使う魔法少女を描いてみた。

# 概要

Geminiでフルートを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のフルートを使う魔法少女を描いてください。
```

![光のフルートを使う魔法少女_20250426.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/12dbe939-e89b-4239-8c57-d0a8532043e3.png)


```
闇のフルートを使う魔法少女を描いてください。
```

![闇のフルートを使う魔法少女_20250426.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/8e8d5626-a5c4-47ab-bd0c-c52c18c86e89.png)


```
聖なるフルートを使う魔法少女を描いてください。
```

![聖なるフルートを使う魔法少女_20250426.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c5ad641a-ead0-4053-9437-d91b39ae0523.png)


# まとめ

聖なる子は可愛いかも。
何かの役に立てばと。
【Rails初学者】Rails8でSCSSを反映させる

こんにちは。
この記事は、Rails 8 で SCSS（Sass）を使おうとして、なぜかスタイルが反映されずに困ったという話
今後、また忘れて同じように悩む可能性があるため、記録として残します。

※ この記事は自身の学習過程備忘録です。

---

## 環境

- Ruby on Rails 8.0.2
- propshaft（新しいアセットパイプライン）
- dartsass-rails
- importmap-rails

---

## CSSは読み込まれているのに、スタイルが反映されなかった

`application.scss` にSCSSを書いて、`stylesheet_link_tag` も設定していたが、ブラウザで確認すると反映されていない。
Chromeの開発者ツールでも `application-xxxx.css` は読み込まれてる。

---

## 原因は「@use構文のルール」

Rails 8 + dartsass-rails では、**SCSSの `@use` 構文を使うのが基本**らしい。

### 誤った書き方

```scss
@import 'variables';

body {
  background-color: $base-bg-color;
}
```

この書き方は`@use`では 動かない。
「やってしまった...」と思いました。

## 正しい書き方
```scss
@use 'variables';

body {
  background-color: variables.$base-bg-color;
}
```

## ポイント
`@use`で読み込んだファイルの変数は、モジュール名（ファイル名）.変数名 の形で使う。
すべての SCSS ファイルでも同様である。

##  application.html.erb にCSSを読み込む記述も忘れない
`<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>`

## キャッシュも注意
変更が反映されないときは、`bin/dev`を再起動する
ブラウザのキャッシュを無視して再読み込み（Shift + リロード）
上記も行っておく

## メモ
今回の学びは、「@useを使うなら、変数もモジュール経由で書かないといけない」
Rails8に入ったばかりの初心者ですが、少しずつ慣れていきたいと思います。

## 参考・引用
- [Ruby on Rails ガイド（v8.0） - アセットパイプライン](https://railsguides.jp/v8.0/asset_pipeline.html)
- [dartsass-rails GitHubリポジトリ](https://github.com/rails/dartsass-rails)
- [Sass公式：@use ルール](https://sass-lang.com/documentation/at-rules/use)


※ この記事は自身の学習過程・開発経験をもとにまとめた備忘録です。
WebGLビルドの地雷[Unity]

### はじめに
筆者がウキウキで作ったゲームをビルドしようとした際に失敗したことを羅列していきます。
他のプラットフォームに向けたビルドがwebGLでは通用しないので、気をつけましょう。

# 目次
1) Escキーを充てるな
2) Application.PermanentPathで保存するな
3) 並列処理にTaskを使うな

### Escキーを充てるな
Escキーにメニューを開けたり、直前シーンに戻るの機能性を持たせるのは直感的ですが、WebGLビルドであると、画面を最大から解除する処理が優先されてしまい、想定通りの行動はしません。避けましょう。

### Application.PermanentPathで保存するな
ウイルス対策なのか、webビルドではPlayerPrefsしかアクセス権限がありません。エラーが出ないわりには、アプリが動かなくなるので要注意です。

### 並列処理にTaskを使うな
何故か動かないそうです。普通にCoroutineやIEnumeratorで対応しましょう。


 ## まとめ
 筆者と同じような犠牲者を出さないように今回は把握している範囲でまとめてみました。
 こういった避けるべき地雷をまとめたものどこかで見れないものだろうか...
 もし抜けているものがございましたら、ぜひコメント欄にて共有願います。
応用情報を受けてきた感想

# 背景
ブランクからエンジニア戻った元ブルーカラーです。
基本情報は１年ぐらい前に受かっています。

# 勉強など
去年の１０月から勉強はじめて、１５０～２００時間の間だと思います。
基本情報を受けた際にも同じぐらい勉強しています。

# 自己採点
午前40 + 回答覚えてない問題
午後57 + 部分点

# 午前問題
午前はマネジメントとストラテジはよくできてましたが、前半のテクノロジをほとんど間違えていました。
家で解いてる時は８割９割取れていたので行けると思ってましたが、いざ本番になると計算問題が全然ダメでした。
単純に計算ミスが多かったので、いま反省して勉強し直しております。

# 午後問題
午後問題は、セキュリティ・ネットワーク・データベース・サービスマネジメント・システム監査を選択。
非公式の採点だと57点は確実に取れていて、＋部分点という感じでした。
おそらく合格点です。
セキュリティとネットワークはほとんど正解。
ネットワークは、短期でドキュメント整備してた経験あるので、９割正解でした。
サービスマネジメントは文章量が多くて何度も何度も読み直してやっと回答できるという感じでした。
かなり時間を使ってしまいました。
システム監査もまあまあできました。
データベースを最後に回したら時間が足りず、回答間に合いませんでした。

# 感想
今回おそらく午前が点足りてないのでダメだと思います。運よく受かるよりは自分の苦手がはっきりしたので、よかったと思います。10月試験に向けて引き続き努力していきたいと思います。
インタプリタ・コンパイラ言語について

# インタプリタとは
ソースコードを読み込んで意味を解釈して実行するプログラム
事前のコンパイル(人が書いたプログラムを機械が認識できる形式にすること)は不要
例)Python、JavaScript、Ruby、PHPはインタプリタ

# コンパイラ言語
ソースコードを事前に機械語に変換してから実行する言語
コンパイルが必要
インタプリタ言語に比べると実行速度が速い(最適化されたバイナリ(プログラムを機械語に変換したファイル)を直接実行するから)
例)C、C++、Go、Rustはコンパイラ言語

※Javaはどっち？→半コンパイル・半インタプリタのハイブリッド
・コンパイル：ソースコード(.java)をバイトコード(仮想マシンが理解できる中間的なコード)(.class)に変換
・実行：JVM(Java仮想マシン)がバイトコードを解釈して実行

JVMがインタプリタ的な動作をする+JITコンパイル(実行中に一部機械語に変換)も使われる
Pythonで掛け算九九の表をワンライナーで表示する

# Pythonで掛け算九九の表をワンライナーで表示する

Pythonを使って掛け算九九の表をワンライナーで表示する方法を紹介します。

```python
print('\n'.join([' '.join([f"{i*j:2d}" for j in range(1, 10)]) for i in range(1, 10)]))
```

## 解説

このコードは2つのリスト内包表記を使っています：

1. 内側の `[f"{i*j:2d}" for j in range(1, 10)]` は各行の数値を生成
2. 外側の `[... for i in range(1, 10)]` は各行を生成
3. `' '.join()` で各行の数値をスペースで結合
4. `'\n'.join()` で各行を改行で結合
5. `f"{i*j:2d}"` で2桁の固定幅フォーマットを適用

## 実行結果

```
 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81
```

シンプルかつ効率的なワンライナーで掛け算九九の表を表示できました。
App Routerで使えなくなる関数と代替方法

# 🧭 App Routerで使えなくなる関数と代替方法（Next.js）

Next.js の App Router（`app/` ディレクトリ構成）では、従来の Pages Router 専用関数が使えません。  
ここでは、それぞれの代替手段と具体例をまとめます。

---

## ❌ App Routerで使えない関数とその代替

| Pages Router（`pages/`）      | App Router（`app/`）での代替方法                  |
|-------------------------------|------------------------------------------------|
| `getStaticProps`              | `async` 関数内で `fetch()` or `fs` を直接呼ぶ   |
| `getServerSideProps`          | `fetch(..., { cache: 'no-store' })`            |
| `getInitialProps`             | 使わずにコンポーネントで直接データ取得          |
| `getStaticPaths`              | `generateStaticParams()`                       |

---

## ✅ 1. `getStaticProps` の代替（静的データ取得）

**Pages Router:**
```ts
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/posts');
  const data = await res.json();
  return { props: { data } };
}
```
**App Router:**
```ts
// app/page.tsx
export default async function Page() {
  const res = await fetch('https://api.example.com/posts', {
    cache: 'force-cache', // ← これでSSG相当になる
  });
  const data = await res.json();

  return (
    <div>
      {data.map((post) => (
        <p key={post.id}>{post.title}</p>
      ))}
    </div>
  );
}
```
## ✅ 2. getServerSideProps の代替（常に最新データ）

**App Router:**
```ts
const res = await fetch('https://api.example.com/posts', {
  cache: 'no-store' // ← SSR相当（キャッシュなし）
});
```

## ✅ 3. getStaticPaths の代替 → generateStaticParams()
**Pages Router:**
```ts
export async function getStaticPaths() {
  const posts = await fetchPosts();
  return {
    paths: posts.map(post => ({ params: { id: post.id } })),
    fallback: false,
  };
}

```

**App Router:**
```ts
// app/posts/[id]/page.tsx
export async function generateStaticParams() {
  const posts = await fetchPosts();
  return posts.map(post => ({ id: post.id }));
}

export default async function Page({ params }: { params: { id: string } }) {
  const post = await fetchPostById(params.id);
  return <h1>{post.title}</h1>;
}

```

## ✅ 4. getInitialProps は廃止方向
App Routerでは getInitialProps を使わず、

ページやコンポーネント内で直接 fetch() を使う構成に変わります。

## 📌 fetchの使い分けまとめ
| 目的 | fetchオプション |
|:-:|:-:|
| 静的生成（SSG  | cache: 'force-cache'（デフォルト）  |
| 動的レンダリング（SSR） | cache: 'no-store'  |
| ISR（再生成  |  next: { revalidate: 秒数 } |

## ✅ まとめ
App Router では getStaticProps などは使えない

ページを async function にするだけでデータ取得が可能

SSR/SSG/ISRの挙動は fetch() のオプションでコントロールできる
オブジェクトってなに？

# 「オブジェクト」「インスタンス」「クラス」「プロパティ」「メソッド」「コンストラクタ」についてのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518994/4a7c3bd4-443d-4a07-869b-d458b245821b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518994/0dedd795-4840-4c82-a153-c6303861e82c.png)

※無尽蔵にインスタンスなどのオブジェクトを生成し続けるとメモリリークが発生してしまう。使われていないメモリを自動で回収・解放してくれる「ガベージコレクション」という仕組みがある。JavaやPythonなどに搭載されている。
🐛 Google Chrome のウィンドウを分離するとサイズが変わってしまうのの解消法 @ Windows

## 概要

ここ数週間くらい、Windows で Google Chrome のタブを分離するとウィンドウサイズが変わってしまう事象に遭遇しています。(Chrome の更新が起因？)

手元では分割後はウィンドウサイズが３分の２くらいに。
挙動的に解像度の差がそのまま減算されたサイズになっている様な気がします。

一時的かもしれませんが、解消できたので方法をメモしておきます。

### 手元の再現条件
- ノート PC のディスプレイと異なる解像度・DPI のディスプレイを繋いでいる（推測）

### 解消手順

1. Google Chrome アプリのディレクトリを開く  
   （変更していない場合は `C:\Program Files\Google\Chrome\Application`）
2. chrome を右クリックしてプロパティを開く（or 選択して <kbd>Alt</kbd> + <kbd>Enter</kbd>）
3. `互換性` のタブを選択
4. `高 DPI 設定の変更` ボタンを押下（図１）
5. 下方に表示される `高い DPI スケールの動作を上書きします。` をチェック（図２）
6. Google Chrome を起動 / 起動している場合は再起動

図１ | 図２
:-:|:-:
![図１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128300/1f446a64-812c-4a59-b337-0f686d480301.png) | ![図２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128300/e168b1b3-5f55-478b-a5f9-0a958b6b24d0.png)


<details>
<summary>途中のショートカットメモ</summary>

操作 | ショートカットキー
-|-
1\. エクスプローラー起動 | <kbd>win</kbd> + <kbd>E</kbd>
2\. アドレスバーにフォーカス | <kbd>Alt</kbd> + <kbd>D</kbd>
3\. ペースト | <kbd>Ctrl</kbd> + <kbd>V</kbd>
4\. ディレクトリへ移動 | <kbd>Enter</kbd>
5\. chrome を選択 | <kbd>C</kbd>
6\. プロパティを開く | <kbd>Alt</kbd> + <kbd>Enter</kbd>
7\. タブ移動 | <kbd>Ctrl</kbd> + <kbd>Tab</kbd>
</details>

### Google Chrome コミュニティの関連投稿
1. [2025-04-06] [タブを分離するとウィンドウサイズが変わる](https://support.google.com/chrome/thread/336394129/%E3%82%BF%E3%83%96%E3%82%92%E5%88%86%E9%9B%A2%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B?hl=ja)
2. [2021-07-26] [Chrome Browser Window Shrinks (Resizes) on my external monitor](https://support.google.com/chrome/thread/118683727/chrome-browser-window-shrinks-resizes-on-my-external-monitor) 

1つ目の投稿は割と直近の物で解決できるかと思いましたが、設定があまり現実的な感じでは有りませんでした。
念のため英文で検索した所、近しい問題と解決策の記載が有ったので、同様のそれらしき設定を探して変更したところ解決しました。
逆行列（inverse）と疑似逆行列（pseudoinverse）

# 初めに
表題について．

参考：

* [金谷2018: 線形代数セミナー](https://www.kyoritsu-pub.co.jp/book/b10003952.html)
* [一般化逆行列（ムーア・ペンローズの疑似逆行列）](https://manabitimes.jp/math/2746)
* [いまさら聞けないMoore-Penroseの一般化逆行列（疑似逆行列）の話](https://qiita.com/zhidao/items/5d8e5e7e29aab7b0dd2c)

# MAIN
## 逆行列
:::note info
**定義 / Definition**
正方行列$A \left( \in \mathbb{R}^{n \times n} \right)$に対して，
```math
A A^{-1} = A^{-1} A = I
```
を満たす正方行列$A^{-1}$が存在するとき，$A^{-1}$を$A$の「逆行列（inverse matrix）」と呼ぶ．但し，$I$は$n$次のidentityである．
:::
なお，逆行列を持つような正方行列を，正則（regular）であると言う．非特異（non-singular）・可逆（invertible）などと言うこともある．

## 疑似逆行列
:::note info
**定理 / Theorem**
複素行列$A \left( \in \mathbb{C}^{m \times n} \right)$に対して，以下の4つを満たす複素行列$A^{+} \left(\in \mathbb{C}^{n \times m} \right)$が唯一つ存在する．

1. $A A^{+} A = A$
1. $A^{+} A A^{+} = A^{+}$
1. $(A A^{+})^{*} = A A^{+}$
1. $(A^{+} A)^{*} = A^{+} A$

このとき，$A^{+}$を$A$の「疑似逆行列（pseudoinverse matrix）」と呼ぶ[^1]．
[^1]: 「疑似」という日本語と，「擬似」という日本語がある．現代では，両者に同じ意味が与えられているが，漢字の歴史から見ると，「疑似」が本来の漢字で，「擬似」は日本人が勝手に生み出して浸透させてしまったものらしい．
:::
厳密には，Moore-Penrose型と呼ぶようだが，教科書を見ても，「本書ではMoore-Penrose型のみを扱う」などとされており，何が「Moore-Penrose型」たらしめるのか，「非Moore-Penrose型」はどのような形なのか，などは未だ分からない．しかし，一般的には，「pseudoinverse of the Moore-Penrose type」のことを，単に「pseudoinverse」と呼んで良いという，そのような雰囲気が浸透しているようである．

ところで，

* 一般逆行列
* 一般化逆行列
* 疑似逆行列
* Moore–Penrose inverse
* Moore–Penrose generalized inverse
* pseudoinverse

など，沢山の呼び方があるが，何れもpseudoinverse of the Moore-Penrose typeのことを指しているようである．

$A = U S V^{*}$に対して，
```math
\begin{align}
    A^{+}
    &= V S^{-1} U^{*}
     = \sum_{k}^{K} \frac{1}{s_{i}} v_{i} u_{i}^{*}
\end{align}
```

## 応用
$A x = b$において，$A \in \mathbb{C}^{m \times n}, \ x \in \mathbb{C}^{n}, \ b \in \mathbb{C}^{m}$を考える．

### 最小二乗解
$m \gt n$のとき（$A$ is tall & skinny），方程式（データ）が多い割に，自由度が小さい．いい塩梅で least square．
```math
\begin{align}
    A x 
    &= b
    \\
    x 
    &= A^{+} b
    \; \text{ minimizes} \;
    \| A x - b \|_2
\end{align}
```

### 最小ノルム解
$m \lt n$のとき（$A$ is short & fat），方程式（データ）が少ないのだけれど，自由度がめちゃくちゃ大きい．抑え込んで least norm．
```math
\begin{align}
    A x 
    &= b
    \\
    x 
    &= A^{+} b
    \; \text{ minimizes} \;
    \| x \|_2
\end{align}
```

# 終わりに
最小二乗解と最小ノルム解は，いつも彼辺此辺ではないか，と不安になる．
統計情報を別環境に移送する

# はじめに

Oracle Databaseにおいて、統計情報を別環境に移送するには、おおよそ以下のような手順で実施します。

1. 移送元 : 統計用の表を作成し、統計情報をエクスポートする
2. 統計用の表を移送する
3. 移送先 : 統計用の表から統計情報をインポートする

# 手順

ここでは統計用の表を`opt_stats`とします。

① 移送元 : 統計用の表を作成する。

```
EXEC DBMS_STATS.CREATE_STAT_TABLE (ownname => 'dba1', stattab => 'opt_stats');
```

② 移送元 : 統計情報をエクスポートする

```
EXEC DBMS_STATS.EXPORT_SCHEMA_STATS(ownname => 'dba1', stattab =>'opt_stats')
```

③ 統計用の表を移送する

移送方法は任意ですが、たとえばData Pumpを利用する場合、まず移送元環境にて、統計用の表をエクスポートします。

```
expdp scott/tiger@dba1 \
  DIRECTORY=pump_dir1 \
  DUMPFILE=yyyymmdd_opt_stats.dmp  \
  LOGFILE=yyyymmdd_opt_stats.log \
  TABLES=opt_stats
```

作成したdmpファイルを移送し、移送元の環境で、統計用の表をインポートします。

```
impdp scott/tiger@dba1 \
  DIRECTORY=pump_dir1 \
  DUMPFILE=yyyymmdd_opt_stats.dmp  \
  LOGFILE=yyyymmdd_opt_stats.log \
  TABLES=opt_stats
```

④ 移送先 : 統計情報をインポートする

```
EXEC DBMS_STATS.IMPORT_SCHEMA_STATS(ownname => 'dba1', stattab=> 'opt_stats');
```

# 参考

https://docs.oracle.com/cd/F39414_01/tgsql/transporting-optimizer-statistics.html

# 環境情報

- Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production