OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Authenticatorアプリに通知が届かなくなった時にやったこと

# はじめに
Azureポータルへのサインイン要求がAuthenticatorアプリで承認できず、サインインできなくなるという事象が発生しました。
最終的にはゲストユーザとして複数ディレクトリにサインインしているために発生する事象と判明し、ゲストユーザを一旦削除してもらうことで解決しました。
解決までに結構苦戦したため備忘として書き残しておきます。
# 事象
* 自社のディレクトリに加えて他社ディレクトリにゲストユーザとしてサインインしているアカウントで発生
* 他ディレクトリに切り替えている状態でサインインを求められた際に発生
* サインイン画面表示直前にアクセスしているURLは他社ディレクトリのもの
* Azureポータルにサインインする際のサインイン要求に対してAuthenticatorアプリが起動せず、2桁の番号を入力できない
* Authenticatorアプリ右上の三点マーク > 通知の確認を押下しても「通知は見つかりませんでした。」が表示される
* Authenticatorアプリに表示されているワンタイムパスワードコードを入力しても、下記メッセージが表示され、サインインできない
    * メッセージ：正しい確認コードを入力しませんでした。もう一度やり直してください。
* Authenticatorアプリのホーム画面には、アカウント単位でレコードが表示されており、それまでは自社のディレクトリにサインインする際も他社のディレクトリにサインインする際も同じレコードに対して通知が来ていた

# 解決手順
以下手順で解決しました。

1. 他社のディレクトリの管理者に連絡して、ゲストユーザとして招待されているアカウントを削除してもらう
1. 他社のディレクトリにサインインしていない状態で自社ディレクトリにアクセスし、サインイン要求の通知を受け取ってサインイン
1. 他社のディレクトリの管理者に連絡して、再度ゲストユーザとして招待してもらう
1. 他社のディレクトリにアクセスし、Authenticatorアプリへの紐づけを行う
1. Authenticatorアプリに他社のレコードが生成され、サインイン要求が受け取れるようになり解決

# 切り分けの為にやったこと
ここからは切り分けの為に実施したことを書き残しておきます。

### Authenticatorとの紐づけを削除することで解決するか
下記3点を実施し、解決するか確認しました。
しかし、原因がゲストユーザ側にあったため、この方法法では解決しませんでした。
1. 下記にアクセスし、「セキュリティ情報」から「Microsoft Authenticator」を削除
https://aka.ms/mfasetup
1. Authenticatorアプリからもアカウントを削除
1. Authenticatorアプリをアンインストール&再インストール

### 別のアカウントではサインインできるか
Authenticatorアプリに複数のアカウントを紐づけていたため、今回通知が受け取れなくなったアカウント以外のアカウントでAzureポータルへのサインインしてみました。
他のアカウントでは通常通りサインイン要求の通知を受け取ってサインインができたため、Authenticatorアプリではなくアカウント側の問題らしいという切り分けができました。
### ゲストユーザ権限をもらっていないアプリにはサインインできるか
対象のアカウントは自社のディレクトリに加えて、他社のディレクトリにゲストユーザとして招待されていました。
そこで、対象アカウントでゲストユーザの権限をもらっていないアプリにサインインできるかを確認できました。
今回はAzureポータルとTeamsの権限をもらっていたので、試しに自社のViva Engageにサインインしてみたところ、通常通りサインイン要求の通知を受け取ってサインインができました。
このことから、ゲストユーザとして複数ディレクトリにサインインしていることが問題らしいという切り分けができました。
### ゲストユーザをサインアウトさせれば解決するか
ゲストユーザが問題らしいということ判明したので、他社ディレクトリの管理者に依頼して強制サインアウトさせてもらいました。
その状態で再度アクセスを試みたのですが、状況変わらずでした。

これらの切り分け結果から他社ディレクトリのアカウントを一旦削除してもらうのが早いのではないかと判断しました。

# おわりに
複数ディレクトリにサインインしているとトラブルシューティングがややこしくなりますね……
Krita を Ubuntu にインストールして使ってみる

Krita は OSS のペイントソフト。

https://krita.org/ja/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/44f2b745-b5d0-4652-90d8-e1628a1a4346.png)

マルチプラットフォームで Windows/macOS/Linux 対応。
Android/ChromeOS 用もあるらしい。


 
試してみました。

# 環境

- Ubuntu 22.04 LTS

# インストール


0202025/4/11 現在、公式ページで配布しているのは 5.2.9 なのだけれど、Ubuntu ディストリビューションパッケージだとどうなるかな?

```
$ sudo apt install krita
```

インストールされたものは 5.0.2 でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/35b59dc8-d4bc-420a-b10b-e18ddca0cdca.png)

# 使ってみる

直感的でいい感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/99280efe-68aa-475a-aa8a-2ff8b10986bf.png)
エンティティの従属関係、情報はどこに持たせるべきか問題

「この情報、どっちのエンティティに持たせればいいのか？」  
システム設計をしていると、何度も直面する問題である。

筆者も、`account`（アカウント）と `company`（会社）という2つのエンティティを扱う中で、「従属関係をどう表現すべきか」という問いに悩まされた。`account` に `company_id` を持たせるべきか？ `company` が `account` の一覧を保持すべきか？ それとも `account_company` のような中間エンティティを定義すべきか？

この記事では、その実体験を出発点に、**関係の種類ごとの設計方針とその理由**を整理する。


# 実際に直面した設計課題

以下のような前提条件のもとで設計を行っていた。

- `account`：サービスを利用するユーザーのアカウント  
- `company`：組織・法人情報  
- 各 `account` は1つの `company` に所属する  
- 各 `company` には複数の `account` が所属する  

この時点では、関係性は「1対多」である。しかし、「`account` に `company_id` を持たせていいのか？」「将来的に関係が変わったらどうする？」といった迷いが生じた。

その迷いを整理するために、関係の種類ごとの整理と、設計方針を明文化する必要があった。


# 関係の種類ごとの設計パターンと理由

### 🔸 1対1（One to One）

#### 特徴：
- 各エンティティが、相手エンティティと1対1でしか関係を持たない。

#### 設計方針：
- **従側に外部キーを持たせる**。
- もしくは、主キーを共有する（共通IDで結合）という設計も可能。

#### 理由：
- データベース設計では、主となる情報を持つ側を中心に構造を組み立てるべきである。
- 従属するエンティティ側に外部キーを持たせることで、関連性を明示しやすくなり、結合処理もシンプルになる。

#### 例：
```plaintext
[account]
id | email

[profile]
id | account_id (FK) | bio
```
アカウントに対するプロフィール情報は、profileテーブルに分離し、`account_id` で関連付けるのが自然である。

---

### 🔸 1対多（One to Many）

#### 特徴：
- 一方のエンティティが、他方のエンティティに複数関係する。
- 多側が一側に「属する」ケースが多い。

#### 設計方針：
- **多側に外部キーを持たせる**。

#### 理由：
- 多側に外部キーを持たせることで、逆方向のJOINが不要になり、データ取得効率が高まる。
- また、従属関係が一目で分かりやすくなるため、管理や拡張もしやすい。

#### 例：
```plaintext
[company]
id | name

[account]
id | name | company_id (FK)
```

この構造であれば、「どのアカウントがどの会社に所属しているか」を簡単に特定できる。

---

### 🔸 多対多（Many to Many）

#### 特徴：
- 双方のエンティティが複数の相手と関係を持つ。
- かつ、その関係に属性（役割・期間など）が付随するケースが多い。

#### 設計方針：
- **中間エンティティ（リレーションテーブル）を新設する**。

#### 理由：
- 多対多のままでは、正規化に反し、データの整合性維持が困難になる。
- 中間エンティティにすることで、関係に属性（例：role、joined_at）を持たせられる。
- 将来的に、関係自体を操作・管理する要件にも柔軟に対応できる。

#### 例：
```plaintext
[account_company]
account_id | company_id | role | joined_at
```

アカウントが複数の会社に所属し得る、または1つの会社に複数のアカウントがいるような場合には必須の構造である。

---

### 🔸 0対多（Optionalな1対多）

#### 特徴：
- 一部のエンティティには関連情報が存在しないこともある。
- 「所属していない」「未設定」といった状態も考慮する必要がある。

#### 設計方針：
- **多側にNULL許容の外部キーを持たせる**。

#### 理由：
- 外部キーがNULLであることにより、「関係が存在しない」という状態を明示できる。
- 複雑な補完処理をしなくても、`LEFT JOIN` などで柔軟な取得が可能になる。

#### 例：
```plaintext
[account]
id | name | company_id (nullable FK)
```

たとえば、会社に所属しない個人利用アカウントを許容する設計にしたい場合、NULL許容の外部キーが適している。



# 設計判断のためのチェックリスト

