OmniAICreator/Qiita-1.07M huggingface dataset:
(お蔵入り)Kaggleで優勝したときの体験談

Kaggleの大会で優勝したときの体験談を紹介します(だいぶ前の話です)

### 取り組み

- 3人でチームを組んで挑戦
- 作業中はずっとZoomをつけていた(だいたい朝6時から夜10時まで)
	- 意図
		- 雑談レベルでもいいので、常に話せる状態にしておけば、ちょっとした悩みでも相談しやすい
			- やっぱり日頃しょうもない話もしない人にいきなり頼み事っていうのは難しい
- 今日やることや議論した内容は、Slackのグループチャットに貼り付けてた
	- 意図
		- 言語化することで、ふわっとした理解をなくすため
		- どういった改善を今日、誰がするかを明確にするため
			- 当初はGitHubの運用も考えたけど、3人だったし、スピード優先で各々が別々のアルゴリズムを作ることにした
			- 終盤になって、アルゴリズムをアンサンブルする段階からGitHubでプルリクエストとレビューをするようになった

---
### 作業時間

- 約3週間で250時間
	- 最初の2週間は日中に仕事しつつも、朝晩はずっとKaggle生活
	- 最後の1週間は有給を取って、すべてKaggleに時間を割り当てた
		- 5:00 - 22:00の間は、食事と風呂以外Kaggleだった
			- 作業時間をメモしてたけど、週に110時間(毎日16時間)Kaggleやってた
	- 寝る前は、必ず数値実験を開始するようにして、1回でも多く試行錯誤できるようにした

---
### 気づいたこと

- 優勝するとは思ってなかった
	- ゴールドメダル(上位1%)狙いで、チームを組んでいた
	- ただ、違和感は感じてた
		- フォーラムで他のチームが共有してくださった改善方法を試してたけど、報告ほどスコアが改善しないという話を何度かしてた
			- 理由を考えたときに、他の競争相手とアプローチが違うのでは？という予想が出てた
				- 実際、全然違ったのが原因だった
					- みんなはマシンパワーで大量の良いモデルを作ってたところを、少ないモデルだけど条件によって動的に意見の採用度合いが変わる仕組みにしていた
						- 熱帯雨林や特殊な鳥だと、このモデルを尊重といった感じ
				- あと、スペックも全然違った
					- みんなGPUを何台何十台と使ってたのに、うちらだけGoogle Colaboratoryを使ってて、笑った
					- あとで、他の参加者から、「そういうスペックでもアイデアと工夫で勝っててすげえな」って言ってもらえたのが印象に残っている
- 上位をとる人たちはみんな頑張ってる
	- それまでは、Kaggleの上位の人達は、遥か彼方雲の上の存在で、頭の良さが全然違って、余裕でやってるんだろうなーと勝手に想像してたけど、違った
		- みんな、下手すると私達よりも時間かけてた
		- 提出回数と提出にかかる時間から、おおよその毎日の作業量が推定できたけど、同じぐらいやってることに気づいた
			- 天才って言われる人たちほど、努力してることにこのとき気づいた
- 最後は運だった
	- 最終成果物の選択を、最後の一時間ぐらいになったときに変更してくれたのが良かった
		- 公開順位表で、1番のスコアと少し下がるけど多様性を重視した3番のスコアを選んだ
			- 実際、3番のスコアが最終順位表だと一番良かった
		- そのままだと2位だった
			- 未だに「かみさまありがと」って思ってる
- ブラックすぎてすまんって思ってた
	- 仕事だったら訴えられるレベルだなとか思ってた
	- チームの医学生には国家試験が控えてたのにすまんって謝ってた
		- 「国家試験は余裕なので大丈夫ですよ」って言われたときには救われた
- 雑談は大事
	- 遠隔でもいいけど、軽口を交わせるぐらいの環境は必要と気づけた
- 結果が出て数時間後には別の大会に参加してた
	- 最初喜んでたけど、2時間ぐらいで冷静になって、コードを書き始めてた
		- 他人からの称賛はあんまり長続きしないといった内容をどっかで読んだことがあるけど、ホントだなと思った記憶がある
			- 確か、ノーベル賞の受賞者も数時間ぐらいで喜びが消えたみたいな話だったと思う

---
### まとめ

- メンバーみんなで勝ち取った優勝だった
	- 誰一人欠けてもだめだったし、みんなの強みを活かせたことが良かった
- 頭のいい人たちは、想像以上に努力してる

---

アニメ『メダリスト』を観て、ポエムを書きたくなったもので...。
ここまで読んでくださりありがとうございました。
PHPで「while文」の動作を確認してみた。

# 概要

PHPで「while文」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/for/index1.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
$num = 0;

while ($num < 3){
  print 'num = '.$num.'<br />';
  $num += 1;
}
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
num = 0<br />num = 1<br />num = 2<br /></p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
HeroUIで簡単・高クオリティなUIメーカーに

ReactのUIライブラリは何を使えばいいのか？
私はHeroUIをお勧めします！

そもそもなぜこの記事を書いたのかというと、
私がHeroUIを使いたいと思ったときに記事が存在しなかったからです。
他の方の使用体験を見てから導入するUIライブラリを決めたかった訳です。

## 目次
- HeroUIとは？
- 導入方法
- 使用した感想

## HeroUIとは？
結局なぜHeroUIの記事が存在しなかったかというと、この記事を書く約1か月にNextUIから改名していたからでした。
なので、詳細は「NextUI」と検索していただければ豊富に記事がある訳ですが、せっかくここを訪れていただいたので簡単な導入と私なりの感想だけでも記載しておこうと思います。

HeroUIとは、おなじみVercelが提供するUIライブラリで、TailwindCSSとの相性がいいのが特徴です。
なによりモダンなUIが豊富なので特に制限がなければ、これ一択です。

## 導入方法
既にプロジェクトがある前提でHeroUIを導入していきます。
といっても操作は簡単２ステップ。
1. インストール
    ```
    npm install -g heroui-cli
    ```

2. メインライブラリの``@heroui/react``を追加
    ```
    heroui add --all
    ```    
    ※私の場合はPowerShellでこのスクリプトを実行できなかったので、Windowsの方はコマンドプロンプトで実行してみてください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782635/bdf72ee4-6254-45ab-9fbd-281fd32cae12.png)

以上で完了！
あとは任意の場所で読み込むだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782635/b8317721-04d9-42f4-8319-4a618f967108.png)

## 使用した感想
まだ十分に使っていない状態ですが、非常に満足です。
「早い、簡単、美しい」
このコンテンツは、今後使用しながら追記していこうと思います。
2025/3/11主にITとかセキュリティの記事

欧州 ENISA NIS360 2024 (2025.03.05) 重要インフラのセキュリティの状況...(3/9)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/03/post-2a2537.html

Androidの脆弱性が攻撃者に悪用されている、アップデートを(3/9)
https://news.mynavi.jp/techplus/article/20250309-3143976/

iPhoneやAndroid端末の「改造スマホ」はなぜ危ない？　安全な扱い方は？(3/9)
https://techtarget.itmedia.co.jp/tt/news/2503/08/news04.html

グーグルが2年間未使用のアカウントを削除、Gmailと写真データを守る方法(3/9)
https://forbesjapan.com/articles/detail/77493

カスペルスキー:バンキング型トロイの木馬は昨年196%上昇(3/9)
https://voi.id/ja/teknologi/466634

AWS 環境チェックツール「Service Screener v2」を使ってみたので使用感を紹介(3/8)
https://dev.classmethod.jp/articles/aws-service-screener-v2/

PCの不正アクセス検知に役立つ！ PCの利用状況が一目でわかる履歴チェックツール5選(3/9)
https://news.mynavi.jp/article/20250309-3146356/

DeepSeekはほんとうに危険なのか。生成AI時代のセキュリティの考え方(3/9)
https://tamakino.hatenablog.com/entry/2025/03/09/080000

Cognito の脅威保護機能を使用し疑わしいサインインアクティビティを検出しログインをブロックしてみた(3/9)
https://dev.classmethod.jp/articles/detect-block-suspicious-signin-with-cognito-threat-protection/

“AI初心者”が無料で始められる「独学オンライン講座」5選(3/9)
https://news.yahoo.co.jp/articles/5c33fcac24629324cb39e43a3d2f4f3dce78c76c

DXを加速するには正しいブレーキが必要だ
「防御」「保険」の枠を超えるセキュリティーシフト(3/9)
https://www.risktaisaku.com/articles/-/100576

Windows 11の「スマートアプリコントロール」導入で強化されるセキュリティ対策(3/9)
https://reinforz.co.jp/bizmedia/72942/

従来のHDDとは異なり“分子レベル”での暗号化機能を持つ「分子HDD」技術が登場、将来的には100TBも実現可能か(3/9)
https://xenospectrum.com/unlike-conventional-hdds-molecular-hdd-technology-with-encryption-at-the-molecular-level-is-now-available/

「Facebookが削除されます」の偽メッセージに騙されないで！あなたのアカウントが危ない！(3/9)
https://x-bomberth.com/20250309facebook/

パスワードマネージャーの超便利な機能と上手な使い方(3/9)
https://dime.jp/genre/1932132/

学歴重視の採用は時代遅れ？　今、労働市場で求められているスキルとその取得方法(3/9)
https://forbesjapan.com/articles/detail/77600
DBSCANによるLiDARから得た点群のクラスタリング（C++）

## **はじめに**
**動作環境**
Ubuntu 22.04
ROS2 humble

**SLAMTEC RPLiDAR A1 M8**
<img width="250" alt="Lidar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817260/80d971ff-b926-4c78-8e75-9f1bc82343bb.png">

## **方法：DBSCANによるクラスタリング**
DBSCANは密度ベースのクラスタリングアルゴリズムであり、以下の手順でLiDARから取得した点群をグルーピングすることができる⁽¹⁾ 。
### **1.　データ点pの近傍を調べる**
ある点pから半径ε以内にあるデータ点を「ε-近傍点」とする。
$$
N_{\epsilon}(p) = \\{ q \mid q \in P, d_{p,q} \leq \epsilon \\}
$$
### **2.　コア点の判定**
ε-近傍点の数がMinPts以上であれば、点pを「コア点（クラスタの中心となる点」とする。
$$
|N_{\epsilon}(p)| \geq MinPts
$$
### **3.　クラスタの拡張**
コア点同士が互いのε-近傍点に含まれる場合それらは同じクラスタに属する。つまり、あるコア点のε-近傍点に別のコア点が含まれていればそれらは同じクラスタとしてグループ化される。コア点ではないがコア点のε-近傍にある点（ボーダー点）は、そのコア点の属するクラスタに含める。
### **4.　外れ値（ノイズ点）の判定**
どのクラスタにも属さない点は「ノイズ点」として分類する。
### **5.　クラスタリングの完了**
すべてのデータ点に対して上記の処理を行い、クラスタの構成が決定する。

## **結果：2D LiDARから得た点群のクラスタリング**
先述した手法を利用し、2D LiDARから得た点群をDBSCANによってクラスタリングした。Pythonで実装されていたDBSCANアルゴリズム⁽¹⁾ をC++に書き換えて動作させた。図にクラスタリングの結果を示す（$ε$=0.1, $MinPts$=10とした）。クラスタリング前の点群は壁・ボトル・人間・PC画面の辺であった。それらをクラスタリングし色分けすると壁を緑・ボトルを青・人間を赤に表示されていることがわかる。PC画面の辺は点の数が少なく、ノイズと判定された。
<img width="700" alt="Lidar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817260/9f9ab875-88d3-4433-ab9b-716bf154bc6f.png">

## **応用：大きさの推定**
ここでは、各クラスタの大きさ（広がり具合）を簡易的に推定する方法を提案する。
### **1.　クラスタの平均座標（重心）求める**
クラスタに含まれるすべての点のx座標とy座標の平均を計算することでクラスタの平均座標（重心）を求める。
$$
C_x = \frac{1}{N} \sum_{i=1}^{N} x_i
,　C_y = \frac{1}{N} \sum_{i=1}^{N} y_i
$$
### **2.　クラスタの外周円を描く**
クラスタの平均座標から最も遠い点までの距離rを算出し、（$C_x$, $C_y$）を中心とした半径rの円を描く。
$$
r = \max \left( \sqrt{(x_i - C_x)^2 + (y_i - C_y)^2} \right)
$$
<img width="700" alt="Lidar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817260/02bd1082-1152-40a3-9438-10e432fc0fc0.png
">
</pr>
図のように、各クラスタの大まかなスケールを簡易的に推定することが出来た。今回は単に円を描くことで大きさの推定を行ったが、描く図形をクラスタの特徴に合わせて変えることでさらに精度を向上させることが出来る（今後の展望）。
## **参考文献**
[1] Kota_Yukawa（湯川 皓太）, ”pythonでDBSCANアルゴリズムを実装”, Qiita, (2021)

https://qiita.com/Kota_Yukawa/items/f51a738f01754cc05ddd

## **ソースコード**
今回実装したコードはGitHubにあります（Branch：feature/cluster_size）。LiDARの動作方法は以下の記事を参考にしてください。動作について質問があればいつでもお答えします。

https://github.com/Arcanain/sllidar_ros2.git

https://qiita.com/pei_pei_/items/1d9011da23eeb8f049fc

## **謝辞**
この取り組みは株式会社GxP(グロースエクスパートナーズ)様のサポートを受けて実施しています。貴重なアドバイスやロボットに必要な機材の支援をいただきました。心より感謝申し上げます。

https://www.gxp.co.jp/

https://qiita.com/organizations/gxp
競プロ日記#25/03/11

# アルゴ式-[バケットソート](https://algo-method.com/tasks/447)
- 誘導の通りに実装することは可能だし、解説にあるようなバケットソートについてのふわっとした概念は理解できる。しかし深く理解できている気はしないし、正直よくわからない。

# アルゴ式-[数値の列](https://algo-method.com/tasks/302)
- 別にこれも問題に回答するように実装することは以下の様に造作もない。
- しかしこれがアルゴリズム論的にどのように重要な命題で、今後さらに複雑性が増した問題に対してどのような形でこの考えが絡んでくるのかイマイチ拾えていない気がしてならない
- 2以上の添え字に対して以下の様にvecN.at(i)を考えるのが「メモ化」というらしい
```
int tmpA = (vecN.at(i - 2) + vecN.at(i - 1)) % 100;
vecN.at(i) = tmpA;
```

> なお下のコード例では、最初にサイズ N の配列 A を宣言していることに注意しましょう。これによって、A[i] の値を計算するときに、A[i-2] と A[i-1] の値を利用することが可能となっています。

実はこれは、動的計画法のメモ化とよばれる考え方に対応しています。

``` 
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;

using Graph = vector<vector<int>>;

int main() {
    int N, X, Y;
    cin >> N >> X >> Y;

    vector<int> vecN(N);
    vecN.at(0) = X;
    vecN.at(1) = Y;

    int ans = 0;

    for (int i = 2;i < N;i++){
        int tmpA = (vecN.at(i - 2) + vecN.at(i - 1)) % 100;
        vecN.at(i) = tmpA;
        if (i == N - 1){
            ans = tmpA;
        }
    }

    cout << ans << endl;
}
```
【.NET8】BlazorWebAssemblyでappsettingsから値を取り出す

# 概要
サーバ側のBlazorのProgram.csでappsettings.jsonから設定を取り出す場合、プロジェクト直下にappsettings.jsonを置いてProgram.csで`builder.Configuration`にアクセスすることで設定の値を取り出せますが、WebAssemblyの場合は同じ方法で取り出すことができません。
ネット上にはrazorページなどで設定を取り出す方法は書いてありますが、Program.csで取り出す方法が微妙にわかりづらいです。ちゃんと仕組みを知っていれば簡単なことですが、あまり理解していないとなかなか難しいので、備忘録として残しておきます。

# 手順
appsettings.jsonはClientのwwwrootに配置しておきます。
Program.csで以下のように記述します。
```csharp:Program.cs
var builder = WebAssemblyHostBuilder.CreateDefault(args);

// DI に登録される HttpClient の前に直接 HttpClient を生成して設定ファイルを読み込む
var httpClient = new HttpClient
{
    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
};
using var stream = await httpClient.GetStreamAsync("appsettings.json");

// appsettings.json を builder.Configuration に追加
builder.Configuration.AddJsonStream(stream);

// builder.Configuration から設定を取得
var configuration = builder.Configuration;

await builder.Build().RunAsync();
```

やり方としては公式がやっている方法を使ってます。
公式: https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/configuration?view=aspnetcore-8.0

wwwrootに置いてあるappsettings.jsonをhttpClientで取得し、それを`builder.Configuration.AddJsonStream`で追加しておくことで、`builder.Configuration`から設定を取得することができるようになります。

# 最後に
そこまで難しいことではないんですが、理解してないと永遠にハマってしまうポイントじゃないかなと思います。詰まってしまっている方の助けになれば幸いです。
自走する方法

### はじめに:writing_hand:
一度勉強で挫折を経験した私が、自走できるようになるまでのこと振り返ろうと思います。主に試験勉強についてです。

勉強する理由は昇給のためとか、転職とか、それぞれあると思いますが、私が勉強を始めたのも自分のキャリアにプラスになると思ったからです。

しかし勉強が大学受験以来だった私は勉強の仕方が下手でした。正直コツをつかむのに時間がかかりました。
勉強したのは基本情報技術者試験、AWS CLF、AWS SAAです。


#### (自分について)
四大卒、27歳の女。趣味は登山・猫・深夜ラジオ。
コールセンターの情シスで4年勤務。
セキュリティを担当しているがインフラのことがわからず、勉強を始める。特にクラウドを理解したいと思いAWSを勉強中。


### 【結論】自走するコツは小さな目標の達成感を得ること:runner_tone2:
「自走」という言葉は、自分自身で目標を設定し、その目標に向かって自主的に行動することを意味します。
そう、この「目標」がでかすぎると苦しくなるんです。
だから細かく設定して、小さな達成感を得ることが必要です。私はこれで日々の学習が習慣づくようになりました。試験勉強の場合、受験日まで毎日目標を立てました。


### 試験に落ちた時と受かった時の違い
##### 試験に落ちた時の勉強方法
・1ページ目から順番にやる
・全体像の把握が遅い
・１か月短期集中で受験

##### 試験に受かった時の勉強方法
・細かく目標設定する（粒度は「毎日」）
・全体像を把握
・興味あるページからやる
・わからなかったらCopilotに聞いちゃう
・体験記を読み漁る

### 【振り返り】１
##### :angel_tone2:落ちる勉強方法:writing_hand:
・1ページ目から順番にやる
・全体像の把握が遅い
・１か月短期集中で受験

1ページ目から順番にやる⇒全体像の把握が遅くなる⇒1か月短期集中になった…
すみません、すべて繋がってました。
何となく来週までにここまでやろう、とは思うけど「今日どこまでやるのか」が明確ではありませんでした。気づいたらあと1か月しかない！という状況に…

##### :sun_with_face:受かる勉強方法:writing_hand:
・細かく目標設定する（粒度は「毎日」）
・全体像を把握
・興味あるページからやる

まずは全体を把握します。問題集を3周やるなら試験日から逆算してまず何日で1周するのか、それには毎日どのくらい勉強するのか。2周目3周目は毎日どれだけやればいいのか把握します。
私はスケジュールに何問目まで解くかをメモしました。スケジュール通りに行かなければ土日で調整すればOKです。
この時、興味が強いものからやるのも効果的でした。進みが加速します。

・わからなかったらCopilotに聞いちゃう

わからない問題に当たったら、迷わずCopilotに聞いちゃいます。それが1周目であっても2周目であってもいいです。解説を読む、でもいいですが、自分がわからないところをピンポイントで聞けるところが本当に便利です。

・体験記を読み漁る

これもかなり大事です、受かった人が何を使ってどのくらい勉強したのかを知ることで自分がやっていることが十分なものなのか把握できます。Udemyの教材もたくさんありますし、どれを使うのが良いかたくさん体験記を読んで選びました。

### 【振り返り】２
##### 趣味も両立する
私の趣味（というか日課？）は深夜ラジオなのですが、これを勉強のご褒美にしていました。ここまでやったら家事の時間（＝ラジオ聞く時間）と決めることでメリハリがついて良かったと思います。


### まとめ
自走と言いつつ試験勉強の話ばかりになってしましたが、振り返って効果があったと思うのは「小さな目標の達成感を得ること」でした。
これからも定期的に振り返りのブログを書いていこうと思います。
UsedRangeで選択した範囲の行数・列数を取得する

まずは全体像。
```vb
Sub GetUsedRangeSize()
    Dim ws As Worksheet
    Dim usedRng As Range
    Dim rowCount As Long
    Dim colCount As Long
    
    ' 対象のシートを設定（必要に応じて変更）
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 使用されている範囲を取得
    Set usedRng = ws.UsedRange
    
    ' 使用されている行数と列数を取得
    rowCount = usedRng.Rows.Count
    colCount = usedRng.Columns.Count
    
    ' 結果を表示
    MsgBox "使用されている行数: " & rowCount & vbNewLine & "使用されている列数: " & colCount, vbInformation
End Sub
```

#### 1. ws.UsedRange でシート内の使用されている範囲を取得。
 UsedRange の開始セルは必ず"A1"になるため、行や列の位置が途中から始まる場合でも範囲全体の行数・列数が取得できる。
 
#### 2. Rows.Count で使用されている行数を取得。

#### 3. Columns.Count で使用されている列数を取得。
MIT App Inventorでchatbotの回答を制御する方法（その3）URLの出力を行う．AIによるおすすめスポットの提案

## はじめに
以前の記事でMIT App Inventorでのチャットボットの解答をテキストと数値の指定を行った，ここではURLの出力をおこなう．URLのみを抽出することができれば，そのサイトへジャンプするのが容易になるはず．

## 作成するアプリ
MIT App Inventorからchat Botにアクセスし，おすすめスポットを提案してもらう．ユーザーがどのような場所がいいのか，カフェや公園，温泉などの要求をテキストボックスに入力できる．その要求に適したものをチャットボットが教えてくれる．また，その場所について記載されたURLを出力させ，ボタンをクリックすることでwebviewrでサイトを表示させている．
**チャットボットから取得したい内容**
チャットボットに東京都内のお勧めスポットを聞く．textBoxに条件を入力し，それに適するおすすめスポットを提案してもらう．
取得したい項目
* おすすめスポットの名前
* 概要
* URL
* 緯度
* 経度
* 住所

## デザイナー画面
![スクリーンショット 2025-03-11 003716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/0d5c4184-c7db-46c6-aa23-944435d4692f.png)

|機能|内容|
|:-:|:-:|
|VerticalArrangement_URL|サイト表示エリア|
|WebViewer1|チャットボットが出力したURLにアクセス|
|Button_close|VerticalArrangement_URLのvisibleをfalseにする|
|VerticalArrangement_main|チャットボットへの質問＆回答表示エリア|
|Label1|「検索条件」ただのテキスト表示|
|TextBox_terms|検索条件の入力するtextbox|
|Button_ai|クリックしたらgeminiに質問|
|Button_reset|Labelをきれいにする|
|Button_URL|チャットボットが返したURLへのアクセス，VerticalArrangement_mainのvisibleをfalse，VerticalArrangement_URLのvisibleをfalseにする|
|Label_info|geminiからの返答|
|Map2|マップの表示|
|Marker2|マップのおすすめスポットにマーカーを付ける|
|Web1|Geminiへのアクセス|

## ブロック画面
### 変数
#### GeminiへのURL
```
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=
```
![blocks (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/5d4028e9-5e96-4c7c-a852-466151110efa.png)


#### APIKey
ご自身キーをいれてください
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/cc710c2e-d27f-4b14-812f-282e760bdf94.png)

#### おすすめスポットのURL
チャットボットから取得したURLを格納する．
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/44f9e36b-6dc4-4805-9301-2c1836416ffb.png)


### when Button_ai .Click
ボタンをクリックしたらgeminiに質問
![blocks (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/2bd404d6-d45a-40c9-aea3-c5e709f13c1d.png)



**Geminiへの質問文**
```
東京都のおすすめスポットを１か所上げてください．
以下の5つの項目を出力してください．
おすすめスポットの名前，概要，その情報が得られるサイトのURL，その場所の緯度と経度,その場所の住所・
条件として，以下に関するおすすめスポットを上げてください．
textBox_terms. text
```

### when Web1. GotText
Geminiからの解答
![blocks (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/b80aa019-cbe5-4659-a0cf-e1d5545609c1.png)

### when Button_URL. Click
チャットボットから取得したURLにアクセスする．
![blocks (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/8da2b33e-821e-4c60-8b54-f8a557075561.png)

### when Button_close. Click
URLにアクセスした画面をとじる．
![blocks (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/1c4eb6c8-2691-4ba5-a51a-2f6331c887dc.png)

## 実行結果
検索条件に適したスポットを提案してくれます．
ただ，取得URLへアクセスできない，違うサイトを出力することがある．
![Screenshot_20250311-010836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/f48953d7-d523-4ada-b112-a66aa1f22d23.png)

## おわりに
URLを出力することができた．URLが望んだものと違うことがあるので，チャットボットへの質問文を改善することで，正確なURLを取得することができるようになるかもしれない．
今日から始めるQiita投稿生活

## はじめに
はじめまして、maruと申します。
現在はIT企業で技術職として働いています。

この度、JISOUさんの元でエンジニアとしての価値を上げる活動を始めました。


## 現在の自身について
正直な自身の評価としては、『コピペで何とかやってきた人』です。絶対何とかはなってなかったとは思いますが。

経験としては有難いことに、業務の中でバックエンドからフロントエンドまで経験させていただいていました。
ただ、技術が身についているかと言われるとそうではなく、実現したい内容をネットから探していわば写経するような形で進んできてしまっている状況なので成長という面でお察しです。
一応理解したつもりで書いてはいますが、理解度が低いので次同じ壁にぶち当たった際もちろんまた調べる旅に出るわけです。

これに対して危機感はあり、Qiitaで勉強方法を調べたりChatGPTに相談したり勉強方法は模索しましたが、3日坊主になったりと応用が効かなかったりと撃墜し続けていました。

## 将来について
元々便利ツールを作ったり考えたりするのが好きだったため、個人の活動としてプログラミングを含めた開発活動を続けていきたいと考えています。ただ、現在の技術力で自由に何かを作るには厳しい所があります。
技術者としてやっていくなら、きちんと「出来る」と自信を持ちたい気持ちと、そうならないと「マズイ」という危機感を原動力に頑張りたいと思います。

ここから研鑽をし、個人開発や委託でサービスを作り、世に使ってもらえるようになるのが最終目標です。

スケジュールとしては以下を想定しています
短期(3ヶ月)：どんなに小さいものでも良いので、1つのサービスを作り切る。とりあえず自分が使いたいと思えるものを作る。
中期(半年)：技術力を上げ、難易度が高くても自在に作れるようになる。需要のあるサービスとは何かを考え、構想出来るようになる。
長期(1年)：需要のありそうなサービスを作り、展開していく。

## 最後に
非常に読みづらい文章になっていますが、目を通していただきありがとうございました。

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

https://projisou.jp
USBハブに沢山繋いだときの消費電力を検証

# 経緯：ハブに繋ぐとPCのバッテリーが減る

https://qiita.com/hynn_nnn/items/ae28a6882ce282120f4e

# 検証
## 全部繋ぐ
Type-AにiPhoneとキーボード，Type-CにXperia，HDMIにモニター
### 結果
消費電力は　27.3W～42.3W
充電は30分で　77％→90％
WMICコマンドで確認すると　ButteryStatus=2
⇒AC駆動かつバッテリー充電
各機器充電安定

？？？
充電減る問題，起きてないんだが

そもそも45W無いのにAC駆動＆バッテリー充電だし

問題なく動くならいいです
Next.jsでAPIを作成する方法

# Next.js Route Handlers

Next.jsはReactベースのフレームワークですが、**Route Handlers**という機能を利用することで、サーバーサイドのAPIエンドポイントを簡単に作成できます。この仕組みによって、Next.jsアプリ内でAPIをサーバーレスで定義できます。

Next.js 13以降の App Router を使用します。従来の「API Routes」（Page Router用）とは異なる方法です。

## Route Handlers
Next.jsの Route Handlers は、`app/api`ディレクトリ内にファイルを配置することで、サーバーレスなAPIエンドポイントを簡単に作成できます。例えば、`app/api/book/route.js`というファイルを作成すると、`/api/book`というエンドポイントが自動的に作成されます。

## フォルダ構成

Next.jsの`app`ディレクトリを使用する場合、APIルートや動的ルートは以下のように構成できます。

```plaintext
your-nextjs-project/
├── app/
│   ├── api/            # APIエンドポイント用
│   │   ├── book/       # /api/book エンドポイント
│   │   │   └── route.js # /api/book のハンドラー
│   │   └── book/       # 動的APIルート用
│   │       └── [id]/   # /api/book/[id] 動的エンドポイント
│   │           └── route.js # 動的ハンドラー
│   ├── book/           # ページ用
│   │   ├── page.js     # /book ページ（書籍リスト）
│   │   └── [id]/       # /book/[id] 動的ページ（書籍詳細）
│   │       └── page.js
```

## 例：`app/api/book/route.js`

```js
// app/api/book/route.js
export async function GET() {
  return Response.json([{ id: 1, title: "よくわかるNext.js" }]);
}

export async function POST(req) {
  const { title } = await req.json();
  return Response.json({ id: 2, title }, { status: 201 });
}
```

このコードでは、`GET`メソッドで書籍リストを返し、`POST`メソッドで新しい書籍のタイトルを受け取って、それを基に新しい書籍を作成します。

## 例：`app/api/book/[id]/route.js`

```js
// app/api/book/[id]/route.js
export async function GET(req, { params }) {
  const { id } = params;
  return Response.json({ id, title: `Book ${id}` });
}
```

このコードでは、`[id]`という動的パラメータを受け取って、該当する書籍の情報を返します。例えば、`/api/book/123`にアクセスすると、`{ id: 123, title: 'Book 123' }`というレスポンスが返されます。

## フロントエンド：書籍リストを表示する

フロントエンド側で、バックエンドのAPIから書籍リストを取得して表示できます。

### 1. 書籍リストを表示するフロントエンド（`app/book/page.js`）

```js
async function fetchBooks() {
  const response = await fetch("/api/book", { cache: "no-store" });
  return response.json();
}

export default async function BookList() {
  const books = await fetchBooks();
  return (
    <div>
      <h1>Book List</h1>
      <ul>
        {books.map((book) => (
          <li key={book.id}>{book.title}</li>
        ))}
      </ul>
    </div>
  );
}
```

- **`fetch`**: `/api/book`というエンドポイントにGETリクエストを送り、書籍リストを取得します。
- **`cache: "no-store"`**: App Routerではデフォルトでキャッシュされるため、最新データを確実に取得するために追加。
- **`map`**: 取得した書籍データをリストとして表示します。


### 2. 動的ルートの書籍詳細ページ（`app/book/[id]/page.js`）

```js
async function fetchBook(id) {
  const response = await fetch(`/api/book/${id}`, { cache: "no-store" });
  return response.json();
}

export default async function BookDetail({ params }) {
  const { id } = params;
  const book = await fetchBook(id);

  return (
    <div>
      <h1>Book Detail</h1>
      <div>
        <p>書籍ID: {book.id}</p>
        <p>タイトル: {book.title}</p>
      </div>
    </div>
  );
}
```

- **動的ルーティング**: `params` から `id` を取得し、そのIDに基づいて書籍詳細を表示します。
- **`fetch`**: `/api/book/[id]`エンドポイントにGETリクエストを送り、書籍の詳細情報を取得します。

## まとめ

**Route Handlers**を使用することで、`app`ディレクトリ内でサーバーレスなAPIを簡単に構築でき、Reactアプリケーション内で直接APIを呼び出すことが可能です。
実際に使用する際には、外部APIやデータベースと連携して、より多様なデータソースから情報を取得することも可能です。

たとえば、`/api/book`や`/api/book/[id]`のエンドポイントを外部APIに置き換えることで、リアルタイムのデータや外部サービスとの連携を容易に行えます。
【AWS】CI/CDサービス

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# CI/CD
- CI
    - 継続的インテグレーション（Continuous Integration）
    - ソースコードの開発、ビルド、テストを自動化する
    - コードリポジトリで行われる
- CD
    - 継続的デリバリー（Continuous Delivery）、継続的デプロイメント（Continuous Deployment）
    - デプロイの提携作業を自動化する
    - 開発環境や本番環境などの隔離された環境で行われる

# AWS CodeCommit
- プライベートGitリポジトリをホストするソース管理サービス
- スケーラブルでマネージド
- IAMでGitメンバーを管理できる
- 他のAWSサービスと連携できる
    - プッシュ時にAmazon SNSで通知、Lambda関数の呼び出しなど
- クォータ
    - リポジトリ数：5000（変更可能）
    - リポジトリ名：1~100文字、.gitで終わることはできない
- リポジトリ、ストレージ、リクエストに対して課金される

# AWS CodeBuild
- フルマネージド型のビルドサービス
- ソースコードのコンパイル、単体テストの実行を行う
- CodeCommit、S3、GitHub、Bitbucketのソースをサポート
- buildspec.ymlでOS、ランタイム、ツールの組み合わせなどの環境変数を定義する
- インスタンスタイプによって価格が異なる

# AWS CodeDeploy
- デプロイを自動化するサービス
- デプロイ先はEC2、オンプレミス、Lambda、ECS
- ソース元はS3、GitHubリポジトリ、Bitbucket
- Appspec.ymlで環境変数を定義する
- EC2へのデプロイ方法
    - One at a time：1つずつデプロイする
    - Half at a time：半分ずつデプロイする
    - All at once：すべてのサーバーへ一度にデプロイ
- Lambda、ECSへのデプロイ方法
    - Canary：一定の割合でデプロイした後に残りをデプロイ
    - Linear：一定の割合、一定の間隔でデプロイしていく
    - All at once：すべてのサーバーへ一度にデプロイ

# AWS CodePipeline
- ソフトウェアのリリースに必要なステップをモデル化、視覚化、自動化するためのCD/CDサービス
- ソースリポジトリから構築、テスト、デプロイまでのリリースプロセスを自動化する
- 手動承認アクションも可能
- AWSサービスはもちろん外部サービスとも連携できる
【AWS】CloudWatch

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- AWSリソースとAWSで実行されているアプリケーションをリアルタイムでモニタリングするサービス
- メトリクスを収集、追跡できる

# CloudWatchメトリクス
- モニタリング対象の変数
- 標準メトリクス（HTTPリクエスト、CPU使用率、ディスク使用率など）とカスタムメトリクスがある
- CloudWatchエージェントでAWS以外のリソースののメトリクスも取得できる

# CloudWatchアラーム
- 事前に設定した閾値の超過や、機械学習による異常検知により、1つ以上の指定されたアクションを実行する機能
- 期間
    - 評価に使用する機関
    - 秒単位
- 統計
    - 平均、最大、合計、パーセンタイル
- アラームの状態
    - OK：閾値の範囲内
    - ALARM：閾値を超過
    - INSUFFICIENT_DATA：データが不足

# CloudWatchイベント
- イベントとルールに基づいて、AWSリソース（ターゲット）で処理を実行する（アクション）
- イベントソース
    - スケジュール：定期実行
    - イベント：リソースのメトリクスなどをトリガーとする
- Amazon EventBridgeに移行され、そちらのほうが上位互換

# CloudWatch Logs
- ログの一元化、検索、フィルタリング、アーカイブができる機能
- ソースに関係なくすべてのログを時間順に表示できる
- ログのクエリ、機密データのマスキング、埋め込みログ形式を使用したログからのメトリクス生成
- 1日～無制限の保持期間を設定可能
- CloudTrail、IAM、Lambda、Route53、EC2などと連携可能
HTML5プロフェッショナル認定試験Level1【セキュリティ】

## Webサイトへの不正攻撃の種類
<details><summary>SQLインジェクション</summary>

#### 概要
リクエストパラメーターに不正な文字列を設定し、サーバー側でSQL文を構築し、実行することによってDBの不正操作が行われる。

#### 脅威
DBの不正操作による、情報漏洩。改ざん・削除など
</details>
<details><summary>クロスサイト・スクリプティング（XSS）</summary>

#### 概要
トラップページ、メールにより、利用者にスクリプトを含むハイパーリンクをクリックさせ、脆弱性のあるWebページに遷移し、スクリプトを送信する。

#### 脅威
偽のWebページが表示され、悪用など招くほか、HTTPクッキーに保存されている、重要な情報が漏洩する恐れがある。
</details>
<details><summary>クロスサイト・リクエスト・フォージェリ（CSRF）</summary>

#### 概要
HTTPリクエストを攻撃者が推測可能な場合に、攻撃者がユーザーを誘導し、ユーザーの意図の意図しない形で処理を実行させる

#### 脅威
インターネットバンキングなどの送金処理やパスワード変更などの重要な処理を意図せず実行される
</details>
<details><summary>ディレクトリ・トラバーサル</summary>

#### 概要
相対パスやURLを利用して、異なるディレクトリのファイルを指定し、不正にアクセスする。

#### 脅威
Webサーバーに保存されている非公開のファイルにアクセスされ、秘密情報が漏洩、改ざん、削除される恐れがある。
</details>
<details><summary>HTTPヘッダ・インジェクション</summary>

#### 概要
リクエストパラメーターに改行コードを含む不正な文字列を付与し、レスポンスヘッダを生成する事で、Webサイトに不正な動作を実行させる
#### 脅威
動的にHTTPヘッダを生成する機能の不備を突いてヘッダ行を挿入することで不正な動作を行なわせる攻撃。
不正なHTTPクッキーがセットされ、なりすまし攻撃されたり、罠サイトにアクセス、リダイレクトされる恐れがある。
不正なリクエストを実行されXSS同様の被害が怒る場合もある。
</details>
【AWS】X-Ray

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- アプリケーションが処理するリクエストに関するデータを収集するサービス
- マイクロサービスのモニタリングに特化
- 可視化やボトルネックの発見に役立つ

# 基本概念
- トレース（Trace）
    - 1つのリクエストで生成されたセグメントをすべて収集する
    - アプリケーションを経由するリクエストのパスを追跡する
- セグメント（Segment）
    - リソースの動作に関するデータ
    - リソース名、リクエストの詳細、行った作業の詳細が含まれる
- サブセグメント（Subsegment）
    - 完了した作業に関するセグメントを分割できる
    - 詳細なタイミング情報、ダウンストリーム呼び出しに関する詳細などを含む
    - コードの特定の関数・行を計測する任意のサブセグメントも定義できる
【AWS】Cognito

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# Cognitoの概要
- ウェブおよびモバイルアプリの認証、認可、ユーザー管理機能を提供する
- サインアップ、サインイン、IDストア（ユーザープール）、IDフェデレーション

# ユーザープール（User Pool）
- ユーザー作成、管理、認証を行うユーザーディレクトリ
- IDとパスワードでサインアップ・サインイン
- サインアップ・サインインをトリガにLambdaを実行できる

# IDプール（Identity Pool）
- AWSリソースへのアクセスを**認可**する機能
- 一時認証情報を付与する
- 認証にはユーザープールか外部のサービスを使う

# 認証・認可機能
- 認証：トークンベース認証
- セキュリティ強化：パスワードポリシー、MFA
- ユーザー管理：パスワード紛失時の変更、メールアドレス・電話番号の有効性確認
- 高性能なセキュリティ：ユーザー名とパスワードが他のサイトで侵害されたことを検出する機能など
【未経験】AZ-104に1か月で合格する勉強法

## はじめに
受験される方の参考になればと思い、勉強方法をまとめたいと思います。

## 受験時のスキルセット

- ソフトウェアエンジニア（4年目）  
- クラウドの実務経験: なし  
- ベンダー資格:  
  - AZ-900（2025年2月）
  - AWS CLF（2024年8月）
  - AWS SAA（2024年9月）

## 使用した教材
 1か月間（2025/2/9～2025/3/8）
 1日平均1～2時間程度

## 使用した教材

### Udemy

以下の2つのUdemyコースを活用しました。

- [AZ-104 Microsoft Azure Administrator模擬試験](https://www.udemy.com/share/10cSjH3@d2XhVLjXbnqhTESJAa1YBCMBFrJDKRVUNbVW2xJh3Ei0DCdUdl75N7dhpgybNDD_sg==/)
- [AZ-104 Microsoft Azure Administrator 試験対策](https://www.udemy.com/share/10cjM93@XbOCZLf9nsZAaEIL3qAOtH2TxzJOsep9LOe8nTAsZyKO5t8AsdrGQEon3IGKhFBB2A==/)

どちらも非常に役立ちましたが、特に模擬試験は本番の出題傾向を把握するのに最適でした。

### Microsoft Learn

- Microsoft Learnの公式模試を活用しました。
- AZ-104の試験では、**試験中にMicrosoft Learnを参照できる** ため、本番を意識してMicrosoft Learnで検索する練習をしました。
(Microsoft Learnは検索の仕方にコツがいるので、事前に慣れておくのがオススメです。)

## 勉強方法

1. **講座を視聴(Udemy)**：基本的な知識をインプット  
2. **模試を解く(Udemy、Microsoft Learn)**：出題傾向を把握、アウトプット
3. **Microsoft Learnで検索する練習**：本番に備える

## まとめ

- クラウドの実務経験なしでも、適切な教材と学習方法でAZ-104に1か月で合格可能  
- **Microsoft Learnの検索練習は必須**  
- Udemyの模擬試験を活用し、問題の傾向をつかむ

## おわりに
同じようにAZ-104の受験を考えている方の参考になれば幸いです！  
次はAZ-305を取得しようと思います。
【AWS】Step Functions

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- ステートマシンサービス
- アプリケーションのワークフローを構成して可視化
- 実行プロセスを構築、管理、自動化する
- マイクロサービス間を疎結合にするメリットがある
- 条件分岐などの複雑なワークフローにも対応

# ステートマシンの基本
- ステート（State）の種類
  - Wait：待機
  - Choice：条件分岐
  - Fail：エラーの定義
  - Parallel：並列処理がすべて正常終了したらFinal Stateを実行
  - Map：動的配列の並列処理
- ASL（Amazon States Language）でJSONベースの状態定義も可能
- 開始トリガー
  - API
  - CloudWatch Events
  - API Gateway

# 種類
- 標準ワークフロー
  - 実行時間が長い処理向け
  - 耐障害性とリトライ機能
- エクスプレスワークフロー
  - 短時間の高頻度処理向け
  - 高速かつ低コスト

# 料金
- 状態遷移の回数によって課金
- 毎月の無料利用回数もある

# SQSとの使い分け
- 並列、条件分岐、エラーハンドリングなどがあればStep Functions
- それ以外ならSQS、大量のリクエストに対してもコスト最適
【AWS】SNS

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- Simple Notification Service
- イベント駆動型のメッセージ通知サービス
- モバイルプッシュ通知、システムアラート、Eメールなど
- HTTPS、SMS、Email、SQS、Lambda、その他AWSサービスとの連携が可能
- 完全従量課金制で安価
- SNSでは送信側＝パブリッシャー、受信側＝サブスクライバー

# 各機能
- Fan Out設計
    - 1つのメッセージを複数のサブスクライバーにプッシュして並列処理を行う
- フィルターポリシー
    - 受信者が受信するメッセージを定義するプロパティが含まれているJSONオブジェクト
    - メッセージ属性またはメッセージ本文に適用されるポリシーに対応する
- トピックポリシー
    - SNSトピックにJSON形式のトピック

# SES, SQSとの使い分け
- Eメール送信
    - リッチテキスト、長文はSES
    - 短文のメールであればSNSを利用できる
- メッセージキューイング
    - プル型はSQS
    - プッシュ型はSNS
【AWS】SQS

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- Simple Queue Service
- メッセージキューイングサービス
- マイクロサービスなどで、システム間を非同期接続して疎結合にする
- SQSでは送信側＝プロデューサー、受信側＝コンシューマー

# タイプ
## Standardキュー
- 配信順序と重複排除を保証しない
## FIFOキュー
- 配信順序（FIFO）と重複排除を保証する
- 処理効率は低い

# メッセージの取得
## ポーリング
- ショートポーリング
    - デフォルト
    - すぐにレスポンスを返す
- ロングポーリング
    - 一定時間（最大20秒）の滝後にレスポンスを返す
    - リクエスト回数が減ってコストは抑えられるが、レイテンシが発生する
## メッセージ制御
- 可視性タイムアウト
    - ポーリングされたキューが一定期間ほかのコンシューマから見えなくなる
    - 30秒～12時間を設定可能
- 配信遅延
    - メッセージが入ってから、取得できるようにするまで遅延させる
    - 最大90秒を設定可能
- デッドレターキュー
    - 処理に失敗したメッセージを別のキューに移動させる


# メッセージの属性
- メッセージボディ
- メッセージ属性の設定と利用

# セキュリティ
- IAMポリシーを使用したアクセス制御
- 暗号化
    - サイバーサイドの暗号化が可能（SSE-SQS、SSE-KMS）

# エラーハンドリング
- デッドレターキュー（DLQ）の設定と利用方法
- エラーハンドリングのベストプラクティス

# SQSのスケーラビリティ
- 高可用性と耐障害性
- 負荷分散の仕組み

# SQSと他のAWSサービスの連携
- AWS Lambdaとの統合
- SNS（Simple Notification Service）との併用

# パフォーマンスとコスト
- SQSのパフォーマンスに関する考慮事項
- コストモデルと料金の計算

# SQSのベストプラクティス
- メッセージ設計の注意点
- 適切なキューの選択と管理
【AWS】API Gateway

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- Webアプリで使われるインターフェースサービス
- APIの作成、保護、公開、モニタリングを簡単に行える
- REST API・HTTP API・WebSocket APIをサポート

# APIの種類
- HTTP API
    - APIプロキシ機能のみを必要とするAPIの構築に最適
- REST API
    - HTTP APIに加えて、管理機能も使用したい時に使用する
- REST API（プライベート）
    - VPC内からのみアクセス可能
- WebSocket API
    - バックエンドサービスとクライアント間で永続的な接続を維持する
    - リアルタイム双方向通信アプリケーションに使用される

# エンドポイント
- 環境ごとに作成される（prod, devなど）
- タイプ
    - エッジ最適化：エッジロケーションを使用
    - リージョン別
    - プライベート：特定VPCから使用する場合

# リクエスト・レスポンス処理
- 指標
    - リクエスト数：単位時間当たりのリクエスト数
    - スロットリング：最大秒間リクエスト数、超えるとスロットル（リクエストを制御すること）、デフォルトで1万回/秒
    - クォータ：APIキーごとのリクエスト上限
- リクエスト/レスポンスの変換（マッピングテンプレート）
    - バックエンドとクライアントがそれぞれ処理できる形に変換する
- 指数バックオフ Exponential backoff
    - スロットリングエラーや5xxエラー発生時の再試行ロジック
    - エラー後の再試行までの待機時間を指数関数的に増やしていく
    - 不必要なリクエストを減らす目的

# 統合（バックエンドとの接続）
- Lambda統合
    - Lambda関数がリクエストを処理
    - Lambdaプロキシ統合
        - よりシンプルな方法
        - API Gatewayの役割が少ない
        - リクエストの解析やレスポンスの生成をLambda側で行う
- HTTP統合
    - HTTPベースのバックエンドがある場合に使用（EC2など）
- プライベート統合
    - VPC内にあるリソースをにリクエストを渡す
    - VPCリンクを使用する
- Mock
    - バックエンドと統合せずに固定のレスポンスを返す
    - 主にテスト用
- AWSサービス統合
    - DynamoDB、S3など

# その他の機能
- 使用量プラン
    - APIキーごとにリクエスト数やスロットリングを制限できる
    - 無料プラン・有料プランのユーザーによって使用量を変えられる
- キャッシング

# セキュリティ
- クライアント証明書の作成・検証が可能
- 認証
    - IAM認証
    - Cognitoオーソライザー（ユーザープール認証）
    - カスタムオーソライザー（Lambdaオーソライザー）
- CORS（Cross-Origin Resource Sharing）の設定
- WAF（Web Application Firewall）との連携

# 課金体系
- リクエスト料金とデータ転送料金
- キャッシュ利用時にも課金される
【AWS】Lambda

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 概要
- サーバーレスコンピューティン
- イベント駆動型アーキテクチャ
- スケーラビリティと効率性の向上
- 関数実行中のみ課金

# 実行環境
- 対応ランタイム
  - Node.js、Python、Java、Go、Ruby、C#
  - Runtime API: 関数の作成にその他のプログラミング言語を使用できるようにするためのもの
- デプロイ方法
  - AWS Management Console
  - AWS CLI
  - AWS SDK
- 自動スケーリング機能
  - リクエストに応じたリソースの割り当て

# ライフサイクル
- 初期化
    - デフォルトで10秒以内
    - 超過したら再実行される
- エラー発生時
    - 再起動してから再実行する

# 同期／非同期呼び出し
# 同期呼び出し
- イベントを生成するサービスは、関数からのレスポンスを待機する
- サービスはエラー戦略（エラー発生時に再試行するかどうかなど）を制御する
# 非同期呼び出し
- 関数を実行する前にイベントをキューに入れ、イベントを生成したサービスにすぐに成功レスポンスを送信する
- イベント処理後はレスポンスを返さない
# 各サービスからの呼び出し方法
# サービスの同期・非同期処理
- 同期で動作するサービス
  - API Gateway
  - Cognito
  - Connect
  - Elastic Load Balancing (Application Load Balancer)
- 非同期で動作するサービス
  - SES
  - SNS
  - S3
  - Lambda
  - EventBridge（イベントバス）
  - CloudFormation
  - CloudWatch Logs
  - CodeCommit
  - CodePipeline
  - Config
- 同期または非同期で動作するサービス
  - EventBridge（パイプとスケジュール）

# Lambda@Edge
- CloudFrontのエッジロケーションからコードを実行する
- ユーザーに近い場所で実行できるため、高速なコンテンツ配信が可能になる

# Provisioned Concurrency プロビジョニングされた同時実行性
- 2桁ミリ秒以内に応答できる状態を維持する機能
- レイテンシの影響を受けやすいサービスで使用する
- 準備状態にしておく実行環境の数を指定できる

# Lambdaレイヤー
- ライブラリ・依存関係の管理
- 複数のLambda関数間でライブラリ・依存関係を再利用する
- 更新やメンテナンスが容易
- ライブラリ、カスタムランタイム、データ、設定ファイルを含む.zipファイルアーカイブ
- 各関数最大5つを設定可能

# バージョニングとエイリアス
- 関数のバージョン管理
  - デプロイすると自動的に新たなバージョンが作成される
  - 旧バージョンに戻すことも可能
  - 徐々にトラフィックを移行することもできる
- エイリアスの使用
  - 特定のバージョンに名前を付ける機能
  - 環境ごとの管理（例: 「dev」「stg」「prod」）

# クォータ
- 同時実行数: リージョンあたりでデフォルト1000
  - AWSサポートにクォータ引き上げをリクエスト可能
- 関数のタイムアウト: デフォルト3秒、リクエストあたり最大15分(900秒)
- メモリの最大値: デフォルト128MB、最大10GB

# 利用シーン
- S3にファイルへのアップロードをトリガーに関数実行
- 定期的なバッチ処理をサーバーレスで実行
Gitの変更を元に戻したい→restoreとcleanコマンド

# はじめに
gitにおいて，現在の行っていた変更はもうよくて，1つ前のコミットに戻りたいときありませんか？
そんなときによく使う`git restore`と`git clean`について説明します
# git restore
git restoreは、作業ディレクトリやステージング領域のファイルを復元するためのコマンドです。

## 主な用途
- 作業ディレクトリの変更を元に戻す
- ステージングされた変更を取り消す
## よく使うオプション
- `git restore <ファイル名>`: 作業ディレクトリの変更を元に戻す
    - すべてのファイルを戻したい時は`git restore .`
- `git restore --staged <ファイル名>`: ステージングを取り消す（変更はそのまま残る）
- `git restore --source=HEAD~1 <ファイル名>`: 特定のコミットの状態に復元
# git clean
git cleanは、追跡されていないファイル（Gitで管理されていないファイル = untracking file）を削除するためのコマンドです。

## 主な用途
未追跡のファイルやディレクトリを削除してリポジトリをクリーンな状態にする
## よく使うオプション
- `git clean -n`: 削除されるファイルを表示（ドライラン）
- `git clean -f`: 未追跡のファイルを強制的に削除
- `git clean -d`: 未追跡のディレクトリも削除
- `git clean -x`: .gitignoreで指定されたファイルも削除

# 使い分け
`git restore`: すでに追跡されているファイルの変更を元に戻す
`git clean`: 追跡されていない（新規作成された）ファイルを削除する
Redisを初めて実務で導入してみた

## はじめに

バックエンドエンジニア歴2年、Redisに初めて触れたので記念するため記事として記録する！

## どんなサービスに導入した？

ディスプレイ広告のImpression集計アーキテクチャを少し変更してRedisを導入した。

## Impression集計フローを変えた。
### 理由
サーバのディスク使用率が１００％になったことがあり、Impressionの書き込みができず、損失に繋がったことがある。
ディスク使用率が１００％に絶対ならないような対策と共に、リアルタイムでDBに保存するよう変更した。既存と同じくcsvファイルとしてもバックアップするので、どっちか一箇所が壊れてもImpressionを担保できる。

**既存の仕様**
1. ImpressionサーバでImpressionをcsvファイルにテキスト形式で保存
2. Batchサーバでcsvファイルを読みDBに保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256444/43ae65f4-b633-434f-8dae-519b7a91d5e5.png)


**新しい仕様**
1. ImpressionサーバでDBに直保存する
2. バックアップとしてcsvファイルも取っておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256444/f577b706-3a61-4aa4-9a3e-7ead868705a4.png)

## Redisで実現できたこと

1. リアルタイムでImpressionを集計
    - Redisのシングルスレッドのおかげで、マルチスレッド環境で同時生問題を防いだ
    - ListをQueueのように使うことでデータ損失防止(LeftPush, RightPop) 
2. ImressionデータをRedisに臨時保存する→BatchInsertすることでRDSとのI/Oコスト削減


## RabbitMqを使ったらもっと良かったかも？

- Redisはメモリを使うのでDiskを使うローカルRabbitMqを使ったらもっと良かったかもしれない。
    - また、Message Queueがあるとinsert失敗シナリオ対策がもっと柔軟にできそうだった。
- 今後は他サービスとの連携をEvent Driven Architectureで作ってみたい（配信〜在庫管理〜imp集計）
    - RabbitMq VS Kafka、どっちを使う方がいいか考えてみよう、、！
【Mac】ターミナルでディレクトリやファイルのリストを絵文字付きで出力する方法

facadを使用するとディレクトリやファイルのリストを絵文字付きで出力できます。

https://github.com/yellow-footed-honeyguide/facad

## インストール

以下のコマンドでインストールできます。

```terminal
brew install facad
```

## 使い方

対象のディレクトリで`facad`コマンドを実行するとディレクトリやファイルの一覧が出力されます。

![screen-shot-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/87e7a595-54bf-41bd-b719-dff73de2a4c0.png)
[翻訳] Zero-Shot Learning Through Cross-Modal Transfer

## 論文情報
論文名：Zero-Shot Learning Through Cross-Modal Transfer
公開年：2013年
DOI：https://doi.org/10.48550/arXiv.1301.3666

## 1. Introduction
訓練データが存在しない画像内のオブジェクトを認識できるモデルを提案。
例えば、一度も猫の画像を学習したことがなくても、その画像が猫を示しているのか、あるいは犬や馬といった学習済みのクラスに属するのかを判別可能。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032581/8be820de-3897-480e-878f-eb6e360794f9.png)

1. NNモデルを大規模コーパスで学習し、単語同士の類似性を捉えた意味空間を形成する（Manifold of known classes）
2. テスト画像（図だと猫の画像）が意味空間上にあるかを判定する（外れ値検出を使う）
3. 意味空間上にない場合は、単語埋め込みを使ってそのクラスを特定する

## 2. Related Work
### Zero-Shot Learning
本論文の取り組みは、Palatucci らの研究に近い。
### One-Shot Learning
非常に少ない訓練データを用いて、物体クラスを学習することを指す。
本論文は、自然言語からのクロスモーダルな知識転移により、訓練データがなくても物体クラスを分類できる点が異なる。
### Domain Adaptation
あるドメイン（分野）には多くの訓練データがあるが、別のドメインにはほとんどないような状況で有用。
### Multimodal Embeddings
音声や映像、画像、テキストなど、複数のソースから情報を関連付けることができる。
Socher らは、単語と画像を共通の意味空間に投影し、注釈付けとセグメンテーションの分野においてSOTAを達成した。しかし、訓練データが若干量必要になる点がネック。

## 3. Word and Image Representations
単語同士の類似性を捉える方法として、文脈内での他の単語との共起性を学習する手法がある。この手法は、様々な自然言語処理タスクで効果的であることが証明されている。

例えば Huang らは、Wikipedia のテキストを使用して、各単語がその文脈内で発生する可能性を予測することで単語ベクトルを学習する。
このモデルでは、各単語の周りのウィンドウ内の局所的な文脈と、グローバルな文書文脈の両方を使用する。

## 4. Projection Images into Semantic Word Spaces
Huang らのモデルを活用し、画像ベクトルを50次元の単語の意味空間に投影した。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032581/f34ff473-b4a2-4b59-9b91-8dd6437b51ab.png)
* T-SNEを用いて、単語の意味空間を50次元→2次元へ圧縮して可視化した図。緑背景の文字が単語ベクトルの位置。
* ほぼ全てのクラスは単語ベクトルの周りに密に分類されている一方で、Zero-Shot（猫とトラック）は近くにベクトルがない。しかし、意味的には類似したクラスに近い位置にある（猫は犬や馬に近く、車や船とは遠い）

## 7. Conclusion
提案モデルの特徴は以下のとおり。
1. 単語同士の類似性を捉えた意味空間を使用することで、異なるモダリティ間で知識を転移するのに役立つ
2. 外れ値検出で Manifold of known classes 上にあるかどうかを判定するフレームワークが、Zero-Shot 分類と既知の分類を1つのフレームワークに統合するのに役立つ
Rust tutorialを参照しながら、randクレートの実装を見る．

# 背景
最近はあまりに暇すぎてRustのtutorialを読んでいます．現在10章ぐらいまで読んでいるのですが，個人的に一番？になるのは，2. Programming a Guessing Gameの```use rand::Rng```ではないかなと思います．moduleあたりの内容を学んだあとにこのuse文を振り返ると，なぜこれが必須なのか疑問になります．それを理解するためにrand crateをあさっていました．結局その疑問に対しては，そういう仕様という理解なのですが，crate内の実装がtutorialの理解に役立つかなと思ったので，ちょっと自分のとった行動を書いてみます．Rust tutorialを読んでいる初心者の方に参考にしていただけたら嬉しいです．
# 注意
tutorial内のrand crateはversion0.8.5です．最新版の実装とは異なる可能性があります．
# 本文
Guessing gameで乱数を発生するために，以下の実装をします．
```
use rand::Rng;

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..=100);
```
なぜ```use rand::Rng```が必要なのかというと，gen_rangeがトレイトに実装されているからです．ただ，これは7. Managing Growing Projects with Packages, Crates, and Modulesを読んでいると，不思議です．structやenum，それに付随するmethodは，公開されていれば，useしなくても使用することができます．
例えば，```rand::thread_rng()```はThreadRngのinstanceを作成しますが，必ずしもこれを経由する必要はありません．以下のコードも，同様にThreadRngのinstanceを作成できます(呼び出し方によって生成されるものの設定が異なる可能性はありますが)．
```
let mut thread_rng = rand::rngs::ThreadRng::default();
```
では，少し実装を追ってみましょう．rand crateのrootは以下のようになっています．```thread_rng```はここでuseされているので，```rand::thread_rng()```で使用できるのですね．
```rust:lib.rs
// Re-exports from rand_core
pub use rand_core::{CryptoRng, Error, RngCore, SeedableRng};

// Public modules
pub mod distributions;
pub mod prelude;
mod rng;
pub mod rngs;
pub mod seq;

// Public exports
#[cfg(all(feature = "std", feature = "std_rng"))]
pub use crate::rngs::thread::thread_rng;
pub use rng::{Fill, Rng};

#[cfg(all(feature = "std", feature = "std_rng"))]
use crate::distributions::{Distribution, Standard};
```
ただ，ここでは，ThreadRngがuseされていません．なので，一見するとThreadRngのinstanceを生成できるのは変です．ただ，実装をよく追うと，ThreadRngが公開されていることがわかります．
```rust:rngs/mod.rs
#[cfg(all(feature = "std", feature = "std_rng"))] pub use self::thread::ThreadRng;
```
mod.rsを用いるのは，7.5節にあるように，古い習慣です．上のlib.rsでrngs moduleが公開され，さらにrngs内でThreadRngも公開されています．
```rust:thread.rs
impl Default for ThreadRng {
    fn default() -> ThreadRng {
        crate::prelude::thread_rng()
    }
}
```
thread.rsでdefaultが実装されており，これでinstanceを作成できます．では，RngがThreadRngに実装されているのかと思い，このファイルの中を捜索してもRngは実装されていません．代わりに，RngCore traitが実装されています．
```rust:thread.rs
impl RngCore for ThreadRng {
    #[inline(always)]
    fn next_u32(&mut self) -> u32 {
        // SAFETY: We must make sure to stop using `rng` before anyone else
```
実は，ThreadRngにRngが実装されているかどうかを確認するためには，Rngを確認する必要があります．
```rust:rng.rs
pub trait Rng: RngCore {
    /// Return a random value supporting the [`Standard`] distribution.
    ///
```
これはtutorialに(少なくとも10章までは)書かれていないのですが，RngはRngCoreを継承しています．ですが，これだけではThreadRngがRngを実装している根拠にはなりません．根拠になるのは，同ファイルの以下の実装です．これは，10.2節のblanket implementationです．
```rust:rng.rs
impl<R: RngCore + ?Sized> Rng for R {}
```
これによって，RngCoreを実装するThreadRngにも，自動でRngが実装されるのです．

では結局，traitのmethodを使用するには，useしなければならないのでしょうか．これは，よくわかりませんでした．一応，tutorial内でも，10.2節で，次のように記述されています．なので，そういう仕様だと理解しています．
> The only difference is that the user must bring the trait into scope as well as the types.

structはscopeに必ずしも入れなくてもよいので，as well asは変ですが，traitは必ずscopeに入れる必要があります．

# まとめ
今回，traitがstruct等とルールが異なることを不思議に思い，rand crate内を見て回っていました．結局，扱いが違う以上のことはわかっていないのですが，コードを追う過程で，tutorial内の知識がかなり活用されました．tutorialを読んでいる方は，実装を追ってみると勉強になるかと思います．今回の記事がその助けになれば幸いです．
Riffusionで奏でる未来の音楽: AIが描くサウンドの革新

# Riffusionで奏でる未来の音楽: AIが描くサウンドの革新

![00005-1024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/9bbb803b-7182-4b0e-b144-bc99373548bf.jpeg)
## はじめに

AI技術の進化により従来の枠にとらわれない新たな音楽生成の世界が広がっています。そんな中、**Riffusion**はDiffusionモデルを活用して音楽を生み出す革新的なツールとして注目されています。
本記事ではRiffusionの概要や仕組み、Webサイトを利用した手軽な音楽生成体験について解説します。

## Riffusionとは？

Riffusionは、画像生成で話題となったStable Diffusionの技術を応用し、音楽生成に挑戦するプロジェクトです。テキストプロンプトから得たイメージを元にスペクトログラム（音の「画像」）を生成し、それを再構成することでオリジナルのサウンドを作り出します。
このアプローチにより、従来の音楽制作プロセスにはなかった自由な発想での楽曲制作が可能となります。

## 仕組みと特徴

- **スペクトログラム生成**  
  Diffusionモデルが音の周波数と時間の情報を持つスペクトログラムを生成し、そこから音楽を復元します。

- **テキストプロンプトによるクリエイティブな操作**  
  ユーザーが入力したテキストから連想されるイメージをもとに、独自のサウンドが生み出されます。

- **オープンで直感的なWebサービス**  
  インストール不要でブラウザ上で手軽に利用できるため、誰でも気軽にAI音楽生成の世界に触れることができます。

## Webサイトでの利用方法

Riffusionの魅力は、専門的な知識や環境構築がなくてもWebブラウザ上で簡単に体験できる点にあります。
以下の手順で、未来の音楽生成をお楽しみください。


**1. Webサイトにアクセス**  
    まずは公式サイト（例: [https://www.riffusion.com](https://www.riffusion.com)）にアクセスします。
ログインかサインアップを求められるので、GoogleかDiscordでアプリ連携をするなどしてログインしてください。

![ログイン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/acc3a349-952b-4118-82da-3af2e124960f.jpeg)


**2. テキストプロンプトの入力**
    サイト上の入力フォームにあなたがイメージする風景や感情、シーンを表現するテキストを入力します。  
    例: 「静かな湖畔に広がる夜明けの光」など。
    Composeでは歌詞を入力することができます。
    ※2025年3月10時点、日本語歌詞の発音再現度は80%程度です

![ジェネレート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/c1bc37aa-1c2c-4f9a-bda4-ddc4ab3eb40d.jpeg)


**3. 生成ボタンをクリック**  
    入力が完了したら生成ボタンをクリック。AIがあなたのテキストから連想されるスペクトログラムを生成し、対応するサウンドを再生します。

**4. 生成結果の楽しみ方**  
    出力されたサウンドはブラウザ上で再生できるほかダウンロードすることも可能です。音楽制作のインスピレーションや映像・ゲームのBGMなど、さまざまな用途にご活用ください。

![ライブラリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/386bebd9-dbf8-4af9-8f43-bb42d05063f4.jpeg)


## 実際の利用例

Riffusionは以下のようなシーンで活用が期待されます。

- **音楽制作**  
  AIが生成したサウンドを元に、新たな楽曲のインスピレーションや素材として利用可能です。

- **映像・ゲームのBGM**  
  シーンに合わせた音楽を自動生成することで、映像作品やゲームの雰囲気作りに役立ちます。

- **研究開発**  
  新たな音楽生成アルゴリズムや、音と画像の融合技術の実験材料としても注目されています。

## 終わりに

Riffusionは、Web上で手軽に利用できる次世代の音楽生成ツールとしてクリエイティブな可能性を大きく広げています。
従来の音楽制作の枠組みを超え、革新的なサウンド体験を提供するこのプロジェクトから今後も目が離せません。
ぜひ、公式サイトで未来の音楽の一端を感じてみてください！
ONNX インストール時に「ファイル名または拡張子が長すぎます。」エラーが出たときの対処法

# ONNX インストール時に「ファイル名または拡張子が長すぎます。」エラーが出たときの対処法

こんにちは！

ONNX をインストールしようとしたら「ファイル名または拡張子が長すぎます。」というエラーに遭遇したことはありませんか？ これは Windows のファイルパスの長さ制限（通常 260 文字）が原因で発生する問題です。

「なんでこんなところで引っかかるんだ……」と思った方もいるかもしれませんね。でも安心してください！ ちゃんと解決策があります。

今回は、この問題を解決するための方法をご紹介します。

## 1. Long Paths を有効にする
Windows 10 バージョン 1607 以降では、設定を変更することで 260 文字を超えるファイルパスを扱えるようになります。

### **レジストリ エディタを使う方法（おすすめ）**

1. `Windowsキー + R` を押して、`regedit` と入力し、`Enter` を押します。
2. レジストリ エディタが開いたら、以下のキーを探します。
    ```
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
    ```
3. 右側のリストから `LongPathsEnabled` を探します。
    - もし `LongPathsEnabled` がなければ、右クリックして `新規 > DWORD (32 ビット) 値` を選択し、`LongPathsEnabled` という名前を付けます。
4. `LongPathsEnabled` をダブルクリックし、値を `1` に変更。
5. レジストリ エディタを閉じ、PC を再起動！

### **グループ ポリシー エディタを使う方法（Pro 以上限定）**

※ この方法は Windows Pro、Enterprise、Education のみ対応です。

1. `Windowsキー + R` を押して、`gpedit.msc` と入力し、`Enter` を押します。
2. グループ ポリシー エディタが開いたら、以下のパスを探します。
    ```
    コンピューターの構成 > 管理用テンプレート > システム > ファイルシステム
    ```
3. `長いパスの Win32 の動作を有効にする` をダブルクリック。
4. `有効` に設定して OK を押します。
5. 変更を適用するため、PC を再起動！

## まとめ

ONNX のインストールで「ファイル名または拡張子が長すぎます。」エラーが出たら、

1. **レジストリを変更して Long Paths を有効にする**
2. **（Pro 以上の人向け）グループ ポリシーを変更する**

このどちらかを試せば解決できます！

これで ONNX のインストールもスムーズに進むはずです。ぜひ試してみてください！
#0069（2024/03/10) 機械学習におけるデータ処理パイプライン設計

# 機械学習におけるデータ処理パイプライン設計の基本とコンポーネントの役割

機械学習やディープラーニングの実務的なプロジェクトにおいては、データ処理を整理し、明確に役割分担されたコンポーネントを使ってパイプラインを構築することが重要です。この記事では、そのパイプラインを構成する各コンポーネントの役割、動作原理、メモリの使い方を解説します。

---

## 🔹 コンポーネントの概要と役割

以下は、典型的な機械学習プロジェクトで使われるデータ処理パイプラインのコンポーネントです。

1. **Dataloader（データローダ）**
2. **Augmentor（データ拡張）**
3. **Preprocessor（前処理）**
4. **Transformer（特徴変換）**
5. **Estimator（モデル）**

---

## ① Dataloader（データローダー）

**役割**:
- 画像・動画・テキスト・数値データなど、様々な形式のデータを統一的に読み込む。
- 必要に応じてデータのシャッフル、分割（学習・検証・テスト）を行う。
- メモリ効率を考慮し、データをストリーム形式でバッチ処理する。

---

## ② Augmentor（データ拡張）

**役割**:
- 学習データを人工的に増やし、モデルの過学習を防ぎ、汎化性能を向上させる。
- 画像なら回転・ノイズ追加、テキストなら同義語置き換え、数値データならランダムノイズ付加などを行う。

**関連コンポーネント**:
- Dataloader: データを受け取る。
- Preprocessor: 拡張後のデータに対して前処理を適用する。

---

## ③ Preprocessor（前処理）

**役割**:
- モデルが学習しやすいフォーマットにデータを変換する（例: 正規化、スケーリング、特徴抽出）。
- 学習の安定性向上や収束を早める。

**代表的な前処理例**:
- 画像データ: ピクセル値の正規化やリサイズ。
- テキストデータ: トークン化、パディング。
- 数値データ: 外れ値処理、欠損値処理、標準化。

**関連するコンポーネント**:
- Augmentorの後に配置されることが多い（拡張済みデータを処理）。

---

## ④ Transformer（特徴変換）

**役割**:
- Preprocessorが整えたデータを受け取り、高度な特徴変換や特徴抽出を行う。
- 主成分分析（PCA）、埋め込み表現（Embedding）生成などを通じて、より高次元の特徴を獲得する。

**具体例**:
- 画像: CNNで特徴マップを抽出。
- テキスト: BERTなどで単語埋め込みベクトルを生成。
- 数値: PCAや次元削減アルゴリズムを適用。

**関連するコンポーネント**:
- Preprocessor の後に配置され、Estimatorへ特徴を渡す。

---

## ⑤ Estimator（モデル）

**役割**:
- Transformerが作成した特徴データを用いて、実際に学習や推論を行うモデル本体。
- 訓練、評価、予測（推論）を担当。

**具体例**:
- 画像分類: CNNベースモデル（ResNetなど）。
- 時系列データ: RNN/LSTM/Transformer。
- 表データ: XGBoost、LightGBM。

---

## 🔹 各コンポーネントを組み合わせた具体的な処理の流れ

一般的なデータ処理パイプラインは以下の流れで構成されます。

1. **Dataloader**  
   データをロードし、必要に応じてシャッフルや分割（学習/検証/テスト）を行う。

2. **Augmentor**  
   必要に応じてデータを人工的に拡張する（例：画像の反転・回転、テキストの同義語置換）。

3. **Preprocessor**  
   モデルが扱いやすいようにデータを変換する（正規化、特徴抽出、リサイズなど）。

4. **Transformer**  
   データをさらに抽象度の高い特徴表現に変換する（CNNやBERTなど）。

5. **Estimator**  
   Transformerが生成した特徴量を用いてモデルの学習や推論を実施する。

---

## 🔹 コンポーネント間の役割分担とメモリ使用量のポイント

| コンポーネント    | 主な役割                          | メモリ使用量・負荷                            |
|-----------------|---------------------------------|-----------------------------------------------|
| Dataloader      | データのロード・バッチ生成            | ストリーム処理のため、最小限                  |
| Augmentor       | データの拡張（動的生成）              | 一時的にメモリを使用するが、ストリーム処理可能なので影響小  |
| Preprocessor    | 前処理（スケール変換など）            | 軽量で一時的なデータ変換が主流であり、負荷小            |
| Transformer     | 特徴変換（次元削減・特徴抽出）        | 高度なモデルを使うとGPUメモリやCPU使用量が増える傾向   |
| Estimator       | モデルの学習・推論                   | モデルパラメータやデータバッチを常時メモリ上に保持するため、最も多くメモリを使用する |

---

## 🔹 まとめと設計上の注意点

機械学習モデルの性能はデータ処理パイプラインの品質に大きく影響されます。各コンポーネントの役割を明確にし、再利用可能なモジュールとして設計することで、開発や管理を効率化できます。

パイプライン設計時に注意すべきポイント:
- TransformerとEstimator間の役割を明確に分離することで、再利用性が高まる。
- 大規模なデータセットを扱う場合、AugmentorとPreprocessorはストリーム処理でメモリ効率を意識する。
- 特にEstimatorはメモリ消費が大きいため、メモリ最適化（バッチサイズ調整、GPUメモリ管理）が重要となる。

上記のパイプライン設計により、保守性が高く効率的なMLOpsの実践が可能となります。
【AWS】DynamoDB

# はじめに
AWS DVA取得に向けた勉強の一環です。
新たな学びがあったら随時追記していきます。

正確性は保証しませんので参考程度に見てください。

# 特徴
- フルマネージドの Key-Value データベース
- NoSQL（SQLライクな言語 PartiQL 使用可能）
- サーバーレス
- 優れた水平の拡張性
- 3つのAZにデータ保存

# データモデル
## Primary Key
- パーティションで分散管理、ソートで並び替え
- Partition Key（主キー）
  - アクセス分散のためランダム値を推奨  
  - 日付などを使う場合はサフィックスを付与  
- Sort Key
  - 複合主キーとして使用可能  
- Attributes（属性）

# キャパシティモード
- オンデマンドキャパシティモード  
  - 使用量と価格が変動
- プロビジョンドキャパシティモード  
  - 使用量と価格が固定  
  - Auto Scaling 設定可能  

# コスト
- 読み込み・書き込みは従量課金
- データ転送に課金
- バックアップ・復元は GB 単位で課金
- レプリケート書き込み要求にも課金
- 変更データのキャプチャ
- DynamoDB Accelerator (DAX)
  - 1時間あたり課金
  - キャッシュにより読み取りを高速化（ミリ秒 → マイクロ秒）
  - 書き込みはキャッシュとDynamoDBテーブルの両方に適用
- DynamoDB Streams
  - 直近24時間のCUD変更履歴を保存
  - Lambdaと連携して変更検出や通知が可能
  - グローバルテーブルの利用に必要

# セカンダリインデックス
## ローカルセカンダリインデックス（LSI）
- 元テーブルと同じパーティション内で検索を完結
- テーブル作成時のみ設定可能
- パーティションキーごとのインデックスサイズ上限は 10GB

## グローバルセカンダリインデックス（GSI）
- 主キーとは別の属性を使ったインデックス
- 後から設定可能

## デメリット
- 書き込みコストが高くなる
- ストレージを消費する

インデックスの多用は推奨されず、多用する場合は RDS を検討するのが望ましい。  
検索性向上とストレージ・パフォーマンスのトレードオフを考慮する必要がある。

# グローバルテーブル
- 任意のリージョンにレプリカテーブルを作成できる

# 書き込み
- 1秒以内に3つのAZにレプリケートされ、結果整合性が保たれる

# 強力な整合性の読み込み
- 変更が反映されたデータを返す
- レイテンシが高くなる
- スループット消費が大きくなる

# API
- 基本操作
  - PutItem
  - UpdateItem
  - GetItem
  - DeleteItem
- 検索
  - クエリ（検索結果の配列を返す）
  - スキャン（全項目を走査するため時間がかかる）
- バッチ処理
  - BatchWriteItem / BatchGetItem（大量データの書き込み・読み込み）
  - 途中で失敗しても最後まで処理を継続
- トランザクション
  - 複数のアクションをまとめて処理
  - All or Nothing（一つ失敗した場合はすべて失敗）

# バックアップ
## オンデマンドバックアップ
- 任意のタイミングで取得
- 数秒で復元可能
- 明示的に削除しない限り保持

## ポイントインタイムリカバリ（PITR）
- 5分おきにログを取得
- 最大35日前のログまで保持

# 復元
- 既存のテーブルではなく新規テーブルとして復元
- 復元時に設定変更可能
  - セカンダリインデックス
  - キャパシティモード
  - WCU / RCU
  - 暗号化
- 復元後に設定が必要
  - Auto Scaling
  - IAMポリシー
  - CloudWatch
  - タグ
  - ストリーム設定
  - TTL

# セキュリティ
- IAMによるアクセス制御
  - テーブル、インデックス、ストリームごとに ARN を持つ
- 暗号化
  - DynamoDB管理、AWS KMS、ユーザー管理による暗号化が使用可能
#0068（2024/03/10) fit, transform

## **`fit` と `transform` の役割**
`Transformer` と `Estimator` の中で `fit` と `transform` が実装されているということは、**Scikit-learn のパイプラインの設計思想**に近いものと考えられる。  
それぞれの役割を詳しく見ていく。

---

## **1. Transformer における `fit` と `transform`**
**`Transformer` の役割:**  
データを特徴空間に変換する（特徴抽出・次元削減・エンコーディングなど）

### **(1) `fit` の役割**
- 学習データを元に、変換に必要なパラメータを学習する
- 例:
  - **PCA**: 主成分の方向を計算
  - **標準化（StandardScaler）**: 平均と標準偏差を計算
  - **トークナイザー**: 語彙リストを作成

```python
scaler = StandardScaler()
scaler.fit(X_train)  # X_train の平均と標準偏差を計算
```

### (2) `transform` の役割
- fit で得たパラメータを使って、新しいデータを変換する
    - 例:
        - PCA: 主成分にデータを射影する
    
        - 標準化: 平均0、標準偏差1にスケール変換
        - トークナイザー: 文章をIDベースのベクトルに変換


``` python
X_train_scaled = scaler.transform(X_train)  # 標準化を適用
X_test_scaled = scaler.transform(X_test)  # 同じ変換を適用
```

### Transformer の `fit_transform`

多くの Transformer では fit の後に transform をすぐ実行することが多いため、fit_transform が用意されている。

``` python
X_train_scaled = scaler.fit_transform(X_train)
```


## 2. Estimator における `fit` と `transform`

Estimator の役割:
学習・推論を担当する（機械学習・ディープラーニングモデル）

### (1) `fit` の役割
- 学習データを元にモデルのパラメータを最適化する（モデルの学習）
    - 例:
        - 決定木: 分岐ルールを決定
        - ニューラルネット: 重みを最適化
        - 回帰分析: 回帰係数を計算

``` python
model = LinearRegression()
model.fit(X_train, y_train)  # 学習
```

### (2) `transform` の役割
- Estimator で transform を実装する場合、以下のような処理を行うことがある。
    - 教師なし学習モデル（PCA、クラスタリング）
- transform は新しいデータを変換する（例: PCAの次元削減）
    - 教師あり学習モデル（通常は predict）
- transform は学習済みのモデルを使って新しいデータに変換を適用する
    - 例: ニューラルネットのエンコーダ部分（特徴抽出器）

``` python
X_train_pca = pca.fit_transform(X_train)  # 主成分分析を適用
X_test_pca = pca.transform(X_test)  # 新しいデータにも適用
```

## **3. `fit` と `transform` の関係性**

### **Transformer**
- `fit` → データに基づいて変換ルールを決める
- `transform` → 決まったルールを使ってデータ変換を適用
- **例:** `StandardScaler`, `PCA`, `Word2Vec`

### **Estimator**
- `fit` → モデルの学習（パラメータ最適化）
- `transform`:
  - **教師なし学習のモデル**（PCA, クラスタリング）では特徴変換を行う
  - **教師あり学習のモデル**（ニューラルネット、回帰）では通常 `predict` を使う

教師あり学習の `Estimator` では通常 `transform` は使わず `predict` を使用する。

---

## **まとめ**

### **Transformer**
- `fit`: 変換に必要なパラメータを学習
- `transform`: そのパラメータを使ってデータを変換
- **例:** 標準化（`StandardScaler`）、次元削減（`PCA`）、テキスト埋め込み（`Word2Vec`）

### **Estimator**
- `fit`: モデルを学習
- `transform`:
  - **教師なし学習のモデル**（PCA, クラスタリング）では特徴変換を行う
  - **教師あり学習のモデル**（ニューラルネット、回帰）では通常 `predict` を使う

つまり、
- **`Transformer` は “データ変換” に焦点を当てる**
- **`Estimator` は “学習と推論” に焦点を当てる**

この設計は **Scikit-learn の `Pipeline`** でも使われており、MLOps のパイプラインを構築する際に非常に便利な設計パターンである。