OmniAICreator/Qiita-1.07M huggingface dataset:
米田の補題 #3 応用　矢印で量子コンピュータを理解

# 米田の補題は、圏論でもっとも重要な定理です（繰り返し）
圏論は、数学の基礎理論です。いままで、[万物の理論](https://amzn.to/3ZLmCJH)
といわれていましたが、[数理科学 11月号](https://amzn.to/4iz6NgM)では、なんと　<font color="Red">万物・万事・万人</font>のための数学理論とまでいわれるようになりました
このAdventCalendar は、体験的に圏論の最も重要な定理である米田の補題を体験的に理解してもらうためにかいています

参考にしているのは、[圏論の道案内](https://amzn.to/4iH2Rus)です

# 学んだことを早速応用です。量子コンピュータを理解します

米田の補題川柳　**矢印で考えるのはよくあるさ**を使います

量子コンピュータは、様々な状態をとって、観察するときにその状態の一つが決まります。組み合わせ問題が得意そうです。ただ、問題を量子コンピュータに与えて、観測する時に正解がばっちり観察できればいいのですが、普通は無理です

それでどうするかというと、正解の確率を工夫してあげていきます。
不確実をだんだんと確実にしていきます
```mermaid
graph LR;
    A(不確実)-.->B;
    B(半分ぐらい)-.->C;
    C(限りなく確実)-.->D(確実を観察);
```

## これで理解といえるのでしょうか？ 

質問でだんだん明確にするのに似てませんか？
```mermaid
graph LR;
    A(あいまい)-.->|質問|B;
    B(すこし明確)-.->|質問|C;
    C(更に明確)-.->|質問|D(完全に明確！);
```

**「量子コンピュータの計算」も「質問して明確にする」も似ていますね**
米田の補題川柳　**違うもの同じとみなすすごいこと**をなんとなく実感しませんか？

これとそれが同じだと思ったときが、理解ではないでしょうか？
では、米田の補題川柳　**量子でも理解できるぞ矢印で**

# 矢印だけでも見通しが思ったよりよくなった気がしませんか？
※見通しはよくなりましたが、量子コンピュータでどうやって正解の確率をあげるかは、超難しいです。イベントで質問もする人はかなり少ないです。量子コンピュータで正解の確率をあげるのが難しいように、明確にするための質問は実はかなり難しいのです
React開発: clsxで管理しやすいclassNameの指定方法

# はじめに
Reactプロジェクトでは、条件に応じてクラス名を追加したり、複数のクラス名を組み合わせたりする必要な時が度々ありますが、プロジェクトの規模が大きくなった時にコードが見づらくなったり、煩雑になったりします。
そこで、`clsx` ライブラリを使用すると、クラス名を簡単に操作でき、コードの可読性を挙げられることができます。
`clsx` は `classnames` というライブラリと比較して、バンドルサイズが小さく、ブラウザのベンチマークでも優れたパフォーマンスを示している(ソースは以下clsxのREADMEより引用)ため、最近では clsx が広く利用されています。
また、`clsx` の名前も`classnames`と比較すると短くてコードを書きやすいという利点もあります。

> A tiny (239B) utility for constructing className strings conditionally.
Also serves as a faster & smaller drop-in replacement for the classnames module.
日本語訳:
className文字列を条件付きで構築するための小さな (239B) ユーティリティです。
また、classnames モジュールをより高速に、より小さく置き換える役割も果たします。
clsxのREADMEより引用: https://github.com/lukeed/clsx/blob/master/readme.md

## clsxを導入するメリットまとめ
- 動的にclassNameを指定する際にコードの可読性が挙げることが可能
- classnamesのライブラリよりサイズが小さく高速
- clsx()の方が classnames()より名前が短く記述量が少なくなる

## clsxのインストール

```bash
npm install --save clsx
```

## clsxの使い方

clsx関数は任意の引数を取ることができ、各引数にオブジェクト、配列、ブール値、または文字列を指定することでclassNameを結合することができます

```typescript
import { clsx } from 'clsx';

clsx("foo bar", "baz");
//=> 'foo bar baz'


clsx("foo bar", ["baz", "fizz"]);
//=> 'foo bar baz fizz'

clsx("foo", {
    "button": true,
    "active": false
})
//=> 'foo button'


clsx("foo", {
    "button": true,
    "active": true
})
//=> 'foo button active'


clsx('foo', true && 'active');
//=> 'foo active'
```

## コンポーネントでの使用例
```typescript
import * as React from "react"

import { clsx } from "clsx"

export interface TextareaProps
  extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}

const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
  ({ className, ...props }, ref) => {
    return (
      <textarea
        className={clsx(
          "sample-classname",
          className
        )}
        ref={ref}
        {...props}
      />
    )
  }
)
Textarea.displayName = "Textarea"

export { Textarea }
```

## clsxでTailwind CSSを使用する場合
clsxをtwMergeでラップすることでtailWindcssに対応したユーティリティを作成することができます。

:::note info
参考: https://ui.shadcn.com/docs/installation/manual#add-a-cn-helper
補足: twMergeは`npm i tailwind-merge`でインストールが必要です
```typescript
import { type ClassValue, clsx } from "clsx"
import { twMerge } from "tailwind-merge"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}
```
:::

## 定義したcnメソッドの使い方
twMergeでラップすることで重複したTailwindCSSのクラス名を上書きすることができます
```typescript
import { cn } from "@/lib/utils" // 定義したcnをインポート

cn("p-4 mt-4", "border mt-5");
// mt-4がmt-5に上書きされる
//=> 'p-4 border mt-5'


cn("p-4 mt-4", ["border", "mt-5"]);
//=> 'p-4 border mt-5'

cn("p-4", {
    "w-full": true,
    "h-20": false
})
//=> 'p-4 w-full'


cn("p-4", {
    "w-full": true,
    "h-20": true
})
//=> 'p-4 w-full h-20'
```

## 最後に
今回は clsx ライブラリについてご紹介しました。
コードを見やすく、管理しやすくするために `clsx` を活用してみてください！
ご覧いただきありがとうございました🦭
エラーハンドリング：RailsとLaravelの例外処理の違い

### はじめに
Webアプリケーションを開発する際に、例外処理は非常に重要な要素です。ユーザーがエラーに遭遇した際に適切なフィードバックを提供するだけでなく、システムを堅牢に保つためにも欠かせません。この記事では、Ruby on Rails（以下、Rails）とLaravelの例外処理の違いについて解説します。

### 1. Railsの例外処理

Railsでは、例外処理は主に以下の方法で行われます。

#### 1.1 コントローラーでの例外処理

Railsでは、コントローラーに`rescue_from`を定義することで、特定の例外をキャッチして処理できます。

```ruby
class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  private

  def record_not_found
    render json: { error: 'Record not found' }, status: :not_found
  end
end
```
`rescue_from`を使用することで、エラーハンドリングのロジックを明確に分離できます。

#### 1.2 ミドルウェアでの例外処理

Railsのミドルウェアを使用して、アプリケーション全体のエラーを処理することも可能です。

```ruby
config.middleware.use ExceptionMiddleware
```

`ExceptionMiddleware`は、カスタムミドルウェアとして例外をキャッチしてレスポンスを生成します。

#### 1.3 カスタム例外クラス

Railsでは独自の例外クラスを定義することも推奨されています。

```ruby
class CustomError < StandardError; end
```

これにより、特定の状況に応じた例外処理を簡単に追加できます。

### 2. Laravelの例外処理

Laravelでは、例外処理は主に以下の方法で行われます。

#### 2.1 グローバル例外ハンドラ

Laravelには`app/Exceptions/Handler.php`というグローバルな例外ハンドラが用意されています。このファイルで例外をキャッチし、適切なレスポンスを返すことができます。

```php
public function render($request, Throwable $exception)
{
    if ($exception instanceof ModelNotFoundException) {
        return response()->json(['error' => 'Model not found'], 404);
    }

    return parent::render($request, $exception);
}
```

このメソッドをカスタマイズすることで、さまざまな例外を一元的に処理できます。

#### 2.2 カスタム例外クラス

Laravelでもカスタム例外クラスを作成できます。

```php
namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    public function render($request)
    {
        return response()->json(['error' => 'Custom error occurred'], 500);
    }
}
```

これにより、特定の状況で発生するエラーに対してカスタムレスポンスを提供できます。

#### 2.3 ミドルウェアでの例外処理

Laravelでは、ミドルウェアを使用してリクエスト前後に例外をキャッチし、処理することも可能です。

```php
public function handle($request, Closure $next)
{
    try {
        return $next($request);
    } catch (Exception $e) {
        return response()->json(['error' => $e->getMessage()], 500);
    }
}
```

### 3. RailsとLaravelの違い

以下は、RailsとLaravelの例外処理の主な違いです。

|特徴|Rails|Laravel
|:---|----|-------
|デフォルトの例外処理|`rescue_from`やミドルウェアで柔軟に対応|`Handler.php`で一元管理
|カスタム例外クラス|標準ライブラリで簡単に作成可能|レンダリング機能付きの例外クラスを用意
|ミドルウェア|ミドルウェアでのカスタム処理が可能|ミドルウェアでのトライキャッチが可能

### 4. まとめ

RailsとLaravelの例外処理には共通点もありますが、それぞれのフレームワークに適した方法で実装されています。Railsは`rescue_from`による明確な例外処理が特徴であり、Laravelは`Handler.php`を中心とした統一的な管理が魅力です。

Rails公式ドキュメント：[Active Support](https://railsguides.jp/active_support_core_extensions.html)

Laravel公式ドキュメント：[Error Handling](https://laravel.com/docs/11.x/errors)
pandas.Dataframeに含まれる日付シリアル値や日付文字列をdatetime64[ns]型に統一する

## 背景

以下のように日付文字列とExcel特有のシリアル値が混在したCSVファイルを仕事で扱うことがあった

| ID | 年月日 |
|:-|:-|
| 1 | 2024/12/21 |
| 2 | 2024-12-21 |
| 3 | 45647 |

これをそのままpandas.read_csvで読み込むと、当然このようなデータフレームになる

| ID | 年月日 |
|:-|:-|
| 1 | 2024/12/21 |
| 2 | 2024-12-21 |
| 3 | 45647 |

## 目的

今回の目的は上記のdfの**年月日列の値をdatetime64[ns]型に統一したい**

## 課題

この目的を達成するために、下記2つの課題を順番に解決していくことが必要になる

1. Excelのシリアル値を日付文字列に置換する
2. 日付文字列全てをdatetime64[ns]型に変換する

### 課題1の解決策

結論から述べると、シリアル値に対して以下を実行する

```Python
pd.to_timedelta(df.loc[2, "年月日"].astype("float") - 2, unit="D") + pd.to_datetime("1900/1/1")
```

1. 1900/1/1起点になる理由
    - **Excelのシリアル値では1900/1/1を「1」としている**

2. 2を引いている理由
    - **Excelでは1900年が閏年扱いとなっている（実際は閏年ではないので、Excelのバグらしい）**

このあたりの検証については、下記の記事を作成されている方が詳しく説明してくださっています

- [【要注意】PandasでExcelワークシート内の日付データを読み込む時の落とし穴](https://qiita.com/y-vectorfield/items/323960a01d73ec1b4006)


### 課題2の解決策

日付文字列をdatetimeに変換するには、pandas.to_datetime()を用いる

```python
pd.to_datetime(df.loc[0:1, "年月日"])
```

※注意
to_datetimeの引数errorsに`coerce`を下記のように設定すると、日付文字列でない不適切な文字列に対してNaT(Not a Time)が返されるようになる。
この引数は便利だが、使う際は仕様として適切か検討してください

```Python
pd.to_datetime(df.loc[0:1, "年月日"], errors="coerce")
```

## 解決策を用いて作成したメソッド

```Python

import pandas as pd
from datetime import datetime 

def convert_to_datetime(df: pd.DataFrame, list_columns: list):

    for column in list_columns:
        # astype()は、データ型(dtype)を変更する
        df[column] = df[column].astype(str)

        # 対象カラムの値に「-」または「/」を含むものをTrueとする
        bool_reg_date = df[column].str.match("^.*[-|/].*")

        # Excelのシリアル値が入っている行のみを取り出す
        df_excel = df[~bool_reg_date].copy()

        # 日付文字列が入っている行のみを取り出す
        df_reg = df[bool_reg_date].copy()

        # 日付文字列をdatetime型に変換する
        df_reg[column] = pd.to_datetime(df_reg[column], errors="coerce")

        # Excelのシリアル値をdatetime型に変換する
        # Excelでは1900年が閏年扱いとなっているため、2を引く
        df_excel[column] = pd.to_timedelta(df_excel[column].astype(float) - 2, unit='d') + datetime(1900, 1, 1)

        # データを結合する
        df[column] = pd.concat([df_reg[column], df_excel[column]])

    return df
```

このメソッドを作成するにあたり、下記を参考にさせていただきました

- [【Pandas】Excelに日付とシリアル値が混在する場合にDatetimeに統一する方法](https://www.damonde9.com/%E3%80%90pandas%E3%80%91excel%E3%81%AB%E6%97%A5%E4%BB%98%E3%81%A8%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E5%80%A4%E3%81%8C%E6%B7%B7%E5%9C%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%ABdat%E7%B5%B1/
)

## 最後に

このメソッドを用いてデータフレームの日付をdatetimeに統一すると、データフレームは下記のようになります

  | ID | 年月日 |
  |:-|:-|
  | 1 | 2024/12/21 |
  | 2 | 2024/12/21 |
  | 3 | 2024/12/21 |

また`print(df["年月日"].dtype)`を用いて、統一後のデータフレームの年月日列のdtypeを確認したところ、`datetime64[ns]`になっていたので問題ないと思います
SQL Murder Mistery on TiDB

## はじめに

PingCAPでは、TiDB Cloud Serverlessの機能を活かした[TiDB Future App Hackathon](https://tidbhackathon2024.devpost.com/project-gallery)を行っています。今年の受賞作の中に、AIをうまく活用した[SQL Murder Mistery](https://mystery.knightlab.com/)の改良版、[QueryHunt](https://devpost.com/software/sql-murder-mystery-game)があったので紹介します。

## SQL Murder Misteryとは

SQLを使った殺人事件操作ゲームです。シチュエーションが文章で与えられ、手がかりや容疑者、アリバイといった一連のテーブルが与えられるので、SQLを駆使して真犯人を見つけ出します。ゲームはそんなに難しくはありません。一番難しいのは英語を読むことだったりします。

## 実行

https://queryhunt-game.streamlit.app/

こちらからStreamlitのcommunity cloudにデプロイされたバージョンを試すことができます。

1. まずは Playを押してゲームスタート
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/bb9c3240-f417-6341-7e05-b9a9b5914705.png" width="50%">

2. `generate story` を押してストーリーを生成します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/5d8acbb7-3f4b-c675-5f73-c253a67cd643.png" width="50%">

3. ストーリーが生成されたら、テーブル一覧を参考に犯人を探していきます

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/bddb502b-67a3-688b-1f97-f2d61429e3ca.png" width="50%">

## 技術的な詳細

内部では、ベースとなるテーブル構造を定義しておき、そのスキーマをTiDBに格納しておきます。llamaIndexを利用して、そのスキーマをベースとしたストーリーの生成、生成したストーリーからテーブルのレコードの生成、レコードのバリデーションなど一連の作業を [llamaIndex Workflows](https://docs.llamaindex.ai/en/stable/module_guides/workflow/) を使って実施しています。

## 日本語化

LLMアプリケーションの良いところは、プロンプトによって簡単にアプリケーションの挙動を変えられるところでしょう。このQuery Huntを変更して日本語でストーリーを出すようにしたものを作成しました。
OpenAIのAPIキーとTiDB Cloud ServerlessとPython/Streamlit が動く環境があれば楽しめますので、ぜひ挑戦してみてください。

https://github.com/bohnen/queryhunt-game/blob/main/README_ja.md

![screenshot-20241221-204222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/43d2fcb4-a201-4db3-be8c-d784092c8550.png)

## おわりに

Query Huntの作者のOleksandr Arsentievさんに感謝します。

今年のFuture App Hackathonでは、入稿要件のショート動画のナレーションをTTSで作っている応募者が多く見受けられました。英語での説明動画とか、説明はもはや障壁ではないですね。

来年はぜひ日本からも多く応募していただけると嬉しいです！
0円運用できないなら、それはまだ解決できていない！

## 背景

我が家では小鳥を3羽飼っており、そのうち1羽は女の子の文鳥です。小鳥はパートナーがいなくても無精卵を産むことがあり、体の小ささゆえ、卵を産む行為は大きな負担になります。卵を産まないためにも、体重管理が欠かせません。そこで私は、シンプルに体重を管理できるアプリを作ろうと考えました。
しかし、個人開発で問題となるのはランニングコストです。セオリーどおりにアプリを作ると、データベースやサーバの維持費がかかってしまいます。自分だけで使うなら無料または低コストのデータベースサービスもありますが、やはりエンジニアとしては「せっかく作るなら他の人にも使ってほしい」という気持ちがあります。
そこで本記事では、一定のユーザが利用してもランニングコストを0円に抑えるための工夫を紹介します。

## アプリの紹介
<img width="180" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150933/025ef335-27fd-c54e-1529-a7aa288b35b4.png">



アプリの紹介は最小限にとどめますが、基本機能としては
　
* 管理する小鳥の登録
* 小鳥ごとの体重の記録および表示  

となります。体重入力はとにかくシンプルに、見た目は楽しく継続できることをコンセントに開発しています。

## システムアーキテクチャの紹介
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150933/edd6936e-3687-2130-2356-c33972e5ba1b.png)
アーキテクチャ自体は至ってシンプルです。Next.jsで開発したフロントエンドアプリを[Vercel](https://vercel.com/)
にデプロイしています。Next.jsとCloudflare R2との通信部分もNext.jsのサーバサイドを利用して開発しています。サーバサイドもNext.jsを用いて開発することでVercelを利用することができサーバサイドのコストを削減できます。

### 本アプリ最大の工夫ポイント
今回の最大の工夫は、オブジェクトストレージである[Cloudflare R2](https://www.cloudflare.com/ja-jp/developer-platform/products/r2/)を疑似的にKey-Value型データベースとして活用した点です。
通常、オブジェクトストレージは画像や動画などRDBで扱いにくいデータを保存する用途で使われることが多いですが、もちろんJSONファイルを保存することも可能です。本アプリケーションでは、この機能を活かしてJSONをKey-Value形式のデータとして取り扱い、DynamoDBのような使い方を実現しました。
DynamoDBを使用する際は基本的に非正規化して運用するほうが望ましいとされていますが、このアプリケーションでは通信速度などを考慮し、JSONファイルが大きくなりすぎないよう適度に正規化して保存しています。たとえば、あるペットの体重記録は下記のようなJSONファイルで管理し、Next.js側で必要なJSONをダウンロードしてフロントエンド側で処理を行っています。
```json
[{"datetime":"2024-12-08T20:46:18+09:00","weight":19,"isDeleted":false},
{"datetime":"2024-12-07T20:45:57+09:00","weight":20,"isDeleted":false},
{"datetime":"2024-12-06T20:43:21+09:00","weight":19.1,"isDeleted":false},
{"datetime":"2024-12-05T18:30:35+09:00","weight":18.3,"isDeleted":false},
{"datetime":"2024-12-21T20:46:48+09:00","weight":21.3,"isDeleted":false}]
```
フォルダ構成は下図のように整理しています。User（飼い主）ごとにフォルダを用意し、その下に複数の小鳥（ペット）ごとのフォルダが存在します。各小鳥には名前などのプロフィール情報を記載したJSONと、日々追記される weight.json を用意しています。体重データは継続的に蓄積されるので、将来的には月ごとにファイルを分割するなど、さらなる工夫も視野に入れています。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150933/774930a8-9aaa-ea54-de8b-0c8ae2ffd6eb.png)
オブジェクトストレージをDBとして使うことで十分運用に耐えうるアプリケーションを作ることができます！！

## デメリット
やはり、通信速度はDynamo DBなどと比べると少し遅いです。jsonをダウンロードしてくる際に、少し待ちますが数秒程度なので許容範囲かと思います。

## ランニングコストがかかるとしたら
ランニングコストがかかるとしたら、
* URLをvercelのドメインから独自で取得したドメインにする
* アプリを商用化する場合は、VerrcelのPro Planに入る
* かなりのユーザが利用してCloudflare R2でコストがかかる

かと思います。基本、jsonしか保存していない場合、Cloudflare R2でコストがかかるということは一定のユーザ数がいるということが予想されるので、商用化の可能性も十分考えられる状態かと思います。

## まとめ
本記事では、個人開発を行う上でいちばんのネックとなるDBの運用コストに対してオブジェクトストレージのCloudflare R2をDBとして使うことで0円運用を実現しました。オブジェクトストレージであれば、他にもAWS S3や最近ではVercel Storageと呼ばれるオブジェクトストレージがVercelから発表されたので候補として上がりそうです。
是非、個人開発する際には検討してみてください！
SPRESENSE フォトカプラを使ってLEDを制御する

# 記事の内容
- SPRESENSEによるフォトカプラによる外部LED点灯
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/b96e6152-d2ce-20a1-7b82-d26618fbae50.jpeg width=320>
<br>※写真の抵抗は手持ちのものを取り合えず使用しており、適当です。


<iframe width="280" height="300" src="https://www.youtube.com/embed/LVh1TlRGirY?si=zmAuy11IJjd8-2-e" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

- [Spresense ハードウェアについて](https://developer.sony.com/spresense/development-guides/introduction_ja.html)
    - ※メインボードの基準I/O電圧は1.8Vです。1.8V以上の電圧を加えるとチップセットが破壊される可能性があります。取扱いには十分注意してください。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/ad92473e-c0d9-f884-267f-ba04bf940b19.png width=320>

# 外部LEDをONOFF制御
## ハードウエアのセットアップ
- SpresenseのI/Oは1.8Vなので、フォトカプラを使って外部のLEDを制御する。
- LEDの電源はLTE拡張ボードのMAIN POWER(5.0V)から供給した。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/952fced9-934f-ac76-22ec-7740a813c7e1.png width=320 >

- [東芝製TLP250 (おすすめはこちら)](https://toshiba.semicon-storage.com/jp/semiconductor/product/isolators-solid-state-relays/detail.TLP250.html)
        <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/f349cd46-64b1-af45-dcb3-776d9ddad3d9.png width=320>

- フォトカプラ PS817 （PC817互換品:今回はこちらを使った）
    - 追記：こちらはON抵抗が50Ω程度あった。

## LED点灯スケッチ

<details><summary>LED点灯スケッチ</summary>
<div>

```bash:LED点灯
void setup() {
  // put your setup code here, to run once:
  pinMode(1,OUTPUT);
  pinMode(LED0, OUTPUT);
  pinMode(LED1, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(1,HIGH);
  digitalWrite(LED0, HIGH);
  digitalWrite(LED1, HIGH);
  delay(2000);
  digitalWrite(1,LOW);
  digitalWrite(LED1, LOW);
  delay(2000);

}
```
</div></details>


## 動作検証

実行できると、本体のLED０が点灯。
LED１と外部のLEDが2秒間隔で点滅します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/b96e6152-d2ce-20a1-7b82-d26618fbae50.jpeg width=320 >
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/778bfc66-2825-0c68-4c53-6779f9770448.jpeg width=320 >

基板に実装した例
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/9c220fca-3681-5274-343b-5f696b831bea.jpeg width=320>

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/0725ea92-4bd6-67ee-d48f-21064f247a45.jpeg width=320>

以上

## 参考
- [SPRESENSEサンプルプログラム集](https://qiita.com/TaroYoshino/items/f3373e6dac4f6cc04a4e)
- [サンプルコード](https://zenn.dev/hiroe_orz17/scraps/7164a63bb55c25)
    - SONY SpresenseのLED制御（Lチカ）サンプル
    - SONY Spresenseで位置情報取得サンプル

- [LED　本体で光らせる](https://deviceplus.jp/mc-general/spresense-01/)
- [フォトカプラの解説記事](https://cotechworks.ltt.jp/2023/11/26/post-1308/)
- [SpresenseでLチカから始める 拡張ボード](https://www.denshi.club/cookbook/arduino/spresense/spresensel-1-lchikahakanntannka.html)
- [SPRESENSEでフォトカプラを使ってみた！](https://makers-with-myson.blog.ss-blog.jp/2020-09-06)

- [フォトカプラーとフォトリレーの解説](https://875s.com/kousaku/6parts7_light3.html)
【自習】AWS SES

PMする上で必要になってきたのでおさらい

https://docs.aws.amazon.com/ses/?icmpid=docs_homepage_busapp

## **AWS SESとは？**
Eメール送信・受信サービス。

## **AWS SESの特徴**

1. **スケーラブルなEメールサービス**
   - 1日数百通から数百万通まで対応可能。
   - AWSのインフラを活用した信頼性の高いメール配信。

2. **多目的な利用**
   - **通知メール**: アカウント登録時の確認メール、注文確認メール。
   - **マーケティングメール**: キャンペーンやニュースレター。
   - **受信メール**: フォームや返信用メールアドレスの管理。

3. **低コスト**
   - 送信メールは最初の62,000通が無料（EC2から送信した場合）。
   - 以降、1,000通あたり0.10 USD。

4. **柔軟な統合**
   - SMTPインターフェイス、AWS SDK、AWS CLIを使用して簡単に統合可能。

5. **セキュリティ機能**
   - ドメイン認証（DKIM、SPF）で送信メールの信頼性を向上。
   - フィッシングやスパムメールを防ぐ対策を簡単に実装。

## **AWS SESの主なユースケース**

#### **1. トランザクションメールの送信**
- **例**: サインアップ確認メール、パスワードリセットリンク、注文確認メール。
- **シナリオ**:
  - Lambdaでユーザー登録時にSESを呼び出して確認メールを送信。
  - DynamoDBに保存されたデータを基に領収書を生成し、顧客に送信。

#### **2. マーケティングメールの送信**
- **例**: キャンペーンメール、プロモーションのお知らせ。
- **シナリオ**:
  - SESとS3を組み合わせてHTMLメールテンプレートを管理。
  - サードパーティツール（例: Amazon Pinpoint）と連携して配信分析。

#### **3. メール受信と自動処理**
- **例**: フォームの入力内容をメールで受信。
- **シナリオ**:
  - SESで受信したメールをS3に保存。
  - Lambdaをトリガーして、内容をDynamoDBに記録したり、返信メールを自動生成。

## **AWS SESの料金体系**

#### **1. メール送信**
- **無料枠**: Amazon EC2から送信した場合、最初の62,000通/月が無料。
- **追加コスト**: 62,000通を超えると、1,000通あたり$0.10。
- **添付ファイルデータ転送**: 送信データ1GBごとに$0.12。

#### **2. メール受信**
- **受信メール**: 1,000通ごとに$0.10。
- **受信データストレージ**: S3の料金に基づく。

## **SESのメリットとデメリット**

#### **メリット**
1. **コスト効率**: 高頻度のメール配信でも低コストで運用可能。
2. **柔軟な統合**: AWSサービス（S3、Lambda、CloudWatch）と簡単に連携。
3. **高い信頼性**: Amazonのインフラを活用した信頼性の高い配信。

#### **デメリット**
1. **セットアップの手間**: 初期設定（DNS認証、ポリシー作成）が必要。
2. **学習コスト**: 他のAWSサービスと比較すると学習曲線がやや高め。

## **SESの他サービスとの比較**

| **項目**             | **AWS SES**                         | **SendGrid**                   | **Mailgun**                   |
|----------------------|------------------------------------|--------------------------------|-------------------------------|
| **コスト**            | 低コスト（無料枠あり）              | 無料枠ありだが単価はやや高い    | 送信数に応じたプラン          |
| **統合性**            | AWSサービスとの統合が強力           | APIとSMTPが使いやすい           | シンプルで中小規模に最適      |
| **セキュリティ**       | DKIM、SPF、IAMで高度な制御が可能     | DKIM、SPFでの認証サポート        | 基本的なセキュリティ設定可能  |
| **ターゲット**         | 技術的なセットアップに慣れた開発者向け| 開発者およびマーケティング担当者 | 開発者および中小規模企業向け  |

## 感想
メールは当たり前に使う時代やけど、設定するのはセキュリティ考えると大変だとわかった。
copilotにpythonのクラス内でデコレータを使用する方法を聞いてみた

# 初めに
最近ではcopilotにコードの書き方を聞くのが私の中でも定着し始めてますが、いろいろ便利だなと思ったので皆さんも同じように使ってみるといいかもなと思いました。
今回は最終的に質問した内容をqiitaの記事にしてくださいって言ってみたらこんな内容になりましたという投稿になります。終わりにまではcopilotさんが書いてます。（copilotさんに記事投稿しても良いか聞いたらいいって言われました）

# クラス内でデコレータを使用する方法

クラス内でデコレータを使用する方法について、具体的な例を交えて説明します。

## 基本的なデコレータの定義

まず、デコレータを定義します。例えば、メソッドの実行時間を計測するデコレータを作成します。

```python
import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to execute")
        return result
    return wrapper
```

## クラス内でデコレータを使用する

次に、このデコレータをクラス内のメソッドに適用します。

```python
class MyClass:
    @timer_decorator
    def my_method(self):
        print("Executing my_method")
        time.sleep(2)  # 例として2秒間スリープします

# クラスのインスタンスを作成し、メソッドを呼び出します
obj = MyClass()
obj.my_method()
```

## クラス内にデコレータを含める方法

クラス内でデコレータを定義し、メソッドに適用する方法を示します。

```python
import time

class MyClass:
    def __init__(self, value):
        self.value = value

    def timer_decorator(func):
        def wrapper(self, *args, **kwargs):
            start_time = time.time()
            result = func(self, *args, **kwargs)
            end_time = time.time()
            print(f"{func.__name__} took {end_time - start_time} seconds to execute")
            return result
        return wrapper

    @timer_decorator
    def my_method(self):
        print(f"Executing my_method with value: {self.value}")
        time.sleep(2)  # 例として2秒間スリープします

# クラスのインスタンスを作成し、メソッドを呼び出します
obj = MyClass(value=42)
obj.my_method()
```

この方法では、デコレータをスタティックメソッドとして定義し、`self`を引数として受け取るようにしています。これにより、クラス内でデコレータを自然に使いながら、`__init__`で初期化した変数も利用できます。

# 終わりに
copilotの何が便利かって好きな形式にしてまとめてくださいっていえばまとめてくれるところにありますよね？今回は質問内容をqiitaの記事に投稿するようにまとめてくださいって言ったらまとめてくれました。
ただ、ここではストレートにこの回答になったんですけど実際は3回くらい手案されたコードをダメ出ししてここにたどりついたのでスパッと聞きたいことを聞けるかってのも今後は必要な技術になるのかもしれません
【UiPath】プロジェクト間でアクティビティをコピー出来ない時はパッケージのバージョンをチェック

UiPathでは別のプロジェクトのxamlからでもアクティビティをコピーペーストで持ってくることが出来るが、これは依存関係に問題がない場合に限られる。

下のGIFではExcelプロセスアクティビティのコピーは相互に成功しているが、アプリケーション使用のアクティビティは左から右へのコピーが失敗している。

![メディア1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/f4269aaa-8b84-5384-5ea9-de95ead68de9.gif)

これは左右のプロジェクトでUiAutomation.Activitiesのバージョンに差異があるからで、バージョンが下の左からバージョンが上の右へのコピーは出来ない（逆は出来る）。「コピー出来ない」といってもエラーメッセージ等が出るわけでもないので、初見だと原因に気付きにくい。こういった事象があることは頭の片隅にでも入れておこう。

## 動作環境

UiPath Studio 2025.0.157
Figmaデータをトークンとコンポーネントとで分離したいとき

## この記事の概要

Figmaのデータ管理で、以下のような場面をときどき見ます。

- プロダクトAを作っていて、同じファイルにデザイントークンとコンポーネントを定義していた
- プロダクトBも作ることになり
    - デザイントークンは同じものを使いたい
    - プロダクトAのコンポーネントとプロダクトBのコンポーネントは全然別物
- プロダクトAのファイルをプロダクトBにインポートすると、不要なコンポーネントがたくさん読み込まれてしまう
- デザイントークンとコンポーネントのファイルを分けて管理したい

before, afterを簡単に図示するとこうです。

before↓

```mermaid
classDiagram
    class TokensAndComponents["Design tokens & Components"]
    class ProductA["Product A"]
    TokensAndComponents <-- ProductA
```

after↓

```mermaid
classDiagram
    class Tokens["Design tokens"]
    class ComponentsA["Components A"]
    class ComponentsB["Components B"]
    class ProductA["Product A"]
    class ProductB["Product B"]
    Tokens <-- ComponentsA
    Tokens <-- ComponentsB
    ComponentsA <-- ProductA
    ComponentsB <-- ProductB
```

すべてのFigmaデータを再設定し直すのは大変すぎるので、多少は楽になる方法を記事にしました。

## 準備：すべてのコンポーネントにバリアントを設定する

シンプルなコンポーネントであれば、バリアントが設定されていないものもあると思います。
ただ、コピー＆ペーストで移行できるようにするためバリアントを設定します。

なぜかというと、以下のような挙動の違いがあるからです。

|  | バリアントなし | バリアントあり |
| --- | --- | --- |
| コンポーネントそのものを複製した際 | インスタンスが生成される | 別のコンポーネントとして複製される |

そう、バリアントを設定しておけば、新規ファイルにコピー＆ペースト（またはカット＆ペースト）するだけで済みます。

## 新規ファイルを作り、コンポーネントを移動させる

先ほどのセクションでネタバレしてしまっていますが、1つのファイルに定義されているデザイントークンとコンポーネントを分離したい場合、次の2パターンが考えられます。

- 新規ファイルを作り、デザイントークンを移す（既存ファイルにコンポーネントが残る）
- 新規ファイルを作り、コンポーネントを移す（既存ファイルにデザイントークンが残る）

このとき、デザイントークンを移すのは大変です。
最近のアップデートで[コレクションをまたいでバリアブルをコピー＆ペーストできるようになりました](https://x.com/figma/status/1856404181239902493)が、私が試した限りでは、ファイルをまたいでのコピー＆ペーストはできないようです。

しかし、コンポーネントのコピー＆ペーストならできます。
数が多いとそれなりに大変かとは思いますが、すべてのバリアブルを登録し直して、再度適用するよりはマシかと思います。

コンポーネントが入れ子になっているときでも、コピー＆ペーストでちゃんとリンクが生きていました。

## 既存ファイルを綺麗にする

もともと登録していたコンポーネントをすべて削除し、再度パブリッシュしましょう。

これで完了です。
LINEから書籍リストを作りたい　③使用確認

お疲れさまです、みやもとです。

昨日書籍整理の折、作ったツールを実際に使用してみました。
実際使った感想とか、ハンズオンで作った名刺管理ツールとはこのあたりが違うかもしれないな、と思うところを書き出していきたいと思います。

# 全部撮って送るのは無理
結論から言うと、持っている本のすべてを撮ってLINEで送ってGeminiで読み取って…という使い方は無理でした。

## Gemini側の制限
正確な計測はしていないのですが、5分以内に2件、場合によっては1件のみが処理可能なようです。
それを超えるとDifyのログにこんなエラーが出ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477580/69e9a79b-94ad-2da2-34da-f8c7a7aa84a8.png">

この後ろにまだ何行か出てくるエラーを眺めていくと、「API key expired. Please renew the API key.」というメッセージがあります。
作り直しても時間を空けないとまた同じエラーが出ますし、しばらく間を置いて同じキーのまま再度画像を送るとちゃんとフォーム連携されるので、どうもトークン量か何かでひっかかってる模様。
名刺の場合でも同じような感じなのかは試してみる余地がありそうですが、少なくとも書籍リストを作る場合は画像の送信をするのに間隔をあける必要がありそうです。

## 読み取りが不正確
大まかには読み取り成功していたのですが、フォームに設定されるタイトルや著者名にちょこちょこ間違いが見受けられました。
おそらく名刺よりもフォントの種類や文字の配置等が自由なので誤認が出てくるのでしょう。
もしかしたら先のGeminiの制限にもこのあたりが影響してるのかも、と思うので今度名刺版を改めて作って試してみたいと思います。
フォームの段階で直してしまえば問題ないのですが、うっかり見落として登録してしまうこともありました。

## 場合によっては手入力の方が楽
先述の通り間隔をあけて送信する必要があるというのもそうなのですが、手入力の方が楽なケースもありました。
私の蔵書に関して言えば

* 同じ著者の本
* 同じタイトルの巻数違い

というのが結構あるので、一度入力して次からは予測変換で入れる方がいちいち撮影するよりよっぽど早いということに気付きました。

# それでもある方が楽
じゃあ作らなくて良かったかといえば決してそんなことはなく、例えばタイトルが2行3行に渡るとか副題が長いとか、そういう本は撮影から送信して取り込む方が楽でした。
えてしてそういう本は先に挙げた「手入力の方が楽なケース」に該当しないことが多く、長いタイトルの本にぶち当たるたび撮影して取り込み、そのあとしばらくは短いタイトルの本を入力して待ち…という感じで作業すると効率よく進めることができました。

我が家の本は平置きの本棚とクローゼットの上の棚の2か所が主な置き場で、先日時点で本棚の方だけ終わったのですが

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477580/8fe6cefe-1963-3ab8-79a7-faa968cb55f3.png">

書籍名・著者名については蔵書の趣味を公表するのが恥ずかしいので隠させていただきました。ご了承ください。

100冊を超えると全部入力はつらいものがあります。
気分転換の意味でも途中で撮影取り込みが入るのは良かったです。
[備忘録]　Unityの座標系について分かったこと

# はじめに
　こんにちは，Umamusume22です。最近、業務でUnityを使っているのですがUnityが分からないので自主的に勉強を始めました。とりあえず、Youtubeを見ながらUnityの勉強を行います。学んだことはここの記事にアウトプットしていきます。なお、今回は動画ではなくて書籍から学んだことを書きます
 以下のurlは本記事を書く上で参考にした書籍です

 https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E6%95%B0%E5%AD%A6-Unity%E3%81%A7%E5%AD%A6%E3%81%B6%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC%E3%81%BE%E3%81%A7-%E4%B9%85%E5%AF%8C%E6%9C%A8-%E9%9A%86%E4%B8%80-ebook/dp/B015IDHRH2/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dib=eyJ2IjoiMSJ9.O19tio-2JYM3aeyrj_T1OF3bv9Kt4bjAKG8IX4VOObBAhmdVcAMC_zOt1q--iluFFuAQc6LPF8U4NMk4aNUDvrsM0W1Jes1xDw5LpfyHY6EWmoxJYOBsub2_-HZijGIiF-fzJO9b6wZM948bmugc52HkN2wtBi4o9XX8CI1UJEXnub1WXWTCDl9RcRjIpOWxBGXM2HNqzlabQSuKjzCdcFY28tPK5lCe-LKPQpwUPRQ.o3tZnQwJNTkhGd40kujDRtHNddz3WJOVty2k6K3SeeY&dib_tag=se&keywords=Unity+%E3%82%B2%E3%83%BC%E3%83%A0%E6%95%B0%E5%AD%A6&qid=1730633539&s=books&sr=1-2


 
 # 備忘録
 - Inspectorのtransform.positionはワールド座標系
     - ワールド座標系とはScence画面の絶対位置
 - 物体に表示される座標系はローカル座標系
 - 左下を原点としたスクリーンの座標はスクリーン座標系
     - スクリーン座標系は正規化されている



# 最後に
　勉強した内容を備忘録にしました。備忘録の内容が短くてすみません

 

ここまで記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteもやっています．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
Cavirin と 生成AI でのセキュリティ運用

# はじめに

[SRA Advent Calendar 2024](https://qiita.com/advent-calendar/2024/sra) の22日目です。

こんばんは。
Advanced Cloud Engineering 事業部の杉本です。

日々の業務では、ネットワークの設計・構築、AWS、Azure の CCoE として活動しております。

社内活動としては、Cavirin Systems, Inc. という CSPM 製品を開発しているグループ企業があり、日々の業務も関連することから、社内支援として Cavirin の検証等を行なっております。
Cavirin に触れて 3年ほど経ちますので Cavirin の紹介と、「生成AI をからめた何か」が出来ないか、この記事を書いてみました。

## Cavirin について

https://www.cavirin.com/

- 設立年: 2012年9月
- 所在地: 2114 Ringwood Ave, San Jose, CA 95131, U.S.A.
- データセンタ環境およびAWS、Microsoft、Googleといったクラウド環境、さらにはそれらのハイブリッド環境に対する包括的かつ一元的なセキュリティとコンプライアンス管理を提供します。
- セキュリティガイドラインや基準・規制に対応するポリシーが搭載されており、運用コストを増やさずに統一的かつ継続的なセキュリティとコンプライアンスの保全を実現します。
- AWS Inspector のソリューションパートナーでもあります

https://aws.amazon.com/jp/inspector/partners/

## Cavirin を使用したセキュリティ運用の課題
Cavirin は NIST, CIS, ISO 等のセキュリティ基準に基づいたセキュリティ監視が可能です。運用に取り入れた場合、継続的に監視・対応し続けていくことが必要です。
Linux サーバの設定については、構築段階から意識していない限り、監視による指摘項目は大量となります。
![スクリーンショット 2024-12-21 17.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133546/f52e0b70-ccd7-8607-2a10-fb917d2cdf84.png)
画像は、Cavirin のダッシュボードの一部ですが、何から修正していくかの計画が必要です。

## Amazon Bedrock 使ってみた
### やらせたこと
- Cavirin で出力されたレポートを読み込み
- レポートの severity と weight をもとに、優先すべき 10項目を選定
- 表形式で出力

### 仕様
- モデル: Claude 3.5 Sonnet
- システムプロンプト
```
あなたは AWS セキュリティ スペシャリストです。

添付されたセキュリティレポートに対して、セキュリティ対策として最も効果の高い 10項目を上げてください。

出力は表形式とします。
項目は以下をお願いします。

シート名 | ポリシー名 | SEVERITY | WEIGHT | 修正方法 

ポリシー名と修正方法は日本語訳をお願いします。 
```

- Cavirin のレポートを読ませた結果
![スクリーンショット 2024-12-21 21.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133546/ac9eef3f-46a6-9a5d-09a6-b53bf6bb24b9.png)


- Cavirin のレポートにも修正方法は記載されているが、聞いてみた
![スクリーンショット 2024-12-21 18.18.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133546/a58a75af-2bd4-5255-8f65-cff0002227ad.png)

## まとめ
セキュリティ運用では、数多くの指摘項目の中で優先的に対応すべき項目を確認し、効率的に進めていく必要があります。Amazon Bedrock を使うことで、優先度付けや、指摘内容・修正手順の日本語化が出来、修正作業のハードルを少しでも下げることが出来たのではないかと思います。
Cavirin を提案した際に、UI、レポート、指摘内容の日本語化を要望されることは多く、生成AIと組み合わせることで少しでも採用の可能性を高めていきたいと思います。
【iOS】ショートカットでプログラミング「音声入力+BlueBirdでサクッとポモドーロ」を作ってみた

タスクを進めるときに有用なポモドーロ・テクニック。

25分集中＋5分休憩を繰り返しながら集中力の高い状態を保ちながら作業ができるものです。みなさんも色々なツールを使っていると思います。

今日は、
1. アプリ起動、タスクの入力
1. ポモドーロタイマーの開始

をiOSのショートカット機能とBlueBirdを組み合わせて、

1. ウィジェット起動 → 音声入力してポモドーロタイマー開始

ができるようにしてみます。

BlueBirdはこちらのアプリです。

https://bluebird.app/ja


## ショートカットを作成

1. 「ショートカット」右上の＋から新規作成を開く
1. 「アクションを検索」から「テキストを音声入力」を選択
1. 「アクションを検索」から「BlueBird」を検索し、一覧から「タスクを追加」を選択
1. 「タスクを追加」の時間を`25分`にします（その他はオプション）
1. 「アクションを検索」から「BlueBird」を検索し、一覧から集中を開始」を選択
1. 「集中を開始」の時間を`25分`に、`タスクを追加`を選択

![IMG_8415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/4e4a0f0b-d164-c3ec-2d11-c6f854599287.jpeg)

![IMG_8416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/331651ee-07ae-1b16-1952-8cb0e8cfa250.jpeg)


## ウィジェットに追加

https://support.apple.com/ja-jp/118610

![IMG_8418.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/6bd5192d-a8f5-6f34-5a06-25de8d302f41.jpeg)


## ウィジェットを起動
1. 追加した「タスクの追加」ウィジェットをタップ
1. 音声入力状態になるのでタスクをいれる

![IMG_8421.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/e5a858f8-5157-64b5-bbc5-166fdfde94b8.jpeg)

![IMG_8419.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/cd81e721-3a31-85f6-f557-abc92d37c6a7.jpeg)

## 前のタスク中におなじウィジェットを起動したとき

新規タスクとして積まれます。

:::note info
2つ目、3つ目を入力したあとの状態
:::

![IMG_8420.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/eaedc5ee-2292-422c-7bc3-50cb5faf3e89.jpeg)


## まとめ
- ショートカットアプリでプログラミングgあ体験できる
- 好きなアプリを組み合わせてカスタマイズできる
- ちいさな改善を積み重ねていく練習になる。効果を実感できる

プログラミングというと、コードを書いて実行してというイメージがありますが入力と出力のロジックを組み合わせて目的を達成するという点においてこれもプログラミングだなと感じました。

なによりアイデア次第で可能性が無限にひろがっていくのが楽しかったです。
【進捗管理】23種のReactアプリ開発を通してReactを習得する！

# はじめに
フロントエンド初心者の筆者が、
23種類のReactアプリを作成してReactを習得していく挑戦を始めました。
本記事は、その挑戦の軌跡を記録したものであり、自戒も込めて進捗を共有していきます。

# どんな試みか
こちらは @Sicut_study さんがX（旧Twitter）で投稿された
【3か月でエンジニアキャリアを変えるロードマップ】に掲載されている、
23種類のアプリ開発を通じてReactを習得する試みです。

https://x.com/Sicut_study/status/1867887509600195009

# ルール
ここでは @Sicut_study さんの「Reactアプリ100本ノック」のルールを採用します。
・主要なライブラリやフレームワークはReactである必要がありますが、
　その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）
　を組み合わせて使用することは自由
・TypeScriptを利用する
・デザインなどは自由
　＊特に要件は設定されていないため、独自に要件を設定して進めています。
 
https://qiita.com/Sicut_study/items/3c5cd798313854a471a0

# 進捗状況
作成したアプリは随時記事として公開する予定です。
開始日付：2024/12/15
更新日付：2024/01/03
達成目標：2025/03月中

## 基礎編
- [x] [計算機](https://qiita.com/xYasi/items/e5cad5edbef0a4181d38)
着手日：2024/12/15
達成日：2024/12/15 
- [x] [電波時計](https://qiita.com/xYasi/items/09196892c862cef32a45)
着手日：2024/12/18
達成日：2024/12/18 
- [x] [カウントダウンタイマー](https://qiita.com/xYasi/items/bddde2c2fa6472d12a87)
着手日：2024/12/20
達成日：2024/12/20
- [x] [カラーパレット](https://qiita.com/xYasi/items/5dea345c2b18854acc94)
着手日：2024/12/21  
達成日：2024/12/21   
- [x] [TODOリスト](https://qiita.com/xYasi/items/095a5cbbdd5dcf96bcc8)
着手日：2024/12/24  
達成日：2024/12/26  

## データ処理編
- [x] [金額計算機](https://qiita.com/xYasi/items/d7b17358af83e0c20d00)
着手日：2024/12/30  
達成日：2024/12/31
- [x] [年齢計算](https://qiita.com/xYasi/items/708f6fb05acfe3c2d2f6)
着手日：2025/01/11  
達成日：2025/01/12
- [ ] 支出トラッカー
- [ ] 書籍管理
- [ ] レシピ検索

## インタラクション編
- [ ] クイズアプリ
- [ ] ランダムクイズ
- [ ] 神経衰弱
- [ ] お絵かきアプリ
- [ ] 音楽プレイヤー

## 実践編
- [ ] ECのカート機能
- [ ] 映画の座席予約
- [ ] チャットアプリ
- [ ] スクレイピングアプリ
- [ ] お天気API連携

## 応用編
- [ ] Trelloクローン
- [ ] リアルタイム天気予報
- [ ] ソーシャルメディアダッシュボード
Azure bastion ログイン履歴確認方法（学習メモ）

最近、セキュリティ対策の重要性がますます高まっています。
ランサムウェアや不正アクセスなど、重要なシステムを守るための対策が次々と登場しています。その中でも、Azure Bastionは、安全に仮想マシン（VM）にアクセスするための強力なツールです。今回は、Azure Bastionを使用してVMに接続した際のログイン履歴を確認する方法についてご紹介します。

## 具体的な設定方法

### Azure ポータルにサインイン
Azure ポータルにサインインし、対象となる Azure Bastion を選択します。
### 診断設定の確認
左側のメニューから [監視] を選び、その中の [診断設定] をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/4e7faf10-00d0-775d-1186-020bcb432ed2.png" width="25%">


### 新規診断設定追加
画面右側の「診断設定」画面で、新しい診断設定を追加 をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/629f1286-dd2b-7248-dfd3-5f3a40d055c8.png)

### 診断ログの有効化
1.ログの選択
[ログ] の項目にて、次の2つのログを選択します：
・Bastion Audit Logs
・AllMetrics
2.宛先の指定
[宛先の詳細] の項目にて、以下の設定を行います：
・Log Analytics ワークスペースを指定します。
・ログの保存先となるストレージ アカウントを指定します。
※ Log Analytics ワークスペースとストレージ アカウントは、事前に作成しておいてください。

3.設定の保存
設定が完了したら、保存 をクリックして診断ログの収集を有効にします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/bdc754c1-36c8-d1c3-06ed-396a9992c834.png)

### ログ確認　(方法1)
収集したログを確認する際には、Azure Bastion の診断ログを保存するために指定したストレージ アカウントの BLOB コンテナー内に作成された "insights-logs-bastionauditlogs" という BLOB フォルダーから、JSON ファイルをダウンロード することで、ログを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/17c9e621-7596-993d-4568-888ba7acdc5b.png)


Jsonファイルでログイン情報を確認することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/517fb810-2f39-66d0-4abe-1549ed3d23e7.png)

### Log Analytics ワークスペースで出力履歴を確認 (方法2)
1.Log Analytics ワークスペース画面にアクセスし、左側のメニューから [ログ] をクリックします。
2.クエリの入力
クエリバーに以下の情報を入力します：
```
MicrosoftAzureBastionAuditLogs
```

ログイン記録の一覧が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/efc9295b-f0fd-43be-352d-b491b6c18a44.png)
VercelにデプロイしたNext.jsのエラーログを確認する

## Vercelのエラーが見られる場所
Runtime Logsという場所でエラーログが見られます。

![runtime_logs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139369/0ee23e09-0076-a714-35da-97e6603bcd35.png)

Observabilityではエラー比率も見られます。
![observability.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139369/aded3ee4-7200-76e1-1aaa-b57b55397252.png)


## エラー出力の場所調査

|  | console.error | throw new Error | 
|:-:|:-:|:-:|
| Client Component | ブラウザのコンソール | ブラウザのコンソール |
| Server Component | Runtime Logs | ブラウザのエラー表示 / Runtime Logs |
| Server Actions | Runtime Logs | ブラウザのコンソール(500) / Runtime Logs |
| Edge | Runtime Logs | ブラウザのコンソール(500) / Runtime Logs |


https://github.com/tonakai-it/nextjs-error-how-work

Sever Componentの画像

![server-side-component-throw-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139369/f6b3166f-ffa1-2627-5f1a-7db2e8cb2ca6.png)
(Application error: a server-side exception has occurred (see the server logs for more information). Digeset: **********))
Flipper Zeroを買ったので規格について調べてみた

## これは何?

Flipper ZeroはF無線プロトコル、アクセス制御システム、ハードウェアなどのデジタル要素をハッキングするのに使用できます。
自分はハードウェアについて詳しくないのでこれを機会に使用できる規格についてまとめてみました。

---

## Flipper Zeroとは

https://qiita.com/Brutus/items/96009690b112eb7f407c

既にわかりやすい記事を書いている方がいたので貼っておきます。

---

## 125 kHz RFID

[RFIDとは NECサイト](https://www.nec-solutioninnovators.co.jp/sp/contents/column/20220128.html)

- 情報が書き込まれたICタグ・RFタグ（RFIDタグとも言う）と電波などでワイヤレスに通信し、情報の読み取りや書き換えをする技術
- 使用例: アパレル業界でセルフレジへの導入が進んでいるらしい。

---

## NFC

[RFC9428](https://tex2e.github.io/rfc-translater/html/rfc9428.html)で定義されています。

- Near Field Communicationの略。
- 2つのデバイス間でのシンプルで双方向の相互作用を可能にする
- 非接触で処理ができる
- 使用例: Suica等

---

## Infrared

- 文字通り赤外線通信
- 使用例: テレビやエアコン等のリモコン

---

## iButton

[Marubun](https://www.marubun.co.jp/technicalsquare/42029/)

- Information Buttonの略
- 16mmのステンレス感の中にセンサやメモリ，バッテリー等が搭載されている。

---

## Sub-GHz

- 1 GHzに満たない周波数帯を使う無線規格。
- 使用例: トランシーバや飲食店の呼び鈴など
IBM TechXchange 2024で講演してきました

# はじめに

こんにちは、Airitech株式会社の代表取締役をしている、山﨑政憲と申します。
普段は会社の経営の傍ら、遅いシステム、止まってしまうシステムのトラブルシュートを行っています。
今回は今年の10月に行ってきた、TechXchange 2024というIBMの技術系イベントで登壇に関して、応募や準備から発表に至るまでの経験を振り返ってみたいと思います。

# 応募まで

登壇を目指そうと決めたのは今年の3月です。
せっかくIBM Championにもなったことだし、何かしら貢献したいという気持ちと、日本でのInstanaの布教に弾みがつくような事をしたいという欲望とで、勢いで決めました。
前年のIBM TechXchange Japan 2023でTurbonomicについて発表したこともあり、アメリカでイベントがあることは知ってはいましたが、登壇を目指す気などなかったのですが、ここは勢いで決めて、3月のInstanaユーザグループのイベントで発表して、自分を追い込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/7efb1723-7f02-c502-646f-8d6bd355a0c7.png)

応募自体はそれほど時間がかかりません。
発表内容の概要を投稿するだけなので、逆に短いテキストにアピール内容をまとめる必要があります。
私のタイトルは、ちょっと長いですが以下としました。

「Seven Hundred (700) Issues Resolved in 20 Years! Why Do Japanese Troubleshooters Rate Instana as the No. 1 Tool」

ということで、事例発表を中心に、私がなぜInstanaに入れ込んでいるかをアピールしました。
最近、以下のニュースもあり、私の目に狂いが無いと証明されて、嬉しいです。

IBM Instana ObservabilityがCRN 2024「Products of the Year」を受賞！
https://qiita.com/daihiraoka/items/6359e1edd569b6c743fa

# 発表準備！

さて、発表に向けてプレゼンを練る必要があります。
そこで、その前に同じような内容で発表する機会を作っていただきました。
9/19に行われた、IBM Software Salonでの発表です。

https://video.ibm.com/recorded/133995814
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/e14ffbed-c791-de56-5a38-c135568ac8a1.png)

１．この時の発表内容をもとに発表原稿の日本語版を作り
２．それをChatGPTで英語原稿にし
３．さらにChatGPTに読み上げてもらったのを真似して練習を行い
４．私の音声をポケトークに流し込んでちゃんと英語として聞き取れるか確認

というプロセスで一人練習を行いました。
これは効率よかったような気がします。

そして、内容はもちろん、感情も揺さぶりたいので、ことあるごとに、私のInstanaへの愛を伝えるためのスライドを準備。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/1c28b305-7c88-3660-6511-3ab260e20e7f.png)

これだけやれば印象には残るだろう、とドキドキしながら本番に備えていました。

# いよいよ登壇

いよいよ登壇ですが、なかなか大きめの部屋が埋まるくらいに集まって頂きました。
60人くらいはいたんじゃないかな。
同時に100セッションくらいは行われているので、なかなか人が集まらないセッションも多い中、かなり盛況です。

で、ここで最大のやらかし。
なんと30分程度で話しきってしまいました。
日本での発表だと、合間にいろんなエピソードを入れて話を膨らませる結果、時間いっぱいまで話す事が多いのですが、英語となるとそうもいかず、事前の練習だともっと時間がかかっていたのですが、多分、間の取り方がかなり短かったので、時間が余ったのでした。
もう2つくらいはエピソード入れておけば良かった、、、という感じですが後悔先に立たず。

なので、早々にのディスカッションに移りましたが、私は英会話はからっきしなので、当然、質問が聞き取れない。
どうしようと思っていたら、参加してくれていたIBM Championの加藤さんが助け舟で通訳をしてくれました。

その後も日本人参加者の方が皆さん助け舟をだしてくれ、会場の様々なところから出てくる質問に対処するという感じで、私を囲んで世界中のInstanaフリークが発現するという、なんとも言えない、一体感を感じる事ができました。
終わった後も、いろんな人から「ナイスプレゼン！」「今回のセッションの中で一番盛り上がってた」と感想を頂いて、いやー、気恥ずかしい反面、嬉しかったですね。

発表後、スライドのIをWeに書き換えて、残ってくださった人達と集合写真をパチリ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76238/d39c5484-b6fb-798a-2053-e5898adf4a2f.png)

# さいごに

という訳で、50歳目前にして、初アメリカ、初英語プレゼンというチャレンジをしたこともあり、楽しい経験ができました。
いやー、なかなか余裕がなくて、振り返ると失敗多いなーという感じで反省しきりです。

あ、でも、自分の発表以外の部分も含めて、いろんな新鮮な経験ができたし、IBMのChampionに対するリスペクトも感じられて、大満足のイベントでした。

来年はオーランドで行われるとのこと。

https://www.ibm.com/community/ibm-techxchange-conference/

次回はいろんな人とディスカッションしたいものです。
OSSへの挑戦：AirflowへのPR提出とその後

## チャレンジしたことの概要
最近、OSSプロジェクトに少しでも貢献できないかと考え、Apache Airflowに対して型注釈の追加とテストカバレッジの向上を目的としたプルリクエスト（PR）を出してみました。

## チャレンジの過程
[m3さんのライトニングトーク（LT）](https://sansan.connpass.com/event/288525/)でパイプラインについて聞く機会があり、その中で[gokart](https://github.com/m3dev/gokart)にも触れましたが、他のPipelineフレームワークとして比較的有名なAirflowに注目しました。[Airflow](https://github.com/apache/airflow)はPythonで書かれているため、型注釈を追加することでコードの可読性が上がると感じました。

具体的には、`kerberos.py`に返り値の型注釈を追加し、`test_perform_krb181_workaround`のテストケースを充実させるPRを作成しました。これにより、コードの明確化とテストの網羅性を高めることを目指しました。

- [Add return type of kerberos.py and Create test of test_perform_krb181_workaround #40494](https://github.com/apache/airflow/pull/40494)

## チャレンジの結果
PRを提出してから数週間が経ちましたが、特にレビューやフィードバックはなく、最終的にはクローズされてしまいました。自分のPRがプロジェクトの現状や既存にでているIssueとどのように関連しているのかが伝わりにくかったのかもしれません。

## 得た気づきと今後のアプローチ
今回の経験から、いくつか学ぶことがありました。

- **プロジェクトの優先事項を理解することの重要性**  
  各OSSプロジェクトには独自の優先事項や現在取り組んでいる課題があります。PRを出す前に、プロジェクトの最新のIssueやディスカッションを確認し、どの部分に貢献できるかを見極める必要があると感じました。

- **Issueとの関連付け**  
  PRを提出する際に、関連するIssueを見つけてリンクさせることで、貢献の意図や必要性を明確に伝えることができると分かりました。今回は自分のPRが特定のIssueに直接関連していなかったため、理解されにくかったのかもしれません。

- **コミュニケーションの大切さ**  
  PRが無視される場合でも、メンテナーやコミュニティと積極的にコミュニケーションを取ることで、フィードバックを得たり、改善点を見つけたりすることができると感じました。

## 次回への改善点
今後、OSSへの貢献を考える際には以下の点を意識したいと思います。

- **事前のリサーチ**  
  貢献しようとしているプロジェクトの現在の課題や優先事項をしっかりとリサーチし、それに基づいてPRを作成する。

- **Issueとの連携**  
  関連するIssueがあれば、それに基づいた形でPRを提出し、貢献の意義を明確に伝える。

- **積極的なフィードバックの求め方**  
  PRが無視されている場合でも、丁寧にメンテナーにフィードバックを求めることで、次回以降の改善につなげる。

OSSへの貢献は、自分のスキルを磨くと同時に、プロジェクトの発展にも寄与できる素晴らしい機会だと思います。今回の経験を糧に、次回はもっと効果的に貢献できるよう頑張りたいです。
LongBench v2で解き明かす：長文コンテキストモデルの真の理解力と推論能力

# LongBench v2: 現実的な長文コンテキストタスクを通じた理解力と推論力の新たなベンチマーク

今回は、最新の研究「LongBench v2: Towards Deeper Understanding and Reasoning on Realistic Long-context Multitasks」を詳細に解説します。本研究は、長文コンテキストを必要とするタスクにおいて、大規模言語モデル（LLM）の性能を多角的に評価するための新しいベンチマークを提案したものです。本記事では、この研究の背景、設計、結果分析、今後の展望について詳述します。

---

## 背景と目的

### 長文コンテキスト評価の進化と課題

長文コンテキストを扱うLLMの進化に伴い、最大で100万トークン以上の文脈を処理できるモデルが登場しています。これにより、学術文書の解析、法律文書のレビュー、長期的な対話履歴の分析など、多様な応用が可能になっています。しかし、以下の課題が未解決のまま残されています：

1. **浅い評価基準の限界**:  
   従来のベンチマーク（例: ZeroSCROLLS, L-Eval）は主に情報抽出型の質問に依存し、モデルの深い推論能力を正確に測定できていません。
   
2. **現実世界のタスクとの乖離**:  
   合成データや単純化されたタスクが主流であり、実際の応用場面を反映していません。

3. **指標の適切性**:  
   ROUGEやBLEUスコアのような指標は、長文内での複雑な関連性や推論能力を正確に評価するには不十分です。

---

### 本研究の目的

本研究では、これらの課題を解決するために以下を目指しました：

1. **現実的なシナリオを反映したデータセット**:  
   学術文書、小説、法律文書、コードリポジトリなど、多岐にわたるドメインから構成されたデータセットを作成。

2. **推論能力の正確な評価**:  
   単純な情報抽出型ではなく、複数の文脈を統合する深い推論を必要とする質問を設計。

3. **信頼性と公平性を確保**:  
   客観的かつ一貫性のある評価基準を採用。

---

## データ設計と構築プロセス

### データ収集

LongBench v2のデータは、現実世界の多様なドメインをカバーする以下の手順で収集されました：

1. **ソース選定**:  
   学術文書、小説、法律文書、財務報告書など、8,192単語以上の文書を収集。

2. **文書の多様性確保**:  
   重複や類似性の高い文書を除外し、幅広いテーマをカバー。

---

### 質問設計とアノテーション

1. **質問の作成基準**:  
   各文書に基づいて、選択式問題（Multiple Choice Questions, MCQ）を作成。以下の基準が設けられました：
   - **複雑性**: 単純な情報抽出ではなく、深い推論を必要とする。
   - **根拠の提示**: 正答の裏付けとなる具体的な証拠を要求。

2. **アノテーションプロセス**:  
   - 自動レビュー： GPT-4o-miniを用いて簡単すぎる質問を除外。
   - 手動レビュー： 専門レビュワーが設計した質問の妥当性を確認。

---

## タスク構成と具体例

LongBench v2は、6つの主要タスクカテゴリに分かれています：

### 1. 単一文書QA
- **目的**: 単一の文書から詳細な理解を求める。
- **具体例**: 「この文書で述べられた主要な結論は何ですか？」

---

### 2. 複数文書QA
- **目的**: 異なる文書間での情報統合。
- **具体例**: 「文書Aと文書Bの矛盾点を挙げてください。」

---

### 3. 長文コンテキスト学習
- **目的**: 新しいスキルや概念を習得。
- **具体例**: 「このテキストを基に、新しい技術Xの利点を説明してください。」

---

### 4. 長対話履歴理解
- **目的**: ユーザーとの対話履歴を解析。
- **具体例**: 「この対話中での主要な議論点は何ですか？」

---

### 5. コードリポジトリ理解
- **目的**: コード間の関連性を理解。
- **具体例**: 「この関数が他の部分に与える影響は何ですか？」

---

### 6. 長構造データ理解
- **目的**: 表形式データや知識グラフを解析。
- **具体例**: 「このデータセットで異常値を特定してください。」

---

## 実験結果と分析

### モデルの性能
- **人間の正答率**:  
   53.7%（制限時間15分）。

- **o1-previewモデルの正答率**:  
   57.7%で人間を超える結果。

### 文脈長の影響
短文ではモデルが人間を上回りますが、文脈が長くなるとその性能差が縮小します。

---

## 課題と今後の展望

1. **多言語対応**:  
   英語以外のデータセット追加が必要。

2. **ベンチマークの拡張**:  
   データセット規模の拡大。

3. **推論効率の向上**:  
   計算コスト削減と高性能化の両立が課題。

---

この記事が研究や実務に役立てば幸いです。ご質問はコメント欄へ！
自作PCにWindows11をインストールした話

## tl;dr

- 自作PCをアップグレードした際にOSのインストールに２週間かかった
- インストールメディア作成ツールを作ったらうまくいった
- Windowsのインストールメディアを作るときはWindowsを使おう

## 中古で買った自作PCのパーツをアップグレードした
数年前にハードオフで買った4万の自作PCをアップグレードしました

|        | 旧            | 新                         |
|--------|---------------|----------------------------|
| CPU    | Intel i7 4790 | Ryzen7 5700X               |
| マザボ | MSI G87-Z43   | ASUS Prime B550M-K         |
| グラボ | MSI GTX 960   | GFORCE RTX3050 Low Profile |
| メモリ | 8GB*4         | 16GB*4                     |

合計8万くらい　財布が薄くなっちまった...

自作PCの配線作業はHDDの増設くらいしかやったことがなかったのでマザボのドキュメントを探して読んだり、AIに聞いたりしながらなんとかできました

## Windows11を使いたい

貸しがあった友人にWindows11のアクティベーションキーを買ってもらいました

インストールメディアについてはMacしか持ってないからisoからメディアを作成するしかありません

色々調べた上でターミナル使って作成してみました

PCに挿して起動！

## Windows Server セットアップ

```
お使いのPCに必要なメディアドライバーがありません。
メディアドライバーの種類としては、DVD、USB、ハードディスクドライバーなどがあります。
ドライバーの入ったCD、DVD、USBフラッシュドライブをお持ちの場合は挿入してください。
```

🤔

とりあえずWindowsが入ってるUSBを選択したら

```
このフラッシュメモリは使用できません。
フォーマットしてください。
```

🤔🤔🤔

調べた通りにさっきMS-DOSでフォーマットしたしMSRを指定もした
なのになんで？

いろいろ調べたり聞いたりしてやったけどだめだったこと😱
- BIOS設定の見直し
  - 以下の正しい設定になっているか確認
  - TPM 2.0 Enabled
  - CSM 全てを UEFI only
  - CSM Disabled
- BIOSのアップデート
- Windows11のバージョンを23H2に変更
- メディアドライバーなるものを探してみる
  - ASUSの該当マザボのそれっぽいドライバーを別USBに入れてWindowsに読ませてみる
- インストールメディアの作成ツールをいろいろ試してみる
- インストールメディアとキーマウ以外を全て外してみる
- インストール先のSSDに Diskpart Cleanをかけてみる

## 結局

Windows11のインストールメディア作成ツールを使うために歩いて1時間のところにある快活クラブへ行きました

セルフサービスのバニラアイスを食べながらメディアの作成を待つこと15分

書き込み終わったメディアを持ってチェックアウトしお会計は330円

これでだめだったら素直にUbuntu入れようとPCに挿して起動


![1000001429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289099/4a3f1663-8afa-1a51-a373-1c36be9b298d.jpeg)


😁

無事インストールできました😆

---

メディアドライバーってなんなんですかね

よくわかりませんでした🤔🤔🤔
【自習】AWS LambdaとTerraform

PMする上で必要になってきたのでおさらい

https://docs.aws.amazon.com/lambda/?icmpid=docs_homepage_featuredsvcs

https://www.lac.co.jp/lacwatch/service/20200903_002270.html

## **AWS Lambdaとは？**
AWS Lambdaは、**コードを実行するためのサービス**。

- **目的**: イベント駆動型の処理を行う。
- **特徴**:
  1. **コードの実行**: 特定のイベントが発生したときに、登録されたコードを実行します（例: S3にファイルがアップロードされたら画像をリサイズ）。
  2. **サーバーレス**: サーバーを用意する必要がなく、AWSが自動でリソースを管理。
  3. **短時間の処理**: 最大15分の処理を実行。

#### **ユースケース**
- ファイル処理（画像のリサイズ、動画の変換）。
- APIのバックエンドロジック。
- 定期的なバッチ処理。

## **Terraformとは？**
Terraformは、**インフラをコードとして管理するツール（IaC: Infrastructure as Code）**。

- **目的**: クラウドリソース（サーバー、データベース、ネットワークなど）の作成、更新、削除をコードで管理する。
- **特徴**:
  1. **インフラ管理**: AWS、GCP、Azure、オンプレミスなどのインフラを統一されたコードで管理可能。
  2. **状態管理**: 作成済みのリソースを追跡し、変更や削除を容易に管理。
  3. **宣言的アプローチ**: 「この状態にしたい」というゴールを記述し、Terraformがその状態にする。

#### **ユースケース**
- AWSリソース（EC2、RDS、S3など）のセットアップ。
- マルチクラウド環境の一括管理。
- インフラ環境のバージョン管理。

## **AWS LambdaとTerraformの主な違い**

| **項目**                | **AWS Lambda**                              | **Terraform**                              |
|-------------------------|--------------------------------------------|-------------------------------------------|
| **目的**                | イベント駆動でコードを実行                  | クラウドインフラのコード化と管理            |
| **対象**                | プログラムロジック（Python、Node.jsなど）    | AWSリソースやクラウドインフラ全般           |
| **利用場面**            | 短時間の処理やAPIのバックエンド              | サーバー、ネットワーク、サービスのセットアップ |
| **操作の種類**          | 関数の実行（処理）                          | リソースの作成、変更、削除                  |
| **スコープ**            | アプリケーションレベル                       | インフラ全体                                |
| **コードの役割**        | 実際の処理ロジック                          | インフラ状態の宣言                          |

## **具体的な例**

#### **AWS Lambdaの役割**
- **シナリオ**: S3に画像がアップロードされたら、その画像をリサイズする。
- **Lambdaの動作**:
  1. S3にアップロードイベントが発生。
  2. Lambdaがトリガーされ、リサイズ処理を実行。
  3. リサイズされた画像を別のS3バケットに保存。

#### **Terraformの役割**
- **シナリオ**: S3バケットを作成し、そのバケットをLambdaで利用するよう設定する。
- **Terraformの動作**:
  1. S3バケットの構造をコードで記述。
  2. TerraformがAWSにAPIリクエストを送り、S3バケットを作成。
  3. バケットが作成され、Lambdaと連携するための設定が完了。


## **AWS LambdaとTerraformの補完的な使い方**
これら2つのツールは対立するものではなく、**補完的なもの**。

1. **Terraformでインフラを構築**
   - Lambda関数、S3バケット、API Gatewayをコードでセットアップ。
   - 必要なAWSリソースを自動的に作成。

2. **Lambdaでロジックを実行**
   - Terraformで構築したリソースを活用し、Lambdaが実際の処理（例: 画像リサイズ、APIレスポンス生成）を行う。

## 感想
一年前に先輩エンジニアがテラフォームを使っていたのを見ていたので、違いについて気になったからすっきりした。
エラー対処記録: Unclosed client session client_session: <aiohttp.client.ClientSession object at 0x000001FBD4006510>

# 背景

Azure Service を使う script をつくろうとした際に起きたエラー。

エラーだけ見て、aiohttp だろうと思って失敗した記録

```powershell: error
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x000001FBD4006510>
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x000001FBD3FCC2C0>
```

# 結論

非同期k Clients は終了させる必要があったという話。

```python: clients.close
async def close(self):
    await self.cosmos_client.close()
    await self.search_client.close()
```

# 詳細

同期 clients なら、close() は不要だが、
非同期 clients は、close() が必要って話

同期⇒非同期へと切り替えると色々違ってて失敗しますね。

```python: async CosmosClient.close()
async def close(self) -> None:
    """Close this instance of CosmosClient."""
    await self.__aexit__()
```


# あとがき

エラーだけ見ると、aiohttp 使ってるところを探しちゃって少しはまりますね・・ :sweat: