OmniAICreator/Qiita-1.07M huggingface dataset:
SOCKET-MANAGERを使った自作サーバー開発の手引き＜フレームワークの特徴＞

# はじめに

サーバーアプリを開発するツールと言えば一般にライブラリ形式で提供されているものが多い印象ですが、このフレームワークでは頻繁に書くような慣習的なコーディング部分をコマンド操作で概ね補えるようになっています。

以下のようにフレームワークコマンドのUsageを表示すると、サーバーの実装に必要なコマンド群が表示されます。

```terminal:Usageの表示
> php worker
SOCKET-MANAGER Framework 1.0.0

Usage:
  command [arguments]

 main
  Empty...
 craft
  craft:init <初期化クラス名>                     初期化クラスの生成
  craft:parameter <UNITパラメータクラス名>        UNITパラメータクラスの生成
  craft:protocol <プロトコルUNIT定義のクラス名>   プロトコルUNIT定義のクラスとステータス名Enumの生成
  craft:command <コマンドUNIT定義のクラス名>      コマンドUNIT定義のクラスとキュー／ステータス名Enumの生成
  craft:main <メイン処理のクラス名>               メイン処理クラスの生成
  craft:setting <設定ファイル名>                  設定ファイルの生成
  craft:locale <メッセージファイル名>             メッセージファイルの生成
```


# コマンドによる実装とサーバー起動

例えば、メイン処理を作成してインスタンス化し、サーバーを起動するまでの手順は以下２ステップのコマンドで完結します。

### ①メイン処理の作成

`php worker craft:main <メイン処理クラス名>`というコマンドを使ってメイン処理クラスのひな形を作成します。
今回の場合は`MainForTest`というクラス名を指定。

```terminal:コマンド実行
> php worker craft:main MainForTest

[success] メイン処理クラスの生成に成功しました (MainForTest)
```

生成されたクラスは`app/MainClass`の場所に格納されます。

### ②サーバーを起動

`php worker`コマンドを使って`app:main-for-test`というサーバー名を指定して起動。
（サーバー名はキャメルケースをスネークケースに変換して先頭に`app:`を付与したものになります）
今回の場合はポート番号10000番で起動。

```terminal:コマンド実行
> php worker app:main-for-test 10000
```

これでホスト名'localhost'（デフォルト）の10000ポートをListenポートとしてサーバーが起動します。（`Ctrl+C`で停止します）

また、`php worker`を実行して再度USAGEを表示すると、先ほど生成したサーバーの名前が`main`カテゴリへ追加されているのが確認できます。

```terminal:コマンド実行
> php worker
SOCKET-MANAGER Framework 1.0.0

Usage:
  command [arguments]

 main
  app:main-for-test                              Command description
 craft
  craft:init <初期化クラス名>                     初期化クラスの生成
  craft:parameter <UNITパラメータクラス名>        UNITパラメータクラスの生成
  craft:protocol <プロトコルUNIT定義のクラス名>   プロトコルUNIT定義のクラスとステータス名Enumの生成
  craft:command <コマンドUNIT定義のクラス名>      コマンドUNIT定義のクラスとキュー／ステータス名Enumの生成
  craft:main <メイン処理のクラス名>               メイン処理クラスの生成
  craft:setting <設定ファイル名>                  設定ファイルの生成
  craft:locale <メッセージファイル名>             メッセージファイルの生成
```


# 利用できるプロジェクト環境

サーバー開発が始められる環境は、開発の目的に合わせて以下の４種類のプロジェクトから選べるようになっています。

### ①フレームワークのデモ環境

Webブラウザ⇒マインクラフト間チャットが可能なチャットサーバーのデモ環境です。
デモ環境には６種類のサーバーが内包されていて、マルチサーバー環境でサーバー間通信（IPC）によるプライベートメッセージの送信が可能なサーバーも含まれています。

https://qiita.com/glasses_seven/items/7a490dc8694348505a53/

### ②新規プロジェクト開発環境

プロトコル開発も含めて一から始められる環境です。
開発に必要な各コマンドの利用例をご紹介しています。

https://qiita.com/glasses_seven/items/d712808b985aa5253d05/

### ③Websocketサーバー開発環境

Websocketプロトコルが実装済の環境で、サーバーコンテンツの開発から始められます。
簡単なチャットコンテンツの作成例をご紹介しています。

https://qiita.com/glasses_seven/items/fa9226356815e69e4076/

### ④マインクラフトコンテンツ専用環境

マインクラフトのカスタムアイテムやカスタムエンティティを制御できます。
Webブラウザでアイテムショップを運用できます。
以下のページではカスタムアイテムの一つである「いなずまの弓」を実装例としてプロジェクト環境をご紹介しています。

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

:::note info
この環境では①のデモ版を継承しているのでデモの機能はそのまま使えます。
:::


# おわりに

コマンドベースのインターフェースはLaravelとの連携を考慮しているので、以下のページでその連携方法をご紹介しています。

https://qiita.com/glasses_seven/items/39ee921d754ed83585b3/

連携後はLaravelのコマンドを使ってサーバーを起動する事もできるので、Laravelのリソースを使った開発が可能になる事に加え、Webアプリとのオールインワン環境としても使えるようになります。
また、Laravelとの連携後であってもこのフレームワークのコマンドを使って引き続きサーバー開発が行えます。
デザイナーを雇う予算がなくてデザインやることになったエンジニアが始めに読むやつ

デザイナーを確保する予算がなく、エンジニアがデザインまで担当する時がある。

後輩エンジニアたちに簡単なデザインのタスクを振った時に、いつも同じ指摘をしていることに気づいたのでガイドをまとめておく。

なお、私も初めての時に同じことを指摘された。

## 対象読者
- エンジニアだがデザインをやらねばならなくなった人
- デザインの基礎の基礎くらいは知っておきたい人

- 興味がある人

## マインドセット
プログラミングでは車輪の再発明をしないのに、デザインとなると、とたんにゼロから考えようとする人が多い。私もそうだった。



エンジニアがデザインをやるときは「~~パクる~~見たことがある」デザインで固めていくのが正解だと思う。
見たことがあるデザインなら直感的に操作できユーザのストレスもないためだ。

この記事では、料理に例えると「5つ星をとる」ことではなく、
- 焦がさない・生煮えにしない
- （毎日食べられる程度に）普通に美味しい

ことを目指す。

## 具体的には何をすればいいの？
### 1. 思想を知る

Google の [Material Design](https://m3.material.io/)[^1] ガイドが体系的。美しいサイトで読むのが楽しい。
[^1]: 世の中には他のデザインシステムもあると思うが、Google のデザインということでスマホや Web で目にすることが多く、慣れ親しんでいるユーザが多いことから上げさせていただいた。


もし時間がない場合、以下から読むのがおすすめ。
- [Layout](https://m3.material.io/foundations/layout/understanding-layout/overview)
    - まずは大きいところ、レイアウトから決めていくと段取りがよい
    - ユーザが迷わない・見やすい画面配置に
- [Components](https://m3.material.io/components)
    - プログラミングで言う文法に該当する気が。知らずに作り始めると後悔する  
- [Styles](https://m3.material.io/styles/color/system/overview) 
    - 赤は「削除ボタン」など警戒してほしいアクションに使う。といった話もこちら
    - モーションはやや上級のため初めのうちは読み飛ばしてよい。ライブラリ使えば適切なモーションついてますし
- [Gestures](https://m3.material.io/found集ations/interaction/gestures) (モバイルアプリなら) 
    - スマホでよくやってる操作集。ダブルタップ、長押し、など
    - 直感からはずれる結果が起こると「わかりづらい UI」としてストレスがたまるためぜひ一読を

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/1c457645-2aa3-4fea-8257-b743c2851a8b.png)
> [Do & Don't](https://m3.material.io/components/chips/guidelines#6b157787-ef24-4a7d-a76f-159e999c2b85) わかりやすい！

### 2. 可能ならライブラリを使う
例えば [MUI](https://mui.com/) を使うと Material Design の設計思想に沿ったコンポーネントやカラーシステムが使える。

自分で CSS を書くより何倍も小さい工数で美しいボタンや入力フォームといったコンポーネントが使えるし、カラーシステムも自動なので、素人が作るより安定する。

### 3. 「他のサービスはどうしてるの？」をググる
作りたい機能の UI 例をとにかくググる。

例えばスケジュール管理機能を作りたければ、世の中のカレンダー UI をとにかくググって観察する。

「気持ちいい」「わかりやすい」デザインの良いところ（余白があって見やすいなど）を取り入れてみる。

### 4. デザイナーのブログを読んでみる
個人的なおすすめ
- [実案件から学んだ、本当に役立つUIデザインの法則50 ユーザビリティチェックリスト総集編](https://note.com/i3design_design/n/na5bc07e4acb0)
- [UIのお作法。28個の「〇〇できそう感」をまとめました。](https://note.com/okamotomai/n/n6bba0b892778)

## 最後に
以上です！もし補足や訂正あればお願いします🙇‍♀️
LangChain公式チュートリアルをJupyter Notebookで試してみた【VSCodeとColabを比較】


LangChainの公式ドキュメントでは、以下のチュートリアルがJupyter Notebookでの実行を前提としており、それが推奨されています。 

[LangChain Tutorials](https://python.langchain.com/docs/tutorials/)

今までJupyter Notebookを使ったことがなかったのですが、これを機に使ってみたところ、チュートリアルを読みながらサンプルコードを動かすにはとても便利でした。  

本格的なシステム開発には向かない印象ですが、学習や検証用途では非常に有効だと感じたので、今後も活用していこうと思っています。  



# 良いと感じた点

* 新規のソースコードを簡単に作成可能  
  新規にソースコードを実行したい場合、ファイルを作成する必要がなく、Jupyterにおける`セル`を追加すればOKです。  
  ほんの一手間ですが、なかなか便利です。
* 実行の手間がかからない  
  これも上記と同様一手間の話ではあるのですが、実行ボタンを押下するだけで、ファイルも指定する必要がなく、便利です。  
  VSCode環境ではデバッグ実行も非常に使いやすいです。  
* ソースと合わせてドキュメントを管理可能  
  任意の場所にマークダウン形式でメモが残せるのですがこれも便利です。  


## 新しいコードをすぐに試せる

Jupyterではファイルを作成せずに、セルを追加するだけですぐにコードを実行できます。  
ちょっとした一手間が省けるだけですが、コードを試行錯誤する際にはとても助かります。

## 実行がシンプル

実行ボタンを押すだけでOK。ファイルの保存や実行対象の選択なども不要です。  
特にVSCode環境では、直感的にデバッグ機能を使えるので効率的です。

## コードとドキュメントを一体管理できる

マークダウン形式でメモを任意の場所に残せるので、**「コード+説明」**の形で資料を作るのにも適しています。



# 実行環境の比較

Jupyter Notebookを利用する代表的な方法として、以下の2つを試してみました。

| 環境 | 特徴 |
|------|------|
| Google Colaboratory | 環境構築が不要で手軽に使える |
| VSCode + Jupyter拡張 | デバッグなどの開発機能が充実 |

結論としては、**VSCode + Jupyter** の方がデバッグがしやすく、開発体験が良かったため、個人的にはこちらをおすすめします。



## Google Colab

### 環境構築

驚くほど簡単です。以下にアクセスするだけで、すぐにPythonが実行できる環境が利用できます。  

https://colab.research.google.com/


### 入力補完

特に設定せずとも入力補完が効きます。初学者にとっても使いやすいです。


### ライブラリのインストール  

セル上で以下のように記述すれば、その場でライブラリをインストール可能です。

```python
!pip install <ライブラリ名>
```


### 環境変数の管理

`シークレット`という機能があり、OpenAIのAPIキーなどを安全に管理できます。


### デバッグ  

コマンドベースでのデバッグは可能ですが、GUIでのブレークポイント設定やステップ実行はサポートされていません。  



## VS Code + Jupyter

### 環境構築

以下の手順で簡単にセットアップできます。

1. `pip install jupyter` を実行
2. VSCode拡張機能「Jupyter」をインストール
3. `.ipynb`ファイルを新規作成して実行


### 補助機能

VSCode上で開発できるので、`Pylance`などの拡張機能によって、強力な入力補完や型チェックが利用できます。

### ライブラリのインストール

通常通り、ターミナルから `pip install` でOKです。  
セル内で `!pip install` と記述しても動作します。


### 環境変数の設定  

私は普段から `.env` ファイルと `python-dotenv` を併用しており、Notebook内でも同様の方法で問題なく使えています。

```python
from dotenv import load_dotenv
load_dotenv()
```

### デバッグ機能が強力！

これがVSCodeを選ぶ最大の理由です。

- GUIでブレークポイントを設定可能  
- `F10`キーでのステップ実行  
- 変数の中身をサイドバーで確認  
- 変数にカーソルを合わせるとポップアップ表示

デバッグ体験が非常に優れています。


## まとめ

Jupyter Notebookは、LangChainなどのライブラリを学ぶ際に非常に有用なツールです。

- サンプルコードを試しながら学べる
- ドキュメントとコードを一体で管理できる
- 特にVSCodeとの組み合わせが強力

学習や検証用に限らず、資料化やナレッジ共有にも活用できるので、導入がまだの方はぜひ試してみてください。
N-PrologにおけるCLP(FD)

# 未完成な完成
この一ヶ月間、N-PrologにおけるCLPFDに取り組んでいました。これはとても興味深い分野でした。制約論理プログラミングのことを知ったのは1980年代に手に入れたICOT関連の書籍からでした。
![bandicam 2025-05-18 12-29-16-514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/6619a3a1-f876-4d6f-bc6e-90906b110e59.jpeg)


SWI-Prolog、GNU-Prologには既に優秀なCLP(FD)が装備されているのですが、私はそれらを解析することはしないで独自に取り組みました。幸い、現在ではChatGPTのような優秀なAIが存在しています。大量の質問を浴びせかけることによりCLP(FD)の考え方を掴み、そして自分なりの方法論で実装することを試みました。この度、まずまず期待の動作をするようになりましたのでご紹介します。

# ラマヌジャンのタクシー問題を例にして
SWI-Prologをお手本にして文法、機能は同様にしました。（中身はかなり違うと思います）これで有名なラマヌジャンのタクシーナンバーを求めるコードを動かしてみます。

```prolog

taxi(Vars) :-
    Vars = [A1, B1, A2, B2],
    Vars ins 1..20, 
    all_different(Vars),
    A1 #< B1,
    A2 #< B2,
    N #= A1^3 + B1^3,
    N #= A2^3 + B2^3,
    label(Vars).

```

![2025-05-18 11-48-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/8c0ba62d-cd46-441a-ae4f-5b901fdfe571.png)

まずまずの実行性能をだすことができました。

# send more money を例として
次はよくあるsend_more_money 覆面算の例題です。

```prolog

send([S,E,N,D,M,O,R,Y]) :-
    Vars = [S,E,N,D,M,O,R,Y],
    Vars ins 0..9,
    all_different(Vars),
    S #\= 0,
    1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E
    #= 10000*M + 1000*O + 100*N + 10*E + Y,
    label(Vars).

```

この実行結果は次のようになります。とても遅いです。

![2025-05-18 11-53-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/ef0b5845-a1de-48ac-8bff-aabe644ec7c7.png)

SWI-Prologなどはヒューリスティックを応用して最適化、探索範囲を狭めています。一方、N-Prologはそうした最適化をまったくしていません。手動で改良することにします。

```prolog

send([S,E,N,D,M,O,R,Y]) :-
    Vars = [M,S,E,N,D,O,R,Y],
    Vars ins 0..9,
    all_different(Vars),
    S #\= 0,
    M #\= 0,
    1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E
    #= 10000*M + 1000*O + 100*N + 10*E + Y,
    label(Vars).

```

変数の順番を１つだけ変えました。Mを先にしています。たったこれだけでかなり速度が改善します。

![2025-05-18 12-02-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/7fe9376a-dd5e-47a2-b0ce-61f402300981.png)


さらに改善を試みます。桁上がりに注意しつつ各桁の整合性を制約式として織り込みます。

```prolog

send([S,E,N,D,M,O,R,Y]) :-
    Vars = [M,S,E,N,D,O,R,Y],
    Vars ins 0..9,
    all_different(Vars),
    S #\= 0,
    M #\= 0,
    (D+E) mod 10 #= Y,
    (((D+E) // 10) + N+R) mod 10 #= E,
    (((((D+E) // 10) + N+R) // 10) + E+O) mod 10 #= N,
    ((((((D+E) // 10) + N+R) // 10) + E+O) // 10) + S+M #= 10*M,
    1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E
    #= 10000*M + 1000*O + 100*N + 10*E + Y,
    label(Vars).


```

![2025-05-18 12-03-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/41de24f4-bc95-4e22-8957-dee250140978.png)

かなり改善しました。


# ヒューリスティックの学習題材として
私は前述のICOT関連書籍を読み直しました。p125に次の記述があるのを見つけました。


一般に、AIの問題領域における情報の部分性を計算モデルによって扱うためには、少なくとも以下の4つの要請を満たすプログラミング・パラダイムが必要である。
（１）プログラムは制約である
（２）計算は制約の変換である。
（３）組み合わせ的（combinatorial)な構造をもつ対象を扱う。
（４）計算の制御はヒューリスティックス（heuristics)による。


なるほど！ヒューリスティクスが必要なのだ！と納得し、N-Prologへ組み込むことも考えたのですが、いや、まてよ、あえて入れない方が学習用には良いと思えるようになりました。SWIのCLPFDは使うにはとても便利なのです。勝手に最適化してくれますので楽です。しかし、仕組みを理解しようとする立場からは完成度が高すぎるのです。そこでN-Prologは原始的な仕組みにしてあえてヒューリスティクスは入れないことにしました。学習用としてはこの方が面白いと思いました。


ということでN-Prologはver4.30を持ちまして一応の完成です。あとは細かなバグ修正、軽微な修正、拡張にとどまります。githubにて公開しております。

やり尽くしました！
https://github.com/sasagawa888/nprolog
【rails】devcontainer開発でbin/dev、bin/rails のbinを省略できる方法


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
Rails 開発において `bin/rails` や `bin/dev` のように、`bin/` ディレクトリを毎回コマンドに付けるのは、正直手間ですよね。

特に VS Code の devcontainer（「Reopen in Container」）を使っている場合でも、この省略方法を知っておくと開発効率が上がります。この記事では「なぜ bin/が必要なのか」と「省略する具体的な方法」をまとめます。

---

## なぜ bin/を付ける必要があるのか

Rails 5 以降、アプリの bin 配下に `rails` や `dev`、`rake` などの実行ファイルが自動生成されるようになりました。

```bash
bin/rails server
bin/dev
```

- プロジェクトごとにバージョン依存を管理するため
  グローバルな rails コマンドではなく、そのアプリ専用のバージョンで実行できるようにするためです。

- Binstub 経由の実行を推奨する流れ
  開発環境ごとの差異によるトラブル防止や、Bundler の恩恵を最大限に受けるためです。

---

## devcontainer での設定方法

VS Code の devcontainer 環境だと、コンテナを起動するたびに PATH の設定がリセットされる場合があります。
そこで、`devcontainer.json` の `postCreateCommand` を使って PATH 設定を自動化するのがベストです。

例：devcontainer.json

```json
"postCreateCommand": "echo 'export PATH=./bin:$PATH' >> ~/.bashrc"
```

#### 注意点

- `./bin` はカレントディレクトリに依存します。`~/.bashrc` や `~/.zshrc` に追加することでシェル起動時に自動で PATH が通ります。

- ログインシェルとして起動していない場合（ターミナルで source ~/.bashrc などを手動実行しない場合）、新しいターミナルで反映されることを確認してください。
NoteBookLMと技術書を活用した効率的な知識習得フロー

NoteBookLMを利用して技術書を読むのが捗りすぎたので、学習フローを説明します。

## NoteBookLM活用による学習フロー

*   技術書のPDFを用意する（正規の手段で入手したものを使用）
    * オライリー本などはオライリーのサイト経由で購入するとPDFを取得できます
*   PDFをNoteBookLMにアップロード![CleanShot 2025-05-18 at 11.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/019cc2f9-013a-4aa7-8925-e70458484885.png)
*   章ごとに音声を生成し、音楽プレイヤー等に保存
*   ながら時間に音声で大まかな内容を把握
*   NoteBookLMに章の要約をテキストで出力させる、ざっくりと概要把握![CleanShot 2025-05-18 at 11.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/9813de36-448e-435f-8656-35df7d57d947.png)
*   ここまでの準備を経て、書籍の本文を章ごとに読む
*   わからないところがあれば、NoteBookLMに質問する![CleanShot 2025-05-18 at 12.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/1913b84d-990a-4325-8bb9-565ef2f79ff2.png)
*   最後にNoteBookLMにその章のクイズを作成させ、知識の定着度を確認する。何回もやると良い

![CleanShot 2025-05-18 at 11.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/457cd50b-4508-4891-a024-7b108def3cd7.png)

![CleanShot 2025-05-18 at 11.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/11358b91-adca-4eb5-b449-7f41f541e5ae.png)

## 感想

多様な方法で情報に触れることで、インプットの回数を増やせるのが大変良い。
音声、要約テキスト、本文、クイズと、多角的に情報に接することで記憶に残りやすくなる。

NoteBookLMはできるだけソースから回答を出してくるため、ほぼハルシネーションは起こらず、ちゃんと学習できている感があるのも良い。(クイズの時は僕の自尊心を傷つけないように忖度するけど)

また、「分厚い本を読破しなければならない」という心理的負担が軽減される点もメリット。
最初は音声で概要を掴むことから始めるため、学習へのハードルがかなり下がる。
React CSSファイルをあてる

## 前回記事（環境構築）のつづき
https://qiita.com/Yuki-N-1016/items/797ea46c48780cbf8917

:::note warn
公開後にコメントをいただき、記載内容に誤りがあることがわかりました。参考にされる方は、最後のコメントのやりとりまでお読みください。
:::

## App.jsx に css をあてる
### 今回のエラーポイント
#### スクリーンショット
ブラウザ側で出たエラー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/4f858eb4-6cf1-4a4d-9133-346eec2c0817.png)

#### エラー発生時のコード
App.jsx
```jsx
import { useState } from 'react'
// ファイル名 "style.module.css"だとエラーが出る バージョンの違い？
import './custom.modules.css'
// import './App.css'

function App() {
  const [count, setCount] = useState(0)

  return (
    <div className="App">
      <h1 className='text1'>Hello World</h1>
      <h1 className='text2'>Hello World2</h1>
    </div>
  )
}
export default App
```


#### インストールした React のバージョン
package.json で確認すると、19.1.0 になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/62930ee1-e5b3-41fd-a447-46880afe18e7.png)

### やってみたこと
#### css のファイル名を変更してみた　
custom.mocules.css を、custom.css に変更して再度トライしました。

#### 結果
成功しました :tada:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/40d95313-f71b-46be-87c0-b7d63f2f9076.png)
### エラー解消時のコード
App.jsx
```jsx
import { useState } from 'react'
// ファイル名 "style.module.css"だとエラーが出る バージョンの違い？
import './custom.css'

function App() {
  const [count, setCount] = useState(0)

  return (
    <div className="App">
      <h1 className='text1'>Hello World</h1>
      <h1 className='text2'>Hello World2</h1>
    </div>
  )
}
export default App
```
customs.css
```css
.text1{
  color: red;
}

.text2{
  color: blue;
}
```
### 結果から逆算して得られた結論
:::note warn
学習記録のため残していますが、記載内容に誤りがあります。コメント欄にて訂正しています。
:::

React の最新バージョン（19.1.0）では読み込ませたい css ファイル名を、"〇〇.css" にする必要がある。"〇〇.〇〇.css" にするとエラーになる。
【初心者向け】Linuxの基本コマンド

## はじめに
Linuxを触り始めたばかりの方へ向けて、最低限覚えておきたい基本的なコマンドをまとめました。  
ターミナルでの操作が少しずつ楽しくなるはずです！
- OS：AlmaLinux / CentOS / Ubuntu など（基本コマンドは共通）
- シェル：bash
- ユーザー権限：一般ユーザー（必要に応じて `sudo` 使用）

## ファイル・ディレクトリ操作
### ディレクトリの作成/削除
```bash
# ディレクトリの作成
mkdir ディレクトリ名

オプション
-m パーミッションを指定
-p 親ディレクトリも同時に作成

# ディレクトリの削除
rmdir ディレクトリ名

オプション
-p 親ディレクトリごと削除
※親ディレクトリ内も空でなければ削除できない
```

### ディレクトリ・ファイルの移動
```bash
# ディレクトリを移動
cd ディレクトリ名 or オプション

オプション
/ ルートディレクトリ
.. 親ディレクトリ
~ ホームディレクトリ

# ディレクトリ・ファイルを移動させる
mv 移動元 移動先

オプション
-b ファイルを上書きする際にバックアップを作成
-f 無条件に上書き
```

### ディレクトリ・ファイルの表示
```bash
# ディレクトリ・ファイル情報の確認
ls [ファイル名/ディレクトリ名]

オプション
-i ファイル名の左にinode番号を表示
-r 逆順にソート
-R ディレクトリ内をすべて表示
-l ファイルの詳細情報を表示

# ls の省略
ll

# 現在のディレクトリ表示
pwd
```

### ディレクトリ・ファイルのコピー
```bash
# ディレクトリのコピー
cp コピー元ファイル名 コピー先ファイル名

オプション
-p コピー元の情報を保持してコピー
-r ディレクトリを再帰的にコピー
```

### ファイルの中身の確認
```bash
# ファイルの中身確認
cat ファイル名

オプション
-b 初めの行を1目目として、空白行以外に行番号をつける
-n 初めの行を1行目として、すべての行に行番号をつける

# ファイルの中身をスクロール形式で表示
less ファイル名

# 最終行で自動的に終了
less -e
```

### ディレクトリ・ファイルの削除
```bash
rm ファイル名 or ディレクトリ名

オプション
-f 警告メッセージを表示しない
-i ファイルを削除してよいか確認
-r ディレクトリを中身ごと削除
```

### 空ファイルを作成
```bash
touch ファイル名
```

### ユーザ関連コマンド
```bash
# ユーザIDを確認
id [ユーザ名]

# ユーザの切り替え
su [ユーザ名]

# rootユーザへの切り替え
su -

# ユーザの作成
useradd [ユーザ名]

オプション
-d ホームディレクトリ名　ホームディレクトリ名を指定する
-g グループ名　　　　　　ユーザのプライマリグループを指定する
-G グループ名　　　　　　ユーザのサブグループを指定する
-u ユーザID　　　　　　　ユーザのユーザIDを指定する

# ユーザのパスワード設定
passwd [ユーザ名]

# ユーザの削除
userdel [ユーザ名]

オプション
-r ユーザのホームディレクトリも同時に削除
```

### グループ関連コマンド
```bash
# 所属グループ確認
groups [ユーザ名]

# グループの作成
groupadd [グループ名]

オプション
-g グループID  グループIDを10進数で指定

# 所属グループの変更
usermod [ユーザ名]

オプション
-d ディレクトリ　ユーザのログインディレクトリを変更
-u ユーザID　　　ユーザのユーザIDを変更
-g グループ名　　ユーザのプライマリグループを変更
-G グループ名　　ユーザのサブグループを変更（-G指定には-aGとする）

# グループの削除
groupdel グループ名
```

### 権限関連コマンド
```bash
# ファイルの所有者・グループの変更
chown 所有ユーザ[:所有グループ] ファイル名/ディレクトリ名

オプション
-R ディレクトリとその中のファイルを再帰的に変更

# 所有グループの変更
chgrp 所有グループ  ファイル名/ディレクトリ名

オプション
-R ディレクトリとその中のファイルを再帰的に変更

# パーミッションの変更
chmod モード　ファイル名/ディレクトリ名

オプション
-R ディレクトリとその中のファイルを再帰的に変更
```

### その他のコマンド
```bash
# リンクを作成
ln ターゲット リンク

オプション
-s シンボリックリンクを作成

# ファイルの作成/修正
vi [ファイル名]

オプション
-b バイナリモードで編集
-R 読込専用モードでファイルをオープン

# ファイルの圧縮
zip 圧縮ファイル名 ファイル名

# ファイルの解凍
unzip ファイル名

# Red Hat系のパッケージ管理コマンyum
yum [サブコマンド] [パッケージ]

サブコマンド
install パッケージをインストール
check-update remove パッケージをアンインストール
update パッケージをアップデート
list インストール可能なパッケージを一覧表示
info パッケージの情報を表示
clean パッケージと古いヘッダーを削除
```
AIウェブ検索はデジタルマーケティングの新たな時代

人工知能（AI）が人と情報の最初の接点となりつつある今、企業は新たな課題に直面しています。それは、人間だけでなく機械にもWebプレゼンスを最適化することです。具体的には、OpenAIのChatGPTのような大規模言語モデルに対して、自社がどのように表示されるかを考慮する必要があります。ChatGPTは、何百万人もの人々が回答、レコメンデーション、調査に利用しています。AI検索の時代へようこそ。

Google時代に検索エンジン最適化（SEO）が企業のデジタルビジビリティへのアプローチに革命をもたらしたように、今、同様の変化が起こっています。その違いとは？Webページをインデックスするために設計されたアルゴリズムをターゲットにするのではなく、企業は会話型AIにとって発見されやすく、関連性のある情報になる方法を検討する必要があるということです。

## 検索エンジンとしてのAIの台頭
ChatGPTのようなAIモデルは、消費者や専門家が製品比較から法的アドバイスまで、様々な意思決定に利用しています。そのため、企業はAIが生成した回答に自社の情報が表示されるようにすることが非常に重要です。 OpenAIは現在、ChatGPT内での有料広告や直接広告の掲載を許可していませんが、可視性を高めるための正当かつ戦略的な方法は依然として存在します。

AIモデルによって発見され、言及される可能性を高めるために企業が実行できる4つの実践的なアプローチをご紹介します。

### 1. 高品質で構造化されたウェブサイトを構築する
AIによる発見の基盤となるのは、企業のウェブサイトです。ChatGPTのような言語モデルは、主に公開されている膨大なデータコーパスに基づいて応答を生成します。ウェブサイトが適切に構造化され、コンテンツが豊富で透明性が確保されていれば、AIによって理解され、参照される可能性が高くなります。

具体的には、以下の点が挙げられます。

- 明確な見出しと論理的なコンテンツ階層（適切なHTMLセマンティクスを使用）。
- ボットがサイトをインデックスできるようにするためのサイトマップ。
- モバイル対応と高速な読み込み時間。
- 安全なブラウジングのためのHTTPSの使用。
SEOと同様に、目標は自動システムがサイトを解析しやすくすることです。クローラーからコンテンツを隠すJavaScriptフレームワークの過剰な使用は避けましょう。代わりに、重要な情報については静的またはサーバー側でレンダリングされたページを活用しましょう。

### 2. 専門的でエバーグリーンなコンテンツを公開する
コンテンツマーケティングは、AI時代においても強力なツールであり続けます。詳細なガイド、ハウツー、FAQ、解説記事は、サイトが人々の参考資料として、そして場合によっては公開ウェブデータでトレーニングされたAIモデルによっても利用される可能性を高めます。

重点を置くべき点：

- 特定の問題を解決する、信頼性が高く独創的なコンテンツを作成すること。
- 人々が質問する方法に沿った自然言語を使用すること。
- 顧客がAIツールに入力する可能性のある一般的な質問に回答すること。
例えば、ファイナンシャルアドバイザーは「フリーランスとして退職プランを選ぶ方法」に関する包括的な記事を書くことができます。このようなコンテンツが広く読まれたり、リンクされたりすれば、AIシステムが関連する質問に答える際に、その情報を吸収し、思い出す可能性が高まります。

### 3. 評判の良いプラットフォームやディレクトリに掲載する
間接的ではあるものの効果的な戦略として、頻繁に引用・参照されるサードパーティのサイトに自社の情報を掲載することが挙げられます。Googleビジネスプロフィール、権威のあるディレクトリ、業界特化型のプラットフォームなどが挙げられます。

これらのプラットフォームは権威があるとみなされており、AIが利用するデータランドスケープの一部となることがよくあります。住所、レビュー、サービス内容など、企業に関する構造化された公開情報が掲載されていることが多く、まさにAIが自社のビジネスを文脈化する際に役立つコンテンツです。

アーンドメディアの力も見逃せません。ニュース記事、ブログ記事、業界概要などで自社が言及されれば、デジタルフットプリントが強化され、AIが企業を「認識」する可能性が高まります。

### 4. カスタムGPTを作成するか、パブリックAPI経由で統合する
技術に精通したチームやデジタル製品を持つ企業には、より実践的なアプローチがあります。OpenAIのGPTビルダーを使用してカスタムGPTを開発しましょう。企業は、自社の専門知識、製品、またはサービスをアピールする、カスタマイズされたAIエクスペリエンスを作成できます。

例えば、法律事務所は、基本的な法的ガイダンスを提供するGPTを開発し、権威ある存在としての地位を確立できます。また、旅行代理店は、自社のサービスに基づいて旅行プランを推奨するGPTを作成できます。

さらに、製品やサービスがパブリックAPIを備えている場合、またはChatGPTが使用するツールと統合されている場合、これらのプラットフォームを通じて間接的に発見される可能性があります。AIエコシステムで使用されている一般的なツールと相互運用可能なテクノロジーを構築することは、戦略的な動きです。

## AIの可視性に関する倫理と限界
AIにおける可視性は広告とは異なることに注意する必要があります。OpenAIは、モデル出力におけるバイアス、プロモーション、またはスポンサーシップを防止するための厳格なポリシーを定めています。その目的は、回答を有用でバランスの取れたものにし、商業的な影響を受けないようにすることです。

つまり、企業はオンライン検索でのプレゼンスを向上させることはできますが、検索広告やソーシャル広告のように掲載枠を「買う」ことはできません。これにより、競争の場が平等になり、信頼性、関連性、有用性が重視されます。

## AI主導のディスカバリーの未来に今すぐ備えましょう
人々が情報を検索する方法は急速に進化しています。AIが意思決定の最前線ツールとなるにつれ、強力で透明性が高く、価値の高いウェブプレゼンスに投資する企業が恩恵を受けるでしょう。

AIをブラックボックスや脅威と捉えるのではなく、明確さ、構造、有用性を評価する新しいタイプのユーザーとして考えましょう。戦略的なコンテンツ、堅牢なウェブインフラ、信頼できるプラットフォームとの統合、あるいは独自のAIツールの開発など、AIによる可視性への道は今日から始まります。

未来のデジタル環境では、AIによるディスカバリーは今日のSEOと同じくらい重要になる可能性があります。賢明な企業は、今からその未来への準備を始めましょう。(出典:[日本ポップニュース](https://www.japanpopnews.com))
Agent Development KitのセッションがDBに作成するスキーマを調べてみた

## 個人的チャットアプリで大変な部分ランキング！！！

1. スレッド管理
1. LLMコンテキスト管理
1. 長期記憶の実装

### スレッドを作るのは割と大変
チャットアプリで当たり前のように使われる単位、スレッド。
正直大変じゃないですか？
- DBからどれだけ読み出すのか
- LLMにどの様に渡すか
- 忘れられると困る情報は何か

この**非機能要件**ともいえる会話の継続性について、最適なバランスを見つけることは大変です。
それをマネージしてくれるサービスとして、OpenAIのAssistant APIが有力でしたが、Googleが開発したAgent Development Kitではセルフマネージも可能だったので調べてみました。

### ADK(Agent Development Kit)のスレッド管理

呼称はセッションですが、実質的にコンテキストを包括的に管理し終了すると破棄されるスレッドのようなものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/a8faafed-5c8c-4a04-ba75-da5bd509b8f3.png)

https://google.github.io/adk-docs/sessions/session/#managing-sessions-with-a-sessionservice

セッションは`InMemorySessionService`、`DatabaseSessionService`、`VertexAiSessionService`から選ぶことができ、GCPでデプロイするなら`VertexAiSessionService`を使うことで費用を抑えることができそうです。
Google Agent Engineにデプロイされ、計算時間に応じた従量課金となります。

https://cloud.google.com/vertex-ai/generative-ai/docs/agent-engine/overview?hl=ja

しかし、`DatabaseSessionService`でセルフマネージすることも可能です。
DB接続情報を与えるだけでスレッド管理ができるようになってしまうのですね。素晴らしいです。

## postgreSQLでやってみた

pgadminでER図を出してみました。

```py
Runner(
    app_name="test",
    agent=agent,
    artifact_service=InMemoryArtifactService(),
    session_service=DatabaseSessionService(
        db_url="postgresql://postgres:postgres@db:5432/postgres",
    ),
    memory_service=VertexAiRagMemoryService(),
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/478824bb-a92e-471a-9844-4948e8853a36.png)

良い感じですね。ブラックボックス感がないことはいいことです。
Visual StudioとVSCodeのAgentモードを触ってみて思ったこと

# Agentモードの理解
最近、AIのAgentモードが話題になることが増えてきた。でも、自分の主戦場であるVisual Studioへの導入は、少し遅れているように感じていた。とはいえ、時間の問題だと思っていたので、「使えるようになったら試してみるか」という程度の心持ちだった。実際には、Agentモードの本当の魅力はまだ知らなかった。これは4月ごろの話。MCPサーバーにも興味を持ち始めていて、「あれ？MCPサーバーとAgentモードって何が違うんだっけ？」というような曖昧な理解しかなかった。

# 5月、AIと少し大きなタスクに挑戦
5月、自分にとっては少し大きめ（といっても2〜3日あれば終わるような）タスクを、AIと一緒にこなしてみようと考えていた。しかし、何度か失敗が続き、しびれを切らしてVisual Studio CodeのAgentモードを試してみることにした。ただ、自分にとってC#を書く場所はあくまでVisual Studio。VS Codeはただのテキストエディタだと思っていた。テキストエディタに自分のリソースをプッシュするくらいなら、IDEに全振りした方がいい。たぶん、そんなふうに20年くらいやってきた。「コードを書く場所はIDEであり、エディタではない」。それは自分の中では、もはや信念に近い感覚だった。

# IDEからの乗り換えという葛藤
でも、AIの進化という観点から見ると、Visual Studio Codeの方がずっと先を行っているように見える。今回は「コードが書きたい」ではなく「AIと一緒にコーディングがしたい」だった。そう考えると、VS Codeを使うのが正解だったのかもしれない。とはいえ、自分の中ではこれは「宗教を変える」くらいの出来事。C#をVS Codeで書くことには、かなり強い抵抗感があった。それでも「やりたいことの趣旨が違う」と割り切って、意を決して使ってみた。

# 実際に使ってみた感想
Visual Studio CodeのAgentモードを初めて使ったときの感想は、**「ここまでやられたら、ちっとも面白くない」** だった。AIに聞きながらコピペしていた時期は、まだ「ペアプロをしている」という実感があった。でも、Agentモードはビルドもするし、エラーも直すし、必要なコードはすべて出してくれる。「え、もう僕いらないじゃん……」というのが率直な印象だった。正直、**「コードを書く楽しさが吹き飛んだ」** とすら思った。ただ見ているだけ。それが面白いはずがない。

一方で、何度かうまく作れなかった部分をAIがスッと解決してくれたのは、本当に衝撃だった。3日くらいかかると思っていたことが、ほんの数分で終わる。これが今後さらに進化すれば、1週間かかるタスクも数分に、1ヶ月かかるようなタスクも数秒で終わる未来が来るかもしれない。その未来では、「コードを書く」という、最大の楽しみがなくなってしまうのではないか——。そんな予感すらして、怖くなった。

# Visual StudioのAgentモードを使ってみた
そうしているうちに、Visual Studio 17.14.0で待望のAgentモードが実装された。「ついに来た！」と思ってすぐに使ってみたけれど、正直言ってがっかりだった。思っていたような動作はしてくれない。コードの途中で会話が終わり、続きを促しても何も返ってこない。「これでどうしろと……？」というのが率直な感想だった。VS Codeと比べると、まさに月と鼈（すっぽん）。同時に使ってみても、比較にならなかった。プレビュー段階とはいえ、現時点では正直、使い物にならないと感じた。

# それでも驚いたこと
今回、久々にVS Codeを本格的に使って、その進化には本当に驚いた。特に予測変換の精度がすごい。コードだけでなく、コメントすらも的確に提案してくれる。VSしか触ってこなかった自分には、「え、これもう人にコード書かせる気ないでしょ？」と思えるレベルだった。Visual Studioは最強のIDEだと思っていたけれど、それはあくまで「人間がコードを書く」前提に立っている。でも今後、「AIがコードを書く」ことが前提になるなら、VSの巨大さはむしろ足かせになるかもしれない。

# 今後について思うこと
今、VS拡張を作るのもかなり大変。それだけ、下回りが巨大化しすぎていると感じる。AIコーディングが中心になった未来では、今は右端に控えているアドバイザーが、IDEの中でどんどん領域を拡大していくだろう。それが「最大面積」になる頃には、IDEとして必要な要素はどんどん減っていくのかもしれない。

# それでもVisual Studioが好き
何度でも言いたい。自分はVisual Studioが大好きだ。自分にとってVSは、最強のIDEであり、最高のパートナー。
プログラムを書く体験をこの上なく楽しいものにしてくれる存在だ。20年以上、ずっと支えてくれたこのツールには、感謝しかない。本気で、「自分が死んだら棺に入れてほしい」と思えるくらい。それくらい大好きだけど、それでもやっぱり今後の進化を見据えると、**コードを書くツールとしては、テキストエディタで十分なのでは？** と思ってしまう自分がいる。そして、テキストエディタの進化の方が圧倒的に速いとも感じている。

もちろん、これはマイクロソフトのリソース配分やAIの進化方向によって変わることだ。でも、「IDEがなくなる未来」 というものを考えると、今のうちにこの感情をどこかに残しておきたいと思って書いた。さて、どうなるだろうか。
SQLとは

# SQLとは
- **データベースを操作するための言語**
- リレーショナルデータベースにデータを格納、検索、更新、削除するための命令文を記述する
- データベース言語の中で最も普及している言語
- SQLが使用できるのは、**リレーショナル型**のデータベース

# リレーショナルデータベース
- データを表形式（テーブル）で管理する
- 複数の表を持ち、行（レコード）と列（カラム）の2つの要素によって構成されている

|||
|---|---|
|メリット|共通の属性によって複数のデータを関連づけるなど、柔軟なデータ処理が行える|
|デメリット|負荷が大きくなりやすく、データが膨大になると処理速度が遅くなる|

# 参考
https://hnavi.co.jp/knowledge/blog/sql/
ダッシュボードのエラー

+ [レポート、ダッシュボードを開いた時のエラー](https://qiita.com/Keiji_otsubo/items/acfb1e49d3ece31a0e82)

+ [The type of the source report is based on a type to which the current dashboard user does not have access.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000OqESr)

:::note
see this as well - https://salesforce.stackexchange.com/questions/229348/the-source-report-is-based-on-a-report-type-that-is-inaccessible-to-the-dashboar
:::

+ [Customize the "No Data" Message on a Dashboard Component](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfBFw)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7e26dbec-b90a-b008-b822-ee203fa8da10.png)

:::note
Please check this article.

https://ideas.salesforce.com/s/idea/a0B8W00000H4LtXUAV/customize-the-no-data-message-on-a-dashboard-component
:::

+ [We can't draw this chart because there there is no data](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KWz4O)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8cthSAB

https://issues.salesforce.com/issue/a028c00000qPxDyAAK/lightning-experience--dashboard-table-component-showing-no-data-in-lightning
:::

+ [このユーザーでは、データを参照する権限がありません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ut99h)

:::note
「チームのダッシュボードの表示」権限を削除 　をするとまた違うエラーが出るので

「すべてのデータの表示」権限を付与する しかなさそうです。。。

SFのヘルプをみてもデータの表示に関してはあまり記述がないので、付与してしまってもよさそうです。
:::

+ [標準プロファイル「最小アクセス - Salesforce」を複製し、組織内のユーザに割り当てました。ダッシュボードを編集および作成するためのアクセス権を付与しようとしましたが、ダッシュボードをプライベート フォルダーまたはパブリック フォルダーに保存した後、ユーザーに [編集] ボタンが表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiV2z)

:::note
編集ボタンを表示するには、以下の権限を与える必要がありました。

翻訳の管理
セットアップと構成を表示する
アプリケーションのカスタマイズ
:::

+ [ダッシュボード検索条件／次の値の間が表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epoyy)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/954a1263-ed2c-0518-47f7-1ad1b3bd911f.png)

:::note
キャッシュクリア、シークレットウィンドウでは状況変わらずだったのですが、
ログインし直したら出現しました。。
:::

+ [【ヘルプ】レポートとダッシュボードを含む変更セットをアップロードできません](https://help.salesforce.com/s/articleView?id=000387518&type=1)

+ [【未解決】管理者以外のユーザーは、ホームページでダッシュボードを選択できません。 ダッシュボードをデフォルトとして設定したり、ユーザーがホーム画面に表示するダッシュボードを選択できるようにするにはどうすればよいでしょうか。 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000NQUa)

+ [他のユーザーが作成したダッシュボードを編集できない。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifq9H)

:::note
次のユーザーとしてダッシュボードを参照を変更したらできたらしいですが、何に変更したのでしょうかね。

This worked for me without "Manage Dynamic Dashboards," I think the "View As Me" change was the trick(
これは「動的ダッシュボードの管理」なしでうまくいきました。「ビュー・アズ・ミー」の変更がトリックだったと思います)

https://ideas.salesforce.com/s/idea/a0B8W00000Gdmr8UAB/edit-dashboards-created-by-different-user-with-manageedit-permissions
:::

# Your dashboard subscription to <Name of dashboard> has been interrupted

+ [Question about interrupted subscription to dashboards "Your dashboard subscription to <Name of dashboard> has been interrupted"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SW61C)
ニコニコ生放送のタイムシフト放送をダウンロードする (Streamlink 2.3.0)

2025年5月18日時点の情報です。
使用ツール: https://streamlink.github.io/

## Streamlink をインストールする

公式サイトへアクセスし、Streamlink をインストールしてください。

[Streamlink documentation - Installation](https://streamlink.github.io/install.html)

こちらの環境は Windows 11 Pro で、 WinGet (Windows Package Manager) がインストールされているので、winget コマンドでインストールしました。

```powershell
winget install streamlink
```

## Cookie 情報を取得する

ニコニコ生放送へのログイン情報は、ブラウザの Cookie に保存されています。
ニコニコ生放送のサイトを開き、ブラウザの開発者ツールから Cookie 情報を取得してください。

具体的には、下のサイトを参考に、`https://live.nicovideo.jp/` の Cookie `user_session` の値を取得します。

https://qiita.com/kapiecii/items/787cb6c9c8c2d700f942

```:user_sessionの例
user_session_1234567_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
```

開発者ツールを使わずに、各ブラウザの `Cookies.txt` をダウンロードする拡張機能を使って確認する方法もあります。

* Chrome
    * https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?pli=1
* Microsoft Edge
    * https://microsoftedge.microsoft.com/addons/detail/export-cookies-file/hbglikhfdcfhdfikmocdflffaecbnedo
* Firefox
    * https://addons.mozilla.org/ja/firefox/addon/cookies-txt/

## ダウンロード実行

取得したいニコニコ生放送の URL と、先ほど取得した user_session の値を使って、次のコマンドを実行します。
動画ファイル `foobar.mp4` として保存されます。

```powershell:ダウンロードコマンド (長いので見切れているため注意）
streamlink "https://live.nicovideo.jp/watch/lv123456789" best --niconico-user-session user_session_1234567_1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef --output foobar.mp4
```

## あとがき (nicolive-dl 他の話題)

ニコニコ生放送のタイムシフト放送をダウンロードしたくなったのですが、最初に見つかった方法は [nicolive-dl](https://github.com/kairi003/nicolive-dl) でした。
ただ、なぜか次のようなエラーが出てうまくダウンロードできなかったので、他の方法を探すことになりました。もしかしたら、ニコ生の仕様が変わったのかもしれません。

```
[https @ 000002189d9bda00] HTTP error 403 Forbidden
[in#0 @ 000002189d99e680] Error opening input: Server returned 403 Forbidden (access denied)
Error opening input file https://assetdelivery.dlive.nicovideo.jp/hls/vod/682846ce8f11a4e9d9b93e29/playlists/variants/da074bd0c0526ff2.m3u8.
Error opening input files: Server returned 403 Forbidden (access denied)
```

参考リンク：

https://github.com/kairi003/nicolive-dl

https://qiita.com/kairi003/items/62a487a2ab786cb0f502
AWS認定試験 SAP 合格体験記（2025年5月）

## AWS認定試験 SAP 合格体験記（2025年5月）

### はじめに

2025年5月17日、AWS認定試験の中でも最難関と言われる「SAP（AWS Certified Solutions Architect – Professional）」に合格しました。

この試験は **設問も選択肢も非常に長く、集中力と読解力が問われる** 難易度の高い試験でした。正直、受験中はかなり疲弊しましたが、最終的に合格できたのは **CloudTechの問題集** のおかげだと思っています。

ここでは、自分の学習方法や使用したサービスについて、あくまで体験ベースでご紹介します。

---

## 学習方法について

### CloudTechの問題集を繰り返し解く

私が実践した独自の学習方法は以下の通りです。

1. **CloudTechのSAP問題集を繰り返し解く**
2. **9割以上の正答率を安定して出せるまで繰り返す**
3. **間違えた問題には必ず戻って、なぜ間違えたかを解説と構成図で理解する**

特に、CloudTechの特徴である **「設問を表した解説図・構成図」** は、文章だけではイメージしづらい構成やユースケースを **視覚的に理解するのに非常に役立ちました** 。これにより、単なる暗記ではなく、**設問の背景を理解しながら学習できる点** が他の教材との大きな違いでした。

---

## CloudTechを使って感じた特徴

#### 実際に使用してみて、以下のような特徴が印象に残りました。

- **1発合格率が90%（2023年アンケート調査）** という実績は伊達ではなく、問題の精度が非常に高い
- **本番試験の出題傾向に非常に近い問題構成**
- **全資格（12種類）に対応** しており、将来的に他資格も視野に入れている人にとっても安心
- **解説が丁寧で、図解が豊富** なため、理解ベースの学習が可能
- **会員数7,000名超え** という安心感と信頼性
- **料金体系が柔軟（サブスク or 買い切り）**

### 料金体系の選び方

- **AWS認定資格の取得が目的の方：資格会員**
- **資格取得後も実務的にAWSを学びたい方：基本会員 or 永久会員**

私自身は永久会員なので、レッスン動画などで学習をしたいと考えています。

---

## おわりに

今回のSAP試験は、**CloudTechなしでは乗り越えられなかった** と思っています。特に、**長文読解に慣れる訓練** として問題集を繰り返し解くことはとても重要です。

CloudTechは合格したら **お祝い金の進呈制度** があり、今回もそれを受け取りました。**お祝い金は500円〜3000円** で、試験費用の足しになるためお勧めです。

もしこれからAWS認定資格を目指す方がいれば、**CloudTechはかなり有効な選択肢の一つ** だと思います。

お勧めなので、もし興味があれば **クーポンで安くなるみたいです** ：

**クーポンコード：CloudTech-KK**

---

### まとめ

- **SAP試験は設問が長く、集中力と理解力が必要**
- **CloudTechの問題集を繰り返し解くことで実力が定着**
- **図解が多く、単なる暗記ではなく構成を理解できる**
- **高い合格率と信頼性のある教材**
- **合格後のお祝い金制度も嬉しい特典**
- **クーポンでお得に始められるのも魅力**

これから受験される皆さんの合格を応援しています。
音源分離AIについて

オープンソースでいい感じの音源分離AIないかなーと思い
探してみたらあったのでメモ
ボーカルとBGMをわけられる。

# Demucs
#### ライセンス
MIT License
#### GitHubリポジトリ
https://github.com/facebookresearch/demucs
#### ブラウザで試せる場所
https://huggingface.co/spaces/abidlabs/music-separation

#### 主な機能
上記のHuggingFaceでは利用できないが
本来は以下のように楽器別に音源分離できる。
Demucs v4 本来の分離機能（モデルの公式仕様）
2 stems: vocals / accompaniment
4 stems: vocals / drums / bass / other
5 stems: vocals / drums / bass / piano / other

2025年5月18日現在、フル機能をブラウザ上で試せる場所は見つからなかった。

#### Macで使う方法
一括でセットアップできるBashファイルを以下リポジトリに置いておいた。
使い方も記載した。

https://github.com/hiroki-abe-58/demucs-apple-silicon-setup/tree/main


# Spletter
#### ライセンス
MIT License
#### GitHubリポジトリ
https://github.com/deezer/spleeter
#### ブラウザで試せる場所
https://spleeter.online/

こっちはまだ試してない
Power AppsからExcel帳票へ転記

## 緒言
Power Appsが普及しても数多く残るExcel帳票。Appsで入力したデータを基にPower Automate経由でOffice ScriptsをキックしてExcel帳票へ転記する方法について。

## デモ実装
### デモExcel帳票
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/2028b029-0f42-4458-9c9a-af56875334a8.png)

転記用Office Scripts例。Appsからの引継ぎデータが大量にある場合はJSON形式にする等の工夫必要。

```
function main(
  workbook: ExcelScript.Workbook,
  textParam1: string,
  textParam2: string
) {
  // アクティブシートを取得
  let activeSheet = workbook.getActiveWorksheet();

  // セル "C3" に textParam1 を挿入
  activeSheet.getRange("C3").setValue(textParam1);

  // セル "C5" に textParam2 を挿入
  activeSheet.getRange("C5").setValue(textParam2);
}
```


### デモアプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/07b77ce8-47b0-414d-b46b-e61d8804981c.png)
ボタンのOnSelectで↓フロー実行

```
AppsToExcel.Run(TextInput1.Text,TextInput1_1.Text)
```

### デモフロー
スクリプト実行してコンテンツ取得してメール配信する。スクリプト実行の競合が心配だったりする場合は事前コピーなどで対処。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/0262d75a-777a-4d89-9afd-a4899d6299ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/01cf5aa9-e8dd-49a6-92c9-3fbe97892ec0.png)

## 結言
スクリプトはAI先生に聞けばほぼ正解作ってくれますね。ありがたや。
gitの作業エリア・ステージング・コミットでの動きはこれだけ覚えておけばいい

# はじめに
gitでファイルを作業エリア（Work）からステージングエリア（Staging）に追加し、コミット（Commit）するだけなら`git add`と`git commit`だけで事足りるのですが、ステージングエリアからファイルを戻したり削除したりすると、作業エリアとステージングエリアでファイルがどういう状態になっているか混乱したため整理。

# gitの基本コマンド
作業エリア、ステージングエリア、コミット履歴を行き来する際の基本的なコマンドのまとめになります。

## まずはaddとcommit
緑枠がgitコマンド。`git`やオプションは省略しているので適宜読み替えること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/726ffe32-0882-45c7-b092-acbee015ece2.png)

## diffで隣同士を比較
`git diff`は作業エリアとステージングエリア、もしくはステージングエリアとコミット履歴の比較を実施する。
`--staged`オプションの有無でお隣さんの位置が変わるが隣同士のdiffをとるのは一緒。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/74b871e0-7a13-47be-bca4-b3b3cb0626c4.png)

## resetでaddをなかったことに
resetコマンドはaddでステージングエリアに登録した情報を削除する。
削除されるのはステージングエリアの変更だけで、作業エリアのファイルには影響ない。
うぁーこんなところで`git add`なんかするんじゃなかった・・・とaddしたことを反省する際に利用するコマンド。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/7dc9c3dc-e9dd-4b64-941a-1fcbbc585437.png)

## restoreはやらかした過ちを消し去りたいとき
restoreは自分がやった変更や修正を無かったことにしたい時、隣にある情報から引き戻す。
人に見せたくない恥ずかしい修正をやらかしてしまい、なかったことにしたい場合に利用する。コミット前なら他の人に見られることはない。
`git checkout -- A`でも`git restore A`と同じことができるけど、無理に色々覚える必要ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/8050be85-9f54-4b67-b8b2-fa92f430a084.png)

## rmはコミットまでやってしまった恥ずかしい情報を消したいとき
ログには残るがコミットした情報を消したい時に利用。
`-f`や`--cached`オプションつけると、作業エリアやステージングエリアで削除しないようにできるが、コミットしたファイルを消すのがメインなので省略。
`git rm`で注意するのは、`消したいファイルをないものとしてコミットする`ということ。
下記の例では、`git rm A`で作業エリアとステージングエリアの両方からAファイルが消える。しかしコミット履歴にはAの情報が残っている。ここでコミットすると、ステージングエリアにAファイルが存在しないのでコミット履歴から消える。
やっぱ消すのやーめた、と気が変わった場合はrestoreで戻せる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/4d2181db-84ad-44d2-b8bb-043ab6b7f615.png)

# さいごに
リモートとPush/Pullしたり、ブランチ切り替えの内容は含んでいませんが、git使う際の基本の動きの整理ということで。
TypeError: Cannot read properties of undefined (reading 'pipe')


Angular 17 + NgRx 15 で発生したエラー
```
TypeError: Cannot read properties of undefined (reading 'pipe')
```


は フィールド初期化子がコンストラクタの依存注入より先に評価される という順序の落とし穴が原因。inject() を使って依存を先に解決することで解消できます。

# 1. 目的

本ドキュメントは、同種の初期化順序バグをチーム全体で共有し再発を防止することを目的とします。エラーの再現条件、根本原因、解決策、そしてバージョン依存性を整理しました。

# 2. 発生したエラー

2.1 実際のスタックトレース

```javascript
main.ts:7 TypeError: Cannot read properties of undefined (reading 'pipe')
    at auth.effects.ts:19:19
    at createEffect (ngrx-effects.mjs:85:47)
    at <instance_members_initializer> (auth.effects.ts:18:12)
    at new _AuthEffects (auth.effects.ts:12:3)
    at Object.AuthEffects_Factory [as factory] (auth.effects.ts:64:24)
    at core.mjs:2243:35
    ...（以下略）
```

2.2 発生環境

| ライブラリ | バージョン |
|:-:|:-:|
| Angular  | 17.0.x |
| @ngrx/effects  | 15.3.x |
| @ngrx/store | 15.3.x | 
| TypeScript | 5.4.x |

# 3. 原因分析

3.1 フィールド初期化子 vs パラメータプロパティ

TypeScript は クラスフィールド初期化子 をコンストラクタの 冒頭 に展開します。

一方、コンストラクタの パラメータプロパティ はその後で this.x = x を実行します。

したがって、下記のような順序になります：
```typescript
constructor(private actions$: Actions) {}

login$ = createEffect(() => this.actions$.pipe(...));

// 生成されるおおよその JavaScript
constructor(actions$) {
  this.login$ = createEffect(() => this.actions$.pipe(...)); // ← undefined 参照
  this.actions$ = actions$; // 後から代入
}
```

3.2 NgRx createEffect の実装詳細

NgRx v15 以降では メタデータ収集時に sourceFactory() が即時実行 される。

そのためフィールド評価の段階で this.actions$ が未定義だと、undefined.pipe 例外が即発生する。

# 4. 解決策（変更点）

4.1 inject() による依存解決

```typescript
import { inject, Injectable } from '@angular/core';

@Injectable()
export class AuthEffects {
  private actions$ = inject(Actions);   // ① 先に確定
  private auth     = inject(AuthService);
  private router   = inject(Router);

  login$ = createEffect(() => {
    return this.actions$.pipe(/* ... */);
  });                                   // ② 依存が揃った後に実行
}
```

4.2 Before / After Diff

```typescript
- constructor(
-   private actions$: Actions,
-   private auth: AuthService,
-   private router: Router
- ) {}
-
- login$ = createEffect(() => this.actions$.pipe(...));


+ private actions$ = inject(Actions);
+ private auth      = inject(AuthService);
+ private router    = inject(Router);
+
+ login$ = createEffect(() => this.actions$.pipe(...));
```

# 5. バージョン互換と注意点

| Angular | NgRx |状況 |
|:-:|:-:|:-:|
| ≤ 15  |  ≤14 | inject() は未サポート。コンストラクタ内で createEffect を呼び出す or フィールドで依存を使わないこと。|
| 16  |  15 | inject() 利用可能。ただし Signal API と併用時は order to update loop に注意。 |
| 17+ | 15+ | inject() + フィールド定義が推奨パターン。今回の順序バグは自然に回避できる。|

