OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub CLIとGitHub Actionsワークフロー基礎

この記事では、GitHub CLI (gh) のセットアップ手順と、GitHub Actions のワークフロー構文の基本的な書き方をまとめます。

# 1. GitHub CLI (gh) のセットアップ

**1-1. インストール**

GitHub CLIは、リポジトリの操作やPRの作成・レビューなどをコマンドライン上で行える便利なツールです。各OSごとにインストール手順が異なります。

macOS:
```
brew install gh
```
Ubuntu (Deb系):
```
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh
```
Windows:

GitHub公式のインストーラーでインストール

またはchocolateyを利用して choco install gh でインストール

**1-2. ログイン**

インストール後、下記コマンドでGitHubにログインします。
```
gh auth login
```
対話式のプロンプトでGitHubアカウントの認証を行います。ログインが成功すると、GitHub CLI上でリポジトリ操作やIssue/Pull Requestなどの操作が可能になります。

# 2. GitHub Actionsのワークフロー構文基礎

GitHub Actionsは、GitHub上でCI/CDパイプラインを構築するためのプラットフォームです。リポジトリ内の .github/workflows/ ディレクトリにYAMLファイルを配置することで、さまざまなイベントに応じてスクリプトやジョブを実行できます。

**2-1. 基本の構文**

以下は簡単なワークフローの例です。プルリクエストが作成されたときにテストを実行するものとします。
```
name: Run Tests on Pull Request

on:
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Install Dependencies
        run: npm install
      - name: Run Tests
        run: npm test
```
**name**: ワークフローの名前

**on**: どのイベントでトリガーされるか

ここでは pull_request がトリガーとなり、対象ブランチを main に絞っています

**jobs**: ワークフローの実際の処理

**runs-on** ではジョブが実行される環境を指定

**steps** ではそのジョブ内で実行する具体的なステップを定義

**2-2. onセクションの書き方**

on セクションには、以下のようなトリガーを指定可能です。

・push

・pull_request

・workflow_dispatch (手動トリガー)

・schedule (cron)

・release

・etc.

複数のイベントを指定する場合:
```
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
```
**2-3. 変数の扱い**

GitHub Actions内で独自の変数を利用したいときは、 env: を使って環境変数として定義します。
```
env:
  NODE_ENV: test
```
また、GitHubが用意しているコンテキスト ( GITHUB_REF や GITHUB_SHA など) やSecrets (機密情報) を参照することもできます。
```
steps:
  - name: Print Env
    run: echo "Branch is $GITHUB_REF"
```
**2-4. jobsセクション**

複数のジョブを定義し、それらを並列または依存関係付きで実行できます。
```
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm install
      - run: npm run build

  test:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - uses: actions/checkout@v3
      - run: npm test
```
needs: build のように記述すると、 test ジョブは build ジョブが完了してから実行されます。

# 3. まとめ

GitHub CLI は、GitHubリポジトリの操作をCUIベースで効率化するために活用できます。ローカル環境とGitHub間のやりとり (Issue管理やPull Request作成・レビューなど) がコマンドライン一発で行えるため、大変便利です。

GitHub Actions は、YAMLファイルでイベントやジョブを定義し、CI/CDパイプラインを簡単に実装可能です。基本的な構文と設定方法を押さえておくと、さまざまな開発フローを自動化できます。

これらを組み合わせて、ローカルからPRを作成し、それに対して自動テストやデプロイを実行する流れを組むことができれば、一連の開発サイクルが効率化されます。
個人的備忘録：git stash pop で競合が起きたときの具体的な対処方法についてまとめてみた

## はじめに
Git で `git pull` を実行した際に、ローカルの変更とリモートの変更が競合し、マージができないことがあります。  

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

本記事では **Makefile で発生した競合** を例に、**競合解決の方法** を解説します。

## 書こうと思ったきっかけ
最近、チーム開発中に **Makefile の競合** に遭遇しました。普段はスムーズに `git pull` できていたのに、ある日 `stash pop` をしたところ競合が発生し、手動での解決が必要になりました。  

競合自体はよくあるものですが、**解決の流れを整理しておくことで、今後同じ問題に直面したときにスムーズに対応できる** と思い、記録として残すことにしました。

:::note info
Git を使った開発では、**複数のメンバーが同じファイルを編集することが頻繁にあります**。
:::

そのため、競合が発生することは避けられません。しかし、**適切な方法で解決すれば、スムーズに開発を進めることができます**。  

本記事では、**競合が発生した場合の具体的な対処方法** を詳しく説明します。

## **エラーの発生状況**
```sh
 ~/Desktop/test/skill-typing-front  (git)-[develop]-  git stash pop
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
On branch develop
Your branch is up to date with 'origin/develop'.

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
	both modified:   Makefile

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	skill-typing-front/public/mockServiceWorker.js

no changes added to commit (use "git add" and/or "git commit -a")
```
このエラーは、リモートリポジトリの `Makefile` とローカルの `Makefile` に競合があり、自動マージできなかったことを示しています。

競合が発生する原因としては、以下のようなケースが考えられます。

- リモートリポジトリにある `Makefile` が更新されている間に、ローカルでも同じファイルを変更した。
- 他の開発者が `Makefile` に変更を加え、それがリモートに反映された後にローカルで作業をしていた。
- `git stash pop` を実行した際に、リモートの変更とローカルの変更が衝突した。

**このような状況では、手動で修正を行い、競合を解決する必要があります。**

## 実際の解決方法（私の環境）

競合を解決するためには、以下の手順を実行します。

1. **競合の確認**
   ```sh
   git status
   ```
   を実行し、競合しているファイル (`Makefile`) を特定します。

2. **競合の修正**
   `Makefile` を開き、競合マーカー (`<<<<<<<`, `=======`, `>>>>>>>`) を削除して、適切な形で統合します。

3. **変更をステージング**
   ```sh
   git add Makefile
   git commit -m "Resolve conflict in Makefile"
   ```
   競合を解決したら、変更をコミットして保存します。

4. **不要な `stash` の削除**
   競合が発生した場合、`stash` は削除されずに残っているので、不要なら以下を実行します。
   ```sh
   git stash drop
   ```

5. **変更をリモートへプッシュ**
   ```sh
   git push origin develop
   ```
***競合を解決した後は、リモートリポジトリに変更を反映させましょう！***

## まとめ

競合解決は最初は難しく感じるかもしれませんが、慣れてくるとすぐに対応できるようになります。プロジェクトによっては、他のメンバーとのコミュニケーションをとりながら競合を解決することも大切です。

:::note warn
***競合を未然に防ぐために、定期的に `git pull` してリモートの最新状態を取り込みながら作業を進めることをおすすめします。***
:::

また、機能ごとにブランチを分けて開発を進めることで、競合の発生を減らすことも可能です。Git を正しく活用し、スムーズなチーム開発を実現しましょう！
AWSで始めるインフラ構築入門　本　用語集

# はじめに
AWSで始めるインフラ構築入門という本を読んで、学んだ用語を本の構成に従って15章を1章ずつに分けて、分かりやすく記事を作成したいと思います。私が分かりやすいと思った解釈や表現が含まれますので、ご了承ください。

# AWSで始めるインフラ構築入門とは？
一言でお伝えすると本格的なAWS本です！
読破すれば、実践的な知識をもつAWSのインフラ技術者として評価されるみたいです！ぜひ、これを読んでいる皆様にも共有したくリンクを添付させて頂きます。
[AWSで始めるインフラ構築入門](https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwiPiaDc1-CLAxUk5hYFHSV7EGQYABAHGgJ0bA&co=1&gclid=Cj0KCQiA8fW9BhC8ARIsACwHqYptdL8Fos66XPkerqzVRBbPFgu7cfvthAo6bqR8Mp1faikru7RdZYYaAv0AEALw_wcB&ohost=www.google.com&cid=CAESVuD2t0wAHWFBBVJ6eJxw-nFVwLNrFYZghSSPRmXGeeMIMraWBv-k_I8TC1HzIzmqCkhm76bnY1KXBYVEJmS1EneQsYYZscKVsWN_Keq0AOotnzEdif_6&sig=AOD64_37aY2uXVT_6UQmIQxKVZT_2y5EQA&ctype=5&q=&ved=2ahUKEwiXqJrc1-CLAxXJzjQHHfu3MDYQ9aACKAB6BAgEEA8&adurl=)

### 第1章の用語
**サーバー :**
サービスや機能を提供する側のサービス。

**ストレージ :**
データをしまっておく箱のこと。ハードディスク、DVD、USBメモリなど。

**クラウド(クラウドコンピューティング) :**
インターネットなどのネットワークを通じて、サーバーやストレージ、ネットワークなどのコンピュータ資源をサービスとして提供するビジネスの総称。

**AWS :** 
AWS(アマゾンウェブサービス)は、アマゾンウェブサービス社が提供する、世界中で使われているクラウドプラットフォーム。AWSを使用するとITに関する様々なものを構築し運用可能。

**所有(オンプレミス) :**
自社で全て管理する方式。初期に多額のコスト。自分達で運用のため技術者も必要。

**OS(オペレーティングシステム) :**
パソコンさんの人格に相当するソフト。

**ミドルウェア :**
OSとアプリケーションの間に入り、いろいろ雑用するやつ。

