OmniAICreator/Qiita-1.07M huggingface dataset:
playgroundsのみでswiftUIを学ぶ初心者にとってのPreviewProvider

## まえがき
僕は先日からiPadのplaygroundsを使ってスキマ時間にswiftUIの学習を始めたプログラミングど素人です。
勉強記録をQiitaに書き始めて、初めてMarkdown記法を知ったレベルのど素人です。
何か誤りなどありましたら、ご指摘いただけますと幸いです。

## みんながコードに書き添えてるPreviewProviderって、何？

ひたすらドキュメントや先人の知恵を読みまくっている時に、ナニコレ？と思ったうちの一つが`PreviewProvider`でした。


https://developer.apple.com/documentation/swiftui/previewprovider

```swift
struct CircleImage_Previews: PreviewProvider {
    static var previews: some View {
        CircleImage()
    }
}
```

そうそう、これこれ。
なんかみんな末尾に添えてるんだよな。
Xcode上でプレビューを確認する時に使うやつ…？

https://qiita.com/luglio22/items/98b779a343a03e23ccdf

うーん、そんな感じで記述しておられるな。
今のところまだXcodeは触ってないからよくわからんけど、プレビュー機能もコードで呼び出してあげないといけない…って感じっぽいな。違うんかな。


playgroundsであればコードの変更内容を即時反映してプレビューで表示してくれるから、iPadのplaygrounds君をだけを使ってるうちは実用性あんまなさそう…？

もう少し掘り下げるには、playgrounds君そのもののレビュー記事とかが参考になりそう。


https://zenn.dev/tkgrove512/articles/42d135def35ad5

[プレビュー](https://zenn.dev/tkgrove512/articles/42d135def35ad5#%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)の項目にビンゴな内容の記載があった。

>4.2からPreviewProviderを宣言したビューを含むSwiftファイルを表示していると、プレビューの上部にボタンが現れ、そのビューのプレビューを直接表示できるようになりました。表示するまでに多段階の操作のが必要なビューの確認は楽になったと言えます。

>![Zennの上記記事より引用](https://storage.googleapis.com/zenn-user-upload/072fc5b00fa8-20230428.png)

なるほど、playgrounds君でも活かせる場面はあるっぽいな。
続く一文に若干の不穏があるが…

>ただ、@Binding宣言した変数やenvironmentObjectで受け渡すオブジェクトの状態が、表示するまでの操作の中で設定され、表示が変わるようなビューの場合には、想定通りに表示されない可能性があります。

まぁシンプルにそりゃそうか、って感じだ。一画面だけ抜き取ってきた場合、プレビューするための情報が足りない可能性もあるもんな。

## 結論 PreviewProviderとは

- Xcodeで開発をする時に手軽にプレビュー表示させるための機能
PreviewProviderを使わない場合はビルド&実行しないといけないっぽい(めっちゃ大変そう)
Canvasってところに表示されるっぽい
- iPadのplaygroundsにはそもそもライブプレビュー機能が備わってるから、iPadのplaygroundsだけで開発するならあんまり必要なさそう
- iPadのplaygroundsでPreviewProviderがあると、通常のプレビュー画面に加えてPreviewProviderの情報を表示できるボタンが追加される


<table>
<thead><td>環境</td>
<td>PreviewProvider のメリット</td>
</thead>
<tbody>
<tr>
<td>通常の Swift Playgrounds</td>
<td>ほぼ無し（即時描画機能搭載）</td>
</tr>
<tr>
<td>Xcode プロジェクト</td>
<td>必須（Canvas表示用）</td>
</tr>
</tbody>
</table>

こんなところか。以上！
jar内部ファイルの書き込み方法

## jar内部のファイルは変更できない、させない。

javaプログラムのテキストファイルなどはjavaのIDEで実行した場合、ファイルの中身を書き換えることは可能なのだが、jarを作成しその内部のファイルはセキュリティの問題から書き換えはできない。またこのプログラムを配布する場合、実行ファイル(exeファイル)は当然、プログラムフォルダーに作成される。基本、プログラムファイル内部のデーターの変更はしないことになっている。

次のような場合を想定する。
jarの中にテキストファイルを入れる。このファイルにはcsv形式でデーターが入っている。このデーターをもとにJtableにDefaultTableModelの票を作成する。ユーザーは票のデーターを削除、追加することが可能である。

この場合、票のRowの追加と削除は簡単にできるのだが、jar内部のcsvファイルを書き換えることはできない。このため、次のような解決方法がある。

内部を書き換えたいtxtファイルやメディアファイルはwindowsの場合、ユーザーホームのAppData/Local/フォルダー内部に保管する。jarのリソースからファイルの中身をコピーし、AppDataのユーザーフォルダー内に新たにファイルを作成して、コピーしたデーターを書き込む。

## jarリソース内部のデーターファイルをAppData内に新たに作成する。

ユーザーAppDataｎフォルダーパスをStringで得たい場合、次のように書く。フォルダーは事前に作成しておく。

```java

String strFolder = System.getProperty("user.home") + "\\AppData\\Local\\UserFolder";

File createFolder = new File(strFolder);
    if(createFolder.exists() == false){

        createFolder.mkdir();
    }   
```

またファイルのパスを作成する。

```java
String strFilePath = strFolder + "\\csv.txt";
```

次にjarファイル内のtxtファイルを読み込む。これにはgetClass().getResourceAsStream()でinputStreamを得てからBufferedInputStreamクラスを利用してファイルにアクセスする必要がある。次のように書く。この時、フォルダーの分岐は必ず`/`を使う。

```java
BufferedInputStream bInput = new BufferedInputStream(getClass().getResourceAsStream("image/csv.txt"));
```
txtファイルのバッファをすべてコピーする。これはjpegなどの画像ファイルでも同じだ。最後にFileOutputStreamでAppDataのユーザーフォルダーに作成するファイルにバッファーを書き込む。

```java
byte[] read = bInput.readAllBytes();

FileOutputStream outStream = new FileOutputStream(scanf.getPath());
outStream.write(read);
outStream.close();
```
一連の流れを関数にすると以下のようになる。

```java

    String strAppPath = System.getProperty("user.home") + "\\AppData\\Local\\UserFolder";
    //フォルダーはFile関数で事前に作成する
    String strFilePath = strAppPath + "\\csv.txt";

    public int createList(){

        File appDataFile = new File(strFilePath); //コピーする先のファイルを作成する。
        BufferedInputStream bInput = new BufferedInputStream(getClass().getResourceAsStream("image/csv.txt"));
    
        try {
            
            byte[] read = bInput.readAllBytes();

            FileOutputStream outStream = new FileOutputStream(appDataFile.getPath());
            outStream.write(read);
            outStream.close();

        } catch (IOException e) {
            // TODO: handle exception
            return -1;
        }
        
        return 0;
    }

```
【基本情報・応用情報・安全確保支援士】認証と認可の違いとは？

# はじめに
セキュリティを語るうえで，よく出てくる2つのキーワード．  
それが「**認証（Authentication）**」と「**認可（Authorization）**」．

似たような言葉で同じ意味なんじゃないかと思いますが，ちゃんと違いがあります．
今回はそんな「認証」と「認可」の違いをわかりやすく解説していきます．

## ■ 一言で言うと？

| 概念   | 内容                           |
|--------|--------------------------------|
| 認証   | 「**あなたは誰ですか？**」を確認すること |
| 認可   | 「**あなたは何をしていい人ですか？**」を決めること |

## ■ 認証（Authentication）とは？

「その人が本当に本人であるかどうか」を確認するプロセスです．
言葉をそのまま用いると「その人がその人たる所以を**認めた証拠**」ですね．

### 具体例：
- ユーザー名とパスワードの入力
- 指紋や顔認証などの生体認証
- ICカードやセキュリティトークン
上記はいつも使われているのでわかりやすいと思いますが，ITにおいての認証においては，上記のものは利用者を対象とした認証と分類されます．他にも３種類あります．
- 端末機器を対象とした
    - デバイスID
    - MACアドレス
    - 電話番号 ...
- パケット
    - プロトコル番号
    - IPアドレス
    - ポート番号 ...
- プロセス
    - プロセスID

## ■ 認可（Authorization）とは？

「認証された人が，どこまでの操作をしてよいか」を制御するプロセスです．
言葉をそのまま用いると，「何をすることが**可能かを認める**」，いわゆる権限ですね．

### 具体例：
- 管理者はすべての設定変更が可能だが、一般ユーザーは閲覧のみ
- Aさんは顧客情報にアクセスできるが、Bさんはできない
- クラウドストレージで「閲覧のみ」や「編集可」といった共有設定

この権限には，read, write, executeの３種類があり，利用者の属性やアクセス制御リスト(AccessControlList)であらかじめ設定しておく．

> `chmod ~`で変更する権限と同じですね．

## 認証→認可の流れ

```
[ログイン画面] → ユーザーがIDとパスワードを入力
        ↓（認証）
[本人と確認される]
        ↓（認可）
[この人には「管理者権限」を与える]
        ↓
[ダッシュボードへアクセス許可]
```


## ■ まとめ

| 項目     | 認証（Authentication）              | 認可（Authorization）             |
|----------|--------------------------------------|-----------------------------------|
| 意味     | 本人確認                              | アクセス範囲の決定                 |
| いつ行う | 最初に行う                            | 認証後に行う                       |
| 方法     | パスワード、生体、証明書など          | 権限リスト、ロール、ポリシーなど  |
| 実務例   | ログイン処理                          | ファイルのアクセス制限             |

---

## ■ 最後に：この言葉で覚える！

- 「**認証は“誰か”を確かめること**」
- 「**認可は“何ができるか”を決めること**」

この違いを押さえていれば，間違えることはありません！！
個人的備忘録：json-server をインストールしたのに "command not found" と出たときの対応メモ

## はじめに
`json-server` をグローバルインストールしても、コマンドが認識されず `command not found` と表示されることがあります。

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

以下は実際に遭遇したケースとその解決方法の記録です。

## 発生した事象
```bash
npm install -g json-server
```
コマンド実行後：
```
changed 45 packages in 384ms

14 packages are looking for funding
  run `npm fund` for details
```

しかし、次のように実行すると：
```bash
json-server --watch db.json --port 3000
```
```
zsh: command not found: json-server
```

## 初期確認コマンド
```bash
which json-server  # → json-server not found
```

## グローバルインストール先の確認
```bash
npm list -g --depth=0
```
出力：
```
/Users/xxx/.npm-global/lib
└── json-server@1.0.0-beta.3
```

## 解決方法
1. 実行バイナリの場所を確認：
```bash
ls /Users/xxx/.npm-global/bin/json-server
```
ファイルが存在すれば OK。

2. `.zshrc` にパスを追加：
```bash
echo 'export PATH=$HOME/.npm-global/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
```

3. 再度確認：
```bash
which json-server
```
パスが表示されるようになれば成功！

4. サーバー起動：
```bash
json-server --watch db.json --port 3000
```

## まとめ
- `npm install -g` しても `$PATH` が通っていないと実行できない
- `.npm-global/bin` を PATH に追加するのがポイント

npm や zsh を使う際によくあるミスなので、備忘録として残しておきます...！
LXD クライアントとゲストマシンでファイル共有

クライアントとゲストマシンでファイルを共有するときのメモ

## 設定
下記コマンドでファイル共有ができる。

```
lxc config device add <instance_name> <device_name> <device_type> <device_option_key>=<device_option_value> <device_option_key>=<device_option_value> ...
```

例
```
lxc config device add my_instance disk-storage-device disk source=/home/user/share path=/home/user/share
```

ただしこのままでは、下記のようにゲスト側のオーナーとグループがnobody:nogroupとなってしまう
```
$ ls -l
total 4
drwxrwxr-x 2 nobody nogroup 4096 Apr 14 06:25 share
```

そこでraw.idmapを設定してホストとゲストのユーザーとグループのIDを紐付けることで解決する。

ゲスト
```
$ id
uid=1002(user) gid=1002(user) groups=1002(user)
```

ホストで設定して、ゲストを再起動する
```
$ id
uid=1001(user) gid=1001(user) groups=1001(user),100(users)
$ lxc config set my_instance raw.idmap 'both 1001 1002'
$ lxc restart my_instance
```

共有の解除方法
```
$ lxc config device remove my_instance share_disk
```
windows11で、sketchup6 その70

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
solidを判定するRUBYスクリプトを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9127971b-7e35-4611-a49d-0aea6d0d1550.png)

# サンプルコード

```

def is_solid?(group_or_component)
	entities = group_or_component.entities
	edges = entities.grep(Sketchup::Edge)
	edges.all? { |edge| 
		edge.faces.size == 2 
	}
end


def solid0
	entities = Sketchup.active_model.entities
	group0 = entities.add_group
	c0 = group0.entities.add_circle [0, 0, 0], [0, 0, 7], 20
	circle0 = group0.entities.add_face c0
	circle0.pushpull -10
	group1 = entities.add_group
	c1 = group1.entities.add_circle [0, 10, 0], [0, 0, 7], 20
	circle1 = group1.entities.add_face c1
	circle1.pushpull -10
	gr = is_solid? group0
	UI.messagebox gr
	gr = is_solid? group1
	UI.messagebox gr
end

```

以上。
Emacs のデザインを変えてみよう

# はじめに
Emacsのデザインってちょっと見にくい...
ただEmacs使わないといけない時もあると思うので見やすい方がいいですよねっ🎵
ということでEmacsのデザインを自分好みにしてみよう！

# 今のデザインを知ろう
せっかくなので今はどんなデザインがされているか調べてみましょう
```shell
emacs
C-x f ~/.emacs.d/init.el
```
このinit.elがemacsの設定ファイルになります！
```
C-x g load-theme
```
で今の設定されているデザインを確認してみましょう！
```elisp
  ;; color theme
  (load-theme 'misterioso)
  ;(load-theme 'tsdh-dark)
  ;(load-theme 'manoj-dark)    
```
この場合だと、misteriosoになっていますね

# テーマを変えてみよう
emacsの設定ファイルはelispという言語で書かれているので、コメントアウトは;でやります
ここでtsdh-darkに変更してみましょう！

```elisp
  ;; color theme
  ;(load-theme 'misterioso)
  (load-theme 'tsdh-dark)
  ;(load-theme 'manoj-dark)    
```

その後一度emacsを閉じて(C-x C-c)、再度開いてみてください。
変わっているはずです!

他にもemacsにはいくつか入っています。
以下のコマンドで使えるテーマを確かめて幾つか試してみてください。
```
M-: custom-available-themes
```
これで使えるテーマが全部出てくるので、そこから選んで確かめてみてください。
やり方は同じで、
```
(load-theme '使うテーマ名)
```
です！

# もっと他のテーマもやってみよう

いろんなテーマがgithubとかに転がってるんですが、手っ取り早いのがパッケージマネージャーをインストールすることです！
いくつかありますが、今回はMelpaをインストールしてみましょう

設定ファイルを開いて
```shell
~/.emacs.d/init.el
```

以下の文章を一番下に貼り付けて保存してください
```elisp
;melpa install
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/") t)
```
一度emacsを閉じて(C-x C-c)で、再度開いてください

その後以下のコマンドで実行してみてください
今回はMelpaに入っているzenburn-themeを入れてみます。

```elisp
M-x ;コマンド
package-install zenburn-theme
```
実際に実行するために、init.elを編集します。
これまで使用していたテーマをコメントアウトするのを忘れないようにしてください。
```
(load-theme 'zenburn-theme t)
```
その後、emacsを再度閉じて(C-x C-c)、開いてください。
これで実行は完了です。

たまにミスると、emacsぶっ壊れるので、定期的にinit.elはコピーしていつでも戻せるようにしておきましょう。

以下からMelpaで使えるテーマが確認できるので、いろいろ試してみてください。

[Melpaで使えるテーマ一覧](https://melpa.org/#/?q=theme)

Melpaからだと雰囲気見れないですが、githubに飛べば軽く見れる場合があるのでお気に入りを探してみてください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766700/cc28045e-5caa-4286-89a3-4de38cb5e742.png)

[melpa](https://melpa.org/#/zenburn-theme), [github](https://github.com/bbatsov/zenburn-emacs/tree/82112c64c5b0d3b866e82417dd730e0d0d7e1424)

また、melpaでインストールしたテーマは、
```
#tangotangoの場合
~/.emacs.d/elpa/tangotango-theme-0.0.7/tangotango-theme.el
```
に保存されます
tangotango-theme.elをいじれば、細かい配色も変えれるので、気が向いたらやってみてください
(きりがないです。[参考:emacs-doom-themesで簡単オレオレthemeの作り方](https://qiita.com/hyakt/items/0473112466da7f6d3bdc))
頑張れば色々カスタマイズできるらしいので、いいデザインを作って快適なEmacsライフを送ってください！
# 参考
・[Emacsモダン化計画](https://qiita.com/Ladicle/items/feb5f9dce9adf89652cf)
・[emacs-doom-themesで簡単オレオレthemeの作り方](https://qiita.com/hyakt/items/0473112466da7f6d3bdc)
・
RLoginの背景をカスタマイズする

[オプション設定]→[カラー]→[背景設定]→[テキスト描画]からRLoginの画面に出せる文字列をカスタマイズできる。

## 設定画面 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189578/46947190-eb05-4bdb-81e4-c5a81f120e43.png)

色々な変数が使えるらしいが、どれが何を表しているのかわからなかったので調べてみた。

|アルファベット|表示情報|
|:-----------:|:-----:|
|%A|-|
|%B|実行ファイル(RLogin.exe)の存在するディレクトリの絶対パス|
|%C|-|
|%D|6桁の現在の日付(YYMMDD)|
|%E|エントリー名|
|%F|-|
|%G|不明|
|%H|-|
|%I|ダイアログが出て操作不能になる|
|%J|-|
|%K|-|
|%L|-|
|%M|-|
|%N|-|
|%O|-|
|%P|不明|
|%Q|-|
|%R|-|
|%S|接続先ホスト名|
|%T|TERM環境変数|
|%U|ログイン時のユーザー名|
|%V|-|
|%W|-|
|%X|実行ファイル(RLogin.exe)の存在するディレクトリの絶対パス|
|%Y|-|
|%Z|-|

実用的なものはこれくらいでしょうか。
`%E\n%U@%S`

ご参考までに。  
間違いがありましたらコメントで教えていただけると辛いです。
競プロ日記#25/04/13

# アルゴ式-[総和クエリ (1)](https://algo-method.com/tasks/991yuE2)
- 最初はDPみたいな感じを考えたが、解説にもある通り所詮は最大でkパターンの質問しか来ないため最初からk-1までのk個の総和を用意しておく。
- その際にあるi + 1についての総和を求めるためにiまでの総和を使えばよい
```
// あらかじめ回答を用意しておく
vector<int> acc(N+1);
for (int i=0; i<N; ++i) {
    acc[i+1] = acc[i] + A[i];
}
```

# アルゴ式-[総和クエリ (2)](https://algo-method.com/tasks/990s6ea)
- 誘導に乗れば簡単。
- [総和クエリ (1)](https://algo-method.com/tasks/991yuE2)と同様にあらかじめNまでの和を求めて回答を用意しておく
```
int N;
cin >> N;

vector<int> A(N);
for (int i=0; i<N; ++i){
    cin >> A[i];
} 
// あらかじめ回答を用意しておく
vector<int> acc(N+1);
for (int i=0; i<N; ++i) {
    acc[i+1] = acc[i] + A[i];
}

int Q;
cin >> Q;
for(int i = 0;i < Q;i++){
    int l,r;
    cin >> l >> r;
    cout << acc[r] - acc[l] << endl;
}
```
# アルゴ式-[繁忙期](https://algo-method.com/tasks/1677R5GX)
- 以下の通りロジックを組んだのだがイマイチ通らない。（REとWAどっちも）

```
int N,D;
cin >> N >> D;

vector<int> vecX(N);

for (int i = 0;i < N;i++){
    cin >> vecX[i];
}

vector<int> acc(N - D);
for (int i = 0;i < N - D + 1;i++){
    for (int j = 0;j < D;j++){
        acc[i] += vecX[i + j];
    }
    
}

int max = 0;
int ansS,ansT;
for (int i = 0;i < N - D + 1;i++){
    if (max <= acc[i]){
        max = acc[i];
        ansS = i;
        ansT = i + D - 1;
    }
}
cout << ansS << "~" << ansT << endl;
```

- 解説によると以下の様になるらしいがあまり納得いかない。
```
// acc[i] = 日 0 から 日 i より前までの合計来場者数
vector<int> acc(N+1);
for (int i=0; i<N; ++i) {
    acc[i+1] = acc[i] + X[i];
}

// max_sum = 答えとなる期間の開始日
// max_period_visitor = 日 max_sum を起点とする連続した D 日間の合計来場者数
int max_start = 0;
for (int i=0; i<N-D+1; ++i) {
    int period_visitor = acc[i+D] - acc[i];
    if (period_visitor >= max_period_visitor) {
        max_start = i;
        max_period_visitor = period_visitor;
    }
}

// max_end = 答えとなる期間の終了日
int max_end = max_start + D - 1;

// 出力
cout << max_start << "~" << max_end << endl;
return 0;
```
- 普通に考えれば二重ループになっている部分に問題がありそうだがWAが出るのは謎
- でもこれも通らない。というかそもそもCE。max_period_visitorの定義不足らしいが定義しても結局WA。解説のコードがWAって意味わからん過ぎる。
Geminiで弓矢を使う魔法少女を描いてみた。

# 概要

Geminiで弓矢を使う魔法少女を描いてみました。

# 実装

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

```
炎の弓矢を使う魔法少女を描いてみてください。
```

![炎の弓矢を使う魔法少女_2025414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/bcf22765-c7d1-46dd-866c-54a25935f0c7.png)

```
氷の弓矢を使う魔法少女を描いてみてください。
```

![氷の弓矢を使う魔法少女_20250414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/d9d3fd5f-c510-4d16-93f6-8c6f0737738d.png)

```
電撃の弓矢を使う魔法少女を描いてみてください。
```

![電撃の弓矢を使う魔法少女_20250414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/5cbf9904-ae13-4337-94e0-1e197bffbe7c.png)

電撃の少女が可愛い。

# まとめ

何かの役に立てばと。
Reactってなんで人気なのさ

ついにReactに触れた。
対応するにあたり事前にprogateで学習。

翌日、システムの中身を見るとそこには。。。。

見慣れない用語が

あれ？render()はどこ行った
など考えながら調べるとお作法が変わったらしい。

なんでReactって人気といわれるまでになったんだろう。
ちょっと調べた。

## React

- Facebook、現Metaが2013年に公開したフロントエンド向けのライブラリ
- JavaScriptで動作しUI（ユーザーインターフェース）を構築するために使う
- 状態（state）に応じて画面の見た目（ビュー）を自動的に更新する

---

## Reactの歴史

- 2011年：Facebookの広告管理ツールで社内導入
- 2012年：Instagramにも使用
- 2013年：Reactがオープンソースとして一般公開
- 2019年：Hooks機能が登場し、関数コンポーネントが主流に

---

## jQueryとReactの違い

| 比較項目 | jQuery | React |
|----------|-------------|-----------|
| コーディングの考え方 | 命令的（手順を書く） | 宣言的（どうなってほしいかを書く） |
| DOM操作 | 手動で変更 | 状態に応じて自動で変更 |
| 規模との相性 | 小～中規模向け | 中～大規模向け |
| コードの再利用 | 難しい | コンポーネントで可能 |
| パフォーマンス | 重くなりやすい | 仮想DOMで効率的 |

### UIの書き方

#### jQuery
- 1つ1つDOM要素を手動で操作する必要がある
- クリックや変更などのイベントごとに処理を書く
- 「どうやるか」を細かく書く命令的スタイル

#### React
- JSXで「どうなってほしいか」をまとめて定義
- 状態（state）に応じて自動でUIが変わる
- 宣言的スタイルでスッキリ書ける

---

## Reactが人気になった理由

- 状態を使ってUIを自動更新できる
- コンポーネントごとに分けられてコード管理しやすい
- 仮想DOMにより高速な描画が可能
- 公式ドキュメントが豊富で学びやすい
- 大規模なアプリ開発に強く企業の採用も多い

---

## ReactとTypeScriptの違いと関係

| 比較項目 | React | TypeScript |
|----------|--------|------------|
| 正体 | UIを作るライブラリ | JavaScriptに型を追加した言語 |
| 拡張子 | `.jsx`（または`.tsx`） | `.ts` / `.tsx` |
| 主な用途 | 画面の見た目を作る | 型の管理、安全なコーディング |
| 関係 | UIを作るために使う | そのUIコードを型安全に書く |

- ReactとTypeScriptは併用されることが多い
- TypeScriptを使うことでReactのコードに型チェックを加えられミスを減らせる

---

## 2019年以降の進化

### Hooks（React 16.8～）

- `useState`, `useEffect` などの「フック」により、関数コンポーネントでも状態管理が可能に
- クラスを書かなくても済むため、コードがシンプルになる


#### Hooksの登場：関数コンポーネントの強化

Hooks（フック）はReact 16.8（2019年2月リリース）で追加された新機能。
Hooksによって、クラスを書かずに関数コンポーネントだけで状態管理や副作用の処理ができるようになった。

それまでReactで状態を持つコンポーネントを作るにはclass構文を使ってthis.stateやライフサイクルメソッドを定義する必要があった。

Hooks登場以降はclassも使わず関数コンポーネント内でuseStateやuseEffectといった関数を呼び出すだけで同様のことが実現可能になった。

#### 例：useStateを使ったカウンター

```jsx
import { useState } from 'react';

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

  return (//returnの中はHTML
    <div>
      <p>カウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>増やす</button>
    </div>
  );
}
```



## Concurrent Mode（React 18～）

- Reactの描画処理を「途中で止めたり」「優先順位をつけて実行」できるようになった
- ユーザーの操作を止めず、重たい処理を裏で行うことが可能に
- startTransition, useTransition などで低優先度の処理を設定できる

## 感想
React自体が元はJQueryのコードが複雑になり、それを解決するために生まれたライブラリだった。
だから中身はJS。
書き方は直感的というか見やすくなっている。
しかも2019年以降はclassの宣言等わずらしさがなくなってすっきりしている。
目が慣れてきた時に思ったのはjQueryの処理より読みやすいような気がした。
jQurtyで物足りなくなった人達が作成したライブラリなんだからいわゆる進化系。
UI触るなら使わなきゃ損だとさえ思った。
[java]任意のハッシュアルゴリズムと文字コードでハッシュ値を生成

```java
package com.example.util;

import java.security.MessageDigest;
import java.nio.charset.Charset;

public class HashUtil {

    /**
     * 任意のハッシュアルゴリズムと文字コードでハッシュ値を生成する。
     *
     * @param input      ハッシュ化する文字列
     * @param algorithm  使用するハッシュアルゴリズム（例：SHA-1, SHA-256, MD5）
     * @param charset    使用する文字エンコーディング（例：UTF-8, Shift_JIS）
     * @return           ハッシュ値（16進文字列）
     */
    public static String hash(String input, String algorithm, String charset) {
        try {
            MessageDigest md = MessageDigest.getInstance(algorithm);
            byte[] bytes = md.digest(input.getBytes(Charset.forName(charset)));
            StringBuilder result = new StringBuilder();
            for (byte b : bytes) {
                result.append(String.format("%02x", b));
            }
            return result.toString();
        } catch ( NoSuchAlgorithmException e) {
            throw new  NoSuchAlgorithmException("指定したアルゴリズムのMessageDigestSpi実装をサポートするプロバイダが存在しないエラーが発生しました", e);
        } catch (DigestException e) {
            throw new DigestException("ハッシュ計算時にエラー発生しました", e);
        } catch (Exception e) {
            throw new RuntimeException("任意のハッシュアルゴリズムと文字コードでハッシュ値を生成にに予期せぬエラーが発生しました", e);
        }
    }
}
```

使用例

```java
public class MainApp {
    public static void main(String[] args) {
        String input = "こんにちは";
        String hash = HashUtil.hash(input, "SHA-1", "UTF-8");
        System.out.println("SHA-1 hash (UTF-8): " + hash);

        String hashShiftJis = HashUtil.hash(input, "SHA-1", "Shift_JIS");
        System.out.println("SHA-1 hash (Shift_JIS): " + hashShiftJis);
    }
}
```
Dify アプリの公開テスト

[前回](https://qiita.com/b-wind/items/f45afb8a0cb4a43a1f60)は Dify にモデルプロバイダー「Gemini」を登録後、「テストアプリ１」から Gemini 2.0 Flash-Lite へ接続できるところまで確認しました。

今回は、「テストアプリ１」を公開していきます。

:::note warn

結論から言えば、公開したチャットボットは問題なく動作しました。
しかし、Difyが示した「アプリを指し示す URL」が実態と異なるため、そのままでは画面を表示することができませんでした。

ただ、Dify は全く悪くないのです。
詳細は後述します。
:::

## 「テストアプリ１」の公開

### ① オーケストレート画面の表示
スタジオ画面の「テストアプリ１」をクリックし、オーケストレート画面を表示します。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/c87c8eff-11e6-4de0-93a3-375a0afc064c.png" />

### ② モデルの選択
[前回](https://qiita.com/b-wind/items/f45afb8a0cb4a43a1f60)と同様に、使用するモデルとして **Gemini 2.0 Flash-Lite** を選択します。

<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/fbe014f3-ed6d-4e16-a167-4fd226470b3d.png" />

### ③ アプリの公開
「公開する」ボタンをクリックすると、直下に公開操作用のウィンドウが表示されます。
青い「Publish Update」ボタンをクリックして、アプリを公開できる状態に更新します。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/e1bfc444-33de-423f-9dd4-1e19d04a7c0c.png" />

公開されると「Publish Update」ボタンの色が薄青に変わり、クリックできなくなります。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/e1e2bd43-6f5e-4503-9c39-afb1b46fb790.png" />

### ④ アプリの実行
そのまま「アプリを実行」ボタンをクリックすると、ブラウザの別タブが開きます。
そこには「テストアプリ１」の画面が表示され・・・ませんでした。(汗)

<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/43283578-92bb-4c47-abf2-5ce2a9d2c05b.png" />


## 問題発生
開いたブラウザ画面には接続エラーが表示されました。
最初はネットワーク的な接続設定に問題があると思いましたが違いました。

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/22288da7-ca90-4926-81d2-dc6a918c122e.png" />

ブラウザに表示された URL は次のとおりです。
```http://192.***.***.200/chat/V6M5*********Xp6```

一方、Dify 編集画面の URL は次のとおりです。
``` http://192.***.****.200:20080/app/********/configuration ```

<font color="red">違いは「**:20080**」の有無です。</font>
URLに追記してみると、次の画面が表示されました。

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/cf79eda7-79ad-439c-ba0a-e5a8c3b465b0.png" />

試しに「こんにちは。あなたのことについて教えてください。」と入力した結果です。

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/ff33a74b-e94d-4bb9-8a97-ea686dd6e28e.png" />

## ポート番号が付加されない件
原因は、外部からアクセスする際のポート番号(20080)を、Dify 自身が認識していない点にあります。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/2bffa3b5-5c51-484a-b285-5617256fa6bf.png" />

しかし、Dify 自身には問題はありません。
Docker コンテナの設定でポートマッピングを変更しているので、Dify 自身がそれを自動で判別することは不可能なのです。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90456/d0ec9a94-3f1a-467a-8edb-35309836ce88.png" />

また、この図では省略していますが、実は Home Network 内には複数の PC や スマートフォンがあります。
Cloudflare Tunnel 経由でアクセスする場合も含め、それらすべてから同じ URL でアクセスできるようにするには、多少の工夫が必要そうです。

この問題はひとまず棚上げし、先に Cloudflare Tunnel からアクセスする環境を整えることにします。
線形代数における「基底の変換」と「線形写像（線形変換）」の関係


##  参考リンクまとめ





https://x.com/linear_tec/status/1908164338759917765


##  Pythonコード


```python
# -------------------------------
# ライブラリのインポート / Import libraries
# -------------------------------
import numpy as np

# -------------------------------
# 線形空間 V → W の線形写像 A / Linear map A (from V to W)
# -------------------------------
A = np.array([
    [2, 1],
    [0, 3],
    [1, -1]
])  # 3x2 行列, V: R^2 → W: R^3

# -------------------------------
# V空間の基底変換行列 P（2x2）/ Change of basis for V
# -------------------------------
P = np.array([
    [1, 1],
    [0, 2]
])  # 新しい基底 → 標準基底への変換（右から作用）

# -------------------------------
# W空間の基底変換行列 Q（3x3）/ Change of basis for W
# -------------------------------
Q = np.array([
    [1, 0, 1],
    [0, 2, 0],
    [0, 0, 1]
])  # 新しい基底 → 標準基底への変換（右から作用）

# -------------------------------
# 成分ベクトル x（新しいV基底における）/ x under new basis of V
# -------------------------------
x_new = np.array([
    [2],
    [1]
])

# -------------------------------
# B = Q⁻¹ A P による新しい基底での線形写像 / Linear map under new basis
# -------------------------------
Q_inv = np.linalg.inv(Q)
B = Q_inv @ A @ P  # 新しい基底での線形写像行列

# -------------------------------
# y_new = B x_new / 新しい基底での出力成分
# -------------------------------
y_new = B @ x_new

# -------------------------------
# 標準基底での結果と比較 / Compare with original space
# -------------------------------
# x の標準基底表現
x_std = P @ x_new

# 標準基底での y = A x
y_std = A @ x_std

# 新しい基底での y_new → 標準基底に戻す: Q y_new
y_std_from_new = Q @ y_new

# -------------------------------
# 結果表示 / Print results
# -------------------------------
np.set_printoptions(precision=2, suppress=True)

print("Matrix A (standard basis):\n", A)
print("\nMatrix P (change of basis for V):\n", P)
print("\nMatrix Q (change of basis for W):\n", Q)
print("\nMatrix B (transformed linear map):\n", B)

print("\nInput x (new basis):\n", x_new)
print("Input x (standard basis):\n", x_std)

print("\nOutput y = A x (standard basis):\n", y_std)
print("Output y = B x (new basis):\n", y_new)
print("y (from new basis, converted to standard):\n", y_std_from_new)


```

結果
Matrix A (standard basis):
 [[ 2  1]
 [ 0  3]
 [ 1 -1]]

Matrix P (change of basis for V):
 [[1 1]
 [0 2]]

Matrix Q (change of basis for W):
 [[1 0 1]
 [0 2 0]
 [0 0 1]]

Matrix B (transformed linear map):
 [[ 1.  5.]
 [ 0.  3.]
 [ 1. -1.]]

Input x (new basis):
 [[2]
 [1]]
Input x (standard basis):
 [[3]
 [2]]

Output y = A x (standard basis):
 [[8]
 [6]
 [1]]
Output y = B x (new basis):
 [[7.]
 [3.]
 [1.]]
y (from new basis, converted to standard):
 [[8.]
 [6.]
 [1.]]
アレルギー性鼻炎・鼻うがい。(この記事は編集途中です。ちょいちょい更新していきます）

※一旦Qiitaを間借りしていますが、いずれ自分のブログにこの記事は引っ越す予定です。
ブログができたらtwitterで告知しますので、twitter↓フォローお願いします。
https://x.com/vrc_machida0312

ちなみになんで鼻水が永遠にでてくるのかといえば、鼻の粘膜の汚れをながすためにでてきます。
アレルギー性鼻炎の鼻水は、普通の鼻水（粘りが濃くて緑色）と違い、透明な鼻水＆うすい鼻水がながれます。


朝がすごくて
鼻水に溺れるみたいな感覚。
つかったティッシュはこれくらい。

小学校の時からアレルギー性鼻炎と診断はされていたが、大事じゃないと感じ、放置していた。
事実、中学校位まではなんとかなっており、先生と親に「絶対お前はここにいけない」と言われてた
高校に無事合格。
実家が異常にお金がなく、家庭教師や塾もなしで、中学校から至急されていた教科書のみで受験戦争をのりきりました。
（ただ中学校のころから「人の言う事を理解できない・覚えられない」という症状はジョジョにでてきていました。
これは今の時点でも推測ですが、
鼓膜と鼻がつながっているので、鼻水がいっぱいでる＝何度も頻繁に鼻をかむ
ことで、耳に水がたまっていき、人の声がききづらくなったと思われます。

高校時から異変がでてくる。
３食しっかりたべられなかったというのもあるが、授業に集中できない・


大学の時に顔面麻痺、ベル麻痺を発症。ひだり顔面だけマヒ。まぶたが閉じれない。
確か正月だったから最悪の年明けになったことを覚えています＆病院があいてなくて1/2か1/3までは地獄でした。テープで閉じない目をとじて横になっていました。顔がとにかくいさすがに睡眠できなかったので。

ハナノアを使用
税込み１１００円
やっす！！！！！うっそだろお前！！！！
ｸｯｿきつい思いをして鼻粘膜やいたけど、お医者さんに予告されていたとおり、あまり鼻水は減らなかったので（いうてレーザー前１００％だとすると６０％くらいには減った。ただ元の量が多すぎる・・・）
藁にもすがる思いで購入

鼻うがい２日目（朝と夜）
・YOUTUBEで新潟大学のやり方

を見たらワイのやり方と違って草ｗｗｗｗｗｗｗｗｗｗｗｗ草・・・・・・・・

ま、まあ別の鼻の穴から出さなくても全然効果感じるし！？？！

よくなったこと
・クシャミが減った。
レーザー治療をしても、クシャミが一日２回はあったけど、クシャミが一切ない日が２日でてきた。こんなことあるんだ・・
・やはり朝の鼻水がかなり減った
一日の朝が鼻かみからはじまるのはかなり憂鬱で、鼓膜も痛むし、仕事前の準備時間が毎朝５分～１０分はロスするので、通勤前の５～１０分のロスってｸｯｿ痛いよね
その時間あればブルアカやりたい・・

・あったかかったので体調よかったのかも・・という不安（実際は鼻うがいのおかげだったっぽい）
あったかくなると体調よくなる、というのは鼻うがい前からあったので
まーーーこれはこれからわかっていくことでしょう


鼻うがい３日目（夜のみ）
コツ？を覚えて左の鼻の穴から入れて右の穴から出す、みたいなことができるようになる
逆もしかり

よくなったこと
・１日に一回はあった謎の耳鳴りがなくなった
・気分が！！！とにかく良い！！！！！！！！！！！！！！！！！
怒っても怒りが持続しなくなってきて自分でも「？？」てなるくらいアッサリ平常心に戻れる
ブレインフォグがなくなり、思考回路もだいぶすっきりしてきた
・寝た後の疲れの取れ方があきらかにちがう。
・大きな音の曲を長時間聞けるようになった。（昨日はＶＲＣだったが、今日は車のスピーカーなので距離や音の大きさが自由に調節できないので、やはり音につよくなった＝鼓膜が強くなった？）
・昨日より姿勢がよくなった、猫背がよくなり、左に肩が落ち込む角度が浅くなってきた。
昨日はあたたかったので体調ちょっと

不安なったこと
・左右の鼓膜がほんのちょっぴり痛いので夜の鼻うがいなし（今日まで毎日朝夜やってました）

日に日に体調がよくなっていくのがめっちゃ楽しみ・・！

鼻うがい４日目
・朝に鼓膜が超微弱に傷んだので夜だけ鼻うがい
・昨日の夜オロパタジンをのんだから朝は鼻うがいしなくても鼻汁なしでスッキリ
個人的所感ですが、オロパタジンはアレグラのパワーアップ版だと思ってます
効果（鼻水ゼロ）も超強力ですが、副作用（眠気）も超強力なので、前日が仕事の日は飲めません。
鼻をレーザーで焼きたいと最初耳鼻科の医者にいったときいわれたのが「オロパタジンのんだほうがレーザーより効くよ」でした。たしかにそうかもしれません。でも、自分は眠気の副作用が強くでるので、運転や仕事ができなくなるので、今回レーザー治療にふみきりました。それでもレーザー治療で鼻水が３割くらい減ったので、やってよかったなとは思いました。今回の鼻うがいは、３割のこった鼻水をゼロにするためにやってます。
・人の言う事が長時間でも聞ける＆理解できる
久々にVRCに入ったのですが、VRゴーグルのインデックスがマイクが壊れているため、こちらが無言（ミュート）状態であるという条件付きですが、
フレンドのいうことが２時間以上聞ける＆理解できました
これはかなり大きな進歩です。私はプロフィールにも書いてありますが、自覚ありの軽度の難聴もちです。
もしかしてADHDだと思ってた症状も、全てアレルギー性鼻炎（鼻水）からの鼓膜痛める→難聴だったのかもしれません。大きく期待がでてきました。もし本当に、毎日の鼻うがい（たったの１１００円！）でアレルギー性鼻炎を完治することで、相手の言う事を長時間集中してきけて、理解できるのなら、圧倒的に仕事を探せる幅も広がりますし、なにより日常生活のQOLが上がります。
また、毎日の鼻うがいで、鼻と耳の鼓膜の調子がよくなるにしたがって、お酒への強い願望が減ってきました。耳や鼻の不調による、強いストレスがなくなってきたからだと思われます。
鼻の粘膜という、たったの数センチが日々炎症していることで、ここまでQOLがさがるとは・・
ちなみにアレルギー性鼻炎を放置していると上の歯の歯茎の炎症にもつながり、歯が抜けるそうです。
他にもアレルギー性鼻炎の情報を良い物も悪い物もいくつか発見したので貼っておきます。

https://x.com/MIYU_Pri_love/status/1827156147973059007

https://x.com/JOYMAX125i/status/1763042872151187853

https://x.com/1pining/status/1634917633052250112

https://x.com/noma3chome/status/1833071147291902356

https://x.com/daitohagiwara/status/1760613768676118803
「連立1次方程式」，「最小2乗法」，「固有値」，特異値分解と線形代数学


##  参考リンクまとめ

https://x.com/linear_tec/status/1884606845983281508

https://x.com/linear_tec/status/1879515695958069567/photo/1


##  Pythonコード


```python

import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import qr, eig, solve, svd, LinAlgError

# -----------------------------
# LU分解：連立一次方程式の解法（Ax = b）
# -----------------------------
A_lu = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])

try:
    x_lu = solve(A_lu, b)
except LinAlgError:
    x_lu = None

# -----------------------------
# QR分解：最小二乗法による直線フィッティング
# -----------------------------
x_data = np.linspace(0, 10, 10)
y_data = 2 * x_data + 1 + np.random.normal(0, 1, len(x_data))  # y = 2x + 1 + noise

# A = [x 1] の形でQR分解
A_qr = np.vstack([x_data, np.ones(len(x_data))]).T
Q, R = qr(A_qr)
coeffs_qr = solve(R, Q.T @ y_data)  # 最小二乗解
y_fit = A_qr @ coeffs_qr

# -----------------------------
# 固有値・固有ベクトル（スペクトル分解）
# -----------------------------
A_eig = np.array([[2, -1], [-1, 2]])
eigvals, eigvecs = eig(A_eig)

# -----------------------------
# 特異値分解（SVD）
# -----------------------------
A_svd = np.array([[3, 1], [1, 3]])
U, S, VT = svd(A_svd)  # S: 特異値の配列（Σの対角成分）

# -----------------------------
# 可視化
# -----------------------------
fig, axs = plt.subplots(1, 4, figsize=(22, 5))

# LU分解の結果
axs[0].set_title("LU Decomposition (Solve Ax = b)")
axs[0].axis('off')
axs[0].text(0.1, 0.5, f"A = {A_lu.tolist()}\nb = {b.tolist()}\nx = {x_lu.tolist() if x_lu is not None else '解なし'}",
            fontsize=12)

# QR分解の最小二乗法プロット
axs[1].set_title("QR Decomposition (Least Squares Fit)")
axs[1].scatter(x_data, y_data, label='Data')
axs[1].plot(x_data, y_fit, color='r', label='Fitted Line')
axs[1].legend()
axs[1].set_xlabel('x')
axs[1].set_ylabel('y')

# 固有値・固有ベクトルの視覚化
axs[2].set_title("Spectral Decomposition")
origin = [0], [0]
for i in range(len(eigvals)):
    axs[2].quiver(*origin, eigvecs[0, i], eigvecs[1, i], angles='xy', scale_units='xy', scale=1, label=f"λ={eigvals[i]:.2f}")
axs[2].set_xlim(-2, 2)
axs[2].set_ylim(-2, 2)
axs[2].axhline(0, color='black', linewidth=0.5)
axs[2].axvline(0, color='black', linewidth=0.5)
axs[2].grid()
axs[2].legend()
axs[2].set_aspect('equal')

# 特異値分解（SVD）の視覚化
axs[3].set_title("SVD (Singular Value Decomposition)")
axs[3].bar([f"σ{i+1}" for i in range(len(S))], S, color='purple')
axs[3].set_ylabel('Singular Values')
axs[3].set_ylim(0, max(S)*1.2)
axs[3].grid(axis='y')

plt.tight_layout()
plt.show()

```
結果


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/4a66b86f-1b44-44b8-9791-385dbe8d2140.png)
最小二乗法で2次関数による近似と線形結合


##  参考リンクまとめ

https://x.com/linear_tec/status/1911424639538016447




---

###  Pythonコード（最小二乗法で2次関数による近似）

```python
# 必要なライブラリをインポート / Import necessary libraries
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの生成 / Generate sample data
np.random.seed(0)  # 再現性のためのシード固定 / Set random seed for reproducibility
x = np.linspace(-3, 3, 50)
y_true = 2 + 0.5 * x - x**2           # 真の関数（2次関数） / True function
y = y_true + np.random.normal(0, 1, x.shape)  # ノイズを加えた観測値 / Noisy observations

# 最小二乗法のためのX行列の構築 / Design matrix for least squares
X = np.vstack([np.ones_like(x), x, x**2]).T  # [1, x, x^2] の列ベクトル

# 最小二乗法による係数ベクトルの計算 / Solve least squares: c = (X^T X)^(-1) X^T y
c_hat = np.linalg.inv(X.T @ X) @ X.T @ y

# 近似曲線の計算 / Predicted values using fitted coefficients
y_fit = X @ c_hat

# グラフの描画 / Plot the data and the approximation
plt.figure(figsize=(8, 6))
plt.scatter(x, y, label='Observed Data', color='blue')
plt.plot(x, y_true, label='True Function', linestyle='--', color='gray')
plt.plot(x, y_fit, label='Least Squares Fit (Quadratic)', color='red')
plt.title('Quadratic Approximation by Least Squares')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

# 係数の表示 / Print coefficients
print("Fitted coefficients (c0, c1, c2):", c_hat)
```

結果



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/1739a56c-b576-4b69-b743-feb9a261e85a.png)




##  Pythonコード：関数データをベクトルとして扱い、内積・スカラー倍・基底展開の基本を実演

```python
import numpy as np
import matplotlib.pyplot as plt

# -------------------------------
# データ準備：関数の離散化（ベクトル化）
# -------------------------------

x = np.linspace(0, 2 * np.pi, 100)

# 関数定義（ベクトル化）
vec_quad = x**2              # 2次関数 y = x^2
vec_sin = np.sin(x)          # 三角関数 y = sin(x)
vec_cos = np.cos(x)          # 三角関数 y = cos(x)

# -------------------------------
# 1. ベクトルとしての可視化
# -------------------------------
plt.plot(x, vec_quad, label='y = x^2')
plt.plot(x, vec_sin, label='y = sin(x)')
plt.plot(x, vec_cos, label='y = cos(x)')
plt.title('Function as Vectors')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid()
plt.show()

# -------------------------------
# 2. ベクトル演算（内積・スカラー倍）
# -------------------------------

# 内積（関数同士の類似度）
dot_sin_cos = np.dot(vec_sin, vec_cos)
print(f"Inner product <sin, cos> = {dot_sin_cos:.4f}")

# スカラー倍（振幅を2倍に）
vec_sin_scaled = 2 * vec_sin

# -------------------------------
# 3. 基底展開の例（sinとcosの線形結合）
# -------------------------------

# sin(x) + 0.5 * cos(x) として関数を構成
combined = vec_sin + 0.5 * vec_cos

plt.plot(x, combined, label='sin(x) + 0.5cos(x)', color='purple')
plt.title('Linear Combination of sin and cos')
plt.grid()
plt.legend()
plt.show()
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/28267c4a-4bfb-463f-8df4-f327e94bbeb8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/36fd941f-bf68-4225-be96-4f5f1f396a25.png)
APIキーをHTTPヘッダーに含める理由

APIキーを扱う案件が出てきた。
postmanを利用して返ってくる値が、取得したい値になっているか確認し対応をしていた。

その時ふと思ったのが、ヘッダーにAPIキーを入れていること。
そういうものなんだろうと思えばそれで終わりだが、少しだけ調べてみることにした。
だってヘッダーってHTMLでしか聞いたことがなかったから。


---

## APIキーをHTTPヘッダーに含める理由

### 機密情報をURLに含めない
APIキーをヘッダーで送ることで下記のリスクを回避できる。

- URL履歴に残ることを防げる
    - URLに直接APIキーを入れるとブラウザのURL履歴に残ってしまう
        - 他の人がパソコンを見た時にURLを見れば盗まれる可能性がある
- ログファイルに記録されにくい
    - ログファイルは誰が・いつ・どんなリクエストを送ったか見れるファイル
        - URLに直接APIキーを貼るとこのファイルを見れる人間に盗まれる可能性がある
- 他人とURLを共有してもキーが見えない  

---

### 認証情報の管理がしやすい

APIキーをヘッダーに入れると、HTTPメソッド（GET、POSTなど）に関係なく、**同じ方法で認証情報を扱える**ため、実装がシンプルになる。

---

### 他技術との整合性がある

GoogleのgRPCベースAPI（Googleが開発したAPI）はHTTPヘッダー経由でのみAPIキーを渡すことができる。


## APIキー送信方法と比較

### HTTPヘッダー

#### メリット
- URLに含まれないため漏洩リスクが低い  
- HTTPS通信時は暗号化される

#### デメリット
- ブラウザなど一部のクライアントでは利用できないケースもある

---

### クエリパラメータ（例: `?key=...`）

```php
url
https://example.com/api/data?key=YOUR_API_KEY
```
#### メリット
- 実装が簡単 

#### デメリット
- URL履歴・ログ・外部参照などで漏洩リスクが高い  
※Googleでも非推奨  

---

### リクエストボディ（例: JSON形式）

```json
{
  "key": "YOUR_API_KEY",
  "data": "example"
}
```

#### メリット
- URLに含まれず見えにくい  
#### デメリット
- GETメソッドでは使用できない  
- 認証とデータが混在。設計が不自然になる

---


## フロントエンド公開時のセキュリティ対策

下記の対策を組み合わせることでAPIキーの不正使用を防ぐ。

- ドメイン制限（リファラ制限）
    - リクエストのリファラヘッダーをチェックして許可されたドメイン以外からのアクセスブロック

例：
ブラウザはAPIサーバーにリクエストを送るとき、Referer: https://your-site.com を自動で付ける
Googleはそれを見て「このサイトから来たリクエストならOK」と判断



- IPアドレス制限
    - このIPアドレスからしかリクエストを受け付けないとする方法
        - 主にサーバー側でAPIキーを使う場合に有効
- 利用可能APIの制限
    - このキーではgooglemapしか利用できない等の制限
        - 漏えいしても被害が小さくなる
- リクエスト数制限（レートリミット）
    - 一定時間内に許可するリクエスト数を制限する
        - Botやスクリプトの大量リクエストの悪用を防げる
LINE Messaging APIとGoogleAPIsでバンド練習の予定を教えてくれるbotを作成した話

## はじめに
### 自己紹介
徳島のWeb制作会社に入社して1年半のマークアップエンジニアです。
実務では基本的にコーポレートサイトなどのコーディング業務を行なっております。
最近はフロントエンドエンジニアとしてのキャリアアップを目指して勉強中です。
趣味はバンド活動で、ベースを弾いております。
[僕がやっているバンドのMVです](https://youtu.be/phrcQJOu3ZI?si=Xibw-g9x5uoxXD5k)
### LINE botを作ろうと思ったきっかけ
バンドマンの皆さん、スタジオの予定ってどうやって管理してますか？
うちはメンバーがグループLINEにスタジオの予約完了画面をスクショで貼ってくれるのですが、これがまた情報が流れていっちゃって「次の練習っていつだっけ？」なんてことがしょっちゅう...

さらには利用するスタジオが二箇所あるため、当日違うスタジオに行っているメンバーがいることも...

そこで思いついたのが、「LINEで送ったら、次の練習日を教えてくれるBotがあったら便利だな！」ということで、LINE Messaging APIとGoogleのVision API、Calendar APIを組み合わせて、バンド練習の日程を自動で教えてくれるBotを作ってみました！
### 作ったLINE botの詳細
LINEで送ったスクショから練習予定を読み取って、それをGoogle Calendarに保存して、
「次のスタジオいつ？」と誰かが発信するとbotが答えてくれます。
Google Vision APIを使用しているので予定を追加する際はスクショを送るだけです。

この記事では、どうやってこのBotを作ったか、使った技術やちょっとしたハマりポイントも紹介していきます！
それではどうぞ最後までお付き合いください！

## 使用技術
- 使用言語：**JavaScript(Node.js 22.14.0)**
- フレームワーク：**Express.js**
- ホスティング：**Vercel**
- **LINE Messaging API**：LINE Botの送受信に使用
- **Google Cloud Vision API**：画像から場所と日付を読み取るために使用（OCR機能）
- **Google Calendar API**：予定を管理＆取得

## 全体の流れ
まずは、Botがどんな流れで動いているのか、ざっくり紹介します。

1\. LINEでスタジオ予約スクショ送信
2\. Google Vision APIで画像から文字を抽出（OCR）
3\. 日付・場所情報を取り出す
4\. Google Calendarに登録
5\. 「次のスタジオいつ？」というメッセージに反応
6\. Google Calendarを参照して、次の予定を返信

## Botの構成
実装はかなりシンプルで、以下のような構成になっています。

🟢 LINE Bot (Express)
┣ 📮 POST /webhook → LINEからのメッセージを受け取る
┃ ┣ 📸 画像メッセージならVision APIでOCR
┃ ┃ 　┗ 📅 OCR結果から日付・場所を抽出してGoogle Calendarへ登録 
┃ ┗ ❓ テキストメッセージが「次のスタジオいつ？」なら→Google Calendarから次回予定を取得して返信

内容については明日以降で追記します...
TAB譜と作成ソフトとMIDI


##  1. TAB譜の見方・解説

TAB譜は「ギターのどの弦の何フレットを押さえるか」を数字で表した譜面です。

### 基本構造：

```
e|----------------| ← 1弦（細い弦）
B|--0--0--5--5----| ← 2弦（B弦）
G|----------------|
D|----------------|
A|----------------|
E|----------------| ← 6弦（太い弦）
```

- 各行はギターの**弦**を表し、下が太い弦（6弦）、上が細い弦（1弦）です。
- 数字は押さえるフレットを示します：
  - `0` → 開放弦（何も押さえない）
  - `5` → 指板の5フレットを押さえる
- 横に並ぶ数字は、**演奏する順番**です。

---

###  具体例として、キラキラ星のTAB譜の意味

```
B|--0--0--5--5----|7--7--5---------|
```

- 2弦（B弦）の開放弦を2回 → 5フレットを2回 → 7フレットを2回 → 5フレット  
- これは「Twinkle, twinkle, little star」の音階に対応しています。

---

##  2. TAB譜の作り方（手書き or ツール）

###  手書き（テキスト）

- テキストエディタで6行作り、弦名（e, B, G, D, A, E）を左に置きます。
- 演奏順に数字を入力し、休符は `--` やスペースで調整します。
- 歌詞と対応させるには、別行で歌詞を入れるのが良いです。

###  自動作成ツール

- **TuxGuitar**
- **MuseScore**
- **Guitar Pro（有料）**

---

##  3. TAB譜を再生する方法

###  方法1：**TuxGuitar**（おすすめ）

1. 公式サイトからTuxGuitarをダウンロード
2. 新規ファイル作成 → 楽器に「ギター（標準チューニング）」を選択
3. 小節に音を打ち込む（フレット番号を入力）
4. 再生ボタンで確認（MIDI音源）

#### 形式の保存例：
- `.tg`：TuxGuitar形式
- `.gp5`：Guitar Pro形式にエクスポート可能
- `.mid`：MIDI形式で書き出し可能 
---

###  方法2：**MuseScore + TABモード**

1. MuseScoreをインストール（[https://musescore.org/ja](https://musescore.org/ja)）
2. 新規作成 → 楽器で「Guitar Tablature」を選択
3. 音を入力 → 音声再生・PDF保存も可能

---
[初めてのWebアプリ開発]　無料でもかなり使えたGeminiのCanvas機能

## はじめに
普段はUnityでゲーム開発をしているのですが、これだけAIが発展してきているならお金をかけずにAIだけでWebアプリを開発できるのではと思い、じゃあ開発してみようと思ったのが今回の開発のきっかけです。

## 作ったもの
シンプルなWebタイマー
[集中タイマー](https://beginne28949926.com/apps/Pressure-Timer/)を作りました。

一応オリジナル要素として時間を設定するときに、作業内容も設定して
タイマーを使っている間、画面に作業内容を表示するようにすることでユーザーにプレッシャーを与えるようにしています。

## 開発について
自分自身ではほぼコードを書いていません。最後にcssの色を少しいじったくらいで、その他はすべてGoogleのAIであるGeminiのCanvas機能を使い開発しました。

Canvas機能はChatGPTやClaudeでも提供されていますが、無料版だと何回かコードの修正を指示するとすぐに上限にぶつかってしまいます。

そういったこともあり、あまり期待していなかったのですがGoogle AI Studioで大量にチャットできるGoogleならもしかしたらと思い、使ってみたら一度も上限に引っかかることなく完成までもっていくことが出来ました。

プロンプトもかなりシンプルで最初に
**「作業内容を入力 → タイマー開始 → 作業内容が中央に大きく表示される」
これらの機能が付いたタイマーウェブアプリを作ろうと思っている。コードを書いて**
と入力してから、あとは色やレイアウトなど修正・追加してほしいところを伝えるだけで済みました。

## 最後に
Canvas機能が出てすぐに少し触って、「こんなもんか」と思ってから使わなかったのですが、今使ってみると「え、そこまで作れるんだ」とかなり進歩を感じました。
AstroでMarkdownブログ記事を作成する方法

Astroでは、使い慣れたMarkdown形式でブログ記事を簡単に作成できます。ここでは、記事用のMarkdownファイルを作成し、共通のレイアウトを適用する基本的な手順を紹介します。

## ブログ記事作成の基本的な流れ

1. 記事のレイアウトを作成する: ブログ記事全体で共通するヘッダーやフッターなどの見た目を定義するコンポーネントを作成します
2. Markdownファイルを作成する: 記事の内容をMarkdownで記述し、どのレイアウトを使うかを指定します
3. 確認する: 開発サーバーで表示を確認します

## Astoroでブログ作成する手順

### 1.レイアウトコンポーネントを作成する(`src/layouts/BlogPostLayout.astro`)

まず、ブログ記事の骨組みとなるレイアウトコンポーネントを作成します。`src/layouts/` ディレクトリ（なければ作成してください）に `BlogPostLayout.astro` というファイルを作成し、以下のコードを記述します。

```astro
---
// レイアウトコンポーネント (BlogPostLayout.astro)
// Markdownファイルのフロントマターからデータを受け取る
const { frontmatter } = Astro.props;
---
<html lang="ja">
<head>
    <meta charset="utf-8" /> {/* ← 重要: 文字化けを防ぐために必ず記述 */}
    <meta name="viewport" content="width=device-width" />
    <title>{frontmatter.title}</title> {/* Markdownのタイトルを表示 */}
</head>
<body>
    <header>
        <p>My Astro Blog</p> {/* 例:共通ヘッダー */}
    </header>
    <main>
        <h1>{frontmatter.title}</h1> {/* Markdownのタイトルを表示 */}
        <article>
            <slot /> {/* ← ここにMarkdown本文の内容が挿入される */}
        </article>
    </main>
    <footer>
        <p>© My Blog</p> {/* 例:共通フッター */}
    </footer>
</body>
</html>
```

* `src/layouts/` ディレクトリに置くのが一般的です。
* `Astro.props.frontmatter` で、Markdownファイルに記述されたタイトルなどの情報を受け取ります。
* `<slot />` タグの部分に、Markdownファイルの本文が自動的に挿入されます。
* **重要:** `layout` を使う場合、`<meta charset="utf-8">` はレイアウトファイル内に記述する必要があります。

### 2.Markdown記事ファイルを作成する (`src/pages/my-first-post.md`)

次に、`src/pages/` ディレクトリに実際のブログ記事となるMarkdownファイルを作成します。ここでは例として `my-first-post.md` という名前で作成します。

```markdown
---
# src/pages/my-first-post.md
layout: ../layouts/BlogPostLayout.astro # 使用するレイアウトファイルを指定
title: '私の最初の投稿'
pubDate: 2025-04-13
description: 'これは私の最初のAstroブログ投稿です。'
author: 'Astro Learner'
---

## はじめに

これは **Markdown** で書かれた最初のブログ記事です。
Astroを使うと、簡単にMarkdownでコンテンツを作成できます。

- リスト項目1
- リスト項目2

記事の内容はここに自由に記述できます。
```

* ファイル名はそのままURLの一部になります (この例では `/my-first-post`)。
* ファイルの先頭にある `---` で囲まれた部分は **フロントマター** と呼ばれ、記事のメタデータをYAML形式で記述します。
    * `layout:` で、先ほど作成したレイアウトファイルのパスを指定します (`src/pages` から見た相対パス)。
    * `title:` は記事のタイトルで、レイアウト側 (`{frontmatter.title}`) で利用できます。
    * `pubDate`, `description`, `author` など、自由にメタデータを追加できます（レイアウト側で利用しなければ表示には影響しません）。
* `---` の後がMarkdown形式の本文です。

### 3.開発サーバーで確認する

ターミナルで開発サーバーを起動します。

```bash
npm run dev
# または pnpm dev, yarn dev
```

ブラウザで `http://localhost:4321/my-first-post` にアクセスしてください。

Markdownで記述した本文が、`BlogPostLayout.astro` で定義したレイアウト（ヘッダー、フッター、タイトルなど）の中に表示されていれば成功です！

## 補足：もっと記事が増えたら

ブログ記事が非常に多くなる場合は、Astroの「Content Collections API」という機能を使うと、より効率的に記事を管理できます。型チェックや一覧ページの生成などが簡単になりますが、まずはこの方法でMarkdown記事の作成に慣れるのがおすすめです。
【競技プログラミング】AtCoder Beginner Contest 370_C問題

# 問題
https://atcoder.jp/contests/abc370/tasks/abc370_c

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# 解法イメージ
## 文字列SとTについて
1. 下図の塗りつぶしがない、白色箇所は同じ文字列なので、変更する必要がない

![base_image.create_20250413001711-ページ4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/8b783dfe-d4c8-4fbe-8707-58639554a711.png)

2. 前の文字列(文字列S)が後の文字列(文字列T)より、辞書順で前になる文字と後ろになる文字を整理する

2.1 辞書順で前になる文字列は「後ろから置換」
(初期) adbeb
(01) afb*b
(02) bfb*b

2.2 辞書順で後になる文字列は「前から置換」
(初期) adbeb
(01) afbcb

2.3 時間無視した整列
2.1と2.2を辞書順に整列し
afbeb
afbec <- この点をうまく整列させる方法を考える
bfbeb

これを基本の考え方として、前後が入り組んでいる場合は、前半と後半に分割して、効率的に置換して行くパターンね。
一旦、方針だけメモして後で考え足します。(25'04/13 00:00時点)

トヨタ開催の正答率がやたら低いし、個人的に相性悪いんだよなぁ。
loglogでMatplotlibの両対数グラフを一発表示する方法

## はじめに

データ解析の中で、縦軸も横軸もスケールが広いケースってよくありますよね。そこで、便利なのが両対数表示です。

たとえば、天文系の解析をしていると、

- 可視光の相対測光の校正  
- フラックスの波長依存性の確認  
- パワースペクトル密度（PSD）の可視化  

といった場面で、**log-logスケールのグラフ**を描きたくなるわけです。

……でも、log-logって、案外一筋縄ではいかないんですよね。

<br>

そんなときに便利なのが、[matplotlib](https://matplotlib.org/) の [`loglog()`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.loglog.html) 関数。  
これ、**たった一行で両対数グラフにしてくれる**んです。

「えっ、そんな関数あるの？？何それ？」と思ったあなた、
ぜひこの記事で `loglog()` の魅力をのぞいてみてください。


## `loglog()`の使い方

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(0.1, 2, 1000)
y = x ** -2

plt.loglog(x, y)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1599258/6221ab1c-110b-48cb-8adb-af50bfb072b9.png)

これだけで、両対数軸のグラフが一発で完成します！

筆者は `loglog()` の存在を知ったとき、「えっ、これだけで済むの？」とちょっと感動しました。logスケールを設定するたびに毎回 `xscale` と `yscale` を手動で書いていたあの時間、一体なんだったのか……と思わずにはいられませんでした。

## `loglog()` の裏側

実は `loglog()` の内部では、以下のような処理が行われています。

```python
plt.plot(x, y)
plt.xscale('log')
plt.yscale('log')
```

つまり、`plot()` のラッパー関数として、両軸をlogスケールに設定してくれるショートカットなんです。

---

そして実は、**x軸だけ / y軸だけをlogにするためのヘルパー関数**も用意されています。  
それが [`semilogx()`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.semilogx.html)（横軸だけlog）、 [`semilogy()`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.semilogy.html)（縦軸だけlog）です。

```python
plt.semilogx(x, y)  # x軸だけlog
plt.semilogy(x, y)  # y軸だけlog
```

<details><summary>出力例を見る</summary>

- `semilogx(x, y)`（横軸方向がlog表示）  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1599258/9cb51f1c-fc8f-461a-b20b-ee342a04a2f9.png)

- `semilogy(x, y)`（縦軸方向がlog表示）  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1599258/00a02594-625d-493b-9009-7de49fd76f89.png)

</details>


## `scatter()`では使えない？と思ったら…

ここでちょっと注意点があります。  
`loglog()` や `semilogx()` などは `plt.plot()` のラッパー関数なので、**`plt.scatter()` には直接使えません**。

でも、安心してください。ちょっとした工夫でちゃんと実現できます。

---

### 方法1：`xscale()` / `yscale()` を手動で指定

```python
plt.scatter(x, y)
plt.xscale('log')
plt.yscale('log')
```

このように、スケールを手動で設定すれば、`scatter()` でも log-log 表示が可能です。

---

### 方法2：`loglog()` をスケール設定のために使用

```python
plt.scatter(x, y)
plt.loglog()  # 何も描かずにスケールだけlogに設定
```

このように `loglog()` を **スケール設定だけの目的で使う** 裏技もあります。  
この方法は、`semilogx()` や `semilogy()` にもそのまま応用できます。

**知らなかった人も多いのでは？**  
筆者も最初は「便利だけど、`loglog` は `scatter` では使えないのか…ちょっと寂しいな」と思っていました。  
でも、この方法を知ってからは、logスケールでの可視化の選択肢が増えて、表現の幅がぐっと広がったように感じます。

## まとめ

`loglog()` は、両軸を一瞬でlogスケールにできる便利な関数です。  
同様に、`semilogx()` や `semilogy()` を使えば、片対数グラフもすぐに描けます。

こういったヘルパー関数って意外と見落としがちで、発掘したときのちょっとした感動って、ふと記憶に残ってたりするんですよね。

気軽にlogスケールでプロットできるようになると、データ解析がサクサク進んで、ちょっと楽しくなってきます。  
この記事が、同じような発掘を楽しむ方の役に立てたら嬉しいです。

## 参考
https://matplotlib.org/stable/users/explain/axes/axes_scales.html#sphx-glr-users-explain-axes-axes-scales-py
FastAPIはなぜ人気なのか？Flask・Djangoと比較してみた

## はじめに
Pythonとは、シンプルで読みやすい文法と豊富なライブラリが特徴のプログラミング言語で、Web開発・データ分析・機械学習など幅広い分野で利用されています。FastAPIは、そのPythonを使ってWebアプリケーションやAPIを構築するための、モダンで高性能なWebフレームワークです。本記事では、ハッカソンにおいてFastAPIを選定した理由を中心に、FlaskやDjangoといった他の代表的なPythonフレームワークとの違いを比較しながら紹介します。

## FastAPIの特徴
FastAPIの特徴は以下の通りです：

- **非同期処理（async/await）に対応**  
  `async def` による非同期処理を標準でサポートしており、I/O待ちが発生する処理（例：DBアクセスや外部API連携）でも高いパフォーマンスを発揮します。複数リクエストの同時処理にも強く、リアルタイム性が求められるシステムに最適です。

- **Swagger UI（OpenAPI）による自動ドキュメント生成**  
  OpenAPI仕様に基づき、Swagger UIとReDocを自動生成します。APIの仕様確認やテストが容易になり、フロントエンドとの連携やチーム開発の効率が大幅に向上します。

- **型ヒントとPydanticによるバリデーション自動化**  
  Pythonの型ヒントとPydanticを活用することで、入力データのバリデーションが自動化されます。ルーティングと同時にスキーマを定義できるため、冗長なコードが減り、可読性と堅牢性が向上します。

- **非常に高速な処理性能（Starletteベース）**  
  FastAPIはASGIフレームワーク「Starlette」を基盤としており、レスポンス速度が非常に高速です。ベンチマークでは、Flaskの2〜3倍、Djangoの10倍以上の性能を示すこともあります。

- **セキュアなAPI設計に対応した認証・認可機能**  
  OAuth2やJWT（JSON Web Token）によるトークンベースの認証・認可が標準で組み込まれており、安全なアクセス制御を簡単に導入できます。

## Python Webフレームワーク比較（Flask / Django / FastAPI）

| 特徴                     | Flask                      | Django                    | FastAPI                   |
|--------------------------|----------------------------|----------------------------|---------------------------|
| 学習コスト               | 低                         | 中                         | 中                        |
| 管理機能（管理画面）     | なし                       | あり                       | なし（自作可）            |
| ORM                      | 自由（例：SQLAlchemy）     | 内蔵（Django ORM）         | 自由（例：SQLAlchemy）    |
| APIドキュメント生成       | なし                       | なし                       | あり（自動）              |
| 非同期処理対応           | 限定的                     | 非対応                     | 完全対応                  |
| 実行速度                 | 中                         | 低                         | 高                        |


## なぜハッカソンでFastAPIを選んだか

- **コード量が少なく高速にAPI設計できる**
ルーティングやデータバリデーションの記述がシンプルで、最小限のコードでAPIを構築できます。短期間の開発に適しています。

- **OpenAPI仕様のドキュメントが自動生成されるため、フロントエンドとの連携が容易**
API設計に基づいてSwagger UIとReDocが自動で生成され、仕様の共有や動作確認がすぐに行えるため、チーム開発が効率化されます。

- **型ヒントに基づくスキーマ定義とバリデーションにより、実装と同時にデータの整合性が保てる**
Pythonの型ヒントを活用して入力スキーマを定義でき、エラーの発見が早まり、堅牢なAPIが構築できます。

- **非同期処理に対応しており、複数リクエストの同時処理やBotなどのリアルタイム系開発に強い**
`async def` による非同期処理でI/O待ちを最小限に抑えられ、外部APIやDBとの連携が多いアプリでも快適なレスポンスが得られます。

## まとめ
FastAPIはモダンな開発体験を提供する、Python製の非常に強力なAPIフレームワークです。特に短期間でのプロジェクトや、非同期処理を活かしたシステムに向いています。FlaskやDjangoと用途によって使い分けることで、より効果的な開発が可能です。Djangoは管理画面を含む業務アプリに、Flaskはプロトタイプや学習用途に適しています。

https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/

https://docs.djangoproject.com/ja/5.1/intro/

https://www.amazon.co.jp/Django%E3%81%AE%E3%83%84%E3%83%9C%E3%81%A8%E3%82%B3%E3%83%84%E3%81%8C%E3%82%BC%E3%83%83%E3%82%BF%E3%82%A4%E3%81%AB%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E5%A4%A7%E6%A9%8B-%E4%BA%AE%E5%A4%AA/dp/4798062219

https://fastapi.tiangolo.com/