# 6. 追加参考資料

NgRx Docs: createEffect API

Angular Docs: Dependency Injection with inject()

RFC: Injectable Composition API

# 8. まとめ

教訓： フィールドで依存を使うなら、依存を先に解決する。

Angular 17 / NgRx 15 以降は inject() + フィールド宣言順のパターンを採用することで、今回のような初期化順序バグを根本的に防止できます。今後は新規 Effect 実装／リファクタ時に必ずこのパターンを徹底しましょう。
WSL環境でAWSのDockerコンテナを起動したら"Serverless plugin "serverless-webpack" not found."のエラーが出た

# はじめに

AWSのDockerコンテナを起動したら"Serverless plugin "serverless-webpack" not found."のエラーがでました。

エラー文でググっても意外と載っていなかったので、こちらに残しておきます。
環境は下記です。
```
環境：　WSL2
Docker: v28.1.1
Node : v14.21.3
```

# 原因
**serverless-webpackプラグインはserverless.ymlのpluginsセクションに記載されていたものの、node_modules配下にインストールされていなかった**というのが原因でした。
```yml:serverless.yml
plugins:
serverless-webpack
```

プラグインがインストールされているかは、下記コマンドで確認できます。
```
npx serverless plugin list
```

ただし、**ホスト側（WSLやWindows）でインストールしても、コンテナ内にnode_modulesやプラグインが存在しない場合、今回のようなエラーが出ます。**
したがって、**コンテナ内でこれらをインストールしてあげる必要があります。**

# 手順

**該当のコンテナ内**でserverless-webpackをインストールします。
```
npm install
yarn add --dev serverless-webpack
```

今回のエラーで**Dockerが起動できずコンテナに入れない場合**は、下記コマンドでdocker run時にシェルでコンテナに入りましょう。
```
docker compose run -it --entrypoint /bin/bash aws-dev
npm install
yarn add --dev serverless-webpack
```
# おわりに
ホスト側でインストールしていても、コンテナ側では適用されない、という初歩的なミスでした。（ホストとコンテナは全く別の環境です。）
Dockerのファイルに依存関係をインストールする設定を追加していたのですが、コンテナ立ち上げ時にうまく動かなかったようです。
Copilotでコンピュータマウスを使う魔法少女を描いてみた。

# 概要

Copilotでコンピュータマウスを使う魔法少女を描いてみました。

# 実装

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

```
光のコンピュータマウスを使う魔法少女を描いてください。
```
![光のコンピュータマウスを使う魔法少女（Copilot）_20250518.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c0da6cd9-bbed-40f0-a461-f98901150b7a.png)



```
闇のコンピュータマウスを使う魔法少女を描いてください。
```
![闇のコンピュータマウスを使う魔法少女（Copilot）_20250518.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/e7967d9c-10a1-4cd2-b6a4-f4d979336059.png)





```
聖なるコンピュータマウスを使う魔法少女を描いてください。
```
![聖なるコンピュータマウスを使う魔法少女（Copilot）_20250518.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/f30c7912-f90d-4b70-afa3-d3ef9404cd9b.png)



# まとめ

光の子が可愛いかも。
何かの役に立てばと。
Elasticsearchをもっと使いこなす！スクリプティングとは?

# スクリプティング

## スクリプティングの概要

- スクリプティングはユーザー独自のロジックを実装することで、スコア計算、データのフィルタリング・分析、ドキュメントの部分的な更新を実行することができる機能。
- スクリプティングの実行処理は、通常のインデックス格納や検索と比較して重い処理となる。
- Elasticsearch では、 いくつかのスクリプティング言語が設定されているが、Elaticsearch5.0 からデフォルトでは、 `painless` が設定されている。

## スクリプティングの記述方法

Elasticsearch でスクリプティングを定義する場合は、以下のようなコードブロックを定義する。

```bash
{
  "script": {
    "lang": "painless",           # 使用するスクリプティング言語を指定
    "source" | "id": "...",       # 実際に処理を行うコードを記述(idを指定した場合は事前に定義したidのコードを使用)
    "params": { ... },            # コードで使う変数をコードとは別に定義するために利用。
}
```

