OmniAICreator/Qiita-1.07M huggingface dataset:
AWS リソースをタグ名で抽出する

## はじめに

皆さんは AWS リソースにタグをつけていますでしょうか？
タグをつけることで管理がしやすくなるため、複数のワークロードや機能を同一の AWS アカウントにデプロイする際は、タグをつけているのではないでしょうか。

この記事では、**「"Project: X"というタグがついたリソースを抽出して、今！」** と言われた時の手順を紹介します。

## AWS Resource Groupsについて
[AWS Resource Groups](https://docs.aws.amazon.com/ja_jp/ARG/latest/userguide/resource-groups.html) はタグを管理するサービスです。
タグでのリソース抽出や、タグの一括付与などを行えます。

## 事前準備
東京リージョンと大阪リージョンにテスト用のLambda関数を作成します。
タグには `Project: X` を付与します。

(東京リージョン: ap-northeast-1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/f0e68d7d-187a-4f0c-87b4-2ecf502ed607.png)

(大阪リージョン: ap-northeast-3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/e2bd8df1-5338-418e-9b4c-2e10fa877372.png)

## AWS Resource Groupsでのタグ抽出
AWS Resource Groupsのページを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/ba8aafb1-5160-4f7c-b2b3-b6f7031304be.png)

ここで、**リソースグループの作成** か **タグエディタ** を選びます。
- **リソースグループの作成** : 検索条件をリソースグループとして保存可能。同じ条件で何度も確認する場合に有用。ただし**同一リージョンのみ検索可能** 。 
- **タグエディタ** : 検索条件を保存できないが、**クロスリージョンでも検索可能** 。

### リソースグループの作成

リソースグループの作成 > タグベース で条件を入れていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/fa48b52a-92d4-4128-82c8-3335e1b58f8d.png)

「グループリソースをプレビュー」リンクを押すと、指定したタグのついたリソースが表示されます。ただし、同一リージョンのリソースのみ表示されます。

(東京リージョンでの実行例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/06326c1d-700a-484b-af23-85565f34c50a.png)

このままグループ名を入力して登録すると、次回以降は検索条件を設定せずにリソースを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/1f34d125-7557-48fc-be63-a357e44a7af9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/68cab3a2-b76a-4665-8285-5036ea067407.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/bd0cd8de-1062-4e5d-a50f-e687282c750b.png)


### タグエディタ

次に、タグエディタでクロスリージョンの検索をします。

タグエディタ > All regions > All supported resourece types を選びます。
タグに `Project: X` を指定して、**リソースを検索** リンクを押します。
すると、「リソースの検索結果」欄に先ほど作成した、東京リージョンと大阪リージョンの関数が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/b71ddaff-25eb-452f-a132-998ae1d7dd96.png)

また、表示されたリソースのチェックボックスにチェックを入れ、**選択したリソースのタグを管理する** リンクを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/710b85cc-d517-4ae2-bd44-aa0a2f872fff.png)

次の画面では、`Project: X` の値を一律変更したり、新しいタグを一律で付与することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/b94f552f-f28e-4d91-a537-43931b58c7ad.png)

(Lambda関数)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217144/1d083894-c499-4fd5-b439-8e44f46888a8.png)

以上です。
man clamdscan 日本語訳

# Clamd client(1)

Clam AntiVirus

## NAME

clamdscan - ファイルとディレクトリに対して
Clam AntiVirus デーモンを使用してウィルススキャンを実行します。

## SYNOPSIS

```bash
clamdscan [options] [file/directory]
```

## DESCRIPTION

``clamdscan`` は ``clamscan`` の代わりに使用される clamd クライアントです。
``clamdscan`` は ``clamscan`` に実装されている全てのオプションを受付けます。
しかし ``clamdscan`` のスキャン機能は clamd に依存する為、
大半のオプションは無視されます。

## OPTIONS

### -h, --help

ヘルプ情報を表示して終了します。

### -V, --version

バージョン番号を出力して終了します。

### -v, --verbose

詳細を表示します。

### --quiet

エラーメッセージのみを出力します。

### --stdout

標準出力(stdout)へ全てのメッセージ(libclamav の出力は除く)を出力します。

### --config-file=FILE

clamd の設定を ``FILE`` から読み込みます。

### -l FILE, --log=FILE

スキャン結果を ``FILE`` へ保存します。

### -f FILE, --file-list=FILE

``FILE`` に列記されたファイルを一つ一つスキャンします。

### -p A[:I], --ping A[:I]

clamd へ送信された ``ping`` へ ``A`` 回まで応答します。
応答間隔 ``I`` の指定は任意です。

### -w, --wait

clamd の始動を 30 秒待機します。
オプションで ``ping`` と一緒に使用して、
clamd をチェックする試行回数 ``A`` と
応答間隔 ``I`` を設定します。

### -m, --multiscan

マルチスキャンモードでは clamd はスレッドを並行使用して
ディレクトリの内容をスキャンします。
このオプションはマルチプロセッサーとマルチコアシステムにおいて特に有用です。
ユーザーがコマンドライン上で複数のファイルまたはディレクトリを指定した場合、
指定されたファイルまたはディレクトリはキューへ格納されて clamd へ個別に渡されます。
これは単一のファイルは常に単一のスレッドでスキャンされることを意味します。
同様に ``clamdscan`` は他のディレクトリをスキャンするリクエストが送信される前に、
clamd がディレクトリのスキャン(マルチスキャンモードで実行)を終えるまで待機します。
このオプションは [--fdpass](#--fdpass) と組み合わせて使用することができます。

### -z, --allmatch

マッチ後にスキャンを継続して
ファイル内で追加のマッチを実行します。

### --remove

感染したファイルを除去します。

### --move=DIRECTORY

感染したファイルを ``DIRECTORY`` へ移動します。

### --copy=DIRECTORY

感染したファイルを ``DIRECTORY`` へコピーします。

### --no-summary

スキャン終了時にサマリーを表示しなくなります。

### --reload

clamd へウィルスデータベースの再読込を要求します。

### --allmatch

一致を検出後、スキャンを継続します

### -i, --infected

感染したファイルのみを出力します。

### --fdpass

ファイル記述子のパーミッションを clamd へ渡します。
これは clamd が別のユーザーとして実行されている場合に、
ファイルを clamd にストリーミングするよりも
高速であるため便利です。
clamd がローカル(unix)ソケット経由で接続されている場合に限り使用可能です。

### --stream

clamd へファイルストリーミングを強制します。
ストリーミングが要求される場合は
``clamdscan`` が自動的に検知する為、
一般的には不要なオプションです。
このオプションはデバッグと試験の為だけに存在しています。
他のケースでは [--fdpass](#--fdpass) が優先されます。

## EXAMPLES

(0) 一つのファイルをスキャンします:

```bash
clamdscan file
```

(1) 現在の作業ディレクトリをスキャンします:

```bash
clamdscan
```

(2) ``/home`` 配下の全ファイルをスキャンします:

```bash
clamdscan /home
```

(3) 異なるユーザーとして clamd が実行されている場合にファイルをスキャンします:

```bash
clamdscan --fdpass ~/downloads
```

(4) 標準入力からスキャンします:

```bash
clamdscan - < file_to_scan;
cat file_to_scan | clamdscan -;
```

## RETURN CODES

* 0 : ウィルス検出無し

* 1 : ウィルス検出有り

* 2 : エラー発生

## SEE ALSO

* [clamd(8)](https://qiita.com/JhonnyBravo/items/353e597ab73aee6d0aee)
* clamd.conf(5)
* [clamscan(1)](https://qiita.com/JhonnyBravo/items/69571e1f282cdeae5676)
ZFS構築メモ


新規ミラーディスク構築
```bash
sudo zpool create pool0 mirror -f /dev/sdc /dev/sdd
sudo zfs create pool0/share
sudo zfs set mountpoint=/share pool0/share
```


ディスクを除外する

```bash
sudo zpool detach pool0 /dev/sdd
```

ディスクを再度追加する。

```bash
sudo zpool attach pool0 /dev/sdc /dev/sdd
```
プログラミング言語における各分野の代表的言語について

「プログラミング〈新〉作法 これからプログラムを書く人のために」という書籍を最近見たのですが、著者が紹介しているプログラミング言語の選び方が秀逸だった（エグかった）ので、紹介します。
入門：C言語
オブジェクト指向：Java
関数型：Elixir
高性能と安全性：Rust
スクリプト言語：Python
Web：Java/TypeScript

著者の個人の勝手な選択基準かもしれませんが、なかなかシビアな選択ではないかと思います。著者は、Dartなどのプログラミングの各特徴が与えられたときにどんなプログラミング言語なのかをイメージできることを目指して書籍を書いたとのことでした。

私の予想では未来は次のように徐々に入れ替わっていくと想像しています。
Java -> Scala
C -> Rust
Elixirそのまま
Pythonそのまま
JavaScript -> TypeScript

「[プログラミング〈新〉作法 これからプログラムを書く人のために](https://amzn.to/3DUu9h5)」荒木 雅弘
Blenderの画像シーケンスのコマ打ちを制御する

Blenderでは連番画像をアニメーションとして下絵に利用できます
ただし、通常ではフレームを1つ進める毎に連番画像のカウントを1つ進めるといった挙動になっていて
作画アニメのように任意のタイミングで次の画像に切り替えるようにはなっていません

連番画像のフレームの「オフセット」の値はキーフレームを打って制御可能なので
そちらを調整するスクリプトを作成してみました

![250031601.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/66a3df2d-03b8-4587-9b73-a096c895d0f4.gif)


```py
import bpy

def set_frame_offset(object_, frame_, offset_value):
    # 指定フレームで画像のフレームのオフセットを設定
    scene.frame_current = frame_
    object_.image_user.frame_offset = offset_value
    object_.image_user.keyframe_insert(data_path='frame_offset')

scene = bpy.context.scene
object_ = bpy.context.active_object
# 画像エンプティの場合
if object_.type == 'EMPTY' and object_.empty_display_type == 'IMAGE':
    image_ = object_.data
    if image_.source == 'SEQUENCE':
        frame_start = scene.frame_start
        object_.image_user.frame_duration = scene.frame_end +10
        # 開始位置での値
        scene.frame_current = frame_start
        set_frame_offset(object_, frame_start, 0)
        # マーカー位置で切り替わるようにキーフレーム設定
        for i_ in range(len(scene.timeline_markers)):
            marker_frame = scene.timeline_markers[i_].frame
            offset_value = i_ -marker_frame
            set_frame_offset(object_, marker_frame -1, offset_value +2)
            
            offset_value = i_ -marker_frame 
            set_frame_offset(object_, marker_frame, offset_value +2)
        # 終了位置での値
        frame_ = scene.frame_end
        offset_value = len(scene.timeline_markers) -frame_ +1 
        set_frame_offset(object_, frame_, offset_value)
```
使用しているのは Storyboarderを使って書き出した7枚の画像です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/9afb5141-cc55-4963-8be8-2edfcc8b8818.png)

今回は**画像エンプティ**で動作するようにしています
画像エンプティに画像を読み込んで　ソースを**連番画像**に設定しておいてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/83136546-c394-4f6e-abbd-6d56db6d838e.png)
Blenderではタイムライン上で **[M]** キーを押すことでマーカーを打つことができます
(キャプチャでF_52等の番号が書かれた△のアイコンのもの)
マーカー位置で次の連番画像のフレームに切り替わるようオフセット値を調整しています

切り替え位置のマーカーを設定したら　画像エンプティを選択した状態でスクリプトを実行してください

切り替えのタイミングを変更したい場合には　マーカーの位置を移動（△を選択してGキーで移動できます）
オフセット値に付けられたキーフレームを削除した上で　再度スクリプトを実行してください

何かの手助けになれば幸いです
AWS CDK Bootstrapのトラブルシューティング記録



## はじめに

UdemyのAWS Bedrockハンズオンコースで、CDKのブートストラップ実行中にいくつかの問題に遭遇したので、解決までの過程をメモとして残します。

こちらの動画です。
[【AWS】Amazon Bedrockによる生成AIウェブアプリ構築（RAG編）](https://www.udemy.com/course/awsamazon-bedrockairag/?couponCode=ST11MT170325G2)

## CDKとブートストラップについて

AWS CDK（Cloud Development Kit）は、プログラミング言語を使ってAWSリソースを定義できるフレームワークです。ブートストラップとは、CDKがAWSアカウントにデプロイするために必要な初期リソース（S3バケットやIAMロールなど）を作成するプロセスです。

## 発生した問題

以下のCDKコマンドを実行した際にエラーが発生：

```bash
npx -w packages/cdk cdk bootstrap
```

注：npxを使用しているのは、プロジェクトローカルにインストールされたCDKを実行するためです。-wオプションは、モノレポ構成でのワークスペース指定に使用します。

最初のエラーメッセージ：

```bash
Unable to resolve AWS account to use. It must be either configured when you define your CDK Stack, or through the environment
```

修正後の2番目のエラーメッセージ：

```bash
Error: Need to perform AWS calls for account [ACCOUNT_ID], but no credentials have been configured
```

## IAM設定の疑い

エラーメッセージから、以下の点でIAM設定に問題があると推測：

- アカウントIDが認識されていない → 認証情報の設定が不完全
- AWS CLIの設定が見つからない → アクセスキーが未設定または無効
- EC2インスタンスからの実行時の特殊な権限要件の可能性

## 試行錯誤のプロセス

### 1. 初期状態の確認

```bash
aws configure list
Name                    Value             Type    Location
----                    -----             ----    --------
profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
region           ap-northeast-1             imds
```

### 2. 環境変数の設定

AWSアカウントとリージョンを環境変数として設定：

```bash
export CDK_DEFAULT_ACCOUNT=[AWSアカウントID]
export CDK_DEFAULT_REGION=ap-northeast-1
```

### 3. AWS CLIの認証情報設定

新しいアクセスキーを生成し、AWS CLIの設定を実施：

```bash
aws configure
AWS Access Key ID: [新規生成したアクセスキー]
AWS Secret Access Key: [新規生成したシークレットキー]
Default region name: ap-northeast-1
Default output format: json
```

## 解決のポイント

- EC2用の新しいアクセスキーを作成することで解決
- 既存のCLI用アクセスキーとは別に、EC2用のキーを使用するのがベストプラクティス
- 環境変数とAWS認証情報の両方を正しく設定することが重要

## 成功時の出力

最終的に以下のメッセージが表示され、ブートストラップが完了：

```bash
✅ Environment aws://[ACCOUNT_ID]/ap-northeast-1 bootstrapped.
```

## 参考情報
EC2の作成はこちらの動画も参考にしました。（いつもお世話になっております、、、！！！）
[【AWS 入門】EC2とDockerでHello Worldしよう](https://www.youtube.com/watch?v=HvrIPQ77xRY)
【メモ】Githubのユーザー名を変えた時にやったこと

# Githubのユーザー名の変更方法

1. 左上のアイコンをクリック＞Settings
1. 1.Account＞Change username
![スクリーンショット 2025-03-17 0.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/2208dd02-7e05-4ac5-a5b4-7ef61976478b.png)

3. 警告を読んで進む
![スクリーンショット 2025-03-17 0.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/7866649d-2b3e-4b28-9b19-60e771a493f8.png)
:::note warn
本当にユーザー名を変更しますか?
これを読まないと、予期せぬ悪いことが起こります!
- 古いプロフィール ページのリダイレクトは設定されません。
- Pages サイトのリダイレクトは設定されません。
- リポジトリ (Web および Git アクセス) のリダイレクトを作成します。
- 名前の変更が完了するまでに数分かかる場合があります。
:::

4. ユーザー名を入力して「Change my username」を選択


# VSCode側でやったこと
### 今後のコミットの名前を変更する方法
``` 
git config --global --list
 ```
user.nameとuser.emailを確認

修正したければ
```
git config --global user.name "新しい名前"
git config --global user.email "新しいメールアドレス"
 ```

※過去全てを修正する方法、一部コミットを修正する方法もあったが今回は不要なのでスルー。


https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-user-account-settings/changing-your-github-username#changing-your-username
【React】入力した全角数字を半角数字に変換する

Reactで、入力した全角数字を半角数字に変換する処理を実装したい。
数字のみの入力を受け付けるパターンとしてよくあるのが、郵便番号の入力や電話番号の入力かと思います。
下記のように実装してみました。


```React
const Example: React.FC = () => {
  const [zipCode, setZipCode] = useState('');

  // 全角数字は半角へ、数字以外は除去
  const convertNumber = (value) =>
    value.replace(/[^0-9０-９]/g, '').replace(/[０-９]/g, (c) =>
      String.fromCharCode(c.charCodeAt(0) - 0xfee0)
    );

  return (
    <>
      <label>
      <input
        type="text"
        value={zipCode}
        placeholder="郵便番号を入力"
        onChange={(e) => setZipCode(convertNumber(e.target.value))}
      />
      </label>
    </>
  );
}

export default Example;
```

## Safariでのみ上手く動かない
上記の内容で動作確認してみたところ、Chrome等では問題なく動作しましたが、
Safariでのみ数字が重複して入力される現象が発生しました。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952495/7f894859-36c8-4718-9e28-84da4af84f90.gif)


画像の現象は、`全角で「１２３」と入力 -> Enter(確定)を押した`挙動になります。
調べてみましたが、似たような事象を解説しているのは下記の記事しか見当たりませんでした。
[IME（全角）入力におけるjsイベント現状調査](https://qiita.com/darai0512/items/fac4f166c23bf2075deb)

## onBlurを使う

onBlurは、フォーカスが離れた時に実行される処理となります。

元々入力時点で変換される想定で作っていましたが、
下記の記事も参考にさせていただき、結果的にonBlurで変換処理を実行させる方がいいかもと思い至りました。
[入力直後に変換を入れる場合のUX](https://qiita.com/jkr_2255/items/f1c035fe6dee57518efe)

最終的に下記の形に修正しました。

```React
const Example: React.FC = () => {
  const [zipCode, setZipCode] = useState('');

  // 全角数字は半角へ、数字以外は除去
  const convertNumber = (value) =>
    value.replace(/[^0-9０-９]/g, '').replace(/[０-９]/g, (c) =>
      String.fromCharCode(c.charCodeAt(0) - 0xfee0)
    );

  return (
    <>
      <label>
      <input
        type="text"
        value={zipCode}
        placeholder="郵便番号を入力"
        onChange={(e) => setZipCode(e.target.value)}
        onBlur={() => setZipCode(convertNumber(zipCode))}
      />
      </label>
    </>
  );
}

export default Example;
```

これで、inputからフォーカスが離れた際に全角数字を半角に、数字以外の文字は除去される挙動を実装することができました。
ChromeでもSafariでもfirefoxでも、きちんと動作していることを確認しました。
Python3 で FizzBuzz (sqllite3利用) Part2

前の記事 [Python3 で FizzBuzz (sqllite3利用)](https://qiita.com/KAZAMAI_NaruTo/items/d278a084045fe452caa9) の SQL 、CASE文が美しくないというわけで新版作成。

Python3.13.1 利用。sqlite3.sqlite_version は 3.45.3 なので Window関数 row_number() を利用。

```FizzBuzz03.py
import sqlite3

SQL = '''
WITH NB(n) AS (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(0))
SELECT
    GROUP_CONCAT(
        COALESCE(TT.column2 || TF.column2,TT.column2, TF.column2, CAST(n AS TEXT))
        , CHAR(13, 10))
    FROM
        (
	        SELECT
	            ROW_NUMBER() OVER (
	                ORDER BY
	                    NB1.n
	                    ,NB2.n
	            ) n
	        FROM
	            NB AS NB1
	            , NB AS NB2
	    ) N
        LEFT OUTER JOIN (
            VALUES(3,'FIZZ')
        ) TT
        ON N.n % TT.column1 = 0
        LEFT OUTER JOIN (
            VALUES(5,'BUZZ')
        ) TF
        ON N.n % TF.column1 = 0
;
'''

def main():
    with sqlite3.connect(':memory:') as conn:
        print(conn.execute(SQL).fetchall()[0][0])

if __name__ == '__main__':
    main()
```
コードレビューでためになったアドバイス

最近エンジニアの開発アルバイトを始めました．
そこで受けたコードレビューがとても参考になったのでメモしておこうと思います．

取り組んでたタスクはフロントの改修です．
モーダル表示したときに表が現れるのですが，5行しかないので全項目表示できるようにしたとのことでした．全項目表示すればいいのなら元々あったスクロールバーを削除し，CSSで表の高さを100%にすればいいのではと思って改修していました．

すると次にリリースされるバージョンで，項目を追加できるようになるとのこと．

項目が増えると10行くらいになる可能性もあるけど，全項目表示する方針だったのでスクロールバーは消したままで改修したコードのレビューを依頼しました．

ここからが割と参考になりました．
項目が増えるようになっても常識的に〇行くらいまでしか増えないだろう，それなら全項目表示で問題ないと思っていました．しかし項目を増やせるようになった以上，ユーザーは何をするか分からない．性善説な開発はしてはいけないと言われました．

こういう時は0か無限かで考えた方が良いらしいです．
項目を追加できるようにした以上，ユーザーは何をしてくるか分からないので，1万行項目が増えても対応できるようなシステム設計にしておく．
もしくは，初めから表示数に制限をかける．例えば10行まで表示できて，それを超えたらページネーションを入れるといった具合です．

今まで個人で開発してきたものは趣味程度のものが多く，ユーザーは自分自身ということが多かったです．作った人がそのシステムを触ると，こういう仕様だからで済ませることも多いです．しかし今開発しているものは実際にお客様が使っているシステムになります．そんなことは有り得ないということを痛感させられました．

にしてもお客様が使っているシステム改修ってやりがいがありますよね．
Unity Visual Scripting 覚書

自作スクリプト（コンポーネント）をVisual Scriptingから参照するには
[こちらの記事に（渋谷ほととぎす通信さん）](https://shibuya24.info/entry/unity-visualscripting-graph-to-script)

要Regenerate Nodes
![IMG_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32304/c9ac031b-f8ab-45d0-8379-4b76f9246168.png)

この辺りの詳しいドキュメントはこちら
https://docs.unity3d.com/ja/Packages/com.unity.visualscripting@1.8/manual/vs-add-remove-node-library.html
pythonのlogging機能を試してみた

## 背景
外部APIを他チームに公開する必要があり（しょうきｂ）、pythonのlogging機能をAIに相談しながら実装してみた

## ディレクトリ構造
my_library/
    __init__.py（パッケージ認識させるためだけの空ファイル）
    main.py
    math_operations.py
app.py

## 学んだポイント
- ライブラリではloggerを使用することで、rootのロガーを汚さないようにする
⇒ 可読性: ログメッセージから、どのモジュールで問題が発生したかを簡単に特定可能
- NullHandler の使用: 必ず NullHandler を追加して、デフォルトのログ設定がない場合にエラーが発生しないようにする
⇒ ライブラリのコードを変更せずに、ログ設定を変更可能
- アプリケーション側の設定: ログ出力の設定はアプリケーション側に委ね、ライブラリ側では行わない
⇒ 柔軟性: アプリケーション開発者は、自分の要件に合わせてログ出力を自由に設定可能
- ハンドラによってログレベルを変更可能。コンソール出力のハンドラにはエラーレベルだけ出すなど
- ルートロガーはすべてのロガーの親となるので、ライブラリのロガーはルートロガーへの設定が自動的に反映される
- アプリ側でlogger = logging.getLogger(name)して、ハンドラなど設定した場合は、アプリ側のロガーと、ライブラリーのロガーは異なる階層に位置するため、設定が引き継がれない
- パッケージ内のロガーは親子関係となるので設定が引き継がれる

## 実コード
~~~python3
# app.py
import logging
import my_library.main  # ライブラリをインポート

# ロガーの設定
logger = logging.getLogger('')  # ルートロガーを取得
logger.setLevel(logging.DEBUG)  # ログレベルを設定

# ハンドラーの作成（コンソールに出力）
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG) #ハンドラのログレベルの設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

# ファイルハンドラを作成し、ログをファイルに出力する
file_handler = logging.FileHandler("my_app.log")
file_handler.setLevel(logging.DEBUG) #ハンドラのログレベルの設定
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

logger = logging.getLogger(__name__)

# 計算の実行
logger.info("Starting calculation")
result1 = my_library.main.calculate("add", 5, 3)
print(f"Result of addition: {result1}")

result2 = my_library.main.calculate("subtract", 10, 4)
print(f"Result of subtraction: {result2}")

result3 = my_library.main.calculate("multiply", 2, 6) #無効なoperation
print(f"Result of multiply: {result3}")
~~~

~~~python3
# my_library/main.py
import logging
from . import math_operations  # 相対インポート

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

# 外部関数として公開
def calculate(operation, x, y):
    """指定された演算を実行する"""
    logger.debug(f"Performing operation: {operation}")
    if operation == "add":
        result = math_operations.add(x, y)
    elif operation == "subtract":
        result = math_operations.subtract(x, y)
    else:
        logger.error(f"Invalid operation: {operation}")
        return None
    logger.info(f"Calculation completed. Result: {result}")
    return result
~~~

~~~python3
# my_library/math_operations.py
import logging

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

def add(x, y):
    """2つの数を足し合わせる"""
    logger.debug(f"Adding {x} and {y}")
    result = x + y
    logger.info(f"Result of {x} + {y} is {result}")
    return result

def subtract(x, y):
    """2つの数を引き算する"""
    logger.debug(f"Subtracting {y} from {x}")
    result = x - y
    logger.info(f"Result of {x} - {y} is {result}")
    return result
~~~
デブのたしなみファットモデル、スリムコントローラーの原則

ファットモデル、スリムコントローラー原則をまとめてみる。

基本はロジックの中心を**モデル**に置くことで保守性や拡張性を高める。

**トレイト**を活用することでモデルをぽっちゃり程度に保つ。

## MVCアーキテクチャの基礎

MVCパターンは  
- **モデル**：データ管理とビジネスロジックの中心  
- **ビュー**：ユーザーへ情報を表示  
- **コントローラー**：ユーザーからの入力を受け、モデルとビューの調整を担当  

この分業体制によって、各コンポーネントが明確な役割がある。

## ファットモデル、スリムコントローラーとは

**ビジネスロジックやデータ処理をモデル側に集約**、
コントローラーには最低限の処理だけを残すというもの。

※最近慣れてきてなんでもコントローラーにコードを書いていたら**スリムコントローラーを意識してください**と指摘いただき知りました。


- **ファットモデル**：
    - データ検証
    - ビジネスルール
    - 複雑なクエリ
    - 外部サービスとの連携などの重厚な処理を担当  
- **スリムコントローラー**：
    - リクエストの受け渡し
    - モデル・ビューとの連携

これを徹底することでコードの再利用性が高まり、テストもしやすい構造になる。

## トレイトでさらにスマートに

**トレイト**を利用することでモデルの肥大化を防ぐ。

- **コードの再利用性向上**：
    - 複数のモデル間で共通する処理をトレイトに切り出すことで、重複コードを削減。 
- **責任の明確化**：
    - 補助的な機能はトレイトに委譲する
        - モデルの役割が明確に。  
- **テストの効率化**：
    - トレイトごとに独立したテストが可能


## この原則が選ばれる理由

### 保守性・拡張性の向上
- **役割分担の明確化**：各コンポーネントが専念する処理を持つことでコード全体の理解と変更を簡単にする。

- **モジュール化**：トレイトを活用することで、機能ごとの分割が明確になり、システム全体の拡張がスムーズになる。

### 再利用性の促進
- **共通ロジックの一元管理**：同じ処理を複数のモデルで使い回す際、トレイトを利用すればコードの重複がなくなる。管理が一元化され改修が簡単になる。

### チーム開発でのメリット
- **作業の分担が容易**：フロントエンドとバックエンド、または各専門領域の開発者間で明確な役割分担ができる。効率的な開発体制が整う。


## 注意点

### ぽっちゃり系で抑えるモデルの肥大化対策
ぽっちゃり系モデルを目指す際、**モデルが過剰に太る**ことを防ぐため、対策が重要。
- **サービスオブジェクトやトレイトの適切な利用**：
    - 必要な処理をモデル内にすべて持たせるのではなく役割ごとに分割する。  
- **定期的なリファクタリング**：
    - コードが複雑になりすぎた場合は責務を再評価して適切な分割を行う。

意識しながら来週も頑張っていきましょう！
ITパスポート試験 合格記

## はじめに
ITパスポート試験に合格したので、合格体験記として記事にする

## 結果
| 評価項目 | 評価点 |
|----------|--------|
| 総合評価点 | 680点 |
| ストラテジ系 | 620点 |
| マネジメント系 | 755点 |
| テクノロジ系 | 625点 |

## 学習教材と学習期間

### 教材
- **ITパスポート試験過去問道場**
[ITパスポート試験ドットコム](https://www.itpassportsiken.com/ipkakomon.php)
  - 過去2年分の過去問を50問くらい解いた

### 学習期間
- 1週間くらい

## 学習内容
基本は過去問道場で過去問を解き、解説を読んで理解を深めた。
テクノロジ系は業務である程度触れていることもあり、ストラテジやマネジメントを中心に学習した。

## 試験本番
- 解くのに時間がかかりそうな計算問題などはとりあえず後回しで、ぱっと回答できそうな問題から解いた。余った時間で計算問題や苦手な分野を解くと心に余裕ができて◎
- 序盤で意味を問われた単語が後半の問題文に登場し文脈からヒントを得られる問題もあったので、わからない問題は見直しフラグをつけて後から再確認するのがよい

## 感想
- ほとんど学習時間を確保できず不安だったが、エンジニアとしての実務経験が数年あったので持っている知識で解けた問題が多かった。
- 合格ラインが低いこともあり、思っていたよりも取得しやすかった。
- テクノロジ系の問題の中でも、内容を詳細に理解できていない項目があったので、復習するいい機会になった。
- 「ITパスポートは意味ない」などと言われるのをよく目にするが、ITに関する基礎知識を効率よく学べるので、おすすめ
AWSが展開するコンピューティングカテゴリのサービスの一覧

## はじめに
AWSが展開するコンピューティングカテゴリのサービスの一覧についてまとめてみました。

## コンピューティングカテゴリ
　アプリケーションやコンピューティング処理を実行するためのサーバ・コンテナ環境を提供するサービス群。様々なユースケースやワークロードに応じたコンピューティングサービスが提供されているので、種類や適した用途をおさえておきたい。

## AWS AppRunner
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/9cd12a2d-c840-4e72-9190-f38bfc09d668.png)

コンテナで構成されるWebアプリケーションを簡単にデプロイできるサービス。AutoScalingやロードバランシング設定、証明書管理などが、自動で管理される。

## AWS Batch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/631d077f-16a5-4edc-85b5-89a5ab24a291.png)

Dockerコンテナを利用したバッチ実行サービス。

## Amazon EC2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/cb3087cd-116b-4dc0-b607-91f78cdb614f.png)

任意のOSで仮想的にサーバ環境を構築・利用できるサービス。EC2は「Elastic Compute Cloud」の意味。

## Amazon EC2 Image Builder
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/25e9cbc4-a5d5-4a7d-bc30-7eefe97f7a84.png)

EC2で動作するOSのアップデートを最新化するサービス。

## AWS Elastic Beanstalk
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/91f0921f-f4dd-4744-8cfc-7f6e0a55b68f.png)

典型的なアプリケーション環境を、ウィザード形式で構築し、自動でデプロイするサービス。

## AWS EMP for Windows Server

サポートが切れて動作しなくなったWindowsアプリケーションを新しいWindows Serverへ移行するサービス。EMPは「End-of-Support Migration Program」の略。

## AWS Lambda
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/24707dff-8ca1-47ea-8078-8b80f6cc14e8.png)

定義したアプリケーションコードを、サーバなしで実行するサービス。

## AWS Lightsail
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/31507cac-d608-47b8-8b31-754ad9dc788e.png)

WordPressなどのWebサイトやGitLab、Redmineなどのツールを、メモリやCPU、ストレージ別に固定費でまとめたパッケージでインスタンス構築するサービス。

## AWS Local Zones
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/dd658204-fabb-4ea7-957d-526e9e75dd3b.png)

AWSリソースの配置で、リージョン内で地理的により細かい範囲のゾーンを指定可能にするサービス。

## AWS Outposts
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/b1ca3d77-e0d7-436d-a360-3bf614c43b3f.png)

オンプレミス環境に、AWSのAPIが実行可能なハードウェアを導入するサービス。

## AWS Serverless Application Repository
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/1da3adb7-3498-4f6b-873f-b79357bc0fe5.png)

サーバーレスアプリケーションを共有・公開するためのサービス。

## AWS Serverless Application Model
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/c640a5c5-4835-4083-bedd-7dc9d36108c1.png)

サーバーレスアプリケーションを簡単に実装するためのCLI、およびオープンソースフレームワーク。CloudFormationを拡張したSAMテンプレートを作成することで、APIGatewayやLambda、DynamoDBなどの環境を簡易構築できる。

## AWS Wavelength
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/f46c22fb-c3cd-4055-8ece-228da2948381.png)

5Gネットワークを展開する電気通信サービス事業者のデータセンタ内にAWSのコンピューティング・ストレージインフラを導入し、高速なアプリケーション環境を提供するサービス。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解) 単行本（ソフトカバー） – 2022/8/23
川畑光平 (著), 菊地貴彰 (著), 真中俊輝 (著)
p.46-47
【Mac】コマンドで外観モードを切り替える方法

以下のコマンドを実行すると外観モードを切り替えられます。

```terminal
osascript -e 'tell application "System Events" to tell appearance preferences to set dark mode to not dark mode'
```

上記のコマンドは次のAppleScriptを実行します。

```applescript
tell application "System Events"
	tell appearance preferences
		set dark mode to not dark mode
	end tell	
end tell
```
コンピュータサイエンス学び直し -プログラムについて-

# 1. はじめに
エンジニアとして3年が経過しようとしている中、技術を使ってより高度な問題解決をしていくためには、フレームワークや言語に依存しない基礎となる知識が必要だと感じたため、CSを勉強し直しています。
その学習内容を備忘録として発信します。
今回は**プログラム**についてです。

# 2. プログラムとは

プログラムとは、コンピュータに対する「命令」と「データ」の集合体です。コンピュータはこの「命令」と「データ」を解釈して定められた処理を実行します。

# 3. プログラムが実行されるまで

プログラムを実行するには大きく分けて、「コンパイラを使った実行」と「インタプリタを使った実行」の2つの分けられます。

## **コンパイラとインタプリタの違い**

| 項目 | コンパイラ | インタプリタ |
| --- | --- | --- |
| **実行前の処理** | ソースコード全体を**事前に機械語（バイナリ）に変換**する | ソースコードを**1行ずつ解析・実行**する |
| **実行可能ファイル** | 生成される（バイナリファイルとして保存される） | 生成されない（逐次実行される） |
| **実行速度** | **高速**（事前にコンパイル済みのため） | **低速**（実行時に逐次解析するため） |
| **エラー検出** | コンパイル時に**すべてのエラーを検出** | 実行中に**エラーが発生した時点で停止** |
| **OSへの依存** | **高い**（コンパイルしたバイナリは特定のOS・CPU向けに作られる） | **低い**（インタプリタが異なるOSでもソースコードを解釈して実行できる） |
| **使用例** | C, C++ など | Python, JavaScript など |

## **OSへの依存の違い（分かりやすい説明）**

| 項目 | コンパイラ | インタプリタ |
| --- | --- | --- |
| **OSへの依存** | **高い**（コンパイルしたバイナリは特定のOS・CPU向けに作られる） | **低い**（インタプリタが異なるOSでもソースコードを解釈して実行できる） |

### **コンパイラの場合（OS依存が高い）**
コンパイラは、**特定のOSやCPU向け**に機械語へ変換します。そのため、**Windows用にコンパイルしたプログラムはLinuxでは動かない**ことが一般的です。  
→ もし異なるOSで動かしたい場合は、そのOS向けに**再コンパイル**する必要があります。

### **インタプリタの場合（OS依存が低い）**
インタプリタは、**OSごとに用意された実行環境（インタプリタ）を使って、ソースコードを解釈・実行**します。そのため、同じPythonやJavaScriptのスクリプトは、WindowsでもLinuxでもMacでも、**対応するインタプリタがあれば動作**します。  
→ **プログラムをそのまま別のOSで実行しやすい**のがメリットです。

## **具体例**
- **コンパイラ型のC言語プログラム**  
  - Windows用にコンパイルしたCプログラム（`.exe`）は、Linuxでは動かない。  
  - Linuxで動かすには、Linux用にコンパイルし直す必要がある。

- **インタプリタ型のPythonスクリプト**  
  - WindowsのPythonでも、MacのPythonでも、同じスクリプト（`.py`）を実行できる。  
  - ただし、インタプリタ（Python）がインストールされていないと実行できない。

つまり、**コンパイラ型のプログラムはOSやCPUに依存しやすく、インタプリタ型のプログラムはOSをまたいで動作しやすい**という違いがあります。
「エンジニアリングマネージャーの仕事」を読んで　その5

## はじめに
James Stanier著「エンジニアリングマネージャーの仕事」を読んで私が印象に残ったことをメモがわりに、少しずつアウトプットします。
~~今回で（強引に）ラスト！~~
予想以上に残ボリュームが大きいため、あと2回に分けます。。。


https://www.oreilly.co.jp/books/9784873119946/

## 3章 人間と関わる
### 3.1 上手なコミュニケーションをするには
- コミュニケーションの媒体
    - 会話
    - テキスト
    - 非言語（ジェスチャー・ボディランゲージ・表情・姿勢・声のトーンなど）
- 目的に応じた適切な媒体を選ぼう
    - 必要な行動を引き起こせるか？
- フラストレーションを次のコミュニケーションに持ち越さない
- 情報を発信する前に2回考える
    - コミュニケーション**したいとき**にするのではなく、**必要なとき**にする　★
- 会話は双方向で
- 適切性は効率性に勝る。相手を尊重して判断
- マネージャーの言葉は、個人の言葉ではなく組織図の上のポジションからの言葉として受け止められることを忘れずに
- 「言いにくいことをはっきりと言う」横軸と「心から相手を気にかける」縦軸の4象限
    - 大：大　徹底的な本音　👈ここを目指す
    - 大：小　イヤミな攻撃
    - 小：大　過剰な配慮
    - 小：小　摩擦の回避
- 避けるべきコミュニケーショの特徴
    - オーバーコミュニケーション
    - はぐらかし
    - ウケ狙い
    - 一貫性のなさ
    - 感情にとらわれる

### 3.2 委譲
- 悪い委譲
    - まったく委譲できてない
    - 丸投げ
- 説明責任は委譲できない　★
- 良い委譲は、タスクの実行責任を誰かに渡す一方で、説明責任を負い続けること
- 委譲でやるべきこと
    - スタッフにとってチャレンジになるくらい委譲すること　★
    - 重要性に応じて適切なコントロールを保持
- 委譲でやってはいけないこと
    - 丸投げ
    - 他の人のやり方が自分と同じであることを期待すること　★
    - 渡したタスクを取り返すこと　★

### 3.3 上司との連携
- 能動的に動こう
- パフォーマンスについて語ろう
    - 上司からみたパフォーマンスはなにか？
- 報告のためにサマリーを書く習慣

## 4章 1on1
- 毎週やろう
- 同じ時間、同じ場所が理想、プライベートエリアで
- アジェンダと記録を共有しよう
- コントラクティング：お互いが相手に期待することを出し合う
- 答えを出すのは時間が必要なもの。安易に提案しない。★
- 相手のためのミーティング、70%の時間は部下に話してもらう★
- 相手の頭の上に思考の吹き出しを浮かべておく
- 状況報告は必要最低限
- マネージャーはセラピストではない。センシティブな領域は適切な第三者へ

## 5章 その人に合った仕事とは
- それぞれが楽しめる方法で、それぞれに合った逆境にさらされるように
- 仕事に合った人を獲得するのではなく、人に合った仕事を獲得する
- マズローの五段階欲求
- 「アウトカムが明確である限りは」スタッフが選ぶ方法で問題に解決する自由を与える
- 「発達の最近接領域」学習者が支援ありでできるタスク
- 子供は自主的に学習する時がいちばん効果が高い
- 発達の最近接領域のタスクをスタッフに与える
- OSSの大聖堂モデル/バザールモデル
- 管理と安定によってモチベーションが高まる人もいれば、カオスや変化によってモチベーションが高まる人もいる　★
- 大聖堂を建設する人、バザールをぶらつく人　★

## 6章 1年でいちばん輝かしい季節
- 評価面談は双方向のプロセスであるべき、マネージャーはファシリテーター
- 面談でいちばん大きな恩恵を受けるのはハイパフォーマー
- 面談内容はサプライズであるべきでない。適切な情報は開示され、咀嚼され、理解されていること
- ピアフィードバックを3〜5名から収集する　★
- 悪い知らせを受け取った人は無視する→否定する→他人のせいにする→責任を引き受ける→解決策を見つけるという5つのステップを踏む
- よって事前展開し、面談時には「解決策を見つける」に注力できるようにする
- パフォーマンスのフィードバックと、お金（昇給）のフィードバックは分けるべき

## 7章 採用中！
- チーム全体のアウトプットを向上させるための選定
- 採用はプロジェクトマネジメントの鉄の三角形と似ている（品質・納期・コストの3つを同時には満たせない）
- カルチャーフィットは概念として不可能、そこで働く人が生み出し変えていくもの
- 自分と似た人を探そうとしてはいけない
- 求める役割については具体性をもたせる。エンジニアの仕事は抽象化するとほとんどの会社で同じになっちゃうので
- 要求スキルの長いリストを使わない。研究によると男性は60%満たせば応募したのに対し、女性は全て満たさないと応募しないという行動が報告されている
- 面接では全員が良い経験をすべき。面接したすべての人が、ここは働く場所として素晴らしいという印象をもって面接をあとにするのが理想
- ホワイトボードを使ったシステム設計の技術課題

## 8章 ゲームオーバー
- 人は必ず去るもの
- 良い退職・悪い退職
- ローパフォーマーへの最終手段、業務改善計画（PIP）

## 9章 友人を作り、人に影響を与えるには
- メンタリングやコーチングで「お返し」
- メンターシップマトリックス
    - 名前・役職・チーム・連絡先・求めるスキル・提供できるスキル
    - スキルマップより有効かも
- コーチングとは同僚とインタラクションするフレームワーク

## 10章 人間って難しい
- 思いやりと理解→気遣いと心配→恨み→反抗
- 傾聴と観察→消化→伝達
- 自律性・熟達・目的の重なるところがニンジン（動機づけ）となる
- ダニング=クルーガー効果とインポスター症候群

## 11章 プロジェクトって難しい
- プロジェクトの正念場では
    - チームの足並みをそろえる
    - 過剰なまでのコミュニケーション
    - 反応やフィードバックを求める
    - 頻繁にリリースする
    - 現実的でいる
    - 正面からリードする
- 正念場を脱したら
    - お祝いする
    - 技術的負債をきれいに片付ける
    - 自分用のプロジェクトの時間を取る
    - ふりかえる
    - 計画を立てて、気持ちを切り替える
- 自身の成功の犠牲者
    - 成功しているからこそ・・・複雑性が増し遅くなる
    - 人ではなく生産性にフォーカスをあてる
    - 会社が大きくなるにつれて一人当たりの生産性が下がる事実は、スタートアップの繁栄が証明している
    - 開発チームがスピードについて直接文句を言われないように
        - 隠れた複雑性を明らかにする
        - 常に進捗を示す
        - ソフトウェアを実用主義で開発する
    - プロジェクトの適切な妥協点をみつけるための３つのレバー「スコープ」「リソース」「時間」
type-challenges解いてみた 初級 43 - Exclude編


# 問題

````md

組み込みの型ユーティリティ`Exclude <T, U>`を使用せず、`U`に割り当て可能な型を`T`から除外する型を実装します。

例えば：

```ts
type Result = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'
```
````


























## 回答

```ts
type MyExclude<T, U> =  T extends U ? never : T;
```

### ちょっと解説

- 条件型
`T extends U ? X : Y`という形式で書かれ、`T` が `U` に割り当て可能であれば `X` を、そうでなければ `Y` を返します。


- `type MyExclude<T, U> = T extends U ? never : T;`
この場合では、`T` の各要素が `U` に割り当て可能かどうかをチェックしています。
`T` の要素が `U` に割り当て可能なら、その要素は `never` に置き換えられます。
`never` はユニオン型から除外されるため、結果 `U` に割り当て可能な部分が取り除かれるというわけです。
🚀 OpenAI Agents SDKでOllama, Claude, Geminiのモデルを利用する

# はじめに

OpenAIは2024年3月12日に[Agents SDK](https://github.com/openai/openai-agents-python)を発表しました。このSDKは対話型エージェントやタスク実行エージェントなど、エージェントベースのAIシステムを簡単に構築できるようにする非常に強力なフレームワークと言えます。

しかし、近年のLLM（大規模言語モデル）開発では、OpenAIのGPTシリーズのみならず、**ローカルで動作するOllama、コーディングに強いClaude、非常に長いコンテキストを持つGemini** など、多様な選択肢が求められています。ただし、これらのモデルはAPI仕様が異なるので、OpenAI Agents SDKで利用するには、インターフェースを合わせる必要があります。

そこで、今回、各モデルの違いを吸収するライブラリ `agents-sdk-models`を作成しました。`agents-sdk-models`をつかうことで簡単に **OpenAI Agents SDKの強力なエージェント構築の機能を多様なモデルで利用できるようになります。**　本記事では、`agents-sdk-models` の概要と活用方法について詳しく説明します。

---

# `agents-sdk-models` の特徴

- **統一API設計** → OpenAI Agents SDKに準拠し、シームレスな移行が可能
- **複数モデルの統合** → OpenAI (GPT-4o), Ollama, Claude, Gemini を同一のコードベースで使用

このライブラリを活用することで、異なるLLMを柔軟に組み合わせたエージェントの開発が可能となります。

---

# インストール方法

`pip` を使用して簡単にインストールできます。

```bash
pip install agents-sdk-models
```

構造化出力を含む拡張機能を使用する場合：

```bash
pip install agents-sdk-models[examples]
```

また、最新の開発版を利用したい場合はGitHubから直接インストールも可能です。

```bash
git clone https://github.com/kitfactory/agents-sdk-models.git
cd agents-sdk-models
pip install -e .
```

---

# 使い方

## OpenAI (GPT-4) を使う

まず、OpenAIの標準的なエージェントの使い方を紹介します。

```python
from agents import Agent, Runner
from agents_sdk_models import OpenAIModel

model = OpenAIModel(api_key="YOUR_OPENAI_API_KEY", model="gpt-4o")
agent = Agent(name="AIアシスタント", instructions="あなたは知識豊富なアシスタントです。", model=model)
runner = Runner(agent)
response = await runner.run("最新の技術トレンドを教えてください。")
print(response)
```

## Ollamaを使用する

```python
from agents import Agent, Runner
from agents_sdk_models import OllamaModel

model = OllamaModel(model="llama3")
agent = Agent(name="Ollamaアシスタント", instructions="あなたはローカルで動作する知識豊富なAIです。", model=model)
runner = Runner(agent)
response = await runner.run("Ollamaとは何ですか？")
print(response)
```

## Claude（Anthropic）を使用する

```python
from agents import Agent, Runner
from agents_sdk_models import AnthropicModel

model = AnthropicModel(api_key="YOUR_ANTHROPIC_API_KEY", model="claude-3")
agent = Agent(name="Claudeアシスタント", instructions="あなたは長文処理が得意なAIです。", model=model)
runner = Runner(agent)
response = await runner.run("Claudeの特徴を教えてください。")
print(response)
```

## Gemini（Google）を使用する

```python
from agents import Agent, Runner
from agents_sdk_models import GeminiModel

model = GeminiModel(api_key="YOUR_GEMINI_API_KEY", model="gemini-pro")
agent = Agent(name="Geminiアシスタント", instructions="あなたはGoogleの最新AI技術を活用したアシスタントです。", model=model)
runner = Runner(agent)
response = await runner.run("最新のAI技術について説明してください。")
print(response)
```

---

# まとめ

`agents-sdk-models` を活用することで、

✅ **OpenAIの標準エージェントの使い方を維持したまま、異なるLLMを統一的に扱える**
✅ **複数のモデルを簡単に切り替え、比較できる**
✅ **エージェント開発の自由度と拡張性が向上する**

ぜひ [GitHubリポジトリ](https://github.com/kitfactory/agents-sdk-models) をチェックして、実際に試してみてください。

このライブラリが皆さんの開発を加速し、より高度なエージェントの構築に貢献できることを願っています！
プログラム入門：オブジェクト指向を Python で学ぶ – カフェの注文システムを例に解説してみた

## はじめに

オブジェクト指向とは、「モノ(オブジェクト)を作り、それを組み合わせることでシステムを構築する考え方」です。

:::note info
**プログラムを現実世界の仕組みに近い形で設計できるので、わかりやすく、拡張しやすいコードが書けます。**
:::

今回は「カフェの注文システム」を例に、オブジェクト指向の概念をPythonで説明します。

---

## 1. クラスとオブジェクト

オブジェクト指向では、**「クラス」という設計図を作り、その設計図から「オブジェクト」**を生成します。

### カフェの例
- **クラス(設計図)** ：「コーヒー」のメニューを定義
- **オブジェクト(実体)** ：「ホットコーヒー(Mサイズ)」や「アイスカフェラテ(Lサイズ)」

```python
# コーヒーの設計図(クラス)
class Coffee:
    def __init__(self, name, size):
        self.name = name  # 名前
        self.size = size  # サイズ

    def order(self):
        print(f"{self.size}サイズの{self.name}を注文しました。")

# 「ホットコーヒー(M)」というオブジェクトを作る
coffee1 = Coffee("ホットコーヒー", "M")
coffee1.order()  # → Mサイズのホットコーヒーを注文しました。
```

 **「Coffee」クラスを作ることで、さまざまな種類のコーヒーを簡単に作成できる。**

---

## 2. カプセル化(データを守る仕組み)

「カプセル化」は、**データを外部から直接変更できないようにする**仕組みです。

```python
class Order:
    def __init__(self, drink):
        self.__drink = drink  # __ をつけると外部から直接アクセスできない

    def get_drink(self):
        return self.__drink  # データを取得するためのメソッド

# 注文を作成
order = Order("カフェラテ")
print("注文した飲み物:", order.get_drink())  # → 注文した飲み物: カフェラテ
```

 **注文データを直接変更できないようにして、安全なシステムを作れる。**

---

## 3. 継承(共通の機能をまとめる)

オブジェクト指向では、**「親クラス」の機能を「子クラス」**が受け継ぐことができます。
これを「継承」といいます。

### カフェの例
- **親クラス** → 「飲み物」
- **子クラス** → 「コーヒー」「紅茶」「ジュース」など

```python
# 親クラス(Drink)
class Drink:
    def __init__(self, name):
        self.name = name

# 子クラス(Coffee)
class Coffee(Drink):
    def __init__(self, name, bean_type):
        super().__init__(name)  # 親クラスの__init__を呼び出し
        self.bean_type = bean_type  # コーヒー特有の属性

    def describe(self):
        print(f"{self.name}（豆の種類: {self.bean_type}）")

# コーヒーのオブジェクトを作成
coffee = Coffee("カフェモカ", "エスプレッソ")
coffee.describe()  # → カフェモカ（豆の種類: エスプレッソ）
```

 **共通の機能を「親クラス」にまとめることで、無駄なコードを減らせる！**

---

## 4. ポリモーフィズム(共通の動作を統一)

「ポリモーフィズム」とは、**異なるオブジェクトでも同じ操作をできるようにすること**です。

```python
# インターフェース的な動作を持つ基底クラス
class Orderable:
    def order(self):
        raise NotImplementedError

# コーヒーのクラス
class Coffee(Orderable):
    def __init__(self, name):
        self.name = name

    def order(self):
        print(f"コーヒーの注文: {self.name}")

# 紅茶のクラス
class Tea(Orderable):
    def __init__(self, name):
        self.name = name

    def order(self):
        print(f"紅茶の注文: {self.name}")

# 異なる飲み物を注文する関数
def take_order(drink):
    drink.order()

# コーヒーと紅茶を注文
coffee = Coffee("カフェラテ")
tea = Tea("アールグレイ")

take_order(coffee)  # → コーヒーの注文: カフェラテ
take_order(tea)     # → 紅茶の注文: アールグレイ
```

 **異なる飲み物でも、共通の「注文する」という処理を適用できる！**

---

## まとめ

 **カフェの注文システムを例に、オブジェクト指向の考え方を学びました！**

| 概念 | 例 |
|------|----|
| **クラスとオブジェクト** | コーヒーの種類をオブジェクトとして作成 |
| **カプセル化** | 注文履歴を外部から変更できないようにする |
| **継承** | 飲み物の共通の性質を親クラスにまとめる |
| **ポリモーフィズム** | コーヒーも紅茶も「注文する」処理を共通化 |

オブジェクト指向を理解すると、現実世界の仕組みをそのままプログラムに落とし込むことができ、**再利用しやすく、拡張しやすいコード**が書けるようになります！

次に、実際にオブジェクト指向のプログラムを書いて試してみましょう！
Laravelでテストコードの作成概要

先週はテストコードを作成してみてほしいと言われた。

作成しながら学んだことを基本のキとしてまとめておく。

## Laravelのテスト

Laravelは動作を保証するためにPHPUnitを使用したテストを標準でサポートしている。

テストを適切に行うことで、バグの発生を防げる。

Laravelのテストは大きく以下の2種類に分類される。

Unitテスト（単体テスト）: 小さな単位のコード（メソッドやクラス）をテスト。

Featureテスト（機能テスト）: HTTPリクエストやデータベース操作を含む、アプリ全体の動作をテスト。

ざっくりアプリのCRUD系、Httpリクエスト系基本動作の確認なので現在はFeatureにコードを書いている。


## UnitテストとFeatureテストの違い

### Unitテスト

`tests/Unit`フォルダに格納されるテスト。
主に個々のクラスやメソッドの動作を確認。

**特徴:**

- データベースへのアクセスなし
- 依存関係が少ない
- 処理速度が速い


### Featureテスト

`tests/Feature`フォルダに格納されるテスト。

主にアプリケーションの機能全体をテストする。

**特徴:**

- HTTPリクエストのテストが可能
- データベースの操作を含む
- Laravelの`TestCase`を継承するため、各種ヘルパーメソッドを使用可能

## 基本的なメソッドの使い方

テストで初めて見たアサーションの数々。

### アサーションメソッド


    $this->assertEquals($expected, $actual)



期待値と実際の値が一致するか確認

    $this->assertTrue($boolean)

値がtrueか確認

    $this->assertFalse($boolean)

値がfalseか確認

    $this->assertNull($value)

値がnullか確認


    $this->assertDatabaseHas('users', ['email' => 'test@example.com'])

指定したデータがDBに存在するか確認

### HTTPレスポンステスト

    $this->get('/dashboard')

GETリクエストを送信

    $this->post('/register', $data)

POSTリクエストを送信

    $this->put('/profile', $data)

PUTリクエストを送信

    $this->delete('/user')

DELETEリクエストを送信

    $response->assertStatus(200)

ステータスコードが200か確認
その他にアクセスが許されなければ403。存在しなければ404。

    $response->assertRedirect('/home')

指定のURLにリダイレクトするか確認

    $response->assertJson(['message' => 'Success'])

JSONレスポンスの中身を確認

## その他によく使っていたメソッド

    use RefreshDatabase;

テストごとにデータベースをリフレッシュする

    $this->actingAs($user)

指定したユーザーとして認証済みの状態でテストを実行

    $this->withoutMiddleware()

ミドルウェアを無効化してテストを実行
これを行うと弊害が結構でる。
バリデーションも無視。
使わない方向で作成した。




## PostgreSQLを使ったテスト環境の構築

### .env.testing の設定

    DB_CONNECTION=pgsql
    DB_HOST=127.0.0.1
    DB_PORT=5432
    DB_DATABASE=calorie_busters_test
    DB_USERNAME=root
    DB_PASSWORD=your_password

下記のコマンドを実行

    php artisan key:generate --show

発行されたキーを.env.testingのAPP_KEYに記載。


    docker-compose exec db psql -U laravel
    //laravelのユーザーネームでDBにアクセス
    
    CREATE DATABASE my_test_database;
    //my_test_databaseという名前のDB作成
    
    \q
    //DBから抜ける。
    
    docker compose exec app php artisan migrate --env=testing
    //データベースのマイグレーションを実行する。

    
## テストの実行方法

## 全体のテストを実行

    docker compose exec app php artisan test


### ファイル単体のテスト実行

    docker-compose exec app php artisan test tests/feature/Admin/BranchControllerTest.php
会社では言わないけど,みんな副業しよう！- part 4. まとめメリットとは？

# 一覧
[part 1.始めるまでに知っておくべきこと](https://qiita.com/binary2/items/6e0cc361f00606f744e2)
[part 2. 案件獲得から案件クローズまで](https://qiita.com/binary2/items/45ba6448a87cc1af8166) 
[part 3.確定申告時に知っていないといけないこと](https://qiita.com/binary2/items/2c4bda08306cf01b1fce)
[part 4.まとめ(メリットがある部分だけでいいよって人はここだけでOK)](https://qiita.com/binary2/items/1a362bb38d96b2f0720f) / 今ここ

# この記事では...
まとめと称して,私が思ったことを共有します.
また,リーダークラスの人達にも部下の副業で得られるメリットがあると言ったことに対するアンサーをしようと思います.

# メリットとして思うこと
主に3つありました.

### 社会人スキルの向上
あくまで個人の意見です.
エンジニアの人は技術を優先する人が多く.
特に,qiitaなどを利用される方々はSEよりも技術が好きな人が多いと思います.
そのため社会人スキル自体は低い人が多い印象があります.
それが悪いとは思ってないですし,私もそちら側の認識ではありますw

ただ,副業をするにあたっては今まで優先度を低くしていたことをやらないといけないです.
副業について色々と調べないといけないし,案件獲得しないといけないし,
クライアントとの打ち合わせ,見積もり,リソースマネジメントも必要,
また,確定申告のためにお金周りもまとめないといけないです.
そこが進歩できる点だと思います.

私は今回で言うと,以下の能力などは特に向上したと思います
- 案件を獲得するための戦略立案
- リソースマネジメント
    - 副業で出せるパフォーマンスの限界を理解してスケジュールを立てる
    - プライベートとの按配調整

### マネースキルの向上
私が青色申告をしているためではありますが,お金周りはかなり勉強になりました.
もちろんマネーリテラシーは35歳なのである程度あります.(投資やポートフォリオなど)　
しかし,事業として管理するとなるとまた別の知識が必要でした.
また,事業の将来についても真剣に考えるようになりました.
- 経費関連
- 複式簿記
- 決算書

### 主体性の向上
副業では,自分からやらないと何もできないです.
また,知らないことだらけです.
全てを知ってから行動なんて無理なので,
その場で色々と調べたりしながら自分でやるしかないです.
元々主体性はあるので,アレですが,色々と身について自分の成長を感じられました!

# まとめ
今回は私が副業を始めて1年目の経験をまとめてみました.
元々リーダークラスだったのである社会人スキルやマネースキルや主体性はあるため,結構上手くいっていると思います.誰かの参考になれば幸いです.

部下云々カンヌンは,勝手に副業して技術以外のスキルを勝手に身につけてくれると結構リーダーは助かるかなと思います.ここいらはいきなりリーダーとかになってからタスクを渡されるし,誰にも渡せないけど雑務に近いものもあったりします.これを部下にお願いできたらなぁーって思っている人も多いと思ってます.
あと,主体性を身につけてくれると嬉しいです.やる気を感じますし.
ただ,主体性ない人が副業を始めないので,ここはニワトリ・タマゴな話だとは思います.

副業では,久しぶりにweb開発をして,知識のアップデートができています.まだ不明なところもあるので引き続きがんばります.本業でも副業で作ったシステムのデザインや機能などを逆輸入して採用したりと本業にも良い影響が出てます.

長編シリーズありがとうございました！
会社では言わないけど,みんな副業しよう！- part 3. 確定申告時に知っていないといけないこと

# 一覧
[part 1.始めるまでに知っておくべきこと](https://qiita.com/binary2/items/6e0cc361f00606f744e2)
[part 2. 案件獲得から案件クローズまで](https://qiita.com/binary2/items/45ba6448a87cc1af8166) 
[part 3.確定申告時に知っていないといけないこと](https://qiita.com/binary2/items/2c4bda08306cf01b1fce) / 今ここ
[part 4.まとめ(メリットがある部分だけでいいよって人はここだけでOK)](https://qiita.com/binary2/items/1a362bb38d96b2f0720f)

# この記事では...
part1,2で副業を始めるにあたり準備と案件フローなどをまとめました.
この記事では,確定申告についてまとめます.
正直,そこまで詳しくはないですが...
私の体験談としてまとめます.
また,青色申告ですので,基本的には最大限頑張っている認識です.

基本的にこれが一番分からないから諦める人が多いと思っているが,
最悪税理士に依頼すればOKって位で考えていれば良いと思います.
逆にそれがために副業やらないのは勿体無いと思う.

# まずは確定申告には種類がある / どれがいいのか
part1でも少し説明しましたが,3つあります.

| 名前 | 詳細 | メリット |　デメリット |
|:--:|:--:|:--:|:--:|
| 雑所得 | 一般的に副業は雑所得にして確定申告する | 簡単 | 控除を受けられない |
| 白色申告 | 副業を雑所得ではなく事業所得にして確定申告するv1 | - | - |
| 青色申告 | 副業を雑所得ではなく事業所得にして確定申告するv2 | 控除が受けられる,経費にできる | 面倒 |

基本的に収入が20万円未満なら雑所得として申請義務はないです.
しかし,住民税に対しては申請が必要なので,個人的には確定申告しない理由がない.
白色申告は中間的なものでやる意味が私には分からなかった.
青色申告は色々とメリットがあるが,その分条件がある(最低限の売上が必要など)

私の中の考え方を共有したいと思います.
これは完全に考え方なので,正解などはないと思っています.
指針として2つあります.

### 信用問題
青色申告するには,事業申請をする必要があります.それで屋号を取得することができます.
そうすると事業申請をして,開発案件をやっていることが証明できます.
クライアントからすると,そういう知識がある人という信頼感はあると思います.
個人的には信頼は重要だと思います.

### 収入見込み・税金対策
part2でどの程度売上立つのかざっくりな見通しは立つと思います.
要は,売上が増えれば,収める税金も増えます.(ざっくり30%)
その時に青色申告をすれば控除を受けられます.(最大65万円）
また,経費も利用できます.ただし,やることがたくさん増えます.
気持ちとしては,とりあえず副業やってみたいくらいの感じであれば,雑所得でいいのでは??と思います.
繰り返しになりますが,これが面倒だからやらないよりは,節税知識はなくても絶対的に収入は増えるからやった方が良いと思います.
税金対策については,qiitaで論じることではないので,参考まで...
- ざっくり20万円で30%だから6万納税(青色申告にすれば0円になるが,そのために色々とやらないといけない)
- ざっくり100万円で30%だから30万納税(青色申告にすれば10万円になるが,そのために色々とやらないといけない)

__将来フリーランスや企業したい人は必ず青色申告です.__
__この程度の勉強ができないと無理です.__

# 体験談
私は青色申告をやっています.
理由は上記の通りですが,信頼は必要だと思っているので,クライアントに少しでも安心して依頼をしてもらいたいという思いがあります.また,ある程度の収入が見込めるため,流石にそのまま税金を収めるのは厳しいです..

青色申告について少しまとめます.
割と簡単です.全てweb上で完結します.

freeeなどで青色申告を調べてその通りやればOKです.(私はfreeeを使ってますが,正直なんでもOKです.使っているもので記載をしていきます)
ただし,最低限自分で勉強をした方が良いとは思います.
知らなかった,で許されることはないためです.

まずは,事業申請をします.
freeeの手順に則りやれば問題ないです.
屋号名は最悪自分の名前でも大丈夫だったと思います.
私はちゃんと命名しました.
あと,事業開始日は申請日の2ヶ月前までは可能だったと思います.(2025.4月に申請するなら2025.2月~なら日付を戻して事業開始していたことにできる)
少し案件獲得できるのかなどを試してみてから,申請するでも良いと思います.
最後に青色申告か白色申告などを選べますがそのまま青色申告にしてください.
そうすると,青色申告する人はその申請をしないといけないですが,同時に申請もしてくれます.

申請後,事業用の口座やカードを作成することができます.会計ソフトなどで連携すると便利です.
次に事業で必要なものを購入した領収書や請求書などはちゃんと取っておきましょう.

2~3月に確定申告の時期がやってきます.
事業は1~12月の業績をまとめる必要があります.
12月に請求書を出したものは1月に振り込みされますが,請求が12月ならそれを含んで業績を算出します.

正直私も複式簿記は自分でつけられないです.読むことはできます.
そんな感じなので,全く知らない人は少し勉強してください.
ただやることは簡単です.freee会計を1ヶ月契約してください.
そこに領収書と請求書を登録すれば,ほぼほぼ必要な書類は自動作成されます.
そしてそのまま青色申告を申請できます.(e-taxで確定申告できます.)

# やってみて思ったこと
思ったよりも簡単だし,ためになると思う.
マネーリテラシー的なものとして教えるべきだとは思うが,事業収入にできる人がそこまでいないとも思う.
副業でシステム開発をするだけなら,1年分の領収書や請求書はたかが知れていいるから,確定申告時にまとめて処理するで問題ないと思います.これが,せどりなどなら無理だわぁ...
事業用口座とカードを作ると,複式簿記をちゃんとつけられるし便利.
ただ,多分そこまでやっている人も少ないのかも知れないし.
私も実際自分のクレジットカード使って,事業主借で対応したりしている.

# まとめ
part3では,確定申告について知ってないといけないことをまとめました.
簡単にまとめます.
- 簡単にやるなら雑収入で対応する
- ちゃんとやるなら青色申告で対応する
- 青色申告はやることがたくさんあるけどためにはなる
- もし,難しくて無理だと思うなら,雑収入でもやってみることをオススメ
- 青色申告で途中で無理だと思ったら,税理士に相談してみる

あまり面白い話ではないけど,必要なことなのでまとめました.
[part 4.まとめ(メリットがある部分だけでいいよって人はここだけでOK)](https://qiita.com/binary2/items/1a362bb38d96b2f0720f) へ
ぼくのかんがえたさいきょうの.bashrc

自分用の`.bashrc`設定のノート

```bash:.bashrc
# User specific aliases and functions
## 誤操作回避用
alias emacs="emacs -nw"
alias mv="mv -i"
alias rm="rm -i"
alias cp="cp -i"

## よく使うコマンド
alias xterm="xterm -fa 'Hack' -fs 12 -xrm 'XTerm*metaSendsEscape: true'"
alias xtermrv="xterm -fa 'Hack' -fs 12 -rv -xrm 'XTerm*metaSendsEscape: true'"
### rxvt-unicodeはxtermに比べて通信が遅い環境で描画が高速
alias rxvt-unicode="rxvt-unicode -xrm 'XTerm*metaSendsEscape: true' -rv -fn 'xft:monospace-12'"
### Emacs read-only
emacsro() {
    emacs --eval "(find-file-read-only \"$1\")"
}
### sshfsでhost000上の`/home/user`をローカルにマウント、そのアンマウント
alias host000_sshfs="sshfs host000:/home/user /home/user/remote_files/host000 -o ro"
alias host000_umount_sshfs="fusermount -u /home/user/remote_files/host000"

## 設定関係
export OMP_NUM_THREADS=1
export http_proxy=http://proxy-server.jp:8080
export https_proxy=http://proxy-server.jp:8080
if [[ "${SSH_CONNECTION}" ]] ; then
    export TERM="xterm-256color"
    export GNUTERM="x11"
fi

# For pyenv
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"

# MODULEPATH for environment modules
source /etc/profile.d/modules.sh
export MODULEPATH=/home/user/opt/modulefiles:$MODULEPATH
```
今週の学習記録（2025/03/09～2025/03/15）

# 今週の学習記録（2025/03/09～2025/03/15）
## 🔍 学習内容
- **学習テーマ**: TypeScript, React
- **使用した教材**: Qiita, Udemy

## ✏️ 学んだこと
### 主なポイント
- ReactとTypeScriptを使用したアプリ開発方法

## 💡 学び・反省点
### 学び
- useMemo, useCallbackによるレンダリング管理
- 様々なCSSの当て方（CSSModules, Emotionなど）
- コンポーネントをatoms,molecules,organismsなどで分割する
- useContextを使用することで小コンポーネントの再レンダリングを防ぐことができる。
- 型注釈と型推論は使い分けが重要。
- JSONPlaceholderで簡単に仮のAPIを使用することができる。
- 型定義を行うことでpropsや取得データを効率的に扱うことができる。

### 反省点
- 休日の学習時間が少なかった。（毎回書いてる気がする...）


## 📆 次週の予定
### 目標
- ReactとTypeScriptのアプリ開発方法を学び終える。
- 休日の学習時間を増やす。

### 行動計画
- 通退勤時間も積極的に学習する。
- 休日でも平日と同じくらいに起床する。

## 🏄‍♂️所感
　しばらく投稿しておらず久々の投稿になってしまったことにまずは猛省。そもそも投稿することすら忘れることもあったので、今週から喝いれて継続していきます。  
今週は毎日学習できた上、平日は2時間近く学習できた日もそこそこあったのでこの習慣を途切らせないために頑張っていきたいです。休日は予定があったとはいえもう少し学習できたと思います。休日に爆睡しないように、睡眠負債を溜めないように平日から十分な睡眠時間を確保することを心がけていきます。
　ReactとTypeScriptも終盤なので最近サボりがちだったツケを払うためにも駆け抜けていきます！
データエンジニア初心者日記（３）と（４）

しばらく投稿できてなかった、、そして（３）として書いていた下記の内容が
投稿できていなかったのでまとめて投稿しちゃおうと思います。

（３）※2月下旬くらいに書いたはず。。
「おうちで学べるデータベースのきほん」の後半戦です。

トランザクションに関する章で
use test;
というコマンドがありましたが、testというデータベースの作成について説明がなかったのでハンズオンは飛ばして解説だけ読みました。

その後もデッドロックや正規系など、情報処理試験を受ける中で見覚えのある内容が多く、ぱらぱらっと読んでしまいました。笑

実業務の中で使いながら覚える方が良いような気がしているので、
次は「東京大学のデータサイエンティスト育成講座」（以下、DS育成講座）を読んでみようと思います。

（４）
（３）の最後に書いた通り、DS育成講座を読み始めました。
1章は前にやっていたprogateの復習に近かったのですが、行列式の計算に差し掛かり、
行列式って何だったっけ。。？と学生時代の知識に埃が被ってしまっていたので、
ヨビノリたくみさんの線形代数入門を①から見直していました。
行列式が何か、はなんとなくわかったものの、それがデータサイエンスにどう関わるか、はそこまで理解できてないです笑
しかし、線形代数に時間を取られても仕方ないので本書に戻ろうとしていたところ、
職場で優先的な資格について説明があったので、一度そちらに注力しようと思います。

その内容としては、DatabricksやSnowflakeの資格です。
並行しながらDS育成講座をやったり秋のデータベーススペシャリストの対策も進めようと思います。
下記の記事を拝見したところまずは公式が出しているガイド等を読み込んでみるのが良さそうですね。
期間的には、、5月くらいに取りたいところ。

https://qiita.com/ReijiOtake/items/fff10fc25ed554c5f37c

https://qiita.com/GentleWaveFlow/items/ea816604db2c28c93449

では今回はこの辺で。
明日からまたがんばりましょう。
Jest実行時に TextEncoder is not defined のエラーが発生したときの対処法

## はじめに
Jest でテストを実行した際に **`TextEncoder is not defined`** というエラーが発生しました。本記事では、エラーの原因とその解決方法についてまとめます。


## エラー内容
`npm run test` を実行した際に、以下のエラーが発生しました。


```zsh

FAIL src/__tests__/App.test.tsx
  ● Test suite failed to run

    🔴ReferenceError: TextEncoder is not defined

    > 1 | import { BrowserRouter, NavLink, Outlet, Route, Routes } from 'react-router';
        | ^
      2 | import './App.css';
      3 | import { Home } from './Home';
      4 | import { Hoge } from './Hoge';

      at Object.<anonymous> (node_modules/react-router/dist/development/index.js:8913:15)
      at Object.<anonymous> (src/App.tsx:1:1)
      at Object.<anonymous> (src/__tests__/App.test.tsx:2:1)
```
---
:::note info
### TextEncoderとは
`TextEncoder` は、文字列を `UTF-8` のバイナリデータに変換するための Web API 。
`TextEncoder` を使うと、文字列をエンコードしてバイナリとして扱うことができます。

:::


:::note warn
### エラーの原因
Jest のデフォルトのテスト環境である `jsdom` には、`TextEncoder / TextDecoder` の実装が含まれていません。
そのため、`TextEncoder` を使用しているライブラリ（例えば、`react-router` など）をインポートすると、テスト実行時に `TextEncoder is not defined` というエラーが発生します。
:::

よって、`Jest` の実行環境 `jsdom` では `TextEncoder` が提供されていないため、
テスト環境で `TextEncoder` を定義してあげる必要があります。

## 解決方法

### 1. `jest-fixed-jsdom` をインストール

プロジェクトのルートディレクトリで、以下のコマンドをターミナルで実行する。
```zsh
npm i jest-fixed-jsdom
```

### 2. `jest.config.ts` にテスト環境を指定
`Jest` の設定ファイルに以下を追記。

```ts
module.exports = {
  testEnvironment: 'jest-fixed-jsdom',
}
```

**これでエラーが解消されました**


## おわりに

これは回避策の１つであるらしく、現在は **`Vitest`** というフレームワークを使用することを推奨しているらしい。
`Vitest` はデフォルトで `TextEncoder` をサポートしておりこの問題に直面することはないそう。



## 参考

https://zenn.dev/rehabforjapan/articles/59e637194104b6

https://mswjs.io/docs/migrations/1.x-to-2.x/#frequent-issues
[rails] buildメソッドについて

1　**初めに**
---
今回、Railsを使ってto doアプリを作っているので、同じようなアプリを作っている人の参考になればと思い記事を執筆します。
[仕様]ruby 3.3.4/Rails 7.0.8.5

2　**今回の題目について**
---
今回はbuiidメソッドを使って、コードの分量を減らしていきたいと思います。
下記はbuildメソッドを使う前のコードになります。
~~~
def create
    @task = Task.new(task_params)
    @task.user_id = current_user.id
~~~
このコードはCRUDの中のcreateメソッドでタスクを作成し、そのユーザーとタスクを紐づけるという意味のコードです。この書き方でも問題なく動作します。実際にbuildメソッドを使用した結果が以下になります。
~~~
 @task = current_user.tasks.build(task_params)
~~~
なんと！二文かかっていたのが、一文で済んでしまいました。ちなみにコードの意味は先ほどの二文と同じです。要は、current_user.tasksでユーザーとタスクを紐づけbuildでインスタンスを生成しています。しかしながら、このメソッドを使うには注意が必要です。has_many の関連付けができていないとこのbuildメソッドの書き方は成立しません。今回は以下のように関連付けがなされていました。また、この内容はRailsガイドにも乗っているのでそちらも参照してみてください。以下にリンクを載せておきます。
Railsガイド：https://railsguides.jp/association_basics.html
~~~
class User < ApplicationRecord
    has_many :tasks
~~~
このようにbuildメソッドを使う際には関連付けがどうなっているかを改めて確認したほうが良いです。

3　**まとめ**
---
buildメソッドを使わずに書くことは可能です。しかしながら、コードの可読性といった観点からしたら私自身、短くまとめられるコードがあるならそれに越したことはないなと思います。私自身まだまだ勉強の身でありますが、この記事がお役に立てたら幸いです。