OmniAICreator/Qiita-1.07M huggingface dataset:
NERDTree コマンド一覧まとめ

## はじめに
vimのplug inで良さそうなの見つけたからArch Linuxに放り込んで遊んでみたのでまとめました。
NERDTreeってそもそも何って人はこんなページにたどり着かないと思うので紹介やインストール方法は省きます。
Git行けば書いてます。

## まずこれだけ覚えればOK

| コマンド | 意味 |
|:-----------|------------:|
| :NERDTreeToggle	 | NERDTreeウィンドウの表示/非表示切り替え（.vimrcでキーバインド登録しておくのが無難） |
| :NERDTree | NERDTreeを開く（表示オン） |
| :NERDTreeClose | NERDTreeを閉じる |
| Enter | ファイル・ディレクトリを開く |
| o | ノーマルオープン（横分割しない） |
| t | 新しいタブで開く |
| i | 垂直分割で開く |
| s | 水平分割で開く |
| q | NERDTreeウィンドウを閉じる|

## 慣れてきたらここも

| コマンド | 意味 |
|:-----------|------------:|
| u | 1つ上のディレクトリに移動 |
| r | ディレクトリツリーを再読み込み |
| R | ルートディレクトリから再読み込み |
| m | ファイル/ディレクトリの操作メニュー |
| c | 現在のディレクトリをルートにする |
| P | プロジェクトのルートに戻る |
| p | 親ディレクトリをハイライト |
| I | 隠しファイルの表示/非表示切り替え |
| B | 隠しファイルの表示/非表示切り替え |

## mキーの操作メニュー

| コマンド | 意味 |
|:-----------|------------:|
| a | 新しいファイル/ディレクトリ作成 |
| b | 削除 |
| m | 移動 |
| c | コピー |
| r | 名前変更 |

## 超効率化＆カスタマイズ

| コマンド | 意味 |
|:-----------|------------:|
| :NERDTreeFind | 今開いてるファイルの位置をツリーで表示 |
| o でディレクトリ開閉＋オープン | その場で開閉し、必要ならファイルも開く |
| mf | マーク設定（複数選択用） |
| mu | マーク解除 |
| mA | 全マーク解除 |
| mc | マークしたファイルをコピー |
| mm | マークしたファイルを移動 |
| md | マークしたファイルを削除 |
| :NERDTreeMirror | 同じNERDTreeビューを分割先にも表示 |
| :NERDTreeFocus | NERDTreeウィンドウにフォーカス |
| :NERDTreeCWD | 現在の作業ディレクトリをツリーのルートにする |

## おすすめ設定例（.vimrc）
```vim:vim
" NERDTree 設定
nnoremap <C-t> :NERDTreeToggle<CR>
let NERDTreeShowHidden=1
```
Ctrl+tでNERDTreeウィンドウの表示/非表示切り替え
2025/4/20　応用技術者試験僕の速報

## 令和７年春　応用技術者試験速報
<strong>恐らく　不合格　午前で　足きり</strong>



午前４５００問過去問やりましたが

ちゃんと落ちたと思います。まったく手ごたえがなくて

普通に難しい‼！って思いました。


過去問から出題されていたものは2-3割程度で計算問題多く…
　　　　　　　　　　　　　　　→どうやら平成１８年の計算問題とか出てたようです
苦手分野で午前を確実に落としました…。


どうやら、SCとかFEの過去問からも出題されているらしく…
見たことない問題がたくさんありました…。


あと、会場で試験する難しさを痛感しました。

初めての会場IPA試験 緊張でうまく思考が回りませんでした。
それでケアレスミスで２問落としましたorz

少し休憩して、また頑張りたいと思います…。
あー不甲斐ない

## 追記
見事　自己採点した結果落ちました。

4500問以上解いて、youtubeの解説を聞いて
過去問のバックグラウンドまで理解していたのに

てことで次向けてまた気持ち切り替えて勉強したいと思います
GitHub Copilotエージェントモード in Codespaces を試してみる

# 当記事の概要
2025年4月11日に、GitHub Copilotの新機能として、GitHubで作成したIssueから直接GitHub Codespacesを起動し、そのIssueの内容をCodespaces内でGitHub Copilotエージェントに処理させるという機能が[public preview](https://github.blog/changelog/2025-04-11-vscode-copilot-agent-mode-in-codespaces/)となったので試してみました。

# 試してみる
GitHubリポジトリで以下のような簡単なIssueを作成し、この内容をCodespaces上でエージェントに実行させてみました。

![2025-04-20 at 18.16.06@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/7961222b-74dd-4ddc-92b5-e1ec9cffda85.png)


処理対象のIssueの画面で、画面右側の「Code with Copilot Agent Mode」ボタンをクリックします。

![2025-04-20 at 18.20.47@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/031d4a88-e0f9-4abe-8895-398e513418f8.png)


すると、ブラウザの別タブが開き、以下のようにCodespacesが自動的に起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/84680e87-3f30-47d8-8cbf-44a62e8119ea.png)

Codespacesが起動すると、今度はGitHub Copilotエージェントが処理を開始します。赤枠部分で、Issueの内容が指示として与えられ、GitHub Copilotエージェントが処理を実行しています。

![2025-04-20 at 18.24.39@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/a07a69dc-fe1e-4abf-adde-38af9276b1b9.png)

GitHub Copilotエージェントが処理を完了し、README.mdが更新されました。

![2025-04-20 at 18.25.04@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/dd6ec03f-5f0a-4b2b-ad40-b947e1626ce2.png)

このままではGitリポジトリにはまだ反映されていないため、git commit、git pushを行うことで、Gitリポジトリに反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/a02c0033-d5e5-42a1-a1e5-cb47e539838d.png)


# まとめ
Issueを与えることで、ローカルに一切の環境を用意することなく、ブラウザ上でエージェントによるコード作成・処理が実行可能となりました。

ローカルでVSCode環境を用意するClineなどと、基本的にクラウド上のAIに全て任せるDevin AIの中間的なアプローチなのかなと思います（Devin 2.0では[人手による介入も可能](https://qiita.com/lazy-kz/items/4e45187c9cd438d6c8b6#3-devin-ide)になっていますが）。
原因不明で突然WLSのUbuntuが消えたので

今朝、外付けドライブに保存されていたWLSのUbuntu22.04を使おうとしたら、Ubuntuが22.04が無いと、エラーが出ました。
消えたファイルを復元するソフトをインストールしていたので試したのですが、0バイトで仮想ディスクのイメージが壊れているようです。

ext4.vhdxのファイル名のファイルのサイズが、０バイトになっていました。

```
wsl --list --verbose
```
このコマンドで、WLSのUbuntuの一覧が表示されました。
消えたUbuntuのバージョンも、一覧にありました。

そのため、まずWLSの一覧から問題のUbuntuのバージョンを削除しました。

下記のコマンドで、WLSの物理ドライブの場所が分かります。

```
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\*" | Select-Object DistributionName, BasePath

```
WLSのディストリビューションを指定して、削除する方法
```
wsl --unregister <ディストリビューション名>
```
例
```
wsl --unregister Ubuntu-22.04
```
このコマンドを実行すると、該当する WSL インスタンスが 完全に削除 され、データも消去されます。削除後に再インストールしたい場合は、以下のようにすればOKです。

```
wsl --install -d Ubuntu-22.04
```

今回は、外付けのDドライブにディストリビューションを保存していたので、この方法で復旧しました。

このURLで、Ubuntu22.04を直接ダウンロードできます。
```
https://cloud-images.ubuntu.com/wsl/jammy/current/ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz

```
サイズ：約325MB

内容：Ubuntu 22.04 LTS（amd64）向けの WSL用ルートファイルシステム

用途：wsl --import コマンドで新しいWSL環境として展開可能

上記のURLからダウンロードしたあと、こちらのコマンドを実行してください。
```
wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 C:\Users\ユーザー名\Downloads\ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz --version 2

```
初回起動
```
wsl -d Ubuntu-22.04

```
ユーザーを追加
```
adduser 追加するユーザー名
usermod -aG sudo 追加したユーザー名
```
### ディフォルトのユーザーとして設定します
1.ルートでUbuntu22.04を起動します。
```
wsl -d Ubuntu-22.04 --user root

```
2./etc/wsl.conf を新規作成（存在しないはず）

```
nano /etc/wsl.conf
```
3.以下の内容を貼り付けて保存：
```
[user]
default=追加したユーザー名
```
4.保存後、WSLを一度終了
```
exit

```
5.Windows PowerShellでWSLを終了
```
wsl --shutdown
```
6.再度起動
```
wsl -d Ubuntu-22.04
```
これでrootユーザーではなく、追加したユーザーでログインしてUbutuを利用できます。

今回の出来事を教訓に、一日一回OneDriveに、バックアップを作るように、バッチファイルを作り、タスクマネージャーに登録しました。


## まず手動のコード
```
wsl --export Ubuntu-22.04 "$env:USERPROFILE\OneDrive\WSL_Backups\Ubuntu-22.04_$(Get-Date -Format yyyyMMdd).tar"

```
Ubuntu-22.04：バックアップ対象のWSL名

OneDrive\WSL_Backups：OneDrive配下の保存フォルダ（なければ作成してください）

$(Get-Date -Format yyyyMMdd)：日付付きのファイル名にして世代管理可能


## 自動化する方法（タスクスケジューラ）
🔧 手順（1回だけ設定すればOK）
1. バッチファイルを作る（例：backup_wsl.bat）
メモ帳などで以下の内容を保存：
```
@echo off
set BACKUP_DIR=%UserProfile%\OneDrive\WSL_Backups
set DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
wsl --export Ubuntu-22.04 "%BACKUP_DIR%\Ubuntu-22.04_%DATE%.tar"

```
backup_wsl.bat という名前で保存（例：C:\Scripts\backup_wsl.bat）

2. タスクスケジューラで自動実行
「スタートメニュー」→ タスクスケジューラ を起動

右側「基本タスクの作成」

名前：WSL Backup to OneDrive

トリガー：毎日（任意の時刻に設定）

操作：プログラムの開始

プログラム：cmd.exe

引数：
```
/c "C:\Scripts\backup_wsl.bat"

```
復元するときのコマンド
```
wsl --import Ubuntu-22.04-Restore D:\wsl\Ubuntu-22.04-Restore "C:\Users\ユーザー名\OneDrive\WSL_Backups\Ubuntu-22.04_20250419.tar" --version 2
```
今回の直接下記のURLからWLSのディストリビューションをダウンロードして、外付けドライブで復旧する手順をChatGPTに教えてもらうことができました。

```
https://cloud-images.ubuntu.com/wsl/
```
Microsoftのストアを通さずに、直接WLSの復元をする方法は、便利だと思いました。
[Power BI]Power Queryで「参照」を使いこなしてみた

## はじめに

Power BIのPower Queryでデータを加工するとき、これまで「**複製**」をよく使っていました。でも最近、「**参照**」という機能の使いどころを教えてもらい、目からウロコでした。

備忘録もかねて、「参照」機能の使い方とそのメリットについてまとめてみます。

---

## 複製と参照の違いって？

まず簡単に、「複製」と「参照」の違いをおさらい。

| 操作 | 内容 |
|------|------|
| 複製 | 元のクエリの現在のステップをコピーし、新しいクエリとして独立させる。 |
| 参照 | 元のクエリを**依存関係を保ったまま**使い、新しいクエリを作成する。 |

「複製」はコピー＆ペーストのようなもの。一方「参照」は、元のクエリを引き継いで派生させていくようなイメージです。

---

## なぜ「参照」を使うと便利なのか？

ポイントは**保守性の高さ**。

たとえば、共通の前処理を行ったデータをもとに、複数の派生テーブル（ファクトやディメンション）を作成したい場合、「参照」を使っておくと、元のクエリを修正するだけで派生先すべてに反映されます。

---

## 実際の例で見てみよう

以下のようなケースを想定します。

1. **参照元となるオリジナルテーブル（中間加工済み）を作成**  
   たとえば、生データをクリーニングした中間テーブル
   ![参照活用例_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/76d85aeb-1f3c-4242-830c-ea185d1a8eeb.png)

2. **ファクトテーブルを「参照」で作成**  
   オリジナルテーブルを参照して、集計や数値系の加工を行う
   ![参照活用例_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/57f1c12f-797f-45c5-a49d-9244caec736e.png)

3. **ディメンションテーブルを「参照」で作成**  
   国、製品カテゴリなどを抽出し、マスタ化する
   ![参照活用例_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/f2772881-bb0f-4b6b-b88e-3590e6da443a.png)

4. **ディメンション側でキー列（ID）を作成**  
   例：`Country`列から`CountryID`を作成
![参照活用例_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/93252b48-99e3-42c7-a248-3625461790b8.png)

5. **ファクト側の対応する列を変換**  
   `Country`列を`CountryID`に変換して、データモデルに組み込む
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/9a8a539a-eafe-4585-95a6-538b0dee3a86.png)

こうすることで、たとえば「国名の表記ゆれがあったので前処理を修正」したい場合も、**オリジナルの参照元テーブルだけを直せばOK**です。

---

## まとめ

これまで「参照」ってあまり意識して使ってこなかったのですが、**メンテナンス性の高さ**という点では非常に強力な機能だと感じました。

Power BIのデータモデルを設計する上で、**クエリの再利用性**や**将来的な修正のしやすさ**を意識したときに、「参照」はとても役立ちます。

実際の例の手順は省略しており、こちらも詳細知りたいという方おられましたら、コメントいただけると幸いです。リクエストありましたら、詳細を深堀しようと思います。

ぜひ、みなさんも試してみてください！

---

## おまけ：複製 or 参照、迷ったときは？

- 元のクエリと**独立した処理**をしたい → 複製  
- 元のクエリをベースに**派生クエリ**を作りたい → 参照

と覚えておくとスムーズです！

---

ご質問やご意見あれば、コメントでぜひ教えてください！
ゼロからの挑戦！Reactアプリにデータ管理、テスト、CI/CDを導入した成長記録

## はじめに
以前初めてReactで簡単なアプリを作成しました。
そのときの記事はこちらです👇

https://qiita.com/y-keiyu/items/5eb4f4f4c5fb2cd61ef8

ただ、そのときはデータの保存やテストの実装までは行っておらず、最低限の機能のみを作った形になります。
今回は、データ管理・テスト・CI/CDといった、より実践的な機能に取り組みました。


## 実施したこと
1. Supabaseを使用してデータ管理
2. GitHubActionsを使用してFirebaseにデプロイ
3. JESTとReact Testing Libraryを使用してテストコード作成
4. GitHubActionsを使用してCI/CDパイプラインの構築


## 大変だったこと
Supabase、Firebase、GitHub Actionsはいずれも初めて触れる技術であり、どこから手を付けて良いか全く分からない状態からのスタートでした。公式ドキュメントのボリュームと専門用語の多さに圧倒され、自身の知識だけでは理解が難しい場面が多々ありました。

そのようなとき、私は以下のような方法で理解を深めるようにしました。
1.	まず「やりたいこと」をネットで検索し、関連するキーワードを特定する。
2.  特定したキーワードを用いて、公式ドキュメント内を検索する。
3. それでも不明な点は、AIに「初学者にも分かりやすく説明して」と質問する。

このように、焦って全てを理解しようとするのではなく、段階的に知識を積み重ねるアプローチを取りました。



## 成長したこと
データ管理からCI/CDまでの実装過程で、多くのエラーに遭遇しました。以前であればすぐにAIにエラー内容とコードを丸投げしていましたが、今回はまず以下の点を意識的に行いました。
* 	エラーが発生した原因やタイミングを自身で言語化する
-	言語化した内容を基に、インターネットで同様のエラーに関する記事やQ&Aを探す

そして、AIは答えを直接得るための手段ではなく、問題解決のヒントを得るための補助ツールとして捉えるように努めました。

この経験を通して、「自分で考える力」と「AIを適切に活用する力」が少しずつ身についてきたと実感しています。


## 終わりに
初めての技術ばかりで苦労も多かったですが、「知らない」状態から「できるかもしれない」という手応えを感じられたことは、大きな自信に繋がりました。今後も、未知の領域を恐れず、手を動かしながら積極的に学習を続けていきたいと思います。



https://github.com/y-kei-yu/study-record




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

https://projisou.jp
CognitoトリガーとLambdaのエラー時挙動を検証してみた（DynamoDB連携を目指して）

# はじめに

Cognitoでは、ユーザー作成時にLambdaをトリガーとして呼び出すことができます。

「このタイミングでDynamoDBにもユーザー情報を保存したい」と考えました。

いざやろうと思うと、Lambdaが失敗した時の挙動やエラーハンドリングについて気になる点があったのでまとめました。

# TL;DR（要点）

- Cognitoの「サインアップ前」トリガーでLambdaが失敗すると、ユーザーの作成自体が失敗する
- Lambdaの呼び出し失敗した場合、3回までリトライされるが、すべて失敗した場合はユーザー作成は行われない

# トリガーの種類と実行タイミング

まず前提として、Cognitoでは以下のようなトリガーがあります。

![スクリーンショット 2025-04-20 18.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/a9c70b07-5f53-4a19-ba6e-e14feb3823e1.png)

私が設定していたのは「**サインアップ前**」でしたが、これは「**ユーザー作成前**」に呼び出されるものでした。  

つまり、Lambdaでエラーが起きると**ユーザーはそもそも作成されません**。

# Lambdaがエラーを吐いたら？

たとえば以下のようなケースでワザとLambdaが失敗するようにしてみました。

```js
export const handler = async (event) => {
  throw new Error("意図的エラー");
};
```

その上で、マネコン経でユーザー作成を試みると、マネコン上でやってみると下図のように「ユーザー作成中にエラーが発生しました」と表示されて、Cognitoのユーザーの作成が行われませんでした。

![cognito_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/fa1e4bd4-b328-4c6a-b698-2186a6ed8cfd.png)

ちなみにLambda内のエラーは普通にCloudWatchに出ます。

# Lambdaの呼び出しに失敗したら？

そもそも何かしらが原因でLambdaの呼び出しに失敗した場合でも、挙動は同じようです。

Lambdaは同期的に呼び出されて３回までリトライされるそうです。

呼び出し自体が失敗してもDLQとかには貯まらない。

（[公式ドキュメント↓](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#important-lambda-considerations)）

![1731575404384.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/397d3429-777a-4780-a6ab-cd8eb010d59e.png)

全てリトライが失敗した場合は、マネコン、CLI、SDKのどれであれ同期実行なのでユーザー作成失敗の趣旨のエラーが返ってくる。

# Lambdaでエラーハンドリングをすべきか？

Lambdaが失敗すれば、Cognitoのユーザー作成自体がされない、と言う事が起こります。

それで良いのか？

Lambdaの処理の重要度によって良いか悪いか分かれそう。

# なぜ調べたのか（再喝）

やりたかったことは次のようなこと。

Cognitoでユーザー登録

そのユーザー情報をDynamoDBにも保存したい

でも、Lambdaでの保存に失敗したら「Cognitoには登録されてるのにDynamoDBにはいない」という不整合が起こる可能性があるなと。

大丈夫だろうか？そもそも挙動ってどうなってるんだっけ？と気になった経緯でした。

# 終わりに

現場からは以上ですー。
Vim便利コマンド一覧

## はじめに
vimをなんとなく触ってたけどちょっと調べて自分用にまとめました。

初心者向けだとか上級者向けだとか書いてますが、知ってるか知らないかの違いでしかないので、あくまで目安として基本的なものから順に書いてみたって感じです。

## 🐣 初心者向け（まずこれ）

|コマンド  |意味  |
|---|---|
| i | 挿入モードに入る |
| ESC | ノーマルモードに入る |
| :w | ファイルを保存 |
| :q | Vimを終了 |
| :wq | 保存して終了 |
| :q! | 保存せず終了 |
| hjkl | 左、下、上、右に移動 |
| x | 一文字削除 |
| u | 元に戻す（Undo） |
| ctrl + r | Undoを取り消す（Redo） |
| yy | 1行コピー |
| dd | 1行削除（カット） |
| p（ctrl + shift + v） | 貼り付け |
| /文字列 | 前方検索 |
| n | 次の検索結果へ移動 |
| N | 前の検索結果へ移動 |
| :help | ヘルプを開く |

## 📝 中級者向け（Vimらしさを感じる）

|コマンド  |意味  |
|---|---|
| v | ビジュアルモード（範囲選択） |
| V | 行単位で選択 |
| ctrl + v | 矩形選択（ビジュアルブロック） |
| :e ファイル名 | 別のファイルを開く |
| :sp ファイル名 | 画面を上下に分割して開く |
| :vsp ファイル名 | 画面を左右に分割して開く |
| :bn / :bp | 次/前のバッファへ移動 |
| :bd | バッファを閉じる |
| :%s/旧/新/g | ファイル全体で文字列を置換 |
| :set number | 行番号表示 |
| :set relativenumber | 相対行番号表示 |
| . | 直前の操作を繰り返す |
| gg | ファイルの先頭へ |
| G | ファイルの最後へ |
| :tabnew | 新しいタブを開く |
| gt / gT | 次/前のタブに移動 |

### 📌 ビジュアルモード（範囲選択）とは？
ビジュアルモードは、カーソルで文字の範囲を選択するモードのことです。
例えば、普通のテキストエディタでドラッグして選択するのと同じ感覚です。
#### ✅ 操作方法
|操作  |	動作  |
|---|---|
| v | 文字単位で選択開始（Visual） |
| V | 行単位で選択開始（Visual Line） |
| ctrl + v | 矩形（ブロック）選択開始（Visual Block） |
#### ✅ できること

ビジュアルモードで選択した範囲に対して
* y → コピー
* d → 削除
* p → 貼り付け
* \> / < → インデント
* gU → 大文字化
* gu → 小文字化
などができる

## 🔥 上級者向け（爆速・効率化）

|コマンド  |意味  |
|---|---|
| :%y+ | ファイル全体をクリップボードにコピー |
| :r ファイル名 | ファイルの内容を現在のカーソル位置に挿入 |
| :!コマンド | シェルコマンドを実行（例：:!ls） |
| :m .+1 | 現在行を下に移動 |
| :m .-2 | 現在行を上に移動 |
| gU + v で選択 → U | 選択範囲を大文字に |
| gu + v で選択 → u | 選択範囲を小文字に |
| Ctrl + o | ジャンプリストの戻る |
| Ctrl + i | ジャンプリストの進む |
| :noh | ハイライト（検索結果）を消す |
| :set paste / :set nopaste | 貼り付けモードのON/OFF |
| q: | コマンド履歴を見る |
| q/ / q? | 検索履歴を見る |
| :syntax on / :syntax off | シンタックスハイライトのON/OFF |
| :marks | マーク一覧表示 |
| m{a-z} | カーソル位置にマーク設定（例：ma） |
| 'a | aマークの位置にジャンプ |

### 📌 ジャンプリストの戻る・進むとは？

ジャンプリストは、Vimで
* Gで移動したり
* :eでファイル開いたり
* 検索で飛んだり
と「ジャンプした履歴」を管理してるリストのこと。

#### ✅ 操作方法
|操作  |動作  |
|---|---|
| Ctrl + o | ジャンプリストの前に戻る |
| Ctrl + i | ジャンプリストの次へ進む |

#### ✅ イメージ
* A行 → G → B行 → /search → C行 とジャンプしたとき
    Ctrl + oで B → A → （さらに前）
    Ctrl + iで A → B → C に行ける感じ

「戻る・進むボタン付きの履歴ジャンプ機能」ですね。

### 📌 カーソル位置にマーク設定とは？

マーク（mark）は、特定の行・位置に「しおり」を付けておいて、
あとでそこに一発でジャンプできる機能です。

#### ✅ 操作方法
|操作  |動作  |
|---|---|
| m[a-z] | 現在の位置にマークを付ける（例：maで「aマーク」） |
| 'a | 	行頭にジャンプ（例：'aでaマークへ行く） |
| `a | 	マークした正確なカーソル位置へジャンプ |


## 🎁 おまけ：便利な.vimrc設定例

```vim:vim
set number              " 行番号表示
syntax on               " シンタックスハイライト
set tabstop=4           " タブ幅を4に設定
set expandtab           " タブをスペースに変換
set clipboard=unnamedplus " クリップボード共有 (対応Vimのみ)
set hlsearch            " 検索結果をハイライト
set incsearch           " インクリメンタルサーチ
```

## 📖 使い方のおすすめ

まずは初心者向けを完全に覚える
→ 中級者向けを少しずつ取り入れる
→ 上級者向けで自分流の効率化を目指す

Vimは一気にやると大変なので、日々のメモや勉強用のノート記述にVimを使ったりして、少しずつ「これ便利だな」と思ったものを取り入れるのが良い気がします。
【blender】オブジェクトの回転・拡大ができないとき

1. 右上の「オプション」をクリックして「トランスフォーム」にチェックが入っていないか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/a05d1556-1c4b-4660-b348-753add10cba1.png)

2. チェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/e9ad71f7-8cec-4173-9071-cb0996069f3c.png)

3. 回転(R)、拡大・縮小(S)してみる
![レコーディング-2025-04-20-181233.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/bcafe451-3ce1-4d27-a5ff-8e466dd85e14.gif)
CocoaPodsでRealm使用時にiOS 18.1エラーが出たときの対処法

## 🔥 発生した問題

Flutterではなく、Swift原生アプリをCocoaPodsで開発していた際、以下のようなエラーが発生：

```
Compiling for iOS 16.0, but module ‘RealmSwift’ has a minimum deployment target of iOS 18.1
```

Xcodeは、16.1.0でした


## 🧭 原因

Realmの一部バージョンでは、配布形式に`.xcframework`（プリビルドバイナリ）を採用しており、  
この中に「**iOS 18.1以上でないと使えない**」という情報が埋め込まれています。

つまり：

- アプリのDeployment Target：iOS 16.0
- Realm内部：iOS 18.1

このギャップにより、ビルドが通らない状態になります。

## ✅ 解決策：post_installでRealmのターゲットを強制修正

以下のようにPodfileに `post_install` スクリプトを追加することで、  
**Realmのターゲット設定を強制的に16.0へ下げる**ことができます。

```ruby
platform :ios, '16.0'

target 'YourAppTarget' do
  use_frameworks! :linkage => :static
  pod 'RealmSwift', '10.43.0'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if ['Realm', 'RealmSwift'].include? target.name
      target.build_configurations.each do |config|
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0'
      end
    end
  end
end
Reactでファクトリーメソッドを使う理由を整理する

## ファクトリーメソッドとは

ファクトリーメソッド（Factory Method）は、**オブジェクトを作るときに、必要な加工や整形もまとめて行う仕組み**です。
単に特定の式を指すのではなく、受け取ったデータを加工・整形して、使いやすいインスタンスを返す一連の流れ全体を指します。

- インスタンス生成ルールを統一できる
- 毎回似た加工処理を書く手間をなくせる
- 保守が楽になる


## 今回のユースケース

supabaseからデータを取得し、ユーザーのGitHub / Qiita / Xのアカウントへのリンクを画面に表示し、クリックで飛べるようにしたい

### Supabaseから取れるデータ

```json
{
  "github_id": "kikowatabe",
  "qiita_id": "kikowatabe",
  "x_id": "kikowatabe"
}
```

アカウントIDしかないくURLが存在しないので、画面を作るたびにURLを毎回手書きで組み立てなければならない。

```tsx
<a href={`https://github.com/${user.github_id}`}>GitHub</a>
```


## ファクトリーメソッドの実装例
Userインスタンスを作るときにURLを持った状態にしてしまえば、簡潔にコードを書くことができます。そのためにファクトリーメソッドを使います。

```tsx
static createUserFromJson(user: UserJson, skill: SkillJson): User {
  //staticでインスタンスを作らずに関数を使う　
  //userとskillという2つのデータを引数に受け取る
  
  return new User( // Userインスタンスを新しく作る
    user.id, // Supabaseから取得したユーザーIDをそのまま渡す
    user.name, // ユーザー名もそのまま渡す
    user.description, // ユーザーの自己紹介文もそのまま渡す
    skill.name, // ユーザーが持つスキルの名前を渡す
    user.github_id ? `https://github.com/${user.github_id}` : undefined, 
    // GitHub IDが存在する場合だけURLに変換して渡す　なければundefined
    user.qiita_id ? `https://qiita.com/${user.qiita_id}` : undefined,
    // Qiita IDが存在する場合だけURLに変換して渡す　なければundefined
    user.x_id ? `https://twitter.com/${user.x_id}` : undefined
    // X(Twitter) IDが存在する場合だけURLに変換して渡す　なければundefined
  );
}
```

**ポイント**
- IDがあるならURLを作る
- ないならundefined
- 最初に1回だけやるので表示側がシンプルになる



## データ取得後の使い方

```tsx
const { data: userData } = await supabase
  .from("users")
  .select("*")
  .eq("id", id)
  .single();

const { data: skillData } = await supabase
  .from("skills")
  .select("*")
  .eq("user_id", id)
  .single();

if (userData && skillData) {
  const user = User.createUserFromJson(userData, skillData);
  setUser(user);
}
```

画面ではこうまとめられます（return内）

```tsx
{user.github_url && <Link href={user.github_url} isExternal>GitHub</Link>}
{user.qiita_url && <Link href={user.qiita_url} isExternal>Qiita</Link>}
{user.x_url && <Link href={user.x_url} isExternal>X</Link>}
```


## まとめ

- SupabaseからはIDだけが来る → URLがないと困る
- 毎回画面で組み立てたくない
- → **Userを作るときにURLもセットしてしまう（ここでファクトリーメソッドを使う）**
- 結果t表示側がシンプルになりミスも防げる
プログラミング練習記録　4日目：C#：配列、List、Dictionary、メソッド

### 1.本日の作業内容
　C# 基本文法：配列、List、Dictionary、メソッド 復習

### 2.作業目的
　・復習と使い方の確認。

## 

### 1.配列(Array)
#### 配列とは...「複数のデータ（同じ型）を1つの変数でまとめて扱える構造」のこと。

##### 宣言と初期化
```
// 曜日のリスト（string型）
string[] days = { "Mon", "Tue", "Wed", "Thu", "Fri" };
// 点数のリスト（int型）
int[] scores = new int[] { 80, 90, 70 };
```

##### 要素へのアクセス
```
Console.WriteLine(days[0]); 

出力結果
Mon
```

##### ループで処理
```
foreach (string day in days)
{
Console.WriteLine(day);
}

出力結果
Mon
Tue
Wed
Thu
Fri
```

### 2.List
#### List...「配列に似ているが、サイズの変更ができるコレクション」のこと。
特徴は下記の通り
- 動的に要素を追加・削除できる
- Count プロパティで長さが取れる

##### 宣言と追加
```
using System.Collections.Generic;

List<string> fruits = new List<string>();
// fruitsというリストにAppleを追加
fruits.Add("Apple");
// fruitsというリストにBananaを追加
fruits.Add("Banana");
```
```
Console.WriteLine(fruits.Count);

出力結果
2
```

### 3.Dictionary<TKey, TValue>
#### Dictionary...「キーと値のペアでデータを管理する構造」のこと。

##### 宣言と追加
```
Dictionary<int, string> employees = new Dictionary<int, string>();
employees[1001] = "佐藤";
employees[1002] = "鈴木";
```
```
Console.WriteLine(employees[1002]);

出力結果
鈴木
```

##### ループ処理
```
foreach (var pair in employees)
{
    Console.WriteLine($"ID : {pair.Key}, name : {pair.Value}");
}

出力結果
ID : 1001, name : 佐藤
ID : 1002, name : 鈴木
```

### 4.メソッド
#### メソッド...「繰り返し使う処理を1つにまとめたもの」のこと。

##### 宣言
```
public static void Main()
{
    Greet("山田");
}

static void Greet(string name)
{
    Console.WriteLine($"こんにちは、{name}さん！");
}

出力結果
こんにちは、山田さん！
```

## まとめ
用途によって、使い方を変えないとパフォーマンスにかなり影響があるので気を付けたいです。
マルチキャストネットワーク

マルチキャストネットワークとは、**1対複数（1 to many）**の通信方式の一つで、**送信者が一度データを送信するだけで、特定の受信者グループ全体に同時にデータを配信できる**ネットワークの仕組みです。これは、**ブロードキャスト（全体への送信）**や**ユニキャスト（1対1の通信）**と対比されます。

---

### 🔹 特徴
- **効率的な通信**  
  同じデータを複数の受信者に送る場合、個別に送るユニキャストよりも帯域幅を節約できます。
  
- **IPマルチキャスト**  
  一般的には、IPv4のクラスDアドレス（224.0.0.0〜239.255.255.255）がマルチキャストアドレスとして使われます。

- **受信側が「参加（Join）」する方式**  
  受信したいクライアントが、マルチキャストグループに参加することでそのデータを受信します。

---

### 🔹 よく使われる例
- IPTV（インターネットTV）
- オンライン会議やウェビナー
- ソフトウェアの同時配布
- 株価情報のリアルタイム配信

---

### 🔹 関連プロトコル
- IGMP（Internet Group Management Protocol）：IPv4環境でのマルチキャストグループ管理に使用。
- PIM（Protocol Independent Multicast）：ルーター間でのマルチキャストルーティングに使われる。

---
Nuxt3でトースト機能の実装

![スクリーンショット 2025-04-20 17.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/799611a5-2283-4b02-aa60-b3245b9aa7ed.png)

Nuxt3の自前ブログを使って、色々な機能を試して実装していきます。
最初にトースト機能を実装してみたいと思います。

↓作成したブログはこちら

https://qiita.com/y5347M/items/aa279c10af6597ed7a24


# 動作環境
- Nuxt: 3.16.2
- @nuxt/ui: 3.0.2

# 全体構成

## 準備

### 1. NuxtUIとは

https://ui.nuxt.com/getting-started

> Nuxt UI は、Reka UI、Tailwind CSS、Tailwind Variants の強みを融合し、洗練された、アクセシブルで高パフォーマンスなユーザーインターフェースを構築するための、他に類を見ないツール群を開発者に提供します。

Nuxtに簡単にUIコンポーネントを組み込めるためのライブラリのことですね。

### 2. Nuxt UIの導入

#### 2-1. Nuxt UIのインストール
プロジェクトのルートディレクトリで以下のコマンドを実行します。
```console
npm install @nuxt/ui
```
package.jsonに次のように追加されているはずです。
```json:package.json
{
  ...
  "dependencies": {
    ...
    "@nuxt/ui": "^3.0.2", # 追加されている
    ...
```

### 2-2. nuxt.config.tsに設定追加
そして次にnuxt.config.tsを編集します。

```typescript:nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/ui'],
});
```
### 2-3. CSSの編集

プロジェクト全体で使用しているcssファイルを指定します。

```typescript:nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/ui'],
  css: ['~/assets/css/main.css'] // 追加
})
```

そしてそのcssファイルでtailwindとNuxt UIのインポートをします。
```css:main.css
@import "tailwindcss";
@import "@nuxt/ui";
```

### 2-4. app全体をApp Componentで囲う
プロジェクト全体でToastやTooltipを使用できるようにするための設定です。

```vue:app.vue
<template>
  <UApp>
    <NuxtPage />
  </UApp>
