OmniAICreator/Qiita-1.07M huggingface dataset:
アジャイル検定Lv.1試験に合格しました

# はじめに
先日、アジャイルソフトウェア開発技術者検定Lv.1試験を受験し、合格しました。
それまでにやったことを紹介します！

## 受験の経緯

学生時代の長期インターンで1年ほどスクラム開発経験があるが、当時は開発手法の存在もよくわかっていなかった。

新卒1年目で、アジャイル開発っぽい（ウォーターフォールではない開発という意味の）新規プロジェクトに参加しているが、そもそも開発手法わからないなと思った。

技術書を読むのも良いが、まずは基礎的なところを知りたい & 奨励金がもらえるので受験しよう！となりました。

## 試験の概要

CBT方式で60分間60問、80%以上の得点で合格。
試験の中身については、以下を参照ください。

https://agilecert.org/test/requirements/

# 受験までの流れ

## 1ヶ月前

受験することを決め、[『アジャイル検定公式テキスト』](https://www.amazon.co.jp/dp/B06W2PFS8G)を購入。

## 3週間前

テキストが届いてから3日くらいで1周目を読み終える。
各章についている問題を解いてみる感じ難易度は高くないと感じたため、申し込み。
プロメトリックで予約する必要がありますが、思いの外予約が埋まっており、この時点で土日の空きは3週間後。

## 2日前

テキストを1時間ほどで軽く読み返しつつ、曖昧な箇所や、案外答えづらい開発手法について、ブログにまとめてみる。

https://qiita.com/e_e99/items/45ff4423ce019d08d2e1

## 当日

行きの電車で章末問題を再度解き直し。
試験時間を30分勘違いしており、15分前ギリギリに会場到着。

## 試験中

解いている中で一番曖昧だったのは、レトロスペクティブとチームの振り返りとの違い。
イテレーション間の振り返り（レトロスペクティブ）と毎週行うチームの振り返りとがどちらなのかが曖昧で結局あやふやな状態で回答した。
また、1度解いた後の見直しで3つほど回答を変えたりした。

## 結果

50分ほどで回答を提出した。その場で結果が分かり、88点で合格だった。
わかっているつもりだった開発手法の得点率が最も低かった。

自分の中でイメージが掴めていれば合格点は取れるが、選択肢になると、その開発手法で何が最も重要なのかが曖昧になってしまう。
テスト駆動開発でテストを通すためのコード修正が長期化しそうな場合どうするのかなど。

そのため、直前に復習するのであれば開発手法の箇所を読み直すのが個人的にはおすすめ。

# 感想

レベル1は基礎的な内容が多いため、試験勉強さえすればアジャイルとは何かのイメージがつき、受験して良かったと思いました！
ただ、このまま普段のプロジェクトに活かすのは難しいと思い（今はリモートが多いし、なんだかんだプロジェクト開始後に色々と決まっていくし）、他の有名なアジャイル本を読みたくなりました！

受験料が11,000円（税込）と若干高めなので補助がなければ受験するのは気が引けるよなと思いつつ。

# 追記

合格証は、試験受験日から1ヶ月弱後に郵送で送られてきました！
初心者によるメモ（アルゴ式「リーディングゼロ」）

## 問題
ロジック実装初級

https://algo-method.com/tasks/658ce136a1a97db5

## 考察
まず、入力を文字列として受け取る。次にwhile文をつかって文字列の長さが10未満であれば、先頭に0を加える。
## ACコード
```py
n=input()

t = n

while len(t) < 10:
    t = "0" +t

print(t)
```
Docker×Railsをgit cloneしたときのセットアップ手順

## はじめに
Railsを使った開発を以下のように進めていたのですが、railsコマンドが遅すぎたので、WSL上にプロジェクトファイルを移しました。
- Dockerを使って開発
- プロジェクトファイルはWindows上においていた

少し詰まったのと今後も似たようなことをやることが多くなりそうなので、備忘録として残します。

## 開発環境

- Rails8
- Ruby3.4
- Docker27.2.0

## やりたいこと

- Windows側で開発を進めていたが、WSL側にファイルを移して開発を進めたい
- 背景
    - rails s等の起動が非常に遅い
    - 参考
        - [WindowsでDockerを使う時、正しくファイル配置しないと激重になるので注意](https://qiita.com/minato-naka/items/84508472c04f628e576e)

## やりかた

1. WSL上にディレクトリを作成
2. git cloneを実行
3. docker compose buildでイメージをビルド
4. docker compose up -d でコンテナを立ち上げ
5. docker compose exec web /bin/bash でrails内に入る
    1. bin/rails db:create　などの実行
    2. bin/dev を実行
        1. scssを反映させるために、devコマンドでdartsassによるコンパイルを実行

## 出たエラー

### Rails用のコンテナが立ち上がらない

- エラー文

```bash
web-1  | tail: cannot open 'log/development.log' for reading: No such file or directory
web-1  | tail: no files remaining
```

- 前提：compose.yamlの記述内容

```yaml
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
  web:
    build:
      context: .
      dockerfile: Dockerfile.development
    command: bash -c "rm -f tmp/pids/server.pid && tail -f log/development.log" // ここでエラー
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true
volumes:
  postgres_data:
```

- 原因
    - git cloneで初期化下手だったのでlog/development.logが存在しなかった
- 背景
    - よく見る起動コマンドには `rails s -b ‘0.0.0.0’`が含まれているが、サーバーを立ち上げたり落としたりを頻繁にしたいので、抜いていた
    - 上記のコマンドを削除すると、自動的にコンテナが終了してしまうので、ログを参照するコマンドを入れていた
- 対処法
    1. `tail -f log/development.log` を `rails s -b ‘0.0.0.0’`に変更
    2. `docker compose up -d`で再起動
    3. `docker compose exec web /bin/bash`  でコンテナ内に入る
    4. `bundle install`や`bin/rails db:create`, `bin/rails db:migrate`, `bin/rails db:seed` などの実行
    5. log/development.logが自動で生成されるので、compose.yamlファイルを元に戻す
VercelデプロイアプリケーションにGoogle Cloud Platformで取得した独自ドメインを設定する



## はじめに
この記事では、Vercelにデプロイ済みのアプリケーションに対して、Google Cloud Platform（GCP）のCloud Domainsで取得した独自ドメインを設定する手順を説明します。

## 前提条件
- Vercelにアプリケーションがデプロイされていること
- Google Cloud Platform（GCP）のアカウントを作成済みであること
- GCPのプロジェクトが作成済みであること

## 1. Cloud Domainsでドメインを購入する
1. GCPコンソールを開き、Cloud Domainsにアクセス
![gcp-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/0ed4ba4d-5b1e-493a-8fa1-103d3e778506.png)
1. 「ドメインの登録」をクリック
![gcp-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/a0cefeb9-71f7-4c99-9fa2-ccfe3eab0426.png)
1. 希望のドメイン名を入力して検索
   - 例：`yourdomain.dev`
![gcp-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/3f703212-2d19-4a63-bbaa-3cdf2a6c40c1.png)
1. この状態で一旦放置

## 2. Vercelでドメインを設定する
1. Vercelダッシュボードにアクセス
2. 対象のプロジェクトを選択
![vercel-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/666afde5-1c8c-40ba-895b-b925ebcb8140.png)
3. domainsを選択
4. 「Add」をクリック
![vercel-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/b279f41b-c996-4874-8b56-c5a3ceeed9ea.png)
5. 購入したドメインを入力（例：`yourdomain.dev`）
![vercel-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/f59c3647-1988-4553-ae65-1aa753c71bf8.png)

6. Add Domainをクリック
7. Vercelから以下の2つのネームサーバーが提供される
- `ns1.vercel-dns.com`
- `ns2.vercel-dns.com`

## 3. GCPでネームサーバーを設定する
1. GCPコンソールの先ほどの画面に戻る
2. DNSの設定で「カスタムネームサーバーを使用」を選択
3. Vercelから取得した2つのネームサーバーを入力
![gcp-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/a60cab6e-f490-4956-837c-6517af2254cd.png)
4. プライバシー保護、連絡先の詳細を入力
5. ドメイン所有者の確認メールを確認
6. メール内のリンクをクリックして認証を完了

## 4. 設定の確認

### GCP側の確認
- ドメインのステータスが「アクティブ」になっていることを確認
- ネームサーバーが正しく設定されていることを確認
![gcp-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/d579d483-f027-48d8-987e-1f9d29c55f65.png)


### Vercel側の確認
- ドメインのステータスが「Valid Configuration」になっていることを確認
![vercel-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/c81b8b4b-fd6e-42c2-b673-6366fa916b48.png)

- 最後に実際にブラウザからアクセスして確認
![fin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876904/cab03c1b-3307-4e72-93eb-2ea02439beaf.png)

## 注意点
- DNSの設定が反映されるまで最大48時間かかる場合があります（通常は数分〜数時間）

## まとめ
以上の手順で、VercelにデプロイしたアプリケーションにGCP Cloud Domainsで取得した独自ドメインを設定することができました。
IBM i 駆け出し日記：物理ファイルのテーブル行数を調べる

# はじめに
メモ書き記事です。

QSYSOPRで「レコード件数が閾値に達している」とエラーメッセージが表示され、「物理ファイルのテーブル行数値について上手いハンドリングはないか」とご質問をいただきました。


そもそも[IBM i の上限値](https://www.ibm.com/docs/ja/i/7.5?topic=services-system-limit-alerts)というものが存在するとのことです。上限値行くことなんてあるんだ、とびっくり。歴史あるシステムだからですね。
[上限値について噛み砕いたわかりやすい記事](https://qiita.com/gomAnomalocaris/items/eb2b6989639b4392a04d)

# 調べる方法
## ACS
ACSのスキーマ機能を使って調べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/6c2dfff4-8b0b-4ef8-a405-f26cf35dac0c.png)
対象ライブラリー配下(SAKURALIB)の表を選択すると、ライブラリ配下の物理ファイル一覧が並びます。一番右の行カウント列が物理ファイルのテーブル行数値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/db9897ed-0cf2-4978-9c24-226d4f34758e.png)

右上の真ん中のアイコンから列に表示する項目のカスタマイズができます。そこで行カウントを選択すると行数表示が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/ab68af38-bd35-4981-b061-b6ee49e5f910.png)

## SQL
[SYSTABLESTAT](https://www.ibm.com/docs/ja/i/7.5?topic=views-systablestat)ビューを利用しました。
```
SELECT 
    TABLE_NAME, 
    NUMBER_ROWS
FROM 
    QSYS2.SYSTABLESTAT
WHERE 
    TABLE_SCHEMA = 'SAKURALIB';  -- 対象のスキーマ名を指定
```


実行結果はこちら、ACSと同じ行数が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/7f3c1882-8a9a-4c54-a1ce-7731a6b4c612.png)

## CL
```
DSPFD FILE(*ALL/*ALL) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*PF) OUTFILE(SAKURALIB/DSPFD)
```
OUTFILE出力にしないとQPDSPFDが最大レコード数に達したとのことで表示できません。
またCLですと```FILE(*ALL/*ALL)```でライブラリー全件に対して一気に検索をかけられます。


実行したのちDSPFを見た結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/82be72a2-ffee-4061-b7d2-0596ea7d3204.png)
【Rails】なぜインデックスを設定すると検索が早くなるのか

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在 Rails を勉強中ですがRailsチュートリアルでテーブルの1要素にインデックスを持たせるシーンがありました。
教材ではインデックスを持たせることで、同時にリクエストに対応し一意性を持たせることを目的としていました。
しかし、以前勉強したデータベースの教材でindexに設定することでフルスキャンと比べて早く見つけることができると書いてあったので本日はそれについての記事となります

# インデックスとは何か？
インデックスを一言でいうと「データの場所を素早く探すための補助的な情報」です。書籍の巻末にある「索引(さくいん)」をイメージすると分かりやすいでしょう。書籍の索引は、キーワードとそのキーワードが掲載されているページ番号がセットでまとめられています。

データベースにおけるインデックスも同様で、あるカラム（列）の値とその値が格納されている行の場所（ポインタ）をまとめた構造になっています。これにより、知りたい値を素早く探し出すことができます。

## フルテーブルスキャン
インデックスがない場合、データベースはクエリの条件に合致する行を探すためにテーブルの最初から最後まで行を1つずつチェックしていきます。これをフルテーブルスキャンと呼びます。

フルテーブルスキャンの特徴は以下の通りです
  * テーブルの行数が少ないうちは気になりませんが、行数が増えるほど処理時間が長くなります。
  * 条件に合致する行がわずか数行でも、最悪の場合はテーブル全件をチェックしなければなりません。
  * たとえば100万行のテーブルがあった場合、最大で100万回の確認作業が必要になる可能性があります。

## インデックス検索
特定のカラムにインデックスが設定されていると、データベースはフルテーブルスキャンの代わりに、インデックス構造を使って目的の値を迅速に検索します。一般的に多くのデータベースでは**B-tree（B木）**という木構造をインデックスとして使用します。

インデックス検索の特徴は以下の通りです
  * B-treeの階層構造をたどりながら、該当する値（または範囲）を短いステップで特定できます。
  * 100万行あっても、探索の比較回数は「対数（log n）回程度」に抑えられます。フルテーブルスキャンと比べて圧倒的に少ない回数で目的の行を見つけられます。
  * 最終的にインデックスが示す行の場所を参照することで、該当の行を直接取り出せるのが大きな強みです。

## なぜB-treeインデックスは速いのか？
B-treeインデックスは、データが階層的（ツリー状）に配置されており、バランスが保たれている構造です。このバランスにより、ツリーの深さが少なくなり、検索にかかるステップ数が飛躍的に減ります。

例: 100万件のデータを持つテーブル
  * フルテーブルスキャン
      * 100万行を1件ずつチェック → 最悪で100万回比較
  * B-treeインデックス検索
      * 高々20ステップ程度（2の20乗 ≈ 100万）で目的の値に到達可能


## インデックスを設定するときの注意点

### ストレージの増加
インデックスはテーブルとは別の領域にデータを持つため、ストレージ使用量が増加します。テーブルに対して多くのインデックスを設定すると、思わぬディスク消費を招くことがあります。

### 書き込みコストの増大
テーブルにINSERT・UPDATE・DELETEなどの操作を行うと、インデックスも更新が必要になります。そのため、インデックスが多いと書き込み系のパフォーマンスが低下する可能性があります。

### すべてのカラムをインデックスにするわけではない
「読み取りパフォーマンスを良くするために、すべてのカラムにインデックスを張ればいいのでは？」と思うかもしれませんが、上記のようにストレージと更新コストの増大がネックになります。
**よく検索に使われるカラム や 絞り込み条件に頻繁に利用されるカラム**など、用途に応じて戦略的に設定することが重要です。



## まとめ
* インデックスはデータベースの検索を高速化するための強力な仕組みです。
* B-treeインデックスなどの木構造を利用して、フルテーブルスキャンに比べ圧倒的に少ない比較回数で目的の行にたどり着けます。
* ただし、インデックスは作れば作るほど書き込みコストやストレージを圧迫するため、必要なカラムに絞って戦略的に作成することがポイントです。

Railsの勉強が一通り落ち着いて、時間ができたらまたデータベースの書籍を用いて復習しようと思いました
【メモ】Django

# Django とは
DjangoとはWeb開発におけるバックエンドを開発する際に用いられるフレームワークである。言語はPython。

:::note info
フレームワークとは、Webシステムにおけるプログラムの共通の流れ(MVCアーキテクチャ)をひな型にしたものである。
:::
Djangoは、MVCアーキテクチャに基づいているものの、ViewがControllerの役割を果たし、Viewの代わりにTempleteを採用するMVTアーキテクチャである。しかし、Controllerがなくなったわけではなく、ユーザからのWebアクセスをControllerが受け取り、Viewを呼び出す。その後ViewがModel,Templeteを呼び出し、DBとのやり取りや画面表示を制御する。

開発の流れは、まず「プロジェクト」を作成し、Webアプリケーションが動作するためのインフラを構築する。その後、プロジェクト内に「アプリケーション」をフォルダを作成する。この「アプリケーション」がMVCアーキテクチャの処理をまとめていくので、DjangoはアプリケーションごとにMVCコンポーネントが用意され、プログラムが構築される。

「プロジェクト」は、Webアプリケーション,またはWebサイトの全体を定義するファイルである。例えば、設定ファイル,ルーティング,管理スクリプトなどである。一方で「アプリケーション」は、そのアプリやサイトにおける特定の機能,モジュールの単位である。例えば、ブログ機能やユーザ認証機能,ログ監視機能などである。このように、アプリケーションが独立していることで、他アプリケーションでの再利用,メンテナンスの容易さ,同時並行開発,テストの容易さなどのメリットがある。

# 実際にやってみる

Anaconda Promptで操作する。

###### プロジェクトの作成

＃プロジェクトをデスクトップに作成するため移動
cd desktop

#プロジェクトを作成する。
django-admin startproject myProject
 
＃動作確認のため移動
cd myProject

#Djangoプロジェクトの実行
python manage.py runserver

＃以下のような実行結果が得られる
```
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the
migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 26, 2022 - 13:53:00
Django version 4.1.2, using settings 'myProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK
```

#上の実行結果のうち、[Starting development...]の後ろに開発サーバーのURLが示されるのでブラウザで開く。
127.0.0.1はループバックアドレスである。localhostでも同じになる。

ブラウザでDjangoのデフォルトページが表示されれば正常である。

:::note info
 [Webサーバの終了方法]
コマンドプロンプト上でCtrl + C
:::
###### アプリケーションの作成
#Djangoプロジェクトの中の"manage.py"を指定する。試しにhelloというアプリケーションを作成してみる。
python manage.py startapp hello
　作成されたhelloアプリケーションの中にも複数のファイルがある。
###### viewの書き換え
#helloアプリケーションの中の"views.py"を編集する。
```
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello Django!")
```
【コードの説明】
まず、ユーザがブラウザからサーバへHTTPリクエストを送信する。サーバはリクエスト受け取ったらindex関数を呼び出し、リクエストの情報をrequestに格納する。次にサーバはHttpResponsクラスを用いHTTPレスポンスを作成し、クライアント側へ返す。その返す内容を指定するときにreturnを使う。
###### URLの書き換え
///書き換えではなくアプリケーション内にurls.pyを作成する。
次に、特定のアドレスへアクセスしたときに「views.py」が実行されるように「urls.py」を書き換える。「urls.py」はURLルーティングを管理するためのファイルである。

### 成果物
簡単なwebアンケートシステム
必要事項を選択、入力し、提出ボタンをクリックすると入力結果が表示される。forms.pyで入力情報が保持される。TempleteのcssはBootstrapを利用した。

基本的なことしかやっていないので特に困難な部分はなかったが、初めてのwebアプリケーション開発であったため学んだことは多くあった。viewやtemplete、formsでタグを統一して使っているところから、オブジェクト指向をより強く感じた。基本的なwebアプリケーションの構造を理解した。

参考にしたのは大学の講義資料とその講義資料の参考資料(ブログなど)である。バージョンによって古くなっている場合があるので、注意が必要であった。
データベースと繋げるためにはModelの学習をしなければならない。
簡単メモ：Date.now()メソッドつまずいたこと。 

# はじめに
気づいたら簡単なことだったのですが、さらっと流していたら、中々、曲者だったことです。
# どんなことだったか
MYSQLで、日付フィールドを作成して、そこへDate.now()メソッドを使用して、ミリ秒単位のデータを保存しようとしました。
そしたら、中々、データが保存できなかったのです。
フィールドの構造は、dateフィールドとして、タイプはDateとしていました。
もしかしたら、このDateタイプかと思い、DateTimeに変えてみました。
しかし、それでも保存できません。これで、大分時間をつぶしました。

ちなみに、以前、日付のデータを保存していたphpファイルを探して、そのコードとテーブルの構造をよく見てみました。
すると、dateフィールドのタイプがbigint(20)で定義していました。

そうか、これかと納得しました。
念のため、Date.now()メソッドの仕様を確かめてみました。
すると、このメソッドは、1970年-01月-01日-0時:0分:0秒からのミリ秒を表しているとありました。例題でこの数値を見てみると、13桁の数値でした。相当大きい数値です。
そのために、bigint(20)としていたのかと思いだしました。

時間が経つと忘れているものです。

# 修正してみたら
それで、さっそく、テーブルのタイプをbigint(20)にしました。
これで、動作テストをしてみたところ、見事、日付を保存できました。

# あとがき
気が付けば簡単なことですが、さらっと流すと思わないことで時間をつぶすことになります。備忘録ではないですが、過去に作成したコードを見返すことは、役に立つことが多いです。
これからも、うっかりミスはなくならないと思いますので、問題が起こった時の神頼みとして、過去のコードは見返すようにしたいと思います。
🚀 JWTを使用したログイン・ログアウト機能のPostmanによる検証手順 🚀




## 概要
本記事では、JWT（JSON Web Token）を使用した認証システムにおいて、PostmanでのAPI検証方法を解説します。特に、Cookieベースでアクセストークンを管理するシステムにおける、ログインからログアウトまでの一連の流れを説明します。

## 構成
- 認証方式: JWT (Cookie-based)
- テストツール: Postman

## 注：今回の記事には refresh_token の記載もありますが、無視でOKです！

## 検証環境のセットアップ

### 1. Postman環境変数の作成
新しい環境を作成し、以下の変数を準備します：
- `base_url`: `http://localhost:8000`
- `access_token`: (空の状態で作成)

![Cursor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/77b531ae-b695-4135-965a-bc87a4bfc04d.png)


## ログイン機能の検証

### 1. ログインリクエストの設定
```
POST {{base_url}}/api/auth/login
Content-Type: application/json

{

    "email": "test@example.com",
    "password": "test"
}
```

### 2. テストスクリプトの設定
ログインリクエストのスクリプトタブに以下のスクリプトを追加します：


```javascript
// Cookieからトークンを取得
const getCookieValue = (cookieName) => {
    const cookies = pm.cookies.get(cookieName);
    return cookies || null;
};

// access_tokenとrefresh_tokenを取得
const accessToken = getCookieValue('access_token');
const refreshToken = getCookieValue('refresh_token');

// 環境変数に保存
if (accessToken) {
    pm.environment.set('access_token', accessToken);
    console.log('Access token saved:', accessToken);
}

if (refreshToken) {
    pm.environment.set('refresh_token', refreshToken);
    console.log('Refresh token saved:', refreshToken);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/560382cf-d7e6-4fc5-9de9-222c459f0c99.png)



### 3. ログイン成功の確認
- ステータスコード: `200 OK`
- レスポンスヘッダー: `Set-Cookie`にアクセストークンが含まれていることを確認
- Postman環境変数: `access_token`が自動的に設定されていることを確認

## ログアウト機能の検証

### 1. ログアウトリクエストの設定
```
POST {{base_url}}/api/auth/logout
Authorization: Bearer {{access_token}}
```

### 2. 正常系の確認

認可タブで Auth Type をBearer トークンに指定します
トークンの値には {{access_token}} として、環境の値を参照するようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/de792b5e-36d2-45ca-9048-0012d017354a.png)


- ステータスコード: `204 No Content`
- Cookie: `access_token`が削除されていることを確認



## まとめ

この手順に従うことで、JWT認証を使用したAPIのログイン・ログアウト機能を効率的にテストすることができます🚀
統計的手法と機械学習の違いとは？

データ分析の世界では「統計的手法」と「機械学習」がよく比較されます。両者は似たような目的を持ちながらも、アプローチが異なります。本記事では、その違いと、それぞれの代表的な手法、さらに両者の要素を兼ね備えたハイブリッド手法について深く掘り下げて解説します。
※この記事は、ChatGPT

## 1. 統計的手法と機械学習の違い
統計的手法と機械学習は、主に **「目的」** と **「データの扱い方」** の違いによって区別されます。

### **(1) 目的の違い**
- **統計的手法**：データの背後にある「法則」や「要因」を明らかにする（説明）。
- **機械学習**：データから「パターン」を学習し、新しいデータに適用する（予測）。

統計的手法は **「なぜ？」を解明するために使用される** のに対し、機械学習は **「次にどうなる？」を予測するために使われる** のが特徴です。統計的手法は因果関係を特定することに長けており、機械学習は相関関係を活用して精度の高い予測を行います。

### **(2) データの扱い方の違い**
| | **統計的手法** | **機械学習** |
|---|---|---|
| **データの前提** | 正規分布や独立性などの前提条件を考慮 | 前提条件を気にせず学習 |
| **サンプルサイズ** | 小さなデータでも理論的に解析可能 | 大量のデータを活用するほど高精度 |
| **解釈性** | 変数の影響を説明可能（因果関係） | 結果はブラックボックスになりがち（相関関係） |

統計的手法は「少ないデータで信頼できる結論を導く」ことを重視し、機械学習は「大量のデータで高精度な予測をする」ことを重視しています。

## 2. 代表的な手法

### **(1) 統計的手法の代表例**
| 手法 | 内容 | 用途 |
|---|---|---|
| **線形回帰** | 目的変数を説明変数でモデル化する | 売上と広告費の関係分析 |
| **ロジスティック回帰** | 2値分類を確率的に予測 | スパムメール分類 |
| **t検定** | 2つのグループの平均値を比較 | A/Bテストの結果分析 |
| **カイ二乗検定** | カテゴリ変数同士の関連を検定 | 購買傾向と性別の関連分析 |
| **主成分分析（PCA）** | 高次元データを圧縮 | 顧客データの特徴抽出 |
| **ARIMA** | 時系列データをモデル化 | 売上予測、経済動向の分析 |

### **(2) 機械学習の代表例**
| 手法 | 内容 | 用途 |
|---|---|---|
| **決定木** | ルールベースで分類・回帰 | 顧客の購入予測 |
| **ランダムフォレスト** | 複数の決定木を組み合わせて高精度化 | スパムフィルタ |
| **SVM（サポートベクターマシン）** | 境界線を最適化して分類 | 画像認識、医療診断 |
| **ニューラルネットワーク** | 多層構造で複雑なパターンを学習 | 手書き文字認識、自動運転 |
| **K-means** | クラスタリングでデータをグループ化 | 顧客セグメンテーション、異常検知 |
| **異常検知（Isolation Forest）** | 正常データと異常データを識別 | クレジットカードの不正検出 |

## 3. 統計と機械学習のハイブリッド手法
統計的手法と機械学習の両方の要素を持つ「統計的機械学習」の分野では、以下のような手法が使われます。

| 手法 | 統計的要素 | 機械学習的要素 | 用途 |
|---|---|---|---|
| **正則化回帰（Ridge, Lasso）** | 線形回帰 | 特徴選択を自動化 | 売上予測、医療データ解析 |
| **ベイズ回帰** | 確率モデル | 不確実性を考慮 | 医療診断、金融市場予測 |
| **ガウス過程回帰（GPR）** | 確率分布に基づく | 柔軟な関数フィッティング | 気象予測、経済モデリング |
| **ランダムフォレスト** | 変数の重要度を計算 | 高精度な分類 | クレジットスコアリング、画像解析 |
| **SVM（サポートベクターマシン）** | 統計的学習理論 | 高精度な分類 | 画像認識、医療診断 |
| **PCA + 機械学習** | 分散分析 | 次元削減 | データ可視化、特徴選択 |

## 4. まとめ
統計的手法と機械学習は、それぞれ得意分野が異なります。

- **統計的手法**は「データを説明する」ことに特化し、少ないデータでも因果関係を明らかにできる。
- **機械学習**は「データから予測する」ことに特化し、大量のデータで精度を高められる。
- **ハイブリッド手法**は、統計の解釈性と機械学習の高精度予測を兼ね備えており、実用性が高い。

これらの手法を適切に使い分けることで、より効果的なデータ分析が可能になります。
【ChatGPT】生成 AI にカスタム指示を設定して最適化したい

## はじめに
ChatGPTには「カスタム指示」という機能があり、ユーザーの好みや用途に応じて最適な回答を得られるようにカスタマイズできます。  
特にWebアプリケーションエンジニアにとっては、技術的なコンテキストを維持したり、好みの表現でアシストを受けたりするのに有用です。  


本記事では、**Webエンジニア向けのカスタム指示の作成方法とコツ**を紹介します。



## 1. ChatGPTのカスタム指示とは？
ChatGPTには、ユーザーごとに振る舞いをカスタマイズできる **「カスタム指示」** という機能があります。

カスタム指示には2つの入力欄があります。

### ✅ ①「あなたについて知っておくと便利なことは？」
ここには、ChatGPTがユーザーについて知っておくべき情報を記述します。  
たとえば、以下のような情報を入れることで、やりとりがスムーズになります。

- **職種**（Webエンジニア、フロントエンド/バックエンド開発者）
- **技術スタック**（React, Next.js, Rails, GCP, AWS など）
- **作業環境**（VSCode, GitHub など）
- **プロジェクトの文脈**（利用している認証方式、デプロイ先 など）

**📌 設定例**
```
私はWebアプリケーションエンジニアです。  
技術スタックは React (Remix), Node.js, Ruby on Rails などを使用しています。  
インフラにはGCPやCloudflareを使用することが多いです。
VSCode, Githubを使用して開発しています。
```

このように設定しておくと、ChatGPTが会話の文脈を理解しやすくなり、的確な回答を得られます。

---

### ✅ ②「どのように応答してほしいですか？」
ここでは、ChatGPTの応答の仕方を指定できます。  
特に、技術情報の提供方法や説明の粒度を調整するのに役立ちます。

#### **📌 設定例**
```
- ハルシネーションせず、不明なことは「わからない」と回答してください。
- シンプルでわかりやすい表現を心がけてください。
- コードの作成や修正をサポートしてください。  
  必要に応じてサンプルコードを提示してください。
- 私の技術スタックに合った解決策を提案してください（Remix, Firebase, Rails, GCP）。
- コードの実装手順を具体的に示し、説明は簡潔にまとめてください。
- 目標を達成するためのベストプラクティスを教えてください。
- 可能な限り公式ドキュメントのリンクを提示してください。
```

---

## 2. カスタム指示を設定する方法

### **📌 ChatGPTでカスタム指示を設定する手順**
1. ChatGPTの画面を開く
2. 左下の「⚙️ 設定（Settings）」をクリック
3. パーソナライズをクリック
4. **「カスタム指示（Custom Instructions）」** を開く

---

## 3. カスタム指示のコツ（Webエンジニア向け）

### **① 技術スタックを明記する**
- **❌ NG例**：「Webエンジニアです。」
- **⭕ OK例**：「私はWebエンジニアで、Remix, Firebase, Rails, GCP を使用しています。」

**理由:**  
技術スタックを明記すると、適切なコード例を出してもらいやすくなる。

---

### **② 簡潔な回答を求める**
- **❌ NG例**：「詳細な背景を含めた解説をお願いします。」
- **⭕ OK例**：「簡潔に要点だけ教えてください。」

**理由:**  
余計な前置きを省き、必要な情報だけを素早く得られる。

---

### **③ ハルシネーションを避ける**
- **❌ NG例**：「知らなくても、それっぽい答えを出してほしい。」
- **⭕ OK例**：「不明な場合は『わからない』と回答してください。」

**理由:**  
ChatGPTは確信がなくても答えを作ることがあるため、誤情報を防ぐ。

---

### **④ コードを優先して提示**
- **❌ NG例**：「概念的な説明を優先してほしい。」
- **⭕ OK例**：「コードを最優先で提示してください。」

**理由:**  
エンジニアは手を動かして学ぶため、すぐに試せるコードがある方が効率的。

---

### **⑤ 公式ドキュメントのリンクを求める**
- **❌ NG例**：「答えだけ教えてほしい。」
- **⭕ OK例**：「可能な限り公式ドキュメントのリンクを提示してください。」

**理由:**  
最新の情報を元に実装を進めるため、公式情報が重要。

---

## 4. まとめ

ChatGPTのカスタム指示を適切に設定すると、より的確な回答が得られるようになります。  
この記事で紹介した設定はサンプルです。
ご自身の状況に応じて変更してください。

この記事は AI で生成された文章を使用しています。
TailwindCSS v4 で text-* の line-height の指定値が変わった

TailwindCSS v4 リリースされましたね！
Container query など便利な機能が追加されたほか、既存クラスも細かいチューニングがされています。
ただアップグレード作業中に `text-*` の仕様変更で少しハマってしまったので備忘録として残しておきます。

## `text-*` は `font-size` と `line-height` 両方の性質を併せ持つ♣

TailwindCSS は基本的に1クラス1プロパティで構成されていますが、`text-*` には `font-size` と `line-height` のふたつが指定されています。
たとえば v4 の場合、 `.text-xs` は以下のような指定になっています。

```css
.text-xs {
  font-size: var(--text-xs); /* 0.75rem (12px) */ 
  line-height: var(--text-xs--line-height); /* calc(1 / 0.75) = 1.33333... */
}
```
参考：v4ドキュメント [font-size - Typography - Tailwind CSS](https://tailwindcss.com/docs/font-size)

TailwindCSS の html には `line-height: 1.5` が指定されていますが、フォントサイズに応じて適切な `line-height` を設定することで可読性の高いテキストが表示されるようになっています。

ところがこの `line-height`, v3 のときは `rem` で指定されていました。
```css
.text-xs {
  font-size: 0.75rem; /* 12px */
  line-height: 1rem; /* 16px */
}
```
参考：v3ドキュメント [Font Size - Tailwind CSS](https://v3.tailwindcss.com/docs/font-size)

倍率と rem の指定の違いはありますが実数値は同じになるため、 `line-height` の差分は発生しません。
v4 は 12px * calc(1/0.75) = **16px**,
v3 は 1rem = **16px** になります。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="raNaWNK" data-pen-title="砂場" data-user="ebisawa-next" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ebisawa-next/pen/raNaWNK">
  砂場</a> by Moeko Ebisawa (<a href="https://codepen.io/ebisawa-next">@ebisawa-next</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## ただし親から `.text-*` を継承 + 子要素で `font-size` の Arbitrary value を使うと表示が変わる

親にはベースとなる `.text-*` を指定したが、子要素の一部分で文字サイズを変えたいということはよくあります。
トークンに該当する font-size があればそれを使えばいいのですが、ない場合は Arbitrary value で `.text-[1.625rem]` のように指定する必要があります。
しかし Arbitrary value で `font-size` を指定すると `line-height` は設定されないので、自動的に親の設定を継承します。
v4 では文字サイズに倍率をかけて `line-height` が決定されるので表示が崩れることはありませんが、v3 では `rem` で決めうちになっているため値によっては表示崩れの原因となります。

以下は親に `.text-xs` を、子要素に Arbitrary value で `font-size: 1.625rem (26px)` を指定した例です。
v4 は `26px * calc(1/0.75) = 34.667px` となりましたが、v3 は `1rem = 16px` のままなので表示差分が発生しました。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="RNwNoga" data-pen-title="親に text-xs を指定 + 子に Arbitrary value で font-size: 1.625rem を指定" data-user="ebisawa-next" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ebisawa-next/pen/RNwNoga">
  親に text-xs を指定 + 子に Arbitrary value で font-size: 1.625rem を指定</a> by Moeko Ebisawa (<a href="https://codepen.io/ebisawa-next">@ebisawa-next</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>


複数の font-size が入り乱れているコンポーネントがある場合は注意しましょう⚠️
Web APIシリーズその1(全5回)：REST APIの考え方

## Web APIの必要性
- 古くは：異なるドメインとのリソース共有
- 現在は：HTMLによる画面がリッチになり、画面とデータ取得を分けるのが普通になった

----
## 正直、ここまでAPIを当たり前に作るようになるとは想像していなかった！

----
## そもそもWeb APIとは？
- 定義はあいまい（この業界の常）
- Web技術をインターフェイスとしてアプリを操作する
- GUIを伴わない

----
## Web APIにもいろいろある
- SOAP：RPCの一種。サーバの処理を通信を意識せずに呼び出そう、という試み
- JSONP：APIと呼ぶかは微妙だが、クロスオリジンな通信を行う現実解であった
  結構使われていた印象
- REST API：Webの思想に則ってAPIを設計しましょう、という方法論
  思想的にはSOAPの真逆

----
## 生き残ったAPI
- REST API
  結局、シンプルなものが使われる

----
## RESTとは
- Representational State Transfer
- 超訳：Web、特にHTTPの仕様に沿ったAPIにしよう！

----
## REST APIの原則
- URLはリソースであり「もの」
  URLに動詞は含めない
- リソースに対する操作がメソッド
  RDBのCRUD操作に相当するのはPOST/GET/PUT(orPATCH)/DELETE
- URLとメソッドで全てを表現する

----
## RESTのメリット（実装面）
- 実装がシンプル（サーバ・クライアント共に）
- テストが容易：ブラウザを用意しなくとも、curlなどのコマンドでテストできる
  ※認証が絡むと少し事情は異なる

----
## URLの設計について(1/2)
- 人間が読みやすいのが理想

```
https://some.blog.service.com/{blog_id}/{article_id}
```

このような設計だと、実際のURLは次のようになる
```
https://some.blog.service.com/10/1303
```

次のようなURLの方が読みやすい
```
https://some.blog.service.com/blog/10/article/1303
```

が、もっと言うとこのようなURLが読みやすい
```
https://some.blog.service.com/jabara-blog/article/swagger-to-typescript-client
```

----
## URLの設計について(2/2)
- 深い階層は考えもの
- ブログにぶら下がる記事、という構成は自明・・・ほんとに？

----
## Web APIのURLの考え方
- ユーザの目には触れにくいので、**変更は比較的やりやすい**
- 実装言語による表記方法の揺れには注意
  C#は何もしなければキャメルケースになるが、これはURLとしては一般的でない気がする

----
## 最後に
- RESTの良さはシンプルさ
- 表現力は限定されるがその分複雑になりにくい
- URLはしっかりかんがえｙ
Pythonを使うとデータ解析ができるらしい

こんにちは、堀井です。

Pythonはデータ解析に非常に適したプログラミング言語であることはよく知られています。
エンジニアであれば知っていて当然のような言語ですが、仕事で使うこともなかったので、実際どのように使うのか？何ができるのか？よく分かってません。
そこで今回はPythonを使った基本的なデータ解析を行ってみようと思います。

# 0. 環境
Mac OS
Python 3.8.5
pip 20.1.1

# 1. ライブラリのインストール
今回使用するライブラリは「pandas」「matplotlib」「seaborn」です。
```
pip3 install pandas matplotlib seaborn
```

# 2. データの読み込み
解析するデータを読み込みます。
``` analize.py
import pandas as pd

# CSVファイルの読み込み
data = pd.read_csv('sales.csv')
```

データは以下のような販売データを使用します。
``` sales.csv
ID,Date,Product,Category,Sales,Quantity
1,2025-01-01,Widget A,Category 1,100.0,2
2,2025-01-02,Widget B,Category 2,150.0,1
3,2025-01-03,Gadget A,Category 1,200.0,3
4,2025-01-04,Gadget B,Category 2,250.0,4
5,2025-01-05,Widget A,Category 1,300.0,1
6,2025-01-06,Widget B,Category 2,350.0,2
7,2025-01-07,Gadget A,Category 1,400.0,3
8,2025-01-08,Gadget B,Category 2,450.0,4
9,2025-01-09,Widget A,Category 1,500.0,5
10,2025-01-10,Widget B,Category 2,550.0,2
```

# 3. データの基本的な確認
データの基本的な情報を確認します。
``` analize.py
import pandas as pd

# CSVファイルの読み込み
data = pd.read_csv('sales.csv')

# データの先頭5行を表示
print(data.head())

# データの情報を表示
print(data.info())

# 基本統計量を表示
print(data.describe())
```
結果

![qiita-sales1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/8383a14c-4619-a279-06ab-f5832a0e1b84.png)

# 4. データの可視化
matplotlibとseabornを使ってデータを可視化してみます。

## ヒストグラム
まずは各製品の販売数の分布をヒストグラムで表示してみます。
``` analize.py
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# CSVファイルの読み込み
data = pd.read_csv('sales.csv')

# ヒストグラムの作成
plt.figure(figsize=(10, 6))
sns.histplot(data['Sales'], bins=30, kde=True)
plt.title('Histogram of Sales')
plt.xlabel('Sales')
plt.ylabel('Frequency')
plt.show()
```
結果

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/a2d154fa-5475-fd00-123d-bb8330f51902.png)

データがいい感じすぎて綺麗な形にはなってしまいましたが、いい感じに表示されました。

## カテゴリごとの販売数の比較
次にカテゴリごとの販売数の比較を棒グラフで表示してみます。
``` analize.py
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# CSVファイルの読み込み
data = pd.read_csv('sales.csv')

# カテゴリごとの総販売数を計算
category_sales = data.groupby('Category')['Sales'].sum().reset_index()

# 棒グラフの作成
plt.figure(figsize=(10, 6))
sns.barplot(x='Category', y='Sales', data=category_sales)
plt.title('Total Sales by Category')
plt.xlabel('Category')
plt.ylabel('Total Sales')
plt.show()
```
結果

![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/942ea3d1-e453-1f86-1ad7-24404dec4b2d.png)

分かりやすい図が表示されました。

# まとめ
今回はPythonを使った基本的なデータ解析を行ってみました。
数行のコードで綺麗な図がすぐに表示されるのでいいですね。
実際にはもっとでかいデータで細かい調整を行いながら解析するのだと思うので、これを機にもう少し深く勉強していきたいなと感じました。

以上、堀井でした。
Rubyで学んだあとに、簡単なTodoアプリを作りました！

実際のコードはこちら

    class Todo
      def initialize
        @tasks = []
       menu
      end
      def menu
        loop do
          puts "----------------"
          puts "選択してください"
          puts "1:タスクの追加" 
          puts "2:タスクの表示"
          puts "3:タスクの消去"
          puts "4:終了"
          puts "----------------"
    
          @input = gets.chomp.to_i
          case @input
          when 1
            add
          when 2
            display
          when 3
            erase
          when 4
            puts "終了します"
            break
          end
        end
      end
    
      def add
        puts "タスクを入力してください"
        @task = gets.chomp
        @tasks << @task
      end
    
      def display
        if @tasks.empty?
          puts "タスクはありません"
        else
        @tasks.each_with_index do |task , index|
          puts "#{index + 1} : #{task}" 
        end
      end
    
      def erase
        display
        puts "どれを消去しますか？"
        @del = gets.chomp.to_i - 1
        @tasks.delete_at(@del)
        puts "タスクが消去されました"
    
      end
    end
    
    todo = Todo.new
    
    end

なんとか検討しながら頑張りました。
配列を入れるためには「<<」が必要だと知った。
商品スケジュールを使用したサブスク商品管理



+ [一回限りの販売となる通常商品と、毎月売上が発生するサブスク商品が混在する場合、前者は商談商品レコードを集計しますが、後者は品目名スケジュールを集計することになり、集計単位が異なるため、１つのレポートで管理できないと思います。同じような運用をされている方がいらっしゃいましたら、うまい運用方法を共有していただけると助かります。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MXXpx) 


----

＞集計単位が異なるため、１つのレポートで管理できないと思います。 
そうですね、このままではできないと思います。 

 

探してみるとなかなか興味深いブログがありますね。 
以下では、商談側では受注金額として、商品スケジュールは実際の売上予定の月別の金額を管理しているようです。 

すごいのは商品スケジュールに月ごとを割り振る処理をフローで行っているところですね。再スケジュールにも対応しているとのこと。 

この部分のお知恵を拝借して、サブスク商品でなくても商品スケジュールの特定の月に売上を割り振るフローを作ることで入力の手間を省けば、全ての売上情報を商品スケジュール上に表現することができるので、商品スケジュールだけを月別に集計すれば、レポートの問題も解決できると思います。 

また受注は2024年12月、売り上げは2025年01月と受注・売上の両方を正確に管理できると思います。 

+ [Salesforce導入のその裏側の苦労と成果について ～これから導入する人への少しのアドバイスを添えて～](https://tech.aptpod.co.jp/entry/2023/12/01/100000)

+ [月額課金（サブスクなど）の商品を管理してる方必見！ 期間を指定した売上予測の見方](https://www.ccc.seraku.co.jp/service/columns/salesforce/01/51/)

以下の回答ではカスタムオブジェクトを使って月別の売り上げを管理しているそうです。弊社では商談を使わずにカスタムオブジェクト（件名）で商談と同じように受注を管理していますが、月をまたいで売上が発生するので売上予定はこの件名オブジェクトの子オブジェクトでやはり管理しています。 

全てを月別で管理できるオブジェクトに移行した方がレポートで確認するのは簡単になると思います。弊社の場合はApexでコーディングしたのですが、売上予定月が替わると再スジュールするような機能は実装しています。入力の手間を省ける機能があればこのやり方の方がいいと思います。 

+ [1年ごとの更新商談で商品スケジュールもコピーしたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000EkviWSAR)

---

受注金額と実際の売上金額（月単位）を同時に管理するには商品スケジュールを使うのがいいかもしれませんね。
Snowflakeコミュニティの初心者むけ勉強会が最高でした

# Snowflake Rookies Camp 勉強会に参加しました

2025年2月12日に開催された **Snowflake Rookies Camp** に参加させていただきました。その名の通り、「初心者向け」の勉強会ということで、私にピッタリだと思いました。

業務に追われながら何とか学習を進めていますが、社内にはSnowflakeの有識者がおらず、公式のトレーニングコースやコミュニティの皆様に助けられながら少しずつ理解を深めています。今回の勉強会も、そんな私にとって貴重な学びの機会となりました。

---

## 勉強会の内容

今回の勉強会は **第1回** ということで、**Snowflakeの3層構造の基本的な概要** など基本からスタートし、 **ハンズオン形式で外部ステージをロードし、クエリを実行する** ところまで学びました。

当日は、内容を目で追いかけるのが精一杯でしたが、**疑問点はチャットで質問でき、その場で回答をいただけた** ため、理解を深めることができました。講師の方々やコミュニティの皆さんのサポートが本当にありがたかったです。

---

## 実際に試してみたら権限エラー

翌日、自分でも **トライアルアカウント** で同じ操作を試してみました。しかし、コマンドを勘違いして**権限周りのエラー** に直面しました。

### **遭遇したエラー**
```sql
use role accountadmin;
grant operate on warehouse compute_wh to role sysadmin;
use role sysadmin;
use warehouse compute_wh;
```
```
Insufficient privileges to operate on warehouse 'COMPUTE_WH'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000419/79acdf1d-2f34-46cb-b627-40f8c756fffc.png)

「権限が不足している」というエラーですが、operate 権限を付与したはずなのにうまくいかない

## 解決策：usage 権限の付与

コミュニティのSlackで質問したところ、すぐにアドバイスをいただきました。本当にありがとうございます。

### 
正しいコマンド
```sql
grant usage on warehouse compute_wh to role sysadmin;
```
operate は実行制御の権限であり、クエリの実行権限は usage でないと付与されない とのこと。

以下の手順で権限を設定することで、正常に動作しました：

```
use role accountadmin;
grant usage on warehouse compute_wh to role sysadmin;
grant operate on warehouse compute_wh to role sysadmin;
use role sysadmin;
use warehouse compute_wh;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000419/8f7dcb47-ff59-4c0b-99c6-50ab74c082ec.png)


# 余談
# 外部ステージと `list` コマンドの関係を理解

COPY INTOでロードするところまでは理解したものの、Snowflakeの **外部ステージ** に格納された **CSVファイル** と、`list` コマンドの結果との関連性がよく分からず、色々と試してみました。  おかげで、どのようにデータを扱うのかを理解することができました。

---

## **試したこと**

通常、以下のように `list` コマンドを実行すると、外部ステージにあるファイル一覧が表示されます。

```sql
LIST @data_dumps;
```
s3://frostyfridaychallenges/challenge_1/1.csv
s3://frostyfridaychallenges/challenge_1/2.csv
s3://frostyfridaychallenges/challenge_1/3.csv


この状態で、以下のクエリを実行すると すべてのファイルの1カラム目 が表示されることが分かりました。

```
SELECT $1 FROM @data_dumps;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000419/6c91f0ec-278a-4879-8f1d-850374a04987.png)


つまり、@data_dumps に含まれる すべてのCSVファイルの1カラム目 が返される仕様になっています。

特定のファイルのみを対象にする方法
例えば、1.csv の1カラム目だけを表示したい 場合、以下のクエリを使うことで解決しました。（この方法は ChatGPT に聞いて教えてもらいました。）
```
SELECT $1 FROM @data_dumps (PATTERN => '.*1\.csv');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000419/d9d6077a-0892-49c6-99db-d4f46816b1ca.png)

このように、PATTERN を指定することで、外部ステージ内の特定のファイルだけを対象にすることができました。

# まとめ
SELECT $1 FROM @data_dumps; を実行すると、ステージ内のすべてのファイル の1カラム目が表示される。
特定のファイルだけを対象にしたい場合は、PATTERN を活用すると良い。
list コマンドを使えば、ステージ内にどのファイルが存在しているかを確認できる。
今回の試行錯誤を通して、 外部ステージ・CSVファイル・list コマンドの関連性を理解することができました。

今後も引き続き、Snowflakeの学習を進めていきたいと思います！
改めて、素晴らしいユーザーコミュニティの皆様に多大な感謝をもうしあげます。

2/18に再度開催予定とのことです
第1回Snowflake Rookies Camp～初心者向け勉強会～第2弾

https://techplay.jp/event/972535

初心者には絶対におすすめです。
Djangoで、検索条件が入力されている場合のみ検索条件をセットする

# はじめに
Djangoを始めて5時間ほどなので、絶対もっといいやり方がある気がします。
ぜひ教えて下さい。
（一応このコードで動作はしている）

# コード
```python:views.py
from .models import Question
from .functions import add_filter

def list(request):
    filter_dict = {}
    add_filter(filter_dict, request, "question_text__icontains", "text")
    add_filter(filter_dict, request, "pub_date__gte", "date_from")
    add_filter(filter_dict, request, "pub_date__lte", "date_to")

    context = {
        "question_list": Question.objects.filter(**filter_dict)
    }

    return render(request, 'polls/list.html', context)
```

```python:functions.py
# 検索条件があればセットし、空なら追加しない
def add_filter(filter_list, request, condition, value):
	if value not in request.POST:
		return

	filter_list[condition] = request.POST[value]
```

# おわりに
引数4つも渡すのはちょっと嫌なんだけど、仕方ないかなということで諦める・・。
流石に馴染みのない言語のフレームワークを使うとなると四苦八苦ですが、新しい知識を吸収するのは楽しい
Java で現在の日本標準時（JST）を取得する方法 

Java の `java.time` パッケージを使って、日本標準時（JST, UTC+9）を取得する方法を紹介します。  

#### 1. `LocalDateTime.now()` の問題点  
通常、`LocalDateTime.now()` を使うと、システムのデフォルトタイムゾーンの現在時刻が取得されます。  
しかし、サーバーのタイムゾーンが UTC になっている場合、日本時間ではなく UTC の時間が取得されてしまいます。  

```java
import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        System.out.println(LocalDateTime.now()); // システムのタイムゾーンの現在時刻
    }
}
```

この場合、日本時間とは異なる可能性があるため、明示的に JST（日本標準時）を指定する必要があります。  

#### 2. `ZonedDateTime` を使って JST を取得する  

Java では `ZoneId.of("Asia/Tokyo")` を指定することで、日本時間の現在時刻を取得できます。  

```java
import java.time.ZonedDateTime;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime jstNow = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println(jstNow); // JST の現在時刻
    }
}
```

`jshell` を使う場合は、次のコマンドを実行するだけで OK です。  

```java
java.time.ZonedDateTime.now(java.time.ZoneId.of("Asia/Tokyo"))
```

#### 3. `Instant` から JST に変換する  

もし UTC の `Instant` を JST に変換したい場合は、以下のように `ZonedDateTime` に変換できます。  

```java
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        Instant now = Instant.now(); // UTC の現在時刻
        ZonedDateTime jstTime = now.atZone(ZoneId.of("Asia/Tokyo"));
        System.out.println(jstTime); // JST の現在時刻
    }
}
```

#### まとめ  

- `LocalDateTime.now()` はシステムのデフォルトタイムゾーンに依存するため、日本時間を取得するとは限らない  
- `ZonedDateTime.now(ZoneId.of("Asia/Tokyo"))` を使うと、日本時間（JST）を確実に取得できる  
- UTC の `Instant` から JST に変換するには `Instant.now().atZone(ZoneId.of("Asia/Tokyo"))` を使う
【環境構築】PostgreSQLの導入方法

## ダウンロード
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

上記のURLから以下の画面を開き、最新のバージョン(今回は17.2)の"Windows x86-64"のボタンをクリックしダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/530fba5d-5030-d2b4-b21d-84526e693094.png)

## インストール

ダウンロードしてきたインストーラを開き、"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/8f464b4d-5f36-389b-8029-a3ef6c31c314.png)

デフォルトの設定の状態で"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/06ab730b-2eb2-89f2-1102-11c796290801.png)

デフォルトの設定の状態で"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/d614c4ac-c777-f87d-0f80-0ade6c077339.png)

インストール先に任意のパスを設定して"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/b96f9c37-9d84-efae-f8ea-58a940645056.png)

postgresユーザーのパスワードに任意のパスワードを設定して"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/1649e452-c6e1-5606-1106-67fa19d27d9d.png)

ポート番号のメモを取る。
ポート番号をデフォルトの設定の状態で"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/2c10ef9c-afe7-edc0-e61f-2eca17ffb4f6.png)

デフォルトの設定の状態で"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/9027ff31-c4b6-4df8-ca44-2cfcba546803.png)

"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/76d96a58-5176-c1e1-dc20-c2bfdca4a9f9.png)

"Next"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/f4c32811-4125-7ec9-1993-b4eddb17815d.png)

"Finish"をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003045/9576d254-5842-e4fe-22cf-a82d3faab81e.png)

## 設定

## 動作確認
具体的にEAPとかPEAPってどれがどれなんだよ！と思ったので簡単にまとめてみた

:::note warn
セキュリティのプロフェッショナルではないので誤りが多く含まれていると思います。
指摘していただけると大変助かります。
:::

# PAPとは…
認証方式であり、クライアントはサーバに対してユーザー名とパスワードを"平文"で提示して認証する。

:::note alert
単体での利用は非推奨(暗号化されずにそのまま経路上に流れるので)
:::


# CHAPとは…
認証方式であり、サーバはクライアントに対してチャレンジを送信し、クライアントはパスワードとチャレンジを組み合わせて"ハッシュ化"して提示して認証する。

:::note alert
単体での利用は非推奨(ハッシュが経路上に流れ、予測攻撃される可能性があるため)
:::


# EAPとは… 
Extensible Authentication Protocol
認証するためのプロトコル(取り決め)であり、具体的な認証方式は様々存在する。
それらの認証方式を下記に記す。

## EAP-MSCHAPv2とは…
EAPに則りMicrosoftが定義した認証方式であり、サーバはクライアントに対してチャレンジを送信し、クライアントはパスワードとチャレンジを組み合わせて"ハッシュ化"して提示して認証する。
MSCHAPv1と比べ、クライアントからサーバを認証する双方向認証に対応し、送受信で異なる暗号鍵を用いるよう改良された。

:::note info
基本的にMSCHAPv2単体では利用せず、後述のEAP-PEAPをPhase1として利用する。
:::

:::note alert
2012年に脆弱性が発見されており、以降使用するべきではないとされている。
Credential Guardでブロックされたのはこいつ。
:::


## EAP-TLSとは…
EAPに則った認証方式であり、サーバとクライアント同士で証明書を発行し、認証する。
俗に言う「クライアント証明書認証方式」を指す。
TLS1.2以前では証明書情報(Serial NumberやIssuer、Subjectなど)が平文でやり取りされるため、後述のEAP-TTLSまたはEAP-PEAPと組み合わせるのがマスト。
TLS1.3になるとハンドシェイクメッセージが暗号化されるため、証明書情報も安全になるが、NPSでは現在サポートされていない。

## EAP-TTLSとは…
EAPに則った認証方式であり、Phase 1でTLSトンネルを確立し、その後Phase 2で認証を行う。
Windowsでは上述のPAP、CHAPやEAP-MSCHAPv2、EAP-TLSなどをPhase 2で利用できる。
NPSでは現在サポートされていない。

## EAP-PEAP(または単にPEAP)とは…
EAPに則りMicrosoftが定義した認証方法であり、Phase 1でTLSトンネルを確立し、その後Phase 2で認証を行う。
Windowsでは上述のEAP-MSCHAPv2、EAP-TLSをPhase 2で利用できる。
MSCHAPv2をPEAPで利用する場合、PEAP-MSCHAPv2と表記されたりする。また、PEAP-MSCHAPv2を単にPEAPと表現している~~非常に良くない~~記述や資料も散見されている。
2023年にリモートコード実行の脆弱性が見つかっており、修正パッチが配信されている。

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-21692

> Phase 1のEAP-TTLSおよびEAP-PEAPは、いずれも経路の保護をするためのトンネルとなり、Phase 2のEAP-MSCHAPv2/EAP-TLS等でユーザーを認証する

# Q.EAP-TTLSとEAP-PEAPってどう違うんだい？
## A. トンネルを使うことは同じだけど色々違うっぽい
- EAP-TTLS
    - Func SoftwareとCerticomによって開発された
    - Phase2ではEAP以外も使える(PAPなど)
    - オープンな標準に基づき、幅広いネットワーク機器やソフトウェアで対応
    - でもNPSは対応してない
- EAP-PEAP
    - MicrosoftとCisco Systemsによって開発された
    - Phase2では特定のEAPのみ利用可能
    - 特にMicrosoft Windows環境で広く利用、対応している
    - [2023年にリモートコード実行の脆弱性が見つかっており、パッチによる修正済み](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-21692)


:::note warn
セキュリティのプロフェッショナルではないので誤りが多く含まれていると思います。
指摘していただけると大変助かります。
:::
Chrome で Web Worker をデバッグする便利なツール

Web Worker や Service Worker はデバッグが大変だと思っていました。

Chrome には Worker 専用のデバッグツール `chrome://inspect/#workers` が組み込まれていることを知ったのでご紹介です。

この記事では、次のようなシーンで使えるデバッグの方法を紹介します：
- Worker 内での console.log の出力確認
- よくあるトラブルの解決方法

## 環境
- Google Chrome 120以降（最新版推奨）
- Web Worker または Service Worker を使用したウェブアプリケーション

**注意**: Chrome のバージョンによって DevTools の UI や機能の場所が若干異なる場合があります。この記事は Chrome 120 以降を想定していますが、基本的な機能は同じように利用できます。

## Worker デバッグツールの基本

Chrome には Worker 専用のデバッグツールが組み込まれています。このツールにアクセスする方法は2つあります：

1. アドレスバーに以下を直接入力
   ```
   chrome://inspect/#workers
   ```

2. DevTools からアクセス
   - F12 キーまたは右クリック > 検証 で DevTools を開く
   - Application タブを選択
   - サイドバーから Service Workers セクションを選択

   **Tip**: DevTools が開いている状態で Ctrl+Shift+P (Mac では Cmd+Shift+P) を押し、"Show Workers" と入力することでも Web Workers 一覧を表示できます。

デバッグツールを開くと、現在実行中のすべての Worker が一覧表示されます。表示される情報は Worker の種類（Web Worker/Service Worker）によって若干異なりますが、主な情報として：

- Worker のスクリプトファイルのパス
- Worker の状態（"running"/"stopped"など）
- 登録時刻（Service Worker の場合）
- 所属するオリジン（ドメイン）
- Worker ID
- Worker のスコープ（Service Worker の場合）

これらの情報を確認できます。また、各 Worker の横にある "inspect" リンクをクリックすることで、そのWorker専用のDevToolsウィンドウを開くことができます。

## デバッグの実践的な手法

### コンソールログの確認

SharedWorker 内での `console.log()` の出力が DevTools コンソールには表示されない場合がありますが、このツールなら表示されます。

1. Worker 一覧から対象の Worker を選択
2. inspect をクリック
3. 新しく開いた DevTools ウィンドウでコンソールタブを選択

この方法で、Worker 内での出力やエラーメッセージを確認できます。

## トラブルシューティング

デバッグ中によく遭遇する問題とその解決方法をまとめました：

### Worker が表示されない場合

1. ページを再読み込み
2. DevTools を再起動（閉じて開き直す）
3. Chrome ブラウザ自体を再起動

### デバッグ接続が切れる場合

1. Worker の状態を確認（再起動されていないか）
2. ネットワーク接続を確認
3. ブラウザのキャッシュをクリア

## まとめ

Chrome の Worker デバッグツールのよいところ：

- Worker の実行状態をリアルタイムで確認可能
- コンソール出力やエラーメッセージを個別に確認

特に PWA（Progressive Web Apps）の開発やバックグラウンド処理を多用するアプリケーションの開発時には、このツールの活用が開発効率の向上に大きく貢献すると思います。

## 参考リンク
- [Chrome Developers - Debug Progressive Web Apps](https://developer.chrome.com/docs/devtools/progressive-web-apps)
- [MDN Web Docs - Using Web Workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)
国内４大通信キャリアのビジネスまとめ表

ふと、「国内通信キャリア各社のビジネスってどうなってるんだろう。サクッと確認したいからまとまった表があるといいなぁ」　と検索した際、あまり良い情報がヒットしなかった ＆ AI使っても微妙な結果しか得られなかったので、各社の公開情報を参考に、2025/2/12時点での、国内４大通信キャリアのグループ内企業で提供しているビジネスなどを丸っと一つの表にまとめてみました。

|項目| NTT | ソフトバンク | KDDI | 楽天 | 備考 |
|:-:|:-:|:-:|:-:|:-:|:-:|
|売上高|13兆3746億円|6兆7565億円|5兆7540億円|2兆713億|直近のFIX済み年度決算より|
|固定通信|ドコモ光/フレッツ光|SoftBank光|auひかり|楽天ひかり|戸建向けのFTTH系サービスを抜粋|
|移動体通信|NTTドコモ|ソフトバンク/Y!mobile|au|楽天モバイル|   |
|ポイントサービス|dポイント|PayPayポイント|Pontaポイント|楽天ポイント|   |
|クレジットカード|dカード(iD)|PayPayカード|au PAYカード|楽天カード|iDを書く場所を迷ったがここに書いておく|
|QR/バーコード決済サービス|d払い|PayPay|au PAY|楽天ペイ|   |
|銀行|なし。今後アップデートがあるかもしれない（ https://www.watch.impress.co.jp/docs/news/1661355.html ）|PayPay銀行|auじぶん銀行|楽天銀行|   |
|証券|マネックス証券( https://www.docomo.ne.jp/info/news_release/2023/10/04_00.html )|PayPay証券|他社との業務提携（ https://www.watch.impress.co.jp/docs/news/1639554.html ）|楽天証券|   |
|   |   |   |   |   |   |
|その他気になる話題|IOWN|OpenAIと提携|Adunaに出資|Rakuten AI 2.0発表|完全に個人的に気になったもののメモ|

こういう表を定期的にアップデートしていくと、時代時代での変化が見えるので何かの役に立つことがあるかもしれない。何より表にするとパッと見、わかりやすいし。
Tera Termのシリアル通信でファイルの送受信をする方法

# はじめに
　Tera Termのシリアル通信でファイルを送受信する方法を紹介する。

# 動作確認環境
* ホストPC
  * Windows 11 64bit (23H2)
  * Tera Term Ver4.106
* ターゲット (NVIDIA Jetson JetPack 5.1.1)
  * Ubuntu 20.04

# 事前準備

　ホストPCであるWindowsとターゲットをシリアル通信でつないでおく。今回はターゲットにJetsonを使った。Jetsonとのシリアル通信は、以下を参照。
* Jetson Orin Nano開発者キット: 詳細は[こちら](https://zenn.dev/hidenori3/articles/42125662f4b28e#%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%EF%BC%88uart%EF%BC%89%E3%82%92%E4%BD%BF%E3%81%86)を参照
* Jetson AGX Orin開発者キット:詳細は[こちら](https://developer.ridgerun.com/wiki/index.php/NVIDIA_Jetson_Orin/In_Board/Getting_in_Board/Serial_Console)を参照

## 依存関係のインストール

ターゲットで以下をインストールする。

```bash
sudo apt update
sudo apt install lrzsz
```

# 方法
　[ZMODEM](https://gallium.inria.fr/~doligez/zmodem/zmodem.txt)を使った方法を紹介する。

## ホストPCからターゲットへ送信

1. ファイルを受信するターゲットで、以下のコマンドを実行しファイル受信待機状態にする
    ```bash
    rz
    ```
    待機状態になることを確認
    ```bash
    rz waiting to receive.**B0100000023be50
    ```
1. ファイルを送信するホストPCのTera Termで、ファイルを選択して送信する  
  ファイル - 転送 - ZMODEM - 送信  

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/0c37b868-25de-993d-e191-35dbc5479285.png)

:::note warn
制約
今回試した環境では、ファイルサイズが約2KBを超えると上手くファイルを送信できなかった。Teratermの設定が必要だと思われる。現在、調査中。
* 参考
  * https://superuser.com/questions/1635104/zmodem-crashing-with-large-files-over-tcp
  * https://github.com/TeraTermProject/teraterm/pull/408
:::

## ターゲットからホストPCへ送信


1. ファイルを送信するターゲットで、以下のコマンドを実行してファイル送信待機状態にする
    ```bash
    sz -e {filename}
    ```
    * {filename}: 送信したいファイルパス


:::note

ポイント
今回試した環境ではCRCのチェックでエラーとなり受信できなかったため、受信コマンドに```-e```オプションをつけることで、エラーを回避する。

:::


1. ファイルを受信するホストPCのTera Termで、受信を選択する  
   ファイル - 転送 - ZMODEM - 受信  

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/0c37b868-25de-993d-e191-35dbc5479285.png)

1. ファイルが受信されると以下のフォルダに格納される

    ```C:\Users\{User}\AppData\Local\VirtualStore\Program Files (x86)\teraterm```
    * {User}：Windowsにログオンしているユーザ名

# まとめ

　Tera Termのシリアル通信でファイルを送受信する方法を紹介した。ネットワークが使えない環境などで有用。
　

# 参考

https://armadillo.atmark-techno.com/blog/53/981

https://ameblo.jp/itboy/entry-10964272833.html

https://github.com/FGasper/zmodemjs/issues/3#issue-424076865
【研修支援】Qiitaのスライドモードで録画アーカイブ用の案内スライドを作ろう＋応用例

# 新人研修・会議ファシリテーション用タイムシートテンプレート

実際にQiitaのスライドモードで使ったものをテンプレート化した。適宜書き換えて活用してほしい。単純な構成だが、実際に使ってみると想像以上に便利だった。

※コピーできるようにするため、本稿はあえてスライドモードにしていない。

```
---

# 個人ワーク(mm分)：（課題やゴールの状態を書く）

---

# グループワーク(mm分)：（課題やゴールの状態を書く）

---

# ディスカッション(mm分)：（テーマやなぜ話すのか、目的を書く）

---

# 朝礼（今日やること・目標など）

---

# 昼礼（中間報告）

---

# 終礼（今日の進捗、またはラストスパート）

---

# n限目（HH:mm~HH:mm）

---

# 休憩中（再開：HH:mm〜）
```

## 応用案

（以下、実際に使ったわけではない）

AIと相談しながら考察した内容で、効果がありそうなものを抜粋する。
基本スライドは１行だけしか書いていないのでシンプルでわかりやすい構成とした。
が、「具体的にこの時間は何をするのか」はやはり補足説明が必要なので、「文字数が増えれば増えるほどわかりにくくなる」という前提をもって、以下のような追加スライドを状況に応じて活用することで、ファシリテーションの質を向上させることができそうだ。

```
---

# アイスブレイク(5分)：（テーマ）

---

# 演習課題(XX分)
- 目標：〇〇を完成させる
- 制約：□□の機能のみ使用可
- 終了3分前にアナウンスします

---

# ふりかえり(10分)
- これからも継続したいこと（Keep）
  - 例：単体テスト作成の習慣
- 改善点（Problem）
  - 例：コミット粒度が大きい
- 次回から試す改善策（Try）
  - 例：コード変更ごとにコミットする

---

# 理解度チェック
1. 今日の内容は理解できましたか？
   【1】完璧 【2】だいたい 【3】あまり 【4】まったく
    Slackのスレッドにスタンプを押してください

2. 分からなかったポイントがあれば教えてください
   （専用チャンネルに投稿してください）

---

# 小休憩(5分)：ストレッチタイム
- 肩を回す（時計回り・反時計回り各10回）
- 首のストレッチ（前後左右各5秒）
- 深呼吸（3回）

---

# ペアプログラミング(30分)
- ドライバー：コードを書く人（15分）
- ナビゲーター：指示を出す人（15分）
- 途中で役割交代します

---

# 質問タイム(10分)
- 質問がある方は挙手または投票機能で
- チャットでの質問も受け付けます
- 質問がないなら、こちらから確認します

---

# 次回までの宿題
- 課題：〇〇を完成させる
- 提出方法：□□に提出（URL）
- 締切：△月△日 18:00まで
```

## ファシリテーションを成功させる小技集

### 時間管理のコツ
- 「残り5分」などの時間アナウンスはスライドに大きく表示し、音声と視覚の両方で伝える
- 個人ワークとグループワークの配分は2:3が基本、課題によって調整する
- 休憩時間は必ず守る。短縮はモチベーション低下に直結する

### 参加者の集中力を高める工夫
- 90分に一度は必ず立ち上がるアクティビティを入れる
- 午後の眠くなる時間帯（14:00-15:00）は議論やペアワークなど動きのあるセッションを配置する
- 質問投げかけの前に「10秒考える時間」を設けると回答の質が上がる

### スライド活用術
- 重要な指示は必ず文字で残す（聞き逃し防止）
- 議論のポイントはリアルタイムでスライドに追記し、可視化する
- カラーコードを決めておく（重要事項は赤、締切は青など）

### 新人研修特有のテクニック
- 理解度チェックはSlackやMiroなど匿名で投稿できる仕組みを活用する
- 「分からないことが分からない」状態の人向けに質問例をスライドに用意しておく
- 進捗に差が出始めたら、先行組にレビュアー役を任せ、教えることで学ぶ機会を作る

他にも良い方法があるはず。
本年度研修でも試行錯誤してみる予定。
箱庭でUnityを動かしてみる（1日目）

# はじめに
2025年2月〜3月の間（春休み期間）に，箱庭を用いたシミュレーションゲームを作ろうと思います

# 要件
- 箱庭を用いてシミュレーションゲームを作る
- シミュレーション環境にUnityを用いる
- 面白いゲームを作る（ココ重要‼️）

# 方向性
箱庭のチュートリアルを漁っていたら方向性が見えてきたので，以下に記しておきます
- ロボットにフローチャートをどんどん組み込んで，ライバルのロボットと対戦させるゲームを実装する‼️

# 2025/2/4（1日目）実施内容
## 導入
- GitHubリポジトリ作成
- 箱庭リポジトリをクローン・インストール
- Unityをインストール
- 箱庭ROSシミュレータをインストール

### リポジトリのREADMEに従って導入を進めていたが，Dockerの起動部分で詰まる
自力で解決できそうになかったため，issueから泣き言を吐きました（質問しました）
-> 無事解決

## ゲームの構想
- 元ネタは，私が小学生の頃に，パソコン室の演習でたった1回だけやらされたアプリゲームです
- 名前は覚えてなかったけど，ググった画像で探してみたら，おそらく「スペースロボチャート」というゲームでした
- ロボットにフローチャートをどんどん組み込んで，相手の球を避けながら自分の球を当てる，という内容です
- 今回はそれをUnityで再現しようと思います