## スクリプティングの活用例

スクリプティングの活用は様々なものがあるが、その一部を Painless を使って記述した例を紹介する。

### フィールドの上書き更新

```bash
# ドキュメントの作成
$ curl -XPUT 'http://localhost:9200/painless_test/_doc/1' \
-H 'Content-Type: application/json' -d'
{
  "item": "apple",
  "type": "fruit",
  "price": 100
}
'
# ドキュメントのpriceフィールドのみを更新
$ curl -XPOST 'http://localhost:9200/painless_test/_doc/1/_update' \
-H 'Content-Type: application/json' -d'
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.price = params.new_price",   # ctx._source は更新対象のドキュメントを指す。
    "params": {
      "new_price": 200
    }
  }
}
'
```

### 特定のフィールドのみを一度に上書き更新

検索クエリを併用することで、検索にヒットした特定のドキュメントの特定のフィールドのみを一度に上書き更新することができる。

```bash
# 検索にhitしたドキュメントのpriceフィールドを200円上げる
$ curl -XPOST 'http://localhost:9200/painless_test/_update_by_query' \ # _doc/update_by_queryでも可能だが省略が推奨される
-H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "type.keyword": {
        "value": "fruit"
      }
    }
  },
  "script": {
    "lang": "painless",
    "source": "ctx._source.price += params.price_raise",
    "params": {
      "price_raise": 200
    }
  }
}
'
```

### インデックスに含まれるフィールドを全て更新

ドキュメント再作成(`_reindex`)と併用して、インデックスを再作成しながら特定のフィールドの更新も行える。

```bash
# インデックス再作成時に同時に特定のフィールドのみを更新する
$ curl -XPOST 'http://localhost:9200/_reindex' \
-H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "painless_test_old"
  },
  "dest": {
    "index": "painless_test_new"
  }
},
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.price += params.price_raise",
    "params": {
      "price_raise": 200
    }
  }
}
'
```
【書籍紹介】PMBOKはじめの一歩 スッキリわかるプロジェクトマネジメントの基本

## 読んだ本

https://www.shoeisha.co.jp/book/detail/9784798169590

## 感想

PMについての外観を掴めたのでPMBOKを読んでみようと思ったが、気軽にチャレンジするには難しそうだったため本書を読み始めた。

家のリフォームや町内会のイベントなど、ITに限らない具体的で身近な出来事をプロジェクトに見立て、会話形式でストーリーが進行していく。各ストーリーが終わった後に、PMBOKの内容と照らし合わせてどういった箇所が該当するのかの説明が入る構成だ。

全体的にわかりやすさを重視した作りでとても読みやすかった。PMBOKを読もうと思ってもたくさん版があって戸惑うので、まずは本書から読み始めることをおすすめしたい。（ちなみに、6版はプロセス別、7版は原則別に構成されている。）

## おすすめの人

- PMはどんなことをしているのか興味がある人

## 次に読むなら

- マネジメントまわりの本はあまり読んでいないですが、「図解まるわかり PMO・PMのきほん」がおすすめです

## 知らなかった言葉

- クラッシング: スケジュール遅延時、人数を増やしてリカバリーすること
- ファストトラッキング: スケジュール遅延時、先行して他のタスクを進めること
- BOSCAR: プロジェクト管理のフレームワーク。Background、Objective、Scope、Constraints、Assumptions、Risksの頭文字
- RACI(レイシー): プロジェクトにおける役割を明確にする手法。Responsible、Accountable（説明責任者）、Consulted、Informedの頭文字
- YWT: 振り返りの手法。やったこと、わかったこと、次にやることの頭文字
Githubでprivateのリポジトリをクローンできない

タイトルのGithubでprivateのリポジトリをクローンできず苦戦したため
備忘録として残します。

以前は、priavateのリポジトリはユーザー名とパスワード入力でクローンできてましたが
2021年頃にアクセストークンを使うように変更されていました。

この件は知っていので、アクセストークンを作ってみたもののうまくいかず
解決に時間がかかってしまいました。原因は単純でしたが。

## 結論:(classic)でPersonal Access Tokenを作成する
Personal Access Tokenは、下記のページから作成します。

https://github.com/settings/tokens

この時、"Fine-grained tokens"と"Tokens (classic)"と2種あるのですが
<b style="color:red;">Tokens (classic)</b>の方でアクセストークンを作ってください。
これが解決法です。(私は知らずにFine-grained tokensで作り、うまくいきませんでした)
![名称未設定git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332453/27c438f9-08d2-4490-aee3-d3a36e5c3219.png)
これで作ると、先頭が"ghp_"で始まるトークンが作成されると思います。
```
(イメージ)
ghp_**************************
```
このトークンを、git clone (HTTPSの方)実行し、パスワードを聞かれるときにパスワードの代わりに入力することでcloneが成功しました。

以上です。
【2週間・40時間】GCP ACE合格までの勉強法と感想



こんにちは！  
今回は私が **GCP認定 Associate Cloud Engineer（ACE）** に  
**約2週間・40時間の学習で合格**した際の体験と勉強法をまとめます。

AWS SAAと比較されやすい資格ですが、**個人開発寄りの視点でも面白く、手応えある内容**でした。

---

##  結果まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4059572/8d86a10c-ec30-41e4-b380-27dbc908c25b.png)


| 項目 | 内容 |
|------|------|
| 学習期間 | 約2週間 |
| 総学習時間 | 約40時間 |
| スコア | 非公開（一般的には70%程度が合格ラインとされる） |
| 使用教材・問題集 | ・CloudLicense<br>・徹底攻略 Google Cloud認定資格 ACE教科書<br>・ChatGPT |
---


## 📚 使用教材レビュー

###  CloudLicense（https://cloud-license.com/）
- 本番に近い問題が多く、**試験中に「これ見たぞ」レベルの問題が35問ほど出た**
- **模擬試験の正答率が90%を安定して出せるまで反復**
- なぜその選択肢が正しいか？を**言語化できるようにした**

###  徹底攻略 Google Cloud認定資格 Associate Cloud Engineer教科書
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4059572/b466525d-3506-40f5-87e9-51fc0c3f3476.png)

- 最初に全体像をつかむために活用
- 網羅的で、**ざっくり読んで「どこを重点的に深掘るか」を見極めるため**に使った

###  ChatGPT
- 教科書やCloudLicenseの問題で**理解が曖昧だった点を対話形式で深掘り**
- 特にIAM、VPC、Cloud Runなどの設計問題で「他の選択肢はなぜ違うのか？」を検討するのに役立った

---

##  学習スケジュール（ざっくり）

| 期間 | 内容 |
|------|------|
| 1〜2日目 | 教科書をざっくり読んで網羅性と構成を把握 |
| 3〜7日目 | CloudLicenseの模擬問題を1回目 → 解説をしっかり読む |
| 8〜10日目 | ChatGPTで「なぜこの選択肢か？」を徹底的に聞く・比較する |
| 11〜13日目 | CloudLicenseの全模試を2周目、苦手問題の再整理 |
| 試験前日 | 全体の知識を再確認し、軽く読み流し＋ChatGPTで用語復習 |

---

## ✍️ 試験当日の感想

- **CloudLicenseとそっくりの問題が約35問**出題されていて安心感があった
- 初見問題も多いが、**消去法で冷静に考えれば解ける内容**
- 英語が若干読みづらい問題もあったが、パターンを掴んでいれば対応可能
- SAAよりも「用語ベースではなく、仕組み・設計への理解」が求められる印象

---

##  ポイントと意識したこと

| 項目 | 意識した内容 |
|------|---------------|
| 模擬試験 | 正解率よりも「**説明できるか**」を重視 |
| 教科書 | 精読ではなく、**構造把握＋逆引きリファレンス的に使う** |
| ChatGPT | 選択肢の比較や不明点の言語化にめちゃくちゃ有効 |

---

## 🎯 次の目標：GCP Professional Cloud Architect（PCA）

- ACEで基礎を押さえたので、次は **GCP Professional Cloud Architect（PCA）** 
- AWSよりもアーキテクチャ設計が楽しく、**個人開発との相性も良さそう**だと感じたため

---

## ✅ まとめ：GCP ACEはCloudLicenseとChatGPTでいける

- **40時間でも合格可能**（ただし集中力と問題演習の質が必須）
- CloudLicenseの模擬試験は本番でも「見たことある」レベルで出題される（合格だけならここだけで十分だと思う）
- ChatGPTを併用すれば、理解があいまいな箇所もクリアにできる

---

## 🙌 この記事が参考になったら

ストック・いいね・コメントなどお気軽にどうぞ！  
PCAの合格体験記も後日アップ予定です📘
【React / Next.js】ルート（/）にアクセスすると「404 Not Found」が表示される解決方法について

# はじめに
Next.jsハンズオンでアプリ開発中にルートのHome画面が表示されない症状が発生し、こちらの解決方法について記事にします。

ﾙｰﾄ配下にsrc/app/page.tsxの他app/api/... という構成になっておりました。


# 解決方法
app を1つにする。
ﾙｰﾄ配下にappディレクトリが２つあることで、page.tsxが無視されている結果になっておりました。

# 参考

https://nextjs.org/docs/app/api-reference/file-conventions/src-folder

# おわりに
これで表示されるようになりました。

<br>


# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp