OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Certified Machine Learning Engineer Associate合格の雑談

**:congratulations:2025年2月13日に AWS Certified Machine Learning Engineer - Associate（MLA）が合格し、併せて Early Adopter バッジもゲット！:congratulations:**

<font color="Gray">$\tiny{→Early Adopter が欲しいのでわざわざ 2/15 前に受験しました🌝}$</font>

![Picsew_20250221111644.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236892/f961107e-d3ee-43a6-948f-7a438961ef5d.jpeg)

今回もあんまり長い記事を書きたくないので、雑談にしましょう:relaxed:

# はじめに🎑
以前の記事の通り、[SAP](https://qiita.com/nakamurahiro/items/948a833717e836527046) と [DOP](https://qiita.com/nakamurahiro/items/3b96e1b34f0a2493eab2) が合格したことがあります。

# 採点について:white_flower:
:100:満点は1000点、:u5408:格は720点です。筆者は874点をとりました🎉　SAP と DOP の時と比べると**高い点数**です。（SAP：764、DOP：788）

# 試験内容について:bow:
現在早期段階では65問、140分の回答時間です。
Early Adopter を取得するため、勉強時間はちょっと厳しかったので、急いでSageMakerの組み込みアルゴリズムなど、細かい点をいっぱい見ましたが、結局ほとんど出題されなかったです。
全体としては、<INS>「微積分みっちり勉強したのに、テストじゃ中学生レベルの連立方程式が出題される始末だ」</INS>という感覚で、想像より簡単でした。
85分で一回目の回答ができて、「後で見る」マークは２つだけをつけました。母語は英語ではない人の30分延長も含めて、ちょうど半分の時間を残し、85分のチェック時間がありました。
でもじっと考えると、理屈が通じるではないでしょうか、MLA はあくまでも中級テストだけですもんね、SAP や DOP の難しさはないのが当然です。

実際の内容にいたしては、Machine Learning は半分くらいだけの感覚で（少なくない？と）、他の半分は Solutions Architect Associate と DevOps Engineer Associate の内容ですね。そのため、「はじめに」はこんな背景があるよと書きました。


# 勉強法＆参考資料📓
筆者は AI の素人なので、Udemy で基礎のコースから勉強しました。ちょうど１ヶ月の準備時間でした。
あとは Claude AI ですね、いつでもどこでも分からない部分を何でも聞いて理解までやりました。今の AI 時代では、これが一番魅力的なことですね、誰の側にも素晴らしい「専門家」がいて、いつでも聞かれます👾
<ins>でも注意して欲しいのは、AI のハルシネーションですね🤖</ins>

* Stephane Maarek AIF-C01 コース（全部見終わりました）

https://www.udemy.com/share/10bvGH3@WRWyrzmR7O9KVWvDLrwUk2sgeWHPeTYHxinj5WDB9tcb7zXhfRPWv4l62yT39TL4wQ==/

* Frank Kane と Stephane Maarek MLA-C01 コース（自分の判断で一部だけ見ました）

https://www.udemy.com/share/10bEa73@vOkXQ3tZdg6EA6jgiDNy2gvMolZ8mr0oAEUfidOSBJO79gjsT579X3wUTHzmnqa8_Q==/

* 問題集（全部やりました）

https://www.udemy.com/share/10bH3B3@t0akK641dpHSJ6OK7nJq026P7u12klpET3N2v1jzT4VIYPBoRCp50xSbh5KoPgHE-A==/

# 終わり:tokyo_tower:

MLA は あくまでも中級レベルの資格なので、DOP と SAP レベルの難しさはありません。安心してストレス少なめで準備しましょう。

**最後に皆さんは合格できるように、Good Luck！🍀**
この住所、読めますか？ 難読地名チャレンジ！

## 🏠 はじめに
日本には「難読住所」と呼ばれる、読み方が難しい地名が数多く存在します。
例えば、「寒河江市」は何と読むでしょうか？「さむかわえし」ではなく、正解は「さがえし」です。

こうした難読住所の読み方を紹介するサイトはありますが、「実際にどの場所なのか地図で確認できる」サービスはあまり見かけません。
そこで、ZENRIN Maps API を活用し、クイズ形式で楽しく学べるWebアプリ を作成しました！
クイズに答えると、その住所の場所が地図上に表示されます。
[ZENRIN Maps APIは２か月お試し無料です！](https://www.zenrin-datacom.net/solution/zenrin-maps-api/trial?fm_cp=6757baf3203e3a00bb118509&fm_mu=67638f4de0aa71040d3aa16d&utm_campaign=6757baf3203e3a00bb118509&utm_medium=else&utm_source=Qiita2)

## 🎯 アプリの概要
このアプリでは、以下の機能を提供します。

✅ 難読住所クイズ：複数の選択肢から正しい読み方を選ぶ
✅ 地図表示：正解すると、その住所の位置を地図上に表示
✅ ZENRIN Maps API 活用：住所検索と位置情報の取得をAPI経由で実現

## 🔥 実際に動かしてみよう
実際にクイズを楽しめます。
実際の動作は、以下のデモをご覧ください。
[YomiMap（読みマップ）](https://goldiek24.github.io/address_quiz/zma_address_quiz.html)
![zma_address_quiz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965389/5c3cb5b2-cfbb-4230-89cf-2925c76715c9.png)


## 🛠 開発の流れ
#### 1. クイズデータの作成
まず、難読住所クイズのデータを用意しました。JavaScriptのオブジェクト配列として、住所名とその選択肢を定義しています。

```javascript
const quizData = [
    { question: "「鶇巣町」の読み方は？", options: ["つぐすちょう", "とうのすちょう", "うぐいすちょう"], correctAnswer: "とうのすちょう" },
    { question: "「神戸町」の読み方は？", options: ["ごうどちょう", "こうべちょう", "かんどちょう"], correctAnswer: "ごうどちょう" },
    ...
];
```

#### 2. クイズ画面の作成
ユーザーが選択肢をクリックできるよう、HTMLとCSSでクイズのレイアウトを作成しました。
```html
<div id="quiz-container">
    <h2>問題 1</h2>
    <p>「鶇巣町」の読み方は？</p>
    <div class="button-group">
        <button onclick="checkAnswer('つぐすちょう')">つぐすちょう</button>
        <button onclick="checkAnswer('とうのすちょう')">とうのすちょう</button>
        <button onclick="checkAnswer('うぐいすちょう')">うぐいすちょう</button>
    </div>
</div>
```

#### 3. ZENRIN Maps API を使った地図表示
クイズに正解したら、その住所の位置を地図上に表示します。
ZENRIN Maps API を利用して、住所を検索し、緯度経度情報を取得して地図を更新します。
```javascript
async function searchAddress(address) {
    const response = await fetch('https://test-web.zmaps-api.com/search/address', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'x-api-key': 'YOUR_API_KEY',
            'Authorization': 'referer'
        },
        body: new URLSearchParams({ word: address, word_match_type: '3', address_level: 'SHK,OAZ', sort: 'address_read' })
    });

    const data = await response.json();
    if (data.status === "OK" && data.result.info.hit > 0) {
        const location = data.result.item[0].position;
        const latLng = new ZDC.LatLng(location[1], location[0]);
        map.setCenter(latLng);
    } else {
        alert("住所の位置情報が見つかりませんでした");
    }
}
```
## 🚀 今後の展望
**問題の追加：** さらに多くの難読住所を追加して、全国の地名を網羅
**難易度設定：** 簡単な地名から超難読地名までレベルを分ける
**スコア機能：** 連続正解数やタイムアタック機能の追加
ZENRIN Maps API を活用すれば、より高精度な地図情報と組み合わせた学習コンテンツが作れます。
ぜひ皆さんも、APIを活用して面白い地図アプリを作ってみてください！

📢 ご意見・感想をコメントでお待ちしています！
JabRef の LibreOffice 向け新しい CSL 統合

# JabRef の LibreOffice 向け新しい CSL 統合

version6だとだいぶできることが増えて楽になりました。いぜんはMicrosoft Wordで類似のことをやろうとしてましたが、いろいろと難しい部分があったため、こちらはとても楽でいいです

Version６は、ステーブルではないので、インストールは自己責任なんでしょうね？そのうちステーブルになるでしょう

# さらなる機能

さらに、CSLスタイルも使用できるようになりました。そのため、お好みのジャーナルスタイルを簡単に実装できるようになりました。

# 具体的な方法

具体的な使い方については以下のブログをご参照ください。

https://blog.jabref.org/2024/08/26/GSoC-CSL/

# 使えそうな範囲

WordもしくはLaTeXで出してねっていう場合以外は、OKだと思います。各種コンバーターを使うとWordにも変換できるかもしれません。ただ、LibreOfficeを閉じて保存するときにWordを選んでしまうと、参考文献リストが変なことになってしまうみたいなことが書いてありましたので、そこは注意したほうがいいですね。PDFで最後提出する場合はいいでしょうね。

# 最後に

これは素晴らしい追加機能です。CSL (引用スタイル言語) スタイルを使用できることにより、参照の書式設定のカスタマイズと精度がさらに高まります。ジャーナル スタイルの実装は、手動で微調整することなく、ドキュメントが特定の出版基準を満たすように簡単に実行できるようになりました。

この新機能が特に役立つプロジェクトとはなんでしょうか？みなさんが取り組んでいますプロジェクトに役立ちそうですか? ご意見ご感想を詳しくお聞かせください。
情報系専門学生がインフラエンジニアを目指して学ぶ日々



# はじめまして！
情報系の専門学校に通っている学生です。現在、インフラエンジニアを目指して勉強中で、日々試行錯誤しながら成長しています。

# なぜインフラエンジニアを目指すのか？

エンジニアといえば、アプリ開発やWeb開発をイメージする人も多いですが、私は「システムを支える基盤」に興味を持ちました。サーバーやネットワークがなければ、どんなに優れたアプリケーションも動きません。そんな縁の下の力持ち的な役割に魅力を感じ、インフラエンジニアを志すようになりました。

### 発信していくこと

せっかく学んだことを自分の中だけに留めるのはもったいない！ということで、この場を通じて学習の過程や気づきを発信していきます。

#### 1. Linuxのトライ＆エラー

インフラエンジニアにとってLinuxの知識は必須。実際にコマンドを試してみたり、設定をいじったりする中で遭遇した問題やその解決策を共有していきます。

#### 2. コーディング時のバグ、その解消

インフラだけでなく、授業内で学んでいる言語(Java,C,Python等)のプログラミングに関するバグやエラーにも向き合っています。エラーにぶつかった時の解決プロセスを記事にすることで、同じ問題に悩む人の助けになればと思っています。

#### 3. Dockerを使用し学んだこと（

コンテナ技術は今や欠かせないスキル。Dockerを使って学んだことや、実際に試してみたことを発信していきます。

# これからの目標

知識を深めるだけでなく、アウトプットを増やしていくことが目標です。学んだことを発信することで、知識の整理にもつながると考えています。同じくインフラに興味がある人と交流しながら、成長していけたら嬉しいです！

これからよろしくお願いします！っ旦
AWS Lambdaで躓きやすいポイントを徹底解説：中級者向け

## はじめに

AWS Lambdaは、サーバーレスアーキテクチャを構築するための強力なサービスです。しかし、実際に使い始めると、設定やデプロイ、パフォーマンス最適化などで躓くことが多いのも事実です。本記事では、AWS Lambdaを中級者向けに深掘りし、よくある落とし穴とその解決策を詳しく解説します。

## 1. Lambdaの基本構造と実行環境

### 1.1 ハンドラー関数の構造
AWS Lambdaでは、エントリーポイントとなる「ハンドラー関数」を定義します。ハンドラーの構造は言語ごとに異なりますが、Pythonの場合は以下のようになります。

```python
def lambda_handler(event, context):
    # イベントの内容をログ出力
    print("Received event:", event)
    
    # メイン処理
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
```

### 1.2 実行環境と制限
Lambdaにはいくつかの制限があります。

- **最大実行時間**：15分
- **メモリサイズ**：128 MB〜10,240 MB
- **ディスク容量（/tmp）**：512 MB
- **同時実行数**：デフォルトで1000

**躓きポイント**：
- 実行時間の制限により、長時間実行するバッチ処理などは適さない。
- /tmpディレクトリを活用して一時ファイルを扱うことが可能だが、容量制限に注意。

## 2. デプロイとパッケージングの課題

### 2.1 依存関係のパッケージング
Lambdaに外部ライブラリを含める場合、正しい方法でパッケージングする必要があります。

#### **ローカルでのパッケージング（Pythonの例）**

```bash
mkdir lambda_package
pip install requests -t lambda_package/
cp lambda_function.py lambda_package/
cd lambda_package
zip -r ../lambda_deploy.zip .
```

#### **AWS Lambda Layersの活用**
Lambda Layersを使うと、共通の依存ライブラリを複数の関数で共有できます。

**躓きポイント**：
- Layerのサイズ制限（最大250MB）に注意。
- ランタイムと互換性があるか確認。

### 2.2 デプロイ方法

- **AWS CLI**
```bash
aws lambda update-function-code --function-name my-function --zip-file fileb://lambda_deploy.zip
```

- **AWS SAMやServerless Frameworkの活用**
これらのツールを使うと、テンプレートベースでインフラとコードを管理できます。

## 3. 環境変数とシークレットの管理

Lambdaでは環境変数を使って設定を管理できますが、機密情報を扱う際はAWS Secrets ManagerやAWS Systems Manager Parameter Storeを使うのが推奨されます。

```python
import os

def lambda_handler(event, context):
    secret_key = os.environ['SECRET_KEY']
    print(f"Secret Key: {secret_key}")
```

**躓きポイント**：
- 環境変数の暗号化オプションを利用してセキュリティを強化。
- IAMポリシーでSecrets Managerへのアクセス権限を適切に設定。

## 4. パフォーマンス最適化

### 4.1 コールドスタート問題
Lambda関数が初回実行やスケールアウト時に遅延することがあります。

**解決策**：
- **Provisioned Concurrency** を利用して常に一定数の関数をウォーム状態に保つ。
- 軽量なライブラリを使用して初期化処理を最小限に抑える。

### 4.2 メモリと実行時間の最適化
Lambdaの料金は実行時間と割り当てたメモリに基づきます。

**最適化のコツ**：
- メモリを増やすとCPUパワーも向上し、結果として実行時間が短縮される場合があります。
- CloudWatch Logsで実行時間とメモリ使用量をモニタリングし、適切なメモリ設定を見極めましょう。

## 5. ロギングとモニタリング

Lambdaの実行結果やエラーはCloudWatch Logsに出力されます。

```python
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info("Lambda function started")
    return {"statusCode": 200, "body": "Success"}
```

**躓きポイント**：
- ログの出力量が多すぎるとCloudWatchの料金が高騰する可能性がある。
- X-Rayを有効化してパフォーマンスのボトルネックを可視化。

## 6. よくあるエラーとトラブルシューティング

### 6.1 タイムアウトエラー
- **原因**：処理が設定したタイムアウト時間を超える。
- **対策**：タイムアウト設定を見直し、適切な時間を設定。または、処理を分割して短時間で完了するように設計。

### 6.2 権限エラー（Access Denied）
- **原因**：IAMロールに適切な権限がない。
- **対策**：最小権限の原則に従い、必要な権限を付与したIAMロールを設定。

### 6.3 パッケージングエラー
- **原因**：依存ライブラリが正しく含まれていない。
- **対策**：パッケージング手順を再確認し、ローカルでの実行確認を行う。

## まとめ

AWS Lambdaは柔軟で強力なサービスですが、設定やデプロイ、パフォーマンス最適化において多くの落とし穴があります。本記事で紹介した躓きやすいポイントとその解決策を押さえておくことで、より安定したサーバーレスアーキテクチャを構築できるでしょう。

Lambdaの理解をさらに深め、実践で活用していきましょう！
MLflowの便利さを徹底解説：実際のコード例付き



## はじめに

機械学習のプロジェクトを進める中で、モデルの実験管理や再現性の確保に課題を感じたことはありませんか？MLflowは、そんな課題を解決するために開発されたオープンソースのプラットフォームです。本記事では、MLflowの便利な機能を詳細に解説し、実際のコード例を交えながらその活用法を紹介します。

## MLflowとは？

MLflowはDatabricks社によって開発されたオープンソースの機械学習ライフサイクル管理ツールです。以下の4つの主要な機能を提供します。

1. **MLflow Tracking**：実験の記録と比較を容易にします。
2. **MLflow Projects**：プロジェクトの再現性を確保します。
3. **MLflow Models**：様々な形式でモデルをパッケージングできます。
4. **MLflow Registry**：モデルのライフサイクル管理をサポートします。

## なぜMLflowが便利なのか？

### 1. 実験の記録と比較が簡単（MLflow Tracking）

機械学習の実験では、ハイパーパラメータやモデルのバージョン、評価指標などを記録する必要があります。MLflow Trackingを使えば、これらを簡単に記録し、後で比較できます。

#### コード例

```python
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの準備
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=42
)

# MLflowで実験開始
with mlflow.start_run():
    # モデルの訓練
    clf = RandomForestClassifier(n_estimators=100, max_depth=3, random_state=42)
    clf.fit(X_train, y_train)

    # 予測と評価
    y_pred = clf.predict(X_test)
    acc = accuracy_score(y_test, y_pred)

    # パラメータとメトリクスの記録
    mlflow.log_param("n_estimators", 100)
    mlflow.log_param("max_depth", 3)
    mlflow.log_metric("accuracy", acc)

    # モデルの保存
    mlflow.sklearn.log_model(clf, "random_forest_model")

print(f"Accuracy: {acc}")
```

### 2. 再現性の確保（MLflow Projects）

MLflow Projectsを利用すると、依存関係や環境を含めたプロジェクト全体を再現可能な形で定義できます。

#### `MLproject` ファイルの例

```yaml
name: RandomForestExample

conda_env: conda.yaml

entry_points:
  main:
    parameters:
      n_estimators: {type: int, default: 100}
      max_depth: {type: int, default: 3}
    command: >
      python train.py --n_estimators {n_estimators} --max_depth {max_depth}
```

### 3. モデルのパッケージング（MLflow Models）

MLflow Modelsを使えば、訓練したモデルを異なるフレームワークに対応した形式で保存・配布できます。

#### モデルの保存とロード

```python
# モデルの保存
mlflow.sklearn.save_model(clf, "./model")

# モデルのロード
loaded_model = mlflow.sklearn.load_model("./model")
y_loaded_pred = loaded_model.predict(X_test)
```

### 4. モデルのライフサイクル管理（MLflow Registry）

MLflow Registryを使うと、モデルのバージョン管理やステージ管理（例えば「Staging」「Production」）ができます。

#### モデルの登録

```python
import mlflow.pyfunc

# モデルの登録
result = mlflow.register_model(
    "runs:/<run_id>/random_forest_model", "IrisClassifier"
)

# モデルのステージ変更
from mlflow.tracking import MlflowClient

client = MlflowClient()
client.transition_model_version_stage(
    name="IrisClassifier", version=result.version, stage="Production"
)
```

## まとめ

MLflowを活用することで、機械学習プロジェクトの管理が飛躍的に効率化します。実験の追跡、再現性の確保、モデルのパッケージング、そしてライフサイクル管理と、機械学習の各プロセスを一元的に管理できる点が最大の魅力です。

これからMLflowを導入しようと考えている方は、ぜひ今回紹介したコード例を参考にしてみてください。
【Flet】よく使うクラス・プロパティ・メソッドまとめ【Python】

仕事でスクリプトを作成した際に、一緒にPythonのFletライブラリでスクリプト実行用の簡単なUIを作ることが多々あります。

以下に、FletでのUI作成にて使用頻度が高いなぁって思った __クラス・インスタンス化の例・プロパティ・メソッド__ をまとめましたので、よかったらご参照ください。

細かい説明（UIの構築、処理部との結合）等はまた別の記事として投稿します。
かといってリストだけ書いてバイバイも味気ないので、Fletの初期設定用レシピコード（Fletを使用する際のおまじない）を最後に記載します。

---

###### ■ クラス・インスタンス化の一例

| クラス | 役割 | インスタンス化の一例 |
|:-:|:-:|:-:|
|  Page |  ページ全体（必須） | main(page: ft.Page)  |
| Container  | ボックス要素  | container = ft.Container(content=ft.Image("cute_cat.png"))  |
|  Text | テキストの表示  | text = ft.Text("Bow wow Tool")  |
|  ElevatedButton |  立体的なボタンの作成 |  button = ft.ElevatedButton("Click", on_click=func) |
| Column  |  縦並びに配列 | column = ft.Column([ft.Text("Item")])  |
|  Row | 横並びに配列  |  row = ft.Row([ft.Text("Left")]) |
|  TextField |  入力欄の作成 | text_field = ft.TextField(label="What's your favorite song?")  |
| Image  | 画像の表示  |  image = ft.Image(src="so_cute_dog.png") |
| FilePicker  |  ファイル選択 | file_picker = ft.FilePicker()  |
| Checkbox  | チェックボックス  | checkbox = ft.Checkbox(label="Accept drinking party")  |
| Switch  |  ON/OFFスイッチ |  switch = ft.Switch(value=True) # valueにてデフォルト値の設定 |
|  Dropdown | ドロップダウンメニュー  | dropdown = ft.Dropdown(options=[ft.dropdown.Option("Beer"),  # 要カンマ区切りft.dropdown.Option(“Highball“)])  |


###### ■ プロパティの一例

| プロパティ | 説明 |
|:-:|:-:|
| content  | Containerインスタンス内にて、複数のインスタンス・プロパティを保持する  |
|  src | 画像のURLまたはローカルパスを指定する  |
|  width | 表示の幅（ピクセル単位）  |
|  height |  表示の高さ（ピクセル単位） |
| fit  | 画像の表示領域にフィットさせる（例: ft.ImageFit.CONTAIN, ft.ImageFit.COVER）  |
| alignment  | 配置を指定する（例: ft.alignment.center）  |
| bgcolor  |  背景色を設定する |
|  padding | UI内側に余白を設定する（pixel単位）  |
|  scale | 画像の拡大・縮小率  |
| visible  | 画像を表示・非表示にする（True / False）  |
| on_click  | クリック時のイベントハンドラーを指定（関数をコールする、ファイル選択ポップアップを出す等）  |
|  on_hover | ホバー時（マウスカーソルが指定領域に乗った時）のイベントハンドラーを指定（画像拡大する等）  |



###### ■ メソッドの一例

| メソッド | 説明 |
|:-:|:-:|
|  update() |  UIの変更を即時反映（必須） |
| add()  | PageやColumnに要素を追加 （必須）  |
|  remove() |  PageやColumnから要素を削除 |
| clean()  |  指定した要素を削除 |
|  insert() | 指定した位置に要素を挿入  |
| show()  |  要素を表示（visible=Trueと同じ） |
| hide()  | 要素を非表示（visible=Falseと同じ）  |
| toggle()  | visible(bool)を切り替える（表示・非表示をワンタップで切り替え）  |
|  open_dialog() |  ダイアログを開く （ユーザーに処理を実行していいか確認を求めるときなど） |
|  close_dialog() |開いているダイアログを閉じる（ユーザーの操作が終わった後など）   |
|  launch_url() |   Webページを開く（例：on_click=page.launch_url=”https://wancolab.com/breed/ ”)|

---
 
###### ■ Fletの初期設定用レシピコード


```Python:python
import flet as ft

class UIName:
    def __init__(self, page: ft.Page):
        """Args:
            page (ft.Page): Fletのページオブジェクト（UIのルート要素）
            JsonImgEditUIクラスのインスタンスの初期化
        """
        self.page = page
        #--- ここからUIの詳細な設定 ---#
        self.page.width = 100
        self.page.height = 100
        self.example_text = ft.Text("Test")
      
        self.page.add(
            ft.Row(
            self.example_text)
            
def main(page: ft.Page): # 実行
    UIName(page)
    
if __name__ == "__main__":
    ft.app(target=main)
```

---

###### ■ 詳しくは公式ドキュメントで

クラスやメソッド、プロパティについてのより詳細な情報・使用法は公式ドキュメントをご参照ください。
https://flet.dev/docs/ 

おわり
データエンジニア初心者日記（１）

## 今日の勉強内容
今日はおうちで学べるデータベースのきほんを読みました。
4章まではデータベースやシステムそのものについての基礎知識的なものでしたが、
5章からMySQLのインストールがあるのですが、Macbookでインストールする際に使用するHomebrewの状態を綺麗にするのに手間取りました、、
今回はその対応の一部始終です。

#### インストールするために実施したこと
MacbookではHomebrewを使ってインストールするのですが、
昔インストールしたHomebrewのメンテナンスをしていなかったせいか権限がないなど色々なエラーが表示されたので、
brew doctorで状態を確認しました。

##### 環境
macOS Sequoia 15.3.1
Homebrew 4.0.16→4.4.21

##### 警告１：directories are not writable
うろ覚えですがこのようなメッセージが出たので、言われるがままその後に記載されていたsudoコマンドを
入力。

##### 警告２：No Cask quarantine support available: unknown reason.
これはchatGPTに聞いてみました。
まず、Homebrewを最新版にしましょう、ということだったのでbrew updateを入力。
しかし権限がないことから、エラーと表示されたため、sudoコマンドで権限付与を実施。

defaults write com.apple.LaunchServices LSQuarantine -bool YES

その後、chatGPTから回答された下記のコマンドを入力し、macbookを再起動。

それでもまだ警告２が出てくるため、
brew cask doctor
と打ってみたところ、
brew cask is no longer a brew command. Use brew <command> --cask instead.
と表示。

brew caskは現在のHomebrewにおいて独立したコマンドではないらしく、
brew reinstall brew-cask
でCask関連のパッケージを再インストール
それでもまだ出てくるので、そもそもbrew install --caskが正常動作していれば警告が出ていても
問題ないようで、
brew list --cask
でエラーが出てこないことを確認し、対応中止。

#### 警告３：Some installed formulae are deprecated or disabled. You should find replacements for the following formulae: openssl@1.1

https://qiita.com/y-vectorfield/items/f326c150cee2d6108380

https://geniusium.hatenablog.com/entry/2021/09/13/233328

こちらのサイトを参考にさせていただいたところ、不要なのようなのでアンインストールを実施。
必要かわからないけど、
brew install openssl@3
でopenssl@3をインストールしてから、
brew uninstall openssl@1.1
で1.1をアンインストール。完了

#### 警告４：You have unlinked kegs in your Cellar. Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on those kegs to fail to run properly once built. Run `brew link` on these: gettext
こちらも上記のサイトを参考に、
brew link gettext
を入力。


#### 警告５：You have an unnecessary local Core tap! This can cause problems installing up-to-date formulae. Please remove it by running: brew untap homebrew/core
tapが何かよくわからなかったのでこちらを読んでみました。

https://qiita.com/sammrai/items/85ed5e914d424fbf9fd6

brew untap homebrew/core
と入力して完了

#### 警告６：Your Homebrew's prefix is not /opt/homebrew.

Homebrew のインストールパス（prefix）が /opt/homebrew ではないため、一部のパッケージが正しく動作しない可能性があるとのこと。
brew --prefixの結果が/usr/localなので、/opt/homebrewにインストールし直す。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)

と入力したが
警告が色々と表示。
権限の関係で残骸が残っているようで、sudoコマンドを使ってそれらを削除。（内容はchatGPTに任せちゃいました、、）

ls -la /usr/local
を入力してtotal 0と返ってきたので削除が完了。
Homebrewを再インストール。（他の警告より先にこっちを先にやった方が良かったのでは。。？）

brew doctorを入力したら
Your system is ready to brew.と表示。

これでスタートライン、、
次回はMySQLのインストールを実施します。
Modeler18.6のライセンス認証ウィザードの起動に失敗する

Modeler18.6のライセンス認証ウィザードの起動時に「`ご使用のシステムで適切なJava仮想マシンが見つかりませんでした。http://java.sun.comにアクセスしてJava仮想マシンをダウンロードしてください。`」というエラーで失敗することがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a2238be8-ace9-4268-a2f1-403e832520cf.png)

![2025-02-21 10_26_29-LaunchAnywhere エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/84aca01b-4397-4a3f-a4ed-6424ae276767.png)

この場合、`C:\Program Files\IBM\SPSS\Modeler\18.6\bin\law.lax`を修正する必要があります。

まずコピーをしてバックアップを取っておいてください。例では`law.lax.bkp250221`という名前でバックアップしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c7ec3382-b257-46c7-bdb5-2b198a932af6.png)


次に、Windowsのメモ帳を管理者権限で起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ab7e86bc-b7b7-47a8-88fc-0ea6ee40886c.png)

`C:\Program Files\IBM\SPSS\Modeler\18.6\bin\law.lax`を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9e7419c7-eb82-4158-b6fd-e6718b7f8921.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/70944eb0-acb7-4397-be42-9dcd063c63c6.png)

`lax.nl.valid.vm.list=J2`を`lax.nl.valid.vm.list=JRE`に修正して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4fd5e73f-fb2d-40e6-aef5-a96905ca88d2.png)

これでライセンス認証ウィザードの起動が可能になります。
![{1C1E16AB-4C5C-4F1D-B0D6-2A18DCACC61F}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5b540b7d-3c14-4eb7-b313-e77b5ecf3147.png)


#　参照
IBM SPSS Modeler 18.6 Client's License Authorization Wizard fails to launch on Windows 

https://www.ibm.com/support/pages/ibm-spss-modeler-186-clients-license-authorization-wizard-fails-launch-windows
テキストからシンボルマジック - Wingdings コンバータ

オンラインのWingdingsフォントコンバーター（wingdingstranslator.xyz）を開発しました。テキストとWingdingsシンボル間のリアルタイム変換を提供します。
### 特徴：
- 完全なWingdingsフォントファミリーサポート（1/2/3）
- ブラウザベースで、インストール不要
- プライバシー重視のローカル処理
-
これは初期リリースであり、今後さらに多くの機能が予定されています。皆様からのフィードバックは歓迎されており、このツールの改善に役立ちます。
訪問先: https://wingdingstranslator.xyz
WSL2 + Testcontainers + Eclipse で快適な開発環境を構築する

# はじめに

Docker Desktop のライセンス問題があるため、私は WSL2 に Docker をインストールして運用していました。
VSCode であれば WSL2 にリモート接続して開発作業ができるので問題なかったのですが、Eclipse の場合はそういった機能がないため困ってしまいました。

# 環境

- Windows 11
- WSL2 Ubuntu 22.04
- Eclipse
- Java 21
- [Testcontainers](https://testcontainers.com/)

# Testcontainers について

Testcontainers はユニットテストを実行する際に、DB等の外部サービスをDockerコンテナで自動作成してくれるライブラリです。

例えば、GitHub の CI 環境のインスタンスには Docker がインストールされているので、Testcontainers を使って実装すれば特別な準備をすることなく CI 環境でユニットテストを実行できてとても便利です。

# やったこと

Windows11 から Docker にアクセスできるように設定を修正する

```json:WSL2:/etc/docker/daemon.json
{
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
```

```diff:WSL2:/lib/systemd/system/docker.service
-ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
+ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
```

WSL2 を再起動させるためシャットダウン
```console:Windows11
> wsl --shutdown
```

Windows11 の `ターミナル` を起動して `Ubuntu 22.04` タブを起動

疎通確認
```console:Windows11
> curl http://localhost:2375/containers/json
[]
```

WSL2 の IP アドレスを取得（`localhost` だと Testcontainers からの接続が失敗するので）
```sh:WSL2
$ ip a | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1280 qdisc mq state UP group default qlen 1000
    inet 172.31.241.180/20 brd 172.31.255.255 scope global eth0
```

```properties:Windows11:~/.testcontainers.properties
docker.host=tcp\://172.31.241.180\:2375
```

# まとめ

Docker Desktop のような統合ツールを導入することなく、Windows11 から Docker を活用することができました。課題は WSL2 側の IP アドレスが変更されてしまった場合の考慮ですが、今回はここまでとさせていただきます。
公式WEBサイト作成

ひとまずテキスト部分だけ作ってアップしようと思って10ヶ月間放置していた。
これでは流石にWEBサイトの作り手としてはいけないと思い仕上げに向けてやっていきます。

### 構築するサイト
https://cakizaki.co.jp/

![10ヶ月間放置の戒め](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196751/cbf6b5dc-a226-32a5-c2d6-49d333822b2f.png)
AWS SAAに合格したので備忘録


## 概要


所属している会社の取り組み一環でAWS SAA-C03を受験・合格したので学習時間や使った教材などの備忘録


## 受けた人

- webエンジニア歴3年
- 1年半前にAWS Certified Cloud Practitioner(CLF-C02)に合格
- AWSを触った経験
	- 実務
		- EC2でPHP、MySQLの開発環境の構築
		- CloudWatchでログの調査
		- ECSのコンテナに入って調査
		- Secrets Managerに設定されている環境変数の内容確認
	- プライベート
		- ECSを使用して環境構築

## 学習期間、学習時間、本番試験の点数

- 学習期間：約1ヶ月半
- 学習時間：約40〜50時間
- 本番試験の点数：792点

## 学習に使った教材

- YouTube：[**ソリューションアーキテクト アソシエイト(SAA)**](https://www.youtube.com/playlist?list=PLPzcoMdqG5npIMyRZ7QmBaZQ-LdMeGXRa)
	- インプットはこれのみ
	- 合計2周ほど
- Udemy：[**【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）**](https://www.udemy.com/course/aws-knan/?couponCode=ST3MT200225A)
	- 各模擬試験を4周ほど

		|     | 模擬試験1 | 模擬試験2 | 模擬試験3 | 模擬試験4 | 模擬試験5 | 模擬試験6 |
		| --- | ----- | ----- | ----- | ----- | ----- | ----- |
		| 1回目 | 49%   | 46%   | 47%   | 60%   | 41%   | 51%   |
		| 2回目 | 70%   | 58%   | 69%   | 66%   | 52%   | 58%   |
		| 3回目 | 78%   | 61%   | 73%   | 73%   | 67%   | 80%   |
		| 4回目 | 90%   | 83%   | 76%   | 87%   | 73%   |       |

- Ping-t： 最強WEB問題集
	- 上記Udemyの模擬試験に飽きて試験1日前に開始
	- Ping-tの模擬試験は1回受けて結果は75%
	- Ping-tの模擬試験直後に「**【試験レベル】Well-Architected Frameworkに基づいた設計**」という項目の問題のみ取り組んだ
	- ステータス
		- レベル：2/40
		- 未出題：568
		- ミス：36
		- ヒット：149
		- コンボ：0

## 感想

- 試験の難易度はUdemy > 本番試験 > Ping-t
- Ping-tは解説が充実しているので初期段階から活用したほうが効率良く学べたかも
- AWSの各サービスでできることやどのように使用するかがわかってよかった
- 資格勉強があまり好きじゃなかったが実務では使わないような知識が身についてよかった
- AWS系の話に少しアンテナを張れるようになった
【簡単AWS】【AWS API Gateway】AWS API Gateway で新しい API を作成する際にカスタムドメイン名は必要ですか？

## 📌 概要  
AWS API Gateway を使用して新しい API を作成する際、**カスタムドメイン名（Custom Domain Name）** は必須ではありません。本記事では **API Gateway のデフォルトドメイン名** と **カスタムドメイン名の違い**、および **カスタムドメイン名の設定手順** について説明します。

---

## ✅ デフォルトの設定
新しい API を作成すると、**API Gateway が自動的にデフォルトのドメイン名** を生成します。形式は次のようになります：  
```
https://{api-id}.execute-api.{region}.amazonaws.com/{stage}
```

### 例  
```
https://abc123.execute-api.ap-northeast-1.amazonaws.com/prod
```

この **デフォルトドメイン名** を使用して、カスタムドメイン名を設定せずに API を直接呼び出すことができます。  

---

## 🛠 カスタムドメイン名を設定するべきケース
**カスタムドメイン名は必須ではありません**が、以下のような場合には設定を推奨します。

1. **ユーザーエクスペリエンス向上**  
   - カスタムドメイン名（例：`https://api.example.com`）を使用することで、ブランドの一貫性を高め、ユーザーが覚えやすくなります。

2. **SSL 証明書のバインド**  
   - 通信を暗号化し、データの安全性を確保します。  
   - **AWS Certificate Manager（ACM）** を利用することで無料で証明書を管理できます。

3. **複数の API を統合**  
   - 同じカスタムドメイン名で複数の API を異なるパスにルーティングし、管理とアクセスを簡素化します。

---

## 📋 カスタムドメイン名の設定手順  

### Step 1️⃣：ACM 証明書の作成または選択  
1. [**AWS Certificate Manager（ACM）**](https://console.aws.amazon.com/acm) にアクセスします。
2. **パブリック証明書** を作成し、ドメイン所有権を確認します（DNS 検証が推奨されます）。  

### Step 2️⃣：カスタムドメイン名の作成  
1. **API Gateway コンソール** を開きます。
2. 左側メニューから **Custom Domain Names** を選択します。
3. **Create** をクリックし、以下の情報を入力します：
   - **Domain Name**：カスタムドメイン名を入力します（例：`api.example.com`）。  
   - **ACM 証明書**：ACM で作成した証明書を選択します。

### Step 3️⃣：API マッピングの設定  
1. **Custom Domain Names** ページで **API Mapping** をクリックします。
2. 使用する API とステージ（例：`prod`）を選択します。
3. パスのマッピングを設定します（例：`/v1` または `/`）。

### Step 4️⃣：DNS レコードの更新  
DNS プロバイダー（例：**Route 53**）にアクセスし、**CNAME レコード** を追加します。カスタムドメイン名を **API Gateway が提供する CloudFront のドメイン名** に向けます。  

---

## ⚠️ 注意点  
- **ACM 証明書は API Gateway と同じリージョンで作成する必要があります**。
- カスタムドメイン名は現在、**REST API および HTTP API** のみサポートされ、WebSocket API には対応していません。

---

## 🏁 結論  
- **カスタムドメイン名は必須ではありません**が、デフォルトドメイン名でも基本的な API 呼び出しには対応できます。  
- ただし、**本番環境**ではカスタムドメイン名の設定を推奨し、ユーザー体験とセキュリティの向上を図りましょう。
Pyxel先生GPT作ってみた、ちゃんと遊べるゲームのコードも書けるぞ

先日以下の記事を拝見しまして、これ自分がお世話になっているレトロゲームエンジン「Pyxel」でも使えるなと思いました。

https://qiita.com/itsuki_m/items/3fe9b1154e6e98b182e4?utm_source=Qiita+%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=65b626d877-Qiita_newsletter_658_02_19_2025&utm_medium=email&utm_term=0_e44feaa081-65b626d877-35048109&mc_cid=65b626d877&mc_eid=ee2a6bb9ef

ハンズオンのいいところは、実際にChatGPTの指示に沿って手を動かすことで、単に書籍や記事を流し読みするより学習効率がいいところですよね。

もちろん書籍とかでも「実際に手を動かしましょう」と推奨しているものが多いですし、学習意欲が高い人はちゃんと実践するんですが、僕のようにわかった気になってふんふんと進んでしまう怠け者も多いはず。
その点、対話形式だと自分が何かリアクションしないと先に進めないので強制力が働きます。

また、初学者は環境構築や初めてプログラムを実行できるようになるまでの段階でエラーが出て詰まったりしがちですが、出力されたエラーを貼り付けたら（たいていは）解決できるところもとても心強い。
この1点だけでも、ChatGPT出現前後で初学者のハードルはだいぶ下がってるんじゃないかなぁと思います。

## Pyxel先生GPT

といったありきたりな前段はさておき、実際に作ったGPTがこちら。
このリンクからこのままご利用いただけます。

https://chatgpt.com/g/g-67b7ae5c50648191affc6b5bb1183576-pyxelxian-sheng

初めてPyxelに触れる人であれば、デフォルト選択肢の「Pyxelの始め方を教えて」でインストール方法からナビゲートしてくれますし、同じくデフォルト選択肢の「Pyxelで簡単なゲームを作成したい」から初めてちょっとフィードバック（？）をする程度で、それなりに遊べるゲームのコードの提示とその解説くらいまではしてくれます。

↓は実際に提示してもらったゲームを動かした様子。
（四角が自分で丸が敵、丸がどんどん増えていくのでそれを避け続けるゲーム。）

![20250221_090243.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472822/ed4a0224-eb37-4892-9342-f37652e92695.gif)

参考）上のゲームを提示してもらったチャットの内容

https://chatgpt.com/share/67b7c21a-bb48-8011-9cf0-7026a42d84e0

もし実際に使ってくださった方がいたら、ぜひ感想を教えていただきたいです！

## おまけ：GPTのプロンプトについて

自分はプロンプトについては一般利用者レベルですが、ムンペイさん @munepi0713 にアドバイスをいただいたりして、以下のように仕上げました。「添付したドキュメント」とはPyxelの公式ReadMeです。

> あなたはPyxelを教える先生です。特に、生徒に質問をしてレベルを探りながら少しずつステップバイステップで教える方法が得意です。利用者にPyxelの基礎を教えてください。
>
> Pyxelの知識は、添付したドキュメントを参照してください。
>Pyxelのメソッドは、添付したドキュメントに記載されているもの以外は使わないでください。

ってすごく単純なプロンプトなのですが、いろいろ要望を盛り込むとかえって機能しなくなったりしたので、あえて最低限にとどめた感じです。

研究すればさらに気の利いた先生に進化できるかもしれませんね！
[vue]カスタムコンポーネントでv-model使いたいよ～

# アホロートル（メキシカンサラマンダー）
自宅繁殖とかして社長や社員にあげたり、ペットショップとかに売ったりしてましたが、如何せんバブの餌がブラインシュリンプというプランクトンで、こいつの生成・維持がクソめんどくさかったため今はこの２匹だけ飼育中
![IMG_0049.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/c6a81d85-15fe-45f8-a280-1a932738035c.jpeg)
日本だとウーパールーパーって名前で浸透している、両生類で目がバチクソ悪くて体がヌメヌメして普段は動きが鈍くさいけど眼の前に動くものが有ると凄い勢いで噛みついてくる何考えてるのかわからない再生力が尋常じゃない生き物です。
※共食いとかで腕無くなっても、3ヶ月ぐらいで骨から指先までキレイに（若干細くはなるけど）再生していく、なんとも生命力の強い不思議生物です。

ちなみにロートルって中国語で【老人・年寄り・老いぼれ】と言う意味合いがあるみたいで、アホなロートルってボケ老人かいな!!

# vue3で独自コンポーネント作ったけど、v-modelで値を渡したいよ～な話
vue3の出始めの時とかって、独自コンポーネントに何か値を渡すときは`defineProps`で値を渡して、値の変更を反映するために`defineEmits`で親に通知→親コンポーネントにて反映みたいな流れで実装していたかと思いますが、Vue3.4以降からは普通に`v-model`が使えるようになるらしいです。

## 旧版(3.4前の作り方)
```vuejs:definePropsとdefineEmitsでそれっぽい動きをするアレ
<!-- 子コンポーネント -->
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>

<template>
  <input
    :value="props.modelValue"
    @input="emit('update:modelValue', $event.target.value)"
  />
</template>


<!-- 親コンポーネント -->
<ChildComponent
  :modelValue="foo"
  @update:modelValue="$event => (foo = $event)"
/>
```


## 新版(3.4以降の作り方)
```vuejs:v-model使ったるぜ
<!-- 子コンポーネント -->
<script setup>
const model = defineModel()
</script>

<template>
  <input v-model="model" />
</template>


<!-- 親コンポーネント -->
<ChildComponent v-model="foo" />
```

当然、元のdefinePropsとdefineEmitsも使える（定義できる）ため、
双方向でやり取りしたいのは`v-model`を使い、
値だけ渡せればいいや的なときは`defineProps`を使い、
何かイベントを伝達してほしいなぁみたいなときは`defineEmits`を使うなど、
きちんと役割を決めて実装するのがスマートだねっていうアレでした

# 中身を知ってれば。。。
どんな言語もそうですが大元の【仕組み】を知ってれば、楽に書けるようになったなぁという恩恵が有るかと思いますが、
【便利だから】とはじめからフレームワークやライブラリを使ったりするとそれが当たり前になってしまい、
裏でどんな動きをしているのかなど意識・考えなくなってしまうのはもったいないなぁという気持ちがあります。

Javaで言うと、リフレクションとかServlet/JSPを知らずにSpringBootから入った場合、どうやってリクエストからFormに値が設定されるとか、ModelViewを設定しただけで画面にHTMLが返るとかを考えることなく、【良く分からんけど、そういうものだから】と使ってしまうんだろうなぁ。

プログラムだけに限らず、世の中のあらゆる事象の本質だったり思想的なものにちょっとでも興味が持てれば、色んなアプローチで解決・改善に役に立つんじゃないかなぁと壮大な思いをはせてみる
IPアドレスとMACアドレスの違いをわかりやすく解説

ネットワークを学ぶ際に必ず登場する **IPアドレス** と **MACアドレス**。  
どちらもデバイスを識別するためのアドレスですが、それぞれの役割や特徴は異なります。  
本記事では、それらの違いをわかりやすく説明し、日常生活に例えて解説します。

## 1. IPアドレスとは？

### IPアドレスの役割
IPアドレス（Internet Protocol Address）は、ネットワーク上でデバイスを識別するための「住所」のようなものです。  
インターネットやローカルネットワーク（LAN）で通信を行う際に、データの送受信先を特定するために使われます。

### IPアドレスを「住所」に例えると？
家の住所と同じように考えるとわかりやすいです。  
たとえば、あなたが友達に手紙を送りたい場合、相手の住所が必要です。  
ネットワークでも同じように、データを送るためには相手のIPアドレスが必要になります。

### IPアドレスの特徴
- **インターネット上での識別番号**
- **変わることがある（動的IP）**
- **IPv4とIPv6の2種類がある**

### IPv4とIPv6の違い
現在、一般的に使われているのは **IPv4** ですが、アドレスの数が不足し始めたため、**IPv6** が導入されています。

| 項目 | IPv4 | IPv6 |
|------|------|------|
| アドレス長 | 32ビット | 128ビット |
| 表記 | 192.168.1.1 | 2001:db8::ff00:42:8329 |
| アドレスの数 | 約43億個 | 340澗（かん）個以上 |

### IPアドレスの例
```
192.168.1.1  （IPv4の例）
2001:db8::ff00:42:8329  （IPv6の例）
```


## 2. MACアドレスとは？

### MACアドレスの役割
MACアドレス（Media Access Control Address）は、ネットワーク機器に物理的に割り当てられた「識別番号」です。  
LAN内での通信に使われ、ネットワークインターフェースカード（NIC）ごとに固有の番号が設定されています。

### MACアドレスを「名前」に例えると？
MACアドレスは、人間の「名前」に例えるとわかりやすいです。  
例えば、あなたがクラスで「山田さん」と呼ばれるのと同じように、ネットワーク機器もMACアドレスで識別されます。  
この「名前（MACアドレス）」は基本的に変わりません。

### MACアドレスの特徴
- **デバイスごとに固有のアドレス**
- **通常変更されない**
- **48ビットの16進数で表記される**

### MACアドレスの例
```
00:1A:2B:3C:4D:5E
```
## 3. IPアドレスとMACアドレスの違い

| 項目 | IPアドレス | MACアドレス |
|------|-----------|------------|
| 役割 | ネットワーク上での識別 | デバイスの物理的な識別 |
| 変更 | 変更される可能性あり | 基本的に変更されない |
| 表記 | IPv4: 192.168.1.1 / IPv6: 2001:db8::ff00:42:8329 | 00:1A:2B:3C:4D:5E |
| 使用範囲 | グローバル（インターネット） | ローカル（LAN内） |

## 4. IPアドレスとMACアドレスの関係

### 実生活で例えると？
たとえば、宅配便の配送を考えてみましょう。

1. **IPアドレスは「家の住所」**
   - 荷物（データ）を送るために必要
   - 引っ越すと住所が変わる（動的IPの概念）
  
2. **MACアドレスは「家の表札」**
   - その家に住んでいる人（デバイス）を特定する
   - 基本的に変わらない（デバイス固有）

つまり、インターネットでは **IPアドレスを使ってどこにデータを送るか決め、MACアドレスを使って正しく配達する** という仕組みになっています。

## 5. IPアドレスとMACアドレスの確認方法

### Windowsで確認する方法
```
ipconfig /all
```
### Mac/Linuxで確認する方法
```
ifconfig または ip a
```

## 6. IPアドレスの種類

IPアドレスには **プライベートIP** と **グローバルIP** の2種類があります。

| 種類 | 説明 | 例 |
|------|------|----|
| グローバルIP | インターネット上で一意のアドレス | 203.0.113.1 |
| プライベートIP | LAN内でのみ有効なアドレス | 192.168.1.1 |

### なぜプライベートIPが必要？
家庭内のネットワークには複数のデバイス（PC、スマホ、タブレット）が接続されます。  
しかし、インターネット上のIPアドレスは限られているため、ルーターが1つのグローバルIPを持ち、各デバイスにはプライベートIPを割り当てます。  
これにより、**1つのグローバルIPを複数のデバイスで共有** できるのです。


## 7. まとめ

### IPアドレスとは？
- **ネットワーク上での「住所」**
- **インターネットやLAN内でデバイスを識別**
- **変更されることがある**
- **IPv4とIPv6がある**

### MACアドレスとは？
- **デバイスごとの「名前」**
- **ネットワーク機器に固有の識別番号**
- **基本的に変わらない**

### IPアドレスとMACアドレスの関係
- **IPアドレスは「住所」**
- **MACアドレスは「名前」**
- **データはIPアドレスで宛先を決め、MACアドレスで正しいデバイスに届ける**

この仕組みを理解すると、ネットワークトラブルの原因を特定しやすくなり、通信の仕組みがより深く理解できます。
Ruby on Railsを実装する際に変数名で気をつけていること

## はじめに
 - プログラミングをしていると、日々変数名をつけるという作業をします。自分が書いたコードや他の方が書かれたコードを読むにあたり、変数名を正しくつけることで理解しやすくなった経験があるので、改めてここで整理してみます
 - Rubyの場合特に型を明示的に記述しないので、静的型付け言語に比べて変数名というのはコードの読みやすさの大事な要素になってくると考えています。認識の齟齬が生まれにくような変数名にすることで開発生産性向上に寄与できれば幸いです

## 変数名はインスタンスのクラス名を小文字にしたものを用いる
 - Rubyは型を明示的に書かないので、変数にどの型のものが入っているかが分かりにくいことがあります。そのため、基本的にはインスタンスのクラス名を小文字にしたものを変数名として用いるのが良いと思います

```ruby
# 良い例
cart = Cart.new
cart = user.carts.new
electric_plan = ElectircPlan.new

# 悪い例
basket = Cart.new # cartのことをbasketに言い換えてしまっている
plan = ElectricPlan.new # electricを省略してしまっている
```

## 配列の場合は複数形にする
 - 単数のままだと一つのインスタンスなのか配列なのかわからないため、配列(`ActiveRecord::Relation` を含む)の場合、複数形にして、一つではないことを明示的になるようにします

```ruby
# 良い例
carts = Cart.all

# 悪い例
cart = Cart.all
```

## スコープが狭い場合は、省略することも許容する
 - 短い変数名を好ましくないと思う開発者は一定数います。しかし、golangでは、狭いスコープでは、短い変数名を使うことが好ましいとされています[^1]。私はRuby on Railsでの開発の際でも、スコープが狭くて、その変数に入ってくる型が明らかな場合は省略した変数名も許容して良いと考えています
 - 例えば、ブロックの変数など、スコープが明確になっている場合は、変数名を省略することも許容してよいと考えています。例えば以下の例のように数行以内であれば、`ep`がどのクラスのインスタンスなのかは判断できます。ブロック内で毎回`electric_plan`と記載して量が増えるよりは読みやすいです
 - 一方、クラス内でつかうインスタンス変数名や、getterの変数名は、変数のスコープが広い（局所化されていない）ため、省略して`ep`としてしまうと、意味が分かりにくくなるため、省略した変数名は望ましくありません
 - とはいえ、個人的に許容しているというものなので、既存のプロジェクトの方針で、省略を許容しない場合は、私も省略せずに実装します。実装される方は、参画プロジェクトの方針に従ってください

[^1]: https://qiita.com/rapirapi/items/4c8b41996aa3071a5aeb

```ruby
# 省略した変数名を許容してもよい例
ElectricPlan.all.each do |ep|
  ep.update!(some_column: some_value)
end

# 省略した変数名を許容しない例
class SomeRubyClass
  attr_accessor :ep

  def initialize(electirc_plan)
    self.ep = electric_plan
  end
end

# スコープが広い場合は省略せずに変数名を定義するべき
class SomeRubyClass
  attr_accessor :electric_plan

  def initialize(electirc_plan)
    self.electirc_plan = electric_plan
  end
end
```

## 変数に格納される型が複数ありうる場合はそれがわかる変数名にする
 - Rubyは型が柔軟ですが、変数名は型が想起できる変数名をつけるべきだと考えています。一方で、複数の型が入ってくるのを許容したい場合はそれが明示的になるような変数名にするべきです
 - 下記の例では、`some_scope`の引数は`Area`のインスタンスか、その`id`が渡されることが期待されているので、`area_or_area_id`という引数名にしたいところです
```ruby

class SomeClass < ApplicationRecord
  belongs_to :area

  # 悪い例
  scope :some_scope, ->(area) {
    area_id = area.is_a?(Area) ? area.id : area
    where(area_id:)
  }

  # 良い例
  scope :some_scope, ->(area_or_area_id) {
    area_id = area_or_area_id.is_a?(Area) ? area_id : area_or_area_id.id
    # NOTE: あえてarea_idにしなくても、where(area: area_or_area_id)でもよしなに処理してくれる
    where(area_id:)
  }
```
## 型を想起させる変数名なのに型が違う
 - 例えば、次の例では、filesという変数には、`File`型の配列が格納されることが想起されます。しかし、実際には、ファイルのパスのstringです。この場合は、型を想起させない変数名にした方が無難だと思います
```ruby
# 悪い例
files = Dir.glob(Rails.root.join("spec/*.rb"))
=> ["/Users/hogehoge/spec/rails_helper.rb", "/Users/hogehoge/spec/spec_helper.rb"]

# 良い例
file_paths = Dir.glob(Rails.root.join("spec/*.rb"))
```

## 最後に
 - Rubyは型を明示的に書く必要がない一方で、型がないわけではなく、実装時には型を意識する必要があります。今回記事を書くにあたりまとめてみて感じたことは、変数名から型を推測できるようにすべきだということです。これはもしかしたら型を明示的に記載しないRubyだから気をつけるべきということになるのかもしれませんが、静的型付け言語であったとしても変数名から型を推測できるように変数名を定義してあげた方が読みやすいと思います。私は仕事でC#を実装することがありますが、IDEが強力なので変数の型というのはすぐに把握できます。しかし、認知負荷を考えるとIDEに頼らずとも型を把握できるのが良いでしょう。従って、本記事で記載したことはRubyに限らず幅広い言語で適用できるのではないかと考えています
14. Longest Common Prefix の要点

# 問題内容
単語のリストが入力されたら、その接頭辞について共通箇所を出力するように書き加えなさいというもの。なければ""と出力する。

# 解答例
```python:sample
class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        ans = ""
        v=sorted(strs)
        first=v[0]
        last=v[-1]
        for i in range(min(len(first),len(last))):
            if(first[i]!=last[i]):
                return ans
            ans+=first[i]
        return ans
```

# この問題の要点
* リストをソートをすると、最初と最後の単語だけで文字が共通するか否かの比較が済む
* 単語に含まれるそれぞれの文字には、以下のように書くことでアクセスできる
```
fisrt[i]
```
* 比較する２つの単語のうち少ない文字数にループ回数を設定するとエラーを回避できる
【Python】毎週勉強するシリーズ ～変数・定数～

# 概要
AI が流行ってる昨今 Python は必須級のスキルになってきてます。
時代に取り残されないようにコツコツと Python を勉強しようと思います！
三日坊主にならないように Qita でアウトプットしながら進めます💪

# 今日やること
[とほほのPython入門 - 変数・定数](https://www.tohoho-web.com/python/variables.html) を理解する。

# 変数について
Python の 変数 は、アンダーバー(\_)を含む英数字からなる名前で表します。
最初の1文字はアンダーバー(\_)または英字でなくてはなりません。

```py
value1 = 123
_value1 = 123
test_value = 123
TEST_VALUE = 123
```

# 定数について
Python では 定数 はサポートされていません。
慣習的に大文字とアンダーバー(_)のみの変数が固定値を表現することが多いようです。

```py
PI = 3.14
MAX_BUFFER_SIZE = 1024
```

定数がないのは結構特徴的ですね。
僕が触った言語はすべて定数があったので、実際の使い勝手は気になるところです。

# 感想
今日はさくっと終わりましたね！
定数ないのは意外でしたがこれも慣れですね～

今回も見ていただきありがとうございました。
また次回お会いしましょう！！

# 次回やること
[とほほのPython入門 - リスト・タプル・辞書](https://www.tohoho-web.com/python/list.html) を理解する。
個人的備忘録：Terraform における aws_db_instance.rds_instance.address の活用方法メモ

## はじめに
AWS の **RDS インスタンスを Terraform で管理** する際、`aws_db_instance.rds_instance.address` を環境変数として利用することで、**アプリケーションが正しくデータベースに接続** できるようになります。  

本記事では、この値の **役割と具体的な活用方法** について解説します。 

:::note alert
**※内容は個人の備忘録レベルのため、参考程度にご覧ください。**
:::


## 書こうと思ったきっかけ
この記事を書こうと思ったきっかけは、**現在受講している IT スクールのハッカソン** において、**インフラ担当として活動** していることです。 

**実際のAWS構成図**

![Screenshot 2025-02-21 at 7.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/14c68cef-7863-4742-97de-dc012a8dfd49.png)

ハッカソンでは、**Terraform を用いて AWS のインフラを管理** する機会があり、その中で **RDS のエンドポイントをどのように活用するか** が重要な課題となりました。  

:::note warn
**実際の運用に役立つ知識として整理** しておくため、ここにまとめます。
:::

AWS の RDS インスタンスを Terraform で管理する際、`aws_db_instance.rds_instance.address` を環境変数として利用することで、アプリケーションが正しくデータベースに接続できるようになります。

**本記事では、この値の役割と具体的な活用方法について解説します。**

## `aws_db_instance.rds_instance.address` とは？

`aws_db_instance.rds_instance.address` は、Terraform で管理している RDS インスタンスのエンドポイントを取得するための属性です。この値は、RDS インスタンスが作成された後に割り当てられるホスト名であり、アプリケーションがデータベースに接続する際に使用されます。

## 具体的な活用方法

Terraform を使って AWS ECS や EC2 インスタンスなどのアプリケーションに RDS インスタンスのエンドポイントを渡す場合、以下のように `environment` ブロックで `MYSQL_HOST` などの変数として設定することができます。

### 例: ECS のタスク定義で RDS のエンドポイントを環境変数に設定

```json
例: EC2 インスタンスの環境変数として RDS のアドレスを設定
```

```hcl
resource "aws_instance" "app_server" {
  ami           = "ami-12345678"
  instance_type = "t3.micro"

  user_data = <<-EOF
              #!/bin/bash
              echo "MYSQL_HOST=${aws_db_instance.rds_instance.address}" >> /etc/environment
              echo "MYSQL_USER=myuser" >> /etc/environment
              echo "MYSQL_PASSWORD=$(aws secretsmanager get-secret-value --secret-id rds_password --query SecretString --output text | jq -r .password)" >> /etc/environment
              echo "MYSQL_DB=mydatabase" >> /etc/environment
              EOF
}
```

## 適用方法

Terraform の設定を適用するには、以下の手順を実行します。

```sh
terraform init
terraform apply -auto-approve
```

また、ECS の場合は以下のコマンドでタスクを再デプロイし、環境変数の更新を反映させます。

```sh
aws ecs update-service --cluster my-ecs-cluster --service my-ecs-service --force-new-deployment
```

## まとめ

- `aws_db_instance.rds_instance.address` は、Terraform で作成された RDS インスタンスのエンドポイントを取得するための属性。
- ECS のタスク定義や EC2 インスタンスの環境変数に設定することで、アプリケーションがデータベースに適切に接続できるようになる。
- Terraform の適用後、ECS や EC2 の設定を更新することで、環境変数の変更を反映できる。

この設定を活用することで、AWS のインフラをコードベースで効率的に管理し、アプリケーションとデータベースの接続設定を自動化できます。
【PHP】制御構造（require、include）について調べてみた

## はじめに

社内勉強会でPHPの制御構造（require、include）について発表したので、資料を共有します。

## できること

ファイルの読み込み

## 種類

`require`

`include` 

`require_once`

`include_once`

## それぞれの違い

|  | require | include | require_once | include_once |
| --- | --- | --- | --- | --- |
| ファイル読み込みに失敗した場合 | 致命的なエラーでスクリプト停止 | 警告表示するがスクリプトの実行は継続 | 致命的なエラーでスクリプト停止 | 警告表示するがスクリプトの実行は継続 |
| 用途 | 必須ファイルの読み込み （データベースの接続など） | 必須でないファイルや条件によって読み込む （HTMLを記述したファイル） | 必須ファイルの読み込み （データベースの接続など） | 必須でないファイルや条件によって読み込む （HTMLを記述したファイル） |
| ファイル読み込み回数 | 同じファイルでも常に読み込む | 同じファイルでも常に読み込む | 同じファイルの読み込みは１度だけ | 同じファイルの読み込みは１度だけ |

### requireとrequire_onceの使い分け

同じファイルを複数回読み込むと、関数やクラスの再定義エラーが発生する可能性がある。
`require_once`を使用することで、このようなエラーを回避し、スクリプトの安定性を高めることができる。

→ファイルの重複読み込みによるエラーを避けたい場合`require_once`を使用する

## 使用例

### requireの例

```php
// データベース接続情報を記述したファイル
require 'database.php';
```

### includeの例

```php
// ヘッダー部分のHTMLを記述したファイル
include 'header.php';

// 条件分岐で読み込むファイルを切り替える例
if ($page == 'home') {
  include 'home.php';
} else {
  include 'other.php';
}
```

### require_onceの例

```php
// データベース接続情報を記述したファイルを一度だけ読み込む
require_once 'database.php';

~~~~~~~~~~
長い処理
~~~~~~~~~~

// 同じファイルのため、再度読み込まない
require_once 'database.php';
```

## クイズ

### **問題1**

`require` 文と `include` 文のどちらを使うべきですか？
以下の選択肢から正しいものを選んでください。

**選択肢**

1. 常に `require` 文を使うべきである。
2. 常に `include` 文を使うべきである。
3. ファイルが存在しない場合にプログラムを停止させたい場合は `require` 文、停止させたくない場合は `include` 文を使うべきである。
4. どちらを使っても同じである。

<details><summary>解答</summary>
3が正解
</details>

### **問題2**

次のコードを実行した結果はどうなりますか？

以下の選択肢から正しいものを選んでください。

```php
<?php
// file_not_exist.phpのファイルは存在しないとする
require 'file_not_exist.php';

echo 'この行は実行されますか？';
?>
```

**選択肢**

1. `この行は実行されますか？` が出力される。
2. 致命的なエラーが発生し、プログラムが停止する。
3. 警告が発生するが、`この行は実行されますか？` が出力される。
4. 何も出力されない。

<details><summary>解答</summary>
2が正解
</details>

## 参考サイト

https://www.php.net/manual/ja/function.require.php

https://www.php.net/manual/ja/function.include.php

https://www.php.net/manual/ja/function.require-once.php

https://www.php.net/manual/ja/function.include-once.php


## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=29dc847ab6ef2f50109f
GitHub Actions とは

## GitHub Actions とは
GitHub Actions は、コードの変更に応じて自動で処理を実行する仕組みです。
例えば以下のようなことができます。

- コードを push したら自動でテストを実行
- Pull Request が作られたらコードをチェック
- main ブランチにマージされたら本番環境にデプロイ

つまり、GitHub Actions を使えば、開発作業を自動化できます。

## checkoutとは
GitHub Actions のワークフローを書くと、よく以下のようなコードが登場します。

```yaml
- name: Checkout repository
  uses: actions/checkout@v4
```

これは `actions/checkout` というアクションで、GitHub のリポジトリのコードをワークフロー環境にダウンロード（コピー）するためのものです。

## なぜ `checkout` が必要なのか
GitHub Actions の実行環境は、最初は空の状態です。
つまり、コードを push してワークフローを動かしても、リポジトリのファイルは最初は存在しません。

しかし、多くの処理（テストやビルド）はリポジトリのコードがないと実行できません。
そこで `checkout` を使うことで、GitHub のリポジトリのコードを取得できるようになります。

## Push 時に Hello, World! を表示する
GitHub Actions の基本的な動作を確認するために、Push した際に "Hello, World!" を表示するワークフローを作成してみます。

```yaml
name: Hello World on Push

on: push

jobs:
  hello-world-job:
    runs-on: ubuntu-latest
    steps:
      - name: Print Hello World
        run: echo "Hello, World!"
```

このワークフローをリポジトリに追加すると、Push するたびに "Hello, World!" が出力されます。
これにより、GitHub Actions が正常に動作していることを確認できます。

## 実際の動きを見てみる
実際に `checkout` を使って、リポジトリのファイルを表示してみます。

```yaml
name: Checkout Example

on: push

jobs:
  checkout-job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      
      - name: List files in repo
        run: ls -la
```

このワークフローを実行すると、リポジトリ内のファイル一覧が表示されます。
`checkout` を入れない場合、リポジトリのファイルがないため `ls -la` しても何も表示されません。

## まとめ
- GitHub Actions はコードの変更に応じて処理を自動化するツール
- `actions/checkout` はリポジトリのコードを取得するためのアクション
- `push` 時に "Hello, World!" を表示することで、GitHub Actions の動作確認ができる
- ほとんどのワークフローで `checkout` は必要になる
paizaラーニングレベルアップ問題集の【行入力】をやってみた。



paizaラーニングレベルアップ問題集の【行入力】をやってみました。
- - -
##### 問題
###### 1行の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_step1
###### 2行の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_step2
###### 3行の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_step3
###### 10行の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_step4
###### 1000行の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_boss
- - -
5問とも同じコードで正解してみます。
- - -
##### C
```c
#include <stdio.h>

int main() {
    char s[12];
    while (fgets(s, sizeof(s), stdin))
        printf("%s", s);
    return 0;
}
```
- - -
##### C++
```cpp
#include <iostream>
using namespace std;

int main() {
    string s;
    while (getline(cin, s)) {
        cout << s << endl;
    }
    return 0;
}
```
- - -
##### C#
```cs
using System;

class Program
{
	public static void Main()
	{
        string s;
        while((s = Console.ReadLine()) != null) Console.WriteLine(s);
	}
}
```
- - -
##### Go
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}
```
- - -
##### Java
```java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine())
            System.out.println(sc.nextLine());
        sc.close();
    }
}
```
- - -
##### JavaScript
```js
require("fs").readFileSync("/dev/stdin", "utf8").trim().split('\n').forEach(function (s) { console.log(s) });
```
- - -
##### Kotlin
```kotlin
fun main() {
    while (true) {
        val s = readLine() ?: break
        println(s)
    }
}
```
- - -
##### PHP
```php
<?php
    while (($s = fgets(STDIN)) != "") {
        echo $s;
    }
?>
```
:::note alert
```php
<?php
    while ($s = fgets(STDIN)) {
        echo $s;
    }
?>
```
は、最終行が「0」(改行無し)の場合、「0」が表示されません。
:::
- - -
##### Perl
```pl
foreach (<STDIN>) {
    print $_;
}
```
- - -
##### Python3
```py
while True:
    try:
        print(input())
    except EOFError:
        break
```
- - -
##### Ruby
```rb
while s = gets
    puts s
end
```
- - -
##### Scala
```scala
import scala.io.StdIn._

object Main extends App{
    var s = readLine()
    while (s != null) {
        println(s)
        s = readLine()
    }
}
```
- - -
##### Swift
```swift
while let s = readLine() {
    print(s)
}
```
paiza Qiita コラボ A問題 新都心のハイウェイ

https://qiita.com/official-events/efe957f155af900604b3

A問題をSwiftでやりました。

# 問題概要

マス状のエリアにAとBがいる。縦横方向は見えるが斜めは見えない。エリアには障害物があり、障害物の向こうは見えない。AはBが見える位置に最小移動回数で移動する。

# やり方

「Bの位置」がゴールではなく、「Bが見える位置」がゴールです。はじめにゴールをすべて設定します。いずれかのゴールに到達したら終了とします。

「進む」と「チェックする」の順番ですが、今回は初めからBが見える場合は一歩も動かずに終了するので、「チェックする」→「進む」の順番にしてコードをシンプルにします。

あとはAから「チェックする」→「進む」を繰り返しながら一歩ずつ進んでいきます。幅優先探索で行います。4歩でたどり着く場所を調べるときは、4歩でたどり着く場所をすべて調べてから5歩の場所の調査に移ります。

複数の経路で同じ場所にたどり着くことがあるので、2度調べないように工夫します。

たどり着かないときは-1を出力します。たどり着かないときの考慮を忘れないようにする。

```
import Foundation

func readInt() -> Int {
    Int(readLine()!)!
}

func readInts() -> [Int] {
    readLine()!.split(separator: " ").map { Int(String($0))! }
}

let hw = readInts()
let h = hw[0]
let w = hw[1]

var field: [[Character]] = []

for _ in 1...h {
    field.append(Array(readLine()!))
}

var aY = 0
var aX = 0
var bY = 0
var bX = 0

for y in 0..<h {
    for x in 0..<w {
        if field[y][x] == "A" {
            aX = x
            aY = y
        }
        if field[y][x] == "B" {
            bX = x
            bY = y
        }
    }
}

var target = [[Bool]](repeating: [Bool](repeating: false, count: w), count: h)

target[bY][bX] = true

var currentBY = bY
while currentBY + 1 <= h - 1 && field[currentBY + 1][bX] != "#" {
    currentBY += 1
    target[currentBY][bX] = true
}
currentBY = bY
while currentBY - 1 >= 0 && field[currentBY - 1][bX] != "#" {
    currentBY -= 1
    target[currentBY][bX] = true
}
var currentBX = bX
while currentBX + 1 <= w - 1 && field[bY][currentBX + 1] != "#" {
    currentBX += 1
    target[bY][currentBX] = true
}
currentBX = bX
while currentBX - 1 >= 0 && field[bY][currentBX - 1] != "#" {
    currentBX -= 1
    target[bY][currentBX] = true
}

var step = [[Int]](repeating: [Int](repeating: -1, count: w), count: h)
step[aY][aX] = 0

var checkPos: [(Int, Int)] = [(aY, aX)]

loop:
while true {
    var nextPos: [(Int, Int)] = []
    for p in checkPos {
        if target[p.0][p.1] {
            print(step[p.0][p.1])
            break loop
        }
        for (addY, addX) in [(1, 0), (-1, 0), (0, 1), (0, -1)] {
            let nY = p.0 + addY
            let nX = p.1 + addX
            if nY >= 0 && nY <= h - 1 && nX >= 0 && nX <= w - 1 {
                if field[nY][nX] != "#" && step[nY][nX] == -1 {
                    step[nY][nX] = step[p.0][p.1] + 1
                    nextPos.append((nY, nX))
                }
            }
        }
    }
    if nextPos.count == 0 {
        print(-1)
        break loop
    }
    checkPos = nextPos
}

```
next/bundle-analyzerが開発環境で解析を表示しない

# 問題
`next.config.ts`には`bundle analyzer`の設定を入れているのに、`npm run dev`でページを開くといつも通りにしか表示されない
<details><summary>config</summary>

```typescript:next.config.ts
import NextBundleAnalyzer from "@next/bundle-analyzer";
import type { NextConfig } from "next";

const withBundleAnalyzer = NextBundleAnalyzer({
  enabled: process.env.ANALYZE === "true",
});

const nextConfig: NextConfig = withBundleAnalyzer({
  webpack: (config) => {
    config.module.rules.push({
      test: /\.txt$/i,
      use: "raw-loader",
    });
    return config;
  },
  experimental: {
    turbo: {
      rules: {
        "*.txt": {
          loaders: ["raw-loader"],
          as: "*.js",
        },
      },
    },
  },
});

export default nextConfig;
```
</details>

# 解決法
`turbopack`を使用しない

# 原因
`next/bundle-analyzer`はwebpackプラグインであるため、turbopack環境下では機能しない。turbopackではなくwebpackを使うと通常通り表示される。
トレイルヘッドでレポートを作る時のエラー



# Filter Your Report

+ [Filter Your Report : trailhead](https://qiita.com/Keiji_otsubo/items/8eb54e0bb98d4126570e)
+ [ステータスとタイプは含まれていますが、セクターない。 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000Tmj4)

:::note
ページの下部で言語を切り替えることでチャレンジを完了できました。ブラウザ セクションで翻訳していましたが、うまくいきませんでした。
:::


# Caseのレコードが表示されない

+ [No records are showing up in the filter your report challenge, even when I test it without the filters. Any suggestions?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000Tv36)

:::note
I would suggest trying a new playground or dev org.
:::