OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub Organization の全リポジトリで誰にどんな権限が付与されているか一覧にする

# やりたいこと
権限棚卸しのために、GitHub Organization の全リポジトリで、誰にどんな権限が付与されているかを調べたい。

# やりかた

```bash

# 結果を出力するCSVファイルの準備
DATE=`date '+%Y%m%d_%H%M%S'`
OUTPUT_FILE="user_repo_permissions_${DATE}.csv"
echo "User,Repository,Permission" > "$OUTPUT_FILE"

# 権限を確認する
ORG="YOUR_ORGANIZATION" 
REPOS=("${(@f)$(gh repo list "$ORG" --limit 1000 --json name,isArchived | jq -r '.[] | select(.isArchived==false) | .name')}")
for REPO in "${REPOS[@]}"; do
  gh api "repos/$ORG/$REPO/collaborators" --paginate --jq '.[] |  "\(.login),'"$REPO"'," +  (if .permissions.admin then "admin" elif .permissions.push then "write" elif .permissions.pull then "read" else "none" end)' >> "$OUTPUT_FILE"
done
```

`YOUR_ORGANIZATION`は書き換えてください。

以下のようなCSV（user_repo_permissions_YYYYMMDD_HHMMSS.csv）が出力されます。

User | Repository | Permission 
--- | --- | ---
Tanaka | repo_a | write
Yamada | repo_a | admin
Saito | repo_b | read
Tanaka | repo_b | admin
AOJ ITP1_7_B How many ways?

## 思考過程
###  入力制約の確認
3 ≤ n ≤ 100
0 ≤ x ≤ 300

 最大でも  161700 通りなので、全探索でも十分処理可能と判断できる。

#### 解法の方針
##### 方法①：三重ループによる全探索
1 から n の整数から 3 つの異なる数を選ぶすべての組み合わせ (i, j, k) を列挙。

条件は i < j < k かつ i + j + k == x。

条件を満たす組み合わせの数をカウントする。

##### 方法②：組み合わせライブラリを使う（Ruby：combination / Python：itertools.combinations）
(1..n) の配列から 3 個取り出す全ての組み合わせを生成。

各組み合わせの和が x と一致するかを判定。
### 実装：Rubyコード（方法①：三重ループ）
```ruby
def count_combinations(n, x)
  count = 0
  (1..n-2).each do |i|
    (i+1..n-1).each do |j|
      (j+1..n).each do |k|
        count += 1 if i + j + k == x
      end
    end
  end
  count
end

# 入力処理
while line = gets
  n, x = line.split.map(&:to_i)
  break if n == 0 && x == 0
  puts count_combinations(n, x)
end



```
### 実装：Rubyコード（方法②：combinationを使う）
```ruby
def count_combinations_lib(n, x)
  (1..n).to_a.combination(3).count { |a, b, c| a + b + c == x }
end

while line = gets
  n, x = line.split.map(&:to_i)
  break if n == 0 && x == 0
  puts count_combinations_lib(n, x)
end
```
## Python
### 方法① 三重ループ
```python
def count_combinations(n, x):
    count = 0
    for i in range(1, n-1):
        for j in range(i+1, n):
            for k in range(j+1, n+1):
                if i + j + k == x:
                    count += 1
    return count

# 入力処理
while True:
    n, x = map(int, input().split())
    if n == 0 and x == 0:
        break
    print(count_combinations(n, x))
```
### 方法② 標準ライブラリ itertools.combinations
```python
from itertools import combinations

def count_combinations_lib(n, x):
    nums = range(1, n+1)
    return sum(1 for comb in combinations(nums, 3) if sum(comb) == x)

while True:
    n, x = map(int, input().split())
    if n == 0 and x == 0:
        break
    print(count_combinations_lib(n, x))

```
新入社員研修

# 新入社員研修

### 学習内容

- 開発言語の人気ランキング
　第1位　JavaScript　(Web開発での需要)
　第2位　HTML/CSS　(Web開発での需要)
　第3位　Python　(AI需要)　
 　

- 最も称賛されている言語は・・・
__🌟Rust🌟__
 
　Rustとは、C言語並みの高速性とメモリ効率を保ちつつ、
　安全性の高いプログラムを書けるモダンなプログラミング言語。
 
　また、バグが起こらないような仕組みであったり、
　コードを効率良く書くことができるといったメリットがある。
　
 
- 開発言語毎の平均年収
　- Erlang 1,510万円
　- PHP 744万円　(Erlangより2.3倍低い😲）
　需要があり、習得者が少ない言語であると高収入になる！！
 　

- Pythonを使ってみよう
  - Pythonの哲学
  >The Zen of Python, by Tim Peters
  Beautiful is better than ugly.
  Explicit is better than implicit.
  Simple is better than complex.
  Complex is better than complicated. 
  ・・・
  Namespaces are one honking great idea -- let's do more of those!

    - グラフの作成と表示方法
    ```Python
    import matplotlib.pyplot as plt
    x_values = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June']
    y_values = [100, 130, 80, 150, 140, 130]
    plt.bar(x_values, y_values)
    plt.plot()
    plt.show()
    ```
---
### 今日の教育に関する感想
今日の講義の冒頭では、業務には様々な役割があるということを学んだ。
フロントエンド技術者やDevOpsスペシャリストなど多くの種類があるが、
フルスタックエンジニア(全てをこなす人)が31%で一番多いことが分かった。
その理由としては、クラウドを活用した少人数での開発スタイルが
増加していることが原因である。

そして、講義の中盤では初めてPythonを扱った。
Google Colaboratoryを用いて実装を行ったが、
研修中に使用していたJavaよりも、コードがシンプルで分かりやすいため、
コーディングが快適に行えると感じた。
また、分からないコードがあっても自分で調べて、
すぐに理解する事ができたので、初心者でも扱いやすいと感じた。

終盤のVSCodeとGitの演習では、内容が複雑で難しかったが、
実務での開発においては、拡張機能やバージョン管理など、
とても便利な機能で役に立つのだろうなと感じた。

---
### 今日の内容を具体的に何に活用するか
業務の役割に関しては、自分の業務の役割とタスク(使命)を意識して、
常に自分が何のために働いているのかを認識し、有意義に働きたいと感じた。

多様な開発言語があることに関しては、言語によって難易度や
年収が変わってくるということを学んだので、
今までに学んだJavaやPythonだけでなく、
その他の言語も積極的に学んで、システムによって使い分けをしたり
自分のキャリアに活かしていきたいと思う。

実務で今後使えそうな機能としては、QiitaやChatGPT、VSCode、Gitなどが
あり、チームで効率的に作業をするために必要なものも多いと思うので、
扱い方を習得してスムーズに作業できるようになりたい。
ゲームを作らせて Amazon Q Developer CLI を学ぶ

## はじめに
Amazon Q Developer CLIでゲームを作るキャンペーンを行っていたので、この機にQ Developer CLIを初めて試してみることにしました。

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/


## Amazon Q Developer CLI

Amazon Q Developer CLIは、AWSが提供するAIアシスタント機能付きの開発支援ツールです。コマンドラインから直接AIとやり取りしながら、コード生成、ファイル操作、AWS リソース管理などが可能です。

### 主な特徴
- **自然言語でのコード生成** - 日本語での指示でもコードを生成
- **ファイルシステム操作** - ファイルの読み書き、ディレクトリ操作
- **AWS CLI統合** - AWSリソースの管理と操作
- **リアルタイム支援** - 開発中の即座なサポート
- **MCPサポート** - 外部MCPサーバーとの連携

## 今回作ったもの

![typing_game.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298428/5319809a-88dd-4da6-9986-53d4fafe503e.png)

## 作成の流れ

モデルの切り替え機能がリリースされたので、まずモデルをclaude-4-sonnetに切り替えました。
```bash
/model
```

### 1. 与えたプロンプト

最初に以下のプロンプトを与えました。たったこれだけ...
```bash
「ブラウザで動作する中学生向けタイピングゲームを作成してください。」
```
Thinkingからわずか数分で完成！
HTMLを生成するなんて簡単すぎるんですかね...
しかも動作も完璧で、時間が迫った時や不正解のギミックの動作も入っていました。

### 2. ドキュメント作成

```bash
フォルダ作成してHTMLをコピーし、READMEファイルを作成して
```

一つの指示で以下もやってくれました。
- `typing-game`フォルダの作成
- 生成したHTMLファイルをコピー
- ゲームの内容を記述したREADME.mdの作成

### 3. Qiita記事の下書き

```bash
Qiita記事の下書きもお願いします。
```
あまり好ましくないかもしれませんが、Qiita記事の下書きもお願いしてみました。
Qiita記事のmarkdownファイルも出力してくれたので、それをもとに修正してこの記事を書いています。
同一のセッション中で依頼したので、実際の途中のやりとりも含めて記事内容に取り込んでくれたのもよかったです。



## 実際の使用感

コマンドラインでの開発って正直どうなの？と思ってましたが、実際に利用すると非常に快適で、コードだけではなく、ローカルPC上の操作やQA、ドキュメント作成などいろいろな用途に使えそう。わずか数分で動作するゲームが作られるので、アイデアを素早く形にできるという意味で良さそうです。
急にThinkingが長くなったりすることも多かったので、処理走らせつつ別の作業をする感じがいいのかなと思います。


## MCPサーバーで画像生成

AWS MCP Serversを使えば、画像生成もできそうだったので、Amazon Nova Canvas MCP Serverで画像生成も試してみました。

https://awslabs.github.io/mcp/servers/nova-canvas-mcp-server/

### 設定手順

ワークスペースのMCP設定ファイルに以下を設定します。（.amazonq/mcp.json）

```json
{
  "mcpServers": {
    "nova-canvas": {
      "command": "uvx",
      "args": ["awslabs.nova-canvas-mcp-server@latest"],
      "env": {
        "AWS_PROFILE": "profile_name",
        "AWS_REGION": "us-east-1",
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
```

指定したAWS_PROFILEで認証し、q chatを実行すると利用できます。


別に作ってもらった以下のゲームでは、背景画像をNova Canvasで生成してもらいました。

![number_guessing_game.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298428/94d155a5-ed67-4dad-8f69-5f8710b1c0ca.png)

MCPサーバーを使ってみたかったこともあり、Amazon Nova Canvas MCP Serverでやりましたが、考えてみればuse_awsで普通に出来そうですね...



## おわりに
会社の同僚からこのキャンペーンを聞いて、実際に試すことになったのですが、
このキャンペーン参加で、Q Developer CLIを触れたので活用していきたいです。

AWS認証情報を設定すれば、AWSリソースを確認したり、今回作ったゲームをホスティングさせたりできるので試してみたいと思います。
（ただ更新権限をQ Developerに与えて、暴走しないか少し気になりますが...）
新入社員研修

# 新入社員研修感想

今回の研修では最初に自分の十年後の姿について考える時間が設けられていた。そのため講義の中で扱う内容が将来の自分にどう生かせるかを意識し、受講することができた。

具体的な学習内容としてはtypeScriptとjavaScriptの違い、最も称賛されたRustという言語、Pythonの概要やChatGPTの使用方法などがあった。これから役立つであろう知識についての内容であった上に、PythonとChatGPTについては自身で操作する場面があった為、楽しんで学習できた。また、開発言語毎の特性や需要と年収の関係を理解することで、将来のスキルアップやキャリアパスを考える参考になった。
講義の終盤はGit、GitHubについて学習した後、実際にそれを扱うことをおこなった。GitHubに関しては配属後に開発職であればほぼ確実に使うことが予想されるため、学習する姿勢に身が入った。

以上の内容を踏まえた上で、今後フルスタック開発者に近づけるように様々な言語の概要を把握し、幅広い開発分野での活躍ができるようになりたい。
本日の振り返り

## 本日の振り返り

### -今日の教育に関する感想
本日は、「近代的開発のすすめ」ということで業務の役割や、多様な言語、現代的な開発環境の操作まで幅広く学びました。座学だけでなく、アンケートやハンズオンもあったので、退屈することなく楽しく学ぶことができたと思います。自分はAIについて非常に興味があり、chatGptの使い方についての話は非常に楽しいものでした。
有料版にして使ってみようかな？と思うほど魅力的だったので業務で使いたい場合があれば、ぜひ契約してもらいたいと思います。

そして今日のgoalは
- 業務には多様な役割があることを知る
- 多様な開発言語があることを知る
- ChatGPTの基本的な使い方、注意事項が分かる
- 現代的な開発環境の基本操作ができる
- クラウドプラットフォームの基本を理解する
- 学んだ内容をアウトプットする

でした。学んだ内容をまだすべてアウトプットすることはできていませんが、それ以外の項目は演習を通してできていたので今後業務で活かしていきたいと思います。

### -今日の内容を具体的に何に活用するか
自分の将来の目標が、リーダーになってマネジメントを行うことなので、マネジメントの行い方や今後自分の課題となる問題をAIなどを活用して洗い出し、改善につなげていきたいと思います。
Rust言語でのデータの代入

## Rust言語でのデータの代入について
Rustではデータを変数を介して代入する場合の実装に「移動」と「コピー」があります。
この違いを理解しておかないと記述したプログラムが意図通りに動作しないことがあるので注意が必要です。

### 「移動」と「コピー」
Rustではデータの代入を「移動のセマンティクス（Move Symantics)」、「コピーのセマンティクス(Copy Symantics)」という2つの方式で実装を分けています。実際に移動とコピーがどのように違うのか記載します。

#### 移動のセマンティクス
---
「移動」はオブジェクト（メモリ上のデータ）を移動するのではなく、そのオブジェクトの所有権を移動する動作になります。
~~~rust
let v = vec![1,100,1000];
let w = v;
~~~
上記コードでは2行目の代入で移動が発生します。
この動きを図示すると以下の様になります。
・1行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/253559fe-0f03-45ee-ab66-36d012077d44.png)
・2行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/1f3bf245-4f5f-46a1-8438-7a05dceddfd5.png)
「移動」と言った場合、直感的にはデータ実体（オブジェクト）がメモリ上で移動する印象を受けますが、実際にはヒープ上のオブジェクトはそのままで、v,wの自動変数の間でオブジェクトの所有権が「移動」します。

もう一つの例は構造体ですが、構造体を自動変数として宣言した場合はオブジェクトはヒープではなくスタック上に確保されます。
~~~rust
struct Point {
    x: i32,
    y: i32,
}

let p = Point { x: 10, y: 20 };
let q = p;
~~~
上記コードでは6行目の代入で移動が発生します。
この動きを図示すると以下の様になります。
・5行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/a34605e8-3021-4f3f-9627-2c01a4dab59f.png)
・6行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/eadc5e8b-1be0-4d0b-9a15-eed2eb52b4b6.png)
スタック上のオブジェクトはそのままで、p,qの自動変数の間でオブジェクトの所有権が「移動」します。
#### コピーのセマンティクス
---
移動の場合、オブジェクトは単一のままですが、「コピー」の場合はオブジェクトのデータ実体を完全に複製します。
移動と同様にコピーもスタック、ヒープの両方のオブジェクトに適用されますが、スタックの場合は「コピー」、ヒープの場合は「クローン」と区別されます。
##### コピー
~~~ rust
let a = 1;
leb b = a;
~~~
上記コードでは2行目の代入でスタック上でのコピー（オブジェクトの複製）が発生します。「移動」で例示した構造体のケースと異なり、複製された２つの変数が指すオブジェクトは別物になります。このため所有権の移動は発生しません。
・1行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/a4efce2e-2f57-4d11-9514-5eb80a3ca7e6.png)
・2行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/399062b4-3f51-44eb-80df-6daac916f5e5.png)
また、後述しますが、構造体に対してCopyトレイトを実装すると構造体についてもこの例の整数型のプリミティブな型と同様にコピーを複製することが可能になります。
##### クローン
ヒープ上のオブジェクトに関しては単純に代入するだけでは複製（コピー）を作成することはできません。
この場合はオブジェクトの.clone()メソッドを呼び出す必要があります。
~~~rust
let v = vec![1,100,1000];
let w = v.clone();
~~~
・1行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/b3faa1a1-dcfe-4247-ae87-e9e9dc7442d7.png)
・2行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107100/03a2deac-ee2e-4561-97ec-a6f234f24932.png)
上記コードでは2行目の代入でヒープ上でのコピー（オブジェクトの複製=クローン）が発生します。「移動」で例示したケースと異なり、複製された２つの変数が指すオブジェクトは別物になります。このため所有権の移動は発生しません。
※ オブジェクトは宣言順にスタック上では下位アドレスに、ヒープでは一般的に上位アドレスに配置されます（ただしヒープは実行時のメモリ管理の都合で上位に配置される可能性もあります）。
### まとめ
「移動」と「コピー」についてその実装も含めて以下のようなルールになっています。
#### デフォルト動作
---
<dl>
<dt>プリミティブな型は「コピー」</dt>
<dd>数値、論理（bool)、配列、タプル、参照、静的文字列</dd>
<dt>移動</dt>
<dd>動的文字列、Box、コレクション、列挙体、構造体、タプル構造体</dd>
</dl>

またデフォルトが「移動」のものをコピー可能とするためにはclone()メソッドを用意する必要があります（動的文字列、Box、Vectorについては実装済み）

#### コピーとクローンについての留意点
---
コピーとクローンについては、それぞれCopyトレイト、Cloneトレイトを実装することで実現可能です。
ただし、Copyのみの実装は不可で、Copyは実装する必要があります。
<dl>
<dt>その他ルール</dt>
<dd>・プリミティブな型については両方実装されている</dd>
<dd>・コレクションはCloneしか定義できない</dd>
<dd>・ファイルハンドルの様に単一の実物と関連づいたものは両方とも不可</dd>
<dd>・列挙体、構造体、タプル構造体は両方を実装すればプリミティブな型と同様に扱えるようになる</dd>
</dl>
新入社員研修　最新技術動向についての課題

## 新入社員研修　最新技術動向

新入社員研修で最新技術についての研修があり、以下の内容を学んだ。
### 学んだ内容
- 開発言語
　Pythonについて
- AI活用
　chat GPTについて
- 開発環境
　VScode、Gitについて
- 開発体験
　Cloudflareについて

 学んだ内容を踏まえて２つの内容について記事にしたい。
- 今日の教育に関する感想 
- 今日の内容を具体的に何に活用するか

### 今日の教育に関する感想 
感想を各内容についてまとめたい。
開発言語について学んだが、ポピュラーな言語から習得難易度の高い言語複数を習得するとよりエンジニアとしての価値が高まると感じた。
chat GPTにより効率的に情報を収集できるので積極的に使っていきたい。
複数人で作業することが多いと思うので、バージョン管理のできるGitの操作習得は必須と考える。この際、プロキシを確認しないと、動作しないので使用時は注意したい。
最後にCloudflareはAWSより簡単にWebサイトが公開・更新できると感じた。

### 今日の内容を具体的に何に活用するか 
以上のことを踏まえ、目標であるフルスタックエンジニアになるには、今回学んだすべてのことをさらに使いこなす必要がある。今回使用したソフトは無料で使用できるものも多いので自宅で簡単なホームページを作成するなどして今回の内容はもちろん、未使用の技術の習得を目指したい。また、目標達成のためには膨大な技術や情報の習得が必須なのでAIを用いて楽して必要な技術や作成物を得る練習は今からでもできるので、さっそく行っていきたい。
生成モデルの基礎知識6 Gradient Checkpointing

こんにちは。
最近、NVIDIA-Certified Associate: Generative AI and LLMs (NCA-GENL)を習得しました。
その際に知っておいた方が良い基礎知識とコードの書き方を共有したいと思います。
生成AIのチュートリアル:

https://github.com/Yuji-github/Gen_AI_Tutorial

1. Gradient Checkpointing(勾配チェックポイント)とは？（トレーニングに使用）
Gradient Checkpointing自体は2016年くらいからあった技術なのですが、大規模のモデル（LLM）で、もう一度注目を集めている技術です。
Gradient Checkpointingは学習に必要なメモリ（sqrt(メモリ使用量)）を節約し、オーバヘッドを減らす技術です。
しかし、トレーニングの時間は10％から20％上昇します。

２．Gradient Checkpointingの構造
Gradient Checkpointingの目的はバックプロパゲーション（逆伝播）の最適化です。
![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108653/23dbf528-ce40-4b46-b7c0-de45f05569f5.gif)

 - フォワーディング（順伝播)の途中にある特定のポイント（「チェックポイント」と呼ばれる層の出力）でのアクティベーションのみを記憶。
 - バックプロパゲーション（逆伝播）の際に特定のチェックポイントから次のチェックポイントまでの間で勾配を計算する必要が生じた場合、保存されていない中間活性化値は、その場で再計算。

HuggingFaceでのやり方
```
from transformers import TrainingArguments
training_args = TrainingArguments(gradient_checkpointing=True)
```
【Lambdaのログ、まだ文字列で出してるの？】Logs Insights活用とJSONログの最適解


こんにちは！司空です！
今日は **AWS Lambda** を使ってる人ならぜひ知っておきたい
「**構造化ログ（JSONログ）でCloudWatch Logs Insightsを快適に使おう！**」
というお話です。

---

## そもそも CloudWatch Logs Insights ってなに？

CloudWatch Logs Insights（以下 Insights）は、CloudWatchに溜まったログを検索・分析するためのクエリツール。  
Lambdaのログをちゃんと整理しておくと、**めちゃくちゃ便利**に使えるんです。

---

## でも普通のログって…

たとえば、こんな感じでログ出してません？

```python
print("処理開始")
print(f"ユーザーID: {user_id}, ステータス: {status}")
```

CloudWatchでは、これが全部「ただの文字列」として保存されます。  
なので、**Insightsでフィルタするときにちょっとめんどくさい**んです。

---

## これをJSONにするだけで世界が変わる！

実は、**JSON形式**でログを出すだけで、CloudWatch側が中身を勝手に解析してくれて、**各キーに対してクエリが書けるようになる**んです。

```python
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(json.dumps({
        "message": "処理開始",
        "user_id": "abc123",
        "status": "active"
    }))
```

たったこれだけで、CloudWatch Logs Insightsではこんな風にクエリが書けるように👇

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648303/46c9c2bb-349f-4200-adff-67237a6338e8.png)


```sql
fields @timestamp, @message, user_id, status
| filter status = "active"
| sort @timestamp desc
```

---

## コツ：ログは全部JSONで出そう

Pythonなら `json.dumps()` で簡単にJSON化できます。  
ポイントは、**全部のログをJSONに統一すること**。  
途中で `"Starting process..."` みたいな普通の文字列を混ぜると、Insightsでは取り扱いにくくなるので、可能な限り全部をJSON形式で統一するのがおすすめ！

---

### ※日本語が文字化けしてしまう
`json.dumps()` を使って Python ログを JSON 形式で出力する際、日本語が文字化けして `\uXXXX` のようにエスケープされてしまうことがあります。
これは `json.dumps()` のデフォルト設定が `ensure_ascii=True` だからです。
`json.dumps(..., ensure_ascii=False)` を指定してください

```python
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(json.dumps({
        "message": "処理開始",
        "user_id": "abc123",
        "status": "active"
    }, ensure_ascii=False))
```

### ※Lambdaだとboto3, botocoreのログが出てしまう
原因
この二つのライブラリはデフォルト設定でWARNING以上のログを出力されるようになっている。
下記を追加する
```Python
logging.getLogger('boto3').setLevel(logging.WARNING)
logging.getLogger('botocore').setLevel(logging.WARNING)
```


### 補足：FastAPI や Django でも応用できる？

もちろん！構造化ログはLambdaに限らず、**どこでも便利**です。  
FastAPIやDjangoなら、`structlog` や `python-json-logger` を使うとスマートに出力できますよ。

---

## まとめ

✅ CloudWatch Logs Insights を使うなら構造化ログがマスト  
✅ Lambdaでのログは `json.dumps()` で出せばOK  
✅ フィルタ・分析・可視化が一気に快適になる

---

## おまけ：テンプレ関数

最後に、Lambda用の構造化ログテンプレを載せておきます👇

```python
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def log_info(**kwargs):
    logger.info(json.dumps(kwargs))

def lambda_handler(event, context):
    log_info(event_type="start", user_id="abc123", status="active")
    # 他の処理
    log_info(event_type="end", result="success")
```

ぜひ、構造化ログで快適なLambdaライフを！
Swiperを使おうと思ったら「〇〇が動かない！」となった場合

## 高機能なスライダー・カルーセルを簡単に実装できるJSライブラリ「Swiper」

https://swiperjs.com/

Swiperは高機能なスライダー／カルーセルを簡単に導入できるJavaScriptライブラリです。

たとえば、以下のようにCDNから読み込むだけで、スライダー＋サムネイル＋ナビゲーションといった複数機能を持つスライダーがすぐに動作します。

https://codesandbox.io/p/sandbox/6j86wp?file=%2Findex.html%3A192%2C8

```HTML
  <!-- Swiper JS -->
  <script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>

  <!-- Initialize Swiper -->
  <script>
    var swiper = new Swiper(".mySwiper", {
      spaceBetween: 10,
      slidesPerView: 4,
      freeMode: true,
      watchSlidesProgress: true,
    });
    var swiper2 = new Swiper(".mySwiper2", {
      spaceBetween: 10,
      navigation: {
        nextEl: ".swiper-button-next",
        prevEl: ".swiper-button-prev",
      },
      thumbs: {
        swiper: swiper,
      },
    });
  </script>
```

## npmインストールに変更した時にハマった
CDNや配置したアセットを読み込む場合は問題なく動作しますが、npmからSwiperをインストールして、以下のようにインポートして使おうとすると、
```JavaScript
// import Swiper JS
import Swiper from 'swiper';
// import Swiper styles
import 'swiper/css';

const swiper = new Swiper(...);
```
……スライダー自体は表示されても、ナビゲーションやサムネイル連動、自動再生といった機能がまったく動作しなくなってしまいます。

## Swiperはモジュール制になっている
ドキュメントにもちゃんと書いてあるのですが、

https://swiperjs.com/get-started

>By default Swiper exports only core version without additional modules (like Navigation, Pagination, etc.).

npm経由で使う場合は、必要な機能を明示的にインポートする必要がありました。

### 必要な機能を個別に読み込む
```JavaScript
// core version + navigation, pagination modules:
import Swiper from 'swiper';
import { Navigation, Pagination } from 'swiper/modules';
// init Swiper:
const swiper = new Swiper('.swiper', {
  // configure Swiper to use modules
  modules: [Navigation, Pagination],
  ...
});
```

### 全部入りを読み込む
```JavaScript
// import Swiper bundle with all modules installed
import Swiper from 'swiper/bundle';
```

ドキュメントをきちんと読めば書いてあることではありますが、読まずに時間を無駄にしてしまいました。
npmで使う際は、モジュール構成に注意して、必要な機能を忘れず読み込むようにしましょう。
新入社員教育

# 本日の感想

本研修では「10年後の自分の役割を考える」というアンケートが行われ、その際には、自分がどのようなエンジニアを目指したいのかを真剣に考えるきっかけになり、有意義な時間であった。

また、ChatGPTやGitなど、今まで触ってこなかった機能やシステムの基本操作も実際に体験し、今後の業務に非常に役立つ内容であった。



---

## 今後の活用について

本日学んだChatGPTやGitに関しては、今後の業務の基本となると予測されるので、自発的に活用していくことで、実際に業務で使用する際に円滑に利用できるようにしたい。
また、業務だけでなく、趣味としても活用していこうと考えているので、日常的なプログラミングや、日々の学習、またアイデア整理等にも積極的に取り入れていきたい。

---
新入社員教育

### 新入社員教育

## -  本時の教育に関する感想
　　本時の研修では、まず10年後の自分の役割という部分で私は名称やその内容を初めて詳しく知った。今後の自分が何を目指して仕事をやっていけばいいか明確になったのでその目標は意識して今後働いていきたい。特にフルスタックエンジニアについて目指してみたいと感じたので今後もっと深く学んでいきたいと思う。
    午後からの研修では、実技を含め先端技術を多く学んだ。自分自身が知らなかった知識や技術を多く学ぶことができ、特に仕事に生かせれば効率も成果量も上げられると感じたのでしっかりと今後学んでいきたい。

##
    
## -  今後の活用
  今後としてはフルスタックエンジニアというところを目指してやっていきたい。そのためには技術力や知識も上げることも大切だが、様々なコミュニティや勉強会などに参加していきたい。
  また、私自身クラウドに興味を持っていて本時も学ぶことができ、改めてその興味を感じた。まずは資格取得を目標に勉強し、知識をつけてれるようにやっていきたい。1年目は様々なことがあって大変だと思うが資格取得を必ずできるようにやっていきたい。
  また、今日言語化の難しさとAIを使うには正しく説明できる力がないといけないと痛感したので今後は正確に思うように使えるよう言語化の能力をいち早くつけていきたい。
新入社員教育についての感想

## 今日の教育に関する感想

#### 役割
　役割について学んだ。PGやSEといった言葉しか知らなかったが、さらに細かくフルスタック開発者やモバイル開発者、DevOpsスペシャリストなど様々な役割があることを知った。
　私は**フルスタック開発者**として、開発に関して幅広く携われる人材になりたい。

#### 開発言語

　開発言語について、人気や平均年収など様々な面から学んだ。人気な言語はJavaScriptやHTML/cssであり、Web需要の増加が要因だと思われる。PythonはAI分野、SQLはデータベース分野で使われるため人気であった。またTypeScriptは、JavaScriptの型安全性や可読性を向上させた言語であり近年人気になっているそうだ。私はC言語とJava、SQLしか理解できておらず、様々な言語を学ぶ必要があると感じた。
　他にもRustという言語が最も称賛されており「メモリ効率が良く早く動かせる」「C言語でよく起こるバグの最善」「長くなる文章を簡単に書ける」などの利点があるそうだ。C言語は、はじめてのプログラミングで使用したため、Rustにも興味がわいた。
　エリクサーという言語は、低電力のため宇宙やAI分野での活躍が見られると知り驚いた。**言語は書き方だけでなくハードの面でも違いがある**と知ったので、今後はその時その時で適切な言語を使えるようになりたい。

#### Python

　Pythonに少しだけ触れたが、コードを書く量が少なく書きやすいと感じた。文字列を表示するのにも以下のような違いがあり、他にも型の変換が容易であるなどの利点があった。今後使用する可能性があるので、空いた時間に簡単なプログラムを書き習得したい。

```Java:title.java

System.out.println("Hellow,World");

```

```Python:title.py

"Hellow,World"

```

#### 人工知能

　ChatGPTについて学んだ。レポートや卒業論文では使用が禁止されていたため、企業では活発に使われていることに驚いた。言語化がうまくいかない時や分析など様々なタイミングで使うことができるが、指示の出し方が重要になる。例があるとよりよいそうなので、今後は例を意識して指示をだしたい。

#### 開発環境

　VSCodeはメージャーな開発環境であり、様々な拡張機能があった。あればいいなと思っていた機能が追加でき、この拡張性が人気の要因だと考えた。
　GitHubはチーム開発においてほぼ必須のツールだと感じた。


#### Webフレームワーク

　AWSが一強だと思っていたが、他のクラウドプラットフォームもそれぞれ特徴がありCloudflareは特に使いやすいと感じた。

## 今日の内容を具体的に何に活用するか

　今回の研修を通じてフルスタック開発者という目標を持つことができたので、今後のキャリアの指針にしたい。また、今後は業務で使わない言語であっても、流行りの言語を自分で学習し習得したいと感じた。具体的にはC言語が改善されたRustを学んでみたい。Pythonは比較的敷居が低いと感じたので、明日以降時間を見つけて習得し今後の業務に活かしたい。
 　VSCodeやGitHubといったツールは今後も業務の中で使う可能性があるので、日ごろから活用し業務に活かしたい。
新入社員教育

## 新入社員教育　感想
### ◎今日の教育に関する感想

本日の研修を通じて、明確なビジョンを持って働いていくことの大切さを強く感じました。将来どのようなエンジニアになりたいのかを今一度真剣に考え、その目標に向かって、日々の学習を積み重ねていく必要があると感じました。

また、プログラミング言語の需要と供給を意識しながら、今後のスキルアップ・キャリアアップにつながる技術の選定と学習を行うことが重要だと再認識しました。

さらに、Gitの使い方についての説明を受け、開発現場ではGitの習得が必須であると感じました。非常に便利なツールであり、今後開発に携わる時は業務に直結する知識だと思うので、実際に使いながら身につけていきたいです。


### ◎今日の内容を具体的に何に活用するか

本日の学びを今後に活かすために、まずは多様なプログラミング言語の中から、自分の将来像に合ったものを選び、重点的に学習を進めていきたいと考えています。そうすることで、入社後の業務やキャリア形成に役立てていきたいと思います。

本日の研修を通して、自分はフロントエンドの分野に携わりたいという思いがあることに気付きました。研修の中で、デザイン領域で明確に地位を築いている方は少ないというお話を伺い、自分の中で強みとなる分野を確立することの重要性を感じました。

今後は、HTML/CSSやJavaScript、JSPなどのフロントエンド技術に加え、デザインの基礎的な知識も積極的に学び、現場で即戦力として活躍できるようスキルを高めていきたいと考えています。それに加え、様々な分野の垣根を越えて現場で活躍できるフルスタック開発者を目指すためにも、様々な学習を意欲的に進めていきたいと感じました。

また、VSCodeやGitといった開発ツールに関しても、配属後すぐに実践できるよう、復習を重ねてしっかりと使いこなせるようにしていきたいです。現場でスムーズに業務に入れるよう、日々の自主学習も意識して取り組んでいきます。
[React]レンダリングの仕組み

# はじめに
Reactにおけるレンダリングについて、改めて復習をしたのでその備忘録をまとめます。

初学者ゆえ、誤った記載があればご指摘いただけると幸いです。


# Reactアプリのコンポーネント描写の流れ
Reactのアプリケーションにおいて、画面の更新は以下の3ステップを経て行われる。

1. トリガー
2. レンダー
3. コミット


## 1.トリガー
画面の更新をする際には、きっかけ(トリガー）が必要。
Reactにおいてはこのトリガーは大きく分けて2種類ある。

1. 初回のレンダリング
初めてアプリが表示される時にトリガーが発動する。
Reactがコンポーネントに対して初回描写を支持して、画面表示がされる。

2. コンポーネントのstate更新
初回レンダリングが実施された後は、以下のケースをトリガーとして画面更新がされる。

- Stateの値が更新された時
- 渡されたpropsの値が変更された時
- 親コンポーネントが際描写された時

これらをトリガーとして、Reactがコンポーネントに更新指示を出す。

## レンダー
レンダーとは、`Reactがコンポーネントを呼び出すこと`と定義される。
つまり、トリガーで受け取った内容を元にコンポーネントを呼び出して、画面に表示する内容を把握するということ。
(どのような内容が反映されるべきなのか、差分を確認する)

- 初回レンダー時：Reactはrootコンポーネントを呼び出す。
- 2回目以降のレンダー時： stateの値の更新によって、トリガーされた関数コンポーネントを呼び出す。

※コンポーネントの階層が入れ子になっている場合は、ネストされるコンポーネントがなくなるまでレンダリングが続く。

なお、レンダーのタイミングでは`DOMの更新`は行われず、あくまで差分のチェックのみが実施される。

## コミット
コンポーネントを呼び出した後、ReactがDOMを変更することをコミットという。

- 初回レンダー時：作成したすべてのDOMノードを画面上に描写する
- 2回目以降のレンダー：最新のレンダー出力に合わせて、最小限の変更点のみDOMに反映する。

## 参考
https://ja.react.dev/learn/render-and-commit


# 補足：Stateの値更新時の注意点
以下のようにカウントボタンをクリックして、stateで管理をしているcountの値を更新するプログラムがあった場合、handleClick関数内で2回`setCount(count + 1);`の処理を実行しても、countは1つしか増えない。

```js:
import { useState } from 'react';

export default function CountNum() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
    setCount(count + 1);
  };

  return (
    <>
      <button onClick={handleClick}>カウント</button>
      <p>{count}回、クリックされました。</p>
    </>
  );
}
```

値が2つずつ増えないのは、`Reactが非同期にStateを更新するから。`
Stateに新しい値が更新されるのは、`イベントハンドラーの処理が終わった後`であるため、handleClick関数内でcountの値が更新されることはない。

そのため、関数内ではcountの値が更新されず、加算が1回しかされない。

常に新しい値で演算をするためには、`set関数`に関数型の引数を渡して演算する。

#### 例
```
set〇〇(現在のstate値 => 更新のための式)
```

先ほどの例の場合だと、handleClick関数内を以下のように記載する。
```js:
  const handleClick = () => {
    setCount(c => c + 1);
    setCount(c => c + 1);
  };
```
2025/6/16 研修の感想

# 本日の感想

- 本日の研修では、コミュニティの存在、Qiitaの使用方法、開発言語、Google ColaboratoryでのPythonの実習、chatGPT・GitHub・VSCodeの使い方など様々なことを学んだ。
- 現役のエンジニア内でのアンケート結果は今の流行などが分かり、これからの目標を立てるのに役立てようと思う。
- GitHubやVSCode、Google Colaboratoryは部署配属された後も使用すると思うので、17時を過ぎたらどこに何のメニューが配置されているのか程度でも把握しておきたい。
新入社員教育

## 近代的開発のすゝめ(2025/06/16)

### 感想
> 最も人気のある開発言語はJavaScript、2位はHTML/CSS、3位はPython

個人的には1位がPython、2位にJavaがランクインすると予想していたが、近年のWEB需要から __JavaScript__ 、 __HTML/CSS__ がランクインし、AI需要から次点で __Python__ が入る結果となった。時代のトレンドが顕著に表れていて非常に興味深いランキングだった。

---

また、今回実際にPythonを使用してみて、Javaと比較したときのコードの書きやすさに驚いた。Javaでは _Hello,World_ を出力するだけでも
> public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World");}
}

と冗長になるのに対して、Pythonでは

> print("Hello, World")

とシンプルなコードで表すことができる。個人的にはシンプルで分かりやすくコードを書くことができるPythonのほうが好みに感じた。

---

GitHubに関しては、概念的な部分に関しては理解できたものの、実際に業務で使用できるレベルにはないので練習が必要だ。

### 学習内容の活用方針
 配属部署によって業務内容は大きく異なってくるため、一概にすべての最新技術を活用するというのは難しいが、それぞれの業務に適したサービスを都度見極めて活用していきたい。個人的には生成AIに興味があるため、現場での開発で使えるように練習したい。
javeでASCII文字を扱う

## 日本語をASCII文字へ変換。
native2ascii [オプション] [入力ファイル] [出力ファイル]
cmdで
```.cmd
native2ascii ja.sjis a.txt
```

## ASCIIを日本語へ変換。
```.cmd
native2ascii -reverse ascii.txt a.txt
```

## native2asciiとは
native2ascii コマンドは Java環境で標準的に使われる方法で、日本語を Unicode エスケープ（\uXXXX 形式）に変換するため非常によく使われる。
JDKに含まれている。
`C:\Program Files\Java\jdk1.8.0_111\bin\native2ascii.exe`

## なぜnative2asciiがjdkに含まれている？
java8まではプロパティファイルをアスキーで読む必要があった。
java9からはutf-8でも読み込めるようになった(一部のプロパティを読むAPIのデフォがutf8になった)。
spring bootだとv2.4からデフォルトでapplication.properties や application.yml は UTF-8として読みこむ。

native2ascii は「Javaが非ASCII文字を扱えなかった時代の遺産」。
モダンなアプリ開発では不要になるケースが多いが、古い資産や国際化処理のために今でもJDKに含まれているというのが実態。
(もちろん最小限構成であるJREには含まれない。)
OpenShift Lightspeedを使用する

# 初めに
2025年6月現在、RedHatから下記のLightspeed（LLMを使用したAIアシスタント機能）が提供されています。
・Ansible Lightspedd
・Red Hat Enterprise Linux Lightspeed
・OpenShift Lightspeed

その中で、本記事ではLightspeedについて紹介します。

# 1. Openshift Lightspeed でできること
### 1-1.チャットによる質問回答
OpenShiftやその関連コンポーネント（OpenShift Virtualization、GitOps、Pipelinesなど）に関する質問に自然言語で答えてくます。
以下の例では、「What is Openshift imagestream used for ?」と質問をし、LLMで生成された結果を表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/b7ccedf3-1453-28df-5316-4aec4a7c214e.png)

### 1-2. リソースをコンテキストに追加しての質問回答
Deployment、Pod、Service、Alertなどの詳細画面から直接チャットボットにリソース情報を追加して質問できます。
以下の例では、「AlertmanagerRecieversNotCponfigured」アラートをコンテキストに追加して、質問した結果を
表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596593/11c808b9-73ee-4693-8c30-5a0fd08b0e0b.png)


# 2. 導入手順
### 2.1. LLM環境の用意
Openshift Lightspeedでは、以下のLLM Providerを使用することができます。
・RHEL AI
・Openshift AI
・IBM watsonx.ai
・OpenAI
・Azure OpenAI

この記事では、watsonx.aiを使用することとします。IBM Cloud上でのwatsonx.aiのサービスのデプロイ手順は省略しますが、後ほど、watsonx.aiのサービスをデプロイしたIBM CloudのAPIキー、watsonx.aiで作成したProjectIDが必要になりますので、控えておきます。

### 2.2. Lightspeed Operatorの導入
OpenShiftのWebコンソールのOperatorから「OpenShift LightSpeed Operator」をクリックし、画面に従い
Operatorを導入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/41af07af-218d-87f4-5f8a-aba141ead3f6.png)

### 2.3. watsonx.aiに接続するためのAPIキーのsecretの作成
以下の内容でsecretを作成します。
```
apiVersion: v1
data:
  apitoken: <bese64 encoded your_api_token>
kind: Secret
metadata:
  name: watsonx-api-keys
  namespace: openshift-lightspeed
type: Opaque
```

### 2.4. OLSConfigの作成
LLMサービス（プロバイダー）の情報と使用するモデルを指定した、OLSConfigというカスタマーリソースを作成します。
以下の内容で、OLSConfigを作成します。
```
apiVersion: ols.openshift.io/v1alpha1
kind: OLSConfig
metadata:
  name: cluster
spec:
  llm:
    providers:
      - credentialsSecretRef:
          name: watsonx-api-keys
        models:
          - name: ibm/granite-3-8b-instruct
        name: myWatsonx
        type: watsonx
   ｃｈ     url: 'https://jp-tok.ml.cloud.ibm.com'
        projectID: <your project id>
  ols:
    defaultModel: ibm/granite-3-8b-instruct
    defaultProvider: myWatsonx
```

### 2.5. チャットボットの起動
OpenShift Web Consoleの右下に、チャットボットのアイコンが表示されるので、
クリックすると、チャットボットの画面が出てきます。
macOSでPythonとNode.jsの複数バージョンを管理する完全ガイド

# はじめに

開発プロジェクトでは、異なるバージョンのPythonやNode.jsが必要になることがよくあります。この記事では、macOSで複数のバージョンを効率的に管理する方法を、実際の環境構築手順とともに解説します。

# 必要なツールの概要

## バージョン管理ツール
- **pyenv**: Pythonのバージョン管理
- **nvm**: Node.jsのバージョン管理
- **Poetry**: Python依存関係管理（仮想環境も提供）

## インストール方法の選択
- **Homebrew**: macOSのパッケージマネージャー（推奨）
- 各ツールの公式インストールスクリプト

# 環境構築手順

## 1. Homebrewの確認
```bash
brew --version
# Homebrew 4.5.2
```

## 2. Poetryのインストール
```bash
# Homebrewでインストール
brew install poetry

# バージョン確認
poetry --version
# Poetry (version 2.1.3)
```

## 3. nvmのインストール
```bash
# 公式インストールスクリプトを使用
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# シェル設定の再読み込み（.zshrcに自動追加される）
source ~/.zshrc
```

## 4. Node.jsのインストール
```bash
# Node.js v18をインストール
nvm install 18

# 使用するバージョンを指定
nvm use 18

# バージョン確認
node --version
# v18.20.8
```

## 5. pyenvのインストール
```bash
# Homebrewでインストール
brew install pyenv

# .zshrcに設定を追加
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

# 設定を反映
source ~/.zshrc
```

## 6. Pythonのインストール
```bash
# Python 3.10をインストール
pyenv install 3.10.15

# グローバルで使用するバージョンを設定
pyenv global 3.10.15

# バージョン確認
python --version
# Python 3.10.15
```

# プロジェクトごとのバージョン管理

## Node.js: .nvmrcファイルの活用
```bash
# プロジェクトルートに.nvmrcを作成
echo "18" > .nvmrc

# プロジェクトディレクトリに入ったら
nvm use  # .nvmrcを自動的に読み込む
```

### 自動切り替えの設定（zsh）
```bash
# ~/.zshrcに追加
autoload -U add-zsh-hook
load-nvmrc() {
  if [[ -f .nvmrc && -r .nvmrc ]]; then
    nvm use
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
```

## Python: pyenvとPoetryの使い分け

### pyenvでローカル設定
```bash
# プロジェクトディレクトリで実行
pyenv local 3.10.15
# .python-versionファイルが作成される
```

### Poetryで仮想環境を管理
```bash
# プロジェクト内に仮想環境を作成する設定
poetry config virtualenvs.in-project true

# 依存関係をインストール
poetry install

# 仮想環境の有効化（どちらでもOK）
source .venv/bin/activate  # 従来の方法
poetry shell              # Poetry専用コマンド
```

# Poetryの仮想環境について

## なぜプロジェクトごとに仮想環境を作るのか？

1. **独立性**: 他のプロジェクトと依存関係が混ざらない
2. **再現性**: `poetry.lock`で完全に同じ環境を再現
3. **安全性**: システムのPythonを汚染しない

## 使い方の比較

### 従来の方法
```bash
source .venv/bin/activate
python main.py
deactivate
```

### Poetry方式
```bash
poetry run python main.py  # 一時的に実行
poetry shell              # 新しいシェルで仮想環境
```

# PythonとNode.jsの違い

## Python（venv/Poetry）
- プロジェクトごとに**パッケージ環境**を分離
- Python本体のバージョン + インストールされたパッケージ

## Node.js（nvm）
- **Node.js本体**のバージョンを切り替え
- `node_modules`は元々プロジェクトごとに独立

# まとめ

macOSでの開発環境構築のポイント：

1. **Homebrewで可能な限りインストール**（管理が楽）
2. **プロジェクトごとにバージョンを固定**（.nvmrc、.python-version）
3. **Poetryで依存関係を管理**（poetry.lock）
4. **仮想環境は慣れた方法で使える**（source .venv/bin/activate）

これらのツールを使いこなすことで、複数のプロジェクトを同時に開発する際も、バージョンの競合を避けて効率的に作業できます。

# 参考リンク

- [pyenv GitHub](https://github.com/pyenv/pyenv)
- [nvm GitHub](https://github.com/nvm-sh/nvm)
- [Poetry 公式ドキュメント](https://python-poetry.org/docs/)
【ChatGPT】画像生成AI用のPromptを生成するPrompt Generatorです。


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

　今回は、画像生成AI用のPromptを生成するPrompt Generatorです。

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

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

　[niji・journey公式ポスト](https://x.com/nijijourney/status/1934468782430593460?t=W5Y4iZXnJZr3OuRWR2Yi3g&s=19)

　なんと、あの画像生成AIの
　　Midjourneyの姉妹品である
　　　niji・journeyも
　　　　動画生成をはじめました。

　とはいえ
　　まだサンプルの
　　　描画をしている段階です。
　　　　Coming soonとか。

　niji・journey
　　Video Edition　というらしい。

　以下のリンクには
　　多くの画像が寄せられ、
　　　それを動画化して
　　　　アップしています。

　[niji・journey公式ポスト](https://x.com/nijijourney/status/1934130309513265281?t=1PtuOO-fm51h_0GlYseygQ&s=03)

　niji・journeyは
　　アニメやイラストに
　　　特化した画像生成AIです。

　それが動画生成へと
　　サービス拡大するということは
　　　やはり動画が競争には不可欠と
　　　　判断したのでしょう。

　これからを
　　楽しみに待つとしましょう。
***
***
　では、【本題】です。

　今回は、
　　画像生成AI用のPromptを生成する
　　　Prompt Generatorです。

　画像生成AIには
　　いくつかあります。

　Midjourneyやniji・journey、
　　ほかにもどんどん出てきています。

　そうした画像生成AIに
　　対応したPromptを書くのは
　　　慣れていないと、大変です。

　そこで
　　Prompt Generatorを
　　　作成しました。

　使い方は
　　Prompt Generatorを入力・送信して
　　　やり取りします。

　こちらがPrompt Generatorです。

```Text:画像生成AI用Prompt Generator
あなたはプロンプトエンジニアとして、さまざまな画像生成AIに対応したプロンプト作成をサポートします。以下の手順で進めてください。

1. まず、利用可能な画像生成AIの種類（例：ChatGPT 4o Image Generation、DALL-E、Stable Diffusion、Midjourney など）を箇条書きで提示し、ユーザーにどれを使いたいか選んでもらいます。

2. 選択されたAIごとに必要となるパラメータ（例：画像サイズ、アスペクト比、画風、バージョン等）を提示し、ユーザーに希望を入力してもらいます。

3. 次に、ユーザーが描きたいイメージについて詳細にヒアリングします。以下の観点から質問してください：
   - 世界観（例：ファンタジー、SF、日常、歴史もの等）
   - スタイル（例：リアル、アニメ風、イラスト、油絵、ドット絵等）
   - 構図（例：バストアップ、全身、背景の有無、遠近感等）
   - 光の雰囲気（例：朝焼け、夜景、逆光、柔らかい光等）
   - ディテール（例：色の傾向、小物や背景のこだわり、表情など）

4. ヒアリングした内容をもとに、最初の詳細なアートプロンプト文を作成し、ユーザーに提示してください。

5. プロンプト文を見てもらい、色味・雰囲気・構図など「もっとこうしてほしい」という改善点や要望をヒアリングし、回答をもとに改良したプロンプト文を再度提示します。

この流れを、ユーザーが納得するまで繰り返し、最適なプロンプトを仕上げてください。
```

　わからない部分はお任せでも
　　ChatGPTが盛ってくれます。

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

　今回は、ここまで。
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default valueエラーの解決

**いつ出たか**
登録処理の作成後、処理を走らせると出てきた

**エラー文**
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into evaluations (title, count, content, book_id, updated_at, created_at) values (テスト, 4, テスト, 9, 2025-06-16 05:44:38, 2025-06-16 05:44:38))

**エラーの内容**
user_idに値が入っていないですよー。というもの。
厳密に言うと、user_idのデフォルト値がないですよ、と言われている。

**解決まで**
以下は対象のコントローラー部分

```php
public function store(Request $request,$id)
    {
        $book = Book::find($id);
        $user = Auth::user();

        DB::transaction(function() use($request,$book,$user){
            $evaluation = Evaluation::create([
                'title'=>$request->title,
                'count'=>$request->count,
                'content'=>$request->content,
                'book_id'=>$book->id,
                'user_id' =>$user->id
            ]);
        });
        return redirect()->route('evaluation.index',['book_id'=>$book->id]);
    }

```

見た感じだと問題はなさそう。

$user = Auth::user();はログインしているユーザーの情報を全て持ってきてくれるが、念の為デバッグしてみると

```
	"id" =>9
    "name" => "管理者"
    "email" => "kanri@au.com"
    "email_verified_at" =>null
    "password" => "$2y$10$x3L/lpJPRPzcSRrz.V9E1OtSFxdQFMZqZmv66ypoJp50qlprcTn"
    "authority" => "admin"
    "remember_token" =>null
    "created_at" => "2025-05-31 01:52:56"
    "updated_at" => "2025-05-31 01:52:56"
```

きちんと入っていた。

ではどこが悪いのか、次にモデルを確認してみると、、

```php
class Evaluation extends Model
{
    use HasFactory;

    protected $fillable = [
        'id',
        'title',
        'content',
        'count',
        'book_id',
    ];

    public function book()
    {
        return $this->belongsTo(Book::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
```

fillableにuser_idを入れ忘れていた。

ここの中にuser_idの記述をすると、登録処理を無事に動かすことができた。

些細なミスであるが、時間はがっつり取られてしまったので気をつけたい。
プログラミングド初心者卒業への道その１タッチタイピングを習得しよう！！

# タッチタイピングって必要？？
こんにちわ～～～！！！！！！！
今日は二回目の投稿です。精一杯頑張りますよ～～！！
今日はタッチタイピングの指南について書きたいと思います
まず始めに、皆さんが気になっているのは**タッチタイピングって必要！？？**これだと思います。結論から申し上げると絶対に必要ではないです（笑）でもできて困ることはないし、できるとプラスしかありません。調べ物をするときもコードを書く時も何か文章を書く時も基本的にはタイピング使いますよね( ´∀｀ )
そうなんですよ！結構パソコンを使う人にとって身近なのに軽視されがちなんです！！
ちょっと覚えたいと思ってるんじゃないですか( ´∀｀ )？？
それではタッチタイピング習得に向けて頑張っていきましょ～～～～～！！！！！

# タッチタイピングを習得する最短の方法
タッチタイピングができるようになる最短の方法、、、、それはホームポジションをしっかり把握することです。
ぼくも最初パソコンを買ったからにはタッチタイピングができたほうがかっこいいんじゃないかって思って、何にも調べずにがむしゃらにパソコンを触っていた時期がありました（笑）
でもそれだと変な癖がつくし、何より上達していく感覚をつかむのが非常に遅いと感じるんですよね～
ではどうするのか、そう**ホームポジション**を意識するんですよ。そんなこと知ってるよ！！って思った人も多いでしょう、でも本当に理解できていますか？？
出来ている人ほどタイピング早い気がします。だって先人の方たちが発明して長年この形になってるんですよ～～？それってこれが一番だっていう証明になってるじゃないですか！！
ってな感じでホームポジションを意識してほしいんですけど、いまホームポジションって何って聞かれてしっかり頭で図をイメージできる人は大丈夫だと思います。
具体的にはｊに左人差し指ｆに右人差し指をおいてそこから横のキーに指をどんどんおいていくと完成です！！
基本過ぎましたかね( ´∀｀ )
このキーの配置を意識して普段からパソコンを使うようにするんですよ。
この時のポイントが**別に手元を見てもいいということです**
最初から完璧を求めても長続きしないので、最初はホームポジションにそってキーを押せるようにする。次に手元を見なくともキーが打てるようにする、そして最後にスピードをあげるという風にしていくといいと思います。
個人的な話ですが、僕はこの方法で１か月もすればタッチタイピングができるようになっていました。
寿司打とかEタイピングなどのタイピングゲームをうまく活用するのもおすすめです
ここだけだったらただのありがちなことしか書いてないと思うので、僕の中でこれをしとけば間違いない！と思う練習方法があるのでお伝えして、この記事を終わろうと思います。

# 普段の会話をキーボードに
これを意識し始めるとタイピングがめちゃくちゃ早くなったと思います。
そう、日常の言葉を一回タイピングキーで再現するのです。例えば、大学の教授が個々テストに出ますよ！と言ったら頭の中でkokotesutonidemasuyoって頭の中でキーボードを打つんです。膝とか机とか使うとやりやすいかもしれません。もちろん学業に支障が出ない範囲でですが（笑）

今回書いたことを実践していただければタッチタイピングを効率よく習得してすばらしいITライフを過ごせることと思います。
皆さんプログラミングの学習がんばっていきましょ～～～！！！
それではまた( ´∀｀ )
T1




通过自问自答学习日语时，可以设计多层次的问题来强化记忆和理解。以下是针对单词、语法及你提到的「不正防止として正しいのはXXX」句式的具体建议：

---

### **1. 单词内化问题**
**基础层面：**
- この単語の読み方は？ （例：不正 → ふせい）
- この単語の意味は？英語で何と言う？ （例：防止 → prevention）
- 反対語/類義語は？ （例：不正 ⇔ 正当、防止 ⇔ 促進）

**应用层面：**
- この単語を使った簡単な文を作ってみよう  
  （例：不正防止のためにカメラを設置した）

---

### **2. 语法内化问题**
**针对「〜として」「正しいのはXXX」结构：**
- 「〜として」の文法意味は？ （表示立场/身份/用途，相当于"as..."）
- この文法を使った他の例文は？  
  （例：学生として勉強する / 対策として会議を開く）
- 「正しいのはXXX」の役割は？ （强调唯一正确答案，类似"the correct one is..."）

**组合练习：**
- 「不正防止として正しいのはXXX」のXXX部分を入れ替えてみよう  
  （例：不正防止として正しいのは**パスワード管理です**）

---

### **3. 场景化深度提问**
**逻辑思考：**
- 不正防止として他にどんな方法がある？  
  （例：二段階認証、監査ログ）
- この文を否定形/過去形に変えると？  
  （例：不正防止として正しくなかったのはXXX）

**角色扮演：**
- もし会社のIT担当なら、不正防止についてどう説明する？  
  （例：「弊社では、不正防止として生体認証を導入しています」）

---

### **4. 输出检验问题**
- この表現を自分の仕事/生活に関連付けて文を作れるか？  
  （例：SNSの不正防止として正しいのは**パスワードを定期的に変えることです**）
- 今日学んだ単語・文法で日記を書いてみよう

---

### **5. 进阶挑战**
- 「〜として」と似た文法「〜にとって」との違いは？  
  （对比："as a measure" vs "for someone"）
- 「不正防止」のような「漢字3字+する」単語を他に挙げられる？  
  （例：データ削除、情報共有）

---

### **操作建议：**
1. **卡片记忆法**：将问题写卡片正面，答案写背面  
2. **录音对比**：自问自答后听录音找错误  
3. **联想网络**：用思维导图链接相关词汇（例：不正防止→セキュリティ→ハッキング対策）

通过这些问题，不仅能记住知识点，还能培养用日语组织逻辑的能力。最初可先用中文提问，逐渐过渡到全日语自问自答。
TablePlusを使用したデータベースのバックアップとリストア

# はじめに
業務でTablePlusを使用していますが、バックアップとリストア機能がうまく使えずちょっと面倒でした。
いまさっき成功したのでメモします。


# 対象
- 適当なデータベース
- Dockerで立てる


```docker
version: '3.8'

services:
  postgres:
    image: pgvector/pgvector:pg15
    environment:
      POSTGRES_DB: rag_db
      POSTGRES_USER: rag_user
      POSTGRES_PASSWORD: rag_password
    ports:
      - "5433:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  postgres_data:

```

# 接続
バックアップしたいデータベースに接続する

# バックアップする
メニューからバックアップを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727564/45fbb654-3251-4623-a6d6-5deae73defd7.png)


バックアップしたいDBを選択する
add optionから--format=customを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727564/d0b52595-7626-4bc2-ab04-516aacbadec7.png)


バックアップを実行する



# リストアする
メニューからリストアを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727564/e0fe3cdb-af04-4581-90d7-3d15f7fd35fc.png)

リストアしたいDBを選択する
バックアップしたファイルを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727564/de48dd3d-3ed8-434b-ae41-4a3a6cf5e7f3.png)






# 終わり
これでリストアできます。
フォーマット指定を今までずっと間違えていたようです
dotenvxの基本操作

# 経緯・なぜやるのか

サービス拡大に伴い環境変数の個数がかなり多くなり、Parameter StoreをIaC管理するのが辛い（現状のやり方で暗号化できるファイルサイズに限界があった）
溢れた分は手運用。。。きつい
たまにしか弄らないから基本コマンド忘れるのでメモ

doetnv x 暗号化 ＝ dotenvx
で全部解決できそうだった

# メリット・デメリット

復号用のプライベートキー（以下PK）だけクラウド側や環境変数として管理すれば良くなる（もちろん流出しないようにし、他の環境変数はPKから復号して設定するようになる）
他の環境変数は暗号化された状態のファイルとしてソースコード側に置いておける

ただし、環境変数の確認に常にPKが必要になり、確認や設定はdotenvよりは手間がかかる

# インストールなど

[dotenvx公式](https://dotenvx.com/)

https://github.com/dotenvx/dotenvx

名前よくないよね。dotenvばっかりでる

```bash
$  curl -sfS https://dotenvx.sh|sh 
```

```bash
$ dotenvx --version
1.44.2
```

# 基本的な使いかた

## 環境変数ファイルを暗号化

```bash
$ cat .env
DATABASE_USERNAME=hogehoge
DATABASE_PASSWORD=fugafuga
DATABASE_NAME=piyopiyo
...
```

```bash
$ dotenvx encrypt -f .env
✔ encrypted (.env)
✔ key added to .env.keys (DOTENV_PRIVATE_KEY)
ℹ add .env.keys to .gitignore: [echo ".env.keys" >> .gitignore]
ℹ run [DOTENV_PRIVATE_KEY='XXXXXXXX' dotenvx run -- yourcommand] to test decryption locally
```

```bash
$ ls -a
.env.keys # 復号キー
.env # 暗号化された環境変数
...
```

```bash
$ cat .env
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
#/            public-key encryption for .env files          /
#/       [how it works](https://dotenvx.com/encryption)     /
#/----------------------------------------------------------/
DOTENV_PUBLIC_KEY="XXXXXXXX"

# .env
#local
DATABASE_USERNAME="encrypted:BI8BXXXXXXXXXXXXXXXXXXXXqIw="
DATABASE_PASSWORD="encrypted:BFiRtXXXXXXXXXXXXXXXXXZ0tw=="
DATABASE_NAME="encrypted:BOwKXXXXXXXXXXXXXXXXXXXXXXXXXX=="
...
..
```

:::note alert
絶対に.env.keys(復号キー)はGitHubに上げたり誰でもアクセスできる場所にUPしないこと
:::

## 環境変数の確認

```bash
$ dotenvx get -f .env|jq #jq便利なので入れたほうがいい
{
    DATABASE_USERNAME="hogehoge",
    DATABASE_PASSWORD="fugafuga",
    DATABASE_NAME="piyopiyo",
    ...
}
```

## 環境変数の追加・編集・削除

### 追加

```bash
$  dotenvx set HELLO production -f .env           
✔ set HELLO with encryption (.env)
```

```bash
$ dotenvx get -f .env|jq
{
    DATABASE_USERNAME: "hogehoge",
    DATABASE_PASSWORD: "fugafuga",
    DATABASE_NAME: "piyopiyo",
    ...
    HELLO: "production" # 追加された環境変数
}
```

### 編集

```bash
$ dotenvx set HELLO staging -f .env  
✔ set HELLO with encryption (.env)
```

```bash
$ dotenvx get -f .env|jq             
{
    DATABASE_USERNAME: "hogehoge",
    DATABASE_PASSWORD: "fugafuga",
    DATABASE_NAME: "piyopiyo",
    ...
    HELLO: "staging" # 編集された環境変数
}
```

### 削除

unset 的なサブコマンドはまだ無いため
decrypt → 行を消す → encrypt の３ステップ

```bash
$ dotenvx decrypt -f .env                      
✔ decrypted (.env)
```

好きなエディタで行を消してから下記実行

```bash
$ dotenvx encrypt -f .env
```

# プログラム側での利用方法

コンテナなら下記のようにしてください
Node.jsを想定
他の言語を使用している場合はLLMに聞けば良いし、既存のDockerfileの編集でいけると思います

```bash
$ cat Dockerfile

...
COPY .env.production . # 環境変数ファイルコピー
RUN curl -sfS https://dotenvx.sh/install.sh | sh
CMD ["dotenvx","run","--env-file=.env.production","--","node","server.js"]
```
【PowerShell】Windowsのスクリーンセーバーのロックを回避

# 【PowerShell】<Outlookのmsgファイルを変換>

## ■はじめに
:::note info
- **この記事は？**
Windowsのスクリーンセーバーのロックを回避するスクリプトを解説
:::
## ■スクリプトの概要
:::note info
- **何をするスクリプトか？**
マウスを常に動かして、Windowsのスクリーンセーバーのロックを回避
:::
:::note info
- **どんな場面で役に立つか？**
複数のPCで作業時に、未操作のPCの画面ロックを回避する
:::

## ■動作確認環境
:::note info
- Windows 11 Pro 24H2 (OS ビルド 26100.4351)
- PowerShell 5.1.26100.2161
:::

## ■スクリプトのソースコード
```powershell:furufuru.ps1
#################################################################################
# furufuru　　　　　　　　　　　　　　　　       
#################################################################################
function furufuru {
<#
.SYNOPSIS
    スクリーンセーバー・ロック回避用マウス移動ツール
.DESCRIPTION
    一定間隔でマウスカーソルをわずかに動かし、スクリーンセーバーや画面ロックを防止します。
.EXAMPLE
    furufuru
.NOTES
    Ctrl+C で停止してください。
#>

    # .NETのCursorクラスを利用するためにSystem.Windows.Formsをロード
    Add-Type -AssemblyName System.Windows.Forms

    # mouse_event の定義（既に定義済みならスキップ）
    if (-not ("Win32Functions.Win32MouseEventNew" -as [type])) {
        $signature = @'
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
        Add-Type -MemberDefinition $signature -Name "Win32MouseEventNew" -Namespace Win32Functions -PassThru | Out-Null
    }

    Write-Host "マウスふるふるを起動します。"
    Write-Host "Ctrl+Cで終了します。"

    # 定数・変数定義
    $MOUSEEVENTF_MOVE = 0x00000001
    $SleepSec = 50
    $MoveMouseDistance = 1
    $MoveMouseDistanceX = 1
    [bool]$Flag = $true

    try {
        while ($true) {
            Start-Sleep -Seconds $SleepSec

            # 現在位置取得
            $x = [System.Windows.Forms.Cursor]::Position.X
            $y = [System.Windows.Forms.Cursor]::Position.Y

            # マウスを左右にわずかに移動（物理的な動き）
            [Win32Functions.Win32MouseEventNew]::mouse_event($MOUSEEVENTF_MOVE, -$MoveMouseDistance, 0, 0, 0)
            [Win32Functions.Win32MouseEventNew]::mouse_event($MOUSEEVENTF_MOVE, $MoveMouseDistance, 0, 0, 0)

            # 座標を変更（アプリの座標監視対策）
            if ($Flag) {
                $x += $MoveMouseDistanceX
            } else {
                $x -= $MoveMouseDistanceX
            }
            $Flag = -not $Flag

            [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
        }
    } finally {
        Write-Host "`nマウスふるふるを停止しました。"
    }
}

# --- 関数実行用 ---
# --- 関数を実行 ---
furufuru
```
TeradataからSnowflakeへのデータマイグレーション - 2 

# TeradataからSnowflakeにデータ移行の検証 -　続き

https://qiita.com/NTTD-niwats/items/6c99d3914093a6115075

前回は、Teradataからのデータ抽出方法についてご紹介しました。
今回はその続編として、抽出したデータをSnowflakeにロードする方法について解説します。

## 1. SnowSQL - COPY INTO によるデータロード準備（接続情報の設定）
Snowflakeにデータをロードするには、対象となるアカウントやデータベースへの接続情報が必要です。これらは コマンドラインで直接入力するのではなく、外部ファイルとして設定しておくと管理しやすくなります。
ここではその例として、config.cnf というファイルとしています。

以下は、接続情報を定義した設定ファイルのサンプルです：

![Connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695372/0eaa517f-da7a-4688-b4c2-15717ae0b37a.png)

### 外部ファイルの構造について
1つの設定ファイル内に、複数の接続情報をセクションごとにまとめて記述することが可能です。
構成は、以下のように「セクション名」「キー名」「値」で成り立っています。

|カテゴリ|パラメータ|説明|
|----|----|----|
|セクション: connections.xxxx|xxxx は任意の文字列|Snowflake接続情報を識別するセクション名<BR>ここではその例として、xxxx はTESTとしています。|
|キー: アカウント名|accountname|接続先のSnowflakeアカウント名|
|キー: ユーザー名|username|Snowflakeに接続するユーザー名|
|キー: パスワード|password|上記ユーザーのパスワード|
|キー: データベース名|dbname|データロード先のデータベース名|
|キー: スキーマ名|schemaname|データロード先のスキーマ名|
|キー: ウェアハウス名|warehousename|クエリ実行・ロード処理で使用するウェアハウス名|



#### ファイル保存について
設定が完了したら、任意のファイル名で保存します。今回はこの設定ファイルを Config という名前で保存しました。
このように外部ファイルを用意することで、接続先の切り替えが容易になり、スクリプトの汎用性と保守性が向上します。

## 2. SnowSQL - COPY INTO によるデータロード：ロード用SQLファイルの作成
Snowflakeへデータをロードするには、COPY INTO コマンドを記述したSQLファイル（資材）を作成します。ここではその例として、Sample_table.sql というファイルとしています。

以下は実際のファイル内容のイメージです：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695372/47ff987d-c5e5-4b76-b13b-c63bd2964576.png)

|パラメータ|子パラメータ|説明|
|----|----|----|
|From ...|-|外部ステージ名（TeradataのExportファイルが格納されたS3等）|
|FILE_FORMAT|TYPE|ファイル形式：CSV を指定|
|FILE_FORMAT|FIELD_DELIMITER|区切り文字：パイプラインを指定|
|FILE_FORMAT|DATE_FORMAT|日付形式：Teradata Export時のフォーマットに合わせて指定（例：YYYY-MM-DD）|
|FILE_FORMAT|TIME_FORMAT|時間形式の指定（例：HH24:MI:SS）|
|FILE_FORMAT|TIMESTAMP_FORMAT|	タイムスタンプ形式の指定（例：YYYY-MM-DD HH24:MI:SS）|
|FILE_FORMAT|FIELD_OPTIONALLY_ENCLOSED_BY|オプションの囲み文字："（ダブルクォーテーション）|
|FILE_FORMAT|COMPRESSION|圧縮形式：Teradata側で使用したものに合わせて指定（例：GZIP）|
|PATTERN|-|対象ファイル名のパターン（例：'.*\.gz'）|

📘 詳細な構文やパラメータ指定については、以下の公式ドキュメントを参照ください：
https://docs.snowflake.com/ja/sql-reference/sql/copy-into-table

## 3.SnowSQL - COPY INTO によるデータロード：実行手順
作成したSQL資材をもとに、SnowSQLからコマンドを実行してSnowflakeへのデータロードを行います。
SnowSQLがインストールされた環境から、以下のコマンドを実行します。

#### 実行コマンド例：
snowsql -config "<接続情報設定ファイル名>" -c "<セクション名>" -f "<SQL資材ファイル名>"

|パラメータ|説明|
|----|----|
|-config|接続情報を定義した設定ファイル名（フルパスでも可） |
|-c（セクション名）|設定ファイル内の該当セクション名（例：connections.test）|
|-f（SQLファイル）|ロード対象のSQL資材ファイル名（例：Sample_table.sql）|

## まとめ
SnowSQLの COPY INTO を使うことで、Teradataから抽出・変換されたファイルを、構造・形式を保ったままSnowflakeに効率よくロードできます。
設定ファイル・ロード資材の構成を明確にすることで、環境の切り替えや複数テーブルへの展開にも柔軟に対応できます。
【公式ドキュメントから学ぶPythonチュートリアル】#2 制御フローツール

# 今回の内容
https://docs.python.org/ja/3.13/tutorial/controlflow.html

## if 文
```python
x = int(input("Please enter an integer: "))

if x < 0:
    x = 0
    print('Negative changed to zero')
elif x == 0:
    print('Zero')
elif x == 1:
    print('Single')
else:
    print('More')
```
- `switch 文`, `case 文` は `if ... elif ... elif ...`で代用する
- [match 文](https://docs.python.org/ja/3.13/tutorial/controlflow.html#tut-match)

## for 文
```python
# 文字列の長さを計測:
words = ['cat', 'window', 'defenestrate']
for w in words:
    print(w, len(w))
```
- `C言語` や `Pascal言語` とは少し違うので注意！
- 任意のシーケンス型（リストまたは文字列）にわたって反復を行う
- 反復の順番はシーケンス中に要素が現れる順番
- コレクションオブジェクトの場合は `コレクションオブジェクトのコピーに対して反復処理をする` or `新しいコレクションオブジェクトを作成する` のどちらかで反復処理を行うのがベスト

## range() 関数
```python
for i in range(5):
    print(i) # 出力結果: 0 1 2 3 4
```
- 数列にわたって反復を行うときに使う
- `range(開始値, 終了値, ステップ)`
- [ループのテクニック](https://docs.python.org/ja/3.13/tutorial/datastructures.html#tut-loopidioms)

## break 文
```python
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(f"{n} は {x} * {n//x} と等しい")
            break
```
- その `break 文` を内包している最も外側にある `for 文` or `while 文` から抜け出すことができる　

## continue 文
```python
for num in range(2, 10):
    if num % 2 == 0:
        print(f"偶数 {num} を見つけた")
        continue
    print(f"奇数 {num} を見つけた")
```
- ループの次のイテレーションを実行する
- 上のプログラムの例では、`continue` が出たら一番上の `for` に戻るということ

## ループの else 節
```python
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, 'は', x, '*', n//x, 'と等しい')
            break
    else:
        # 因数が見つからないとループは最後まで実行される
        print(n, 'は素数です')
```
- `for 文`: `break`が発生しなかった場合に実行される
- `while 文`: ループ条件が偽となった後に実行される
-  どちらのループでも、ループが`break` または `return`で終了した場合、`else` 節の実行はスキップされる
- [try 文](https://docs.python.org/ja/3.13/reference/compound_stmts.html#try)

## pass 文
```python
while True:
    pass  # キーボード割り込み(Ctrl+C)のためのビジーウェイト
```
- `pass 文` は何もしない。プログラム上何の動作もする必要がないときに使われる
- 例１：最小クラスの作成のときに使用
- 例２：新しいコードを書いているときの関数や条件文の仮置きの本体として使用。こうすることで、より抽象的なレベルで考えることができる

## 補足
- 記事中のプログラムは、全てPython公式チュートリアルからコピーさせていただきました
- 公式チュートリアル後半の `関数定義` については、#3 で投稿予定です