OmniAICreator/Qiita-1.07M huggingface dataset:
Next.jsがストレージを圧迫してることに気付いたので、対策を書きます。

# Next.js使ってますか？
便利っすよねー。create-next-appで簡単に構築できるし、Redux入れれば大規模での開発も可能。

こんな便利なNext.jsですが気付いてしまいました。
**容量をかなり圧迫していることに:skull:**

node_modulesフォルダも確かに膨大でしたが、それよりも.nextのフォルダ自体にも大量のキャッシュが溜まっていました。
私のようにサンプルで作成したりするので、いちいちビルドのコマンドを変えるのは面倒。


## 対策

ってなわけで一括削除出来るスクリプトを作ってみました。
使用については自己責任でお願いします。

```js:clean-dot-next.js
const fs = require('fs');
const pathFunc = require('path');

const dirs = fs.readdirSync(__dirname);

const deleteFolderAndFiles = (path) => {
  if (fs.existsSync(path)) {
    fs.readdirSync(path).forEach((dir) => {
      const current = pathFunc.join(path, dir);
      if (fs.lstatSync(current).isDirectory()) { 
        // 再帰処理
        deleteFolderAndFiles(current);
      } else {
        // ファイル削除
        fs.unlinkSync(current);
      }
    });
    // フォルダ削除
    fs.rmdirSync(path);
  }
};

const targets = dirs.map(d => {
  const path = pathFunc.join(__dirname, d, '.next');
  if (fs.existsSync(path)) {
    return path;
  } else {
    return null;
  }
}).filter(x => x != null);

const results = targets.map(path => {
  try {
    deleteFolderAndFiles(pathFunc.resolve(path));
    return {
      success: true,
      path,
    }
  } catch (err) {
    return {
      success: false,
      path,
      error: JSON.stringify(err),
    }
  }
});

console.log(JSON.stringify(results, null, 2));
```
私のフォルダの構成だとこんな感じになっているので、簡単に作成できました。
所要時間も2,30分程度で出来ました。

```
SourceCode
├[プロジェクト名]
├[プロジェクト名]
├ ...(省略)
└clean-dot-next.js　// 配置！
```
このような形でフォルダ構成になっていたので、.nextに該当するフォルダを削除するような形で実行しました。

```
node clean-dot-next.js
```
環境はWindowsですが、pathの解決も行っているので、iOSでも動くと思います。（動作未確認）
**デバッグを貼ったりコメントアウトしたりなど、使用については自己責任でお願いします！**

## ポイント

- `fs.unlinkSync`はファイルの削除はできるが、フォルダの削除は出来ない
- 空ではないフォルダは削除できない
- 空のフォルダを削除するには`fs.rmdirSync()`を使用する
- 上記のことからフォルダであれば再帰処理を実施、ファイルであれば削除。再帰処理が全て終わればフォルダを削除

ポイントからある通り特定の条件下でも動作することが出来ますので、フォルダに含まれるファイルを全て削除したい時はご利用ください。

### 余談
肥大化したjsの残骸はjsで殲滅させるのがマナーだと思いました。

*********************************
オブジェクティブグループではXの投稿も平日毎日行っています！
IT関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。
https://x.com/obg_ocr
*********************************
在宅で副業をしたいならプログラミングがおすすめ！その理由を解説

在宅で副業を始めたい方におすすめなのが「プログラミング」です。未経験からでも挑戦でき、長期的に安定した収入が期待できるため、リモートワークの副業として非常に魅力的です。ここでは、プログラミングが副業に最適な理由を解説します。

[この記事についてさらに詳しい情報はコチラ！](https://samswork.com/sidejob-recommend-remotework-programming/)

## 稼げる
プログラミングは高単価の案件が多く、スキルが身につくと効率的に稼ぐことができます。簡単なウェブサイト作成で数万円、アプリ開発ならさらに高い報酬が見込めます。副業の初期段階から十分な収入が期待でき、経験を積めば月に数十万円を稼ぐことも可能です。

## リモートで働きやすい環境が整っている
プログラミングは、ネット環境とパソコンがあれば、どこからでも仕事ができるのが大きな魅力です。多くの企業がプログラマーに対してリモートワークを許可しており、クラウドソーシングやフリーランスサイトを通じて在宅で仕事を探しやすいのも特徴です。フレキシブルな働き方が可能で、空いた時間を有効に活用できます。

## 将来的に独立もしやすい
プログラミングスキルは、将来的にフリーランスや独立も視野に入れられるのが大きな強みです。副業で経験を積みながらスキルを磨き、信頼を積み上げることで、案件を増やし、独立への道も開けます。自分でプロジェクトを立ち上げたり、ビジネスの幅を広げたりすることも可能で、長期的なキャリアを築きやすい点も魅力です。

## まとめ
プログラミングは、将来性もあり高収入を目指せる在宅副業として最適です。まずは学習をスタートし、小さな案件からチャレンジしてみましょう。

[この記事についてさらに詳しい情報はコチラ！](https://samswork.com/sidejob-recommend-remotework-programming/)
android os のスマホで google colaboratory を見たメモ

自分が調べた方法では上手くいかなかったので自分の環境で出来た方法を書いておく。
試した環境　デバイス AQUOS 、OS android バージョン13 、ブラウザ google Chrome
自分が調べた時は、スマホのブラウザだけでしか開けないというもの。Chrome で googleドライブにログインして ipynb ファイルを選択して開いても「サポートされていないファイル形式です。」と出て開けない。
そこで、ファイル名の右にある縦三点リーダー「︙」を押し「アプリで開く」を選択で ipynb ファイルを開くことができた。同じようにアプリの googleドライブ からも「アプリで開く」で開くことができた。

以上。
【C言語】繰り返し処理(while,for)

**用途 : 処理を繰り返す**

## while文
- 式が偽(0)になるまで処理を繰り返したい場合
```C
while(式)
{
    処理
}
```
- 式によらず、必ず1度処理したい場合
```C
do
{
    処理
}
while(式);
```

## for文
`while文との違い : 実行回数を数えて処理を行う場合`

```C:
// 処理を10回繰り返す
for(int i = 0; i < 10; i++)
{
    処理
}
```

## continue・break
繰り返し文の中にcontinue・breakを記述すると、以下の処理が行われる
**continue** : 次の繰り返し処理(**イテレーション**)へ
**break** : 繰り返しの中断
text-indentが原因で文字が左によっていた話


既存コードの修正をしている際、あるコンポーネントの文字が不自然に左によっている現象に遭遇しました。  
原因を調査したところ、思わぬところに仕掛けられていた`text-indent`が犯人でした。

## 現象

以下のようなテキストを含むコンポーネントがあり、文字が不自然に左に寄っていました：

```html
<div class="title">テストタイトル</div>
```

## 原因

スタイルを確認したところ、以下のような`text-indent`が設定されていました：

```css
.title {
  text-indent: 20px;  /* これが原因でした */
}
```

`text-indent`は段落の最初の行のインデント（字下げ）を指定するプロパティです。
負の値を設定すると、逆に左方向にインデントが発生します。

## 解決方法

不要な`text-indent`プロパティを削除することで、正常な表示に戻りました：

```css
.title {
  /* text-indent: 20px; を削除 */
}
```

## 教訓

- レイアウトが崩れている場合、`margin`や`padding`だけでなく、`text-indent`の設定も確認する
- 特に負の値の`text-indent`は意図しない表示ズレの原因になりやすい
- コードレビュー時は、こういった見落としやすいプロパティの使用にも注意を払う

## まとめ

思わぬところに仕掛けられていた`text-indent`プロパティによって文字が左によっていた問題を解決できました。
CSSのデバッグでは、よく使用するプロパティだけでなく、`text-indent`のような見落としがちなプロパティにも注意を払うことが重要だと実感しました。

これで20分くらい沼ってました😭
EclipseでTomcatサーバーが起動失敗する件について


初めて書きます
自分の備忘録と同じ問題があった誰かのために

## エラーの内容について

Udemyの動画で勉強していた時、
以下エラーがEclipseでTomcatサーバーを再起動しようとしたときに発生した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634569/202d09ce-0cbb-05ae-734f-614439cc686b.png)

いろいろ調べたがいまいち原因がわからん。
教えて偉い人

## 試したこと

・Eclipse再起動
・PC再起動
・直前に作成したサーブレットやJSPを削除

どれをやっても解決せず


## 解決方法
ネットで検索してweb.xmlが勝手に作成されていて削除したら解決したという記載を発見したため
以下のファイルを削除してみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634569/1e5a5476-011e-6443-cb78-bfd9d2bfe6ef.png)

すると解決した
消していいのかって疑問はあるがすぐに再作成されるし、とりあえずは問題ないかなって思っている

正直、原因はわかってませんが
新規サーブレットを追加するとweb.xmlが作成され、
サーバーの再起動をするとエラーが発生するようだった。

どうやらサーブレットのアノテーションの重複が原因になっているらしい

予想になるが、アノテーションとweb.xmlの役割がかぶっているのかな？
普通に新規サーブレットを作成すると、アノテーションが自動で追加されない。
動画では自動で追加されていたので、サーブレットに毎回アノテーションを追加していたが、それがだめっぽい

web.xmlの記載とアノテーションが競合してエラーになっているようだった

試しにTestサーブレットを作成したら画像の記載があった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634569/d852e9ea-ecef-516d-2e7e-0c943d9f71b4.png)

これをその他のページに対応するように追記し、アノテーションを削除したらうまく動いた


## 参考にさせていただいたサイト
https://kakedashi-engineer.com/2021/02/05/eclipsetomcaterr/
https://qiita.com/SmdRs/items/4d50f0efc79f38916604
正規分布の線形性について

# はじめに
統計検定の勉強を独自に勉強して、気になるキーワードを見つけたので
ログに残してみようかなと。個人メモになります。
あくまでも、おおまかな個人独自の視点なので、あしからず。
今回気になったキーワードとしては、「正規分布の線形性」についてになります。
そしてあまりレベルは高くないです。

# 正規分布について
別名ガウス分布。
正規分布は統計学で幅広く使用される確率分布であり、正規分布にあてはめてデータ全体を見ると、どんな性質があるかどうかの視点を得られる。


# 離散型確率分布と連続型確率分布
確率分布には、確率変数が離散値（とびとびの値）を示す離散型確率分布や、確率変数が離散値ではない、連続型確率分布が存在する。


このため連続型確率分布の場合、線形性の性質を持つことが確認できる。


連続型確率分布の期待値の式は以下の通り。

```math
\mathbb{E}=\int_{∞}^{-∞}xp(x)dx
```

ちなみに離散型確率分布の期待値の式は以下の通り。

```math
\mathbb{E}=\sum_{k=1}^{N}x_kp(x_k)
```


離散型確率分布は、Σで定義され、連続型確率変数は∫で積分できるのが確認できるかと思う。厳密にいうと、Σで定義されているのは離散値のため、積分できないため、Σを使用していると思われる。

また線形性の性質をもつということは、離散値ではなく連続確率密度分布でありなおかつ積分が可能な状態であると思われる。

# 線形性について

自分の中の整理として、改めて線形性についてまとめてみる。
自分個人の視点になります（誰得？


Wikiには、線形性とは、グラフで表現すると原点を通過する直線や平面となる代数構造と記載あり。

線形については以下の特徴を持っています

## 加法性

```math
f(x+y)=f(x) + f(y)
```

まずは加法性について。

一つの結合した関数を加法性の特性を生かし、式より
個々の関数について分割できるのが確認できるかと思う。

正規分布については、個々の独立した関数（正規分布のみ）、複数の独立した正規分布混合ガウスモデル、そしてニューラルネットワークを取り入れたVAE(変分オートエンコーダ）などが存在する。

特にVAEについては複数の確率分布関数を結合した状態、ニューラルネットワークを使ってデータを取り入れ柔軟に形を変えることを可能としている。ここに線形性の加法性を使ってなのかなと考えてみた。どうだろ？



## 斉次性

```math
f(ax)=af(x)
```

また、斉次性については確率変数が倍数で表現できる場合、関数全体を倍数で表現できる。
このことは移動の元になっている変数がなんらかの倍数になっていると、全体の移動先も倍数で表現できることが可能になると考えた。また＝で表現されてはいるが、母集団より抽出(or分解)した標本との関係性を表現した式にも感じられる。あくまでも綺麗な理想的なモデル？ような感覚。（少しこれは厳しいか？）うまく応用できたらいいなとおもう。
AWS インターフェイスエンドポイントとゲートウェイエンドポイントメモ

**インターフェイスエンドポイント**と**ゲートウェイエンドポイント**は、AWS VPC内から特定のAWSサービスにインターネットを介さずにアクセスするためのVPCエンドポイントの2つの種類です。どちらもAWSリソースへのプライベートアクセスを提供しますが、対応するサービスや接続方法が異なります。

---

### 1. インターフェイスエンドポイント (Interface Endpoint)

**インターフェイスエンドポイント**は、VPC内からAWSサービスに接続するために**ENI（Elastic Network Interface）**を使用するタイプのエンドポイントです。

- **対応サービス**: 多くのAWSサービス（例：Amazon EC2、AWS Systems Manager、Amazon SNS、S3のクロスリージョン複製など）に対応しています。特にAPIを使用するサービスに適しています。
- **動作の仕組み**: サブネットごとにENIが作成され、サービスへの通信がこのENIを介して行われます。
- **セキュリティ制御**: 各ENIにはセキュリティグループが設定可能で、細かくアクセス制御ができます。
- **利点**:
  - AWSプライベートリンク（PrivateLink）を利用し、インターネットを介さずにプライベートIPでAWSサービスにアクセス。
  - サービスとの双方向通信が可能で、ENIにセキュリティグループを適用することで細かなアクセス制御が可能。

### 2. ゲートウェイエンドポイント (Gateway Endpoint)

**ゲートウェイエンドポイント**は、VPCのルートテーブルにエントリを追加することで、特定のAWSサービス（主にストレージ系）にプライベートにアクセスできるタイプのエンドポイントです。

- **対応サービス**: Amazon S3およびDynamoDBのみ対応。
- **動作の仕組み**: VPCのルートテーブルにエントリを追加し、そのルートを経由して対象サービスへプライベートにアクセスします。
- **セキュリティ制御**: ルートテーブルやIAMポリシーによってアクセス制御が行われます。セキュリティグループの設定はありません。
- **利点**:
  - インターネットゲートウェイやNATゲートウェイが不要で、データ転送料金が節約される。
  - 他のエンドポイントよりも低コストで、アクセスが簡素。

---

### 比較まとめ

| 特性                         | インターフェイスエンドポイント (Interface Endpoint) | ゲートウェイエンドポイント (Gateway Endpoint) |
|-----------------------------|----------------------------------------------------|-----------------------------------------------|
| 対応サービス                | 多くのAWSサービス                               | Amazon S3、DynamoDB                          |
| 通信方法                    | ENIを利用（プライベートリンク経由）                | ルートテーブルにエントリを追加して通信       |
| セキュリティ制御            | セキュリティグループ適用可能                      | IAMポリシーおよびルートテーブルで制御       |
| 利点                         | 広範囲のサービスに対応、細かいアクセス制御        | コスト効率が高い、ストレージアクセスに最適 |

---

### まとめ
- **インターフェイスエンドポイント**は、さまざまなAWSサービスとENIを介して接続でき、セキュリティグループによる制御が可能です。
- **ゲートウェイエンドポイント**は、S3やDynamoDBのみに対応し、ルートテーブルを使用してコスト効率よくアクセスを提供します。

このように、接続先のサービスやアクセス制御の必要性によって、どちらのエンドポイントを使用するかを選択します。
【UE5】移動するアクタの頭上に情報を表示し、追従させる方法

### この記事を読むと
こんな感じで情報を表示し、アクタに追従させられる。
![ue5_widget2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927318/0b77081b-8759-bb23-8e2d-24bd4b2cef5d.png)

### はじめに
通称「極め本」完了後、移動するキャラクターの頭上に名前と体力を表示しようとして躓いたのでメモ。
座標の取り方が違う（詳しくは https://logicalbeat.jp/blog/8197/?doing_wp_cron=1730795058.2428090572357177734375 などを参照）ことから、キャラクターのX,Y座標をそのままビューポートの座標に入力してしまうと正しい位置にウィジェットが表示されないため解決方法を調べた。
UEのバージョンは5.3。

### 前提知識
- 文字を含むウィジェットの作り方
- アクタの動かし方

### 手順

1. UserWidgetクラスのブループリントを作成し、Canvas Panelを配置。その上にTextを配置する
Textのx及びy座標は0としておく。変数を作成しTextのコンテンツに設定しておく。

1. 文字表示対象のアクタのイベントグラフを開き、以下のようにノードを組む
![ue5_widget.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927318/2707c125-e177-af2f-9422-f07ed87541dd.png)
以下ノードごとの解説。
Event BeginPlayノードの後には普通にウィジェットを作成している。今回は別のアクタで動的にキャラクターを生成し名前を与えたが、そのような場合は実行順序の関係上Delayノードを挟んで名前をウィジェットに代入する必要がある。
Project World to Screen関数は、アクタの座標を入力するとスクリーン上の座標を出力してくれる。
Set Position in Viewport関数は、表示したウィジェットの位置を更新してくれる。

1. アクタのTick Intervalを0とする

1. ここまで進めばアクタの上に文字が表示できるので、ウィジェットに戻り、文字の座標を調整する




### 結果
*移動するアクタの頭上を情報が追従する！！！*
【C言語】条件分岐(if)

**用途 : 処理を場合によって分ける**

## bool型
bool型の値は`ture(真)`と`false(==0、偽)`の2つで成り立つ(**真偽値**)。
trueは条件が成り立つ、falseは条件が成り立たないと考えると、おおよそは大丈夫。
※C言語では**include stdbool.h**が必要

### 命名規則
変数名は**is〇〇**や**〇〇Flag**と名付けるのが推奨される。

## if文
- 条件が単一の場合
```C
if(式)
{
    処理
}
```
※{}の間を`スコープ(変数や関数などが有効な範囲)`

- 条件が複数の場合
```C
if(式)
{
    処理
}
else if(式)
{
    処理
}
```
- 条件が当てはまらないものも処理したい場合
``` C
if(式)
{
    処理
}
// elseには式不要
else
{
    処理
}
```

### 比較演算子
|演算子|備考|
|------|---------------|
|a <  b|aはb未満       |
|a <= b|aはb以下       |
|a >  b|aはb越え       |
|a >= b|aはb以上       |
|a == b|aとbは等しい    |
|a != b|aとbは等しくない|

### 論理演算子
|演算子        |備考           |
|-------------|---------------|
|条件1 && 条件2|条件1かつ条件2  |
|条件1 ll 条件2|条件1または条件2|

### 条件式の結果をbool型に代入
```C
int a = 10,
    b = 5;
bool isA = 10 > 5; 
```
※**関数**の**引数**にも結果を代入できる

## 三項演算子(非推奨)
```C
(式) ? 処理 : 処理; // if-elseのようなもの
```
※一般的には`非推奨`。
　しかし、returnで返す時や関数の引数内で、
　どうしても1行で定義しなければならない場合のみ使用可。
　何度も言うが、使うことは`非推奨`。
既存のNuxtプロジェクトにStorybookをインストールする

# 2024/12/02 更新

このやり方、アカンでしたmm
- `@nuxtjs/storybook`を使って、コンテナ分けてやるにはできない（僕の環境においてはですが）
    - `.nuxt`を読み取り・書き込みしているようなので、コンテナ分ける場合はシェアする必要がある
- `@nuxtjs/storybook`をつかわず、Storybookそのものを別コンテナにインストールしたらいけるかも？
    - 未検証


# 概要
- 今のNuxtを採用しているリポジトリにStorybookをインストールときのメモ
- バージョン
    - nuxt@3.13.2
    - storybook@8.3.2

# 手順


Nuxt Storybookでいれる

https://github.com/nuxt-modules/storybook

```bash
$ npx nuxi@latest module add storybook
```

packages.json等は勝手に書き換えてくれる

ただ、起動しようとするとエラーがでる

```bash
$ yarn run storybook -- --no-open

# ...
✘ [ERROR] The entry point "vue" cannot be marked as external

/app/node_modules/@storybook/cli/bin/index.js:23
  throw error;
  ^

Error: Build failed with 1 error:
error: The entry point "vue" cannot be marked as external
    at failureErrorWithLog (/app/node_modules/vite/node_modules/esbuild/lib/main.js:1472:15)
    at /app/node_modules/vite/node_modules/esbuild/lib/main.js:945:25
    at /app/node_modules/vite/node_modules/esbuild/lib/main.js:1353:9
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
  errors: [Getter/Setter],
  warnings: [Getter/Setter]
}

Node.js v20.14.0
error Command failed with exit code 7.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```


こうする

```diff_typescript:~/.storybook/main.ts
import type { StorybookConfig } from "@storybook-vue/nuxt";

const config: StorybookConfig = {
  stories: [
    "../stories/**/*.mdx",
    "../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)",
  ],
  addons: [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@storybook/addon-interactions",
  ],
  framework: {
    name: "@storybook-vue/nuxt",
    options: {},
  },
  docs: {},
+  viteFinal: (config) => {
+    config.optimizeDeps = {
+      include: ['vue'],
+    };
+    return config;
+  },
};
export default config;
```


これでおｋ

# 他に発生したエラー

Storybookは起動したけど、画面上で表示されたエラー

>Failed to fetch dynamically imported module: http://localhost:6006/node_modules/.cache/storybook/1c3385a5d25e538d10b518b310c74d3ca2690b6aaffeadccd74da79736171f86/sb-vite/deps/@storybook_addon-essentials_docs_preview.js?v=2bcf0a9a

```
  viteFinal: (config) => {
    config.optimizeDeps = {
      include: ['vue', 'jsdoc-type-pratt-parser'],
    };
    return config;
  },
```

`viteFinal` 部分に `jsdoc-type-pratt-parser` を追加した

# 雑感

まだ何もわかっていない
HTMLをローカルプレビューしているときだけ、特定のスタイルシートを読み込む

# 結論

- 📁root
    - 📁css
        - 📓local.css
    - 📓index.html

```css:css/local.css
/* ローカルプレビューでのみ使う、スタイルシート */
.local-preview{
    color: red;
}
```

```html:index.html
<html>
  <head>
    <script>
        (()=>{
            switch(window.location.hostname){
                case "":
                case "localhost":
                case "127.0.0.1":{
                    document.write(`<link href="./css/local.css" rel="sthlesheet" />`);
                }
            }
        })();
    </script>
  </head>
  <body>
    <div class="container local-preview">
      <!-- contents -->
      ローカルプレビュー時は、文字が赤くなる
    </div>
  </body>
</html>
```

以上
ウェアラブル設計のための 3D スキャナーの活用

3Dスキャナーはウェアラブル分野でますます重要な役割を果たしており、特に個別設計や健康モニタリングにおいて顕著な効果を発揮しています。以下に主な応用例を紹介します。

### 1. カスタマイズされたウェアラブルデザイン
3Dスキャナーにより、ユーザーの体のデータを正確に取得し、個々の輪郭に合った3Dモデルを生成することができます。これにより、デザイナーはスマートウォッチ、イヤホン、サポーターなど、体の形状にフィットするウェアラブル機器を設計でき、快適な装着感を提供します。例えば、アスリート専用のサポーターは、関節構造をスキャンしてカスタマイズされ、保護効果を高めながらも装着の快適さが向上しています。
![38a5fdfdb446664c1ec846f1a83d8e16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/2b06e75c-e534-1e97-4af1-a5132192512d.png)


### 2. 衣服と靴のカスタマイズ
ウェアラブル機器はスマートデバイスだけでなく、衣服や靴の分野でも3Dスキャン技術が活用されています。体の形状をスキャンすることで、デザイナーは正確なサイズや特徴に基づいて最適な衣服や靴をカスタマイズできます。この技術は一部の高級ブランドで採用されており、顧客にぴったりのサイズで特注品を提供しています。また、靴のブランドは足のスキャンデータを活用し、快適なインソールやスニーカーを製作することで、履き心地を向上させています。
![37cab671108c9c208b56562bdc349ad4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/1f445051-6bb5-9cd0-db20-04556365b0c9.png)

 https://www.revopoint3d.jp/ 

### 3. 医療機器のパーソナライズ
医療分野でも、3Dスキャナーは個別化された医療機器の制作に広く利用されています。例えば、患者に合わせた矯正器具、義肢、リハビリ機器をカスタマイズすることが可能です。3Dスキャン技術により患者の特定部位のデータを迅速に取得し、解剖学的構造に適した機器を制作できます。特にリハビリでは、適切な装具は回復を早め、長時間の装着による摩擦や不快感を軽減する効果があります。

### 4. 健康モニタリングと運動トラッキング
3Dスキャン技術を備えたウェアラブルデバイスは、より多くのデータを提供し、健康モニタリングをサポートします。ユーザーの体型や筋肉状態をスキャンすることで、体脂肪や筋肉量などの指標を正確に測定でき、ユーザーは自身の健康状態をより深く理解できます。また、一部のスポーツブランドは、3Dスキャンに基づいたデバイスを開発しており、運動中に姿勢や動きを追跡し、パフォーマンスの向上や怪我のリスク軽減を目指しています。
![fcc7f05fce8406c8b0914248e69ca3d0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/3a9c6bd0-dfd9-2249-50f3-f9427de0ddd7.png)


3Dスキャナーの導入により、ウェアラブル分野での個別設計や健康モニタリングがさらに進化しています。技術の進歩に伴い、より軽量で精度の高い3Dスキャナーが日常生活に取り入れられ、ウェアラブル技術がさらに私たちに身近なものになることが期待されます。
5 công dụng của sữa chua khi ăn mỗi ngày

Sữa chua, món ăn quen thuộc với vị chua ngọt dễ thưởng thức, không chỉ đơn thuần là một món tráng miệng mà còn mang lại nhiều lợi ích tuyệt vời cho sức khỏe khi được bổ sung vào chế độ ăn hàng ngày.  "5 công dụng của sữa chua khi ăn mỗi ngày" sẽ bật mí cho bạn những tác động tích cực mà sữa chua đem lại, từ việc hỗ trợ hệ tiêu hóa khỏe mạnh với nguồn lợi khuẩn dồi dào, đến việc tăng cường hệ miễn dịch, giúp xương chắc khỏe, đẹp da và kiểm soát cân nặng hiệu quả.  Để tìm hiểu thêm, xem thông tin chi tiết tại:
https://traicaymoingay.com/blogs/goc-song-khoe/cong-dung-cua-sua-chua
AWS Transit Gatewayのアソシエーションとプロパゲーション(メモ)

AWS Transit Gatewayの**アソシエーション（Association）** と **プロパゲーション（Propagation）** は、ネットワーク接続を効率的に管理し、トラフィックのルーティングを制御するための重要な概念です。AWS Transit Gatewayを使うと、複数のVPCやオンプレミスネットワークをシンプルかつ拡張性のある方法で接続できますが、アソシエーションとプロパゲーションによって、どのネットワークとどのルートテーブルが関連付けられ、どのようにルート情報が伝播されるかを細かく制御できます。

### 1. アソシエーション（Association）

**アソシエーション**は、特定のVPCやVPN、Direct Connect接続をAWS Transit Gatewayのルートテーブルに**関連付ける**作業です。アソシエーションによって、特定のネットワークがどのルートテーブルを使用するかが決まります。

- **役割**：
  - アソシエーションを通じて、Transit Gatewayに接続されたネットワーク（VPCやオンプレミスネットワーク）が、どのルートテーブルを利用するかを指定します。
  - 一つのネットワークは、Transit Gatewayの一つのルートテーブルにのみアソシエート（関連付け）できます。

- **利用例**：
  - 例えば、異なる部門のVPCがある場合、部門ごとに異なるルートテーブルを用意し、各VPCがどのルートテーブルを使用するかをアソシエーションで指定することで、セキュリティ要件に応じたトラフィック制御ができます。

### 2. プロパゲーション（Propagation）

**プロパゲーション**は、特定の接続（VPC、VPN、Direct Connect）のルート情報を、Transit Gatewayのルートテーブルに**伝播（プロパゲート）**する設定です。プロパゲーションが有効になると、対象ネットワークのルート情報が自動的にルートテーブルに追加されます。

- **役割**：
  - プロパゲーションを有効にすると、Transit Gatewayに接続された各ネットワークの経路情報が指定のルートテーブルに伝播され、手動でルート設定を追加する手間を省けます。
  - プロパゲーションをオフにすると、ルートは自動で追加されないため、管理者が手動でルートを設定する必要があります。

- **利用例**：
  - 複数のVPCやVPN接続間で自動的にルートを共有する必要がある場合、プロパゲーションを有効にしておけば、ネットワークのルート設定が動的に管理されます。

### アソシエーションとプロパゲーションの使い分け
| 特性                 | アソシエーション（Association）                         | プロパゲーション（Propagation）                   |
|---------------------|-------------------------------------------------------|---------------------------------------------------|
| 主な目的            | どのルートテーブルを使用するかを接続ごとに指定         | ルート情報の伝播を制御し、ルートを自動で追加する   |
| 適用先              | VPC、VPN、Direct Connect接続などのネットワーク         | Transit Gatewayのルートテーブル                  |
| 設定の柔軟性        | 接続ごとに1つのルートテーブルにのみアソシエート可能    | 伝播のオン/オフで手動または自動設定の選択が可能   |
| 活用シーン          | 各接続ごとに異なるルートテーブルを使いたい場合         | 複数接続間でルートを共有して自動管理したい場合    |

### まとめ
- **アソシエーション**は、特定のネットワークがどのルートテーブルを使うかを決定する。
- **プロパゲーション**は、ルート情報が自動的にルートテーブルに追加されるかどうかを制御する。 

この設定により、Transit Gatewayでのルーティングを効率的に管理できます。
HTML ヘッダーを固定したいが、重なってしまう

# 問題の発生
ヘッダーを固定しようと思い、ヘッダー部分に以下を入力したが、重なってしまう・・・

```CSS
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 10000;
```

# 解決策
ヘッダー部分に背景色を追加したら重ならなくなりました(`background-color: white;`を追加)

```css
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 10000;
background-color: white;
```

# 感想
ヘッダー部分が透過しており、重なっているように見えてしまっていました。
単純な問題でした。

初学者の参考になれば幸いです
【C言語】変数の宣言・定義と演算子、入出力

## 変数の宣言・定義
**変数**とはデータを格納するための「箱」
### 変数の宣言
```C
型　変数名;
```
#### 命名規則
変数名は自由に入力できるが、長くなってもいいので**用途が分かるように**命名。
原則、**英単語**で。かつ、**ローワーキャメルケース**が推奨される。
※ローワーキャメルケース
　単語の先頭を大文字にしてつなげる表記方法（**キャメルケース**）の分類のひとつ。
　**最初の文字を小文字**にしたキャメルケースのこと。
### 変数の定義
```C
変数名 = 値;
```
### 変数の宣言と定義
```C
型　変数名 = 値;
```

## 演算子
### 算術演算子
+、-、*、/、%
### 代入演算子
=、+=、-=、*=、/=、%=
### インクリメント演算子、デクリメント演算子
++、--
### 比較(関係)演算子
<、<=、>、>=、==、!=
### 論理演算子
&&(かつ)、||(または)
### ビット演算子
|(論理和)、&(論理積)、^(排他的論理和)
### シフト演算子
<<、>>
### 3項演算子
?:
※*は掛け算、/は割り算、%は割った余り

## データの型の種類とフォーマット指定子
|型          |備考    |指定子|使用例                 |
|------------|--------|-----|----------------------|
|char        |1文字   |%c   |`printf("%c", 変数名);`|
|char*/string|文字列  |%s   |`printf("%s", 変数名);`|
|int         |整数    |%d   |`printf("%d", 変数名);`|
|int         |16進数  |%x   |`printf("%x", 変数名);`|
|float       |小数    |%f   |`printf("%f", 変数名);`|
|*(ポインター)|アドレス|%p   |`printf("%p", 変数名);`|

## 入出力
### C言語
- 出力例
```C
printf("Hello World\n");
printf("%c\n", 変数名);
```
- 入力例
```C
scanf(フォーマット指定子, &変数名);
```
※現在はscanf_s推奨

### C++
- 出力例
```C++
std::cout << "Hello World\n";
std::cout << 変数名 + "\n";
```

#### 追記 : std::format(C++20以上)
```C++
#include <format>

std::cout << std::format("Hello World") << std::endl;
std::cout << std::format("{}", 変数名) << std::endl;
```

- 入力例
```C++
std::cin >> 変数名;
```

### C#
- 出力例
```C#
Console.WriteLine("Hello World\n");
Console.WriteLine($"{変数名}\n");
```
- 入力例
```C#
変数名 = Console.ReadLine();
```

## その他
### インクルード
**インクルード**とはプログラムを組むための下地

`#include <stdio.h> // C言語`
`#include <iostream> // C++`
`using System; // C#`

### 乱数
**乱数**とはランダムな数字

#### C言語
```C:rand.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    // 乱数の初期化
    srand((unsigned int)time(NULL));

    // 乱数の生成
    int i = 0;
    i = rand() % 数字;

    // 結果を出力
    printf("%d\n", i);

    return 0;
}
```

#### C++
```C++:rand.cpp
#include <iostream>
#include <random>

int main(void)
{
    // 乱数の初期化(メルセンヌツイスター法)
    std::random_device random_device;
    std::mt19937 mt(random_device());

    // 乱数の生成
    int i = 0;
    i = mt() % 10;

    // 結果を出力
    printf("%d\n", i);

    return 0;
}
```

#### C#
```C#:rand.cs
using System;

class Program
{
    static void Main()
    {
        // 乱数の初期化
        Random random = new Random();

        // 乱数の生成
        int i = random.Next(数字);

        // 結果を出力
        Console.WriteLine($"{i}\n");
    }
}
```
Laravelのジョブ内で通信を行う場合の注意点

## 概要
LaravelのジョブでSFTPを行う際に`Connection closed prematurely`エラーが起きました。
この記事では
- 原因
- 解決策

を解説します。

## 前提
- SFTP通信には`league/flysystem-sftp: ^1.1`を使用
- ジョブの処理には`php artisan queue:work`を使用

## 原因
シンプルに**前のコネクションが残っておりタイムアウトしたから**です😭

### なぜ前のコネクションが残っていた？
`queue:work`でジョブの処理を行う際、Laravelはワーカープロセスを常駐させ処理毎にアプリの更新を行いません。
つまり、**シングルトンインスタンスに設定されたプロパティがジョブ毎にリセットされません。**
(通常のリクエスト=>アプリ生成=>処理実行=>アプリ停止の流れだとリセットされます)

`league/flysystem-sftp`ではプロパティにコネクションが設定されていれば、そのまま使用します。そのため、以下の流れでエラーが発生してしまいます。
1. プロセス立ち上げ後の初回のジョブ実行で`connection`プロパティ設定
1. 2回目以降は、`connection`プロパティが存在するのでそのまま利用
1. `connection`プロパティがタイムアウトしているためエラー発生

↓コネクションの有無をチェックしているコード
```Adapter/AbstractFtpAdapter.php
    public function getConnection()
    {
        $tries = 0;

        while ( ! $this->isConnected() && $tries < 3) {
            $tries++;
            $this->disconnect();
            $this->connect();
        }

        return $this->connection;
    }
```

## 解決策
2パターンを紹介します。

### queue:listenを利用する。
`queue:listen`は`queue:work`と異なり、ジョブ毎にアプリを生成します。
そのため、インスタンスの内容もリセットされコネクションも残りません。
しかし、都度アプリを生成するので相応に負荷が上昇します。

### 手動で再接続する
Adapterの接続/切断メソッドはpublicなので手動で実行できます。
putの前に再接続を仕込んでおくことで、コネクションをリセットできます。
処理後にdisconnect()を仕込んでおくだけでも動作可能だと思います。
```php
    /** @var Illuminate\Filesystem\FilesystemAdapter */
    $disk = Storage::disk($diskName);

    $disk->getDriver()->getAdapter()->disconnect();
    $disk->getDriver()->getAdapter()->connect();
```

## まとめ
`queue:work`が常駐プロセスなので、一部情報が残ってしまうことに気づかず起きたエラーです。
SFTP接続に限らず、要らぬリスクを埋め込んでしまう危険性があるので今後注意したいと思います。
discord bot (discord.js)を GCP 無料VM で常時実行

ローカルPCのnode.jsをつけっぱなしにするはイヤだったので、もともと維持しているGCPの無料VMで実行させることにしました。

## 無料VM
https://cloud.google.com/free?hl=ja
に詳しく載っています。

VMの構築方法の詳細は、ググると詳しく載っているのと、自分の過去記事にも少し触れていますので、省略しますが、要は、e2-microという小さなサーバをUS-WEST（オレゴン）で作ると無料って感じです。
あたりさわりのない「ubuntu」で作っています。
実は、ずっと18のままだったんですが、サポート切れたので、今日、20に上げました。

## nodejs インストール

nodesoource経由でインストールしてみます。
```
$ sudo su
# apt update
# apt upgrade
# curl -fsSL https://deb.nodesource.com/setup_23.x -o nodesource_setup.sh
# chmod 777 nodesource_setup.sh 
# ./nodesource_setup.sh 
# apt install nodejs
```

常時起動のために、``forever``もインストールします。
```
# npm install -g forever
```
``-g``を忘れずに・・

動いてるか確かめます。
```
# node -v
# npm -v
```

## 環境移行
前回作ったBOTプログラムをこっちに持ってきます。

```
$ mkdir ~/discord-bot
$ cd ~/discord-bot/
$ mkdir tenki_likemark
$ cd tenki_likemark/
$ npm init
$ npm i discord.js
$ npm i axios
```

プログラムとconfigをコピペします。
```
$ vi index.js
$ vi config.json
```

動くかな？？
```
$ node index.js
東京の天気👍#xxxxで起動しました！
```

動いたので、``CTRL+C``　で一旦とめます。

## forever

常時起動には、``forever``を使います。
```
$ forever start index.js
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: index.js
(node:79148) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:79148) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(node:79148) [DEP0060] DeprecationWarning: The `util._extend` API is deprecated. Please use Object.assign() instead.
```

なんか、たくさんワーニングが出るな〜？？
動いているか見てみます。
```
$ forever list
(node:79181) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:79181) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(node:79181) [DEP0060] DeprecationWarning: The `util._extend` API is deprecated. Please use Object.assign() instead.
info:    Forever processes running
data:        uid  command       script   forever pid   id logfile                          uptime      
data:    [0] EMJe /usr/bin/node index.js 79159   79166    /home/hogehoge/.forever/EMJe.log 0:0:0:43.19 
```
動いてるっぽい。

## 完成
めでたしめでたし
adbコマンド

## 🎀 はじめに

(私が)よく使うadbコマンドをまとめます
システムアプリ(プリインストールアプリ)を作成時に使用しました


### 端末に接続 / 接続解除
```
$ adb connect IPアドレス
$ adb disconnect IPアドレス
```

### adb接続しているデバイス一覧
```
$ adb devices
```

### 端末再起動
```
$ adb reboot
```

## 🖥️ adbコマンド

adbコマンドを使うためにはUnixシェルにアクセスする必要があります
```
$ adb shell
```
もしくは、下記のコマンドの前に`adb shell`をつけてください

例
```
$ adb sell pm disable-user アプリパッケージ名
```

### システムアプリの無効化
```
$ pm disable-user アプリパッケージ名
```

### システムアプリの有効化
```
$ pm enable アプリパッケージ名
```
### システムアプリがどうか
```
$ dumpsys package アプリパッケージ名
```

### システムアプリのアンインストール
```
$ pm uninstall アプリパッケージ名
もしくは
$ pm uninstall --user 0 アプリパッケージ名
```

### アプリ強制終了
```
$ am force-stop アプリパッケージ名
```

### スクリーンセーバーが有効化どうか
1: 有効
0: 無効
```
$ settings get secure screensaver_enabled
```
### スクリーンセーバーを表示
```
$ am start -n "com.android.systemui/.Somnambulator"
```

### 設定しているアラーム
```
$ dumpsys alarm | grep アプリパッケージ名
```

### キーイベント
```
$ input keyevent KEYCODE_DPAD_RIGHT
$ input keyevent KEYCODE_DPAD_LEFT
``` 

## 🚗 最後に
随時追加予定です
超簡単にPythonファイルをexe化（auto-py-to-exe）

pyinstallerのラッパーである**auto-py-to-exe**ライブラリを使ってPythonファイルを簡単にexe化できます。

### 1. ライブラリのインストール

```
pip install auto-py-to-exe
```

### 2. auto-py-to-exeを起動

以下のコマンドを実行する。

```
auto-py-to-exe
```

### 3. ファイルを選択する

![f44f2542160236a239f93770b418485b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471633/fcc834ca-e724-6a10-1ac4-14910acf7f87.png)

- Script Location：exe化したいpythonファイルを選択する
- Onefile：「One Directory」を選択する
- Console Window：「Window Based」を選択する
- Icon：Iconファイルを選択する
- Additional Files：pythonファイルで参照しているファイルを選択する

### 4. exeファイルを生成

「CONVERT .PY TO .EXE」を実行後、outputフォルダが生成され、そのフォルダの直下にexeファイルが生成されている
インセプションデッキの重要性を実感した話

はじめまして、株式会社rexcornuの自社プロダクト開発にジョインしているだーちゃんです。前職では、主にRuby on Railsのバックエンドエンジニアとして新規開発に4回ほど携わりました。今回は、フリーランスエンジニア向けサービス「TechMatch for Freelance」のリリースに際し、PMとして開発に関わりました。

本記事では、プロダクト開発における「インセプションデッキ」の重要性について、私が直面した具体的なエピソードを交えてお話しします。

# インセプションデッキとは

インセプションデッキとは、アジャイル開発の初期段階で関係者全員がプロジェクトの方向性や目標を共有するためのツールです。これにより、認識のズレを最小限に抑え、プロジェクトの失敗リスクを軽減します。

インセプションデッキは10個の質問から構成され、プロジェクトの「なぜ（Why）」と「どのように（How）」を明確に整理します。作成はプロジェクトメンバー全員で行い、スプリント0の期間中に2～3日ほどでまとめることが推奨されています。これにより、メンバー間の共通認識が深まり、プロジェクトがスムーズに進行する土台を築けるのです。

# 実際に起こった問題

ある日、要件定義を進めている最中に、次第に機能の仕様が複雑になりすぎていることに気づきました。特に、作業実績を登録する機能がエッジケース（例外的なケース）に対応しすぎた結果、非常に複雑化してしまっていたのです。

その結果、開発担当者からも仕様に関する質問や確認が頻繁に寄せられるようになりました。Slackには「このケースの場合、どう処理すればいいですか？」というような確認メッセージが次々に届き、開発スピードが低下。各チームメンバーが理解しきれないまま作業を進めてしまう場面も増え、コミュニケーションの負担が増えていきました。

![slack_cap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321897/f8857019-220b-f1b0-9f38-a425da40c6bd.png)

このような状況は、機能をすべてのユースケースに対応させようとするときに起こりがちです。具体的には、以下の2つのアンチパターンが見られました。

### パターン1：全ユーザに対応しようとしすぎる

本来、プロダクト開発、特に初期プロダクトについては、コストが最低限で投資効果の高いMVP（Minimum Viable Product）をいかに早くリリースできるかが重要であり、完璧な製品・サービスを目指す必要はありません。しかし、「すべてのユーザを見捨てない」という善意から、エッジケースにも対応しようとする結果、機能がどんどん複雑になり、リリース時には使いづらいものに。結局、メインのユーザにとっては不便で、社内でも機能説明に苦労しました。

### パターン2：サンクコストに囚われる

開発メンバー全体が「この機能は複雑だ」と認識していながらも、すでに多くの時間と労力を費やしていたため、「一から考え直そう」とは言いづらい状況に。結果として、複雑な仕様のままプロジェクトが進んでしまいました。

# 根本的な問題点

これらの問題の原因は、サービスのゴールや提供価値、アピールポイントが定まっていなかったことにあります。また、限られた時間・予算・品質の中で、何を優先すべきかが不明確だったことも影響しました。チーム内で意見の取捨選択ができない状態が続くと、すべての要望を取り入れようとして、結果的に混乱が生じるのです。

# インセプションデッキに立ち戻ることで解決

複雑化した機能要件に直面したとき、私たちはそもそもインセプションデッキを作成していなかったことに気づきました。開発の初期段階で目の前のタスクに集中しすぎたため、サービスの全体像や目的をチーム全体で共有することを怠っていたのです。

この問題を解決するために、すぐにインセプションデッキを作成することを決断しました。デッキの作成プロセスでは、プロジェクトのゴールや提供価値、ペルソナなどを一つひとつ見直し、全員が共通認識を持つよう徹底しました。これにより、エッジケースへの対応範囲やサービスのアピールポイントが明確になり、チーム全体で優先順位を共有できるようになったのです。

![slack_cap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321897/a6f79da3-749d-d9dc-d339-6215adaa64ab.png)

結果として、作業実績を登録する機能をゼロから再考し、シンプルで使いやすい機能へと生まれ変わりました。インセプションデッキを通じて、要件定義が迅速に進み、プロダクトも大幅に改善されました。

# おわりに

インセプションデッキは、プロダクトの方向性を整理し、関係者全員の認識を統一するための強力なツールです。私たちが直面した複雑化の問題も、このデッキに立ち戻ることで解決できました。プロジェクトの初期段階でしっかりと作成し、定期的に見直すことで、成功への道筋を確実に描けるでしょう。


---

rexcornuでは、これからの会社の成長を共にしてくれる仲間を募集しています。

https://www.rexcornu.com/career

https://www.wantedly.com/companies/company_9295588/projects

https://www.rexcornu.com/

https://c.tech-match.net/
(React) ちょっとした改造 useEffect

作ったものの使わなかったやつ。

こういうのをやりたくなった時点で、何か `useEffect` の使い方が間違っているような気がするが...

## 初回レンダリングだけスキップする useEffect
``` ts
import type { DependencyList, EffectCallback } from 'react'
import { useEffect, useState } from 'react'

export function useEffectWithoutInitialRender(
  effect: EffectCallback,
  deps?: DependencyList
) {
  const [initialRender, setInitialRender] = useState<boolean>(true)
  useEffect(() => {
    if (initialRender) {
      setInitialRender(false)
      return () => {}
    }
    return effect()
  }, deps)
}
```

## 前回の deps を参照できる useEffect
``` ts
import type { DependencyList } from 'react'
import { useEffect, useState } from 'react'

export function useEffectWithPrevDeps<T>(
  effect: (prevDeps?: T) => void | (() => void),
  deps: T & DependencyList
) {
  const [prevDeps, setPrevDeps] = useState<T>()
  useEffect(() => {
    setPrevDeps(deps)
    return effect(prevDeps)
  }, deps)
}
```
AWS ルートテーブルlocalメモ

AWSのルートテーブルにおける「**local**」というエントリは、**同じVPC内の通信**を指します。これは自動的に設定されるルートで、VPC内のリソース同士が通信できるようにするためのものです。具体的なポイントは以下のとおりです。

### 「local」の意味と役割
1. **VPC内通信を可能にするルート**：
   - VPC内のサブネット間でのトラフィック（通信）を許可します。
   - 例えば、同じVPC内のEC2インスタンス同士が、異なるサブネットに配置されていても、この「local」ルートによって通信が可能です。

2. **自動的に作成され、削除不可**：
   - 「local」ルートはVPC作成時に自動で追加され、ユーザーが削除や編集できません。
   - これはAWSがVPC内での基本的なネットワーク接続を保証するためです。

3. **CIDRブロックで範囲を指定**：
   - 「local」ルートの宛先CIDRブロックは、そのVPCに設定されたアドレス範囲（例: 10.0.0.0/16）です。
   - そのため、VPC内のすべてのサブネットがこのアドレス範囲で通信できるようになっています。

### 例
たとえば、VPCのCIDR範囲が`10.0.0.0/16`の場合、ルートテーブルには次のように表示されます：

| 宛先 (Destination) | ターゲット (Target) |
|-------------------|--------------------|
| 10.0.0.0/16       | local              |

このエントリによって、同じVPC内のアドレス範囲にあるインスタンス同士が通信可能です。

### 補足
- 「local」はVPC内の通信に限定されるため、インターネットへの通信や他のVPCとの接続には別途ルート設定（インターネットゲートウェイやVPCピアリングなど）が必要です。
Godotの駄目なところ・というか気をつけたいこと

# 正式版にバグの修正くるのが遅い
結構長い間、バグが放置というか、次回のアップデートをお待ちしましょう状態になる。
そのため、バージョンをなかなか、上げれない。

例 TLSOptions.client_unsafe() が動かないの状態、８月から続いている。
https://github.com/godotengine/godot/issues/95988

具体的に言うと、これが使えないと、SSLがぶっ壊れているHuggingfaceのServerless Inference APIにアクセスできません。

一応、4.4のベータでは治っています。
## ようするに もう少し頻繁に修正版出してほしい。
Godotのバグの修正がいつくるかわからないので、製品に組み込む場合は、自分で解決できるようにするか、しっかりと検証した古い版を使うしかない。
ilasmでstack machine その27

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmでzundokoを書け。

# 環境
windows11

# サンプルコード

```

.assembly zundoko {}
.method static void main() {
.entrypoint
.maxstack 8
.locals init (class [mscorlib]System.Random r, int32 i)
	newobj instance void [mscorlib]System.Random::.ctor()
	stloc r
	ldc.i4 0
	stloc i
loop:
	ldloc r
	ldc.i4 3
	callvirt instance int32 [mscorlib]System.Random::Next(int32)
	ldc.i4 1
	bgt zun
	ldc.i4 0
	stloc i
	ldstr "ドコ"
	call void [mscorlib]System.Console::WriteLine(string)
	br loop
zun:
	ldstr "ズン"
	call void [mscorlib]System.Console::WriteLine(string)
	ldloc i
	ldc.i4 1
	add
	stloc i
	ldloc i
	ldc.i4 3
	bgt end
	br loop
end:
	ldstr "ドコ キヨシ!!"
	call void [mscorlib]System.Console::WriteLine(string)
	ret
}


```

# 実行結果

```
>zundoko3
ズン
ドコ
ズン
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ドコ
ドコ
ズン
ドコ
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ キヨシ!!

```

以上
ステートレスとステートフル(メモ)

AWS Firewall には、**ステートフル（stateful）** と **ステートレス（stateless）** のルールタイプがあり、それぞれ異なる用途や機能に適しています。AWS Firewall では、必要に応じてこれらのルールを使い分けてセキュリティポリシーを実現します。

### 1. ステートフル（Stateful）ルール
- **概要**：ステートフルルールは、トラフィックの**状態（ステート）を追跡**するため、各接続のセッション情報を保持します。
- **特徴**：
  - 一度許可した接続に対する応答トラフィックは、自動的に許可されます。つまり、アウトバウンドで許可されたトラフィックのインバウンド応答を明示的に許可する必要はありません。
  - ステートフルな追跡により、不正なトラフィックや攻撃を高精度に検出・防止できます。
  - パケットレベルだけでなく、セッション全体を監視できるため、複雑なルール設定が可能です。
- **使用例**：
  - 内部ネットワークからのアウトバウンドアクセスや、外部から内部へのインバウンド接続を追跡・制御する場面で使用。
  - インバウンド通信の接続維持が必要な場合や、接続のトラッキングが求められる用途。

### 2. ステートレス（Stateless）ルール
- **概要**：ステートレスルールは、各トラフィックパケットを**独立して処理**し、セッション情報を保持しません。
- **特徴**：
  - 各パケットはその都度独立して評価され、過去の通信履歴やセッション情報には依存しません。
  - 一方向の通信ごとに明示的な許可ルールが必要で、アウトバウンドとインバウンドの両方向でルールを設定します。
  - 比較的軽量でスケーラブルなため、大量のトラフィックを効率的にフィルタリング可能。
- **使用例**：
  - トラフィックのフィルタリングが中心で、セッション情報のトラッキングが必要ない場合。
  - シンプルなパケットフィルタリングが求められる用途（例：特定ポートやIPアドレスでのアクセス制限）。

### まとめ

| 特性                | ステートフルルール                                 | ステートレスルール                          |
|--------------------|---------------------------------------------------|---------------------------------------------|
| 状態管理           | あり（セッションを追跡）                          | なし（各パケットを独立して処理）            |
| リソース消費       | 高い（セッション追跡によりメモリを消費）           | 低い（セッション情報の保存が不要）          |
| 応答トラフィック   | 自動的に許可                                      | 明示的なルール設定が必要                    |
| 使用用途           | 内部ネットワークの保護、精度の高いセキュリティ設定 | 大量トラフィックのシンプルなフィルタリング |

### AWSでの具体的な使い分け
AWSでは、例えば **AWS Network Firewall** はステートフルファイアウォール機能を提供し、複雑なルールとセッション管理が可能です。一方、**セキュリティグループ**はステートフル、**ネットワークACL**はステートレスとして動作します。

### ステートレス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/21d9642c-1bb4-4e2b-6a97-335cbb2f2117.png)

### ステートフル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/43907703-159d-a889-57eb-397623449a21.png)
【python3】 Excelの表データをPowerPointの表に転記するツール

# はじめに
Excelの表のデータを、PowerPointの表のデータに転記する自動化ツールをpythonで実装しました

## 転記元のExcelの表
今回転記する表は以下の通りです。

![Excel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/aedbed56-0fc5-17a8-4a13-1a4f47ddd2bd.jpeg)


## 転記前のPowerPointの表

![before_ppt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/318c7298-0e89-63d2-3a6d-06e3aa14e8c8.jpeg)

## 実装したソースコード
実装したソースコードは下記のとおりです。

```python
#################################################
#   Excelからpowerpointの表にデータコピーテスト
#################################################

# ライブラリをインポート
import openpyxl
from pptx import Presentation
from pptx.util import Inches
# Excel表データ用配列
excel_data = []


# Excelの表から、PowerPointの表に転記するデータを取り出し、配列に格納する。
def excel_data_copy():
    # Excelファイルを開く
    excel_file = '調査結果.xlsx'
    sheet_name = '調査結果'

    # Excelファイルが開いていれば例外処理に遷移し、ファイルを閉じるメッセージを出力して終了する。
    try:
        wb = openpyxl.load_workbook(excel_file)
        ws = wb[sheet_name]
    except:
        print(f"{excel_file}が開いています。閉じてください")    



    # Excelデータ開始変数
    start_row = 4
    # Excelデータ終了行変数
    end_row = 0
    # カウント変数
    i = start_row
    while True:
        v1 = ws.cell(row=i,column=3).value
        if v1 == None:
            break
        else:
            i += 1
    
    # 最終行を取得
    end_row = i-1
    for row in ws.iter_rows(values_only=True,min_row=start_row,max_row=end_row,min_col=3):
        excel_data.append(row)

def powerpoint_table_copy():
    # PowerPointプレゼンテーションを作成
    ppt_file = "プレゼンテスト6.pptx"
    ppt = Presentation(ppt_file)

    slide = ppt.slides[1]
    # 表を追加
    rows = 2
    cols = 6
    left = Inches(1.0)
    top = Inches(2.0)
    width = Inches(8.0)
    height = Inches(1.5)

    table = slide.shapes.add_table(rows, cols, left, top, width, height).table

    for j in range(rows):
        array1 = excel_data[j]
        leng1 = len(array1)
        for k in range(leng1):
            data2 = array1[k]
            table.cell(j, k).text = str(data2)
        

    # PowerPointファイルを保存
    try:
        ppt.save(ppt_file)
    except PermissionError:
        print(f"{ppt_file}が開いています。閉じてください") 

# メイン関数
def main():
    excel_data_copy()
    powerpoint_table_copy()

# 主処理
if __name__ == "__main__":
    main()            
```

## ツール実行後のpowerpointの表

![after_ppt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/9f8052d1-d03a-dfd8-5b37-2d41b0094dfa.jpeg)
 
# 最後に
必要に迫られたので実装、テストしました。
侵⼊検知(IDS)/侵⼊防⽌(IPS)メモ

「IDS（Intrusion Detection System）」と「IPS（Intrusion Prevention System）」は、サイバーセキュリティの分野で用いられる技術であり、主にネットワークやシステムの保護に役立ちますが、それぞれ異なる機能を持っています。

### IDS (Intrusion Detection System)
- **概要**：IDSは、ネットワークやシステム内の不正なアクセスや攻撃を検出するためのシステムです。
- **機能**：
  - ネットワークトラフィックやログを監視し、不審な活動やパターンを検出します。
  - 通常は警告を発するだけで、実際にトラフィックをブロックすることはありません。
- **種類**：
  - **ネットワーク型IDS（NIDS）**：ネットワークトラフィック全体を監視し、異常な動きを検出します。
  - **ホスト型IDS（HIDS）**：特定のホスト（サーバーやPC）上で実行され、システムのファイルやプロセスの変更を監視します。
- **利点**：異常を検知することで、迅速に対応策を講じることができる。

### IPS (Intrusion Prevention System)
- **概要**：IPSは、IDSの機能に加え、不正なアクセスや攻撃を自動的に防ぐことができるシステムです。
- **機能**：
  - ネットワークトラフィックをリアルタイムで監視し、不正な活動を検出した場合には、トラフィックをブロックしたり、セッションを切断したりします。
  - IDSの検出機能を持ちながら、実際に攻撃を防ぐアクションを取ることができる点が特徴です。
- **種類**：
  - **ネットワーク型IPS（NIPS）**：ネットワークトラフィックを監視し、攻撃を阻止します。
  - **ホスト型IPS（HIPS）**：特定のホスト上で動作し、システムの脅威を防ぎます。
- **利点**：リアルタイムで攻撃を防止できるため、被害を未然に防ぐことが可能。

### まとめ
- **IDS**は、不正アクセスや攻撃を**検出**するためのシステムで、警告を発する機能がありますが、実際の防御は行いません。
- **IPS**は、不正アクセスや攻撃を**検出し、同時に防ぐ**機能を持つシステムで、リアルタイムでアクションを取ることができます。

これらのシステムは、組織のセキュリティを強化するために重要な役割を果たしています。多くの場合、IDSとIPSは連携して運用され、より高いセキュリティレベルを実現します。
React Native + Expoに使用するSQLiteをGUIで確認する方法

# はじめに
React Native + Expoにて使用するSQLiteをGUIで操作する方法を確認するのに、少し苦労したので、忘備録として共有しておきます。

:::note warn
この記事ではExpoにてSQLiteを使用する方法などは紹介していません。
[Expo公式](https://docs.expo.dev/versions/latest/sdk/sqlite/)に書かれているので参照してください。
:::


# 結論

公式の[こちら](https://docs.expo.dev/versions/latest/sdk/sqlite/#:~:text=Browse%20an%20on%2Ddevice%20database)に書かれていました。

手順を簡単に紹介していきます。

 ### 1. Drizzle Studio for Expo SQLiteをインストール
```bash
npm i expo-drizzle-studio-plugin
```

 ### 2. Drizzle Studio プラグインをセットアップ
```ts
// 必要なものをインポート
import { useDrizzleStudio } from "expo-drizzle-studio-plugin";
import * as SQLite from "expo-sqlite";
import { View } from "react-native";

// 使用したいDBを取得
const db = SQLite.openDatabaseSync("使用するDBの名前");

export default function App() {
    // Drizzle Studio プラグインをセットアップ
    useDrizzleStudio(db);

    return <View></View>;
}
```

### 3. ターミナルにて操作
expoを起動する。
```bash
yarn web
```

起動したターミナルにて、***Shift + m***を入力すると、以下のようなものが現れる。
![スクリーンショット 2024-11-05 15.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/95d307a2-1462-ce1b-1975-66244ff22e89.png)

***Open expo-drizzle-studio-plugin*** を選択してクリック。
新しくタブが開かれるので待機すると、そのタブでSQLiteをGUI操作できます。

# 終わりに

React Native + Expo環境でDBを確認するのに悩んでたんですけど、知ってしまえばとても簡単にできました。取り敢えず公式をしっかり確認することが大切ですね。

参考になると嬉しいです。
SNIとESNIメモ

**SNI (Server Name Indication)** と **ESNI (Encrypted Server Name Indication)** は、TLS/SSLプロトコルに関連する技術ですが、それぞれ異なる目的と機能を持っています。

### SNI (Server Name Indication)
- **概要**：SNIは、TLSプロトコルの拡張機能であり、複数のドメイン名を同じIPアドレスでホストできるようにします。
- **機能**：クライアントがサーバーに接続する際に、リクエストするドメイン名をサーバーに伝えることで、サーバーが適切なSSL証明書を選択できるようにします。
- **利点**：複数のSSL証明書を管理でき、コスト削減や管理の効率化が図れます。
- **セキュリティ**：SNIは、接続時にドメイン名を平文で送信するため、通信内容は暗号化されるものの、どのドメインにアクセスしているかはネットワーク上の観測者に見える状態です。

### ESNI (Encrypted Server Name Indication)
- **概要**：ESNIは、SNIのセキュリティを強化するために開発された拡張機能で、SNIによって送信されるドメイン名を暗号化します。
- **機能**：クライアントがサーバーに接続する際に、リクエストするドメイン名を暗号化して送信し、通信内容が第三者に見られないようにします。
- **利点**：プライバシー保護が向上し、特に攻撃者やISPがユーザーの訪問しているウェブサイトを把握することを防ぎます。
- **現状**：ESNIはまだ広く普及しているわけではなく、クライアントとサーバーの両方がESNIをサポートしている必要があります。

### まとめ
- **SNI**はドメイン名を平文で送信し、複数のSSL証明書を管理するための技術です。
- **ESNI**はそのSNIを暗号化し、プライバシーを保護するための技術です。

両者は、インターネット上でのセキュアな通信を実現するための重要な技術ですが、ESNIはSNIのプライバシーの懸念に対処する形で進化したものです。
レビューアイで スマイルホテル 東京日本橋 のレビュー分析をしてみた

弊社リテジーリンクではレビュー分析AIレビューアイの無料デモを公開中です。
レビューアイ (英語表記 ReviewAI) は、商品・サービスのレビューを分析し、
観点ごとに強みと改善点を明らかにする、レビュー分析AIです。

本記事では、スマイルホテル 東京日本橋 のレビューを例に
レビューアイで明らかになった強みと改善点を1つずつ紹介します

## 強み ##
レビューアイでレビュー分析すると、レビューでよく出てくる観点が一覧できます。
強み順に並べると、**部屋、朝食** などが上がってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/f4425dd6-7d72-502d-cd71-4d5a34a6f021.png)


**朝食** の詳細を確認すると、朝食に関してどのようなレビューがあるのか可視化されます。
こちらを強み順に並べると、**美味しい、バイキング、種類** が上位にきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/9e6a23ab-9a1a-e019-6291-6c5380bb8154.png)


**美味しい** のレビューを見ると、感情分析した結果で整理してレビューの抜粋文が確認できます。
地下のガストでビュッフェ式の美味しい朝食が食べられるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/59b6ea79-c4ad-d6e1-aaf4-609ad66c4d7a.png)




## 改善点 ##
レビュー分析で見つかる観点を改善順で見ると、**音、隣、壁**が目立ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/08a360ab-13eb-e5aa-bb64-f0682bfa2d0d.png)




**音** の詳細を確認すると、どのような点で改善の余地があるか一覧できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/cfb38181-3f11-1944-a496-55fa60ab6409.png)



**聞こえる**のレビュー文を見てみると壁が薄いようで、廊下や隣から
音や話し声が聞こえてしまうことがあるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/fb2ce9d3-f02c-7504-af12-612bbb5bfa4b.png)



## まとめ ##
レビューアイで スマイルホテル 東京日本橋 のレビュー分析をしました。

結果として
・地下のガストで美味しい朝食が食べられる
・壁が薄く、廊下や隣から音が聞こえてしまう
ということが判明しました。

今回は紹介できませんでしたが、
・駅やコンビニについて
・掃除について
の意見もありました。

[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
ぜひ[こちら](https://reviewai.next-seed.work/)からお申込みください。
コマンドプロンプトを利用したPythonの仮想環境構築

# はじめに

Pythonの仮想環境は、プロジェクトごとに独立した開発環境を作成するための強力なツールです。本記事では、コマンドプロンプトのみを使用してPythonの仮想環境を構築する方法を説明します。

# 仮想環境の構築手順

## 1. コマンドプロンプトを開く

Windowsキー + Rを押し、「cmd」と入力してEnterを押します。

## 2. 仮想環境を作成するディレクトリに移動

以下のコマンドを使用して、仮想環境を作成したいディレクトリに移動します：

```bash
cd path\to\your\project\directory
```

## 3. 仮想環境の作成

以下のコマンドを実行して、新しい仮想環境を作成します：

```bash
python -m venv .venv
```

ここで、「myenv」は仮想環境の名前です。任意の名前に変更可能です。

## 4. 仮想環境の有効化

作成した仮想環境を有効化するには、以下のコマンドを実行します：

```bash
myenv\Scripts\activate
```

## 5. パッケージのインストール

仮想環境が有効化されたら、必要なパッケージをインストールできます：

```bash
pip install package_name
```

## 6. 仮想環境の無効化

作業が終了したら、以下のコマンドで仮想環境を無効化できます：

```bash
deactivate
```

# コマンドプロンプトのみ構築するメリット

- **高速性：** コマンドの実行が迅速で、開発プロセスを加速できる。
- **単純性：** 1つのアプリで仮想環境が構築できる
-  **柔軟性：** 複雑な操作や特殊なコマンドを実行できる。

# コマンドプロンプトのみで構築するデメリット

-  **学習コスト：** 初心者にとっては、コマンドの習得に時間がかかる場合がある。
-  **視覚的フィードバックの不足：** GUIに比べて、操作の結果が分かりにくい場合がある。

# 結論

コマンドプロンプトを使用したPythonの仮想環境構築は、効率的で柔軟な開発環境を提供します。メリットとデメリットを理解し、プロジェクトの要件に応じて適切なアプローチを選択することが重要です。

# その他
## VSCodeを起動するコマンド
下記のコマンドを利用すると、コマンドプロンプトのみでVisual Stadio Codeが起動できるので、覚えておくと便利です。

```bash
code path\to\your\project\directory
```

また今いる階層で実行したい場合は下記のコマンドを利用してください。

```bash
code .
```
RDSのスロークエリ通知について

## はじめに
AWS RDSのスロークエリ通知は、RDSで発生する遅いクエリの実行時間を追跡し、パフォーマンスの改善に役立てるための重要な手法です。
スロークエリを検出し、適切な通知を設定することで、データベースのパフォーマンスの向上を図ることができます。この記事では、RDSスロークエリログの有効化から、AWSのサービスを活用した通知の仕組みまでを解説します。

## スロークエリとは？
スロークエリとは、指定した時間よりも長くかかるクエリを指します。例えば、インデックスが適切に設定されていない場合や複雑なクエリが実行される場合、スロークエリが発生しやすくなります。RDSでは、スロークエリを監視し、パフォーマンス改善に役立つ情報を得ることができます。

## RDSでのスロークエリログの有効化方法
AWS RDSでスロークエリを監視するためには、まずスロークエリログを有効にする必要があります。

### 設定手順
```
1 RDSコンソールでターゲットのインスタンスを選択します。
2 パラメータグループを設定し、slow_query_logを1（有効）にします。
3 スロークエリログが記録される閾値を設定するために、long_query_timeの値も指定します。通常、2秒から5秒程度の値が推奨されます。
```

## スロークエリログの取得と確認
スロークエリログを有効にすると、指定の閾値を超えるクエリがログに記録されます。ログの取得方法は以下の通りです。

- コンソールからの取得: 
    - RDSのログとイベントタブから直接スロークエリログを確認できます。
- CloudWatch Logsとの統合: 
    - RDSのログをAWS CloudWatch Logsにエクスポートすることで、より柔軟な監視と分析が可能になります。

## スロークエリ通知の設定方法
スロークエリを検知した際に通知を受け取る設定をするには、AWSの複数のサービスを組み合わせます。

CloudWatch Logs Insightsでのクエリ設定: CloudWatch Logs Insightsを使い、RDSスロークエリログに対するクエリを設定し、特定の条件に合致した場合にアラートを生成することが可能です。

- CloudWatchアラームの作成:
クエリ結果を元にCloudWatchアラームを作成し、アラームがトリガーされた際に通知を送る設定を行います。
メトリクスベースでアラームを設定し、スロークエリが一定の頻度で発生した場合などに通知をトリガーさせることができます。

- SNS通知の設定:
アラームの通知先にAWS Simple Notification Service (SNS)を設定し、メールやSMSでの通知を受け取れるようにします。
必要に応じて、複数の通知先を設定し、関係者全員にアラートが届くようにできます。

## スロークエリ通知の活用例
スロークエリ通知を設定することで、次のような利点があります。

パフォーマンスのボトルネックを早期発見: 定期的に発生するスロークエリは、システムのパフォーマンスを低下させる要因となり得ます。通知により即座に対応でき、パフォーマンスチューニングに役立ちます。
コスト削減: スロークエリによるリソースの無駄遣いを防ぐことで、不要なリソース使用を減らし、コストの最適化を実現します。
リスク軽減: 本番環境でスロークエリが発生すると、ユーザー体験に悪影響を及ぼす可能性があります。通知を受け取ることで迅速に対応し、リスクを最小限に抑えることができます。

## 最後に
AWS RDSのスロークエリ通知は、データベースパフォーマンスの向上において非常に重要な役割を果たします。
この記事で紹介した手順を参考に、適切な設定を行い、システムの安定稼働を実現に繋がれば幸いです。
スロークエリの検出と対応を通じて、データベースパフォーマンスの最適化に取り組んでいきます。
langchainでRAGやってみた

# はじめに

本記事では、LangChainの`Retrieval Augmented Generation (RAG)`機能をゼロから構築する方法を解説します。RAGは、大規模言語モデル (LLM) に外部の知識ベースを組み込むことで、より正確で詳細な回答を生成することを可能にする技術です。LangChainの提供するツールを活用し、独自のRAGシステムを構築する手順を詳しく紹介します。

## 想定読者

- LangChainの基本的な知識を持つ方
- LLMを用いた質問応答システム構築に興味のある方
- RAGの仕組みを理解し、実践したい方

## 実行環境

- Python 3.10 以上
- pip: langchain, openai, chromadb (必要なライブラリは適宜追加)

## 事前準備

必要なライブラリをインストールします。

```bash
pip install langchain openai chromadb
```

# コード

GitHubリポジトリ: (作成予定)

## コードの説明

### 1. データの準備

質問応答に使用するドキュメントデータを準備します。今回は、例としてWikipediaの記事を使用します。

```python
# Wikipediaの記事を取得 (具体的な方法は割愛)
documents = [
    Document(page_content="...", metadata={"source": "..."}),
    # ... 
]
```

### 2. ドキュメントのベクトル化

`Chroma`を用いて、ドキュメントをベクトル化し、ベクトルデータベースに保存します。

```python
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# OpenAIEmbeddingsを使用してテキストを埋め込み
embeddings = OpenAIEmbeddings()

# Chromaを使用してベクトルデータベースを作成
db = Chroma.from_documents(documents, embeddings)
```

### 3. Retrieverの作成

ベクトルデータベースから関連するドキュメントを取得するための`Retriever`を作成します。

```python
retriever = db.as_retriever()
```

### 4. LLMの設定

使用するLLMを設定します。今回は、`OpenAI`のモデルを使用します。

```python
from langchain.llms import OpenAI

llm = OpenAI(temperature=0)
```

### 5. RAGパイプラインの構築

`RetrievalQA`チェーンを用いて、RAGパイプラインを構築します。

```python
from langchain.chains import RetrievalQA

qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
```

### 6. 質問応答の実行

構築したRAGシステムを使って、質問応答を実行します。

```python
query = "..." # 質問
answer = qa.run(query)
print(answer)
```

# 参考情報

- LangChain公式ドキュメント: https://python.langchain.com/en/latest/index.html
- ChromaDB公式ドキュメント: https://docs.trychroma.com/
- rag-from-scratch：https://github.com/langchain-ai/rag-from-scratch

# 最後に

本記事では、LangChainを用いてRAGをゼロから構築する方法を解説しました。RAGは、LLMの能力を拡張し、より高度な質問応答システムを実現するための強力な技術です。ぜひ、ご自身のデータで試してみてください。
今後もlangchainのチュートリアル内容を参考に記事を追加していきます。
langchainでLLM agent実装してみた

# はじめに

近年、目覚ましい発展を遂げている大規模言語モデル (LLM) は、その優れた言語理解能力から様々なタスクへの応用が期待されています。本記事では、LLM をエージェントとして活用し、複雑なタスクを自動化する手法を紹介します。具体的には、LangChain フレームワークを用いて LLM Agent を実装し、簡単なタスクを実行する例を紹介します。

## 想定読者

- LLM と LangChain の基本的な知識を持つ方
- LLM を活用したタスク自動化に興味のある方
- Python の基本的な知識を持つ方

## 実行環境

- Python 3.10 以上
- pip: langchain, openai (必要なライブラリは適宜追加)

## 事前準備

必要なライブラリをインストールします。

```bash
pip install langchain openai
```

# コード

GitHubリポジトリ: (作成予定)

## コードの説明

### 1. ツールと LLM の準備

タスク実行に必要なツールと LLM を準備します。今回は、検索ツールと OpenAI の LLM を使用します。

```python
from langchain.utilities import SerpAPIWrapper
from langchain.llms import OpenAI

# 検索ツール
search = SerpAPIWrapper()

# LLM
llm = OpenAI(temperature=0)
```

### 2. エージェントの作成

ツールと LLM を組み合わせて、エージェントを作成します。

```python
from langchain.agents import load_tools
from langchain.agents import initialize_agent

# 使用するツールを指定
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# エージェントを初期化
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
```

### 3. タスクの実行

エージェントにタスクを指示し、実行結果を取得します。

```python
# タスクの例: "東京の人口は何人ですか？"
task = "東京の人口は何人ですか？"

# エージェントにタスクを実行させる
result = agent.run(task)

# 結果を出力
print(result)
```

# 実行例

上記のコードを実行すると、エージェントは以下のような手順でタスクを実行します。

1. 検索ツールを使って "東京の人口" を検索します
2. 検索結果から人口に関する情報を見つけます
3. LLM を使って、検索結果から必要な情報を抽出し、回答を生成します

# 参考情報

- LangChain 公式ドキュメント: https://python.langchain.com/en/latest/index.html

# 最後に

本記事では、LangChain を用いて LLM Agent を実装し、簡単なタスクを自動化する例を紹介しました。LLM Agent は、様々なツールと組み合わせることで、より複雑なタスクを自動化することが可能です。ぜひ、ご自身のアイデアで、LLM Agent を活用したアプリケーション開発に挑戦してみてください。