| 判断基準                         | 推奨される設計                           | 補足                                      |
|-------------------------------|----------------------------------------|------------------------------------------|
| 一方が他方に従属している         | 従側に外部キー                         | JOINしやすく、明確な依存関係を構築可能       |
| 関係自体に意味や属性がある       | 中間エンティティ（リレーション）を設ける | 多対多の解消、役職や期間などの情報を保持可能  |
| 関係が存在するとは限らない       | NULL許容の外部キーを用いる              | オプショナルな関係性を表現しやすい           |
| 完全に1対1の関係である           | 従側に外部キー、または主キー共有で統合   | 冗長なテーブル分割を避け、パフォーマンスも向上 |
Windows11 の新しいメモ帳

# 📝 Windows11 の新しいメモ帳

Windows11 の新しいメモ帳には、ユーザーインターフェースの進化や AI 機能との連携、作業効率の向上を目的とした新機能が追加されました。これにより、より快適で便利なメモ作成・編集が可能になっています。

## ✨ 追加された機能・変更点

#### 📄 Markdown 表示と編集機能

:::note info
**New!**
2025/05/30 より、Windows Insider Program 向けに提供されている最新版メモ帳 (Ver. 11.2504.50.0) で利用できるようになりました。
この機能は現在 Insider 版限定ですが、一般ユーザー向けには 2025 年後半以降の Windows アップデートで正式リリースされる予定です。
:::

`.md` ファイルの読み込みと Markdown 構文の視覚的表示に対応しました。書式設定ツールバーを使って、太字・斜体・リンク・リストなどの Markdown 要素を GUI で編集できるようになっています。

##### 🧰 主な機能

- `.md` ファイルの読み込みと構文の視覚的表示
- 書式設定ツールバー（太字、斜体、リンク、リスト、見出しなど）
- Markdown構文の表示／非表示切り替え
- 書式の削除やプレーンテキストへの戻し機能
- 設定からMarkdown機能の無効化も可能

:::note warn
現時点で未対応の機能
以下の機能は現在 (2025/06) 未対応です。
- 表 (テーブル) の視覚的表示
- コードブロックの言語毎の構文ハイライト
- 画像の埋め込み表示 (!alt)
- 数式 (LaTeX など) のレンダリング
:::

##### 参考リンク：

- [GIGAZINE：Windows 11のメモ帳がMarkdown形式のサポートを開始](https://gigazine.net/news/20250602-microsoft-notepad-text-formatting/)
- [PC Watch：メモ帳がMarkdownに対応、Windows 11 Insider向けに順次展開](https://pc.watch.impress.co.jp/docs/news/2019482.html)
- [Windows Insider Blog（英文）](https://blogs.windows.com/windows-insider/2025/05/30/text-formatting-in-notepad-begin-rolling-out-to-windows-insiders/)

### 🎨 ユーザーインターフェースの進化

#### 🖌 デザインの刷新

Fluent Design System に基づくモダンで統一感のある UI へ刷新。

#### 📂 タブ機能

複数のメモを一つのウィンドウ内で管理できる。

#### 🌙 ダークモード対応

目に優しく、環境に適した表示が可能。

### 🚀 作業効率向上の機能

#### 🔄 自動復元機能

誤って閉じても、編集内容を復元可能。

#### ↩️ 複数回のアンドゥ

従来の 1 回制限を超え、柔軟な修正操作が可能に。

#### 📝 スペルチェック機能

リアルタイムで綴りの間違いを検出し、修正案を提案。多言語対応で利便性向上。

### 🤖 Copilot との連携

Copilot を利用することで、従来のテキストエディタ以上の高度な機能を活用できます。以下に、詳細を示します。

#### 🔑 利用条件

Copilot との連携機能を利用するには、**Microsoft 365** または **Copilot Pro** を契約している Microsoft アカウントでのサインインが必要です。

:::note warn
 ※2025/04
 現時点では、職場や学校のアカウントではサインインできません。
:::

#### ⚙️ 提供される機能

Copilot を通じて、以下のような機能が提供されます：

- ✍️ **リライト機能**
   選択したテキストを、より適切な表現やプロフェッショナルな文章に書き換えることができます。
- 📚 **説明機能**
   専門的な内容や複雑なトピックについて、簡潔で分かりやすい説明を追加します。
- 📰 **要約機能**
   長文のテキストを短く要約し、重要なポイントを抽出します。
- ✅ **提案機能**
   文法やスタイルの改善案を提示し、文章の質を向上させます。

#### 💎 Copilot Pro の利点

Copilot Pro のサブスクリプションに加入すると、これらの機能を無制限に利用できます。一方で、サブスクリプションがない場合は、利用回数に制限があります。

## 🔗 参考サイト

- [Windows 11のメモ帳はMicrosoftアカウント不要 マイクロソフトが正式に確認 | Gadget Hack](https://tech-gadget.reinforz.co.jp/17326)
- [Windows 11のメモ帳アプリにAI機能が！でも気軽に誰でも使えるわけじゃありません：Tech TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/2504/04/news036.html#utm_term=share_sp)
【Linux】scpコマンドでファイルをコピーする

# はじめに
ローカルとリモートサーバ間でファイルをやり取りしたいときに便利な`scpコマンド`
SSH（Secure Shell）を使ってファイルを暗号化しながら安全に転送できたので、備忘録として残します。

# 内容

- `scpコマンド`は、SSHを利用してリモートとローカル間でファイルをコピーするためのコマンド

```
scp [オプション] [コピー元] [コピー先]
```

## リモート → ローカルにファイルをコピー

- ファイル指定する場合

```
scp user@remote_host:/path/to/file.csv ./local_path
```


- 複数ファイルを一度に持ってきたい場合

```
scp cuser@remote_host:/path/to/*.csv ./local_path
```

- 上記の形式だと`zsh` は `*`（アスタリスク）がファイルにマッチしないとき、ローカル側のパスとして展開しようとしてエラーになるので注意

```
zsh: no matches found: cuser@remote_host:/path/to/*.csv
```

- クオートで囲む

```
scp "cuser@remote_host:/path/to/*.csv" ./local_path
```

## ローカル → リモートにファイルをコピー

```
scp ./local_path/file.csv user@remote_host:/remote/path/
```

# まとめ
サーバー上のファイルコピーしたいときに便利なコマンドだったので、備忘録としてまとめ。
必要に応じて -r オプション（ディレクトリ丸ごとコピー）や -P オプション（ポート指定）もできるので便利なコマンド。
【ChatGPT】新しいメモリ機能が発表。


　どうも、カーブミラーです。

　今回は、OpenAIが新しいメモリ機能を発表しました。

:::note info
本記事は、ChatGPTについての
記事です。　　　　あしからず。
:::

　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　では、さっそく【本題】です。

　OpenAIが
　　ChatGPTの
　　　新たな機能を発表しました。

　メモリ機能です。

　“えっ、前からあるじゃん”と
　　思うでしょう。

　今回の機能は、
　　なんと過去のセッションからも
　　　あなたの情報を参照するのです。

　これにより、
　　ChatGPTは、
　　　ユーザーに最適化された
　　　　コミュニケーションが
　　　　　行なえるようになります。
***
　では、
　　詳しい内容をどうぞ。

　サム・アルトマンのポストと
　　OpenAI公式のポストを
　　　o3-miniにまとめてもらいました｡

***（o3-mini編集）***
**ChatGPTのメモリ機能強化：過去のチャット参照でさらにパーソナライズ**  



## はじめに  
2024年4月より、ChatGPTはこれまでの「保存されたメモリ」に加えて、過去のすべてのチャット内容を参照できるようになりました。これにより、文章作成やアドバイス、学習支援など、さまざまな場面でよりあなたに寄り添った応答が可能になります。


## 新機能のポイント  
1. **過去チャットの参照**  
   - これまでの保存メモリ（名前や好み、目標など）に加え、過去のやりとり全体を参照。  
   - 会話の文脈や細かいニュアンスを踏まえた、より関連性の高い回答を生成。  

2. **自然な会話の継続**  
   - 新しいチャットでも、すでにChatGPTが知っている情報を土台にスムーズな対話を実現。  
   - あなただけに最適化されたコミュニケーション体験が向上。


## メモリ機能のコントロール  
- **設定からいつでもオフに可能**  
  - 「過去チャットの参照」を無効化  
  - 「メモリ機能」そのものをオフに  
- **既にオフにしている場合**  
  - 過去チャットの参照もデフォルトで無効  
- **情報の修正**  
  - ChatGPTが知っている内容を変更したい場合は、チャット内で直接指示するだけ  
- **一時的なチャット**  
  - メモリを参照・更新せずに会話したい場合は「temporary chat」を利用  


## 提供スケジュール  
- **即日提供**  
  - Plus／Proユーザー（EEA、英国、スイス、ノルウェー、アイスランド、リヒテンシュタインを除く）  
- **今後数週間以内**  
  - Team、Enterprise、Eduプランのユーザー  


## アクセス確認方法  
ChatGPTの画面上に以下のメッセージが表示されていれば、新しいメモリ機能の強化が利用可能です。  

> *“Starting today, memory in ChatGPT can now reference all of your past chats…”*  


以上が、ChatGPTメモリ機能強化の概要です。今後のやり取りがさらにスムーズで、あなたのニーズにぴったり合ったものになることをお楽しみください。
***

　ちなみに
　　“即日提供”と書いていますが、
　　　Plusユーザーへの提供は
　　　　数日後になるそうです。
　　　　　by サム。

　私、実は、
　　メモリ機能も
　　　使っていないんですよね〜😅

　まぁ、
　　Plusユーザーなので
　　　開放されたら
　　　　使ってみようと思います。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
windows11で、sketchup6 その66

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
WebDialogは、HTMLが動くので、userAgentを調べてみた。
IE7らしい。Three.jsは、動かない。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8ced7384-b8e5-476a-8a6c-a10e4437ea8b.png)

# サンプルコード

```
def test_web
	ie = UI::WebDialog.new("WEBDialog", true, "WEBDialog", 600, 480, 150, 150, true)
	html = <<-EOF
<html>
<body>test
<script>
	document.write(window.navigator.userAgent.toLowerCase());
</script>
</body>
</html>
EOF
	ie.set_html html
	ie.show
end

```

以上。
【SQL】Nested loops

# はじめに

こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。
現在、SQLを勉強しており、その中でも内部結合や外部結合などを学習しています。
これらの結合では、Nested Loops、Hash Join、Sort Merge Joinといったアルゴリズムが採用されることがあります。
本記事では、その中でもNested Loopsについて解説していきます。
なお、本記事は4/5に投稿されるはずでしたがtagのエラーにより4/10は2つ記事を投稿しています。

---

## Nested Loopsとは？

Nested Loops（ネストループ結合）は、SQLの結合処理における最も基本的なアルゴリズムの一つです。
特に、片方のテーブルにインデックスが存在する場合や、結合対象の行数が少ない場合に効果的です。

---

## 処理の流れ

1. 駆動表（driving table / outer table）として選ばれたテーブル（Table_A）を1行ずつスキャンします。
2. 各行に対して、もう一方のテーブル（Table_B、内部表 / inner table）をスキャンします。
3. 結合条件に一致する行があれば、それを結果として返します。
4. 上記の処理を駆動表の全行に対して繰り返します。

イメージとしては、**外側のループがTable_A、内側のループがTable_B**という構造です。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883070/8789c3ef-f23e-47a5-b495-35435515ead9.png)

---

## 特徴

- **処理行数の関係**：Table_Aの行数をR(A)、Table_Bの行数をR(B)とした場合、最大でR(A) × R(B)行の比較が行われます。
- **メモリ使用量が少ない**：一度に大量のデータを保持しないため、Hash JoinやSort Merge Joinに比べてメモリ消費が少ない傾向があります。
- **DBMSの汎用性**：すべての主要なDBMSでサポートされています。

---

## パフォーマンスに関する注意点

### 駆動表は小さい方が良い

Nested Loopsでは、駆動表の行数に比例して内部表へのアクセス回数が増えるため、**駆動表が小さいほど性能が良くなります**。
特に、インデックスを活用する場合にはこの傾向が顕著です。

### インデックスがある場合のアクセス数

内部表の結合キーにインデックスが存在する場合、アクセス回数は以下のように見積もられます：

- 通常、インデックスによる検索はB-tree構造を用いるため、1検索あたり log₂(R(B)) 回のステップで目的のキーに到達します。
- 実際のDBでは、インデックスアクセスに加えて、実データ取得（テーブルアクセス）が1回行われるため、

**アクセス数 ≒ R(A) × (log₂(R(B)) + 1)**

これはあくまで理論モデルですが、実行計画のコスト見積もりの参考になります。

---

## どうすれば効率よく結合できるの？

上記を踏まえて、効率的に結合を行うには、**駆動表を小さくし、内部表には一意性のあるインデックスを設定すること**がポイントです。

---

## まとめ

| 項目 | 内容 |
|------|------|
| アルゴリズムの種類 | 基本的な結合アルゴリズム（すべてのDBMSで対応） |
| 駆動表の最適化 | 小さいほど良い（ループ回数削減）、内部表にインデックスを設定するのが望ましい |
| アクセス数（最適化時） | R(A) × (log₂(R(B)) + 1) |
| メモリ使用量 | 少なめ。大規模なデータにも対応しやすい |

Nested Loopsはシンプルでありながら、インデックスやキャッシュの使い方によって大きく性能が変わる、基本かつ重要な結合手法です。
【MCP】Cursor内のチャットからSlackを操作する🤖

## はじめに

この記事では、AI搭載エディタであるCursor内でMCP (Multi-purpose Copilot) サーバーをセットアップし、Slackと連携させる手順を解説します。
これにより、Cursorのチャットから直接Slackの操作（メッセージの投稿、チャンネル情報の取得など）が可能になります。

## 1. 必要な情報の取得

まず、連携に必要な以下の2つの情報を取得します。

### 1-1. `slackTeamId` の取得

`slackTeamId` は、所属するSlackワークスペース固有のIDです。

1.  デスクトップのWebブラウザで、対象のワークスペースURL（例: `acmeinc.slack.com`）を開きます。
2.  ページが読み込まれると、ブラウザのアドレスバーのURLが `https://app.slack.com/client/TXXXXXXX/CXXXXXXX` のような形式になります。
3.  この中の `T` から始まる文字列（例: `T12345ABC`）が `slackTeamId` です。

### 1-2. `slackBotToken` の取得

`slackBotToken` は、Slack APIを操作するためのボット用トークンです。各自で作成・取得する必要があります。

1.  **Slackアプリの作成とBot Tokenの取得:**
    * こちらの記事を参考に、Slackアプリを作成し、**Bot User OAuth Token** (`xoxb-` で始まるトークン) を取得してください。
        * 参考: [Slack Bot を Python で作ってみる (入門)](https://qiita.com/80syokumotsu/items/041e99e99d8ecaa3c42b)
2.  **権限 (Scopes) の設定:**
    * 作成したSlackアプリに、実行したい操作に必要な権限 (Scopes) を付与してください。例えば、チャンネルへのメッセージ投稿には `chat:write`、チャンネルメッセージの読み取りには `channels:history` や `groups:history` などが必要です。必要な権限は操作内容によって異なります。

## 2. ボットを操作対象のチャンネルに招待する

手順1で作成したSlackアプリ（ボット）を、Cursorから操作したいSlackチャンネルに招待します。

* チャンネル内で `/invite @ボット名` と入力して実行するか、チャンネルの設定メニューから招待してください。
* 参考: [Slack Botの作り方〜インタラクティブな機能の実装まで〜 # 6. インストールしたボットを操作対象のチャンネルに招待する](https://qiita.com/odm_knpr0122/items/04c342ec8d9fe85e0fe9#6-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%83%9C%E3%83%83%E3%83%88%E3%82%92%E6%93%8D%E4%BD%9C%E5%AF%BE%E8%B1%A1%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AB%E6%8B%9B%E5%BE%85%E3%81%99%E3%82%8B)

## 3. Smitheryで接続設定

[Smithery の Slack MCP Server 設定ページ](https://smithery.ai/server/@smithery-ai/slack)にアクセスします。

1.  `slackTeamId` と `slackBotToken` の入力欄に、手順1で取得した値をそれぞれ入力します。
2.  "Connect" ボタンをクリックします。

## 4. MCPサーバーの設定実行

Smitheryのページに、MCPサーバーを設定するためのコマンドが表示されます。

1.  表示されたコマンドをコピーします。
2.  Cursorを開き、ターミナル（内蔵ターミナルまたは任意のターミナル）にコマンドを貼り付けて実行します。
3.  コマンドが正常に実行されると、Cursorの設定ディレクトリ内に `MCP.json` という設定ファイルが生成され、`slackTeamId` と `slackBotToken` が自動的に書き込まれます。

```bash
# Smitheryで表示されるコマンドの例 (実際のコマンドを使用してください)
cursor mcp install @smithery-ai/slack --settings='{"slackTeamId":"TXXXXXXX","slackBotToken":"xoxb-..."}'
```

## 5. MCPサーバーの起動

1.  Cursorの設定画面を開きます (Mac: `Cmd+,`, Windows/Linux: `Ctrl+,`)。
2.  左側のメニューから "MCP Servers" を選択します。
3.  "Slack" サーバーを見つけ、スイッチをオンにして起動します。

これで設定は完了です。Cursorのチャットで `@slack` のようにメンションすることで、Slackの操作が可能になります。またはslackに関するチャットをエージェントに投げると、SlackのMCPを叩いてくれます。

## まとめ

この手順により、Cursorから直接Slackを操作できるようになり、開発中のコンテキストスイッチを減らすことができます。ぜひ試してみてください。
Devboxとservicesの設定例メモ


# devbox

- install 
  - https://www.jetify.com/docs/devbox/installing_devbox/

---

※ WSLでの起動を確認しています

- devbox起動 
```
devbox shell
```

- サービス起動
```
devbox services up
```

- サービス起動バックグラウンド
```
devbox services up -b
```

- サービス停止
```
devbox services stop
```

- mongodb cli 
```
mongosh
```

- mongodb接続文字列 `mongodb://127.0.0.1:27017/`

---


```devbox.json
{
  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.0/.schema/devbox.schema.json",
  "packages": [
    "mongodb-ce@latest",
    "azurite@latest",
    "nodejs@20",
    "mongosh@latest",
    "mongodb-compass@latest"
  ],
  "shell": {
    "init_hook": ["echo 'Welcome to devbox!' > /dev/null"],
    "scripts": {
      "test": ["echo \"Error: no test specified\" && exit 1"]
    }
  }
}

```

```process-compose.yml
version: '1.0'
processes:
  azurite-blob:
    command: azurite-blob --blobHost 0.0.0.0 --blobPort 10000
    ports:
      - "10000:10000"
    volumes:
      - ./azurite:/data

  azurite-table:
    command: azurite-table --tableHost 0.0.0.0 --tablePort 10002
    ports:
      - "10002:10002"
    volumes:
      - ./azurite:/data

  mongodb:
    command: mongod --bind_ip 0.0.0.0 --port 27017 --dbpath ./db
    ports:
      - "27017:27017"

  mongodb-compass:
    command: mongodb-compass
    ports:
      - "27018:27018"
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
```


## devcontainerでdevboxを起動する

```.devcontainer/Dockerfile
ARG version="0.14.0"
FROM jetpackio/devbox:${version}

# Installing your devbox project
WORKDIR /workspaces
USER root:root
RUN mkdir -p /workspaces
RUN chown ${DEVBOX_USER}:${DEVBOX_USER} /workspaces
USER ${DEVBOX_USER}:${DEVBOX_USER}
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.json devbox.json
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.lock devbox.lock

RUN devbox run -- echo "Installed Packages."
RUN devbox shellenv --init-hook >> ~/.profile
```

```.devcontainer/devcontainer.json
{
  "name": "Devbox Remote Container",
  "build": {
    "dockerfile": "./Dockerfile",
    "context": ".."
  },
  "workspaceFolder": "/workspaces/",
  "features": {
    "ghcr.io/devcontainers-contrib/features/zsh-plugins:0": {},
    "ghcr.io/devcontainers/features/git:1": {}
  },
  "customizations": {
    "vscode": {
      "settings": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "biomejs.biome",
        "[typescript]": {
          "editor.formatOnSave": true
        },
        "[typescriptreact]": {
          "editor.formatOnSave": true,
          "editor.defaultFormatter": "biomejs.biome"
        },
        "editor.codeActionsOnSave": {
          "source.fixAll.eslint": "always",
          "source.fixAll": "always",
          "source.organizeImports": "always",
          "quickFix.biome": "always",
          "source.organizeImports.biome": "always"
        },
        "cSpell.words": [],
        "codemetrics.nodeconfiguration.JsxSelfClosingElement": 0
      },
      "extensions": [
        "jetpack-io.devbox",
        "biomejs.biome"
      ]
    }
  },
  "remoteUser": "devbox"
}
```
5分で作れる！ChatGPTのカスタムGPT（GPTs）作成入門【日本語メニュー対応】

こんにちは！  
今回は、OpenAIが提供する「ChatGPT」の機能の一つである**カスタムGPT（GPTs）**の作成方法について、日本語メニューをもとにわかりやすく解説します。

「自分専用のAIって難しそう…」と思っている方でも、この記事を読めば**たった5分でオリジナルのAIチャットボット**を作れるようになります！

---

## ✅ GPTsとは？

GPTsとは、ChatGPTの中で作れる**カスタムチャットボット**のことです。用途や目的に応じて「性格」や「使い方」を設定でき、自分だけの便利なAIを構築できます。

たとえば、以下のような活用が可能です：

- プログラミング学習をサポートするGPT  
- 文書の誤字脱字をチェックするGPT  
- 商品レビューを生成するGPT  
- データ分析相談役のGPT

**ノーコード**で作れるので、プログラミングの知識がなくても安心です。

---

## 🛠 GPTs作成に必要なもの

GPTsの作成には以下の条件を満たす必要があります：

- ChatGPTの有料プラン（GPT-4を使用できるもの：ChatGPT PlusまたはChatGPT Team）  
- PCまたはタブレットなどのブラウザ環境  

---

## ✏️ GPTs作成の手順（5分で完了！）

### ① ChatGPTにアクセス
まずは以下のURLからChatGPTにアクセスします：

👉 https://chat.openai.com/

ログイン後、画面左側のメニューを確認します。

### ② 「GPTを探す」をクリック
左メニューから「GPTを探す」をクリックすると、カスタムGPTの一覧ページが表示されます。

右上にある「＋作成する」ボタンをクリックしましょう。

### ③ 作成方法を選ぶ
「GPTを作成」ボタンを押すと、以下の選択肢が表示されます：

- **作成する（案内に従って作成）**：質問に答えるだけで簡単にGPTを作れる方法です（初心者向け）  
- **構成**：すべての設定を自分で入力する方法です（上級者向け）  

初心者の方には「案内に従って作成」がおすすめです。

### ④ 目的を伝えてGPTをカスタマイズ
「案内に従って作成」では、以下のような点について思いを投げかけていきます：

- このGPTは何のために使いますか？  
- どのような口調や性格にしますか？  
- 必要な知識や資料はありますか？  

↑この質問に答えるだけ（ひとつでも可）で、自動的にGPTが構成されていきます。

### ⑤ 公開設定をして保存
GPTが完成したら、以下のいずれかの公開範囲を選びます：

- **非公開**：自分だけが使用可能  
- **リンクを知っている人のみ**：共有リンクを持つ人だけ使用可能  
- **公開**：誰でも使用可能（ギャラリーに表示されます）  

最後に「保存」ボタンをクリックすれば、作成完了です！

---

## 📌 GPTsの活用例

作成したGPTは、ChatGPTの画面上で通常のチャットと同じように使えます。以下のような活用ができます：

- 日報や議事録のテンプレート作成  
- プロジェクトのFAQ回答  
- 学習支援や試験対策  
- SNSやブログ用コンテンツの下書き生成  

特に**AI活用**によって、手作業で行っていた作業の多くを効率化できます！

---

## 💡 まとめ

カスタムGPTは、誰でも簡単に自分専用のAIアシスタントを作れる非常に便利な機能です。

プログラミング不要、5分あれば構築可能。まずは一つ作ってみることで、業務や学習の中で「AIが当たり前にいる」未来を実感できるはずです。

この記事が皆さんのAI活用の第一歩になれば嬉しいです！

---

ご質問や作ったGPTの共有など、お気軽にコメントで教えてください😊  
いいねやストックも励みになります！
DeploymentのreplicasとrevisionHistoryLimit

KubernetesのDeploymentにおける replicas と revisionHistoryLimit は、アプリケーションの可用性とデプロイメントの管理に重要な役割を果たす設定項目です。

### 1. replicas (レプリカ数)

- 意味: Deploymentによって管理されるPodのDesired State（目標とする状態）におけるレプリカ（複製）の数を指定します。Kubernetesは、常に指定された数のPodが実行されるように維持しようとします。

- 使い方:

  - replicas の値を増やすと、アプリケーションの可用性と負荷分散能力が向上します。
  - replicas の値を減らすと、リソース消費量を削減できます。
  - Kubernetesは、Podの障害やノードの障害が発生した場合、自動的に新しいPodを作成し、指定された replicas の数を維持します。
- 設定例:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3  # 常に3つのPodが実行されるように維持
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
```
この例では、replicas: 3 と指定されているため、Kubernetesは常に3つの my-app Podが実行されるように維持します。
### 2. revisionHistoryLimit (リビジョン履歴制限)

- 意味: Deploymentのロールアウト履歴を保持するリビジョンの最大数を指定します。ロールアウト履歴には、Deploymentの過去の設定（Podテンプレート、replicas の数など）が記録されています。

- 使い方:
  - revisionHistoryLimit を設定することで、ロールバック時に利用可能なリビジョンの数を制限できます。
  - revisionHistoryLimit を大きくすると、より多くのロールバックオプションが利用可能になりますが、etcdに保存されるデータ量が増加します。
  - revisionHistoryLimit を小さくすると、etcdに保存されるデータ量を削減できますが、ロールバックオプションが制限されます。
  - revisionHistoryLimit: 0 を設定すると、ロールアウト履歴は保持されません。
- 設定例:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  revisionHistoryLimit: 3  # 最大3つのリビジョン履歴を保持
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
```
この例では、revisionHistoryLimit: 3 と指定されているため、Deploymentは最大3つのリビジョン履歴を保持します。
### revisionHistoryLimit の重要性:

- ロールバック: 問題が発生した場合、以前の安定したバージョンにロールバックするために、ロールアウト履歴は非常に重要です。
- 監査: ロールアウト履歴は、Deploymentの変更履歴を追跡し、監査を行うために役立ちます。
- リソース管理: ロールアウト履歴はetcdに保存されるため、revisionHistoryLimit を適切に設定することで、etcdのリソース消費量を管理できます。
### 推奨される設定

- replicas: アプリケーションの可用性と負荷分散要件に基づいて適切な値を設定します。
- revisionHistoryLimit: ロールバックの必要性とetcdのリソース消費量のバランスを考慮して適切な値を設定します。一般的には、3〜5程度が推奨されます。
### Deploymentの履歴の確認
```console
kubectl rollout history deployment/my-app
```
###  特定のRevisionへのロールバック
```console
kubectl rollout undo deployment/my-app --to-revision=2
```
GitHubにてPushできるブランチ名に規則を持たせる方法

## はじめに
皆様日ごろチームで開発を進める際にはコーディング規約やLinterなども駆使して、
ソースコードの品質を保ち統一性を持たせるということをしていると思います。
今回はそのソースコードに対して行っているようなことを、Gitのブランチ名に対しても行おうというものです。

以下ここに至った背景などから説明しますが、実際の解決法をまず知りたい！という方は
[規則に沿ったブランチ以外はPush出来ないようにする方法](#規則に沿ったブランチ以外はpush出来ないようにする方法)のセクションをご覧ください。

## 背景
本件を実施するにあたっては以下のような背景がありました。

### 自由なブランチ名により発生する弊害を防ぐ
ルールを設ける前は特に制限をせずに運用していました。
そこで起こった例として `#123-xxx` というブランチが作られたことがありました。
一見すると特に問題が無いようにも思えるのですがこのブランチに対してgit操作をしようとすると
`""(ダブルクォート)で囲まないといけない`
という事象が発生します。
```bash
# 以下は通らない
git checkout #123-xxx

# こちらのようにダブルクォートで囲む必要がある
git checkout "#123-xxx"
```

何かしらのGUIツールを使ってGit操作をしている場合はそこまで気にならないかもしれないのですが、
CUIを基本的に使う場合には多少の面倒が発生することになります。
他にもGitHubではIssue画面からブランチを作成することもできますが、デフォルトで
`{Issue番号}-{Issueタイトル}`
という命名がされるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192099/0a400dd8-5f8c-4a57-b431-936d3f34906d.png)

つまりIssueのタイトルに日本語を用いた場合、上記キャプチャのようなブランチ名が作成されることになります。
`#`などの記号くらいならまだ良いですが日本語などが混ざると運用上でさらに面倒になることが容易に想像できるため、これを防ぎたいのが1つ目の背景です。

### Issueとの対応をわかりやすくする

DraftPRを作ったりするほどでもないがいったん今の作業をリモートにPushしておきたい、
のような状況はよくあると思うのですが、
チームで開発を進めていると共同作業をしたり、他の人のヘルプをするなどといった場面も出てくることがあると思います。
その場合にリモート(GitHub)上に存在するブランチにおいて、
`どのブランチがどのIssueに対する作業をしているものなのかをわかりやすくしておく`ことで
チーム内での認識を取りやすくしたい、というのが2つ目の背景です。

## 規則に沿ったブランチ以外はPush出来ないようにする方法
ここからは実際にどのようにすれば本件を実現できるのかの具体的な例を紹介します。
今回の例としては
`{Issue番号(任意の数字)}-{任意の半角英数字およびハイフン・アンダースコア}`
の規則を守ったブランチだけをPushできるような設定を組みます。

ブランチ例) 123-foo-bar

### RuleSetsの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192099/f08c9f2f-baf6-4d56-a19d-f0ace7801847.png)

対象のリポジトリの Settings > Rules > Rulesets で上記キャプチャのような設定を作成します。

#### Branch targeting criteria

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192099/4690ec55-7c8a-49ba-80a8-44c43cb5281d.png)

`Add Target > Exclude By Pattern`を選択し、
`Branch naming Pattern`に`[0-9]*-[A-Za-z0-9-_]*`を設定する。

#### Branch Rules

`Restrict creations`にチェックを入れる。

上記の2つが設定出来たら最後に画面下部「Save Changes」で設定を保存します。
こちらの設定を入れることで
`{Issue番号(任意の数字)}-{任意の半角英数字およびハイフン・アンダースコア}`
以外のブランチ名ではリモートへのPush(ブランチ作成)が出来ないようになります。

### 実動作例

こちらの設定を入れたうえでローカルからリモートへ規則に従っていないブランチをPushしようとしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192099/be2b5be9-7f6e-42db-b94c-2091a90efe37.png)

`#123-xxx` というブランチのPushを試みたところ
```bash
 ! [remote rejected] #123-xxx -> #123-xxx (push declined due to repository rule violations)
```
とルールによりPush出来なかったことが表示されています。

また割愛しますが、冒頭少し紹介したGitHubのIssue上からブランチを作ろうとしたときも
同様にルールを守っていない場合きちんとエラーになります。

## おわりに
いかがだったでしょうか。
ブランチ名は人間のマニュアル運用でどうにかなることが大半かもしれませんが
機械的に防げるものは防ぎましょう！ということで参考になれば幸いです。
【Python × Excel】複数の.xlsxファイルを結合してCSV出力するツールを作ってみた

# はじめに
複数のExcelファイルから、特定の列だけを抽出して1つのCSVにまとめるPythonスクリプトを作成しました。  
日付順に並べたり、金額に桁区切りを入れたりする工夫もしています。

# 使用技術
- Python 3.x
- pandas
- openpyxl

# やりたかったこと
- 毎月届くExcelファイル（同じ形式）を自動でまとめたい
- 特定の列（例：日付・名前・金額）だけ取り出したい
- 最後にCSV形式で出力したい

# 実装したコード

```python
import pandas as pd
import os

# 入力フォルダと出力ファイルの指定
INPUT_FOLDER = "input_excel"
OUTPUT_FILE = "output.csv"

# 抽出したい列のインデックス（0から始まる）
# 例：A列 = 0, C列 = 2, F列 = 5
COLUMNS_TO_EXTRACT = [0, 2, 5]
COLUMN_NAMES = ["日付", "名前", "金額"]

# 結果を入れるリスト
all_data = []

# フォルダ内のExcelファイルをすべて処理
for filename in os.listdir(INPUT_FOLDER):
    if filename.endswith(".xlsx"):
        file_path = os.path.join(INPUT_FOLDER, filename)

        try:
            # Excelファイルを読み込む（最初のシート）
            df = pd.read_excel(file_path, sheet_name=0, engine="openpyxl")

            # 指定列だけ取り出し
            extracted = df.iloc[:, COLUMNS_TO_EXTRACT]
            extracted.columns = COLUMN_NAMES

            # 元ファイル名を列に追加
            extracted["元ファイル"] = filename

            all_data.append(extracted)
        except Exception as e:
            print(f"[エラー] {filename} の読み込み中に問題が発生しました: {e}")

# 全部まとめて1つのDataFrameに
if all_data:
    combined_df = pd.concat(all_data, ignore_index=True)

    # "日付"列のフォーマットを変更する
    combined_df["日付"] = pd.to_datetime(combined_df["日付"], errors="coerce").dt.strftime("%Y/%m/%d")

    # "日付"順に並べ替える
    combined_df = combined_df.sort_values(by="日付", ascending=True)

    # "金額"列に桁区切りを追加
    combined_df["金額"] = combined_df["金額"].apply(lambda x: "{:,.0f}".format(x))

    # 出力CSVとして保存
    combined_df.to_csv(OUTPUT_FILE, index=False, encoding="utf-8-sig")
    print(f"[成功] {OUTPUT_FILE} を出力しました。")
else:
    print("[注意] 対象となるファイルがありませんでした。")
```

# 工夫した点
- 日付を「2024/02/01」のように見やすく整形
- 金額に桁区切り（カンマ）を入れて視認性アップ
- エラーハンドリングも最低限追加

# まとめ

pandasはデータの整形にとても便利です。
日々の作業効率化にこうした小さなツールを作っていきたいと思います。
Set Up the Service Consoleを実際にやってみた


+ [Set Up the Service Console : エラーのまとめ](https://qiita.com/Keiji_otsubo/items/ec01e43121bd7077806c)

https://trailhead.salesforce.com/content/learn/projects/set-up-the-service-console?trail_id=explore-core-salesforce-administrative-responsibilities



よく見たら、まだ実施してなかったですね。
Extended User Access and Restriction Superbadge Unit のDev 環境で試してみます。

# Set Up the Lightning Service Console

何もしないで、検証ボタンを実行

:::note alert
We can't find the user named 'Ada Balewa'.
:::


:::note alert
Verify that there is a new lightning app called Ursa Major Solar Service Console.
:::


# Customize Your Lightning Service Console Pages

何もしないで、検証ボタンを実行

:::note alert
We could not find an active record page on the Case object with the name 'Case Console Record Page'.
:::


# Add the Softphone Utility to Your App

何もしないで、検証ボタンを実行

:::note alert
Verify that you and Ada Balewa have been added as call center users.
:::


# Set Up Web Chats for Your Console

何もしないで、検証ボタンを実行

:::note alert
Verify that Live Agent is enabled.
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2baa789d-a413-41ca-afed-d8cf9af786fd.png)

あれぇ、無いな

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/beaeb6c5-e369-4671-ac74-026b0b07ee1e.png)

そういえば普通の設定からだったような...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/80631b41-940a-4fce-96fe-544ace1692c8.png)


これって、どこ？オブジェクトの詳細ページの編集開いても何もないよ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7c67f5ba-33f3-4904-bec4-ff5ba302a949.png)

もしかして、これ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a268c283-c82d-42c6-9aef-6cbbfb542eae.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c20c6443-c91d-4f95-adfa-e356c75d79ec.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/69835e20-5796-4adc-a29f-2aebdcce9d97.png)

ちゃんと動いたみたいだけど、無にが起こったか分からん

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3148a5e8-5bc7-45fb-b640-c7a592942d90.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d1b64f79-020c-4f94-9074-67429793cc9d.png)

あああ、Caseが出来ている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79d46fa8-f178-411a-b530-eaeaa3749fe6.png)
SupabaseのEdge FunctionでDenoの型エラーが出る問題について解決しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/8b7ea3ee-2342-460e-8f7f-74727c0777cc.png)

Edge Functionの import 文で下記のようなエラーが出ます。

```
Cannot find module 'https://deno.land/std/http/server.ts' or its corresponding type declarations.
```

CursorのAIに聞いてもあんまり解決しなくて、「実行には問題ない」とか言われて無視していたのですが気になって調べてみたところちゃんと公式に解決策が載っていました。

https://supabase.com/docs/guides/functions/local-development

VSCodeのsettingsに import_map を参照するように指定すればよいとのことです。

```json:.vscode/settings.json
{
    "deno.importMap": "./supabase/functions/import_map.json",
    "deno.enablePaths": [
        "./supabase/functions"
    ]
}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/9f7e21db-9da2-48e5-9454-5c872a7655be.png)

実際にエラーが出なくなりました。AIに頼りすぎると公式情報拾えなくて、ちゃんと公式読むことも大事ですね！
[Delphi][小ネタ] キーコードの送出

# キーコードの送出

たまにキーコードを送出してくなりますよね！
[RPA](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%9C%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%BB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) の仕組みを作っている時とか！

と、思ったら 2024 アドベントカレンダー 10日の @mammam103103 さんの記事「[タッチキーボードを作成する](https://mam-mam.net/delphi/vcl_touch_keyboard.html)」と完全に被っていたため、アドベントカレンダーからは除外…


## 方法

仮想キーコードを送出する [SendInput API](https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-sendinput) があるので、これを使えば簡単です。

:::note info
古くは [keybd_event API](https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-keybd_event) を使っていたのですが、今は SendInput API を使うのが推奨されています。
SendInput を使うと、キーボード、マウス、ハードウェア入力、を送出できます。
しかも、キーボードとマウスを混在させることも可能です（例えば Ctrl + Click などが実現できます）。
:::

## キーコードの送出にはコンソールが邪魔

キーコードを送出するアプリをコンソールアプリとして作ってしまうと、送出したキーがコンソールに入力されてしまうので、コンソールが表示されないようにしなければなりません。

そこで、[以前の記事](https://qiita.com/pik/items/32152584a0b4db84dcf4)の内容を使ってコンソールが表示されないコンソールっぽいアプリとして実装します。

また、GUI アプリの場合は、自身がフォーカスを取ると入力が自分に入ってしまうので、[以前の記事](https://qiita.com/pik/items/71142d607937bc713af2)を参考にフォーカスを取らないようにします。

# 実装例

下記は Ctrl + ESC を送出するコードです。
dwFlags に KEYEVENTF_KEYUP を指定すると、キーのアップを示します。
これを指定し忘れるとずっと Control と ESC が押された状態になって色々大変なことになります（なった）。

```delphi
begin
  var Inputs: array [0.. 3] of TInput;
  ZeroMemory(@Inputs, SizeOf(Inputs));

  // Control + ESC の Down
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_CONTROL;
  Inputs[0].ki.dwFlags := 0;

  Inputs[1].Itype := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := VK_ESCAPE;
  Inputs[1].ki.dwFlags := 0;

  // Control + ESC の Up
  Inputs[2].Itype := INPUT_KEYBOARD;
  Inputs[2].ki.wVk := VK_ESCAPE;
  Inputs[2].ki.dwFlags := KEYEVENTF_KEYUP;

  Inputs[3].Itype := INPUT_KEYBOARD;
  Inputs[3].ki.wVk := VK_CONTROL;
  Inputs[3].ki.dwFlags := KEYEVENTF_KEYUP;

  SendInput(Length(Inputs), @Inputs, SizeOf(TInput));
end.
```

# まとめ
keybd_event を使おうと思ったら新しい API があったので紹介しました。
新しいといっても Windows 2000 からあるので…全然新しくなかった！
【Linux】プロセス・ファイルシステム・パーミッションを一気に理解するための整理メモ

## はじめに
「プロセスとは？」「ファイルのアクセスとは？」「パーミッションって何？」といった疑問にぶつかることが割と多いため、この記事では、それらを一度に理解できるように整理する。

---

## プロセスとは？

> プロセス = 実行中のプログラム
> 

例：

- `php`（Webアプリの実行）
- `nginx`（Webサーバー）
- `git`（バージョン管理）
- `/bin/bash`（シェル）

これらはすべて**プロセスとしてOS上で動作している存在**。

---

## プロセスは独立したメモリ空間を持っている

それぞれのプロセスは**独立したメモリ空間**を持っている。

他のプロセスのメモリには**直接アクセスできない**。

---

## でも、同じファイルシステムにはアクセスできる

```
[phpプロセス]  →  /var/www/myproject/index.php
[gitプロセス]  →  /var/www/myproject/.git
```

理由は、

カーネルが1つのファイルシステムを管理していて、すべてのプロセスがそのカーネルに**仲介してもらって**アクセスしている。

だから、**全プロセスが同じファイルシステム空間を共有できる。**

---

## ファイル操作とファイルディスクリプタの仕組み

1. プロセスがファイルを開くと、ファイルディスクリプタテーブル（FDテーブル）に登録される
2. そのテーブルは**OSのオープンファイルテーブル**を参照している

つまり：

> どのプロセスが、どのファイルを使っているかは、オープンファイルテーブルで管理されている
> 

---

## プロセス間通信（IPC）が必要になる場面

プロセスが**ファイルではなく、データそのものを直接やりとりしたいとき**はどうする？

→ そこで登場するのが **パイプ + fork()**

```c
int pipefd[2];
pipe(pipefd);
pid_t pid = fork();
```

こうすることで、**親子プロセスが同じオープンファイルテーブルのエントリを共有し、pipeを通じてデータ通信が可能になる**。

---

## プロセスとデータ（ファイルや通信）を分けて考える

- **プロセス = 実行されるもの（動く主体）**
- **データ = ファイルやメモリ、パイプでやりとりされるもの（扱う対象）**

この2つを混ぜずに、**切り分けて考えることがシステムを理解するカギ**だと最近感じる。

---

## ファイルのパーミッションの話

```bash
-rw-r--r-- 1 ubuntu ubuntu index.php
```

ファイルには：

- 所有者（user）
- グループ（group）
- その他のユーザー（others）

という3つの区分があり、それぞれに**読み取り(r)、書き込み(w)、実行(x)** のパーミッションが設定される。

### 所有者とグループはどう決まる？

- **そのファイルを作成したユーザー**が所有者になる
- 作成時に所属していたグループがグループになる

### 所有者以外がアクセスするには？

→ パーミッションで許可されていないとアクセスできない
ディープリサーチでメディアサイト約300件のリストを作ってみた

# ディープリサーチはサイトリスト作成にも使える

いわゆるニュース形式のメディアサイトについて横断的な調査をしたいと思い、ディープリサーチを使ってどこまでリスト作りをできるか試してみました。

話題のGensparkスーパーエージェントと、Gemini DeepResearchを使ってみました。

- Genspark 259件
- Gemini Deep Research 312件

結果は大満足。昔ならこういう作業は半ベソかきながら頑張ったものです。

出てきたリストをスプレッドシートで共有します。生成元ごとにタブを分けています。

https://docs.google.com/spreadsheets/d/1rlaKW8LZuj55S4Zry1flWxNFyLDMyHCvp2v1vZS0hJo/edit?usp=sharing

あくまでAIが生成したリストです。

- URLについて詳細には確認していません
- 選定の明確な基準はありません

以前、ChatGPT 4oで似たような試行をしたことがあるんですが、URLが微妙に違うハルシネーションが多かったです。ディープリサーチならだいぶ品質は高いと思われます。

# 手順

一応、手順も説明します。
もっといいやり方もあると思うので、見つけたプラクティスはぜひ共有ください。

## 系統をリストアップする

こういうのは既知の例をガイドとして提示すると連想が進むと思い、まずはChatGPTでメディアサイトの系統をリストアップしました。

```text
日本国内のニュースサイト、メディアサイトを集めたいと考えていますが、数が多いのでジャンルに分けて調べていきたいです。
- 新聞系https://gemini.google/overview/deep-research/?hl=ja
- 雑誌系
- ネットニュース系
- 企業オウンドメディア
などの分類があると思いますが、他にも系統が考えられますか？
```

以下の回答が得られました。

```text
以下のような分類も加えることで、より包括的に整理ができると思います。

基本的な分類例
既に挙げられた分類は次のとおりです。
- 新聞系（朝日新聞、読売新聞、日経新聞など）
- 雑誌系（週刊誌、月刊誌、ファッション誌など）
- ネットニュース系（Yahoo!ニュース、SmartNews、NewsPicksなど）
- 企業オウンドメディア（トヨタイムズ、サイボウズ式など）

追加で考えられる分類例
①テレビ・ラジオ系
NHK NEWS WEB、日テレNEWS、TBS NEWS DIG、J-WAVE NEWSなど

②通信社系
共同通信、時事通信など

③地域・地方メディア系
ローカル新聞や地域ポータルサイト（北海道新聞、沖縄タイムス、神戸新聞など）

④経済・金融専門系
日経ビジネス、東洋経済オンライン、ダイヤモンド・オンラインなど

...(中略)

㉙行政・公共機関系
政府広報オンライン、官公庁や自治体のニュース発信ページ、警察庁や消防庁など行政の公式情報発信メディア

㉚オルタナティブ・独立系メディア（非主流派系）
IWJ（Independent Web Journal）、デモクラシータイムス、OurPlanet-TVなど、既存メディアとは異なる視点を持つ独立系メディア
```

1回目の回答が10件程度だったので、「もっとありますか？」とおかわりしてます。

これだけで「はぁ、そんなメディアサイトもあったのか…」と感心しました。

## ディープリサーチに依頼する

あとはディープリサーチに依頼します。

```text
日本向けに提供されている比較的著名なメディアサイトをできるだけ多く集めたいです。
最終的には、TSV形式
ジャンル\tサイト名\tURL
でリストが欲しいです。

例
全国紙\t朝日新聞デジタル\thttps://www.asahi.com/

下調べしたサイトはこちらです。以下に上げたサイト以外にも集めてください。

---
既に挙げられた分類は次のとおりです。
- 新聞系（朝日新聞、読売新聞、日経新聞など）
- 雑誌系（週刊誌、月刊誌、ファッション誌など）
- ネットニュース系（Yahoo!ニュース、SmartNews、NewsPicksなど）
- 企業オウンドメディア（トヨタイムズ、サイボウズ式など）

追加で考えられる分類例
①テレビ・ラジオ系
NHK NEWS WEB、日テレNEWS、TBS NEWS DIG、J-WAVE NEWSなど

②通信社系
共同通信、時事通信など

...(以下略)
```

そうして得られたのが冒頭のリストです。
KubernetesのDeployment strategy

Deployment strategy（デプロイ戦略）は、新しいバージョンのアプリケーションを本番環境にリリースする際に、ダウンタイムを最小限に抑え、リスクを軽減するための様々な手法です。Kubernetesなどのコンテナオーケストレーションツールでは、これらの戦略を簡単に実装できます。

以下に代表的なDeployment strategyとその使い方を説明します。
## 1. Rolling Update (ローリングアップデート)

- 概要: 最も一般的な戦略です。古いバージョンのPodを徐々に新しいバージョンに置き換えていきます。一度に置き換えるPodの数や、新しいPodが利用可能になるまでの待機時間を設定できます。
- メリット:
ダウンタイムを最小限に抑えられる。
問題が発生した場合、ロールバックが容易。
- デメリット:
  - 新旧バージョンが一時的に共存するため、互換性の問題が発生する可能性がある。
  - デプロイに時間がかかる場合がある。
- 使い方 (Kubernetes):
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1  # 最大で何個のPodを余分に作成するか (例: 1個)
      maxUnavailable: 1 # 最大で何個のPodが利用不可になるか (例: 1個)
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v2  # 新しいイメージバージョン
```
maxSurgeとmaxUnavailableを調整することで、デプロイの速度と可用性のバランスを調整できます。
- rollingUpdate パラメータ:
  - maxSurge: 更新プロセス中に作成できる、期待されるレプリカ数を超える Pod の最大数を指定します。 絶対値（例：2）またはパーセンテージ（例：25%）を指定できます。 パーセンテージは、期待されるレプリカ数に基づいて計算されます。 デフォルト値は 25% です。
  - maxUnavailable: 更新プロセス中に許可される、最大数の利用不可 Pod を指定します。 絶対値（例：1）またはパーセンテージ（例：25%）を指定できます。 パーセンテージは、期待されるレプリカ数に基づいて計算されます。 デフォルト値は 25% です。
- 適用可能なシナリオ:
  - 高い可用性が求められるアプリケーション。
  - ほとんどのアプリケーションの更新。
  - 新しいバージョンが古いバージョンと互換性がある場合。
- RollingUpdate ストラテジーの詳細な説明:
たとえば、replicas が 3 に設定され、maxSurge が 1 に設定され、maxUnavailable が 0 に設定されている Deployment があるとします。 更新プロセスは次のようになります。
1.Kubernetes は、最初に新しい Pod を作成します（maxSurge が 1 であるため、期待されるレプリカ数を超える 1 つの Pod が許可されます）。 現在、合計 4 つの Pod が実行されています（3 つの古い Pod と 1 つの新しい Pod）。
2.新しい Pod が準備完了になり、リクエストの処理を開始すると、Kubernetes は古い Pod を 1 つ削除します（maxUnavailable が 0 であるため、利用不可の Pod は許可されません）。 現在、合計 3 つの Pod が実行されています（2 つの古い Pod と 1 つの新しい Pod）。
3.Kubernetes は、すべての古い Pod が新しい Pod に置き換えられるまで、この方法でローリング更新を続行します。
## 2. Recreate (リクリエイト)
- 概要: 古いバージョンのPodをすべて停止してから、新しいバージョンのPodを作成します。
- メリット:
新旧バージョンが同時に存在しないため、互換性の問題を回避できる。
設定が簡単。
- デメリット:
ダウンタイムが発生する。
- 使い方 (Kubernetes):
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v2  # 新しいイメージバージョン
```
## ストラテジーの選択に関する推奨事項:
- デフォルトで RollingUpdate を選択: ほとんどのアプリケーションでは、RollingUpdate ストラテジーが最適な選択肢です。これは、可用性への影響を最小限に抑えるためです。
- Recreate ストラテジーを検討: 短いダウンタイムが許容される場合、または古い状態を完全にクリアする必要がある場合にのみ、Recreate ストラテジーの使用を検討する必要があります。
- rollingUpdate パラメータの調整: アプリケーションの可用性の要件と更新速度の要件に基づいて、maxSurge および maxUnavailable パラメータを調整します。 たとえば、より高速な更新が必要な場合は、maxSurge の値を大きくすることができます。 より高い可用性が必要な場合は、maxUnavailable の値を小さくすることができます。
Github Copilot

Windows11のデスクトップにGithub Copilotのショートカットを作ります（それだけ）

```powershell
# GitHub Copilotショートカット作成スクリプト
# デスクトップにGitHub Copilotサイトへのショートカットを作成します

# デスクトップのパスを取得
$desktop = [Environment]::GetFolderPath("Desktop")
$shortcutPath = "$desktop\GitHub Copilot.lnk"

# アイコンファイルのパス - このパスは実際のアイコンファイルの場所に変更してください
# 例: $iconPath = "C:\Path\To\GithubCopilot.ico"
$iconPath = "$env:USERPROFILE\Pictures\GithubCopilot.ico"

# アイコンファイルが存在するか確認
if (-not (Test-Path $iconPath)) {
    Write-Host "警告: 指定したアイコンファイルが見つかりません。デフォルトのアイコンを使用します。"
    # デフォルトのWebアイコンを使用
    $iconPath = "%SystemRoot%\System32\SHELL32.dll,14"
}

Write-Host "GitHub Copilotショートカットを作成しています..."

# WScript.Shellオブジェクトを作成
$shell = New-Object -ComObject WScript.Shell

# ショートカットオブジェクトを作成
$shortcut = $shell.CreateShortcut($shortcutPath)

# ショートカットのプロパティを設定
$shortcut.TargetPath = "https://github.com/copilot"
$shortcut.Description = "GitHub Copilot"
$shortcut.IconLocation = $iconPath

# ショートカットを保存
$shortcut.Save()

Write-Host "GitHub Copilotショートカットがデスクトップに作成されました。"
```
【Hyper-V】Windows11 の Hyper-V 機能を有効化してみた

## はじめに
社内で Linux 環境を構築したくて、Windows11 の端末で Hyper-V 有効化した時のおはなし。
この記事では Hyper-V を有効化するところまでを説明します。

## Hyper-V を有効化した端末
端末は DELL のノートPC Vostro 14 を使用します。
OS と スペック は以下の通り。
|項目|スペック|
|----|----|
|OS|Windows11 Pro 23H2|
|CPU|インテル Core i7 - 1355U (10 Core) 1700 Mhz|
|Memory|16 GB|
|DISK (SSD)|512 GB| 

## 注意事項
Windows11 で Hyper-Vを有効化するには、事前に BIOS で「仮想化機能」を有効にしておく必要があります。

DELL のノートPC Vostro 14 の場合、下記の手順となります。

1．端末の電源投入後、DELLのロゴマークが表示されたら、F2 キーを数回押します
2．BIOSの設定画面に入り、Virtualization Support に入り、下記2つを ON に変更します
&ensp;&emsp;Enable Intel🄬 Virtualization Technology (VT)
&ensp;&emsp;Enable Intel🄬 VT for Direct I/O
3．設定を保存して、再起動します

## Hyper-V の有効化
1．Windowsボタン右横の検索窓に「コントロールパネル」と入力し、検索結果からコントロール パネルを開きます
![1.Run_ControlPanel2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/a25dbb8a-8096-4eac-a16b-a451bd757433.jpeg)


2．コントロールパネルが表示されたら、「プログラム」をクリックします
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/ef5ed388-90e5-463d-8d36-57651cdba6bc.jpeg)

3．プログラムが表示されたら、「Windows の機能の有効化または無効化」をクリックします
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/9182427c-ab63-489b-937f-9c9dfc456eaf.jpeg)

4．Windowsの機能が表示されたら、「Hyper-V」の項目を探して、左隣のチェックボックスをオンにして、「OK」ボタンをクリックします
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/18fc5f55-2574-4d9d-9b32-94f1c3d6575e.jpeg)

5．インストールが始まりますので、終了するまで待ちます
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/715ac3b0-cca3-48e5-b8f2-f93574fa6e7b.jpeg)

6．終了すると再起動が求められるので、「今すぐ再起動(N)」をクリックします
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/cf658674-e8ee-4a7d-840e-5adc7841adc6.jpeg)

## Hyper-V マネージャ
1．Windowsボタン右横の検索窓に「Hyper-V」と入力します
&ensp;&emsp;「Hyper-V マネージャ」と「Hyper-V クイック作成」の2つが検索結果に表示されるので、「Hyper-V マネージャ」を起動する
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050162/3683b93f-1c08-4b6f-bbaf-4f61f137d9f3.jpeg)


## まとめ
Windows11 Proの端末で Hyper-V を有効化する手順をまとめました！！
仮想マシンの構築については、別の記事で説明します。

## 参考文献
[Dell製システムでハードウェア仮想化を有効または無効にする](https://www.dell.com/support/kbdoc/ja-jp/000195978/dell%E8%A3%BD%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A7%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E4%BB%AE%E6%83%B3%E5%8C%96%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%BE%E3%81%9F%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
[Windows で仮想化を有効にする](https://support.microsoft.com/ja-jp/windows/windows-%E3%81%A7%E4%BB%AE%E6%83%B3%E5%8C%96%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-c5578302-6e43-4b4b-a449-8ced115f58e1)
Db2 for i のデータ型

今更ですが改めて調べる機会がありまして。

## Db2 for i (IBM i) 7.6のデータ型

[マニュアルはこちら](https://www.ibm.com/docs/ja/i/7.6.0?topic=elements-data-types)
下記はシステム提供のデータ型で、別なユーザー定義データ型も使用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5e2b632b-b9f2-48cc-a099-b965efdfee42.png)

[具体的なカラムの属性などはこちら CREATE TABLE](https://www.ibm.com/docs/ja/i/7.6.0?topic=statements-create-table)

### 代表的なところのまとめ

昔、MATSUIさんが作成された資料が出てきたので貼らせて頂きますm(_ _)m
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/139d2869-aaad-44c7-bcc9-7ff538f019ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7b95afbd-88fb-4a28-81d2-6e66f64edb25.png)


適時更新します。
Git の git commit --fixup=amend について

## はじめに

Git の `git commit --fixup` コマンドを使っているときに、コミットメッセージの変更も一緒にできないかなと思って調べたら、ちょうど求めていた機能があったので、その紹介です。

## --fixup について

`git commit --fixup=<commit>` は、指定されたコミットのコミットメッセージに接頭辞 `fixup!`を付けたコミットを作成するコマンドです。
これと `git rebase --autosquash` を併用することで、fixup で指定したコミットともう一方のコミットを合体することができます。
このとき、コミットメッセージは指定されたコミットのコミットメッセージと同じものになります。

詳しくは `git commit --fixup` で調べてください。

## --fixup=amend について

コミットメッセージを変更したいときは `git commit --amend` や `git rebase -i` をして reword を行う、といったやり方等で対処すると思います。

さて、先頭以外のコミットの変更をした上で、コミットメッセージの変更も行いたい場合はどうするでしょうか？
やり方は色々あると思いますが、`git commit --fixup=amend:<commit>` を使う選択肢はかなり有用だと思います。

### 使い方

例として、以下のような状況を考えます。

```console
$ git log --oneline
2e12dad (HEAD -> main) third commit
658d8d5 second commmit
616a75c first commit
```

ここで `second commmit` の内容とコミットメッセージの typo を修正したいと仮定します。
そのような場合、まずファイルの修正を行い、コミットをする際に以下のようなオプションを付けてコマンドを実行します。

```console
$ git commit --fixup=amend:HEAD^
```

コマンドを実行するとエディタが開き、以下のような内容が表示されます。

```sh
amend! second commmit

second commmit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
```

ここで、コミットメッセージの description 部分である、3行目の `second commmit` の文字列を修正して、正しいコミットメッセージにして保存します。

```diff_shell
amend! second commmit

- second commmit
+ second commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
```

そうすると、コミットログは以下のようになっているはずです。

```console
$ git log --oneline
356604f (HEAD -> main) amend! second commmit
2e12dad third commit
658d8d5 second commmit
616a75c first commit
```

修正したいコミットメッセージに接頭辞 `amend!` の付いたコミットが追加されています。

この状態で `git rebase --autosquash` を実行します。

```
pick 658d8d5 second commmit
fixup -C 356604f amend! second commmit
pick 2e12dad third commit
```

上記は `git rebase -i --autosquash HEAD~3` の結果ですが、`amend!` となっている部分が fixup として扱われているのが分かります。

実行後にコミットログを見ると、

```console
$ git log --oneline
de5391c (HEAD -> main) third commit
cd852b0 second commit
616a75c first commit
```

となっており、コミットメッセージの変更もできていることが分かります。
勿論、fixup と同様にファイルの内容の変更もできています。

## 終わりに

この記事では `git commit --fixup=amend:<commit>` について紹介をしました。
他にも `git commit --fixup=reword:<commit>` という類似のオプションもあり、これはコミットメッセージの変更だけを行うオプションです。

Git のヘルプを見ると、知らなかった便利なオプションを見つけられることもあると思うので、軽く見てみると面白いかもしれません。
初級インフラエンジニア必見！LPICレベル1＆CCNA合格記 🎉

こんにちは！インフラエンジニア2年目のコダックです。
今回はインフラエンジニアとして最初の一歩を踏み出すのにピッタリな資格、**LPIC レベル1**と**CCNA**の合格体験談をお届けします！

結論から言うと、資格いらないって言われがちなエンジニア界隈ですが、**インフラエンジニアに限っては資格があるとめちゃくちゃ有利になります🔥**

# 使った教材たち 🧑‍💻

#### LPIC レベル1（2024年4月合格）

学習期間：約1か月

教材：

・ping-t (101のみ無料)

・[徹底攻略 LPIC レベル1教科書＆問題集［Version 5.0］対応](https://amzn.to/3G0Qxq5)

とにかく最初の資格としてはこれ！
Linuxの基礎をしっかり押さえられるから、サーバーの扱いが怖くなくなるし、実務でも「これ勉強したやつだ！」ってなる場面が多いです😎

#### CCNA（2024年6月合格）

・学習期間：約2か月

・教材：

[徹底攻略Cisco CCNA問題集[200-301 CCNA]対応](https://amzn.to/3E4a5cv)

ネットワークエンジニアを目指すならこれ！
IPアドレスの計算とかルーティングの基礎が身につくので、インフラエンジニアとしての総合力がぐっと上がります✨

# 資格を取るメリット ✅

よく「エンジニアに資格はいらない！」って声を聞きますよね。でもインフラエンジニアに関しては、**資格があるだけである程度信用度がアップします！**

面接や社内のキャリアアップでも「CCNA持ってるんですね」「LPICもあるんですね！」ってちゃんと見てもらえるんです🌟

実際、LPIC・CCNAの勉強を通じてサーバーとネットワークの基礎が身についたことで、仕事でも自信を持って対応できるようになりました！

# 勉強してよかったこと 📚

**・実務での理解度が段違い！**

・トラブルシューティングのスピードがUP！

・自己学習のクセがついて今後の学びにも自信がつく

そして何より、資格を取ったことで「自分でもできるじゃん！」という成功体験になりました👏

# まとめ

インフラエンジニアとしてキャリアを積み上げたいなら、**LPICとCCNAは間違いなくおすすめです！**

最初の一歩を踏み出すのは勇気がいりますが、確実に力になりますし、次のステップ（AWSやクラウド資格など）にもつながっていきます🚀

これから資格取得を目指す方の参考になれば嬉しいです！

もし質問があれば気軽にコメントくださいね😊 みんなで一緒に成長していきましょう！