OmniAICreator/Qiita-1.07M huggingface dataset:
氷河(Glacier)に眠っている写真たちをサルベージする 〜 その2 ボールド一覧の登録

# 目的
AWS S3 Glacier内のボールド一覧をMongoDBに登録する。

# やり方
ListVaultsCommandを実行する。引数の指定はない。

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/glacier/command/ListVaultsCommand/

# ソースコード
## バックエンド
```react:src/app/api/listVaults/route.ts
import { NextRequest, NextResponse } from "next/server";
import {
  GlacierClient,
  ListVaultsCommand,
  DescribeVaultOutput,
} from "@aws-sdk/client-glacier";
import { MongoClient } from "mongodb";

// CORS設定
export const corsHeaders = {
  "Access-Control-Allow-Origin": "http://localhost:3000",
  "Access-Control-Allow-Methods": "POST",
  "Access-Control-Allow-Headers": "Content-Type",
};

export async function POST(request: NextRequest): Promise<NextResponse> {
  const client = new GlacierClient({});
  let values: DescribeVaultOutput[] = [];
  let input: { accountId: string; marker?: string } = {
    accountId: "",
  };
  input["accountId"] = "-";
  let command = new ListVaultsCommand(input);
  let response = await client.send(command);
  if (response.VaultList) {
    values = values.concat(response.VaultList);
  }
  while (response.Marker) {
    input["marker"] = response.Marker;
    command = new ListVaultsCommand(input);
    response = await client.send(command);
    if (response.VaultList) {
      values = values.concat(response.VaultList);
    }
  }
  const dbclient = await MongoClient.connect(
    "mongodb://127.0.0.1/27017/glacier"
  );
  const db = dbclient.db("glacier");
  const userVaults = db.collection("userVaults");
  userVaults.drop();
  for (let vault of values) {
    userVaults.insertOne(vault);
  }

  return NextResponse.json({}, { status: 200, headers: corsHeaders });
}

```
## フロントエンド
```react:src/app/page.tsx
"use client";
import axios from "axios";
import { Button, Stack, Paper } from "@mui/material";

export default function Home() {
  const listVaults = async () => {
    await axios.post("http://localhost:4000/api/listVaults");
  };
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <div className="z-10 max-w-10xl w-full items-center justify-between font-mono text-sm lg:flex">
        <Stack spacing={2}>
          <Paper>
            <Button
              variant="outlined"
              onClick={listVaults}
              style={{
                textTransform: "none",
              }}
            >
              ボールド一覧を登録する
            </Button>
          </Paper>
        </Stack>
      </div>
    </main>
  );
}
```
# 実行結果
## フロントエンド
ブラウザを開き、`http://localhost:3000` にアクセスする。
![Screenshot from 2024-03-26 01-33-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748326/86472e62-cdd0-26ec-cdc0-5bcfe9f154d8.png)
[ボールド一覧を登録する］ボタンを押すと、MongoDBにボールド一覧が登録される。
## MongoDB Compass
![Screenshot from 2024-03-26 01-37-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748326/93dc5fda-7ffd-4b61-b99f-0982b6b0b1a0.png)

その3に続く。

https://qiita.com/sat0sh1kawada/items/6d1e3d430d3bcd1be13b
JavaのStreamインスタンスを作成する


Java8で導入されたStreamAPIの具体的な使い方を使い方を説明していきます。
まずそのStreamインスタンスの作成方法から見ていきましょう。
## ListやSetからStreamを作成する場合
Collection インターフェース（List や Set など）の stream() メソッドを使用して、ストリームを作成します。

``` java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
        Stream<String> stream = list.stream();
        stream.forEach(System.out::println);  // Apple, Banana, Cherry を出力
    }
}
```
## 配列からStreamを作成する場合
Arrays.stream() メソッドを使用して、配列からストリームを作成します。

```java
import java.util.Arrays;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        String[] array = {"Apple", "Banana", "Cherry"};
        Stream<String> stream = Arrays.stream(array);
        stream.forEach(System.out::println);  // Apple, Banana, Cherry を出力
    }
}
```
## MapからStreamを作成する場合
Map からストリームを作成するには、entrySet(), keySet(), または values() メソッドを使用して、それぞれエントリ、キー、または値のセットを取得し、そのセットからストリームを作成します。

``` java
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Cherry", 3);

        // エントリのストリーム
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
        entryStream.forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));

        // キーのストリーム
        Stream<String> keyStream = map.keySet().stream();
        keyStream.forEach(System.out::println);

        // 値のストリーム
        Stream<Integer> valueStream = map.values().stream();
        valueStream.forEach(System.out::println);
    }
}
```
## 数値範囲からStreamを作成する場合
IntStream, LongStream, または DoubleStream の range() または rangeClosed() メソッドを使用して、数値範囲からストリームを作成します。

``` java
import java.util.stream.IntStream;

public class StreamExample {
    public static void main(String[] args) {
        // 1 から 5 までの IntStream
        IntStream intStream = IntStream.rangeClosed(1, 5);
        intStream.forEach(System.out::println);  // 1, 2, 3, 4, 5 を出力
    }
}
```
これらの例を通じて、さまざまなデータソースからJavaのStream APIを使用してストリームを作成する方法を確認できます。

次の記事でStreamに対する「中間操作」を説明します。
タスク管理簿にどの項目を含めるべきか

タスク管理簿や課題管理簿を使ってタスクや課題の棚卸を行っていましたが、
タスク量が増えると管理が困難になってきました。
効率的に管理するために思いついた工夫をお伝えします。

## 状況説明

以下のような管理簿を用いてタスク管理を行っていました。


|項番|　タスク名|　完了条件|　期限|　担当者|　ステータス|対応状況|
|--|--|--|--|--|--|--|
|01|○○の方式についての調査|設計書2の○○の設計について、どの方式があるか調査し、パワーポイントにまとめる。|4/7|Bさん|レビュー後修正中|4/5上司Cのレビュー完了。指摘を修正中。<br>4/3パワーポイント作成完了。上司Ｃにレビュー依頼<br>4/1調査開始。|
|02|資料１の作成|資料１を作成し、レビューが完了する。|4/10|Aさん|レビュー依頼中|4/5作成完了。上司Ｃにレビュー依頼中。<br>4/3 着手開始<br>|
|03|○○の決定|××さんと会話し、○○の方式について決定し、設計書2に記載する。|4/18|Bさん|未着手||


タスクが少ないうちは上手く管理できていましたが、タスクが増えた際、次の問題が発生しました。


## 問題
・同じ期限のタスクがたくさんあり、優先順位をつけられない。
・あとどれくらいで残タスクを消化できるか定量化できない。

【背景】
タスク量が少ないうちは、タスクにかかる時間と担当者の能力、顧客や次工程への影響を考慮しながら期限を設定できていました。
しかし、タスクの量が増えてくると、次第に顧客説明の日程や次工程に影響するラインから逆算して期限を設定するようになりました。その結果、同じ期限のタスクが大量に発生しました。

## 改善策

### １. 重要度設定の追加 
目的：タスクが遅延した際、どのような影響があるか把握する。

項目　
高：顧客影響あり
中：次工程へ影響あり
低：ベストエフォート

### 2. 作業量の追加
目的：作業にかかる工数の定量化
タスク数と期限だけでは、期限や担当者に対してタスク量が妥当か判断できず、遅延原因や進捗状況が把握できません。特に、同じ期限のタスクが複数発生した場合や、他チームからの情報連携が必要なため、期限が長いタスクについては、期限だけでは作業量を正確に把握することが困難でした。

### 3. 難易度の追加
目的：遅延リスクのある作業がどれかを可視化する。メンバーのスキルに応じてタスクを割り振る。

高：追加でやるべき作業や大幅な手戻りが発生し、作業量が増加する可能性あり。
中：レビュー指摘による修正がいくつか発生する可能性あり。
低：テンプレートが決まっている、何度も行っている単純作業。レビュー指摘もごく少量

### 4. 項目の順番の見直し
目的：管理簿を見やすくする。

・期限と重要度を隣にし、期限を超過した影響が分かりやすくした。
・担当者の横に作業量と難易度を追加し、担当者のスキルを踏まえて難易度を設定できるようにした。
・フィルターすべき項目（起源やステータス、難易度など）がスクロールせずとも１画面に収まるようにするため、完了条件、対応状況等、たくさん文字を書くものは後ろに配置した。


|項番|タスク名|期限|重要度|担当者|作業量（人日）|難易度|ステータス|完了状況|対応状況|
|--|--|--|--|--|--|--|--|--|--|
|01|○○の方式についての調査|4/7|中|Bさん|1|高|レビュー後修正中|設計書2の○○の設計について、どの方式があるか調査し、パワーポイントにまとめる。|4/5上司Cのレビュー完了。指摘を修正中。<br>4/3パワーポイント作成完了。上司Ｃにレビュー依頼<br>4/1調査開始。|
|02|資料１の作成|4/10|高|Aさん|2|中|レビュー依頼中|資料１を作成し、レビューが完了する。|4/5作成完了。上司Ｃにレビュー依頼中。<br>4/3 着手開始<br>|
|03|○○の決定|4/18|中|Bさん|1|低|未着手|××さんと会話し、○○の方式について決定し、設計書2に記載する。||


## 感想
管理簿の項目やその順番で、タスクの見え方が大幅に変わることに気づきました。ただ、入力項目が増えると入力者の手間が増え、（さらにエクセルも重くなる）ため、どこまで項目を使うべきかの加減が大切だと感じました。自分なりの管理簿の型を作ってブラッシュアップし、効率的に管理できるようになりたいです。また、タスクの進捗状況や、誰がどの程度タスクを担当しているか（量や難易度など）は、グラフにして把握できるめ、エクセル等からグラフの作成まで行って、定量化を自動化したいと思いました。
【生成AIアプリ100チャレンジ】（1）自然言語生成AIアプリ

# 公開中サイト

https://ai.nuevo.jp/

# 開発環境

|              |              |
|:------------:|:------------:|
| Server       | lightSail    |
| Language     | Python3.11   |
| Framework    | Django       |
| DB           | sqlite3      |

ローカル環境ではPythonのvenvを使用。エディタはvs codeです。

# PYTHONとDjango環境

　生成APIが流行しているので、PYTHONとDjango環境でアプリを作成してみた。
最初のアプリなのでプロンプトを送ったら、プロンプトが戻ってくるだけのシンプルなものです。
基礎中の基礎ですけれども、プロンプトを送ってレスポンスをもらうだけですが、いろいろと大変だった。

https://docs.djangoproject.com/ja/5.0/

　それと、PHPエンジニアでPYTHONはまだまだ経験不足だったので、フレームワークのDjangoの特徴を把握するのにも苦労しました。

　慣れてくると、Djangoは生成APIのアプリ作成にとても相性がいいことが分かり始めた。
 アプリを作るのはたった 1line のコマンドで作成できる。

```
 python manage.py startapp {myapp}
```
 これだけです。
 
　データベースの更新も下記コマンドだけ。

```
python manage.py migrate
```
　これでアプリの雛形ができます。
 
 おそらくDjangoでWEBサイトを構築するのはLaravelよりずっと工数がかかるだろう、しかしLaravelで生成APIアプリを量産するよりもはるかに、工数が少なくアプリを作成できるのはDjangoだと思う。プロジェクトの考え方が違う。DjangoはシンプルなWEBアプリを量産しやすいフレームワークという印象をもった。

　なんせアプリ作成コマンドでアプリ構造ができ、プロジェクトフォルダに登録するだけでいいのだ。あとはPYTHONファイルに生成APIアプリを呼び出せばいいだけ。

https://www.nintendo.com/jp/zelda/totk/index.html

 あまりに簡単なので、「ゼルダの伝説ティアーズオブザキングダム」で武器をクラフトしている感覚に似ている。あれとあれを組み合わせて、クラフトして課題をクリアしていく、あの感覚そっくり。ゼルダの伝説のクラフトを現実でやっている。
  
https://www.gamecity.ne.jp/atelier25th/
  
  またはアトリエシリーズで錬金しているような感覚にも近い。「あのAPIとあのAPIを組み合わせたら、こんなことできる！」ってことばかり考えてしまう。本当にDjangoのおかげです。もし、Laravelでやったら、めんどくさって思ってたと思う。やはり、「人工知能時代の言語はPHPじゃなくPYTHONなのだ。」と理解した。

# アプリ画面

![スクリーンショット 2024-03-28 21.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/53102042-3896-b741-23df-3f509a65e5a7.png)

　とりあえず、プロンプトを送って、レスポンスをもらうだけのアプリです。この基礎が大事。ここで渡すプロンプトを裏側でちょこちょこしたり、ファインチューニングしたり、トレーニングすれば、ChatGPTは医者にもなるし、弁護士にもなるし、ファイナンシャルプランナーにもなれる。まさに生成AIは人類の夢への第一歩だと思う。

　コードの解説を詳細にするつもりはありません。公式マニュアルには勝てないので、簡単なベースとなるコードだけ記述します。

## Chat_app
```
    chat_results = ""
    if request.method == "POST":
        form = ChatForm(request.POST)
        if form.is_valid():
            sentence = form.cleaned_data['sentence']
            client = OpenAI(
                api_key = OPENAI_API_KEY,
            )
            response = client.chat.completions.create(
                model="gpt-3.5-turbo",
                messages=[
                    {
                        "role": "system",
                        "content": "日本語で応答してください"
                    },
                    {
                        "role": "user",
                        "content": sentence
                    },
                ],
            )
            chat_results = response.choices[0].message.content
```
 chatGPTは3.5を使いました。ChatGPT4も使用できますが、トークンの節約。要するに倹約です。最近の事情が必要なアプリでしたら、4を使おうと思います。今回は基礎アプリ仕様です。
 制作で苦労したのはOpenAiが2024年1月にアップデートしていたせいでほとんどのブログ記事が参考にならなくなっていてたことです。 

```
 openai.NotFoundError
```
openaiをインストールしてもでてくるので。検索してみると、

```
pip install openai==0.28
```

バージョンを戻したら解決するよ。というありがたい助言。心の中で

```
「軽く死ねますね。」（CV：早見沙織）
```

ブログなんて読まずに本家のマニュアルを読んでください。

コード説明ブログは寿命が短い上に、月日が経つと虚言記事でエンジニアを迷い狂わせるよね。



　【生成AIアプリ100チャレンジ】の1つ目でした。
VLANとは

前回(https://qiita.com/daisei0311/items/2a110009765d3ee823d7)
に引き続きL2スイッチの学習のため　VLANについて概要をつかみ、動きを確認した。

# VLANとは
一台のL2スイッチを仮想的に複数のL2スイッチに分割する技術。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/1a31d716-eafc-3955-8a8b-c59885182277.png">
こうすることでイーサネットフレームが転送されないようにしている。セキュリティの観点で利便性がある。VLANを実現する技術は主に2種類。

・ポートLAN
・タグLAN
それぞれ説明する。

## ポートLAN
１つのポートに対して、１つのVLANを割り当てる技術。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/4343df28-1339-9143-9253-a8c12c4a679d.png">

異なるVLANにはイーサネットは送られないのであたかも別のネットワークかのように扱うことができる。
実際にtagで１，２のVLANに分けている様子。
```
root@sw2:/# ovs-vsctl show
c449231f-1713-4929-a85d-a43ba84a84f3
    Bridge sw2
        datapath_type: netdev
        Port port4
            tag: 1
            Interface port4
        Port port3
            tag: 1
            Interface port3
        Port port2
            tag: 2
            Interface port2
        Port sw2
            Interface sw2
                type: internal
        Port port1
            tag: 2
            Interface port1
```
このように設定すると異なるVLANにパケットが送れなくなっている。

## タグVLAN
イーサネットフレームにVLAN情報をくっつける技術。ポートVLANとの違いは一つのポートで複数のVLANを処理できること。

パケットにタグをつけて送ってあげる。スイッチはそのタグを見て、どのパソコンにデータを流すか決める。こうすることでLANケーブルをまたいでも複数のL2スイッチに分割できる。つまりLANケーブル一本で複数のVLANとの通信をすることが可能となる。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/6b8c9316-5bfa-39e2-b5b5-f8d422b84179.png">

フレームフォーマットはIEEE.802.1qの標準規格が採用されている。イーサネットフレームと異なる点は送信先MACアドレスとタイプトの間にTPIDといったLANを識別する情報とそれに関する詳細情報を載せていることである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/19be42d2-40b7-5ba8-5156-704277cb6454.png)

以下はタグVLANのタグの割り当ての情報を記載したものである。
```
root@sw2:/# ovs-vsctl show
c449231f-1713-4929-a85d-a43ba84a84f3
    Bridge sw2
        datapath_type: netdev
        Port port4
            tag: 1
            Interface port4
        Port port3
            tag: 1
            trunks: [2]
            Interface port3
        Port port2
            tag: 2
            Interface port2
        Port sw2
            Interface sw2
                type: internal
        Port port1
            tag: 2
            Interface port1
```
Port3のTrunks:[2]となっている。これはvlan2のIDを意味する（ポートVLANのovs-vsctl showの結果を参照）。portにtag=3を指定してたのであればtrunks=3となる。複数指定の場合はコンマ区切りで表す。

このようにすることでport3から入ってくるイーサネットフレームはtagが1,2のところに送信できるようになる。
connect-flashのメッセージが消える

Express3系でFlashメッセージを表示する為、connect-flashというパッケージを追加して、（勝手に）罠にハマったので共有しておきます。

https://www.npmjs.com/package/connect-flash

サンプルコードを見ながら、下記のようなコードを書いて動作チェックしました。

``` app.js
app.get('/flash', function(req, res){
  req.flash('info', 'Flash is back!')
  res.redirect('/');
});

app.get('/', function(req, res){
  console.log(req.flash('info'));  // デバッグ用にメッセージを仕込んだ
  res.render('index', { messages: req.flash('info') });
});
```

``` index.ejs
<% if (messages){ %>
  <p><%= messages %></p>
<% } %>
```

## 問題

app.jsのconsole.logのではコンソールにメッセージが表示されるのですが、Viewでは表示されません。

## 原因

req.flash('info') を参照すると中身が消去されるようです。
今回、デバッグ用のconsole.logが最初に参照した為、Viewに渡す時には中身が空になっていました。
【初学者】git add, commit, push の意味・使い方

## git add, commit, push の意味・使い方

### はじめに
gitの `add, commit, push` って意味が似てるよな...。
初学者の自分にとってはややこしいものだったので整理しておきます。

## ① git add とは？
##### `git add`は、ソースファイルをインデックス（ステージング）に追加するコマンドです。

ファイルを指定して追加する場合は以下のようにファイルを指定します。
```
git add ファイル名
```
該当フォルダ内の全てのファイルを追加する場合は以下のようにします。
```
git add .
```
「.ドット」で、全てのファイルを指定しています。

## ② git commit とは？
##### `git commit`は、インデックス（ステージング）に追加されているファイルをローカルリポジトリに追加するコマンドです。
git commit をする際は以下のようにコミットメッセージを追加しましょう。
```
git commit -m "コミットメッセージ"
```
:::note info
コミットメッセージを追加する理由は、変更履歴をあとから見たときにどのような変更を行ったのかがひと目で分かるようにするためです。
:::

## ③ git push とは？
#### `git push`は、ローカルリポジトリに追加したファイルをリモートリポジトリにアップロードするコマンドです。
git push の具体的な使い方は以下のとおりです。
```
git push origin master
```
:::note info
リモートリポジトリにアップすることで、他の人からもコードが見えるようになります。
:::

以上、**git** の **add, commit, push** コマンドの意味・使い方について簡単に記載しました。
HeliScriptでリッチなアスレチックワールドを作ろう！【コピペで使えるサンプルコード付き】

:::note info
本記事は、VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。
:::

## はじめに
Vket Cloudには、HeliScriptというVket Cloud用のスクリプト言語を使って、ワールドに自分だけの複雑なギミックを作成することが出来ます！
この記事では、実際に動くサンプルコードを見ながら、様々な機能を体験しつつ初めてのHeliScriptを使ったアスレチックワールドを作れるようにすることを目的としています。

## 対象読者
* VketCloudSDKを実際に使ったことがある人
    * 実際に使ったことがない人は[【ワールドの作り方：準備編vol.1】アカウント設定](https://magazine.vket.com/n/n8dbabbb95bc8)をご参照ください
* 型、for文、if文、関数、クラスといったプログラミングの基礎は把握している人

## 使用バージョン
Windows 11
VketCloudSDK 12.3.4

## どういったものを作るのか
今回のアスレチックワールドとして、プレイヤーが上に登っていくようなアスレチックを作ってみようと思います！

このアスレチックには、エリア全域にまたがるギミックとして、
* どんどんと上ってきて、プレイヤーが当たるとゲームオーバーになるマグマ
* ある程度のところまで進んだらそこからスタートするための中間ポイント
* ゲームオーバーとリトライ

それぞれのエリアごとのギミックとして
* 上下に反復して動く床
* 回転するポール
* 横に押し出されるブロック
* 振り子

を制作します。

## 完成したプロジェクト
**ワールド**
[駆け上れ！　遺跡アスレチック！](https://iwahana.cloud.vket.com/worlds/Bvfa4hYD/main.html?worldid=Bvfa4hYD)

**リポジトリ**
https://github.com/IwahanaFuku/VketCloud_RichAthletic

## 目次
* [HeliScriptの基礎知識](https://qiita.com/IwahanaFuku/private/3622a2d2ac15a97a5e06)
* [HeliScriptを扱う上での事前設定＆Tips](https://qiita.com/IwahanaFuku/private/8cf9f74a7b2dff5d93d9)
* [HeliScriptでアイテムをまっすぐ動かす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/f171b7af2a9e15dc2139)
* [HeliScriptでアイテムを反復して動かす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/items/dfc38371ad0ed7cc034d)
* [HeliScriptで中間ポイント、ゲームオーバー、ゲームクリアを実装する【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/items/a5479a1a13f6267e558d)
* [ワールドを一通り遊べるようにする](https://qiita.com/IwahanaFuku/items/f45059a11c83a367cb6c)
* [HeliScriptでアイテムを回転させる【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/48611f49b875529cedf0)
* [HeliScriptで振り子を動かす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/private/886ff5e61282bf7b611d)
* [HeliScriptでアイテムを揺らす【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/items/607d73db767362c0162f)
* [プレイヤーの名前とクリアタイムを表示できるようにする【コピペで使えるサンプルコード付き】](https://qiita.com/IwahanaFuku/items/f43127bea0cbd6447acb)
* [今まで作ったcomponentを使ってワールドを完成させる](https://qiita.com/IwahanaFuku/items/3aff716f20ec998144ad)

**次 :** [HeliScriptの基礎知識](https://qiita.com/IwahanaFuku/private/3622a2d2ac15a97a5e06)
【Zod】バリデーション前にデータを変換する方法

`.preprocess()`を使用することで、スキーマのバリデーション前にデータを変換できます。

## 使用方法
`.preprocess()`は、引数として関数を受け取ります。この関数は、バリデーション前の元のデータを引数として受け取り、変換後のデータを返します。

```ts
const castToString = z.preprocess((val) => String(val), z.string())

console.log(castToString.parse(123));  // '123'
console.log(castToString.parse(true));  // 'true'
console.log(castToString.parse({foo: 'bar'}));  // '[object Object]'
```

上記のようにデータの型を強制するだけであれば`coerce`が使用できます。

```ts
const schema = z.coerce.string()

schema.parse("tuna"); // => "tuna"
schema.parse(12); // => "12"
```

https://zod.dev/?id=coercion-for-primitives
YOUTRUST x ゆめみ Flutter LT会@渋谷＆オンライン #5_レポート



# 参加したイベント
久々のLTに参加させていただくことができたので、復習がてら各発表者さまのスライドと該当動画部分をまとめておきます。

https://yumemi.connpass.com/event/308489/

# 発表内容一覧

### 西真央さん:社内Flutter強化期間 x Flutter教本の作成をしました	

スライド未掲載なので動画URL掲載

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=8m00s


### 室山大輔さん:まだ間に合う 🌏 Privacy Manifests 対応

スライド未掲載なので動画URL掲載

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=15m00s

### ashdikさん:Adaptationについてサクッと解説	

スライド未掲載なので動画URL掲載

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=20m35s

### いせりゅーさん：FlutterとWeb3	

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=26m47s

https://speakerdeck.com/iseruuuuu/fluttertoweb-3

https://github.com/iseruuuuu/wallet_connect_app

### kumamo_toneさん:YOUTRUSTでやった技術発信まとめ	

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=35m55s

https://speakerdeck.com/kumamotone/youtrustdeyatutaji-shu-fa-xin-matome

### 渡部陽太さん:TBD

スライド未掲載なので動画URL掲載

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=44m20s

### 3ta0212さん:複数のAsyncValueをどう扱うか	

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=52m30s

https://zenn.dev/3ta/articles/807b3d2009e093


### そたさん:カスタムのライセンスページを作る時にハマったポイント	

https://www.youtube.com/watch?v=fBNEt6EOOHU#t=57m50s

https://speakerdeck.com/sotaatos/flutterderaisensupeziwodu-zi-nizuo-ruji-nohamaripointo
# 参加した感想

Flutter最高。LTマジで最高。
こんな弱小エンジニアと話してくださった方々ありがとうございました。（就活頑張ります）
はじめまして

## 自己紹介
投稿者のバンカボンと申します。
某企業で、AWSを中心とするインフラエンジニアとして従事しております。
中卒でも未経験からでもインフラエンジニアになれるぞというところを参考程度に生暖かい目で見てもらえると助かります。

## 目的
- 将来エンジニアになりたいという人
- 学歴はないけどエンジニアになりたいという人
- インフラ興味あるけどどうやってやったらいいかわからない人

## 目次
- 今までの経歴
- 今やってること
- 具体的にどんなことをするとエンジニアになれるのか
- まとめ


## 今までの経歴
私がこの世界に入ったのは、２４歳の夏のことでした。
前職は旋盤の職人として３年ほど工場に勤めているその辺の人でした。
そこで私は体調を崩して退職をきっかけに、キッティング（PCを永遠に同じ設定にし続ける仕事）に業務委託として参入しました。
そんなことを半年している間に、いろいろなお仕事をもらいながらこなしていくうちに、データセンターのL1作業をお手伝いさせてもらえることになりました。
そこからが私がインフラ沼に入ったきっかけです。
現場に入ったときに単純に「すげーサーバーの量だ、、、」が最初の感想でした。
そんなこんな仕事をこなしていくうちに、中小企業さんを中心にネットワーク機器を導入している企業様からお仕事の依頼をいただけるようになりました。
そこからはとんとん拍子に、YAMAHA,アライドテレシス、cisco製品、fortiあたりのネットワーク機器の設定を頼まれるようになり、ハマった結果、自宅にネットワークを組むようになりました。
![F5GLMJWbYAAOt3W.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755767/217a2447-7e3c-6153-1a37-decad85326ee.jpeg)
そんなある日某大手企業さんからヘルプデスクにきてくれとご依頼をいただき、いくことに。。。
そこはインフラ領域を担っているところでした。
初めて触るものばかり、AWS,Azure,AzureAD,AD,SSO周りなどなど、、、
仕組みを理解するために、自分でAWS触ったり、家にオンプレでADを組んだりして試験して学習しておりました。
そんなことを３年目に差し掛かる時に、転職をしようといろいろ回っていたところ今の企業に当たりました。

## 今やってること
私が今企業に入ってやってることを大雑把に箇条書きにしてみました。
### サービス
- AWS
- GCP
- AzureAD
- jamf
- Okta
- ...etc

### 言語
- terraform
- CloudFormation
- python
- ruby
- Docker

毎日これらをこねくりまわしながら、要件定義、検証、導入、保守を行ったりしてます。
そんな人数が多いチームではないのでいろいろゴニョゴニョとやっているわけです。

## 具体的にどんなことをするとエンジニアになれるのか
個人的な主観ですが、やっぱ興味と心から好きと言えるかってところだと思います。
自分みたいにコーディング嫌い、苦手って思っててもインフラでも結局コーディングしてますw。
どんなことをするとエンジニアになれるかというと、少しづつでも興味と向上心をもって前に進めることかなと思います。
自分は結構前職の環境が恵まれてたんだろうなって思います。
営業もやりながら技術もやるみたいなことをずっとやってましたから、個人事業主に近い動きをずっとしてたと思います。
そんな環境簡単に見つからないですし、恵まれてたことは前職の社長には感謝です。
フリーランスでも昨今案件も多いので自分の手の届く範囲で、手をつけていくとエンジニア転職に一役買うと思います。

## まとめ
これからエンジニアに転職したい、これから新卒でエンジニアになるみなさん。
少しでもいいので、興味と向上心ももって取り組んでもらえるといいと思います。
最終的にそんなまとまりがなくなってしまいましたが、もし興味があったらXやこちらのコメントでご連絡いただけると幸いです。
[体験記] 基本情報技術者試験（FE）の勉強開始～合格まで

## はじめに
私は2024年3月に受験した基本情報技術者試験において、「科目A:680点 科目B:690点」を取りました。
勉強時間は約18日間、休日含めて1日平均6時間となります。
試験日は当初、勉強開始から一ヵ月後を予定しておりましが、模擬試験の結果から日付を前倒しすることにしました。

基本情報技術者試験は2023年4月以降、年2回の筆記形式から、通年試験(CBT方式)に変更され、試験日の変更は3日前まで可能となりました。
もし、試験予約する際はバッファを持たせて、**ご自身の学習進捗を鑑みて日程調整する**ことをおすすめします。


## 試験対策前の状況
勉強を本格的に開始する前に模擬試験結果は「科目A:55% 科目B:70%」ような正答率で、科目Aの出題範囲に関しての知識が足りなく、不安な状態でした。


## 勉強した流れ
### week 1：科目A対策　とりあえず参考書を1周する
[いちばんやさしい 基本情報技術者　絶対合格の教科書＋出る順問題集](https://www.amazon.co.jp/%E3%80%90%E4%BB%A4%E5%92%8C%EF%BC%96%E5%B9%B4%E5%BA%A6%E3%80%91-%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E7%B5%B6%E5%AF%BE%E5%90%88%E6%A0%BC%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%EF%BC%8B%E5%87%BA%E3%82%8B%E9%A0%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E9%AB%98%E6%A9%8B-%E4%BA%AC%E4%BB%8B/dp/4815624267)を1日平均3章ずつ進めていきました。
上記テキストでは、各章の最後に過去問があるので、1章読み終えたら問題を解き、誤答したらその箇所を再度読み解くようにしておりました。

### week 2：過去問道場の模擬試験＋科目Bの参考書
過去問道場の模擬試験形式を1日1回やり、誤りが多かった範囲を再度テキストで復習しておりました。
並行して、科目Bの疑似言語の出題内容と疑似言語の文法ルール、情報セキュリティに関して学ぶ為に、[情報処理教科書 出るとこだけ！基本情報技術者［科目B］](https://www.shoeisha.co.jp/book/detail/9784798182520)を1日3章進めておりました。
テキストには問題の解法が細かく記載されておりますが、これを真似ると問題解くのに時間が掛かるので、あくまで参考程度にしてご自身がやりやすいトレース方法を模索するのがよさそうです。(科目Bは1問5分で解かないといけないのでスピーディかつ正確に書けるようにしていく)

### week 3: 合格基準の+20%を模試で取れるように
本番では普段より点数が低くなるだろうと思い、科目Aは過去問道場の模試が3回分の平均がだいたい8割超えるまで繰り返ししました。（合計11回分でした）
科目Bの対策としては模試1回目で75%だったので、疑似言語は一日1問解いて復習し、情報セキュリティは試験4回分の過去問を解きました。

### 試験当日
試験前に多くの問題解くと疲れて本番で集中力途切れると思ったので、当日は科目Aの各分野の用語の意味を復習する＋科目Bの情報セキュリティに関する過去問を試験1回分を解くぐらいにしました。


## 振り返り
模擬試験をやりすぎたせいか当日は緊張感より、倦怠感の方が強かったです。
科目Aは過去問と同様もしくは類似するものが多かったので、テキストなど購入せず「過去問道場」をひたすら解けば効率よく合格ラインに達するかもしれません。
ですが、ずっと4択の正誤を解くのは飽きるし、解答を脳死でインプットされてしまうかもしれないので、
基礎知識を身に着ける為にも、参考書を読んで理解するのは有意義かと思います。
科目Bに関しては最初丁寧にトレース表を書いていて2問ほど時間が足りませんでした。（最初の簡単な問題でもトレース表書いてた...）

## 最後に
ご覧頂きありがとうございました。
アウトプットの練習をしたいと前々から思っていた中で、ちょうど資格を取得をしたので今回初投稿させて頂きました。
これから受験される方もしくはご興味がある方のご参考になれば幸いです。


P.S.
基本情報技術者試験では課金すれば科目Aを1年間免除できるチートがございます。
お金の余裕（3万前後？）があり、なるべく楽したい方にはありかもしれません。
（新卒でSE会社に入社される方は研修のカリキュラムに組み込まれているかもしれないのでご留意を）

・[科目A試験免除制度 基本情報技術者試験（FE）](https://www.ipa.go.jp/shiken/about/menjo-fe.html)


## 参考書
・[いちばんやさしい 基本情報技術者　絶対合格の教科書＋出る順問題集](https://www.amazon.co.jp/%E3%80%90%E4%BB%A4%E5%92%8C%EF%BC%96%E5%B9%B4%E5%BA%A6%E3%80%91-%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E7%B5%B6%E5%AF%BE%E5%90%88%E6%A0%BC%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%EF%BC%8B%E5%87%BA%E3%82%8B%E9%A0%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E9%AB%98%E6%A9%8B-%E4%BA%AC%E4%BB%8B/dp/4815624267)
・[情報処理教科書 出るとこだけ！基本情報技術者［科目B］](https://www.shoeisha.co.jp/book/detail/9784798182520)
・[基本情報技術者過去問道場](https://www.fe-siken.com/fekakomon.php)
『モデルベース深層学習と深層展開』読み会レポート#0

# 概要
- オンラインで開催している[『モデルベース深層学習と深層展開』読み会](https://majime-ni-study.connpass.com/event/)で得られた知見や気づきをメモしていく
- ついでに、中身の理解がてらJuliaサンプルコードをPythonに書き直したコードを晒していく
    - 自動微分ライブラリにはJAXを使用する

# 第0回
## 大まかな内容
- モデルベース深層学習と深層展開の概説
- 上記がどんな事に応用可能か
- 微分可能プログラミングとしての実現方法について
## 議論になったこと
### 1.1.1節 あたり
- モデル駆動アプローチの実例
    - 制御だと運動の法則等からモデリングする
    - 通信だと、電波や媒質（空気など）を支配する法則からモデリング
        - アンテナなど部品は物理系の法則
- 通信だと周波数領域のパラメタの同定に学習要素があるかも
- 図1.1を眺めながら
    - 真ん中の図はNNの重みも学習可能パラメータでは？
        - おそらくそう。NN以外の計算に埋め込んだパラメタもNNのパラも同時に組み込める的な事を表現しているのでは

### 1.1.2節 あたり
- なぜ”微分可能”が重要なのか
    - 勾配ベースの方法を使った最適化をするために必要
        - 勾配法以外もやり方はあるが、なんやかんや勾配法は速いし複雑な問題も割とシンプルに解ける
        - 個々が微分可能なものの集まりは全体で微分可能って性質も強い

### 1.1.3節 あたり
- 図1.3を眺めながら
    - 左下の”系の支配方程式”の$\alpha,\beta$が学習パラメータということなのか
        - そういう場合もあるし、式自体が書き下せない場合もあるのでは
    - この学習は普通の深層学習と何が違うのか
        - モデルベースだと、パラメータ数が圧倒的に少なく学習が収束しやすいのでは
            - 動的システムのオンライン学習にも向いている
### 1.1.4節 あたり
- 爆発を伴う場合などの不連続な系についての流体力学シミュレーションにもモデルベース深層学習は適用できるのか？

### 1.2.1節 あたり
- 条件分岐って、本当に他の一般的な自動微分ライブラリでも対応してんの？

### 1.2.2節 あたり
- 微分対象の変数で定義した条件分岐をさせても導関数が取得できるのか？（不連続で無理とかならない？）
    - やってみたらできた
###
## 個人的な気づきなど
- 一人だと図を深く考えずに読み流してる事が多かった。改まって参加者の方々と議論して気づけた事があってよかった。
- 会の後の雑談の中で、Juliaのサンプルコードを弄って遊んでいると、結構無茶な分岐についてもエラーなく微分してくれいて、「逆にどんな風に関数を定義するとまずいんだろう」的な話題になった。その場ではナアナアにしてしまったが、後で考えると、「エラーなく微分が実行出来ること」と、「それを元に勾配法がうまく収束するか」は、別問題だがごっちゃにして話てたかもと思った。今後の勉強会で機会があればその辺議論したい。

# プログラムでの理解
- 今回の範囲では1.2.2節で、微分可能プログラミングの簡単な例を扱った
- 和田山先生公開の[サンプルプログラム](https://github.com/wadayama/DU-Book)をPythonで再現する
- プログラムの全文は[この辺](https://github.com/gomi-kuzu/model_base_deep/tree/master/work/TranslateToPy/Chapter_1)に上げている

## 問題設定
sin関数のマクローリン展開
$$
\sin(x) = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdots+(-1)^i\frac{x^{2i+1}}{(2i+1)!}+\cdots
$$

を$i=n$の項までで打ち切った、打ち切り関数を実装し、その（プログロムの意味での）関数の自動微分とcos関数の出力を比較してみる

## Pythonで実装
### 必要ライブラリインポート
```python
import jax
import math
```
自動微分にはJAXを用いる

### 打ち切り関数の定義
`n`の値は教科書と揃えてある
```python
def tsin(x):
    sum = 0
    n = 8
    for i in range(n):
        if i%2 == 0:
            sum += (1/math.factorial(2*i+1))*x**(2*i+1)
        else:
            sum -= (1/math.factorial(2*i+1))*x**(2*i+1)
    return sum
```
※今回はオリジナルのJuliaコードになるべく合わせる意味でもif文で記述したが、jitコンパイラを使いたい場合はifを`np.where`で置き換える。また、階乗の計算も`math`ライブラリよりjax.scipy.spatialに収録されたものを使ったほうがいいかもしれない。

### 微分した関数の取得
```python
d_tsin = jax.grad(tsin)
```
これで、sinの微分であるcosの近似関数が得られる


### 図示
適当な等差数列で入力を作成し、numpyのcos関数と比較する
![c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105988/f212da21-d366-5142-732c-05fc60da3722.png)
教科書と似たような出力を得られた！
### 余談
実は、サンプルプログラムの$x$の値域と打ち切り次数$n$は絶妙で、少し設定を変えてプロットすると以下のようになる。（マクローリン展開は0付近での近似なので、当たり前ではある）
#### 値域を1.5倍にしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105988/bdfe06cf-b7e2-16a8-0faa-71a1da619076.png)
#### n=6にしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105988/26379898-9f4c-c471-7747-655907dc2b54.png)

# その他
- Zygoteは「ざいごーとぅ」と読むらしい…
# バックナンバー
- [『モデルベース深層学習と深層展開』読み会 レポート（開催前準備編）](https://qiita.com/gomi-kuzu/items/d02c549053fbf1e02fd3)

# 参考文献
[モデルベース深層学習と深層展開 森北出版(刊)  和田山 正(著)](https://www.morikita.co.jp/books/mid/085731)
Claude3を使って、Reactをキャッチアップする

# 概要
サーバーサイドエンジニアの筆者が、Reactを学習する際に、最近話題になっているClaude3を使ってキャッチアップをした記録です。

# 今回学習をしたこと
TypeScriptで重要な型定義について、理解が浅かったため、型定義を学ぶための問題を作成してもらいました。
以下のようにClaude3に役割を与え、学習をしたいテーマについての問題作成とレビューをしてもらうようにお願いしました。
![スクリーンショット 2024-03-25 22.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987584/a1b508d2-7445-d86b-f8ca-19c7c2fbbd3d.png)

以下のような感じで、型定義についての問題を作成してくれるので、それに対しての回答を作成します。
Claude3では「```」と入力することで簡単にコードブロックを作成することができるので、便利です！他にも「-」でリストも作成できるのでケースバイケースで使い分けると理解してもらいやすい文章を作成できます。
![スクリーンショット 2024-03-25 22.36.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987584/00e2e518-77c6-6822-8071-9a3096f031dd.png)


仮に間違った回答をしても、褒めた上で修正をしてくれるので、お豆腐メンタルにも優しい仕様ですね笑
![スクリーンショット 2024-03-25 22.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987584/24c46213-0e96-e4c6-96ed-52ba8e7dc222.png)

# 最後に
これまで、ChatGPT一択でチャットボットを使用していましたが、個人的にはClaude3の日本語は自然で、ChatGPTよりもわかりやすい言い回しだと感じました。また、マークダウンを使用してプロンプトを作成することができるので、見やすい文章を作成できる点も便利だと感じました。
月額20ドルで少々お高いですが、使用してみる価値は大いにあると思いました。

https://claude.ai/chats
既にGo言語がインストール済みの場合に新しいバージョンに切り替える

Go言語のv1.22がリリースされたので試したいとなったときに、自身の環境には既にGo言語のv1.20がインストールされていました。

どうやって新しいバージョンをインストールして切り替えればよいのか分からなかったので調べた所、〇〇env系のツールを使わずともできることを知りました。今回は、[Goの公式ドキュメント](https://go.dev/doc/manage-install)の方法で切り替えました。

## 新バージョンのインストール

バージョン番号は [All releases](https://go.dev/dl/) を参考に今回は `1.22.1` をインストールします。

```bash
$ go install golang.org/dl/go1.22.1@latest
```

`GOPATH` 配下にソースがインストールされます。`GOPATH` の場所は `go env GOPATH` で確認できます。

次に `download` コマンドを実行すると、`~/sdk` 以下に指定したバージョンのGoがインストールされます。

```bash
$ go1.22.1 download
...省略
Unpacking /home/snyt45/sdk/go1.22.1/go1.22.1.linux-amd64.tar.gz ...
Success. You may now run 'go1.22.1'
```

goコマンドの末尾にバージョン番号を追加したコマンドを実行して、指定バージョンのGoがインストールされていることを確認できました。

```bash
$ go1.22.1 version
go version go1.22.1 linux/amd64
```

## goコマンドを切り替える

ここまで新バージョンをインストールできましたが、goコマンドのバージョンは古いままのため新しいバージョンのgoコマンドを使うようにする必要があります。

`GOROOT` に Go SDK のパスを設定するために、`1.22.1` の `GOROOT` の値を取得します。

```bash
$ go1.22.1 env GOROOT
/home/snyt45/sdk/go1.22.1
```

次のコマンドを実行してgoコマンドのバージョンを切り替えます。

```bash
$ export GOROOT=`go1.22.1 env GOROOT`
$ export PATH=$GOROOT/bin:$PATH
$ go version
go version go1.22.1 linux/amd64

# 永続的に有効にしたい場合は`~/.bashrc`などに記述する
echo 'export GOROOT=`go1.23.3 env GOROOT`' >> ~/.bashrc
echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```


## 参考
- [Managing Go installations](https://go.dev/doc/manage-install)
- [Goの複数バージョンをインストールして切り替える](https://qiita.com/kane8n/items/83a9288927d968a8f695)
- [Golang Basics: GOROOT, GOPATH
](https://medium.com/@ugurkinik/golang-basics-goroot-gopath-3f80063a08d8)
vectorのassignについて

## vectorのassign
- 競プロでよく出てくる`std::vector`のメソッド`assign`についての軽い解説
#### いつ使うの ?
- ベクターを"好きな要素数分"だけ"指定する値"で埋めたいときに使う
- これだけだとわからないと思うからコードで理解しよう
```c++
std::vector<型> vec;
vec.assign(要素数,指定する値);
```
- 具体的に書くと
```c++
std::vector<int> vec;
vec.assign(4,10);
```
上のコードだと4つ要素を値10で埋めることになる
つまり初期化するときとかに便利
※もちろんint型以外でも使えるよ

---
#### 他にもこんな使い方が!?
```c++
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6, 7};

vec1.assign(vec2.begin(), vec2.end());
```
__さっきとは使い方が違うので注意!__
上を実行するとvec1の内容がvec2の内容に置き変わる!

---
#### まとめ
`std::vector`の要素を好きな数字で埋めたい時(初期化の時とか)に使うんだな~の理解で大丈夫
よく使うのは
```c++
std::vector<型> vec;
vec.assign(要素数,指定する値);
```
こっちだよ
油断した・・AWS Certified Developer - Associate合格体験記

# 先日、SAA-C03に続いてDVA-C02を取得しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/ebfda409-ba4f-fcb7-d9ca-6a60eaa4773f.png)

こちら前回のSAA取得時の記事です。
↓

https://qiita.com/Kue_Lee_Jei/items/d91c719ac13878b3f9b2

# ただ、正直一発で合格りたかった・・・
SAAに比べたら問題文は短いし、範囲も狭い。下馬評からも楽勝ムードが漂い1ヶ月でいけるだろうと思っていたが、まさかの不合格。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/5e99f032-54a8-74a1-e747-10a3d24f06a9.png)

# 敗因
:::note warn
①スピード重視で答え暗記に終始してしまった。
⇒模試でほぼ満点取れていたのに・・。（選んだ教材が簡単すぎたのもある）
:::

:::note warn
②わからない単元を超絶なんとなくで理解していた。
⇒特にLSI・GSIの違いやCognitoユーザープール・IDプール、デプロイの種類。スロットリング？？エクスポネンシャルバックオフ？？
:::

# 1ヶ月半かけて学びなおし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/b9b26532-1c05-e7ce-1620-0f35a8ed5579.png)



【使用した教材】
* Cloud License(有償)
* AWS Skill Builder（基本的に無償）
    * Exam Prep Standard Course
    * Official Practice Question Set
* Black Belt(無償)

1ヶ月かけてCloud Licenseで全問解いた後、半月で模試モードをひたすらやりこみました。85%~90%位なら合格が見えてくる印象です。

直前にAWS Skill Builderの無償版模試を解いて、初見の問題にも対応できるか確認。75%の正答率だったので、もう少しやりこめばいけるはずと感じる。
Cloud Licenseの模試モードで9割まで仕上げていきました。

また、分からない用語はBlack BeltやExam Prep Standard Courseを活用しました。

# 雑感
:::note info
AWSが提供している資料はもっと使い倒したほうがいい！！
:::

日本人講師がDVAで問われる知識や問題を、分かりやすく解説してくれている。
これで無料なのは嬉しい。

https://explore.skillbuilder.aws/learn/course/18618/exam-prep-standard-course-aws-certified-developer-associate-dva-c02-japanese-na-ri-ben-yu-shi-xie-ban


模試も20問までなら無料。難易度的にも適切。

https://explore.skillbuilder.aws/learn/course/14060/aws-certified-developer-associate-official-practice-question-set-dva-c02-japanese

クラスメソッドさんが、AWSのオンラインセミナー資料であるBlack Beltのリンク集を纏めてくださっているので、こちらも活用しました。

https://dev.classmethod.jp/articles/blackbelt-list/

:::note info
やっぱりSAAよりは、簡単だったかな・・・
:::

試験当日、半信半疑だったSAAに比べれば今回のDVAはしっかり手ごたえを感じていて、結果もわりと高得点だったので下馬評は間違いではなかったと思う。
正直1ヶ月以内で取得するのが妥当かな？と感じていますが、余裕を持って取得したいなら2ヶ月以内の学習を推奨します。
tRPCを使うことで何がどう便利になるのか？

## はじめに
いまのプロジェクトでtRPCを使用していて、開発体験がかなり良かったので、忘れないようにREST APIの課題とtRPCのメリットをまとめていきます。

### 本記事の対象者
- React（TypeScript）を使用したフロントエンドエンジニア
- 普段REST APIを使用してバックエンドと通信しており、tRPCは使用したことがないエンジニア
- tRPCのメリットを理解したいエンジニア

### tRPCとは
tRPCは、TypeScriptを使用してエンドツーエンドの型安全性を実現するライブラリです。フロントエンドとバックエンド間の通信を簡素化し、型の不一致によるバグを防ぎ、開発速度を向上させます。

## REST APIを使用している場合の課題

私も含めて多くの開発者は、フロントエンドとバックエンドでデータのやり取りをするのにREST APIを使用しています。しかし、REST APIでは下記のような課題が発生することがあります。

### フロントエンドとバックエンドの型の不一致によるバグの発生

REST APIでは、フロントエンドとバックエンドで別々に型定義を行う必要があリます。そのため、型定義の重複が起こり、それによる修正漏れや修正ミスなどが起こりやすくなります。そして、結果として型の不一致が起こり、バグが発生してしまいます。

以下は、REST APIを使用した場合のフロントエンド側のコード例です。

```typescript
type Todo {
  id: number;
  title: string;
  completed: boolean;
}

const fetchTodos = async () => {
  const res = await fetch('/api/todos');
  const data: unknown = await res.json();

  if (!Array.isArray(data)) 
    throw new Error('Invalid res data');

  const todos: Todo[] = data.map((item) => {
    if (
      typeof item.id === 'number' &&
      typeof item.title === 'string' &&
      typeof item.completed === 'boolean'
    ) {
      return item as Todo;
    } else {
      throw new Error('Invalid todo item');
    }
  });

  setTodos(todos);
};
```

### スキーマの定義が大変
REST API＋OpenAPIを利用する場合、OpenAPIのファイルを手動で作成・更新する必要があります。慣れていれば楽なのかもしれませんが、都度調べながら定義をし、さらにドキュメントの定義と実装がに相違がないかを確認する作業は地味に大変です。。

## tRPCを使うことで便利になるところ

tRPCを使うことで、以下のような利点が得られます。

### フロントエンドとバックエンドの型安全性が向上する
tRPCを使用すると型の定義が１つになり、フロントエンドとバックエンドで型の安全性が保証されます。例えば下記はtRPCを用いた場合のフロントエンドのコードです。先ほどの例と比べて型チェックが不要になっていることがわかります。

```typescript
import { createReactQueryHooks } from '@trpc/react';
import type { AppRouter } from './server';

const trpc = createReactQueryHooks<AppRouter>();
// todosに対して型チェックを手動で実装する必要がない
const { data: todos } = trpc.useQuery({});
setTodos(todos)
```

ちなみにバックエンドの実装は下記のようになります。

```typescript
import { initTRPC } from "@trpc/server";
import * as trpcNext from "@trpc/server/adapters/next";

type Todo = {
  id: number;
  text: string;
};

export const t = initTRPC.create();
export const appRouter = t.router({
  todos: t.procedure.query(() => {
    const todos: Todo[] = [
      {
        id: 1,
        text: "todoA",
      },
      {
        id: 2,
        text: "todoB",
      },
    ];
    return todos;
  }),
});

export type AppRouter = typeof appRouter;

export default trpcNext.createNextApiHandler({
  router: appRouter,
  createContext: () => ({}),
});
```

### zodと組み合わせることでスキーマ定義が簡単になる
tRPCのリクエスト定義にzodというライブラリを使用すると、さらに開発体験が良くなります。zodはTypeScriptによるスキーマ定義と、それをもとにバリデーションを行ってくれます。これによりドキュメントを見ながらスキーマ定義とずれていないか？リクエストのバリデーションを忘れていないか？などの余計な心配が不要になります。

## 最後に
tRPCを使うことで、フロントエンドとバックエンドの型安全性を確保しながら、効率的にアプリケーション開発を進められます！ぜひ、tRPCを導入して開発体験の向上を体感してください！
お絵かきキャンバスの変形を実装する　RenderTransform／CanvasRenderTarget 

お絵かきアプリを作る場合にキャンバスやレイヤー、カメラなどを変形させて（移動・回転・スケールなど）、ユーザーの描写操作を助けたり、あるいは描写結果全体を変形させたりしたい場合があります。

この時、Xaml側は RenderTransform を設定するだけで表示できますが、CanvasRenderTargetなどを使ってオフスクリーン描画したい場合には、RenderTransform による行列変換と CanvasRenderTarget 等から生成できる CanvasDrawingSession.Transform に与える変換行列の変形結果を一致させる必要があります。そのための実装例を以下に示します。

```xml
 <Border RenderTransformOrigin="0.5, 0.5">
    <Border.RenderTransform>
      <TransformGroup>
        <ScaleTransform ScaleX="{x:Bind Scale, Mode=OneWay}"
                        ScaleY="{x:Bind Scale, Mode=OneWay}" />
        <RotateTransform Angle="{x:Bind Rotate, Mode=OneWay}" />
        <TranslateTransform X="{x:Bind TranslateX, Mode=OneWay}"
                            Y="{x:Bind TranslateY, Mode=OneWay}" />
      </TransformGroup>
    </Border.RenderTransform>
</Border>
```

回転した軸に沿った移動はユーザーに負担の掛かる操作になってしまう可能性があるので避けたいです。

そのためにも TranslateTransform を TransformGroup の最後に置くことで回転・スケールの影響を受けない移動変形が表現できます。

回転軸も通常の左上 原点の座標系では扱いづらいため 直感的に操作できる 画像中心 = `RenderTransformOrigin="0.5, 0.5"` を指定しています。RenderTaransformOrigin は0~1に正規化された座標指定を行います。

この行列変換をオフスクリーン描画時の CanvasDrawingSession でも再現するには以下のように行列を掛け合わせます。

```csharp
using System;
using System.Numeric;

// 一旦原点座標に移動させてから回転・スケールを行列変換し、キャンバス中央からの移動量を適用する
var center = new Vector2(cut.CanvasSize.Width, cut.CanvasSize.Height) * 0.5f;
imageLayerTransform = Matrix3x2.CreateTranslation(-center) 
    * Matrix3x2.CreateRotation(image.RotationDegree * MathF.PI / 180f)
    * Matrix3x2.CreateScale(image.Scale)
    * Matrix3x2.CreateTranslation(center + new Vector2(image.TranslateX, image.TranslateY))
    ;
```

この画像中心を軸にした変形を CanvasRenderTarget 等の原点が X=0, Y=0 の座標系で同じように実現するため、`Matrix3x2.CreateTranslation(-center)`による原点座標への移動した上での回転・スケール変換、および `Matrix3x2.CreateTranslation(center + (移動量))` による中心原点への戻しと指定移動量の指定をしています。
Windows に Linux をインストールする

## 概要
WSL を用いて、Windows に Linux をインストールする手順を記載する。

## 環境
OS: Windows 11 Home 64 bit
(Windows 10 バージョン 2004 以上、または Windows 11 であればインストール可能)

## インストール手順
コマンドプロンプトを管理者として実行し、以下のコマンドラインを実行する
```
wsl --install
```
エラーメッセージが表示されていなければ OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/74225e64-6606-cda8-dd1d-1fe9de29524b.png)

再起動したらウィンドウが開く
しばらくすると、UNIX のユーザーネーム/パスワードを決めるように求められるので、
入力すればインストール完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/3648ffb2-f56f-4972-3119-9ddd4dccfeda.png)

## 参考：インストールされる Linux ディストリビューションの変更
インストールされる Linux ディストリビューションは、既定では Ubuntu となっている
ディストリビューションを変更したい場合は、以下のコマンドラインを実行する
```
wsl --install -d [ディストリビューション名]
```

利用可能なディストリビューションを確認するには、以下のコマンドラインを実行する
```
wsl --list --online
```
実行例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/0209f078-9284-a95f-45b9-65f9cf3ab9c6.png)
Docker のお勉強 - コマンドチートシート

# この記事について

インフラこわいガクガクブルブルの筆者ですが、ついに Docker の勉強を始めました。

Docker ユーザーには基本的なものであろう各種のコマンドのチートシートとして、こちらのページにまとめてみます。

（勉強進めるごとに随時追記していきます。）

# チートシート

## 基本動作

### バージョン確認

```shell:docker のバージョンを確認する（この中のどれを使ってもOK）
docker --version 
docker version
docker info
```

### ヘルプを見る

```shell:コマンドの全般的なヘルプ
docker help
```

:::note
上記のコマンドを実行すると、Common Commands, Management Commands, Commands などのカテゴリごとにコマンドの一覧が表示される。
Management Commands を引数なしで実行すると、そのコマンドの詳細情報が表示される。
:::

```shell:Management Command のヘルプ例
docker container
```


## イメージをプルする

### docker hub からイメージを検索

```shell:docker hub からイメージを検索
docker search イメージ名

# debian のイメージ検索なら
docker search debian

# MongoDB のイメージ検索なら
docker search mongo
```

### イメージを pull する

```shell:イメージのpull
docker image pull イメージ名[:タグ]
```

:::note
`[:タグ]` 部分に入れられるタグ（バージョン）の選択肢は、docker hub のドキュメントに supported tags (and respected image files) として掲載されている。

例：Redisの場合
https://hub.docker.com/_/redis

タグを省略すると、最新バージョンが入る。
:::

### ローカルにあるイメージを表示する

イメージの pull が完了すると、ローカルの Docker Image として参照できるようになる。
ローカルの Docker Image は、以下で確認できる。

```shell:ローカルの Docker Image を一覧にする（どちらの方法でもOK）
docker images
docker image ls
```

## Docker コンテナを実行する

httpdを動かす場合を例に。

### コンテナを作って実行するまで一気に実施

```shell:作って実行を一気に実施
docker container run -P httpd
```

:::note
-P は、空いているポートを適当に割り当てる指定。
:::

### ステップバイステップで実施

```shell:以下をひとつずつ実行
# これでコンテナを作る
docker container create -P httpd
# コンテナの一覧を参照する -> コンテナIDが先頭に表示される
docker container ls -a 
# コンテナを起動する
docker container start 上記で調べたコンテナID

```

## docker における Hello World

```:
docker container run hello-world
```

## 立てた Docker Container でコマンドを実行する

### コマンド実行する用のコンテナを立てる

たとえばこんな感じのコマンドでコンテナを立てる（CentOSでもOK）

```
docker container run debian
```

👆 debian のイメージがなければ、public のライブラリから pull してコンテナを一瞬立てる、しかし実行する命令がないのですぐに exit する

### コマンド実行する用のコンテナを立ててると同時にコンテナに入る

```
docker container run -it debian
```

こうすると、debian のコンテナの中に入って好きなコマンドをたたける。exit コマンドを叩くとコンテナから抜け、コンテナも消える

### 一度消したコンテナを再び起動する

```
docker container start コンテナID
```

:::note
コンテナIDは、一意に識別できるところまででOK
:::

### 👆のやりかたで作ったコンテナに入る

```
docker container exec -it コンテナID bash
```

👆コンテナにルートで入れるよ

### コンテナに入らずに、コンテナ上でコマンドを動かす

```
docker container exec コンテナID コマンド
```

## Docker Hub の利用

### ログイン

```
docker login
```

:::note
ユーザー名とパスワードを聞かれるので入力
:::

### イメージを DockerHub に Push

```
docker image push レポジトリ名:タグ
```

:::note
レポジトリ名とタグは、イメージの一覧から確認可能
```
# docker image ls
REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
chihirosano/my_centos   1.0       4e83c8412814   6 days ago     233MB
chihirosano/my_centos   latest    4e83c8412814   6 days ago     233MB
```
:::
 
# getting a shell into a container
docker container run -it centos  # to detach from the container without stopping it press: Ctrl + P + Q
PHPのselfと$thisの違い

## はじめに
Swiftと違うからごっちゃになったのでメモ

## $this
$this は、インスタンス自体を指す特別な変数です。インスタンス化されたオブジェクトの中からプロパティやメソッドにアクセスするために使われます。
```php
class MyClass {
    private $prop = "property value";
    
    public function showProp() {
        echo $this->prop;
    }
}

$obj = new MyClass();
$obj->showProp(); // property value を出力します。

```
## self
self は、静的（static）なプロパティやメソッド、または定数にアクセスするために使われます。self キーワードを使うことで、インスタンス化しなくてもクラスの静的メンバにアクセスできます。

```php
class MyClass {
    const CONSTANT = "constant value";
    private static $staticProp = "static property value";
    
    public static function showStaticProp() {
        echo self::$staticProp;
    }
    
    public function showConstant() {
        echo self::CONSTANT;
    }
}

$obj = new MyClass();
$obj->showConstant(); // constant value を出力します。
MyClass::showStaticProp(); // static property value を出力します。

```
Pythonで「キャプチャグループを設定してパターンの一部にマッチした文字列を取得する」の動作を確認してみた

# 概要

Pythonで「キャプチャグループを設定してパターンの一部にマッチした文字列を取得する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index15.html

# 実装

以下のファイルを作成しました。
```sample.py
import re
pattern = re.compile(r'(\d{3})-(\d{4})')
msg = '郵便番号は 123-4567 です。';
result = pattern.search(msg)
print(result.group(0))
print(result.group(1))
print(result.group(2))

import re
pattern = re.compile(r'製品(?:Code|コード):([A-Z]{2})-(\d{2})')
msg = '製品コード:AZ-07';
result = pattern.search(msg)
print(result.group(1))
print(result.group(2))

import re
pattern = re.compile(r'製品コード:(?P<section>[A-Z]{2})-(?P<code>\d{2})')
msg = '製品コード:JP-82';
result = pattern.search(msg)
print(result.group('section'))
print(result.group('code'))

import re
pattern = re.compile(r'<(.+)>.*</\1>')
msg = 'AAA <div>BBB<span>CCC</span>DDD</div>EE';
result = pattern.search(msg)
print(result.group(0))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
123-4567
123
4567
AZ
07
JP
82
<div>BBB<span>CCC</span>DDD</div>
```

# まとめ

何かの役に立てばと。
今気になるAIツール列挙する‼ ＋展望   2024/03/25

## 導入

今、気になってる生成AI関連のソフトウェアをここで列挙したい。仕事と次々とリリースされるAI関連のソフトウェアの忙しなさが合わさって、現在、AI関係を触れてないのでここで自分でも忘れないように全部書いていく。




**➀dify ai:**

https://dify.ai/

オープンソースのLLMOpsプラットフォーム。コーディング不要でAIアプリを素早く構築可能。スケーラビリティに優れ、大規模なAIワークフローの管理にも対応。

**➁metagpt:**

https://github.com/geekan/MetaGPT/blob/main/docs/README_JA.md

複数のGPTエージェントが協調して複雑なタスクを解決するマルチエージェントフレームワーク。エージェント間の対話や役割分担により、高度な問題解決を実現。

**➂open interpreter:**

https://github.com/OpenInterpreter/open-interpreter

ChatGPTのCode Interpreterをオープンソース化したプロジェクト。プログラミングや分析タスクの自動化を支援。豊富なプログラミング言語に対応。

**➃wolfram alpha LLM:** 

https://products.wolframalpha.com/llm-api/documentation

Wolfram Alphaの膨大な知識ベースを活用した大規模言語モデル。数学、科学、社会情報など幅広い分野の質問に対して正確な回答を提供。


**➄open interface:** 

https://github.com/AmberSahdev/Open-Interface

LLMアプリケーション開発のためのオープンソースプラットフォーム。プラグイン機能により、外部ツールとの連携が容易。開発者コミュニティによる活発な貢献が特徴。

**➅viggle ai:**

https://viggle.ai/

動画コンテンツを理解し、要約や検索を可能にするAI。自然言語処理と画像認識技術を駆使し、動画の内容を効率的に分析。

**⑦aider:** 

https://github.com/paul-gauthier/aider

 LLMを用いたプログラミングアシスタント。コードの自動生成、エラー修正、リファクタリングなどを支援。開発者の生産性向上に寄与。

**⑧gpt pilot:**

https://github.com/Pythagora-io/gpt-pilot

GPTモデルを使った対話型のタスク自動化ツール。ユーザーとの対話を通じて、様々な作業を自動化。シンプルなインターフェースが特徴。

**⑨butter fish:**

https://github.com/bakks/butterfish

自然言語処理に特化したオープンソースのPythonライブラリ。テキスト前処理、言語モデル、評価指標など、多彩な機能を提供。

### その他単語

**RAG (Retrieval-Augmented Generation):**
検索とLLMを組み合わせた手法。関連する文書を検索し、その情報を元にLLMが回答を生成。外部知識を活用することで、LLM単体よりも正確で詳細な回答が可能。

**notion ai:**
人気のナレッジ管理ツールNotionにAI機能を統合。文章生成、要約、翻訳、アイデア提案など、様々なタスクをAIがサポート。生産性向上と創造性発揮に役立つ。

**ベクトルDB:**
データを高次元のベクトルで表現し、類似度検索に特化したデータベース。自然言語処理やコンピュータビジョンなど、AIの分野で広く活用。大規模データからの高速な類似データ検索を実現。

**worldsoin:**
OpenAIのCEOが関与する仮想通貨プロジェクト。虹彩認証で人間性を証明すると、無料でトークンを取得可能。AIの発展により人間とボットの区別が難しくなる未来に備え、全人類に公平な経済的恩恵を与えることを目標とする。


### 雑感

open interpreterは、おそらく多くの人が使ったことがあるであろうツール。最近、使ってみたいのがAIエージェント化するツールとしてdify ai,metagpt。wolfram alpha LLMは、数学、計算系でよく聞く。open interfaceもAIエージェント関連だった気がする。viggle aiは、動画編集がよく話題になっている。aiderは、対話型でプログラミングを手伝ってくれる。その他もろもろ。


### 展望

これからの大きな流れ(すでにそうだが)は、間違いなくAIエージェントを組織してタスクを片付けるツールの氾濫が起こる。現在は1対1で我々が対話している。しかし、これからは人間の指示に従って組織したAIたちが話し合って役割分担してタスクをやり遂げる。それらは前提条件として、生成AIのAPIを使ってどんなサービスが提供できるかが開発者の考えるべき焦点になる。
生成AIをヘビーユーズしている人間の中では、すでにchatbotは一機能に収まって、APIの料金に頭を悩ませている。むしろ、APIのほうが今となっては主として我々の生活に与える影響量ははるかに大きい。open interpreterを使用しているが、心からの感動は得られていない。それは高機能なもの(chatgpt4,claud ai 3 opus)が無限にお金を溶かすためである。現在は、gpt-3.5-turbo,claud ai haikuなどで使用するのが無難だと思う。
まだ、複数AIエージェントツールを使っていないのでわからないが、それらのソフトウェアで使われている言語モデルは何か？料金体系はどのようか？といったことがツールを使う側としては大きな問題となる。
これまで、紹介してきた中でAIエージェントを駆使したツールはすでに多く出てきている。ここで思うのは、騒がれているdevin aiは特別なものでも何でもない。オープンソースのgithubを見ればいくらでも似たようなものがある(open interpreterもその一つ)。devin aiがそのような言語モデルを使い、どんな料金体系化を知らないので何とも言えないが、とても素晴らしいものかもしれないし、ただUIが充実しただけの情弱ツールであるかもしれない。
おすすめのツールがあれば、教えていただきたい。
ActiveStorageの合計サイズのバリデーションをかけるには？

複数のActiveStorage とモデルを紐づける `has_many_attached :files` フィールドの合計サイズでバリデーションをかけるのにはまりました。

## 削除フラグに対応した以下のようなフィールドを定義しているケースです
```ruby:some_model.rb
  has_many_attached :files
  accepts_nested_attributes_for :files_attachments, allow_destroy: true
```

## 以下のように書いてませんか？

安心してくださいうまく動きません。
削除予定のファイルも含めてサイズが計算されてしまいます。

```ruby:some_model.rb
  validate :validate_total_attachments_size
  def validate_total_attachments_size
    total_size = 0

    files.each do |file|
      total_size += file.byte_size
    end

    return unless total_size > 8.megabytes

    errors.add(:base, "合計サイズ#{
    number_with_delimiter(total_size)}Bを8MB(#{number_with_delimiter(8.megabytes)}B)以内にしてください")
  end
```
## 削除済みを除外して容量を計算
以下のように書いてください。

```ruby:some_model.rb
  validate :validate_total_attachments_size
  def validate_total_attachments_size
    total_size = 0
    total_size += skill_sheet.byte_size if skill_sheet.present? && skill_sheet.attached?

    to_delete = []
    files_attachments.map do |file|
      to_delete << file.id if file.marked_for_destruction?
    end

    files.each do |file|
      total_size += file.byte_size unless to_delete.include?(file.id)
    end

    return unless total_size > 8.megabytes

    errors.add(:base, "合計サイズ#{
    number_with_delimiter(total_size)}Bを8MB(#{number_with_delimiter(8.megabytes)}B)以内にしてください")
  end
```
開発者もIDEから稼働中のシステムの状態を確認したい？（NRQL編）

# 概要
IDEを使って開発した後にデプロイされたシステムのパフォーマンスやログなどをIDE上で簡単に検索できたらワクワクしませんか？問題が起きたときのトラブルシュートでも使えますし、次のシステムの改善点を考える上でも活用できます！

こちらの投稿では開発者が使っている***IDEからデプロイ済みのシステムのパフォーマンスデータをNRQLでクエリ***してみたいと思います。

***CodeStreamを使用するための設定***については下記で紹介しているので参照してください。

https://qiita.com/T_OMORI/private/0bb538095c36ba662948

CodeStreamの詳細は公式ガイドを参照ください。

https://docs.newrelic.com/jp/docs/codestream/start-here/what-is-codestream/

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202402 "New Relic アップデート(2024年２月)")
:::

# NRQLでデータをクエリ（基本）

デプロイされているシステムのパフォーマンスデータをIDEからNRQLでクエリしてみます。
まずは、Query Your Dataをクリックします。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/b4d9d30a-01e4-5820-773c-5e9d01d01a6f.png">

タブで開いたCodeStream(NRQL)にNRQLを書いて[Run]を実行すると、NRQLのクエリが実行されて結果が表示されます。
NRQLを実行することでデプロイされているシステムのデータ分析が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/69c3446b-c68b-7ec8-5bd3-d71fd0c30e43.png)

# NRQLでデータをクエリ（.nrqlファイル）

.nrql拡張子でファイルを作成してNRQLを書いておくと、[Run]ボタンから実行することが可能です。***NRQLに慣れていない人でも簡単にNRQLを実行することができます！***

ここではperformance.nrqlというファイルを作成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/4e6ffef0-a185-6e8c-1905-02818ac169c8.png)

NRQLの上部に表示される[Run▶]ボタンをクリックすると、CodeStream(NRQL)が別タブで表示されてクエリ結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/9852b8c8-a1c9-6ae5-67cc-dc3008344e7f.png)

# まとめ
CodeStreamを使ってIDEにからデプロイされたシステムのパフォーマンスデータをNRQLでクエリしてみました！
いつも使っているIDEから直接見ることができるので、調査が早くできるだけでなく、自然とシステムの改良点などが見えてくるのではないかと思います！ぜひお試しください。

***CodeStream上でのNRQLによるクエリの詳細***は下記を参照ください。

https://docs.newrelic.com/jp/docs/codestream/observability/query-builder/

また、***CodeStreamを使用するための設定***については下記で紹介しているので参照してください。

https://qiita.com/T_OMORI/private/0bb538095c36ba662948

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202402 "New Relic アップデート(2024年２月)")
:::

:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::