</template>
```

私のプロジェクトではNuxtLayoutを使用しているので、このような実装となりました。
```vue:app.vue
<template>
  <UApp>
    <NuxtLayout>
      <NuxtPage />
    </NuxtLayout>
  </UApp>
</template>
```

これでトースト機能を実装する準備が整いました。

## 実装

まずは

```typescript
<script lang="ts" setup>
const toast = useToast();

function showToast() {
  const props = {
    title: 'ブログにようこそ！',
  };
  toast.add(props);
};

// ページを初期表示したときに呼び出す
onMounted(() => {
  showToast();
});
</script>

```

まずは`useToast`関数を使用してtoastを生成します。

https://ui.nuxt.com/composables/use-toast


その次にtoastの`add`関数にオブジェクトを渡します。
他にも細かい制御（アイコンやクローズボタンなど）もできるので、以下を参考にしてください。

https://ui.nuxt.com/components/toast


ブログを表示する際にtoastが表示されるようになりました🎉
![toast.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/b0c2588c-8de9-48f2-a6f8-4ec3526ab8ad.gif)

# さいごに

Nuxt UI他にも多くのIconを用意していたり、ColorModeを設定できたりするようなので、少しずつ機能を足していきたいと思います。
GPT-4.1とは？最新モデルの概要と技術的特徴まとめ

# はじめに
OpenAIが2025年4月に発表した **GPT-4.1** は、従来のGPT-4およびGPT-4oをさらに発展させた大規模言語モデルです。  
特に **指示の理解力、コード生成精度、長文コンテキスト処理能力** が大きく強化されており、業務・開発・学習支援など、さまざまな場面での実用性が向上しています。
今回はこの新たな**GPT-4.1**について、まとめていきたいと思います。

# 1. 基本情報

- モデル名：GPT-4.1  
- 提供開始：2025年4月14日（ChatGPT Plusユーザー向け）  
- 利用環境：ChatGPT、OpenAI API  
- コンテキスト長：最大 100万トークン（API限定）

# 2. 主な進化ポイント

### （1）長文コンテキスト対応
- 最大100万トークンまでの処理に対応
- 複数ファイルをまたぐプロンプトや長文ドキュメントの解析が可能に

### （2）推論精度の向上
- MATHベンチマークスコア：88.7%
- HumanEval（コード生成）スコア：90%以上
- 複雑な論理・数学的問題への対応力が向上

### （3）マルチモーダル処理の強化
- 画像、音声など非テキストの理解精度も向上
- テキスト＋画像＋音声を組み合わせた指示に自然に対応

### （4）高速化とコスト削減
- GPT-4o比で約26%のコスト削減
- 応答速度も改善され、実用面での使いやすさが向上
- 軽量版「Mini」「Nano」も併せて発表

# 3. 活用シーン

| 活用領域       | 利用例 |
|----------------|--------|
| 開発支援       | 長文ソースコードのリファクタリング、複数ファイルの一括解析 |
| 業務効率化     | 議事録の要約、レポートの構造化 |
| データ分析     | ログファイルや統計データの洞察抽出 |
| 教育・学習     | 教材の要約や補足説明、自動テスト問題作成 |
| カスタマーサポート | チャットログの分類・要約・対応支援 |

# 4. 旧バージョンとの比較

| 比較項目       | GPT-4.1      | GPT-4o       | GPT-4         |
|----------------|--------------|--------------|---------------|
| コンテキスト長 | 最大100万    | 約128K       | 32K〜128K     |
| マルチモーダル | 対応         | 対応         | 一部対応      |
| 数学/論理精度  | 非常に高い   | 高め         | 中程度        |
| 応答速度       | 高速         | 高速         | やや遅め      |
| コスト         | 削減済       | 通常         | 高め          |

# 5. まとめと所感

GPT-4.1は、GPT-4系の中でも最も実用的かつ高性能なモデルです。  
特に長文コンテキストの処理、指示理解力、コード生成の精度において目覚ましい進化を遂げており、実務利用やプロダクション投入を検討しているユーザーにとっては注目すべきアップデートとなります。

今後APIへの展開や、より軽量な「Mini」「Nano」モデルとの連携にも期待が持てます。

# さいごに
完全に体調を崩しました、季節の変わり目恐ろしいですね・・・
訳あり基板のH8/3664

以前秋月で100円で購入した訳あり基板のH8/3664の書き込みを調べてみました。

|Func|3664Pin|CN2|JP|
|:--|:--|:--|:--|
|P85|41|14|3|
|NMI|35|8|2|
|P22/TX|46|19|-|
|P21/RX|45|18|-|


|Func|3664Pin|CN1|
|:--|:--|:--|
|5V|12|23|
|GND|9|25,26|

NMIがLow(JP2ショート)でP85がHi(JP3ショート)で電源ONすると書き込みモードになるようです。

さてさて使えるかな？

コンパイラーはこちらの方がgcc 8.4を用意していました。

https://qiita.com/meister68k/items/5168eca10afe2489da6f

FreeBSDでgcc 13を用意した人も見つかりました。

https://dogmap.jp/2024/03/20/post-3947/
JetpackCompose タップした位置に画像を表示する

JetpackComposeでタップした位置に画像を表示する方法です。


https://qiita.com/yuta317/items/ef70223abe742310ac13

こちらの実装のアレンジになります。
タップ位置を知りたいので`detectTapGestures`になります。

```TapToPlaceImageCentered.kt
@Composable
fun TapToPlaceImageCentered() {
    val density = LocalDensity.current
    var imageOffset by remember { mutableStateOf(Offset.Zero) }
    var showImage by remember { mutableStateOf(false) }

    // dp → px に変換（画像サイズが100.dpの場合、その半分）
    val halfImageSizePx = with(density) { 50.dp.toPx() }

    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.LightGray)
            .pointerInput(Unit) {
                detectTapGestures { tapOffset ->
                    imageOffset = tapOffset
                    showImage = true
                }
            }
    ) {
        if (showImage) {
            Image(
                painter = painterResource(id = R.drawable.baseline_back_hand_24), // 任意の画像に変更してね
                contentDescription = null,
                modifier = Modifier
                    .size(100.dp)
                    .offset {
                        IntOffset(
                            (imageOffset.x - halfImageSizePx).toInt(),
                            (imageOffset.y - halfImageSizePx).toInt()
                        )
                    }
            )
        }
    }
}
```
【Qiitaはじめました】AWSインフラの学習記録を週1で投稿します

# 自己紹介

愛知県名古屋市在住、24歳のクラウドインフラエンジニア、さわらと申します。  
業界歴は4年ほど。これまでは主に監視・運用保守を担当しておりました。

現在は、転職をきっかけにAWSを用いた設計・構築業務に携わるようになり、  
実務で得た知見や学習内容を記録・共有する目的でQiitaを活用しています。

将来的にはフリーランスとしての独立も視野に入れており、  
そのためにも、自身の理解の定着とアウトプットの習慣化を意識しています。

現在は主に **AWS環境におけるインフラ構築・運用の自動化** に取り組んでおり、以下の分野を重点的に学習・実践中です。

## 主な技術領域

- **CloudFormation** 等を用いたインフラのコード化（IaC）
- **AWS Systems Manager**
  - Run Command / Automation / State Manager を活用した構成管理
- **Step Functions** による複数ステップの自動化処理（再起動対応含む）
- **Windows / Linux EC2** の初期設定自動化とOS固有の最適化
- **IAM / VPC構成** を含めたセキュリティおよび運用設計

## 現在注力している内容

CloudFormation + Systems Manager + Step Functions を連携させた  
**再起動を含むEC2初期設定フローの完全自動化**に取り組んでいます。

GUI中心の運用から、IaC・自動化ベースの構成へと移行を進めている段階です。

## Qiitaで発信していきたい内容

- 実務・検証を通じて得たインフラ業務の知見
- CloudFormation テンプレートの構成例や設計上の工夫・つまずき
- SSMやStep Functionsの実践的な活用方法
- 自動化設計における選定理由や運用負荷削減のアプローチ

----

週1回程度のペースで、将来の自分や同じような立場の方々の参考になる情報を残していければと思っています。  
今後ともどうぞよろしくお願いいたします。
Python: 順列 / 組み合わせ / 重複順列 / 重複組み合わせ を まとめてジェネレーターにしてみた

itertoolsを使えば順列 / 組み合わせ / 重複順列 / 重複組み合わせは簡単にできるけど、自前でやったらどうなるんだろ?ということでやってみました。
JSでやった[過去記事](https://qiita.com/ttatsf/items/a98719ad9e1f72ddecca)の焼き直しです。よりPythonっぽく?やってみました。

```py:
# 共通部分:
def permcombi_gen(filter_f):
    def inner1(confirmeds):
        def inner2(k):
            def inner3(options):
                if k == 0:
                    yield confirmeds
                else :
                    for i in range(len(options)):
                        yield from permcombi_gen(filter_f)(
                            (*confirmeds, options[i])
                            )(k - 1)( filter_f(i)(options) )
            return inner3
        return  inner2
    return inner1

# 各filter_f:                  
perm_f = lambda i: lambda options: (
    *options[:i]
    , *options[i+1:]
    )    
combi_f = lambda i: lambda options: options[i+1:]    
repperm_f = lambda _: lambda options: options    
repcombi_f = lambda i: lambda options: options[i:]    

# 各ジェネレータ:
perm = permcombi_gen(perm_f)(())
combi = permcombi_gen(combi_f)(())
repperm = permcombi_gen(repperm_f)(())
repcombi = permcombi_gen(repcombi_f)(())

# 使用例：
xs = (0, 1, 2)
r = 2

print("perm:")
for e in perm(r)(xs):
    print(e)
    
print("combi:")
for e in combi(r)(xs):
    print(e)
    
print("repperm:")
for e in repperm(r)(xs):
    print(e)
    
print("repcombi:")
for e in repcombi(r)(xs):
    print(e)
```
やってることは

1. 数が揃ったら 確定枠 confirmeds を yield する
1. まだ揃ってなかったら、
    1. すべての候補 options について
        1. 確定枠に候補をひとつ移動して
        1. カウンタ k をひとつ減らして
        1. 新しく 候補を計算して
        1. それらを使って再帰的に計算して yield する

って感じです(inner3 のあたり)。

順列 / 組み合わせ / 重複順列 / 重複組み合わせ によって次回の候補が異ってくるので、個別に定義しました。

あとは各filter_fと confirmeds の初期値 (空のタプル)を部分適用したら各ジェネレーターになります。
【Python初心者】シンボル表とスコープの仕組み、import時の注意点をわかりやすく解説！

Pythonを学び始めたとき、`import` の挙動や `from ... import *` の振る舞いなどに戸惑うことがありますよね。

この記事では、**Pythonにおける「シンボル表」と「スコープ」**に注目して、  
特に `import` によってどのように名前がスコープに登録されるのかをわかりやすく解説します。


## シンボル表（symbol table）とは？

Pythonでは、変数や関数、クラスなど「名前」と「中身（オブジェクト）」の対応関係を管理しています。  
この管理情報を **シンボル表（symbol table）** と呼びます。

簡単に言えば、「この名前はどこで何を意味するのか？」を覚えておくメモ帳のようなものです。



## スコープとシンボル表の関係

Pythonには「スコープ（有効範囲）」があり、スコープごとに独立したシンボル表が存在します。

- **ローカルスコープ**（関数やクラスの中）
    - 関数内で定義された変数や引数など
- **グローバルスコープ**（モジュール全体）
    - ファイル全体で使える関数や変数など
- **組み込みスコープ**
    - `print()` や `len()` のような標準関数たち



## モジュールの import とシンボル表への登録

Pythonでモジュールを読み込む方法にはいくつかありますが、それぞれ **現在のシンボル表にどう影響するか** を理解しておくことが大切です。


### `import モジュール名` の場合

```python
import fibo
```

- `fibo` という **モジュール名のみが現在のシンボル表に登録されます**
- `fibo.py` 内で定義された関数や変数は、`fibo.fib()` のように **モジュールを通してアクセス**します

```python
fibo.fib(10)     # ✅ OK
fib(10)          # ❌ NG: fib は現在のスコープに存在しない
```


### `from モジュール名 import *` の場合

```python
from fibo import *
```

- `fibo.py` 内で定義された関数や変数が、**現在のシンボル表に直接登録されます**
- `fib()` のように **モジュール名なしでアクセス可能**になります
- ただし、**アンダースコア（_）で始まる名前は登録されません**

```python
# fibo.py
def fib(n):
    ...
def _hidden():
    ...
```

```python
# main.py
from fibo import *

fib(10)      # ✅ OK
_hidden()    # ❌ NG: _hidden は取り込まれていない
```



### `import` と `from ... import *` の比較表

| 文法 | シンボル表に登録される名前 | 特徴 |
|------|----------------------------|------|
| `import fibo` | `fibo` のみ | 名前空間が汚れず安全。アクセスは `fibo.xxx` |
| `from fibo import *` | fibo.py の公開名すべて（※`_` で始まる名前は除く） | 名前が直接スコープに入る。衝突の危険あり。非推奨 |


## 補足：__name__ と import の実行タイミング

ここまで「名前がどのようにスコープに入るか」に注目してきましたが、  
Pythonでは `import` に関する2つの仕様も知っておくとより理解が深まります。


### `__name__` 変数の挙動

Pythonの各モジュールには、特別な変数 `__name__` が自動で定義されています。  
これは「そのファイルがどのように実行されたか」を示すものです。

| 実行方法 | `__name__` の値 |
|----------|-----------------|
| モジュールを直接実行 | `"__main__"` |
| 他のファイルから `import` | モジュール名（例：`"fibo"`）|

```python
# fibo.py

def fib(n):
    return n

if __name__ == "__main__":
    print(fib(10))  # 直接実行時だけ動作する
```


### モジュールは最初の1回だけ実行される

```python
import fibo
import fibo  # 2回目は実行されない（キャッシュ）
```

- Pythonはモジュールを1度読み込むと、`sys.modules` にキャッシュします
- 同じモジュールを再び import しても、再実行はされません



## おわりに

- Pythonの**シンボル表**は、変数や関数などの「名前」と「意味（参照）」の対応を管理する仕組み
- スコープごとにシンボル表が分かれていて、`import` の方法によって登録される名前が変わる
- `import モジュール名` ではモジュール名だけが入る
- `from モジュール名 import *` では、公開されている名前（※ `_` から始まるものは除外）が直接入る
- `__name__` や「モジュールは一度だけ実行される」という仕様も覚えておくと、理解がより深まる

この記事が、Pythonの名前の仕組みやimportの動作を理解する一助になれば幸いです！
子供向けのAI学習教材(日記)


---

##  使っている数学知識（やさしく説明）

| 数学のジャンル | 使われている考え方 | どこで出てくる？ |
|----------------|------------------|-------------------|
| **数と式** | 数字の範囲、分数、割り算、0〜1への変換 | 白黒の画像を「0〜1の数字」に変えるところ |
| **図形と空間** | 28×28のマス目、位置、面積の感覚 | 画像がマス目でできている、平面を扱う |
| **関数と変化** | 入力→出力の変化（関数の考え） | ニューラルネットワークの「層」のしくみ |
| **確率** | 「これは5っぽい確率が90%！」 | 最後のsoftmaxという処理で出てくる |
| **統計** | 正解と不正解、正答率（accuracy） | モデルの評価（何%あたったか） |
| **ベクトル・行列（高校以降）** | 数をならべて、まとめて処理する | Flatten層やDense層の中身（自動処理） |

---

##  もう少し大人向けに
| 数学の概念 | プログラム内での役割 |
|------------|-----------------------|
| **正規化（0〜1のスケーリング）** | `x_train = x_train / 255.0` 画像の白黒を0〜1に直す（分数の理解） |
| **ベクトル変換（Flatten）** | 28×28の画像を784個の1列に変える（次元の変換） |
| **重み付き和と活性化関数** | ニューラルネットワークの中身、\( y = f(w_1x_1 + w_2x_2 + ... + b) \) |
| **分類（10種類に分ける）** | 出力が10個 → softmaxで確率に変換 |
| **誤差と最適化（損失関数）** | 正解とのズレ（cross entropy）を最小にするよう重みを学習 |

---

##  数学的キーワードまとめ

| キーワード | 学年目安 | 概要 |
|------------|----------|------|
| 正規化（スケーリング） | 小5〜中学 | 255を1にする割り算、単位変換 |
| 座標と配列（行列） | 中1〜高1 | マス目・位置・リスト構造 |
| 関数（入力→出力） | 中学〜 | \( f(x) \) という考え方（活性化関数） |
| グラフと傾き | 中2〜 | 学習結果をグラフで見る／変化の度合い |
| 確率分布 | 中3〜高1 | softmaxの出力 → 合計1になる確率の並び |
| 誤差と最小化 | 高校〜大学 | どこが間違ってる？を数で表して学習する |

---

```python
# プログラム名: ai_digit_recognition_easy.py
# 目的: AIが数字の絵を見て「これは〇！」ってあてる体験ができる

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical

# ① 手書き数字のデータをよみこむ / Load MNIST dataset
# x_train, y_train: AIが勉強する用の画像と答え
# x_test, y_test: テスト用（AIが当ててみる）
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# ② 画像の色を0〜1にする（AIが読みやすいように） / Normalize
x_train = x_train / 255.0
x_test = x_test / 255.0

# ③ AIの「数字あてクイズモデル」を作る / Build a simple neural network
model = Sequential([
    Flatten(input_shape=(28, 28)),    # 画像をまっすぐ1列にする（28×28 → 784）
    Dense(128, activation='relu'),    # 「かしこい考える場所」が128個
    Dense(10, activation='softmax')   # 出力は「0〜9の中からどれ？」を確率で出す
])
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# ④ 勉強スタート！（3回くりかえして覚える）/ Train the model
model.fit(x_train, to_categorical(y_train), epochs=3, batch_size=128)

# ⑤ AIにクイズを出す：1枚ランダムに選んでみせる / Pick one image randomly
index = np.random.randint(0, len(x_test))
img = x_test[index]

# ⑥ 画像を表示して、「これはなんの数字？」とたずねる / Show the image
plt.imshow(img, cmap='gray')
plt.title("What number is this?")
plt.axis('off')
plt.show()

# ⑦ AIに予想させよう！/ Let AI guess
prediction = model.predict(np.array([img]))
predicted_number = np.argmax(prediction)

# ⑧ 結果を表示！/ Show prediction result
print(f"🤖 AIのこたえ： {predicted_number}")
print(f"✅ ほんとうのこたえ： {y_test[index]}")

```
結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/63dcf474-432e-4dda-9ad4-3609aec729e3.png)
【図解】Kinesis Data StreamsとKinesis Data Firehoseの違いを図解したい

# イメージ

DynamoDBの変更記録をS3に保存したい場合のイメージで図解

![kinesis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349281/1b45dd15-a8ae-48c6-8937-f585f96e5c66.png)


- お魚 .. データ。お魚は川の中では24時間の命（365日まで延命可能）
- 川 … Kinesis Data Streams
- ホース … Kinesis Firehose Streaming
- 男の子 ... Lambda、Amazon Managed Service for Apache Flink（※）

（※）使ったことないので適当なこと言ってたらスミマセン

# StreamsとStreamingの言葉の違い

- stream...「小川」などの水の流れを指す言葉
- streaming...「配信する」「連続的なデータの流れ」という意味

# Data Streams

- お魚が泳いでいる川
- 流れてるデータ（お魚）をSQLでリアルタイム分析（コンシューマー）
- 例えば、IoTで流れて来たデータをLambdaがコンシューマとして拾いエラーをチェック
- Lambdaがコンシューマとしてデータ加工 -> Firehoseに流すなども（Direct Put）

# Firehose Streaming

- 川にホースを伸ばしてお魚を流し込む
- データの上流（ホースの垂らし先）はData Streams以外にも色々ある
- 逆に保存先もS3以外の選択肢がある（DataDogやSplunk連携も可能）

# 終わりに

Kinesisがデータ分析に関する何かである事は知ってる。しかし、具体的に何をしてるかは知らない。そんな状態でした。業務で触る機会に恵まれたので、自分なりに整理して見ました。
Oracle 23c Free でユーザを作ろうとしてちょっとハマったこと

# はじめに
https://qiita.com/tarosuke777000/items/d44415c7ba32b940012e

の続きで 23c Free を使おうとしてユーザ作成時にハマったことのご紹介です。
私と同じく特に11gまでしか利用したことが無い人のご参考になれば幸いです

# 前提
SQLDeveloperで接続
```
ホスト名：localhost
ポート：1521
SID：FREE
```

# 何をしようとしたか
ユーザを作る

```
CREATE USER testuser1 IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO testuser1;
GRANT UNLIMITED TABLESPACE TO testuser1;
```

# 以下エラーが発生する
```
CREATE USER testuser1 IDENTIFIED BY password
エラー・レポート -
ORA-65096: 共通ユーザーまたはロール名は、接頭辞C##で始める必要があります

https://docs.oracle.com/error-help/db/ora-65096/65096. 00000 -  "common user or role name must start with prefix %s"
*Cause:    An attempt is being made to create a common user or role without
           the correct prefix as specified in the COMMON_USER_PREFIX
           parameter.
*Action:   Specify a valid common user or role name with the correct prefix.
*Params:   1) common_user_prefix
           parameter.
```

# エラーメッセージ
なんだと？8i,9i,10g,11gまでしか使ったことない自分は、こんなユーザ名のルールは聞いたことが無い。
```
ORA-65096: 共通ユーザーまたはロール名は、接頭辞C##で始める必要があります
```

# 少し調べると

12cからのマルチテナント・アーキテクチャで、CDB（コンテナデータベース）にユーザを作成しようとしているらしい。

しかも、

https://blogs.oracle.com/oraclemaster/post/om-golddba-2019-seminar-1

マルチテナント・アーキテクチャはOracle Database 12cから出てきた機能になり、次のLong Term ReleaseであるOracle Database 23cでは必須構成(従来型のデータベースはサポート対象外)になります。

とのこと。

なんだと？23cはマルチテナント・アーキテクチャしかない？

https://docs.oracle.com/cd/F82042_01/multi/introduction-to-the-multitenant-architecture.html#GUID-5C3D6692-B935-46CB-BF5B-B10D7640003C

ノート:マルチテナント・コンテナ・データベースは、Oracle Database 21cでサポートされる唯一のアーキテクチャです。ドキュメントが改訂されている間は、従来の用語が残っている可能性があります。ほとんどの場合、「データベース」と「非CDB」は、コンテキストに応じてCDBまたはPDBを指しています。アップグレードなどの一部のコンテキストでは、「非CDB」が以前のリリースの非CDBを指しています。

とのこと。

21cからマルチテナント・アーキテクチャのみなのか。
だいぶ時代の流れから取り残されていたと実感。

# とりあえず、11gのようにユーザを作るには？

PDB（プラガブル・データベース）に接続して、ユーザを作れば良さそう。

どうやって、PDBに接続するのか？というと、

https://www.oracle.com/jp/database/free/get-started/#connecting

を見ると

```
sqlplus sys@localhost:1521/FREEPDB1 as sysdba
```

とすると FREEPDB1 と思いきや、接続できず。

```
ホスト名：localhost
ポート：1521
SID：FREEPDB1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206526/d844f5b6-4723-4773-9103-cb25df461ea7.png)

SIDじゃなくて、サービス名か！？というところで、試したら接続できた！

```
ホスト名：localhost
ポート：1521
サービス名：FREEPDB1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206526/fdb50831-ae16-4b94-8808-9f465a576ccb.png)

# あらためてユーザ作成
無事に作成完了。
```
User TESTUSER1は作成されました。


Grantが正常に実行されました。


Grantが正常に実行されました。
```

# あらためて結論
21c以降、マルチテナント・アーキテクチャ(12cからの機能)というものがスタンダードになっているようなので、11gまでしか利用したことが無い人はご注意を。

とはいえ、CDBにユーザを作ってみたくなったので、今度作ってみたいと思います。
あと、起動とか停止とかも11gまでしか知らない自分としては興味津々。
商品検索はMap派？配列派？

Paizaの「商品検索」での気づきメモです。`Map`ばっか使ってたら、配列で `.has()`を使ってミスった…。
あと、以前にコメントで教えていたただいた`indexOf`を使ってみたよ！

## <br>🔍 問題概要（Paiza: 辞書に登録済みか判定）

問題URL: https://paiza.jp/works/mondai/data_structure/data_structure__dict_boss

- N個の商品名と、Q個の検索したい商品名が与えられる。
- 「最初に出てきたインデックス」を出力。
- 該当商品がなければ `-1`。

<br>入力例:
```
3 2
a
b
c
b
d
```
出力例:
```
2
-1
```

## <br>❌ NG例：配列にhas()使ってしまった
```js
if (goodsArray.has(item)) {
    // TypeError: goodsArray.has is not a function
}
```
配列には `.has()`使えない！
`Set` や `Map` にだけ使えるやつ。配列なら `.includes()` が正解。

## <br>✅ OK例①：配列 + includes + indexOf
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', (input) => lines.push(input));

rl.on('close', () => {
    const [N, Q] = lines[0].split(' ').map(Number);
    const goodsArray = lines.slice(1, N + 1);
    const queries = lines.slice(N + 1);

    queries.forEach(item => {
        if (goodsArray.includes(item)) {
            console.log(goodsArray.indexOf(item) + 1); // 1始まりに注意！
        } else {
            console.log("-1");
        }
    });
});
```
- `.includes()` で存在確認
- `.indexOf()` でインデックス取得（`0`始まりなので `+1`）

## <br>✅ OK例②：Mapで高速検索（O(1)）
```js
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

rl.on('line', (input) => lines.push(input));

rl.on('close', () => {
    const [N, Q] = lines[0].split(' ').map(Number);
    const goodsArray = lines.slice(1, N + 1);
    const queries = lines.slice(N + 1);

    const goodsMap = new Map();
    goodsArray.forEach((item, index) => {
        if (!goodsMap.has(item)) {
            goodsMap.set(item, index + 1); // 1始まりで記録
        }
    });

    const results = queries.map(item =>
        goodsMap.has(item) ? goodsMap.get(item) : -1
    );

    console.log(results.join('\n'));
});
```
- `Map`で商品名 → 最初の出現位置 を記録
- 検索は `.has()` と `.get()` の組み合わせ


## <br>✅ 技術的まとめ

- 配列: `.includes()` / `.indexOf()`

- `Map`: `.has()` / `.get()`

- 出力が`1`始まりなら `+1` を忘れずに

- 検索が多い or 高速化したいなら `Map` を使う

最近は`has()`ばっかり使ってたから、癖でやっちゃった(´;ω;｀)

<br><br>[僕の失敗談(´;ω;｀)と解決話🚀](https://paizabeginner.wordpress.com/2025/04/20/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e5%95%86%e5%93%81%e6%a4%9c%e7%b4%a2%e3%81%afmap%e6%b4%be%ef%bc%9f%e9%85%8d%e5%88%97%e6%b4%be%ef%bc%9f/)
【Youtube】動画タイトルを他言語にする方法

youtube動画のタイトルを他言語に対応させる方法です

ワシのチャンネルです

https://www.youtube.com/@00139-ryo
# 手順
①YoutbeStudioから変更したい動画の編集ページに飛びます
②「字幕」ページを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/d8d52c91-64c7-4689-b74c-0d292207ab19.png)

③「言語を追加」から追加したい言語を選択(今回は英語を選択しました)
![Screenshot 2025-04-20 16.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/c90b6818-351f-4fb9-b6d8-ac05ff53d00c.png)

④追加した言語の「タイトルと説明」欄をタップして開きます。
⑤それぞれタイトルと説明欄を追加して保存したら完了です
![Screenshot 2025-04-20 16.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/f50645b4-39b7-4035-92a2-aaf1b28dcc62.png)

追加後に言語を英語にした場合↓
![Screenshot 2025-04-20 16.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/033df784-a9ba-411a-a1eb-b20a5d641ff4.png)

そのまま日本語の場合↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/b6b5f2ce-b3c4-47d6-984e-314a9b4495c7.png)
コピペの功罪

# コピペの功罪
#### 最近、「過去の間違った遺産を真似て」動作したからOK!!と考えてルーターコンフィグをデプロイしてしまった経験１年生の幼き新人くんの出来事から、「ググる」「過去の間違った遺産を真似る」など「コピペの功罪」について、考えてみた。

## 良いコピペ
#### ① この世は誰一人として最初から知識が身についている訳ではなく、「猿真似」から「学ぶ」を軸にプロトで動作を「観察してみる」「デバックトレース」から始まり、公式リファレンス・ドキュメントと比較しながら「仕組みを学ぶ」上でのコピペ
#### ② 一部パラメータ変更を除き作業効率の観点で量産が必要なコピペ
#### ③ 過去評価された実績のあるコードやコンフィグを真似て更に改良、流用するコピペ

### つまり、↓に当てはまると良いコピペ
### ●猿真似で学ぶ・検証する、あくまでラボる範囲
### ●作業効率化
### ●改善・改良の観点で過去の資源を活用

## 悪いコピペ
#### ① 「ググる」で得たソースやコンフィグを１行１行理解せずに稼働中の実環境へぶっ込むコピペ
#### ② 「品質評価・レビューを得ていない」ソースやコンフィグを1行1行理解せずに稼働中の実環境へぶっ込むコピペ
#### ③ 著作・盗用の観点で訴えられるリスクのコピペ

### つまり、↓に当てはまると悪いコピペ
### ●1行1行理解出来ていない
### ●他依存関数やAPI、ルーティング、ACLなど相互関連の観点から影響度が予測出来ない
### ●評価検証しない
### ●自責出来ない
### ●他者への迷惑を考えない利己的

# 😎評価検証しないまま「実環境へぶっ込む勇気」へ称賛
# 😱コピペした本人は「俺ってスゲェー」の賛美に浸ってる姿に称賛

# 理系だと必ず推論と実証の差分考察は必ずあるので、提出レポートはコピペ誤魔しは出来ない。そしてコピペの恐ろしさ、そして実証と記録の大切さは身についているけど、質が落ちてるのかな？。

####
一読頂きありがとうございました。なにかコメントあればお待ちしてます👍️
【Python初心者】『Python実践データ分析100本ノック』1〜10本目に挑戦してみた体験と学び【躓きポイントと乗り越え方】



## はじめに

こんにちは、Python初心者として、日々コードと格闘している社会人です。  
今回は『Python実践データ分析100本ノック（以下、100本ノック）』に取り組んでみて、その中で得た学びや感動、そして何より**数々のエラーとの出会い**を、備忘録としてここに記しておきたいと思います。

「これからやってみようかな」と思っている方の参考になれば、そして、どなたかとこの“体験”を共有できれば幸いです。

---

## 📖 Python実践データ分析100本ノックとは（引用）

100本ノックは、データ分析に必要なPandasの使い方を、さまざまなビジネスデータをもとに100問分ひたすら実践して身につけていく教材です。  
基礎から中級まで、段階を追って実務に即した内容が詰まっており、**現場レベルの実践力**を養うことができます。

> 💡 書籍・教材については著作権を尊重し、内容は引用の範囲内にとどめています。

---

## 🧑‍💻 実践した環境

- Python 3.10
- Jupyter Notebook
- pandas 1.5.x
- 使用教材：100本ノック CSV + Jupyterノートブック形式

---

## 🚀 学習スタイルとモチベーション維持法

最初に感じたのは…**「敷居、たっけぇ」**です。  
正直、初見では全く意味が分からず手が止まる場面が多かったです。

ですが、**「1日1ノック」**と決め、平日の朝に取り組み、週末は復習。  
少しずつ繰り返すうちに、  
「こんな動作してたのか！」  
「はぁー、すっげ！」  
「やべぇ、これマジでおもろい」  
と、心の中でつぶやいてました（笑）

---

## 🧠 1〜10本目の学びと感動

### ✔ 主に身についたこと

- CSV読み込み → `.read_csv()` で「これぞデータ分析の入口」
- `DataFrame`の基本操作 → `.head()`, `.info()`, `.describe()` などで概要把握
- データの条件抽出 → `df[df["列名"] == 値]` 形式を体に染み込ませる
- 集計系 → `.groupby()`, `.value_counts()` によるデータの見せ方
- `pd.to_datetime()` による日付変換と `.dt` アクセスで月単位の抽出など

---

## 🐛 やらかしポイント＆詰まりポイント（初心者のリアル）

### ❌ `.dt.strftime` に「.（ドット）」が抜けててエラー
```python
join_data["payment_month"] = join_data["payment_date"]dt.strftime("%Y%m")
```
**→ `AttributeError` に苦しむ → `.dt` の前にはドット必須だと理解**

---

### ❌ `groupby()` に複数列渡すときはリスト形式にすべきだった
```python
join_data.groupby("payment_month", "item_name")  # ←これはNG
```
**→ 正しくは：**
```python
join_data.groupby(["payment_month", "item_name"])
```
地味だけど致命的な間違い。Pythonの引数の扱いに慣れていない証拠でした。

---

### ❌ `sum()` が `datetime` 型に対して失敗する
```python
df.groupby("月")["日付"].sum()  # ← TypeError発生
```
**→ 日付は合計できない！と学びました。数値列だけを指定すべし。**

---

## 🎨 ヒートマップで「数字が見える化」されて感動

以下のようなコードで月別・商品別の売上を視覚化できたとき、**思わず「おぉ…！」と声が出ました。**

```python
pivot = pd.pivot_table(join_data, index='item_name', columns='payment_month', values='price', aggfunc='sum')

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(10,6))
sns.heatmap(pivot, annot=True, fmt=".0f", cmap="YlGnBu")
plt.title("月別×商品別 売上ヒートマップ")
plt.show()
```

---

## 🔚 まとめ：やってよかった、本気で。

1〜10本目でもう「十分価値がある」と思いました。  
一問ずつ丁寧に向き合えば、初心者でも少しずつ成長できます。

失敗して恥をかいて、検索して、理解して、次に活かす。  
その積み重ねが本当に面白いんです。

---

## 📝 今後の目標

- ノック11〜20も継続挑戦
- 可視化の幅を広げる（棒グラフ、散布図、箱ひげ図…etc）
- `groupby().agg()`や結合処理をマスターする

---

## 🙏 最後に

ここまでお読みいただきありがとうございます。

本記事は自分の備忘録として書きましたが、どなたかが同じように100本ノックに挑戦される際の、**ちょっとした道標**になれば嬉しいです。

また、自分の理解が間違っていた点などあれば、ぜひコメントやアドバイスもいただけると励みになります。

---

**それでは、また「11〜20本目」の体験記でお会いしましょう！**

---
【Python初心者】文字列フォーマットまとめ（format() と f文字列）


Pythonでの文字列フォーマットは、format() メソッドや f文字列（f-string）を使うことで、出力の見た目を整えることができます。  
本記事では、文字列フォーマットの基本的な使い方と、よく使われるフォーマット指定子を分かりやすく整理します。

---

## Pythonの文字列フォーマット方法の種類

Pythonでは、文字列を整形する方法が主に3つあります：

| 方法               | 特徴                                  | 対応バージョン         |
|--------------------|---------------------------------------|------------------------|
| `%` フォーマット   | 古いスタイル。C言語に似ている         | Python 2〜3（非推奨寄り） |
| `str.format()`     | 柔軟で汎用的な方法。試験でもよく出る   | Python 2.6〜            |
| f文字列（f-string）| 直感的で簡潔。Python 3.6以降の主流     | Python 3.6〜            |

この記事では主に、**`str.format()` と f文字列**を取り上げて比較しながら解説します。  
※ `%` フォーマットも補足として紹介します。

---

## 1. format() の基本と使い方

### 1-1. 位置引数とキーワード引数

```python
# 位置引数
"{}さんは{}歳です".format("田中", 28)
# → '田中さんは28歳です'

# キーワード引数
"{name}さんは{age}歳です".format(name="佐藤", age=30)
# → '佐藤さんは30歳です'
```

### 1-2. インデックス指定

```python
"{0}さんは{1}歳、{0}さんの趣味は{2}です".format("田中", 28, "読書")
# → '田中さんは28歳、田中さんの趣味は読書です'
```


## 2. format() で使えるフォーマット指定子

### 2-1. fill（埋め）、align（寄せ）、width（フィールド幅）

```python
# 右寄せ（幅5）
"{:>5}".format("a")
# → '    a'

# 左寄せ（幅5）
"{:<5}".format("a")
# → 'a    '

# 中央寄せ（幅5）
"{:^5}".format("a")
# → '  a  '

# 埋め文字0＋右寄せ（幅6）
"{:0>6}".format(42)
# → '000042'
```

### 2-2. sign（符号）

```python
# 正負どちらも表示
"{:+}".format(3)
# → '+3'

# 正のとき空白
"{: }".format(3)
# → ' 3'

# 負のときのみマイナス
"{:-}".format(3)
# → '3'
```

### 2-3. ,（3桁区切り）

```python
"{:,}".format(1234567)
# → '1,234,567'
```

### 2-4. .precision（小数点以下の桁数）

```python
"{:.2f}".format(3.14159)
# → '3.14'

"{:.1%}".format(0.876)
# → '87.6%'
```

### 2-5. type（変換型）

```python
"{:d}".format(42)      # 整数
# → '42'

"{:.2f}".format(3.14)  # 小数（2桁）
# → '3.14'

"{:.1%}".format(0.85)  # パーセント
# → '85.0%'

"{:s}".format("abc")   # 文字列
# → 'abc'
```


## 3. f文字列（f-string）の基本と使い方

### 3-1. 基本構文（Python 3.6以降）

```python
name = "鈴木"
age = 25
f"{name}さんは{age}歳です"
# → '鈴木さんは25歳です'
```

### 3-2. フォーマット指定子の使い方（format() と同じ）

```python
# 幅・埋め文字・寄せ
value = 42
f"{value:0>6}"
# → '000042'

# 小数点以下2桁
pi = 3.14159
f"{pi:.2f}"
# → '3.14'

# カンマ区切り
num = 1234567
f"{num:,}"
# → '1,234,567'

# 符号表示
f"{+3:+}"
# → '+3'

# パーセント表示
rate = 0.876
f"{rate:.1%}"
# → '87.6%'
```


## 4. format() と f文字列の比較

| 機能          | format() 形式                        | f文字列形式                      |
|---------------|--------------------------------------|----------------------------------|
| 基本書式      | `"{:.2f}".format(3.14)`              | `f"{3.14:.2f}"`                  |
| 複雑な埋め込み| 可                                   | 可（式や変数もOK）               |
| 可読性        | やや長い                             | より直感的で読みやすい          |
| Pythonバージョン | 2.6以降                            | 3.6以降                          |


## 5. 補足：%による旧スタイルのフォーマット

```python
"%sさんは%d歳です" % ("田中", 28)
# → '田中さんは28歳です'
```

- `%s`: 文字列
- `%d`: 整数
- `%f`: 小数（`%.2f` で2桁）

現在は <strong>format()</strong>や <strong>f文字列</strong>が推奨されています。


## 6. まとめ

- `format()` も f文字列も、フォーマット指定子の書き方は同じ
- fill（埋め）、align（寄せ）、width（フィールド幅）を組み合わせて表示を整形
- 精度、符号、カンマ区切り、型指定なども柔軟に対応可能
- f文字列はPython 3.6以降の推奨スタイルで、可読性も高い
【Rails】画像ファイルの格納について

# 記事概要
Ruby on Railsの画像ファイル格納について、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# 手順(app/assets/images配下)
1. `Finder`でアプリのパスへ移動する
1. `app/assets/images`配下へ移動する
1. 画像ファイルを格納する
1. 画像利用時、画像ファイル名だけで画像を使用できる
    `menu.jpg`

# 手順(public配下)
1. `Finder`でアプリのパスへ移動する
1. `public`配下へ移動する
1. 画像ファイルを格納する
1. 画像利用時、`/`から記述することで画像を使用できる
    `/menu.jpg`

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a
スパイ映画で理解するAIエージェント

次々と新しい用語が飛び出し、目まぐるしく進化するAIシーンには圧倒されてしまいます。

最近話題のAIエージェント。「エージェント」というからにはスパイ映画で例えてみましょう！

## LLM=主人公 / フレームワーク=組織 / MCP=外部協力者

007 シリーズのジェームズ・ボンドや『ミッション：インポッシブル』のイーサン・ハントは卓越した能力を持つ主人公ですが、所詮は生身の人間であり、単独では限界があります。

同じように、大規模言語モデル（LLM）も非常に賢いものの、記憶の持続や外部連携には弱点が残ります。

そこで登場するのが LangChain、Dify、Mastra などのフレームワークです。これらはボンドを支える MI6 や Q 部門、ハントを支える IMF であり、開発されたスパイ装備の数々です。

プロンプトの整理、ツールの呼び出し、長期的なタスク設計といった支援があるからこそ、生身のLLM は「エージェント」として活躍できるのです。

さらに物語を豊かにするのが、ベクトルデータベースや MCP（Model Context Protocol）サーバーといった「外部協力者」。主人公が持たない特技を生かして物語に深みと面白みを加えます。

スパイ映画との大きな違いは、主人公と組織の組み合わせを自由に変えられる点です。イーサン・ハントが MI6 で活躍するのも容易です。開発者は目的に応じて LLM とフレームワーク、外部データソースを自在に組み替え、ミッションを設計できるのです。

あくまで説明用の喩えですが、エージェントつながりでいいかなと思いました。