**IaaS(Infrastructure as a Service):**
インフラ部分、つまりサーバーやネットワークをサービスとして提供する。構築したサーバー上にOSやミドルウェアを入れたり、ネットワークの設定を行ったりするのはクラウドの利用者の役割。

**PaaS(Platform as a Service) :**
アプリを動作させるために必要なプラットフォーム(Webサーバー、データベースなど)そのものをサービスとして提供する。クラウドの利用者は、そのプラットフォーム上で動作するアプリだけを作成して配備。

**SaaS(Software as a Service) :**
クラウド業者が専用のアプリまで用意。クラウドの利用者はアプリが提供するサービスに対して対価を払うだけで、インフラやミドルウェア、そしてアプリ全てにおいて運用や改善といった作業をクラウド業者に任せることができる。

**ソリューション :**
問題や悩みを解決してくれる技術や製品、ノウハウなどのこと。

**エンタープライズ　:**
「企業」に関する何かな感じの意味、法人用。

**エンタープライズアプリ :**
サーバー、データベース、ネットワーク機器などを組み合わせて作られた、1つの大きなシステム。会社内で使われる業務システムのほか、LAMP(Linux、Apache、MySQL、PHP)など比較的古い技術で作られたWebアプリなどが当てはまる。

**サーバーレスアプリ :**
アプリを動作させるインフラをAWSの機能で全て管理する仕組み。

### AWSで提供するその他のソリューション
**分析とデータライク :**
インフラ管理に伴う大量のデータを効率よく安全に分析するための環境を提供。

**IoT :**
センサーなどの小さな機械を使ったシステム。

**ストレージ :**
写真や動画などを保存する場所を提供。

**ゲーム開発 :**
ゲームの開発から運用までをフルセットでサポート。
AWS - CloudWatch Agent で EC2インスタンスのログファイルをCloudWatch Logs に送信する (2025年)

# ロール・ポリシーの設定をする

`CloudWatchAgentServerPolicy ` ポリシーをEC2のロールにアタッチする

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html#create-iam-roles-for-cloudwatch-agent-roles


# EC2サーバーにSSH接続する

手順は割愛

## root ユーザーになる

ここでルートユーザーになっておく

```
sudo su -
```


## Agentのインストール

```
yum install amazon-cloudwatch-agent
```

## 設定ファイルの作成

てきとうにJSON設定ファイルを作成しておく

`vim /opt/aws/amazon-cloudwatch-agent/bin/config.json`

```json
{
  "agent": {
    "metrics_collection_interval": 10,
    "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/test.log",
            "log_group_name": "test_log_group",
            "log_stream_name": "test_log_stream",
            "timezone": "Local"
          }
        ]
      }
    }
  }
}
```

参考: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html

#   コマンド

## 設定ファイルの反映 & 起動

`-s` フラグを付けて実行することで、設定反映・起動・再起動を全てやってくれるようだ

```
amazon-cloudwatch-agent-ctl -a fetch-config -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
```

## 停止

```
amazon-cloudwatch-agent-ctl -a stop
```

## 起動

```
amazon-cloudwatch-agent-ctl -a start
```

## ステータス確認

```
sudo amazon-cloudwatch-agent-ctl -a status
```

# Agent のログ

このあたりにログがある

```
cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
```

```
cat /opt/aws/amazon-cloudwatch-agent/logs/configuration-validation.log
```

# 動作確認

てきとうにテキストファイルに追記する

```
echo "XXX" >> /opt/aws/amazon-cloudwatch-agent/logs/test.log
```



Cloud Watch のロググループ・ログストリーム・ログが生成されていれば成功
(AWS マネージメントコンソールで 確認するなどする)


# リファレンス

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
キャッシュクリアを簡単に行う方法（コピペで解消）

以下のように、コピペでキャッシュクリアを実行する手順を分かりやすく説明しました。

キャッシュクリアを簡単に行う方法（コピペで解消）

Microsoft Office や OneDrive、Teams、Outlook などのキャッシュを削除することで、不具合の解消や動作の改善が期待できます。以下の手順で、簡単にキャッシュクリアを実行できます。

手順
	1.	メモ帳を開く
	•	Windowsキー＋Rを押して「notepad」と入力し、Enter を押します。
	2.	下記のスクリプトをコピーする
	•	以下のコードを選択し、右クリック → コピー（Ctrl + C） します。
```
#Microsoft Office Account Reset
rmdir /s /q "%localappdata%\Microsoft\Office\16.0\OfficeFileCache"
rmdir /s /q "%localappdata%\Microsoft\Office\15.0\OfficeFileCache"
rmdir /s /q "%localappdata%\Microsoft\Office\14.0\OfficeFileCache"
rmdir /s /q "%localappdata%\Microsoft\Office\Spw"
#OneDrive
rmdir /s /q "%localappdata%\Microsoft\OneDrive\settings"
#Teams
rmdir /s /q "%appdata%\Microsoft\Teams"
#Outlook
rmdir /s /q "%localappdata%\Microsoft\Outlook"
#OneNote
rmdir /s /q "%localappdata%\Microsoft\OneNote\16.0"
#temp
del /s /q "%temp%\*"


```


3.	メモ帳に貼り付ける
	•	メモ帳を開いた状態で、右クリック → 貼り付け（Ctrl + V） します。
4.	「.bat」ファイルとして保存
	•	「ファイル」→「名前を付けて保存」を選択
	•	「ファイルの種類」を「すべてのファイル」に変更
	•	「ファイル名」を「clear_cache.bat」と入力
	•	「保存」をクリック
	5.	作成した「clear_cache.bat」を実行
	•	作成したファイルを右クリックし、「管理者として実行」を選択
	6.	完了！
	•	コマンドプロンプトが開いてキャッシュ削除が実行されます。完了後、パソコンを再起動してください。

この方法なら、コピペだけでキャッシュをクリアできます。
DevcontainerをCLIで起動・アタッチする方法


devcontainerのcliを利用します。

https://github.com/devcontainers/cli


# インストール

nvmでnodejsをインストールする

```bash
# 最新のltsをインストール
nvm install --lts
nvm use --lts

# デフォルトに設定
nvm alias default lts/jod
```


devcontainers/cli をインストール

```bash
# devcontainers/cliをインストール
npm install -g @devcontainers/cli
```

# CLIでdevcontainerをビルド

```bash
# devcontainerのリビルド
# path/to/projectには.devcontainerディレクトリが存在するパスを指定
devcontainer build --workspace-folder path/to/project
```

# CLIでdevcontainerを起動


```bash
# プロジェクトに入ってdevcontainerを起動・アタッチ
# path/to/projectには.devcontainerディレクトリが存在するパスを指定
devcontainer up --workspace-folder path/to/project

# devcontainerにログイン
devcontainer exec --workspace-folder path/to/project /bin/bash
```


# CLIでdevcontainerを削除

```bash
# devcontainerのコンテナIDを特定
docker ps
# CONTAINER ID   IMAGE                                                                                              COMMAND                  CREATED        STATUS       PORTS     NAMES
# 631ee8b210a8   vsc-eks-hybrid-nodes-sample-46d317f27912914a79fc924e8a49d6383bb6fff2dbbe5522cd9eac2ddb239a45-uid   "/bin/sh -c 'echo Co…"   39 hours ago   Up 5 hours             competent_gauss

# コンテナを削除
docker rm -f 631ee8b210a8
```
Pythonのライブラリ依存関係で溺死しかけたのでvenvを覚えた

# はじめに
別に新規性のある話ではない
備忘です

# 雑にpip installしていく→絶望
初心者あるあるですが言われた通りライブラリをいれます、を続けていくと複数のプロジェクトだとか歴史的な問題だとかanacondaいれてたりでライブラリがぐずぐずになります
個人的にはstreamlitにdeployしたときに膨大なrequirements.txtになり、deployに失敗して絶望した

# あなたの今日やるべきこと→venv
```
python -m venv [dir]
cd dir
./bin/activate
```
dirの下に環境をつくってくれるぜ

# how to use
## aliasをつくる

.zshrc (など)
```zsh
alias py=$HOME/venv/bin/python
```
home dir直下にvenvつくった場合。そこは適当に読みかえしてください


## pip installする
```
py -m pip install [hoge]
```
-mつけてやる
別にpipをaliasにしてもいいんだけど


# おためし
```
!py -m pip install langchain-openai memento slack_bolt
[いっぱいインストール]
!py -m pip freeze
aiohappyeyeballs==2.4.6
aiohttp==3.11.13
aiosignal==1.3.2
annotated-types==0.7.0
anyio==4.8.0
attrs==25.1.0
certifi==2025.1.31
charset-normalizer==3.4.1
...
pip3 freeze
packaging==24.2
wheel @ file:///opt/homebrew/Cellar/python%403.13/3.13.2/libexec/wheel-0.45.1-py3-none-any.whl#sha256=b9235939e2096903717cb6bfc132267f8a7e46deb2ec3ef9c5e234ea301795d0
```

かくして環境はわけられた

# まとめ
pythonでも環境はわけられる。もちろん他の言語の環境設計のが良好なのは多いが、それでも環境がわけられるのだからありがたい

# しかし
ここまでやったあげくpipenvだとかryeを知る
ほんとにな
MCIって音の再生が遅れる→自分が悪いだけだった

## おことわり

一体いつの時代の話してるんだよ？　という感じの日記です．

## 話

Win32API で作ってるゲームにちょいと BGM をつけようと思い，`SendMCICommand()` を使ってた大昔のコードを引っ張り出してきて再利用した．

で，まぁ音は出るっちゃ出るんだが， **出るまで数秒（2～3秒くらい?）の遅延が発生する** ．
ゲームの場面が切り替わるたびに数秒の無音時間が発生するという残念無念な有様となったのである．

MCI って，なにやら どっかの時点（WinXP? Win7?）で遅延が大きくなって，そのあたりの時代でコレを使ってたフリーゲームとかがわりと残念なことになっていた記憶があったので，「ひどい有様なのは MCI だから仕方ないね」とか脳死で思ってたんだけど，ちゃんと調べてみると，実は自分の使い方に結構な問題があったという話．

### 遅延の原因

引っ張り出してきて中身もろくに検めずに使っていたコードを確認してみると，BGMを切り替える処理が毎回

1. 現在のBGMの再生を止める： `MCI_STOP`
2. 現在のBGMデータを捨てる(?)： `MCI_CLOSE`
3. 新しいBGMファイルを開く： `MCI_OPEN`
4. 開いたBGMを再生： `MCI_PLAY`

というのをやっていた．
要は，単一のBGMデータのみを管理している形の実装になっていて，毎回実施される `MCI_OPEN` が数秒要していたのである．
つまり，「再生」に時間がかかってたわけじゃないのだ．

### 改善

これ，よくよくリファレンス読んでみると，**普通に複数個のBGMファイルを `MCI_OPEN` しておける** んじゃん！　っていう．
`MCI_OPEN` する毎にちゃんと異なる `MCIDEVICEID` 値を返してくれることになってる．

なので，

* いちいち既存を `MCI_CLOSE` しない：
  `MCI_OPEN` したやつは最後（APP終了時あたり）でまとめて `MCI_CLOSE` すればよい

という形にして，BGM切替はふつーに

1. 現在のBGMを止める `MCI_STOP`
2. 再生したいBGMを再生 `MCI_PLAY`

で済むのね．
（切り替えた際に先頭から再生して欲しいなら `MCI_SEEK` も必要だが）
これでBGMの切り替わり具合がかなりマシになった．よかった．

あとは，そしたら `MCI_OPEN` はいつやるか？　という話があるが，それは「そのBGMを初めて鳴らすタイミングでやる」とかでもいいかな，と．
これだと当然，ゲーム中に突然２～３秒ほど遅延が発生する形にはなるのだが，「BGM切替毎に毎回」が「BGMごとに１回だけ」に大きく改善されたわけで，許容範囲かなー，と．
（「APP起動時あたりに全BGM分をまとめてやる」とかだと起動に時間かかることになるだろうし，使わん物まで毎回読み込むというのも何か嫌だし．）

### 関係ない話

効果音の方は `PlaySound()` を使っているのだけど，なんかこいつ，Win11になってから遅延が発生するようになった？
しかも遅延具合が一定ではなく 0～1.5 秒くらいでランダムな雰囲気だ．何これ？

`PlaySound()` は [ちょっと前にミニゲーム作ったとき](https://qiita.com/NyancoRitter/items/b1f70251272dba6fc7db) にも使っていて，その時は別PCでWin11じゃなかったのだが，音の再生が遅れるなんてことはなかった．
そのミニゲームを今使っている Win11 な PC に持ってきてみると，やはり音が遅れるのである．

こいつに関しては対処方法が謎．

→　なんか知らないうちに起きなくなった模様？　Windows Update か何かで修正されたのだろうか？
AWS クラウドプラクティショナー(CLF)を１週間で取る


先日の３連休を利用して、AWS クラウドプラクティショナー(CLF)を取得してきました。
所要時間はおよそ１週間。がっつり取り組んだのは三日くらい。

AWSの経験はEC2やS3といった基本的なサービスを少し触ったことがある、という感じでした。
試験まで時間があまりない方向けに、勉強方法をまとめてみます。


## 勉強方法
### ①「AWS Cloud Practitioner Essentials (日本語)」を一通り視聴 
(1日 ~ 1.5日)
https://explore.skillbuilder.aws/learn/courses/1875/aws-cloud-practitioner-essentials-ri-ben-yu/lessons

AWS Skill Builder 公式の教材。
独特なノリのお兄さんたちが分かりやすく解説してくれる。
テンポよく、アニメーションや図解も多用して編集されているため頭に入りやすい。

//追記: AWS Snowmobile はサービス終了とのこと(講義内では登場していた。若干情報古い？)
https://www.publickey1.jp/blog/24/awsaws_snowmobile.html

### ②【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問) で演習

(1~2 日)
https://www.udemy.com/course/aws-4260/

Udemy の問題集。 (udemy セール中の購入推奨)
6回分、1~2が基本編、4~6が本番レベルとのこと。
受けてきた肌感としては本番の難易度は1~2と4~6の中間くらい？
(おそらく若干難しめに作ってあるっぽい)
Udemyのアプリから
演習モードで解説を読みつつ一問一答→テストモードで確認
の流れで学習。
※ ①, ② 通して、疑問点が出てきたらChatGPTなりに聴きつつ概念を整理するとよさげ
ネットワーク、ITの基礎的な知識等は知っている前提なので、理解が曖昧な部分は問答しつつ固めていく 

--- 
基本編は95%くらい解ける状態、本番レベルは８割くらいは解ける状態で本試験へと臨みました。(時間的な都合もあり...)



以上の流れで学習し、本番は8割ちょいで合格でした。
見直し時だと 75%: 15% = 回答に自信あり: 回答に自信なし という感じだったので、概ねスコアは予想通り。


## 感想
AWSについては何となくEC2やらS3やら知ってる程度だったので、各サービスの概要を掴めたのは良かったです。
横文字が多く、書面からのみ理解するのは大変そうなので、①の講義動画はかなり助かりました。丸暗記でもおそらく対応可能ですが、ITの基礎的な知識(基本情報程度?)があった方が理解は深まりそう & 効率よく学べそうかな〜と思います。
OpenCVで動画を読み込みPyQt6に表示してみた(車輪の再開発) その２

# OpenCVで動画を読み込みPyQt6で表示
[OpenCVで動画を読み込みPyQt5/PyQtに表示してみた(車輪の再開発)](https://qiita.com/cartooh/items/7634282999b729f97283) をPyQt6 にしました。

[PyQt6版(github)](https://github.com/cartooh/qt-video-player/tree/PyQt6)

PyQt5->6で定数の定義が変わったけど、その程度。
Github Copilotにやらせたら全部やってくれた。
```bash
uv sync
uv run video-player.py -a <hogehoge.mp4>
```

# PyQt6版をCython化してみた

[PyQt6+Cython版(github)](https://github.com/cartooh/qt-video-player/tree/PyQt6+Cython)

引数省略していたところが怒られたけど、ちょっとの修正で対応できた。
```bash
uv sync
uv run setup.py build_ext --inplace
uv run video-player.py -a <hogehoge.mp4>
```

FullHDだと55FPSぐらいだったのが、
Cythonにすると60FPSまで出たり出なかったり。（繰り返すとなぜか遅くなったり・・・）

FullHD×３倍の動画だと、15FPSから20FPSに。
読み込みと描画パラレルにできればもう少し早くなるかもだけど。。。
[Delphi][小ネタ] コンソールアプリケーションだけど黒い画面開きたくないよ～

# コンソール・アプリケーション

Delphi では、プロジェクトの新規作成で「コンソール アプリケーション」を選ぶとコンソール・アプリケーションが製作できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/8fc603d9-393b-8606-a016-df0aa34921ed.png)

ソースコードは↓になり、コンソール・アプリケーションとして生成すると、[```{$APPTYPE CONSOLE}```](https://docwiki.embarcadero.com/RADStudio/ja/Application_%E3%81%AE%E7%A8%AE%E9%A1%9E%EF%BC%88Delphi%EF%BC%89) というコンパイラ指令が入ります。

```delphi
program ConsoleSample;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

begin
  Writeln('Hello, Console!');
  Readln;
end.
```

これを動かすとコンソールで動作するアプリになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/4c4389d0-742f-b541-cfe0-57cb21678c5c.png)

動かした時、コンソール（黒い画面）出したくない時、ありますよね！！

# コンソールを出さない

プロジェクトオプションの「コンソール アプリケーションを生成」のチェックを外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/9a2d94e2-c1a7-387e-d944-952d8bd7e762.png)

こうすると、実行してもコンソールが表示されなくなります。

Delphi の通常のアプリケーション(FMX, VCL)は、このチェックがデフォルトで False です。

つまり、**このチェックを外すと GUI アプリとしてビルドされます。**

そして、元々コンソール・アプリケーションとして作った場合、ウィンドウを持っていないので ```begin～end.``` の間が実行されて、そのまま終了するアプリができあがります。

ちなみに、{$APPTYPE CONSOLE} があっても、無視されます。

# まとめ
極々稀にコンソールもウィンドウも持たないアプリが作りたくなる事があるので紹介してみました。
AWSでDeepSeekを運用する際のコスト試算

## はじめに

DeepSeekをAWS上で運用する場合、計算リソース（GPUインスタンス）、ストレージ、ネットワーク転送料金などがコストに影響します。本記事では、AWSでDeepSeekを運用する際のコストを試算し、最適な構成について考察します。

---

## 1. 必要なAWSリソース

DeepSeekの運用には、以下のAWSリソースが必要になります。

### 1.1 EC2インスタンス（GPU搭載）

DeepSeekの推論・ファインチューニングには高性能なGPUが必要です。AWSのGPUインスタンスの中で、代表的なものは以下のとおりです。

| インスタンスタイプ | GPU | VRAM | vCPU | メモリ | 料金（オンデマンド） |
|------------------|-----|------|------|------|-----------------|
| g5.2xlarge      | 1x A10G | 24GB | 8    | 32GB  | $1.212/時間  |
| g5.12xlarge     | 4x A10G | 96GB | 48   | 192GB | $7.272/時間  |
| p4d.24xlarge    | 8x A100 | 320GB | 96   | 1152GB | $32.77/時間  |


### 1.2 ストレージ

モデルファイルの保存とデータ処理のためにEBS（Elastic Block Store）を使用します。

- **DeepSeek-7Bのストレージ要件**: 50GB 以上推奨
- **EBS（gp3, 100GB）料金**: 約$8/月
- **オプション：S3ストレージ（データバックアップ用）**: 100GBで$2.3/月

### 1.3 ネットワーク料金
AWSの外部へデータを送信する際に転送料金が発生します。

- **100GB/月の外部転送**: 約$9/月
- **VPC内通信（EC2-S3間）**: 無料

---

## 2. 運用コスト試算

### 2.1 推論用途（インタラクティブな利用）

DeepSeekの推論用途では、 `g5.2xlarge` を選択し、1日4時間稼働すると仮定します。

| 項目 | 料金 |
|------|------|
| g5.2xlarge (4時間/日, 30日) | $145.44 |
| ストレージ (EBS 100GB) | $8.00 |
| ネットワーク転送料 (100GB) | $9.00 |
| **合計** | **$162.44/月** |


### 2.2 ファインチューニング用途（長時間の計算）

ファインチューニングには `g5.12xlarge` を利用し、24時間連続で3日間トレーニングを行うと仮定します。

| 項目 | 料金 |
|------|------|
| g5.12xlarge (24時間 × 3日) | $523.58 |
| ストレージ (EBS 200GB) | $16.00 |
| ネットワーク転送料 (200GB) | $18.00 |
| **合計** | **$557.58/回** |


### 2.3 高性能GPU（p4d.24xlarge）を使用した場合

より高速なトレーニングが必要な場合、 `p4d.24xlarge` を利用し、48時間トレーニングした場合のコストを試算します。

| 項目 | 料金 |
|------|------|
| p4d.24xlarge (48時間) | $1,572.96 |
| ストレージ (EBS 500GB) | $40.00 |
| ネットワーク転送料 (500GB) | $45.00 |
| **合計** | **$1,657.96/回** |

---

## 3. コスト削減のための方法

### 3.1 スポットインスタンスの活用
AWSのスポットインスタンスを利用すると、最大70%のコスト削減が可能です。

- `g5.2xlarge` のスポット料金: 約 $0.38/時間（68%割引）
- `g5.12xlarge` のスポット料金: 約 $2.35/時間（68%割引）

### 3.2 セーバープランの活用
1年間または3年間のリザーブドインスタンスを利用すると、最大50%の割引を受けられます。

- `g5.2xlarge` の1年リザーブド料金: 約 $0.73/時間（40%割引）
- `g5.12xlarge` の1年リザーブド料金: 約 $4.36/時間（40%割引）

### 3.3 AWS BatchとAuto Scaling
ファインチューニングを実行する際に、AWS BatchやAuto Scalingを活用すると、必要なときにのみGPUインスタンスを起動でき、コストを削減できます。

---

## 4. まとめ

| ケース | 使用インスタンス | 稼働時間 | 試算コスト |
|--------|----------------|----------|------------|
| 推論用途 | g5.2xlarge | 4時間/日×30日 | $162.44/月 |
| ファインチューニング | g5.12xlarge | 24時間×3日 | $557.58/回 |
| 高性能トレーニング | p4d.24xlarge | 48時間 | $1,657.96/回 |

DeepSeekをAWS上で運用する際のコストは、用途やインスタンス選択に大きく依存します。スポットインスタンスやリザーブドインスタンスを活用することで、コスト削減が可能です。用途に応じた最適なリソース選定を行い、効率的にDeepSeekを運用しましょう。
Palo Alto Networks Cortex XDR Agentのアンインストールスクリプト

Unattendedなアンインストールをしたい場合にどうぞ。
使い方はuninstall.ps1を直接実行するか、uninstall.batと同時に配信してuninstall.batを実行すると数分でアンインストールできます。

```powershell:uninstall.ps1
$password = "<ここにアンインストールPWを指定>"
$cytoolPath = 'C:\Program Files\Palo Alto Networks\Traps\cytool.exe'
$processStartInfo = New-Object System.Diagnostics.ProcessStartInfo
$processStartInfo.FileName = $cytoolPath
$processStartInfo.Arguments = "protect disable"
$processStartInfo.RedirectStandardInput = $true
$processStartInfo.UseShellExecute = $false
$process = [System.Diagnostics.Process]::Start($processStartInfo)
$process.StandardInput.WriteLine($password)
$process.StandardInput.Close()
$process.WaitForExit()

(Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like "*Cortex XDR*"}).Uninstall()
```

```batchfile:uninstall.bat
cd %~dp0
powershell.exe -ExecutionPolicy Bypass -File uninstall.ps1 -verb runas
```
【Laravel】多彩な機能で効率的なWebアプリケーション開発を実現


### はじめに

Laravelは、モダンなWebアプリケーション開発を効率化するためのPHPフレームワークで、多彩な機能が組み込まれています。以下、Laravelの基本機能をいくつか紹介します。

### 1. MVCアーキテクチャ

**Model-View-Controller (MVC)**
- アプリケーションの構造を分離し、保守性・再利用性を向上させます。

- **モデル (Model)**：データベースと連携し、データの取得や保存を担当。
- **ビュー (View)**：Bladeテンプレートエンジンを使い、HTMLなどの表示部分を作成。
- **コントローラー (Controller)**：リクエストを処理し、モデルとビューの橋渡しを行います。

### 2. ルーティング

**シンプルなルーティング定義**
- URLと処理を結びつける仕組みです。

```php
// routes/web.php
Route::get('/', function () {
    return view('welcome');
});

Route::post('/submit', [App\Http\Controllers\FormController::class, 'submit']);
```

- GET/POSTなどHTTPメソッドごとにルートを設定可能。

### 3. Eloquent ORM

**直感的なデータベース操作**
- Laravel独自のORMで、ActiveRecordパターンに基づき、データベーステーブルに対応するモデルを作成して操作します。

```php
// app/Models/User.php
class User extends Model {
    protected $fillable = ['name', 'email'];
}

// コントローラー内で
$users = User::where('active', 1)->get();
```

- クエリビルダーやリレーションシップ機能も豊富に用意されています。

### 4. Bladeテンプレートエンジン

**シンプルかつパワフルなビュー作成ツール**
- PHPコードとHTMLを分離し、再利用可能なコンポーネントとして記述可能です。

```php
<!-- resources/views/welcome.blade.php -->
<!DOCTYPE html>
<html>
    <head>
        <title>Welcome</title>
    </head>
    <body>
        <h1>Hello, {{ $name }}!</h1>
    </body>
</html>
```

- 制御構造（ループ、条件分岐）もシンプルに記述できます。

### 5. Artisan CLI

**コマンドラインツール**
- アプリケーションの開発やメンテナンスを効率化するためのCLIツールです。

- コード生成：`php artisan make:controller`, `make:model` などのコマンドで雛形を自動生成。
- マイグレーション実行：`php artisan migrate` でデータベース構造を簡単に管理。

### 6. マイグレーションとシーディング

**データベースのバージョン管理**
- マイグレーションを使ってテーブルの作成・変更をコードで管理できます。

```php
// データベースマイグレーション例
Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamps();
});
```

- シーディング：初期データを簡単に投入できる仕組み。

### 7. セキュリティ機能

- **認証・認可**：Laravelには認証システム（ユーザー登録、ログイン、パスワードリセットなど）が標準で搭載されています。
- **CSRF保護**：フォーム送信時に自動でトークンを生成し、クロスサイトリクエストフォージェリ対策が行われます。

### 8. ミドルウェア

**リクエストフィルタリング**
- リクエスト処理の前後に共通の処理を挟む仕組みです。

```php
// 例: 認証ミドルウェア
Route::get('/dashboard', function () {
    // 認証済みユーザーのみアクセス可能
})->middleware('auth');
```

### 9. キューシステムとキャッシュ

- **キュー**：重たい処理（メール送信や画像処理など）をバックグラウンドで実行し、レスポンスを高速化します。
- **キャッシュ**：RedisやMemcachedなどを利用して、アプリケーションのパフォーマンス向上を図ります。

### 10. その他の機能

- **イベント/リスナー**：アプリケーション内のイベント駆動型処理が可能。
- **サービスプロバイダ**：アプリケーションの各種コンポーネントや依存性の注入を管理。
- **テストサポート**：PHPUnitを利用したユニットテストや機能テストの環境が整っています。

### まとめ

Laravelは、ルーティング、Eloquent ORM、Bladeテンプレート、Artisan CLIなど、Webアプリケーション開発に必要な多くの機能を包括的に提供しています。これにより、開発効率が向上し、保守性・拡張性の高いアプリケーションが作成可能です。

各機能はドキュメントやチュートリアルも豊富に用意されており、初心者からプロフェッショナルまで幅広く利用されています。

ぜひ、[Laravelの公式ドキュメント](https://laravel.com/docs/12.x)も参考にしながら、実際のプロジェクトでその機能を体験してみてください。
【個人開発】ポケポケゲットチャレンジの練習スペース作った

# はじめに

ポケポケゲットチャレンジの練習スペースをFlutterで作成しました。Flutterに関する知識が皆無である私が、開発にはCursorとClaude-3.5-sonnetを活用することで、短時間で実装することができました。本記事では、その過程を簡単に紹介します。

:::note warn
本記事で紹介するアプリは、あくまで個人利用を目的として作成したものです。
:::

:::note info
[ゲットチャレンジとは]((https://www.pokemontcgpocket.com/ja/howtoplay/card/))

*「ゲットチャレンジ」では、他のプレイヤーが開封したパックに入っていたものと同じカードをランダムで1枚ゲットできます。一覧からお目当てのカードを引いたプレイヤーがいないか探してみましょう。また、イベント中に登場するチャレンジもあるので、見逃さないようにしましょう。*
:::


# お題

Flutterを用いて、ポケポケゲットチャレンジを再現できる練習スペースを作成することを目標としました。具体的には、以下の要件を満たすものを作りました。

- UI はシンプルで直感的に操作できる
- 画面上の要素がアニメーションする
- クリックやスワイプでインタラクション可能
- リアルタイムなスコア表示

# 結果

CursorとClaudeを活用することで、開発効率を大幅に向上させることができました。
Flutterの組み込みウィジェットを活用し、アニメーションやインタラクションを実装しました。アプリは直感的に遊べるUIとなり、スムーズな動作を実現できました。

<img width=25%><img width=50% alt="intro.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/bb11e157-4b18-4ffa-b7ad-2d76addf2df3.gif">

# まとめ

CursorとClaudeを活用することで、短期間でポケポケゲットチャレンジの練習スペースを開発できました。Flutterの強力なウィジェットと、開発支援ツールの組み合わせが非常に有効でした。これを用いれば、本家のチャレンジ前に練習でき、自分の運の良さ(悪さ)も図ることができます。今後は、スコアの可視化機能や成功体験モード(必ず当たるモード)の実装を検討したいと思います。
ソースコードは[こちら](https://github.com/rxmrsd/get-challenge)。

# 参考

- [Pokémon Trading Card Game Pocket（ポケポケ）](https://www.pokemontcgpocket.com/ja/)
【質問】flutterのGradleまわりのエラー "Gradle task assembleDebug failed with exit code 1"


表題の件の通り
Android studioでflutterを走らせると下記のエラーが発生します。
"Gradle task assembleDebug failed with exit code 1"

![{372E9DDA-BB98-4E0F-A98D-E6FA4BC8F845}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616251/f3fc48d5-3d27-4f58-8a5b-1901dd63a901.png)

解決方法を教えていただきたいです。
STM32F7 + eMMC でDTIMEOUT割り込みが発生する問題と対策

## STM32F7 + eMMC でDTIMEOUT割り込みが発生する問題と対策

### はじめに

STM32F7シリーズのSDMMCモジュールを使用してeMMCとDMA通信を行う際、DTIMEOUT（データタイムアウト）割り込みが予期せず発生する問題に遭遇しました。

通常、DMA転送完了時に DTEN ビットは自動的にクリアされ、データタイムアウトタイマーも停止するはずですが、実際にはタイマーが停止せずDTIMEOUTが発生するケースがあります。

本記事では、この問題の詳細と対策方法について解説します。

### 発生する問題

DTIMEOUT 割り込みが予期せず発生し、通信が停止する

### 原因

HALライブラリでは、DMA受信完了後に以下の処理が行われます。

SDMMC1->DCTRL &= ~SDMMC_DCTRL_DMAEN; // DMAENビットをクリア

しかし、これでは DCTRL の DTEN ビット（データ転送有効）が完全にクリアされないことがあり、データタイムアウトタイマーが停止せず、DTIMEOUT割り込みが発生する場合があります。

これは、STのリファレンスマニュアルに記載されている動作と一致しない ため、特定の条件下で発生する可能性のある不具合と考えられます。

### 対策

DMA受信完了後に、単に DMAEN をクリアするのではなく、DCTRL 全体を 0x0 に設定 することで、この問題を回避できます。

#### 修正前

```
SDMMC1->DCTRL &= ~SDMMC_DCTRL_DMAEN; // DMAENビットをクリア
```

#### 修正後

```
SDMMC1->DCTRL = 0x0; // DCTRLレジスタ全体をクリア
```

これを HAL_MMC_DMAReceiveCpltCallback() 内で適用することで、DTIMEOUT の発生を防ぐことができます。

参考

[Unexpected DTIMEOUT interrupt in STM32F7 eMMC DMA Receive (ST Community)](https://community.st.com/t5/stm32-mcus-embedded-software/hi-in-a-custom-board-i-ve-the-stm32f722-connected-to-a-8gb-emmc/m-p/394206#M29270)
BlackHoleとAirPodsでWeb会議の全音声を録音する方法 【Mac M3チップ対応】

Web会議の音声をイヤホンで聞きながら録音したい、という場面は意外と多いですよね。とくに職場で他の人がいる場合でも、自分の声とPCからのイヤホンの音声を同時に録音できると、あとから議事録を作成したり、聞き返したりするのにとても便利です。

そこで今回は、BlackHoleとAirPodsなどのイヤホンを組み合わせて、自分の発言も含めたWeb会議の全音声を録音する方法をまとめました。

---

## はじめに
**BlackHole**は、Macの内部音声を録音するための仮想オーディオドライバです。  
本記事では、**Mac M3チップを使用した環境**で、BlackHoleとAirPods（または他のイヤホン）を組み合わせて、**Web会議の参加者の声＋自分の声**を同時に録音する方法を紹介します。

---

## 1. BlackHoleのダウンロード・インストール方法

### 1-1. Homebrewを使ってインストール（メイン）
Macでパッケージ管理ツール「**Homebrew**」を利用してBlackHoleをインストールします。ターミナルを開き、次のコマンドを入力してください:

```bash
brew install blackhole-2ch
```

> **メモ**: BlackHoleには「2ch」「16ch」「64ch」などのバリエーションがあります。  
> - 一般的な用途（Web会議や配信など）には **2ch** で十分です。  
> - 複数のチャンネルが必要な場合は **16ch** や **64ch** を検討してください。

### 1-2. 公式サイトからのダウンロード（参考）
- **公式GitHub**からも入手可能です。  
- メールアドレスを登録すると、ダウンロードリンクがメールで送られてきます。  
- Homebrewが使えない環境や、最新バージョンを確認したい場合にご利用ください。

---

## 2. Audio MIDI設定で「複数出力装置」と「機器セット」を作成

自分の声（AirPodsのマイク）とPCの音声（会議参加者の声）をまとめて録音するためには、**複数出力装置（マルチ出力デバイス）**と**機器セット（Aggregate Device）**の両方を設定します。

### 2-1. 複数出力装置（マルチ出力デバイス）の作成

1. **Audio MIDI設定**を起動  
   - 「アプリケーション」→「ユーティリティ」→「Audio MIDI設定」で開きます。  
2. 左下の「＋」ボタンをクリックし、**「複数出力装置を作成」**を選択  
3. 作成された新しいデバイス（例：**「複数出力装置１」**）に  
   - **AirPods**（または使いたいイヤホン）  
   - **BlackHole**  
   を追加・有効にします。

→ これにより、**Web会議アプリが出す音声**を**AirPods + BlackHole**に同時に出力できます。  
イヤホンで聞きながら、仮想オーディオドライバにも音声を流せるようになるわけです。

### 2-2. 機器セット（Aggregate Device）の作成

1. 同じAudio MIDI設定で、左下の「＋」ボタンをクリックし、**「機器セットを作成」**を選択  
2. 作成された新しい機器セット（例：**「機器セット１」**）に  
   - **AirPodsのマイク**  
   - **BlackHole**  
   を追加します。

→ これにより、**自分の声（AirPodsのマイク）＋PC内部音声（BlackHole）**をまとめて  
「1つの入力デバイス」として扱うことができます。

---

## 3. Web会議アプリ（Zoomなど）の設定

Web会議アプリの**マイク**と**スピーカー**を、先ほど作成したデバイスに設定します。

- **マイク**: 「機器セット１（AirPods & BlackHole）」  
  - こうすることで、AirPodsのマイクから出る自分の声が**BlackHole**にも回り、録音できるようになります。

- **スピーカー（出力）**: 「複数出力装置１（AirPods & BlackHole）」  
  - これにより、Web会議の参加者の声がAirPodsで聴こえつつ、同時に**BlackHole**へも出力されます。

---

## 4. QuickTime Playerでの録音設定

### 4-1. 新規オーディオ収録を選ぶ

1. **QuickTime Player**を起動し、画面上部の「ファイル」メニューから**「新規オーディオ収録」**を選択。  
2. 録音のウィンドウが表示されたら、オプション（または録音ボタン横のドロップダウン）を開き、  
   **マイク（入力デバイス）として「機器セット１」**を選択します。

> **ポイント**: ここで**「BlackHole」単体ではなく「機器セット１」**を選ぶ点に注意してください。  
> そうしないと、自分の声とPC内部音声が同時に録音されません。

### 4-2. 録音開始

- Web会議に参加した状態でQuickTime Playerの録音を開始すると、**会議の参加者の声（BlackHole経由）＋自分の声（AirPodsマイク）**が一括で録音されます。

---

## 5. 構成まとめ

- **Zoomのマイク**: 「機器セット１（AirPods & BlackHole）」  
- **Zoomのスピーカー**: 「複数出力装置１（AirPods & BlackHole）」  
- **QuickTime Player（新規オーディオ収録）**:  
  - 入力デバイスとして「機器セット１」を選択

これで、  
- イヤホン（AirPods）で会議音声を聴きながら  
- QuickTime Playerでは「自分の発言＋会議参加者の声」を丸ごと録音  
することが可能になります。

---

## 6. 使う上での注意点

1. **ボリューム調整**  
   - 「複数出力装置」を使うとMac標準の音量調整が使えない場合があります。  
   - 必要に応じて、**Audio MIDI設定**で個別に音量を調整してください。  

2. **事前テスト録音**  
   - 設定が正しいかどうか、Web会議前に短時間でテスト録音をしておくことをおすすめします。  

3. **プライバシーに注意**  
   - 会議の録音は、関係者の同意や会社の規定に従って行ってください。

---

## 参考リンク

- [BlackHole公式GitHub](https://github.com/ExistentialAudio/BlackHole)  
- [内部音声収録の参考記事](https://xyk.hatenablog.com/entry/2024/01/19/124325)（スピーカー設定例ですが、スクリーンキャプチャが参考になります）  

---

以上の方法を使えば、Mac（M3チップ）を利用した環境でWeb会議の音声をAirPodsで聞きながら、自分の声を含めて録音できます。ぜひ活用してみてください。
Obsidianのマリアージュ技その5｜Alfredのスニペットでノートのテンプレを挿入する

## はじめに

便利なノートツール[Obsidian](https://obsidian.md)をさらにスマートに使うため、AlfredのSnippets機能で定型フォーマットを即挿入する方法を紹介します。

## 動作イメージ

テンプレートが挿入される様子です。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/9ef41ed1-bee8-4f2f-a41d-6a29d89272b4.gif)

## 挿入するノートテンプレート

Alfredのスニペットに登録するテキストは以下の通りです。
メモの背景、関連リンク、タスクログをすぐに作成できます。

```markdown
## 背景



## 関連メモ・リンク



## タスクログ
({date:yyyy-MM-dd} {time:HH:mm})



```

タスクログには自動で日付・時刻が挿入され、記録が楽になります。

![SS 2025-02-26 15.08.15_opt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/db9f9ad5-089f-4ebb-9f05-11b3cafc8001.jpeg)

:::note warn
背景や関連メモ・リンクは省略する場合もあります
:::


## なぜAlfredのSnippetsなのか？

Obsidianのテンプレート機能も便利ですが、以下の理由でSnippetsの方が短く簡単です。

- **少ないストローク数:**  
  トリガー入力だけで3ストローク。テンプレートは4ストローク以上。

- **認知負荷の軽減:**  
  選択作業が不要なため、迷いなく定型文を挿入可能。

## Alfredでのテンプレート登録

1. **Alfred Preference > Features > Snippets**  
   新しいスニペットを作成。

2. **Keyword（発火トリガー）の設定**  
   覚えやすい短い文字列（例: `;tl`）を指定。

3. **テンプレート登録**  
   Obsidianでノート作成時、トリガーをタイプし挿入。

![SS 2025-02-26 15.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/e88ba2a9-2906-4121-91d2-9b318c5bc79d.png)

## おわりに

AlfredのSnippetsで、手間をかけずに定型フォーマットを素早く挿入できます。
シンプルな操作で作業フローがスムーズになり、日々のメモ作成がさらに快適になります。

### 参考リンク

- [Obsidian｜使いかたとコツ（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)

タスクログについては、下記ご参照ください。

- [Obsidianで作業記録を取ると、ウェブリンクもローカルへのリンクもまとめて扱えてとても便利だとおもっているのですが、どうでしょう](https://qiita.com/hann-solo/items/49e442896b78b279dab2)
- [Obsidianの小技その9｜タスクログをつくる](https://qiita.com/hann-solo/items/5830e6718c8ca949d182)

### 環境

下記の環境で実施しました。

- Alfred 5.6
- Obsidian 1.8.7
- macOS Sequoia 15.2
- MacBook Pro (14-inch, 2021)
【Mac】PostgreSQLの導入方法

# 記事概要
PostgreSQLをインストールするため、Macの設定方法をまとめる。

# 前提
- PCはMacを使用している

# 手順
1. PostgreSQLをインストールため、ターミナル.appで下記を実行
    ※処理に時間がかかる可能性あり
    ```
    % brew install postgresql@14
    ```
1. PostgreSQLが正しくインストールされたことを確認ため、ターミナル.appで下記を実行
    ```
    % psql --version
    # => psql (PostgreSQL) 14.13 (Homebrew)
    ```

# 備考
- MySQLのインストール方法は、[こちら](https://qiita.com/likapantrip/items/ac9b3c9262316213d259)を参照
個人的備忘録：Terraform で CloudFront のカスタムエラーページを設定する方法をコードで振り返る

## はじめに

AWS CloudFront を利用する際、403 や 404 エラーが発生したときにカスタムエラーページを表示したい場合があります。

本記事では、Terraform を使って CloudFront のカスタムエラーレスポンスを設定する方法を解説します。

**実際に使っているコード**
現在、コードの記述量が想定より多くなっているため、今後はファイルの分割などを検討する予定です。

https://github.com/Winter-Hackathon-2025-A-Team/skill-typing-infra-Terraform

## **なぜ Terraform を使うのか？**
以前は、AWS マネジメントコンソールを使って手動でエラーページを設定していました。しかし、手動の設定には以下のような問題がありました。

- 設定を変更するたびに AWS マネジメントコンソールにログインする必要がある。
- 同じ設定を複数の環境（開発・ステージング・本番）に適用するのが面倒。
- 設定ミスや変更履歴の管理が難しい。

Terraform を使えば、コードとしてインフラの設定を管理できるため、

- 一度定義すれば、同じ設定を簡単に適用可能。
- 設定の変更をバージョン管理し、履歴を追える。
- ミスを減らし、管理を効率化できる。

といったメリットが得られます。

## **CloudFront のカスタムエラーレスポンスとは？**
CloudFront では、S3 バケットや他のオリジンが `403 Forbidden` や `404 Not Found` を返した際に、別のページ（例えば `index.html`）を表示するように設定できます。これにより、静的サイトでエラーページを一貫したデザインで提供できます。

## **Terraform の設定方法**
Terraform の `aws_cloudfront_distribution` リソース内で `custom_error_response` ブロックを追加することで、CloudFront にカスタムエラーページを設定できます。

### **カスタムエラーレスポンスの追加**
以下のコードを CloudFront の Terraform 設定に追加してください。

```hcl
  # カスタムエラーレスポンスの設定
  custom_error_response {
    error_code            = 403
    response_page_path    = "/index.html"
    response_code         = 200
    error_caching_min_ttl = 10
  }

  custom_error_response {
    error_code            = 404
    response_page_path    = "/index.html"
    response_code         = 200
    error_caching_min_ttl = 10
  }
```

### **各パラメータの説明**
| パラメータ | 説明 |
|------------|------|
| `error_code` | CloudFront で処理するエラーコード（403, 404 など） |
| `response_page_path` | エラー時に表示するページのパス（例：`/index.html`） |
| `response_code` | CloudFront がクライアントに返す HTTP ステータスコード（200 に設定すると通常のページとして扱われる） |
| `error_caching_min_ttl` | エラーのキャッシュ時間（秒単位、10 秒に設定） |

## **適用方法**
1. Terraform のコードを修正し、CloudFront に `custom_error_response` を追加。
2. `terraform apply` を実行して変更を適用。
3. CloudFront のキャッシュをクリア（invalidate）して変更を反映。

```sh
terraform apply
```

キャッシュクリアを行う場合は、AWS CLI で以下のコマンドを実行してください。

```sh
aws cloudfront create-invalidation --distribution-id YOUR_DISTRIBUTION_ID --paths "/*"
```

## **まとめ**
Terraform を使用して AWS CloudFront のカスタムエラーレスポンスを設定する方法を紹介しました。403 や 404 エラーが発生した際に `index.html` を表示することで、よりユーザーフレンドリーなエクスペリエンスを提供できます。

:::note info
***Terraform を活用すれば、インフラのコード管理が容易になり、再現性の高い環境を構築できます。***
:::

CloudFront のエラーページ設定を適用する際は、キャッシュのクリアも忘れずに行いましょう！
Cable(Docstrings)「sympyのDocのCableの説明を日本語でお願いします。」をAI先生に聞きました。

**・おすすめのwebページを探しています。よろしくお願いします。**

# オリジナル
Cable (Docstrings)
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/cable.html#sympy.physics.continuum_mechanics.cable.Cable.solve
Examples
For point loads,
```
以下の説明を日本語でお願いします。
from sympy.physics.continuum_mechanics.cable import Cable
c = Cable(("A", 0, 10), ("B", 10, 10))
c.apply_load(-1, ('Z', 2, 7.26, 3, 270))
c.apply_load(-1, ('X', 4, 6, 8, 270))
c.solve()
c.tension
c.reaction_loads
c.length
```
For distributed load,
(省略)

# ChatGPT先生へ

>ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
>(回答抜粋)
>このコードは、SymPyのCableクラスを使って、あるケーブルの挙動を解析するものです。以下、日本語で説明します。...
```
作図をお願いします。
```
```
ケーブルがカーブしていません。
```
・??ずれて見える。わからないので、中断です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/568ea141-3e4d-4c17-8f6c-3d4833818091.png)

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)
# いつもと違うおすすめです。

#### wikipedia 
#### Qiita
#### Google検索
#### 文献
TrueNAS + APC UPS の環境で、UPSが自動でシャットダウンしてくれない。


TrueNAS SCALE を使用しているが、APC の UPS と連動させようと思うと、停電を検知して TrueNAS 自身が自動でシャットダウンするところまでは問題ないが、UPS のシャットダウンまでは行ってくれないので、復電したあとに自動で電源が入らない。

本来は「Power Off UPS」をチェックすれば、自動的に UPS のシャットダウンまで行ってくれるはずらしいのだが、どうも Bug な感じらしく、TrueNAS のフォーラムを見ていたら、解決方法が書いてあったので、日本語でシェアしてみる。

https://forums.truenas.com/t/ups-is-not-powering-off-on-command/10606/57

なお、以下の設定を試したことによる一切の責任は負いかねるのでご了承いただきたい。



今回検証した構成は以下のとおり。

・TrueNAS SCALE ElectricEel-24.10.2

・APC Smart-UPS 750 SMT750J（USB ケーブルでサーバ接続）

1 TrueNAS の管理画面から、
　 System > Advanced Settings > Init / Shutdown Scripts に移動する。

2 Add ボタンをクリックして、各項目に以下のように入力する。
~~~設定例
Description: Power Down UPS
Type: Command
Command: [ -f /etc/killpower ] && { /bin/sleep 10; /lib/nut/usbhid-ups -a UPSNAME -k; }
When: Shutdown
Enabled: チェックを入れる
Timeout: 20
~~~
　※command の UPSNAME は、
　　System > Services > UPS の Identifer に入力した UPS 名を入力。

3 Save ボタンをクリックする。

4 System > Services に移動して、UPS の鉛筆マークをクリック。

5 各項目に以下のように入力する。
~~~設定例
Identifer: ups
UPS Mode: Master
Driver: APC ups 2 Smart-UPS (USB) USB (usbhid-ups)
Port or Hostname: auto

Shutdown Mode: UPS goes on battery
Shutdown Timer: 30
Shutdown Command: /bin/midclt call system.shutdown
Power Off UPS: チェックする
~~~
6 Save ボタンをクリックする。

※初回設定時には、
　Services の画面の Running と Start Automatically が OFF なので、
　これを ON にしておく。


検証

1. UPS の電源を引っこ抜いて疑似停電を発生させて、
TrueNAS が自動でシャットダウンするか、
UPS が自動でシャットダウンするかを確認。
UPS の電源を差して、TrueNAS が自動で起動するか確認。


2. TrueNAS の UI から Shutdown を行って、
UPS は落ちないかどうかを確認。
rex0220 印刷屋プラグイン ループ処理で複数ページを生成

印刷屋プラグインで、ループ処理を使った複数ページの生成を行います。

# 概要

ループ処理で、複数ページを生成してみます。
ユーザー選択項目やチェックボックス項目、テーブルなど配列要素を持つ項目などは、同様に選択値分のページを生成することが出来ます。
今回は、ページ内の文字列もループ処理しています。

- 印刷屋プラグインプレビュー画面

![2025-02-26_14h21_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d786f6ee-61ce-4b8a-8b46-db7077893132.png)

## 印刷屋プラグイン設定

```css:
.custom-blue {
  color: blue;
  font-size: 32px;
}
.custom-rows {
  color: red;
  font-size: 24px;
}
```

```js:ループ処理
TAGS_HTML(
  ARRAY_MAP(ARRAY("A-PAGE","B-PAGE","C-PAGE"),xx,
    PAGE_HTML(
       TAG("div", xx, ATTR("class","custom-blue")),
       ARRAY_FOR(3,idx,
         TAG("div", "TEST-"&(idx+1), ATTR("class","custom-rows"))
       )
    )
  )
)
```

# ループ処理で生成されたプレビューのHTML

```html:生成されたHTML
<div class="rex0220-pcraft-page">
    <div class="custom-blue">A-PAGE</div>
    <div class="custom-rows">TEST-1</div>
    <div class="custom-rows">TEST-2</div>
    <div class="custom-rows">TEST-3</div>
</div>
<div class="rex0220-pcraft-page">
    <div class="custom-blue">B-PAGE</div>
    <div class="custom-rows">TEST-1</div>
    <div class="custom-rows">TEST-2</div>
    <div class="custom-rows">TEST-3</div>
</div>
<div class="rex0220-pcraft-page">
    <div class="custom-blue">C-PAGE</div>
    <div class="custom-rows">TEST-1</div>
    <div class="custom-rows">TEST-2</div>
    <div class="custom-rows">TEST-3</div>
</div>
```

# 解説

この計算式は、複数のページ（"A-PAGE"、"B-PAGE"、"C-PAGE"）を持つHTML構造を動的に生成するためのものです。それぞれのページには、クラス属性 `"custom-blue"` を持つ `<div>` 要素が作成され、その中に `"TEST-1"`, `"TEST-2"`, `"TEST-3"` という3つの `<div>` 要素が含まれます。

## 計算式の分解と説明
1. ARRAY("A-PAGE","B-PAGE","C-PAGE")
配列を作成（["A-PAGE", "B-PAGE", "C-PAGE"]）。
2. ARRAY_MAP(..., xx, ...)
配列の各要素 "A-PAGE", "B-PAGE", "C-PAGE" を xx 変数として処理。
3. PAGE_HTML(...)
HTML ページのコンテナを作成。
4. TAG("div", xx, ATTR("class","custom-blue"))
各ページのタイトルを div にラップし、クラス "custom-blue" を付与。
5. ARRAY_FOR(3, idx, TAG(...))
インデックス idx を 0 から 2 までの範囲でループし、3つの \<div\> を作成。
各 div の中身は "TEST-1", "TEST-2", "TEST-3"。
それぞれ class="custom-rows" が付与される。
6. TAGS_HTML(...)
PAGE_HTML の出力をまとめて HTML に変換。
LangChainの長期メモリー機能：LangMemについて 2/2

先日、LangChainが長期メモリ機能を公開しました。ユーザーとの対話内容をインデックスストアとして蓄積することで、複数回の対話でも記憶を保持できる仕組み、すなわち「long-term memory」が実現できるとのことです。そして、つい数日前にこの機能がリリースされ、「LangMem」として提供されるようになりました。今回は、このLangMemについて簡単にご紹介します。

まず、使い方の詳細は以下のドキュメントに記載されています。

https://langchain-ai.github.io/langmem/reference/memory/

簡単にまとめると、LangGraphで作成したAgentに、LangMemで新たに定義された２つのツールを追加するだけで機能が実現します。ひとつは、ユーザーからの入力内容を管理するためのツール「create_manage_memory_tool」（データベースの作成、保存、削除などを担当）、もうひとつは、そのデータベース内を検索するためのツール「create_search_memory_tool」です。これらを組み合わせることで、基本的な長期メモリ機能が完成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/8f90419b-fb8a-4b84-8a51-522525c295f5.png)


あと今回のリリースでは、LangChainがLLMの記憶内容を、以下の３種類に分類するという新しい視点を提示しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/b4e6c45e-d6b1-4ff0-a266-3bd6fdc6d345.png)

Agentは各情報がどのタイプに該当するかを判断し、適切なプロンプトの場所へ配置します。最終的には、これらの記憶情報がプロンプトとして活用されます。例えば、"semantic"などの事実情報はsystem promptに利用し、"episodic"などの事例情報はfew-shot promptに組み込まれる、といった具合に運用される仕組みです。


興味ある方:

https://blog.langchain.dev/langmem-sdk-launch/

https://qiita.com/xxyc/items/b7ed8dd00d11cf495085
GitHub Pagesの使い方について

<h1>1. リポジトリを作成する</h1>
GitHub Pagesでは、GitHubを利用してWebページを公開することができます。
また、Webページをを公開する時に以下のものが必要となります。

<ul>
<li>GitHubのアカウントの作成</li>
<li>Gitの開発環境用意(任意)</li>
</ul>

GitHubアカウントのみあればWebページを公開することができます。
まずリポジトリを作成する必要があります。

<ol>
<li>右上のアイコンをクリックしてYour repositoriesを選択します。</li>
<li>NewもしくはNew Repositoryを選択します。</li>
<li>Repository nameにリポジトリ名を入力します。</li>
<li>リポジトリがPublicになっていることを確認して　create repositoryをクリックします。</li>
<li>リポジトリの完成！</li>
</ol>

<h1>2. ファイルをアップロードする</h1>
ファイルのアップロード方法は2つあります。
どちらでもアップロードは可能なのですが、Gitの開発環境がない場合は1つ目の方法でアップロードをしましょう。
<br>1つ目は、GitHubリポジトリに直接アップロードする方法です。
<ol>
<li>「ユーザ名/リポジトリ名」下の上部バーでcodeが選択されているか確認する。
<br>（リポジトリを開くとデフォルトで選ばれている）</li>
<li>add file  ▽を選択する。</li>
<li>Upload filesを選択する。</li>
<li>Drag files here to add them to your repositoryのところに対象のフォルダをDrag and Dropするか
chose your filesで対象のフォルダを選択する。</li>
<li>アップロード完了！</li>
</ol>

2つ目は、Gitを使ってpushしてファイルをアップロードする方法です。
<ol>
<li>mkdir リポジトリ名でリポジトリを作成する。</li>
<li>cd　リポジトリ名で対象のリポジトリに移動する</li>
<li>git init で　gitリポジトリを作成する </li>
<li>レポジトリをVSCodeなどのエディターで開いてファイルをアップロードする</li>
<li>git addコマンド　git commitコマンドを実行する。</li>
<li>git remote addコマンドをGitHubのリポジトリからコピーして実行する。</li>
<li>git push origin mainでリモートリポジトリにフォルダを送信。</li>
<li>アップロード完了！</li>
</ol>

:::note info
補足
mainブランチと作業用ブランチを分けているときは「git push origin 作業用ブランチ名」を実行してから
pull requestを出してmainブランチにmergeすればmainブランチにアップロードできます。
:::

<h1>3.GitHub pagesを公開するには</h1>
<ol>
<li>対象のリポジトリに移動する。（移動してなかったら）</li>
<li>「ユーザ名/リポジトリ名」下の上部バーでsettingが選択する。</li>
<li>サイドバーのpagesを選択する </li>
<li>branchがNoneとなっているのでmainに変更してSaveを押します。</li>
<li>Webページの公開完了！</li>
</ol>
また、Webページを確認する際には
<ol>
<li>Saveを押した後http(s)://<username>.github.ioというようなURLが表示されるのでコピーします。</li>
<li>リポジトリが複数ある場合はサイトに上記のURLを貼り付けて<br>http(s)://<username>.github.io/<repository>となるように書き加えます。</li>
<li>WebサイトでGitHub Pageが公開されたことが確認できます。</li>
<li>確認完了！</li>
</ol>

:::note info
補足
GitHub Pagesの内容を変更するには修正したファイルのアップロードを行えば数分後に自動で更新されます。
またURLの右側にある「•••」のマークを押してUnpublish siteを選択すれば公開が取り下げられます。
:::
JavaScriptのPromiseについて

こんにちはプログラマー2年目の塚田です。
今回も前回と同じくJavaScriptについてお仕事で触れたものを紹介したいと思います。

# はじめに
皆さんは**Promise**をご存じでしょうか。
Promiseというのは「非同期処理の結果を表せるオブジェクト」です。
Promiseを使うことで、非同期処理を読みやすく管理しやすくなります。
今回はそのPromiseについて調べながら書いてみました。

# 3つの状態
まず、非同期処理には3つの状態があります。
・pending(処理待機中) → 処理がまだ終わってない状態
・resolve(処理成功) → 処理が成功して値が返ってきた状態
・reject(処理失敗) → 処理が失敗した状態

上記三つを念頭に置いて以下のコードを書いてみます。

```
let promise = new Promise((resolve,reject) => {
    resolve("成功!");
    reject("失敗!")
})
```

上記はpromiseの処理が成功した場合は **成功!** を出力し、
失敗した場合は **失敗!** を出力するコードです。

# then,catch,finally
次に**then**,**catch**,**finally**を紹介します。

.then()は処理(promise)の結果を取得します。
.catch()は処理(promise)のエラー処理を記述します。
.finally()は後処理を記述します。

先ほどのコードに追記してみます。

```
let promise = new Promise((resolve,reject) => {
    resolve("成功!");
    reject("失敗!")
});

///　ここから下が追加する処理

promise
    .then(result => {
        console.log(result);　// → 成功!
    })
    .catch(result => {
        console.log(reject);　// → 失敗!
    })
    .finally(() => {
        console.log("処理が終了しました!");　// → 処理が終了しました!
    })
```

処理(promise)が成功(resolve)したときは.then()により
"成功!"が出力されます。

一方、処理(promise)が失敗(reject)したときは.catch()により
"失敗!"が出力されます。

最後に成功失敗関係なく、.finally()により"処理が終了しました!"を出力します。

以上がPromiseの使い方となります。

# Promiseのチェーン
ここからはお仕事では使いませんでしたが、変わった書き方があったので紹介します。
上で使用した.then()を繋げることで非同期処理を順番に実行できます。

```
let promise = new Promise((resolve,reject) => {
    resolve(1);
});

promise
    .then(result => {
        console.log(result); // → 1
        return result + 1
    })
    .then(result => {
        console.log(result) // → 2
        return result + 2
    })
    .then(result => {
        console.log(result) // → 4
    });
```
以上です。

# 終わりに
Promiseを活用すれば非同期処理も見やすくわかりやすいコードが書けそうですね。
今後非同期処理を触る機会があったらこのPromiseを活用してみようと思います。
以上、塚田でした。
最速でLaravelからSlackに通知を送る方法

こんにちは、堀井です。

今回はLaravelでSlackに通知を送る手順の中で一番簡単な方法を試してみようと思います。
※Laravelプロジェクトは作成済みの体で進めます。

# SlackでWebhook用のURLを作成

1. Slackに通知を受信する用のチャンネルを作成（今回は「laravel通知」）
1. サイドメニューの「アプリを追加する」を選択
![スクリーンショット 2025-02-23 20.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/b24d7936-d54f-445a-9df2-ad504e2cc999.png)
1. 検索ボックスに「web」と入力し、「Incoming WebHooks」の「追加」を選択
![スクリーンショット 2025-02-23 20.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/459d3da7-e395-4ed6-9794-b73e4d61ac52.png)
1. 「Slackに追加」を選択
![スクリーンショット 2025-02-23 20.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/61e94b6a-d67e-48cd-ba5f-ef08d6548575.png)
1. 「チャンネルへの投稿」で「#laravel通知」チャンネルを選択し、「Incoming WebHook インテグレーションの追加」を選択
![スクリーンショット 2025-02-23 20.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/e52f75c6-9cae-4ac2-aff4-7bfa04d11f46.png)
1. 「Webhook URL」の「URLをコピーする」を選択してコピー
![スクリーンショット 2025-02-23 20.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/59ff718e-100e-4f9f-834f-f0c4a356c106.png)

# Laravelで通知を送る

1. 「.env」に「LOG_SLACK_WEBHOOK_URL」を追記
※値は上記手順でコピーしたURL
![スクリーンショット 2025-02-25 22.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/7c4d23e5-b9de-4899-858e-f7232e39b6ee.png)
1. ルートに以下記述を追加してそのルートにアクセス
![スクリーンショット 2025-02-25 22.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/53dfecc8-f0b2-45af-b6fd-aa75245b05c8.png)
1. Slackの「laravel通知」チャンネルに通知が送信
![スクリーンショット 2025-02-25 22.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/5580f91c-267f-41f4-8a89-bebe33fb5a78.png)

# まとめ
今回、LaravelでSlackに通知を送る方法を試してみましたが、本当に簡単でした。
たぶんこれが一番早いと思います。
最初から設定が用意されているのが流石はLaravelといったところでしょうか。
Slackに通知を送る際には参考にしてみて下さい。

以上、堀井でした。
[Keyboard][ShortCut][Browser] ショートカット

# 戻る
`Alt`+`←`

# タブの移動
`Ctrl`+`[1-9]`

# 参考リンク
- [ブラウザのショートカットキー、「戻る」は[Alt]＋[←]](https://smbiz.asahi.com/article/15276139#:~:text=Windows%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%A7Web%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E9%96%B2%E8%A6%A7%E6%99%82%E3%81%AB%E4%B8%80%E3%81%A4%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%B9%E3%83%A0%E3%83%BC%E3%82%BA%E3%81%AB%E6%88%BB%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%AF%20%5BAlt%5D%EF%BC%8B%20%5B%E2%86%90%5D%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%20Mac%E3%81%A7%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81,%5BCommand%EF%BC%88%E2%8C%98%EF%BC%89%5D%2B%20%5B%E2%86%90%5D%E3%81%A7%E3%81%99%E3%80%82%20Chrome%E3%81%A7%E3%82%82Edge%E3%81%A7%E3%82%82Firefox%E3%81%A7%E3%82%82%E5%85%B1%E9%80%9A%E3%81%A7%E3%81%99%E3%80%82%20%E3%81%9D%E3%81%AE%E3%81%BB%E3%81%8B%E3%80%81%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E5%88%A5%E3%81%AB%E6%93%8D%E4%BD%9C%E3%82%92%E5%BF%AB%E9%81%A9%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%82%E7%B4%B9%E4%BB%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)