OmniAICreator/Qiita-1.07M huggingface dataset:
コミュニティAMIの料金確認方法

# はじめに
コミュニティAMIに有料/無料それぞれが存在します。有料の場合はインスタンスの料金にプラスでソフトウェア料金が発生します。
コミュニティAMIの有料/無料、有料の場合いくらになるか確認する方法をまとめます。

 
# コミュニティAMIの有料/無料の確認方法
EC2 のコンソールより、「AMI」を選択 → 「歯車(設定)」をクリックし、「製品コード」列が表示されることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/8d96c314-3f22-9b5b-298d-c0709e348b95.png)

 「パブリックイメージ」を指定して、検索対象のAMIのIDを入力し、情報に「製品コード」が存在するかどうかを確認します。
**→ 存在する場合には有料、存在しない場合は無料**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/7a4aa813-1a07-7144-8a6b-b32fe36dc9db.png)

AMIの詳細画面でも製品コードが存在するか確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/25b63f1a-4908-85a8-c4c5-06eae3420208.png)
 
# 無料のコミュニティAMIのインスタンス料金確認方法
無料AMIの場合、**インスタンス自体の料金のみ発生します。**
インスタンスの料金はインスタンスタイプを選択する項目で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/7db016a4-aae8-9c7e-0733-6f46306213ab.png)

# 有料のコミュニティAMIのインスタンス料金確認方法
有料AMIの場合、**インスタンスの料金＝インスタンス料金+ソフトウェア料金**
AMI選択後、インスタンスタイプを選択する項目でインスタンスタイプごとの料金が表示されないようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/53f2ec50-d544-d87d-2373-35ad4723a588.png)
 
その場合、**EC2の「Amazon マシンイメージ(AMI)を選択」画面でAMI IDを使用して検索すると「AWS Marketplace AMI」のタブで該当AMIが表示される**ため、AMIの名前をクリックしたらインスタンスタイプごとの料金が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/fecff78f-0299-b6be-f89e-983bd68bc338.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964355/0a691306-e30b-eb65-7025-0d96c50346dd.png)
Pythonのinput関数について


# Pythonの`input`関数について

Pythonの `input` 関数は、プログラムがユーザーから入力を受け取るために使用されます。入力された値は常に **文字列（`str` 型）** として返されます。

---

## **基本的な使い方**

`input()` は、入力を待機してユーザーが入力した内容をプログラムに渡します。

### **構文**
~~~python
変数 = input(プロンプト文字列)
~~~

- **`プロンプト文字列`**:
  - ユーザーへの指示を示すテキスト（例: "何か入力してください: "）。
- **戻り値**:
  - ユーザーが入力した内容（`str` 型）。

### **例: 入力を受け取る**
~~~python:例
name = input("名前を入力してください: ")
print(f"こんにちは、{name}さん！")
~~~

#### **実行例**
~~~plaintext
名前を入力してください: 山田
こんにちは、山田さん！
~~~

---

## **注意点: input関数が返す値は文字列（`str` 型）**

`input()` 関数が返す値は常に **文字列（`str` 型）** です。数値を扱う場合には型変換が必要です。

### **例: 入力を整数に変換する**
~~~python:例
age = input("何歳ですか？")
age_int = int(age)  # 入力された文字列を整数に変換
print(f"あなたは {age_int} 歳です")

もしくは

age = int(input("何歳ですか？"))
print(f"あなたは{age}歳です")
~~~

#### **実行例**
~~~plaintext
何歳ですか？25
あなたは 25 歳です
~~~



---

## **応用例: 条件分岐と組み合わせる**

入力された値に基づいて条件分岐を行うこともできます。

### **例: 年齢による条件分岐**
~~~python:例
casino_age = 18
age = int(input("何歳ですか？"))

if age >= casino_age:
    print("どうぞお入りください")
else:
    print(f"{casino_age}歳未満の方はカジノへは入れません")
~~~

#### **実行例**
~~~plaintext
何歳ですか？20
どうぞお入りください

何歳ですか？15
18歳未満の方はカジノへは入れません
~~~


## **まとめ**

- **基本動作**:
  - `input()` はユーザーから入力を受け取り、文字列を返します。
- **型変換**:
  - 数値として扱いたい場合は、`int()` や `float()` を使用します。
---

### **ポイント**
::: note info
- **入力された値は必ず文字列（`str` 型）**:
  - 数値やその他の型として扱う場合は型変換が必要です。
:::
Pythonのif文について


# Pythonの`if`文について

Pythonの`if`文は、特定の条件が満たされたときに、特定のコードブロックを実行するために使用されます。条件式が`True`の場合に処理を実行し、`False`の場合はスキップされます。

---

## **1. `if`文の基本構造**

### **構文**
~~~python
if 条件式:
    実行する処理
~~~

- **`条件式`**:
  - 評価される条件（`True` または `False` を返す）。
- 条件式が`True`の場合のみ、インデントされたブロック内のコードが実行されます。

### **例: 基本的な`if`文**
~~~python
x = 10
if x > 5:
    print("xは5より大きい")
~~~

~~~python:出力
xは5より大きい
~~~

---

## **2. `else`文の使用**

`if`文の条件が`False`の場合に、代わりに実行される処理を定義するために`else`文を使います。

### **構文**
~~~python
if 条件式:
    実行する処理1
else:
    実行する処理2
~~~

### **例**
~~~python
x = 3
if x > 5:
    print("xは5より大きい")
else:
    print("xは5以下です")
~~~

~~~python:出力
xは5以下です
~~~

---

## **3. `elif`文の使用**

`elif`を使うことで、追加の条件をチェックできます。`if`文の条件が`False`の場合に、次の`elif`条件が評価されます。

### **構文**
~~~python
if 条件式1:
    実行する処理1
elif 条件式2:
    実行する処理2
else:
    実行する処理3
~~~

### **例**
~~~python
x = 10
if x < 5:
    print("xは5未満です")
elif x == 10:
    print("xは10です")
else:
    print("xは5以上10未満です")
~~~

~~~python:出力
xは10です
~~~

---

## **4. `not` を使った条件の反転**

`not`を使うことで、条件式を反転させることができます。`not`は、`True`を`False`に、`False`を`True`に変換します。

### **例**
~~~python
x = 0
if not x:
    print("xはFalseとみなされる値です")
~~~

~~~python:出力
xはFalseとみなされる値です
~~~

---

## ブール値の説明

### **ブール値（Boolean values）とは？**

ブール値は、**`True`**（真）または **`False`**（偽）という2つの値を持つデータ型です。条件分岐や比較演算、論理演算で頻繁に使用されます。

### **ブール値の評価ルール**
Pythonでは、以下のような値が**`False`** として評価されます：

- **`0`**（整数のゼロ）
- **`0.0`**（浮動小数点のゼロ）
- **`None`**
- **空の値**（空文字列`""`、空リスト`[]`、空辞書`{}`など）

それ以外のすべての値は **`True`** と評価されます。

---
## **5. `None` の扱い**

`None`はPythonで「値が存在しない」ことを表す特別なオブジェクトです。`if`文で`None`を判定する場合、以下の方法が使われます。

### **`None` のブール値評価**
- `None` は、ブール値評価で `False` とみなされます。

~~~python
value = None
if not value:
    print("値は None または False とみなされます")
~~~

~~~python:出力
値は None または False とみなされます
~~~

### **`is None` を使った判定**
- `None` を正確に判定するには、`is None` を使用するのが推奨されます。

~~~python
value = None
if value is None:
    print("値は None です")
~~~

~~~python:出力
値は None です
~~~

::: note info
もし if not 〇〇の意味は
もし〇〇の値が False と評価される値であればという意味、TrueかFalseの違いについては他の記事でまとめているので、そちらを参考にしてください。
:::

---

## **6. 注意点と質問に対する回答**

### **質問:**
~~~python
a = 10
if not a:
    print("a is None")
~~~

#### **解説**
1. **`a = 10`**:
   - `a` は `10` という整数値を持っています。

2. **`if not a:` の評価**:
   - `not a` は、`a` のブール値を反転します。
   - `a = 10` の場合、`a` は `True` と評価されます。
   - **`not True`** は **`False`** になるため、条件は成立しません。

3. **`print` 文の実行**:
   - 条件が満たされないため、`print` 文は実行されません。

---

## **7. まとめ**

- **`if`文**:
  - 条件が`True`の場合にブロック内のコードを実行します。
- **`else`文**:
  - `if`の条件が`False`の場合に代わりの処理を実行します。
- **`elif`文**:
  - 複数の条件を順番にチェックできます。
- **`not`演算子**:
  - 条件を反転させるために使用します。
- **`None` の判定**:
  - ブール値評価では`False`とみなされます。
  - 正確な判定には`is None`を使用するのが推奨されます。

---

### **ポイント**
- 条件式が複雑になる場合、コードが読みにくくならないように工夫しましょう。
- `None` の判定や`not`の使い方を正確に理解すると、より効率的なコードが書けます。
daisyUIの６つの魅力を紹介

## はじめに
この記事では、daisyUIの魅力を以下の項目で紹介していきます！

- [daisyUIとは？](#daisyuiとは)
- [6つの魅力](#6つの魅力)
  1. [軽量](#1-軽量)
  2. [拡張性](#2-拡張性)
  3. [豊富なコンポーネント](#3-豊富なコンポーネント)
  4. [テーマ・カラーが利用可能](#4-テーマカラーが利用可能)
  5. [TailwindCSSの記述の簡略化](#5-tailwindcssの記述の簡略化)
  6. [高速な開発体験](#6-高速な開発体験)
- [最後に](#最後に)

---


## daisyUIとは？
daisyUIとは、TailwindCSSをベースに作られたUIライブラリです。また、TailwindCSSにそのまま拡張して使用します。そのため、TailwindCSSを使用している環境で使用します。

#### 環境構築
環境構築は、インストール１回と簡単な記述だけで完了します！
[公式ドキュメンント参考はこちらへ](https://daisyui.com/docs/install/)
1. インストール
```
npm i -D daisyui@latest
```
2.dasyUIのプラグインをファイルにインポート
- TailwindCss v4 の場合
```app.css もしくは global.css
@plugin "daisyui";
```
- TailwindCss v3 の場合
``` tailwnd.config.js/ts
  plugins: [
    require('daisyui'),
  ],
```


### 使い方
使い方については、[公式ドキュメント](https://daisyui.com/docs/use/)を見るのがおすすめです！

---

## 6つの魅力

### 1. 軽量
daisyUIはTailwindCSSに拡張する形で構築されており、追加モジュールが少なく、軽量です。  
HTMLとCSSのみで動作するため、JavaScriptに依存せず、SEOやアクセシビリティにも配慮できます。

---

### 2. 拡張性
TailwindCSSと同様、クラス属性に記述して使用するため、他UIライブラリよりも柔軟性が高く、デザインのカスタマイズが容易です。

---

### 3. 豊富なコンポーネント
実用性の高いものからユニークなものまで、豊富なUIコンポーネントが揃っています。  
[コンポーネント一覧はこちら](https://daisyui.com/components/)

---

### 4. テーマカラーが利用可能

#### i. カラー
20種類のプリセットカラーがあり、ユースケースに応じて使い分け可能です。  
https://daisyui.com/docs/colors/

#### ii. テーマ
32種類のテーマが用意されており、`tailwind.config.js(ts)`に記述することで即反映されます。  
ダークモードの切り替えも簡単です。

#### iii. カスタムテーマ
公式サイト上でオリジナルテーマをプレビューしながら作成できます。  
https://daisyui.com/theme-generator/

---

### 5. TailwindCSSの記述の簡略化
TailwindCSSの記述が冗長になりがちな点をdaisyUIがカバー。  
コードの見通しが良くなり、保守性や再利用性が向上します。

---

### 6. 高速な開発体験
インストールと設定が非常にシンプルで、コンポーネントもクラスを追加するだけですぐ使えます。  
また、公式ドキュメントで挙動を確認できるため、開発スピードが大幅に向上します。

---

## 最後に
daisyUIの魅力は伝わりましたか？  
ぜひ、個人開発やハッカソンなど、小規模なアプリケーション開発に取り入れてみてください！
PythonのBoolean型（bool）について


# PythonのBoolean型（`bool`）について

**Boolean型（`bool`）**は、Pythonで論理値（`True` または `False`）を扱うための基本的なデータ型です。条件分岐や比較処理で頻繁に使用されます。

---

### **ブール値の評価ルール**
Pythonでは、以下のような値が**`False`** として評価されます：

- **`0`**（整数のゼロ）
- **`0.0`**（浮動小数点のゼロ）
- **`None`**
- **空の値**（空文字列`""`、空リスト`[]`、空辞書`{}`など）

それ以外のすべての値は **`True`** と評価されます。

## **1. Boolean型の特徴**

1. **値は2つのみ**
   - **`True`**（真）: 条件が成立する場合。
   - **`False`**（偽）: 条件が成立しない場合。

2. **`bool` 型は `int` 型のサブタイプ**
   - `True` は整数 `1` に、`False` は整数 `0` に対応します。
   - そのため、`bool` 型は数値演算に使用することもできます。

---

### **例: 基本的な使用例**
~~~python:例
is_holiday = True
is_weekday = False

print(is_holiday)  # True が出力される
print(is_weekday)  # False が出力される
~~~

~~~python:出力
True
False
~~~

---

## **2. Boolean型と数値の関係**

### **数値としての振る舞い**
- **`True`** は `1` として扱われます。
- **`False`** は `0` として扱われます。

#### **例: 数値としての演算**
~~~python:例
print(True + 1)    # 1 + 1 → 2
print(False * 10)  # 0 * 10 → 0
~~~

~~~python:出力
2
0
~~~

---

### **`bool` 型の型チェック**
~~~python:例
print(isinstance(True, int))   # True
print(isinstance(False, int))  # True
~~~

~~~python:出力
True
True
~~~

---

## **3. Boolean型の生成**

1. **比較演算から生成**
   - 比較演算の結果は `bool` 型で返されます。
   - 例:
     ~~~python:例
     print(5 > 3)      # True
     print(10 == 5)    # False
     print(7 <= 7)     # True
     ~~~

     ~~~python:出力
     True
     False
     True
     ~~~

2. **論理演算から生成**
   - 論理演算子（`and`、`or`、`not`）を使うと、`bool` 型の値を生成できます。
   - 例:
     ~~~python:例
     print(True and False)  # False
     print(True or False)   # True
     print(not True)        # False
     ~~~

     ~~~python:出力
     False
     True
     False
     ~~~

3. **`bool()` 関数を使用**
   - `bool()` 関数を使うと、任意の値を `bool` 型に変換できます。
   - 例:
     ~~~python:例
     print(bool(0))      # False（0はFalse）
     print(bool(1))      # True（1はTrue）
     print(bool(""))     # False（空文字列はFalse）
     print(bool("Hello"))# True（非空文字列はTrue）
     ~~~

     ~~~python:出力
     False
     True
     False
     True
     ~~~

---

## **4. 注意点**

1. **`True` と `False` の大文字**
   - Pythonでは、`True` と `False` は**大文字で始まる**必要があります。
   - 小文字の `true` や `false` を書くとエラーになります。
     ~~~python:例
     print(true)  # エラー
     print(false) # エラー
     ~~~

2. **数値計算と論理値の混在**
   - `True` と `False` は数値 `1` と `0` に対応するため、意図せず計算に使われることがあります。
   - 可読性を保つため、必要に応じてコメントを追加して意図を明確にしましょう。

3. **暗黙的な型変換**
   - 条件式では多くの値が暗黙的に `bool` 型に変換されます。
     - 例: `0` や `""`（空文字）は `False` として扱われます。
     - 例: 非ゼロの数値や非空文字列は `True` として扱われます。

---

## **5. ポイント**

::: note info
- **`bool` 型は `int` 型のサブタイプ**:
  - `True` → `1`、`False` → `0` として振る舞います。
- **主な用途**:
  - 条件分岐（`if` 文など）や比較演算で使用されます。
- **コードの可読性**:
  - 数値演算で `True` や `False` を意図せず使わないように注意しましょう。
- **Pythonの仕様**:
  - `True` と `False` は大文字で始まります。
  - 暗黙的な型変換に注意が必要です。
:::

---

### **まとめ**
- Pythonの `bool` 型は、`True` と `False` の2つの値しか持たないシンプルな型です。
- 数値計算、条件分岐、比較演算、論理演算で幅広く使用されます。
- 特性や注意点を理解することで、より正確にプログラムを記述できます。

---
Pythonの数値型と数値演算子


# Pythonの数値型と数値演算子

Pythonでは、数値を扱う際に様々な**数値型**と**演算子**を使用します。それぞれの型や演算子の使い方を理解することで、数値計算がより簡単になります。

---

## **1. 数値型（Numeric Types）**

Pythonで使用できる主な数値型は以下の3種類です。

1. **整数型 (`int`)**
   - 小数点を持たない数値を扱います。
   - 例: `10`, `-5`, `0`

   ~~~python:例
   print(type(10))  # <class 'int'>
   ~~~

2. **浮動小数点型 (`float`)**
   - 小数点を持つ数値を扱います。
   - 例: `3.14`, `-0.001`, `0.0`

   ~~~python:例
   print(type(3.14))  # <class 'float'>
   ~~~

3. **複素数型 (`complex`)**
   - 実部と虚部を持つ数値を扱います。
   - 例: `3 + 5j`, `-2j`

   ~~~python:例
   print(type(1 + 2j))  # <class 'complex'>
   ~~~

---

## **2. 数値演算子（Operators）**

Pythonでは、数値に対して様々な演算を行うことができます。以下は主な演算子のリストです。

### **1. 四則演算**
- `+` : 加算
- `-` : 減算
- `*` : 乗算
- `/` : 除算（結果は常に `float` 型）

~~~python:例
a = 10
b = 5
print(a + b)  # 15
print(a - b)  # 5
print(a * b)  # 50
print(a / b)  # 2.0
~~~

### **2. 剰余（Modulus）**
- `%` : 割り算の余りを返します。

~~~python:例
print(14 % 3)  # 2
~~~

### **3. 切り捨て除算（Floor Division）**
- `//` : 小数点以下を切り捨てた整数部分を返します。

~~~python:例
print(14 // 3)  # 4
~~~

### **4. べき乗（Exponentiation）**
- `**` : 指定した数をべき乗します。

~~~python:例
print(2 ** 3)  # 8
~~~

---

## **3. 特徴的な計算のルール**

1. **整数 (`int`) と浮動小数点 (`float`) の計算**
   - `int` 型と `float` 型の計算結果は常に `float` 型になります。
   - 例: `10 + 0.5` → `10.5`（`float` 型）

   ~~~python:例
   a = 5
   b = 2.0
   print(a + b)  # 7.0
   ~~~

2. **優先順位**
   - 演算子には計算の優先順位があります。
     - 例: `*`（乗算）や `/`（除算）は `+`（加算）や `-`（減算）よりも優先されます。
   - 必要に応じて括弧 `()` を使うと、計算順序を明示できます。

   ~~~python:例
   print(5 + 2 * 3)  # 11
   print((5 + 2) * 3)  # 21
   ~~~

3. **負の数の切り捨て除算**
   - 負の数の場合、切り捨ては「小さい方向」に丸めます。
     - 例: `-7 // 3` → `-3`

---

## **4. 複合代入演算子（Augmented Assignment）**

複合代入演算子を使うことで、計算と代入を同時に行えます。

### **主な複合代入演算子**
1. `+=` : 加算して代入
2. `-=` : 減算して代入
3. `*=` : 乗算して代入
4. `/=` : 除算して代入（`float` 型を返す）
5. `//=` : 切り捨て除算して代入
6. `%=` : 剰余を計算して代入
7. `**=` : べき乗を計算して代入

### **例**
~~~python:例
x = 10
x += 5  # x = x + 5
print(x)  # 15

x *= 2  # x = x * 2
print(x)  # 30
~~~

---

## **5. 応用例: 偶数・奇数判定**
剰余演算子 `%` を使って、数値が偶数か奇数かを判定できます。

~~~python:例
number = 10
if number % 2 == 0:
    print("偶数です")
else:
    print("奇数です")
~~~

~~~python:出力
偶数です
~~~

---

## **6. まとめ**
- Pythonでは、数値型は主に `int`、`float`、`complex` の3種類があります。
- 数値演算子を使うと、加算、減算、乗算、除算などの計算が簡単に行えます。
- 優先順位や型変換のルールを理解しておくと、複雑な計算を正確に扱えます。

---
Built-in Function


# PythonのBuilt-in Function について

**Built-in Function（ビルトイン関数）**とは、Pythonにあらかじめ組み込まれている関数のことです。これらの関数は、インポートなどの準備をすることなく、どのPythonプログラムでもすぐに使用できます。

---

## **1. Built-in Functionとは？**
- Pythonにデフォルトで用意されている便利な関数群。
- 簡単な処理から高度な操作まで対応可能。

### **例**
~~~python:例
print("Hello, World!")  # 出力
len("Hello")            # 文字列の長さを取得
type(42)                # データ型を取得
~~~

---

## **2. Built-in Function の特徴**
- **簡単に利用可能**:
  - 特別なモジュールのインポートは不要。
- **幅広い機能**:
  - 入出力（例: `print`）、データ型チェック（例: `type`）、データ変換（例: `int`、`str`）など多数。
- **高いパフォーマンス**:
  - Pythonの実装に最適化されているため、効率的。

---

## **3. 主なBuilt-in Function**
以下はよく使われるBuilt-in Functionの例です。

### **1. `print()`**
- オブジェクトをコンソールに出力します。
~~~python:例
print("Hello, World!")
~~~
~~~python:出力
Hello, World!
~~~

---

### **2. `type()`**
- オブジェクトのデータ型を返します。
~~~python:例
print(type(42))       # 整数型
print(type("Hello"))  # 文字列型
~~~
~~~python:出力
<class 'int'>
<class 'str'>
~~~

---

### **3. `id()`**
- オブジェクトの一意なID（メモリ上のアドレス）を返します。
~~~python:例
x = "hello"
print(id(x))
~~~
~~~python:出力
140703354255984  # 実際の値は環境に依存します
~~~

#### **IDが同じ表示になる場合**
- Pythonでは、**イミュータブルなオブジェクト**（例: 文字列や数値）に対して同じ値が再利用される場合があります。
- この仕組みを**インターンニング（interning）**と呼び、メモリの効率を高めるために使用されます。

~~~python:例
x = "hello"
y = "hello"
print(id(x))  # xのID
print(id(y))  # yのID: xと同じになる
~~~
~~~python:出力
140703354255984
140703354255984
~~~

**なぜIDが同じになるのか？**
- Pythonは「文字列 'hello' がすでにメモリにある」と判断し、新しいメモリを確保せず、既存のメモリを再利用します。
- このように、同じ値を持つオブジェクトが同じメモリアドレスを共有する場合があります。

---

### **4. `len()`**
- オブジェクト（文字列、リストなど）の長さを返します。
~~~python:例
print(len("Hello"))    # 文字列の長さ
print(len([1, 2, 3]))  # リストの長さ
~~~
~~~python:出力
5
3
~~~

---

### **5. `int()` / `str()`**
- 型変換を行うための関数です。

#### **例: 数値に変換**
~~~python:例
print(int("42"))  # 文字列 "42" を整数に変換
~~~
~~~python:出力
42
~~~

#### **例: 文字列に変換**
~~~python:例
print(str(42))  # 整数 42 を文字列に変換
~~~
~~~python:出力
"42"
~~~

---

### **6. `isinstance()`**
- オブジェクトが特定の型であるかを確認します。
~~~python:例
x = 42
print(isinstance(x, int))  # True
~~~
~~~python:出力
True
~~~

---

## **4. Built-in Functionのメリット**
1. **簡単に利用できる**:
   - 初心者でも使いやすい構文。
2. **豊富な機能**:
   - シンプルな処理から高度な操作まで幅広く対応。
3. **学習コストが低い**:
   - ドキュメントやチュートリアルが豊富で、すぐに習得可能。

---

## **5. 実際の活用例**
以下のような場面で、Built-in Functionが活躍します。

### **例: 型チェックと型変換**
~~~python:例
x = "42"
if isinstance(x, str):
    x = int(x)  # 文字列を整数に変換
print(x + 10)  # 計算可能
~~~
~~~python:出力
52
~~~

---

## **6. Built-in Functionの完全リスト**
Pythonには100以上のBuilt-in Functionがあります。以下のリンクから公式ドキュメントを確認できます：
[Python Built-in Functions Documentation](https://docs.python.org/ja/3/library/functions.html)

---

## **7. まとめ**
- **Built-in Function** は、Pythonに組み込まれた便利な関数群です。
- 簡単に利用できるため、プログラミングを効率化します。
- よく使われる関数を覚えるだけで、コードの生産性が大幅に向上します。

---
Pythonのエラーについて


# Pythonのエラーについて

プログラムを書いているときに発生する**エラー**は、コードに何らかの問題があることを示すものです。エラーは問題解決の手がかりであり、恐れる必要はありません。むしろ、エラーメッセージを読み解くことで、コードを改善するスキルを磨くことができます。

---

## **1. エラーとは？**
- **エラー**とは、プログラムが正常に動作しない原因となる問題です。
- エラーが発生すると、Pythonは**エラーメッセージ**を表示し、プログラムは停止します（クラッシュ）。

### **エラーの基本的な例**
~~~python:例
result = 100 / 0  # ゼロ除算エラーが発生
~~~

~~~python:出力
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
~~~

---

## **2. エラーの種類**
Pythonにはさまざまな種類のエラーがあります。主なものを以下に挙げます。

1. **構文エラー（SyntaxError）**:
   - コードの文法が間違っている場合に発生します。
   - 例:
     ~~~python:例
     print("Hello   # クォーテーションマークが閉じられていない
     ~~~
   - エラーメッセージ例:
     ~~~python:出力
     SyntaxError: EOL while scanning string literal
     ~~~

2. **実行時エラー（RuntimeError）**:
   - プログラム実行中に発生するエラーです。
   - 例:
     - **ZeroDivisionError**: ゼロで割り算をした場合
     - **NameError**: 存在しない変数を参照した場合

3. **型エラー（TypeError）**:
   - 不適切な型の操作を試みた場合に発生します。
   - 例:
     ~~~python:例
     print("5" + 3)  # 文字列と数値の加算はできない
     ~~~
   - エラーメッセージ例:
     ~~~python:出力
     TypeError: can only concatenate str (not "int") to str
     ~~~

4. **インデックスエラー（IndexError）**:
   - リストや文字列の範囲外のインデックスにアクセスした場合に発生します。
   - 例:
     ~~~python:例
     lst = [1, 2, 3]
     print(lst[5])  # リストの範囲外
     ~~~

---

## **3. エラーを防ぐための方法**

### **1. エラーメッセージを確認する癖をつける**
- エラーメッセージには、問題の詳細と発生箇所が書かれています。
- まずはエラーメッセージを読み、それが何を意味しているかを考えます。

### **2. 例外処理を使う（`try-except` 構文）**
- プログラムの一部にエラーが発生しても、全体がクラッシュしないようにするために使用します。

#### **例**
~~~python:例
try:
    result = 100 / 0
except ZeroDivisionError:
    print("ゼロで割ることはできません。")
~~~

~~~python:出力
ゼロで割ることはできません。
~~~

### **3. 条件文でエラーを防ぐ**
- 条件文を使って、エラーの原因をあらかじめ排除します。

#### **例**
~~~python:例
denominator = 0
if denominator != 0:
    result = 100 / denominator
else:
    print("ゼロで割ることはできません。")
~~~

---

## **4. エラーを学ぶことの重要性**

1. **エラーは学びのチャンス**:
   - エラーは問題の手がかりを提供してくれます。
   - 解決するたびにプログラミングスキルが向上します。

2. **エラーを恐れない**:
   - プログラムにエラーが出るのは普通のことです。
   - 問題を解決する過程で成長できます。

3. **エラーの原因を「バグ」と呼ぶ**:
   - エラーの原因は「バグ（bug）」と呼ばれます。
   - 最初の「バグ」という言葉は、コンピュータ内に侵入した蛾が原因だったという有名なエピソードから来ています。

---

## **5. エラーを修正する: デバッグ（Debugging）**

### **デバッグとは？**
- プログラムに潜むバグを見つけて修正する作業のことを**デバッグ（debugging）**と呼びます。
- デバッグの際に役立つツールや技術も学ぶと効果的です。

### **デバッグの基本ステップ**
1. **エラーの内容を確認**:
   - エラーメッセージを読む。
2. **原因を特定**:
   - エラー箇所を探し、コードのどこに問題があるかを把握。
3. **解決策を実行**:
   - 必要な修正を加えて、プログラムを再実行。

---

## **6. まとめ**
- **エラーは問題を解決するための手がかり**です。エラーを恐れる必要はありません。
- **エラーメッセージを読む癖をつける**ことで、効率的にバグを修正できます。
- 例外処理や条件文を活用することで、エラーの発生を事前に防ぐことも可能です。

---
Pythonの文字列補完 (`format` メソッドと `f-strings`)


# Pythonの文字列補完 (`format` メソッドと `f-strings`)

Pythonでは、文字列に変数の値を埋め込む方法として、`format` メソッドや `f-strings` が利用できます。これらを使うと、ハードコーディングを避けながら柔軟な文字列操作が可能になります。

---

## **1. メソッドとは？**
- 文字列に様々な機能を付与する特定の操作を **メソッド** と呼びます。
- `format` メソッドは、文字列に変数や値を挿入するためのメソッドの一つです。

---

## **2. `format` メソッドの基本**
- `format` メソッドを使用すると、ハードコーディングを避け、変数の内容を文字列に挿入できます。


~~~python:例
hello = "konnnichiwa"
world = "sekai"
print("Message: {} {}".format(hello, world))
~~~

~~~python:出力
Message: konnnichiwa sekai
~~~

::: note info
ポイント: `{}` の中に、`format` メソッドで指定した値や変数が挿入されます。
:::

---

## **3. `format` メソッドの応用**
- 複数の変数を指定することも可能です。

~~~python:例
name = "Alice"
age = 25
print("My name is {} and I am {} years old.".format(name, age))
~~~

~~~python:出力
My name is Alice and I am 25 years old.
~~~

- **インデックス番号を指定**して値の順序を入れ替えることも可能：
~~~python:例
print("{1} and {0}".format("first", "second"))
~~~

~~~python:出力
second and first
~~~

---

## **4. f-strings**
- Python 3.6以降では、`f-strings` を使用することで、文字列補完がより簡潔に記述できます。

~~~python:例
hello = "konnnichiwa"
world = "sekai"
print(f"{hello} {world}")
~~~

~~~python:出力
konnnichiwa sekai
~~~

---

## **5. f-strings の応用**
- 変数や式を `{}` の中に直接記述できます。

### **例1: 式を埋め込む**
~~~python:例
x = 10
y = 20
print(f"The sum of x and y is {x + y}")
~~~

~~~python:出力
The sum of x and y is 30
~~~

### **例2: 小数点以下の桁数指定**
~~~python:例
pi = 3.14159
print(f"Pi rounded to 2 decimal places is {pi:.2f}")
~~~

~~~python:出力
Pi rounded to 2 decimal places is 3.14
~~~

::: note info
ポイント: f-strings は、シンプルで読みやすい記述ができるため、`format` メソッドよりも推奨されることが多いです。
:::

---

## **6. `format` メソッド vs f-strings**
- **`format` メソッド**:
  - どのPythonバージョンでも利用可能。
  - 長い文字列や複雑なフォーマットには便利。
- **f-strings**:
  - Python 3.6以降で使用可能。
  - シンプルで直感的な記述が可能。

---

## **7. まとめ**
- `format` メソッドや `f-strings` を使うと、変数や計算結果を簡単に文字列に挿入できます。
- f-strings はコードを短く、読みやすくするために推奨されます。
- プロジェクトに応じて、適切な方法を選びましょう。
UXを語る新しい共通言語: Core Web Vitals

ウェブサイトの成功を左右する鍵、それは「優れたユーザー体験」です。しかし、開発者、マーケター、ビジネスオーナーといった多様なステークホルダーが共通の目標に向かって足並みを揃えるのは決して簡単ではありません。そこで役立つのが、Googleが主導する取り組みの**Web Vitals**です。質の高いUXシグナルを提供するWeb Vitalsを活用すれば、ウェブサイトの体験を定量化し、改善すべきポイントをすべての関係者に明確に共有することができます。

本記事では、Core Web Vitalsの中からLCPに焦点を当て、その基本を簡単に復習します。また、後半では、エンジニアであるあなたがビジネスオーナーを含む関係者と協力しながら、ユーザー体験向上を実現するための具体的なアプローチを解説します。

## Core Web Vitals
### Core Web Vitalsとは
Core Web VitalsはWeb Vitalsのサブセットです:
- Largest Contentful Paint (LCP)
- Interaction to Next Paint (INP)
- Cumulative Layout Shift (CLS)

この3つはそれぞれ実環境 (フィールド) で測定可能であり、かつ、ユーザー中心の指標です。

:::note info
**注:** フィールド (実環境) データとラボラトリー (実験環境) データでは得られるインサイトが違います。使い分けには注意が必要です。
:::

### 実装方法

[公式ライブラリ](https://www.npmjs.com/package/web-vitals)を使うと、以下の様にJavaScriptに簡単に埋め込むだけで利用開始できます。

```javascript:index.js
import {onCLS, onINP, onLCP} from 'web-vitals';

function sendToAnalytics(metric) {
  const body = JSON.stringify(metric);
  // Use `navigator.sendBeacon()` if available, falling back to `fetch()`.
  (navigator.sendBeacon && navigator.sendBeacon('/analytics', body)) ||
    fetch('/analytics', {body, method: 'POST', keepalive: true});
}

onCLS(sendToAnalytics);
onINP(sendToAnalytics);
onLCP(sendToAnalytics);
```

## LCP
LCPはローディングパフォーマンスを測定します。この指標は、ページが読み込まれるまでの時間を、**画面上で最も大きな要素が描画されるまでの時間**と定義しています。

### ローディングパフォーマンスの捉え方
Googleはこれまでにも、ローディングパフォーマンスを測定するためのさまざまな指標を提案してきました。現在採用されているLCPは、Googleが膨大で緻密な研究を重ねた末に選んだ、非常に優れた指標です。ただし、これは現時点で最も現実的に多くのサイトで再現しやすいと判断された指標であることも理解しておく必要があります。

### カスタム指標
では、LCPが適切な指標ではない場合について考えてみましょう。例えば、ウェブサイトの初期画面の一番大きな要素に重要な情報が含まれていない場合、LCPはローディングパフォーマンスを再現しません。その場合、カスタム指標が効果的です。The Web Performance Working Groupが低レベルAPIを標準化しています。LCPでローディングパフォーマンスを計測できない場合は、[User Timing API](https://w3c.github.io/user-timing/)を使って、独自の指標を作ることをおすすめします。

## ステークホルダーへの発表と提案
パフォーマンス最適化の重要性をエンジニア以外の関係者に伝えることで、リソースを確保することができます。また、ビジネスへの貢献を適切に評価してもらうことができます。そのために、まずはCore Web VitalsでUXを定量化します。

### 課題の共有
仮に、あなたの組織のプロダクトのウェブサイトのLCPが50パーセンタイル (中央値) で2.5秒、75パーセンタイルで3.5秒だったとします。GoogleがGoodと定義するLCPは75パーセンタイルで2.5秒以下です。

ローディングパフォーマンス向上を組織として取り組む問題と認知してもらうために、以下の様に報告します。

**あなた**「私たちのウェブサイトのユーザーの2人に1人はページが読み込まれて読めるまでに2.5秒以上かかってしまっています。これは、業界標準では改善の余地がある数値です。このユーザー体験を改善すると、離脱者が減り、信頼が増し、売上やCTRなどのKPIが向上する可能性あります。そのために、私たち開発チームは改善施策を行います。」

:::note info
多様な関係者に伝えるため、専門用語を避けます。例: ローディングパフォーマンス→ページ読み込み速度。
:::

### 実績報告

#### 報告の仕方
施策でポジティブな結果が出たときは、必ず報告しましょう。すでに前の段階で、課題の共有をしているため、関係者は結果に関心を持ってくれているはずです。

**あなた**「半年前からページ読み込み速度が大幅に改善しました。現在、私たちのユーザーの4人に3人が2.5秒以下でページ読み込みできています。これは、Googleの定める基準でも優良とされる数値です。」

#### 理想的な実績と報告
パフォーマンス改善だけでなくビジネス貢献まで定量化するためには、戦略的なA/Bテストが必要です。パフォーマンス施策の前後で比較しても、様々な影響因子を排除しきれません。そのため、パフォーマンス施策の反映したソースコードと反映していないソースコードをランダムに選んだ2つのユーザーグループにそれぞれ露出させ、ビジネスKPIを比較するA/Bテストまで行えると理想です。そこまでできると、上の提案内容に一言ビジネス貢献の情報を追加できます。

**あなた**「ページ読み込み速度が大幅に改善しました。現在、私たちのユーザーの4人に3人が2.5秒以下でページ読み込みできています。これは、Googleの定める基準でも優良とされる数値です。開発チームの改善施策は3ヶ月で1.2億円の売上向上に貢献しました。」

:::note info
無機的な数字を想像しやすくする工夫はとても効果的です。例えば、パーセンタイルという統計用語を別の言い方にしてみます。つまり、「75パーセンタイルで2.5秒以下」を「4人に3人が2.5秒以下」と言い換えると直感的に想像しやすくなります。また、ユーザーの存在を想起させ、感情にも訴えられます。
:::

## Fast campusでオンラインコースが始まります

[ReactとWeb Vitalsを活用したウェブパフォーマンス最適化戦略](https://fastcampus.jp/products/dev_online_webpp)
Pythonのコメントの書き方


# Pythonのコメントの書き方

コメントは、コードの内容を説明したり、なぜそのコードを書いたのかを補足するために使用します。Pythonではシンプルな記述方法でコメントを追加することができます。

---

## **1. コメントの書き方**
- Pythonでは、`#` を使って1行コメントを書きます。
- コメントは実行されないため、コードの説明やメモとして使えます。

~~~python:例
# これはコメントです
print("Hello, World!")  # この行もコメントとして説明を追加
~~~

~~~python:出力
Hello, World!
~~~

---

## **2. コメントを書くときのショートカット**
- VSCodeでは、**⌘ + /** を使って選択したコードを一瞬でコメントアウトできます。
- ショートカットを使うことで、複数行のコメントも効率よく追加・解除できます。

---

## **3. 実際の開発でコメントを書く場面**
### **1. なぜそのコードを書いたのか説明する場合**
- 特定の処理の意図や目的を記述する。
~~~python:例
# この変数は商品の在庫数を保持する
stock_count = 100
~~~

### **2. わかりにくい処理を補足する場合**
- 複雑なロジックや、第三者が理解しづらいコードに補足を記述する。
~~~python:例
# リスト内包表記を使用して、偶数だけを抽出する
even_numbers = [x for x in range(10) if x % 2 == 0]
~~~

### **3. 一時的にコードを無効化する場合**
- テストやデバッグのため、一部のコードをコメントアウトする。
~~~python:例
# print("This line is commented out")
print("This line will run")
~~~

---

## **4. コメントを書くときの注意点**
### **1. 必要な場合にのみコメントを書く**
- **わかりやすいコードを書く**ことを優先し、必要最小限のコメントにとどめる。
~~~python:悪い例
x = 10  # xに10を代入する
~~~
- 上記のようにコメントが不要な場合は書かないようにする。

### **2. 読みやすいコメントを書く**
- 長すぎるコメントや曖昧な説明は避け、簡潔かつ明確に記述する。

---

## **5. コメントを書くべきコードの例**
- **プロジェクトの規模が大きくなる場合**
  - 他の開発者がコードを読んだときに、意図がわかるように補足する。
~~~python:例
# クライアントから要求されたレポートデータを生成する
def generate_report(data):
    # データをフィルタリングして、必要な情報だけを抽出する
    filtered_data = [item for item in data if item["active"]]
    return filtered_data
~~~

- **未来の自分へのメモとして**
  - なぜこのアプローチを取ったのか記録しておく。
~~~python:例
# このロジックはAPIの古い仕様に対応するために必要
response = legacy_api_call()
~~~

---

## **6. コメントが不要になる工夫**
- コメントを減らすために、コード自体をわかりやすく書く。
- **変数名や関数名を適切に命名する**ことで、コメントの必要性を最小限にする。

~~~python:コメント不要の例
# 悪い例
x = 10  # 価格を表す

# 良い例
price = 10
~~~

---

## **7. まとめ**
- コメントは「コードを補足する説明」として非常に重要です。
- ただし、コメントに頼りすぎず、コード自体をわかりやすく書くことを心がけましょう。
- ショートカット（例: **⌘ + /**）を活用すると、効率よくコメントを追加できます。

---
Pythonの比較演算子、is演算子、論理演算子について


# Pythonの比較演算子、is演算子、論理演算子について

Pythonでは、値の比較やオブジェクトの同一性を確認したり、複雑な条件を表現するために、さまざまな演算子を使用します。これらの演算子を理解することで、より柔軟で効率的なコードが書けるようになります。

---

## **1. 比較演算子（Comparison Operators / Relational Operators）**

比較演算子は、2つの値を比較して、その結果として **`True`** または **`False`** を返す演算子です。

- **`<`（小なり）**: 左辺が右辺より小さい場合に `True` を返します。
- **`>`（大なり）**: 左辺が右辺より大きい場合に `True` を返します。
- **`<=`（小なりイコール）**: 左辺が右辺以下の場合に `True` を返します。
- **`>=`（大なりイコール）**: 左辺が右辺以上の場合に `True` を返します。
- **`==`（等しい）**: 左辺と右辺が等しい場合に `True` を返します。
- **`!=`（等しくない）**: 左辺と右辺が等しくない場合に `True` を返します。

### **例:**
~~~python:例
a = 10
b = 5
print(a > b)  # True
print(a == b) # False
~~~

---

## **2. `is` 演算子**

**`is` 演算子**は、2つのオブジェクトが**同じオブジェクト**であるかどうかを判定します。同じオブジェクトを参照している場合に `True` を返します。特に、`None` の判定に使用されることが多いです。

- **`is`**: 2つのオブジェクトが同じメモリ位置を指しているかを確認します。
- **`is not`**: 2つのオブジェクトが異なるメモリ位置を指しているかを確認します。

### **例:**
~~~python:例
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a is b)  # False（異なるオブジェクト）
print(a is c)  # True（同じオブジェクト）
~~~

---

## **3. 論理演算子（Logical Operators）**

論理演算子は、条件式やブール値を使って、より複雑な論理的な条件を表現するために使用します。

- **`and`**: 両方の条件が `True` の場合に `True` を返します。
- **`or`**: いずれかの条件が `True` の場合に `True` を返します。
- **`not`**: 条件の真偽を反転させます。

### **例:**
~~~python:例
x = 5
y = 10
print(x > 3 and y < 20)  # True（両方がTrue）
print(x > 3 or y < 5)    # True（1つがTrue）
print(not(x > 3))        # False（反転）
~~~

---

## **4. オブジェクトとは？**

Pythonにおける**オブジェクト**は、変数に代入されるすべての値や、関数の引数として渡される値を指します。Pythonでは、すべてのデータがオブジェクトとして扱われます。例えば、整数、リスト、文字列、関数そのものもオブジェクトです。

### **オブジェクトの例**
- **整数**: `x = 5` → `5` はオブジェクトです。
- **文字列**: `name = "John"` → `"John"` はオブジェクトです。
- **リスト**: `my_list = [1, 2, 3]` → `[1, 2, 3]` はオブジェクトです。

Pythonでは、**すべての変数はオブジェクトへの参照**であり、実際にデータがメモリ上に格納されている場所（アドレス）を指し示しています。

### **オブジェクトの同一性**
- **`is` 演算子**を使うことで、2つの変数が**同じオブジェクト**を指しているかを確認できます。
  - 例: `x is y` は `x` と `y` が同じオブジェクトを指している場合に `True` を返します。

---

## **まとめ**

- **比較演算子** (`==`, `<`, `>`, `<=`, `>=`, `!=`) は、値の比較を行います。
- **`is` 演算子** は、オブジェクトの同一性を確認するために使用されます。
- **論理演算子** (`and`, `or`, `not`) は、条件式を組み合わせて論理的な判断を行います。
- **オブジェクト**は、Pythonにおける変数に代入されるすべての値を指し、すべてのデータがオブジェクトとして扱われます。

---
Amazon Bedrock Data Automation とは

:::note info
2024現在 プレビュー

2025年3月3日 GA
https://aws.amazon.com/jp/about-aws/whats-new/2025/03/amazon-bedrock-data-automation-generally-available/
:::


# 内容

AWS re:Invent 2024 で発表があった Amazon Bedrock Data Automation をシンプルに纏めます。

https://aws.amazon.com/jp/blogs/news/new-amazon-bedrock-capabilities-enhance-data-processing-and-retrieval/

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-data-automation-available-preview/

さまざまな形式のデータから、自動的に役立つ情報（インサイト）を引き出すことが可能になる


# 対応している形式のデータ

- ドキュメント 
- イメージ
- ビデオ
- オーディオ


# 標準出力とカスタム出力

|標準出力|カスタム出力|
|---|---|
|最初から用意されている「デフォルトのインサイト」を得られる|「ブループリント」を使って、細かく独自のインサイトや出力形式を指定して出力する<br>※プレビュー段階では、ドキュメントとメージのみ|
|(例)ドキュメントの要約、ビデオのシーン要約、オーディオの文字起こしなど|(例)自社専用の形式に整形した要約データを出力するなど|


# 対応リージョン

- 米国西部 (オレゴン)


# 動作確認

## ファイルを選択/アップロード

- サンプルデモを使う
- Upload from Computer
- S3 からインポート

から選択できるようですが、今回はどのような結果が表示されるのか確認するだけなので、とりあえず 「サンプルデモを使う」にしました。
[アセットのファイルタイプを選択] は「ドキュメント」にし、「Bank Statement」を選択し、「結果を生成」。
![スクリーンショット 2024-12-26 18.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e1f1117b-20c9-0592-7c18-abff761909f1.png)

## 結果を確認

### 標準出力

Configuration では標準出力の生成に利用された設定が表示されます。

![スクリーンショット 2024-12-26 18.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cc5eba8a-c177-1205-420e-10e0ed7af4d8.png)

Results で結果が確認できます。

![スクリーンショット 2024-12-26 18.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0a78d1bc-a260-9b42-354e-a5de55bcbaef.png)

![スクリーンショット 2024-12-26 18.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/53ab2073-3cc4-4277-6acd-794d44998ea2.png)

### カスタム出力

今回は、Bank-Statement というブループリントが利用されているようです。

![スクリーンショット 2024-12-26 18.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/023ac5c2-2ad2-2e40-3d19-2df15223f62d.png)

サンプルブループリントは編集できないようですので、「ブループリントを複製」して独自のブループリント「Bank-Statement-copy」を作成します。

![スクリーンショット 2024-12-26 19.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/dd64e340-7666-d2f6-70fc-a11a3aaab169.png)

独自のフィールドを追加したいので「フィールド」から「Add Field」。
![スクリーンショット 2024-12-26 19.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a75b609c-b215-7156-9f74-39cd3db2e031.png)

今回は住所を抽出したいので、[フィールド] に「address」、[指示]に「show address」と入力しておきます。
![スクリーンショット 2024-12-26 19.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/bac3a1b8-e72c-e884-7904-2a07a5637860.png)

[結果を出力]すると期待通り、住所が抽出されました。
![スクリーンショット 2024-12-26 19.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8b6ab686-d62c-2b01-7caa-d390498ab5bd.png)


# 今後

まだ、いまいちどのようなユースケースに利用したら良いか掴めきれていないので、GA されたらまた学習して移行と思います。
WebpackでConditional Exportsに対応しているパッケージをbundleするときに、意図的に別のconditionにする

Conditional Exportsに対応しているパッケージをWebpackでbundleする際に、Webpackは[target](https://webpack.js.org/configuration/target/)に合わせてconditionを選択します。

https://github.com/webpack/webpack/pull/10953

ただ、諸事情で特定のパッケージのみWebpackが自動で解決してくれるconditionとは別のconditionのコードに解決したい場合があります。

例）
Webpackのtargetが`web`になっているが、condition `browser`のコードに解決したくない。
代わりに`module.default`で解決したい。

```jsonc:とあるパッケージのpackage.json
{
  "name": "@ohakutsu/foobar",
  "exports": {
    ".": {
      "module": {
        "browser": "./dist/foobar.browser.esm.js",  // `browser`ではなく、
        "default": "./dist/foobar.esm.js"           // `default`をimportしたい
      },
      "import": "./dist/foobar.cjs.mjs",
      "default": "./dist/foobar.cjs.js"
    }
  },
  // ...
}
```

## 解決策（あまり積極的には使っていきたくない）

Webpackの[resolve.alias](https://webpack.js.org/configuration/resolve/#resolvealias)を駆使することで任意のconditionのコードで解決できるようになります。
別のconditionで解決したいパッケージ名をエイリアス名として、任意のconditionへのパスを渡す形になります。

```webpack.config.js
const path = require('path');

const packageName = '@ohakutsu/foobar';
const packageJsonFilePath = path.join(__dirname, 'node_modules', packageName, 'package.json');

module.exports = {
  //...
  resolve: {
    alias: {
      [packageName]: require(packageJsonFilePath)['exports']['.']['module']['default'],
    },
  },
};
```

上記のようなコードが増えると複雑度が増して意図せぬバグを引き起こす可能性があるので、あまりおすすめはしません。

## Ref

- [Package exports | webpack](https://webpack.js.org/guides/package-exports/)
- [package.json の imports / exports フィールド - 別にしんどくないブログ](https://shisama.hatenablog.com/entry/2020/12/21/090000)
AutoMLツールの種類と使い分け：プロジェクトに適した選択肢を見極める

近年、機械学習プロジェクトの効率化を目指すAutoML（Automated Machine Learning）の利用が急速に広がっています。AutoMLはデータの前処理、モデル選択、ハイパーパラメータ調整などの手間を大幅に削減し、データサイエンス初心者から専門家まで幅広く利用されています。本記事では、主要なAutoMLツールの特徴、強み・弱み、具体的なユースケースについて解説し、プロジェクトに最適なツールを選択するためのヒントを提供します。
※この記事は、ChatGPTの出力を基に作成しています。

---

## **主要なAutoMLツールの特徴と強み・弱み**

### 1. **PyCaret**
- **特徴**:
  - 簡単なAPIで初心者にも使いやすい。
  - モデルの比較や選択、前処理からデプロイまでを一貫してサポート。
- **強み**:
  - 初学者でも手軽に扱える。
  - 短期間でモデル性能を評価できる。
- **弱み**:
  - 高度なカスタマイズには不向き。
  - 大規模データの処理能力に限界がある。

---

### 2. **H2O.ai (H2O AutoML)**
- **特徴**:
  - 分散処理をサポートし、大規模データの処理に適している。
  - 幅広いアルゴリズムをサポートし、高精度なアンサンブルモデルを自動生成。
- **強み**:
  - 大規模データセットに対応。
  - 高精度なモデルが短時間で得られる。
- **弱み**:
  - モデル解釈性が乏しい場合がある。
  - 初心者には若干ハードルが高い。

---

### 3. **Google AutoML**
- **特徴**:
  - クラウドベースのツールで、画像や自然言語処理（NLP）など特化型タスクに強い。
  - 高性能クラウドリソースを利用可能。
- **強み**:
  - 画像認識やテキスト分類などの特定タスクで高い精度を発揮。
  - デプロイが容易。
- **弱み**:
  - クラウドに依存するため、コストがかかる。
  - オンプレミス環境では利用できない。

---

### 4. **Auto-sklearn**
- **特徴**:
  - Pythonエコシステムと連携しやすく、カスタマイズが容易。
  - 過去のデータから学習するメタラーニングを活用。
- **強み**:
  - カスタム評価指標の導入が可能。
  - 小規模データに適している。
- **弱み**:
  - 大規模データへの対応に限界がある。
  - 訓練時間が長くなる場合がある。

---

### 5. **TPOT**
- **特徴**:
  - 遺伝的アルゴリズムを用いてパイプラインを最適化。
  - 最適なパイプラインをPythonコードとしてエクスポート可能。
- **強み**:
  - 特徴量エンジニアリングの自動化。
  - 再利用可能なコード生成。
- **弱み**:
  - 探索に時間がかかることがある。
  - 非常に大規模なデータには不向き。

---

### 6. **Azure AutoML**
- **特徴**:
  - Azure Machine Learningと統合し、エンタープライズ向けの機能を提供。
  - 特に時系列予測に強い。
- **強み**:
  - クラウド統合がスムーズ。
  - 時系列データの解析能力が高い。
- **弱み**:
  - ランニングコストが高くなる可能性。
  - Azure依存性がある。

---

### 7. **Amazon SageMaker Autopilot**
- **特徴**:
  - AWS環境内でのモデル構築からデプロイまでを自動化。
  - モデルの説明性が充実。
- **強み**:
  - AWSのクラウドリソースをフル活用。
  - リアルタイム予測が可能。
- **弱み**:
  - AWSエコシステムへの依存。
  - 高度なカスタマイズには制約がある。

---

### 8. **FLAML**
- **特徴**:
  - リソース効率が高く、軽量設計。
  - カスタマイズ性が高く、小〜中規模データに特化。
- **強み**:
  - 高速・軽量で低コスト。
  - 時系列やNLPタスクにも対応。
- **弱み**:
  - 大規模データへの対応が限定的。
  - モデルの解釈性が他ツールに比べて劣る。

---

## **ユースケース別の使い分け方**

### 1. **初学者のデータサイエンス学習**:
- **おすすめツール**: PyCaret
- **理由**: 手軽に導入でき、データ分析プロセスを包括的に体験可能。

### 2. **大規模データの分析**:
- **おすすめツール**: H2O.ai
- **理由**: 分散処理対応で、大規模データセットでも効率的にモデルを構築。

### 3. **画像やテキストの特化型タスク**:
- **おすすめツール**: Google AutoML
- **理由**: 高度なディープラーニングモデルが簡単に利用できる。

### 4. **カスタム評価指標を使用するプロジェクト**:
- **おすすめツール**: Auto-sklearn / TPOT
- **理由**: 柔軟なカスタマイズ性とコードの再利用性。

### 5. **エンタープライズ向け時系列予測**:
- **おすすめツール**: Azure AutoML
- **理由**: エンタープライズ環境に適した時系列解析機能。

### 6. **リソースが限られた軽量プロジェクト**:
- **おすすめツール**: FLAML
- **理由**: 高速かつ軽量で、小規模データセットに最適。

---

## **まとめ**

AutoMLツールを選択する際は、プロジェクトの規模、目的、利用可能なリソース、データ特性を考慮することが重要です。それぞれのツールには得意分野があり、適切なツールを選ぶことで効率的かつ高精度なモデルを構築できます。本記事で紹介した特徴やユースケースを参考に、自分のプロジェクトに最適なAutoMLツールを選んでみてください。

--- 

### **関連リンク**
- [PyCaret公式ドキュメント](https://pycaret.org)
- [H2O.ai公式サイト](https://www.h2o.ai)
- [Google AutoML](https://cloud.google.com/automl)
- [FLAML公式GitHub](https://github.com/microsoft/FLAML)
IT未経験者が安全情報処理確保支援士受けてみた。難しい。。。

# 安全情報情報処理支援確保士試験受けてきました！

![IMG_6223.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971386/f6821b53-1f0c-c414-fbae-578c954a41d8.jpeg)


結果合格しました

基本的には問題に書いてあることをそのまま答えただけですので、午後は簡単でした。
ABC043C問題の微分を使ったO(N)解法

## はじめに ##
こんにちは。今回は[ABC043](https://atcoder.jp/contests/abc043)のC問題の解説をやっていこうと思います。
問題文 https://atcoder.jp/contests/abc043/tasks/arc059_a
## 解説 ##
公式解説では揃える整数を-100から100で全探索して最小コストを調べる、という解法でした。計算量は $O(N)$ ですが、-100から100で全探索しているので定数倍が重いです。
僕はこの問題を見た時に、ノートに数式を書きました。それをもとに解説していきます。
まず、最終的に揃える整数を $x$ とします。その時のコストの総和は、
```math
\sum_{i=1}^N (a_i - x)^2
```
と表せます。これを展開すると、
```math
\sum_{i=1}^N a_i^2 - 2a_ix + x^2
```
```math
=N*x^2 - 2x*\sum_{i=1}^N a_i + \sum_{i=1}^N a_i^2
```
となります。これは $x$ の二次関数となっています(以降 $f(x)$ と呼びます)。そして、 $1 \le N$なので $f(x)$ のグラフは下に凸です。よって、 $f(x)の極値 = f(x)の最小値$となり、 $f(x)$ の極値を求める問題になりました。(正確には、揃える数が整数の範囲しか動けないので、$f(x)の最小値(xは実数)=答え$とは<strong>限りません</strong>)
極値は $f'(x)$ ($f(x)$ の導関数)が $0$ となるような $x$ を $f(x)$ に代入した数です。さっそく微分していきます。
```math
f'(x)=2Nx - 2 * \sum_{i=1}^N a_i
```
となりました。これが $0$ になれば良いので、
```math
2Nx - 2 * \sum_{i=1}^N a_i = 0
```
```math
2Nx = 2 * \sum_{i=1}^N a_i
```
```math
x = \frac{1}{N}*\sum_{i=1}^N a_i
```
となり、これが$ f(x) $が最小になる $x$ です。ですが、先程述べた通り、 $f(x)の最小値(xは実数)=f(x)の最小値(xは整数)$ となるとは限らないので、 $x$ が実数の時の最適な $x$ から整数の時の最適な $x$ にする方法を考えましょう。
まず、実数の時の最適な $x$ が整数である時、整数の時も変わりません。
実数の時の最適な $x$ が有理数(自然数の和/自然数は有理数となるので)の時はどうすればよいでしょうか。結論から言うと、実数の時の最適な $x$ を小数表記した数を小数第一位で四捨五入した値が整数の時の最適な $x$ となります。詳しい証明はしません。
提出したコードはこちらです(ライブラリ無し)
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int cost(int a, int b) {
  int sa = a - b;
  return sa * sa;
}

int main() {
  int N;
  cin >> N;
  vector<int> a(N);
  ll sum = 0;
  for(int &o : a) {
    cin >> o;
    sum += o;
  }
  double x = (double)sum / N;
  ll cost_sum = 0;
  for(int o : a) {
    cost_sum += cost(o, sum / N + (x * 2 > sum / N * 2 + 1));
  }
  cout << cost_sum << endl;
}
```
22行目の $2x > 2*\frac{sum}{N}+1$ って何だ、と思う方へ
これは「整数の時の最適な $x$ は $\lfloor x \rfloor + 1$ か」の判定の式を移項してわかりやすくしたものです。(同じ意味ではないですが簡単にすると「$x$ を四捨五入した数を $X$ とした時、$x < X$ か?」の判定です)

計算量は公式解説と同じく $O(N)$ ですが、だいぶ定数倍が軽くなりました。($200$ 倍くらいから $3$ 倍くらいになった)
ABC043は試験管無し(知らない人はAtCoder ProblemsのABC001やARC001を見ましょう)になって2回目のコンテストなので、問題傾向は今と比べてかなり変わっていますが、数学を使って高速に解ける問題をまた解いてみたいです。
## おまけ ##
今回の問題の答えを出すものを関数グラフで作りました。
https://www.desmos.com/calculator/btsp3oo1sq?lang=ja
使い方
- Inという配列に入力を1つずつ入れてください。$N$ は入れなくていいです。
- 自動的に計算されて、グラフには $f(x)$ が、Outという数字には答え(最小コスト)が出力されます。
福岡出身システムエンジニア誕生記(フリーランスになるまで)

# はじめに

初めまして、自己紹介させていただきます。

1995年生まれ福岡出身フリーランスエンジニアです。
先日福岡に帰省して、いろいろ自分のこと振り返るの大切だなとおもい、
今回記事を書くことを決断しました。

普通の人間がフリーランスになって生活しているという一例をシェアできたらとおもいます。
誰かの参考になれば幸いです！

今回は社会人3年目前半について書いてみようと思います。

# 目次
少し細かく振り返りながら記載するので複数記事書く予定です！
##### ・学生~就活編⇒https://qiita.com/Yutajino/items/bf074102e254457af934
##### ・1年目前半編⇒https://qiita.com/Yutajino/items/37d0ab0cd64d063870b7
##### ・1年目後半編⇒https://qiita.com/Yutajino/items/a4f3ac0e4f6821a3b264
##### ・2年目前半編⇒https://qiita.com/Yutajino/items/fccb4ce3c38186d0eb3b
##### ・2年目後半編⇒https://qiita.com/Yutajino/items/ec6f2895e59343f255b0
##### ・3年目前半編⇒本記事
##### ・フリーランス~失敗編⇒完成次第リンク貼ります
##### ・失敗~現在編⇒完成次第リンク貼ります

# 複数プロジェクトの管理
所属していた部署の人数が少ないこともあったのですが、
ありがたいことに複数PJへ同時にアサインしていました。

保守対応0.1人月
開発案件0.3人月
PM案件0.5人月
その他もろもろ0.1人月(色々あったので0.2人月)
+
営業同行、見積もり資料作成

をやっていました。
1人月以上の動き方をしていたので、てんやわんやしていましたが、
意地でも残業したくないと思っていたので色々工夫していました。

同時並行で物事が進むので頭がパンクしていましたが、
この時期に意識していたのは即レスでした。
メッセージを溜め込まずにいかにその場で処理することで
仕事を溜め込まずに動くことができました。

また、PMとして大型案件を任されたことによって
毎日胃をキリキリさせながら仕事をしていました笑
正直、クリティカルな問題でなければ失敗してもなんとかなる精神を持って仕事に取り組んでいました。
技術力のある先輩が親身になってサポートしてくれたのも大きかったです。

PMや営業同行、見積もり資料の作成をしていると、
自分がいかに狭い視野で仕事をしているかを痛感させられることが多く刺激になりました。
開発者からの視点ではなく、
実際にシステムやサービスを利用するお客様の視点で
金銭面や、ニーズ、現場の声をリアルに聞くことができたからです。
開発に関しても、自分の作業がどこにつながっているのかをイメージしながら進めることができて
仕事がより楽しくなりました。

早いうちに、
ユーザーと積極的に会話して
自分が実施する開発、業務の先には
どんな成果が待っているのかを具体的に早くキャッチ、もしくはイメージできると
SEをより楽しめるかもしれません。

# 後輩への指導、教育
2年目の段階で1年目の新卒のOJTとして動いてましたが、
3年目はさらにレベルが上がって、
OJTの統括を任されました。

なかなかハードです。
新卒たちに気に入られるように振る舞おうと思いつつ(これは自分のエゴです)
甘くしすぎても舐められるし、
厳しくしすぎても、だめだし、
どう振る舞ったらいいかの試行錯誤をしていました。
試行錯誤している中、後輩から指摘されて恥ずかしい思いをしたりもしていました。

振る舞いや考え方など模範になる必要があるわけですが、
今でも思いますが、正直3年目だからと言って1年目の方に教えられることはそう多くなかったです。
自分が先輩から言われたアドバイスや視点を、先輩の言葉を借りてそのまま伝えていた節がありました。

ただ、アウトプットすればするほど新卒たちから意見を返された時に、より考えるきっかけになったり
そもそも説明するために、自分がその内容に納得しておく必要があると思っていたので
先輩に再度質問したりなど、
後輩と一緒に成長して、自分の知識を広げる大事な時間になりました。

3年目が終わる頃に、自分も少しは逞しくなったと思います。

2年目、3年目だろうが、
教育をするポジションの依頼が来たら
積極的に取ると自分の幅がひろがると思います！

# 振り返りながらふとおもったこと
正直、何か面白いことをやっていたとか、
特別なことをやっていたとかは今までないです。
コツコツやりながら知見広げて、目の前のことを丁寧にやってると
ある程度のことはできるようになるのかなと感じました。

自分はSQL、BIツールに特化して仕事をすることが多いですが、
プログラミングやWebデザインなど別のものを始めるにあたっても
遠回りをせずにコツコツやっていくのが一番なのかもしれないなと改めて思いました。

というか、Xなどで個人開発を実践されている方など拝見していて
努力量がすごいんだろうなと感じることが多いので、
自分も改めて頑張ります。

2025年はReact開発だ！
HTTPリクエストとソケット通信の違い

## はじめに
ネットワーク通信を行う際に、**HTTPリクエスト**と**ソケット通信**の2つの方法があります。それぞれの特徴や違いを簡単に比較してみましょう！

## 📚 基本の違い
### HTTPリクエスト
**・定義:** ウェブブラウザとウェブサーバー間でデータをやり取りするためのプロトコル。
**・用途:** ウェブページの表示、APIの呼び出しなど。
### ソケット通信
**・定義:** コンピュータ間で直接データを送受信するための低レベルな通信手段。
**・用途:** チャットアプリ、オンラインゲーム、リアルタイムデータの送受信など。

## 🔄 通信の仕組み
### HTTPリクエスト
**・リクエスト:** クライアント（例：ブラウザ）がサーバーに「データをください」と依頼。
**・レスポンス:** サーバーがリクエストに応じてデータを返す。
**・一時的な接続:** 通常、リクエストごとに接続が開かれ、終了する。
### ソケット通信
**・接続の確立:** クライアントとサーバーが常に接続を維持。
**・双方向通信:** 両者が自由にデータを送受信できる。
**・持続的な接続:** 一度接続すると、必要な時に何度でもデータを送れる。

## 🛠 主な特徴
### HTTPリクエスト
**・シンプル:** 高レベルのプロトコルで扱いやすい。
**・ステートレス:** 各リクエストは独立している（状態を保持しない）。
**・広く普及:** ウェブ全体で標準的に使用されている。
### ソケット通信
**・リアルタイム性:** 低遅延で即時にデータをやり取り可能。
**・双方向:** クライアントとサーバーが同時にデータを送れる。
**・柔軟性:** 独自のプロトコルを構築できる。

## ✅ 使い分けの例
### HTTPリクエストが適している場合
### ウェブページの読み込み
**・APIを通じたデータ取得・送信**
**・ファイルのダウンロード**
### ソケット通信が適している場合
**・チャットアプリケーション**
**・オンラインマルチプレイヤーゲーム**
**・リアルタイムの株価情報配信**

## ⚖️ 比較まとめ
| 特徴           | HTTPリクエスト                     | ソケット通信                         | 
| -------------- | ---------------------------------- | ------------------------------------ | 
| 通信モデル     | リクエスト-レスポンス型            | 双方向かつ持続的な接続               | 
| 接続の持続性   | 一時的（リクエストごとに開閉）     | 持続的（常時接続）                   | 
| リアルタイム性 | 低め（リクエスト毎の応答）         | 高め（即時のデータ送受信）           | 
| 実装の難易度   | 簡単（多くのライブラリが利用可能） | やや難しい（低レベルの操作が必要）   | 
| 使用例         | ウェブ閲覧、API通信                | チャット、ゲーム、リアルタイムアプリ | 

## 📝 まとめ
**・HTTPリクエスト**は、ウェブ上でのデータ取得や送信に最適で、扱いやすく広く利用されています。
**・ソケット通信**は、リアルタイム性や双方向通信が必要な場面で力を発揮し、柔軟なデータ交換が可能です。
用途や必要とする機能に応じて、適切な通信方法を選ぶことが大切です！

### 参考
https://qiita.com/megadreams14/items/32a3eed4661e55419e1c
SQL 明示的と暗黙的な結合

# はじめに
プログラマになり日々の仕事にあっぷあっぷですが
メモがてら書きます。

最近SQLを読むことが増えました！
その中で暗黙的な内部結合がされているのを目撃！
`INNER JOIN`で書いてくれないとわたしはわかんないよーてなったので

メモがてら記事にしておきます！

# SQLの内部結合
INNER JOIN（内部結合）は、複数のテーブルを結合するためのSQL構文で、指定した条件に一致するレコードのみを返す結合方法です。

![スクリーンショット 2024-12-26 183811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/e91a36ec-caa8-6534-0b9c-80be81f036bb.png)


この記事がわかりやすかったです↓※この記事から画像引用

https://qiita.com/Haruki-Sakamoto/items/a59da256a8b6fc0492be

内部結合には明示的と暗黙的があります。


### 明示的な内部結合
```明示的な内部結合.
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
```


### 暗黙的な内部結合
暗黙的な内部結合（INNER JOIN）は、SQL文で明示的にJOINキーワードを使用せずにテーブルを結合する方法です。この方法は、SQL標準のJOIN構文が導入される前から使用されていました。↓参照

https://docs.pingcap.com/ja/tidbcloud/dev-guide-join-tables

この構文では、FROM句で複数のテーブルをカンマで区切って指定し、WHERE句で結合条件を定義します。

```暗黙的な内部結合.
SELECT column1, column2, ...
FROM table1, table2
WHERE table1.column = table2.column;
```

### 明示的な外部結合
よく使用するのは、左外部結合です。
右外部結合もありますが、今回は省略します。
```明示的な内部結合（LEFT JOIN）.
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
```

### 暗黙的な外部結合
暗黙的な結合は、非推奨ではありますが外部結合もあります。
ここではOracleの例で記載します。
急に出てきてもびっくりしないようにしましょう！（私はびっくりしました）

https://kanido-luck.netlify.app/blog/2020/04/oracle-plus-notation-to-outer-join

```暗黙的な外部結合.
SELECT table1.column1, table2.column2
FROM table1, table2
WHERE table1.id = table2.id(+);
```


# おわりに
設計書と睨めっこな毎日です。。
`,`で暗黙的内部結合とか知らなかったので頭抱えました！
サブクエリとかありすぎで何が何だかわからんし…
引き続き頑張ります！
yum list 中の@（アットマーク）の意味

yum list 中に@（アットマーク）がありまして、
その意味を調べてみました。

man yum の内容確認してみました。

```shell-session
LIST OPTIONS
The following are the ways which you can invoke yum in list mode. Note that all list commands include information on the
version of the package.

OUTPUT

The format of the output of yum list is:

name.arch [epoch:]version-release repo or @installed-from-repo

Note that if the repo cannot be determined, "installed" is printed instead.
```
結論 → インストール済のものは　＠　が付いています。

検証：
検証環境は
サーバ　AWS EC2
OS Amazon Linux2

インストール済　Apache 2.4.46　
最新版　Apache 2.4.52

```shell-session
# yum list | grep httpd

httpd.x86_64 2.4.46-1.amzn2 @amzn2-core
httpd-filesystem.noarch 2.4.46-1.amzn2 @amzn2-core
httpd-tools.x86_64 2.4.46-1.amzn2 @amzn2-core

httpd.x86_64 2.4.52-1.amzn2 amzn2-core
httpd-filesystem.noarch 2.4.52-1.amzn2 amzn2-core
httpd-tools.x86_64 2.4.52-1.amzn2 amzn2-core
```

インストール済　無し
最新版　Apache 2.4.52

```shell-session
# yum list |grep httpd

httpd.x86_64 2.4.52-1.amzn2 amzn2-core
httpd-devel.x86_64 2.4.52-1.amzn2 amzn2-core
httpd-filesystem.noarch 2.4.52-1.amzn2 amzn2-core
```
AWS Lambda + Docker + Node.jsの開発環境を作った

# きっかけ

ある日、AWS ベースイメージを使用してLambda関数を作成していました。

```shell
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
```

で動作確認をしていると

- コンテナイメージをビルドし直さないと変更が反映されない
    - `VOLUME`が使えない？？？
- `console.log`で出力されない

というのが面倒だったので、
開発環境用にAWS Lambdaとは別にNode.js環境を作りました。

本番用には、通常通りAWS ベースイメージのDockerfileでビルドして、ECRにアップロードしたらよいので、簡単に切り分けられました。

# やったこと

## 開発環境用のDockerfileを作成

まず開発環境用にAWS ベースイメージとは別のDockerfileを作成します。
ファイル名は`Dockerfile.dev`としています。

```dockerfile:Dockerfile.dev
FROM node:20

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install
```

## 開発環境用のcompose.yamlを作成

ここで開発環境用のDockerfileを読み込んでます。
開発環境用の環境変数もここで読み込むようにすると楽だと思います。

```yaml:compose.yaml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    tty: true
    volumes:
      - .:/usr/src/app
    environment:
      ...
```

## 実行用シェルスクリプト作成

作成した関数を実行する用のシェルスクリプトを作成しました。動作確認用のパラメータをJSONファイルで渡せるようにしたり、

当時、コンテナイメージ内に複数の関数を持つようにしていたので、引数で対象のディレクトリを指定できるようにしました。

```shell:dev_run.sh
#!/bin/bash

# 引数で渡されたディレクトリを取得
TARGET_DIR="$1"

# 引数が指定されていない場合はエラーメッセージを表示
if [ -z "$TARGET_DIR" ]; then
  echo "Usage: $0 <directory>"
  exit 1
fi

FULL_PATH="$(pwd)/$TARGET_DIR"

# Node.jsスクリプトを実行 別ファイルに分けたっていい
node -e "
const path = require('path');
const fs = require('fs');

const handlerPath = path.join('$FULL_PATH', 'handler.js');
const jsonFilePath = path.join('$FULL_PATH', 'test_request.json');

let event = [];
if (fs.existsSync(jsonFilePath)) {
  const json = fs.readFileSync(jsonFilePath, 'utf8');
  event = JSON.parse(json);
}

const handler = require(handlerPath);

handler.handler(event).then(result => {
  console.log(result);
}).catch(err => {
  console.error(err);
});
"
```

# おわりに

これでサクサク動作確認ができるようになりました。

後はこれにテスト実行用のシェルスクリプトも作れば、さらに効率的に開発が進められると思います。

# 参考
- [コンテナイメージを使用した Lambda 関数の作成](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html)
- [Dockerfileを本番環境と開発環境で分けたいとき](https://abillyz.com/watanabe/studies/467)
【Laravel】Webアプリの開発について①

今回はWebアプリ版の開発について、記事にしていこうと思います。

# 環境
* Windows11
* VsCode
* Composer
* MySQL（phpMyAdmin）


# Web版アプリについて
Webアプリについては以下のとおりに作成します。
* お問い合わせフォーム拡張版
* REST
* バリデーション
* ダミーデータ
* ページネーション
* 簡易検索機能
* Modelやマイグレーションの作成
* Routeの作成
* Controllerの作成
* Viewの作成

# モデル・マイグレーションの作成

まずはモデル・マイグレーションの作成をします。
コマンドプロンプトを開き、下記コマンドでモデルとマイグレーションの作成をします。
```ruby:コマンドプロンプト
php artisan make:model ContactForm -m 
```
**-m**…でマイグレーションも同時作成
※マイグレーションファイルは複数形で生成
**make:model ContactForm**…モデルの作成
※モデルは単数系で生成

* ファイル生成の結果
```ruby:App\Modelsにて
ContactForm.phpが作成されている
```

* マイグレーション生成の結果
```ruby:App\database\migrationsにて
年月日_時間_create_contact_forms_tables.php
```
**contact_forms**…データベースのテーブルの名前

* マイグレーションのファイルの中身からテーブルのカラムを追加
```ruby:xxx_create_contact_forms.phpにて
public function up() 
    {   Schema::create('contact_forms', function (Blueprint $table) { 
            $table->id(); 
            $table->string('name', 20); // 氏名 
            $table->string('email', 255); // メールアドレス 
            $table->longText('url')->nullable();  // url null可 
            $table->boolean('gender'); // 性別 
            $table->tinyInteger('age'); // 年齢 
            $table->string('contact', 200); // お問い合わせ内容 
            $table->timestamps(); }); }
```
**stringメソッド**…指定された長さのVARCHARカラムを作成
**longTextメソッド**…LONGTEXTカラムを作成
**booleanメソッド**…BOOLEANカラムを作成
**tinyIntegerメソッド**…TINYINTEGERカラムを作成

コマンドプロンプトに戻り、マイグレートのコマンドをたたく
```ruby:コマンドプロンプト
php artisan migrate
```

phpMyAdminにて確認すると、contact_formテーブルが作成されており、カラム（列）が追加されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/9483ccb9-9183-1fa4-2845-a97eef0cc16e.png)
dayjsを使ってMM/DD (曜日)の出力ができた

## はじめに
nextJsを使った開発でハイフン区切りの日付を/区切りにしたり、０埋めするために
ソースコード上を眺めているときにdayjsを発見した。

## dayjsとは
日付、時間操作ができるライブラリ
操作後のオブジェクトを返してくれるので、本体を変更してしまう心配がない。
npm でインストールできるらしい。

## 曜日も変換してくれる
ロケーションを設定することで、７曜に変換できる。
```
import dayjs from 'dayjs';
import ja from 'dayjs/locale/ja';

dayjs.locale(ja);　//ロケーションの設定
dayjs('2011-01-01').format('ddd'); //　土曜日
```
## 形式変換が簡単かつ柔軟
YYYY/MM/DDだったりYYYY/M/Dができる。

```
import dayjs from 'dayjs';
import ja from 'dayjs/locale/ja';

dayjs.locale(ja);　//ロケーションの設定
dayjs('2011-01-01').format('YYYY/MM/DD'); //　2011/01/01
dayjs('2011-01-01').format('M/D');  // 1/1
```
## dayjsでできたこと
MM/DD (ddd)の形式で出力できた。すごい


```
import dayjs from 'dayjs';
import ja from 'dayjs/locale/ja';

dayjs.locale(ja);　//ロケーションの設定
        dayjs('2011-01-01').format('MM/DD (ddd)'); //　01/01 (土)

```
Jaccard係数(Jaccard index)をPythonで計算する

Jaccard係数(Jaccard index、Jaccard similarity coefficient)とは、二つのデータセット間の類似度を測る指標です。 値の範囲は0〜1です。1に近いほど、二つのデータセットは類似しています。

Pythonで計算する：

```python
a = ["apple", "orange", "banana"] 
b = ["orange", "strawberry", "apple", "banana"] 

def jaccard_sim(a, b): 
    s1 = set(a) 
    s2 = set(b) 
    return float(len(s1.intersection(s2)) / len(s1.union(s2))) 

result = jaccard_sim(a, b) 
print(result) # 結果: 0.75
```

scikit-learnで計算する：

```python
from sklearn.metrics import jaccard_score 
from sklearn.feature_extraction.text import CountVectorizer 

corpus = [ "apple orange banana", "orange strawberry apple banana" ] 
X = CountVectorizer().fit_transform(corpus) 
arr = X.toarray() 
result = jaccard_score(arr[0], arr[1]) 
print(result) # 結果: 0.75 
```