OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon ALB(ELBの一種)

## ALB(Application Load Balancer)とは
アプリケーション層(L7)で動くWebサービスのトラフィックを負荷分散させるAWSのロードバランシングサービス（ELB）の一部として利用できる機能

##  ALBの構成要素
### リスナー（Listener）
ALBが受け付けるリクエストのポートとプロトコルを定義します
#### ポート
ALBがリクエストを待ち受けるネットワークポート（例: HTTPの場合はポート80、HTTPSの場合はポート443）

#### プロトコル
通信に使用するプロトコル（例: HTTP, HTTPS）

### リスナールール（Listener Rules）
リスナーが受け取ったリクエストに対してどのターゲットグループに転送するかを決める条件
#### 主なルーティング条件
- パスベースルーティング
  - リクエストのURLパス部分に基づいてルーティングを行います
  - 例：`/api/*`というパスが含まれているリクエストはAPI用のターゲットグループにルーティングを行うなど
- ホストベースルーティング
  - リクエストのホスト名（ドメイン名）に基づいてルーティングを行います
  - 例：`api.example.com`というホスト名のリクエストをAPIサーバー用ターゲットグループにルーティングを行うなど
- ヘッダー、クエリパラメータベースルーティング
  - リクエストのHTTPヘッダーやクエリパラメータに基づいてルーティングを行います
  - 例：ヘッダーに`X-Region: Japan`が含まれているリクエストの場合、日本リージョンのターゲットグループにルーティングを行うなど

### ターゲット（Target）
実際にリクエストを処理するバックエンドリソース
#### ターゲットのリソース
- EC2インスタス: アプリケーションサーバーやWebサーバー
- ECS（Elastic Container Service）: コンテナ化されたアプリケーション
- Lambda関数: サーバーレスアーキテクチャでの処理
- IPアドレス: オンプレミスや異なるVPC内のサーバー

### ターゲットグループ（Target Group）
複数のターゲットをグループ化するための単位であり、ALBがリクエストを転送する先となるリソースの集合

#### ターゲットの管理
同じ目的を持つターゲット（EC2インスタンス、ECSタスク、Lambda関数など）をグループ化して、効率的に管理できます

#### ヘルスチェック
ターゲットが正常かどうかを監視するヘルスチェックが設定できます。正常なターゲットにのみリクエストが転送されるように動作します

#### 柔軟なルーティング
リスナールールに基づいて、ALBがリクエストを適切なターゲットグループに転送します

## ロードバランサーとは
複数のサーバーにトラフィックを分散して負荷を均等にする仕組み

## ロードバランサーの種類
### ALB（Application Load Balancer）
アプリケーション層(L7)で動作するロードバランサー
#### 使用目的
- Webアプリケーションを作成する場合
- HTTPリクエストの負荷分散を行う場合

### NLB（Network Load Balancer）
トランスポート層(L4)で動作するロードバランサー
#### 使用場面
TCP/UDPアプリ（固定IPが必要）

### CLB（Classic Load Balancer）
- 従来型（旧世代）のロードバランサー
- 新規利用は非推奨

## ALBの機能
### ルーティング
- パスベースルーティング
- ホストベースルーティング
- ヘッダー・クエリパラメータベースルーティング
- メソッドベースルーティング
  - HTTPメソッド（GET, POST, PUT など）に応じたルーティングが可能です
- Cookieベースルーティング
  - 特定のCookieがある場合に異なるターゲットグループをルーティングできます

### 負荷分散
複数のターゲット（EC2インスタンス、ECSコンテナ、Lambdaなど）にトラフィックを分散させ、負荷を均等化します
- ターゲットのヘルスチェックを実施し、正常なターゲットにのみリクエストを転送
- スケールアウトに対応し、増減するターゲットに適応
- 複数のアベイラビリティゾーン（AZ）にまたがる分散も可能

### ヘルスチェック
ターゲットのヘルスチェックを行い、正常に応答できるターゲットにのみトラフィックを送ります

### セッション維持
特定のユーザーが同じターゲットにリクエストを送り続けるようにする機能です
- Cookieベースのセッション維持（ターゲットグループで設定可能）
- ユーザーごとのセッションを維持することで、特定の処理が必要なアプリケーション（ショッピングカートなど）に適している

### TLS/SSLターミネーション
TLS/SSL証明書を管理し、HTTPSリクエストをオフロードできます
- ACM（AWS Certificate Manager）と統合し、証明書の自動更新が可能
- HTTPSリクエストをALBで処理し、バックエンドにはHTTPで転送して負荷を軽減
  - SSL/TLSの暗号化・復号処理はCPU負荷が高いから

#### HTTPSオフロードの流れ
1. クライアント（ブラウザやアプリ）がHTTPSリクエストを送信
2. ALBがSSL/TLSの復号を行い、プレーンなHTTPリクエストに変換
3. ALBがバックエンドサーバー（EC2やコンテナ）にHTTPリクエストを転送
4. バックエンドサーバーがレスポンスを返す
5. ALBがレスポンスを受け取り、再びHTTPSで暗号化してクライアントへ送信

### Lambdaとの統合
ターゲットとしてLambda関数を直接呼び出し可能です
- サーバーレスアプリケーションのロードバランシングが可能
- REST APIのフロントエンドとしてLambdaを使用可能

### WebSocket & HTTP/2
- WebSocket をサポートし、リアルタイム通信が可能（チャットアプリ、ゲームなど）
- HTTP/2 をサポートし、高速な通信が可能

### WAF統合
- AWS WAF（Web Application Firewall）と統合し、不正アクセスやDDoS攻撃から保護
- SQLインジェクションやXSS攻撃を防ぐルール設定が可能

### アクセスログ & 監視
- CloudWatchと統合し、トラフィックやエラーレートを監視
- S3にアクセスログを保存し、分析が可能

## まとめ
ALBは、AWSのロードバランシングサービスの一部で、Webサービスのトラフィックを効率的に負荷分散し、アプリケーション層で細かいルーティングやセッション維持などを提供します。これにより、スケーラブルで高可用性のあるアプリケーションを実現し、TLS/SSLターミネーションやヘルスチェック機能でセキュアな運用が可能になります。
元ヤフーエンジニア社長が考える、ITエンジニアに向いている人/向いていない人

## 自己紹介
株式会社PRUMという会社の代表をしています。岩本です。  
[PRUM公式サイト](https://prum.jp/)  

SES企業でエンジニアとして就業したのち、ヤフーでもエンジニアとして働いておりました。  
2019年、PRUMを創業し、組織を5期目の途中で70名の規模まで成長させました。  
エンジニアの成長について、誰よりも考え抜いてきた自信があります。  


### はじめに

IT業界は現在も成長を続けており、エンジニアの需要はますます高まっています。
前回の記事では、「エンジニアほど魅力的な仕事はない」とお伝えしましたが、
今回は、ITエンジニアに向いている人と向いていない人の特徴について、具体的に解説していきます。

---

## 向いている人の特徴

### 1. **問題解決が好きな人**
ITエンジニアの仕事は、バグの修正やシステムの改善など、問題解決の連続です。
「どうすればうまくいくのか？」を考えることを楽しいと思える人はエンジニア向きです。

例えば、
- パズルや謎解きが好き
- 不具合があると「どうやって直すか」を考えてしまう
- 仕様変更にも柔軟に対応できる

こういった思考を持っている人は、エンジニアとして活躍できるでしょう。

### 2. **学習意欲が高い人**
IT技術は日々進化しており、常に新しい知識を学ぶ必要があります。

エンジニアに求められるのは、
- 最新の技術をキャッチアップする姿勢
- 新しいプログラミング言語やフレームワークを学ぶ意欲
- エラーや問題を自分で調べて解決する力

常に学び続けられる人こそ、価値のあるエンジニアとして長く活躍できます。

### 3. **論理的に考えられる人**
プログラミングは、論理的な思考が求められる仕事です。

例えば、
- 「なぜこのコードは動かないのか？」を順序立てて考えられる
- データの流れや処理の順番を整理できる
- 感情ではなく、根拠に基づいて判断できる

こういった論理的思考が得意な人は、エンジニアとしての適性があります。

### 4. **コツコツ作業が苦にならない人**
エンジニアの仕事は、短期間ですぐ成果が見えるものではありませんし、コードを書き続けるような地道な作業も多いです。

- 小さなエラーを何時間もかけて修正する
- 仕様書やドキュメントをしっかり読んで実装する
- 1つの機能をじっくり作り上げる

「成果の実感がなくてもコツコツ頑張ることができる」「地味な作業でも集中して続けられる」人は、エンジニア向きと言えます。

営業職などは、「入社1年目の新人がTOPセールスに！」と言うような話を聞いたことがある人もいるかもしれませんが、エンジニアの世界では100%ありません。
1年目のエンジニアが、10年目のエンジニアより技術力が高い、ということは起きえないです。それだけ経験と知識が非常に大事な仕事です。

逆を言えば、コツコツ積み上げることさえできれば誰でも優秀になれるのがエンジニアの魅力です。

---

## 向いていない人の特徴

### 1. **学ぶのが嫌いな人**
IT業界は常に新しい技術が登場するため、学習を避けることはできません。

- 「新しいことを覚えるのが面倒」
- 「一度学んだ技術だけでずっと仕事したい」

こういった考えの人は、エンジニアとして成長が止まってしまいます。

### 2. **細かい作業が苦手な人**
プログラムは1文字のミスでも動かなくなることがあります。

- 「細かいミスをよくする」
- 「エラーメッセージを読むのが面倒」
- 「同じ作業を繰り返すのが苦痛」

こういった人は、エンジニアの仕事にストレスを感じるかもしれません。

### 3. **チームでのコミュニケーションが苦手な人**
「エンジニア＝1人で黙々と作業する仕事」と思われがちですが、
実際はチームで協力する場面が多いです。

- クライアントや上司と仕様の確認
- 他のエンジニアとのコードレビュー
- チーム内での情報共有

「人と話すのが極端に苦手」「報告・相談をしない」という人は、
エンジニアとしての仕事がスムーズに進まないことがあります。

### 4. **結果がすぐに出ないと飽きる人**
エンジニアの仕事は、すぐに成果が見えるわけではありません。

- コードを書いてもすぐには結果が出ない
- 長期間かけてシステムを作る必要がある
- バグ修正に何時間もかかることがある

「すぐに結果が出ないとやる気がなくなる」タイプの人は、エンジニアの仕事に向いていないかもしれません。

---

## まとめ

ITエンジニアに向いている人の特徴 ✅
- 問題解決が好き
- 学習意欲が高い
- 論理的思考ができる
- コツコツ作業が得意

ITエンジニアに向いていない人の特徴 ❌
- 学ぶのが嫌い
- 細かい作業が苦手
- コミュニケーションが極端に苦手
- 結果がすぐに出ないと飽きる


### 最後に

エンジニアは「手に職」を持つだけでなく、働きやすい環境や豊かなキャリアパス、成長実感といった多くの魅力を持っています。
これからの時代、IT技術の需要はますます高まるばかりです。
もしあなたが「自分に向いているかも...？」「挑戦してみようかな」と少しでも思ったなら、ぜひ一歩を踏み出してみてください！

---

PRUMのエンジニアの95%以上は、未経験からの採用です。
ぜひ、求人をチェックしてみてください！

▼ Wantedly求人
https://www.wantedly.com/projects/626662

▼ コーポレートサイト
https://prum.jp/

VISION 『日本で一番エンジニアが成長する会社を創る』

ご応募お待ちしておりますー！
箱庭でUnityを動かしてみる（6日目）

# 2025/03/14(6日目)実施内容
## 射撃機能を実装
ゲームルール自体は作っていないが，先に射撃する体だけを作る
-> 割と手こずって1日かかった...

でも形は完成

## センサの実装
「ロボットの前方に敵がいるか」等の条件因子が欲しいため，前方を認識するセンサを実装したい！
が，それは次回で...

### 進捗
Unity内部のスクリプトからデモを再生するくらいができた
センサを実装したら，次はゲームルールの作成をやる
Copilot演習シナリオ：業務フローへのDX/AXアプローチ

### Copilot 無償版

あなたは客先に常駐するエンジニアです。
業務フローを可視化し、DX/AXを推進したいと考えています。
Copilotを使ってこの活動へのアプローチを始めてみましょう。

次のプロンプトを入力してください
~~~
#背景
私は顧客に常駐するエンジニアです。
業務フローを可視化したいと考えています。
#命令
入力内容を分析し、BPMNとして分解、整理してください。
#入力
"""
ネットワークエンジニアとして障害対応を行います。監視、連絡、対応、報告などの業務を行っています。
"""
#出力
分析したBPMNをテキストフロー形式で出力してください。
~~~
業務が分解され、フローとして表示されました。
分岐が発生するフローなので、フロー内に分岐を設けてみます。
~~~
障害検知の部分で分岐が発生する想定で修正してください。
~~~
分岐条件が追加され、実際の業務フローに近づいたことが確認できます。
必要に応じて分岐を追加するプロンプトを繰り返し実行してください。

十分に分解できたと感じたら、次のステップに進みましょう。
各タスクの中でDX/AXを活用できる個所、どのように活用するか生成させてみます。
~~~
これらのフローの中で次のツールを活用して省力化ができるポイントをレポートに含めてください。
1.Power Platform
2.Microsoft Copilot
それぞれに対して3点、具体的な活用方法を提示してください。
~~~
Power PlatfromもしくはCopilotを活用すればよいか、具体的な例が表示されました。

次のような事柄について、自身でプロンプトを記述し、Copilotに投げ込んでみましょう。
「以前の生成結果を修正してください。」といった意味の文言がプロンプトに含まれない場合、新規の生成依頼として受け取ってしまうため、必ず含めるように注意してください。
・どの程度の定量的な成果が見込めるか？
・どの程度の定性的な成果が見込めるか？
・成果を出すためにはどの程度の期間が必要か
・成果を測定するための具体的な手法は？

この演習はこれで終了です。
みなさまの業務にあわせてご活用ください。
Google Chat API - thread返信編

## 概要
Google Chat APIを利用したが、スレッドで返信するのに結構詰まったので簡単にまとめる

## 失敗した理由
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/93d7167b-8279-4301-80d3-2f6ec2f98ff3.png)
（[公式の記事](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages/create?hl=ja#MessageReplyOption)）
ここで指定する必要があることに気が付かなかった

参考になった記事

https://qiita.com/ydclab_0007/items/7c4fa16fd09467157452

## 実際のコード
```js
require('dotenv').config();
const chat = require('@googleapis/chat');

/**
 * 親メッセージを送信し、そのスレッドに子メッセージを送信する関数
 */
async function main() {
  // 認証設定
  const auth = new chat.auth.GoogleAuth({
    keyFilename: '.credentials.json',
    scopes: [
      'https://www.googleapis.com/auth/chat.bot', // 今回はbotで作成したためこんな感じ
    ],
  });
  const authClient = await auth.getClient();
  const chatClient = chat.chat({ version: 'v1', auth: authClient });

  const spaceName = process.env.SEND_PLACE;
  if (!spaceName) {
    console.error('環境変数 SEND_PLACE が設定されていません。');
    return;
  }

  const parentMessageText = '親メッセージ';

  const childMessageText = '子メッセージ（スレッドへの返信）';

  try {
    // 親メッセージを送信
    const sendParentMessageResult = await chatClient.spaces.messages.create({
      parent: spaceName,
      requestBody: {
        text: parentMessageText,
      },
    });

    const parentMessageData = sendParentMessageResult.data;
    if (
      !parentMessageData ||
      !parentMessageData.thread ||
      !parentMessageData.thread.name
    ) {
      console.error(
        '親メッセージの送信に失敗したか、スレッド情報が見つかりません。'
      );
      console.log('親メッセージ送信結果:', parentMessageData); // デバッグ用
      return;
    }
    
    // 親メッセージのレスポンスからスレッドIDを取得
    const threadName = parentMessageData.thread.name;

    console.log(`親メッセージ "${parentMessageText}" を送信しました。`);
    console.log('親メッセージ送信結果:', parentMessageData);
    
    // 子メッセージを親メッセージのスレッドに送信
    const sendChildMessageResult = await chatClient.spaces.messages.create({
      parent: spaceName,
      requestBody: {
        text: childMessageText,
        thread: {
          name: threadName,
        },
      },
      messageReplyOption: 'REPLY_MESSAGE_OR_FAIL', // ここが重要
    });

    console.log(
      `子メッセージ "${childMessageText}" をスレッド "${threadName}" に送信しました。`
    );
    console.log('子メッセージ送信結果:', sendChildMessageResult.data);
  } catch (err) {
    console.error('処理中にエラーが発生しました:', err);
  }
}

main();
```

この一行を追加することでスレッドに返信が可能である
```diff_javascript
+ messageReplyOption: 'REPLY_MESSAGE_OR_FAIL', // ここが重要
```

## まとめ
設定探すの大変。それ以上にGoogleChat利用するためにアプリの設定とか構成やるのマジで面倒くさい、、、
【PHP】インデントを保ちながらヒアドキュメントを使いたい※php7.0では不可能

# PHP 7.0では、ヒアドキュメントのインデントが不可
```PHP
<?php
$heredoc = <<<EOD
    これはヒアドキュメントの例です。
    インデントを保ちながら
    複数行のテキストを記述できます。
EOD;
echo $heredoc;
?>
```
# PHP 7.3以降では、ヒアドキュメントのインデントが可能
```PHP
<?php
$heredoc = <<<EOD
    これはヒアドキュメントの例です。
    インデントを保ちながら
    複数行のテキストを記述できます。
    EOD;
echo $heredoc;
?>
```
SwiftUIでパスワード入力UIを実装する

# はじめに
今回はよくあるパスワード入力用UIを実装していきます
### 実装コード
細かい点などはコメントで記載してあります
```swift
struct PasswordInputFieldView: View {
    let titleKey: String
    @Binding var text: String
    var hasError: Bool

    @State var isShowSecure = false
    @FocusState var isTextFieldFocused: Bool
    @FocusState var isSecureFieldFocused: Bool

    private var isFocused: Bool {
        isTextFieldFocused || isSecureFieldFocused
    }

    var body: some View {
        HStack {
            // ZStackで同一箇所に表示してopacityで切り替える
            ZStack {
                TextField(titleKey, text: $text)
                .focused($isTextFieldFocused)
                 .keyboardType(.asciiCapable)
                 .autocorrectionDisabled(true)
                 .textInputAutocapitalization(.none)
                 .opacity(isShowSecure ? 1 : 0)

                SecureField(titleKey, text: $text)
                 .focused($isSecureFieldFocused)
                 .opacity(isShowSecure ? 0 : 1)
            }
            .frame(height: 40)
            // 表示切り替え用ボタン
            Button {
                if isShowSecure {
                    isShowSecure = false
                    isSecureFieldFocused = true
                } else {
                    isShowSecure = true
                    isTextFieldFocused = true
                }
            } label: {
                Image(isShowSecure ? .openEyeIcon : .closeEyeIcon)
                    .frame(width: 24, height: 24)
                    .disabled(true)
            }
            .buttonStyle(.plain)
        }
        .padding(.horizontal, 6)
        .frame(height: 40)
        .background(hasError ? Color.red : Color.white)
        .overlay(
            // 入力欄用の枠組
            RoundedRectangle(cornerRadius: 8)
                .stroke(
                    hasError ? Color.red :
                        isFocused ? Color.blue : Color.black,
                    lineWidth: 1
                )
        )
        .tint(hasError ? Color.red : Color.blue)
    }
}
```
### 最後に
実装する機会の多いUIなので自分でもパッとコピペできるように備忘録としての役割が強いですが、どなたかのお役に立てれば幸いです
PC・iPhone・アンドロイドの範囲選択終了のイベント

# PC・iPhone・アンドロイドの範囲選択終了のイベント

# 【PC】mouseupを使う
```javascript
const isMobile = /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(userAgent);
const isAndroid = /android/i.test(userAgent);

if (isMobile) {
}else{
    $(document).on("mouseup", function () {
        setTimeout(function () {
            let selectedText = getSelectedText();
            if (selectedText) {
                console.log("選択されたテキスト:", selectedText);
            }
        }, 100);
    });
}
```

# 【iPhone】touchendを使う
```javascript
const isMobile = /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(userAgent);
const isAndroid = /android/i.test(userAgent);

if (isMobile) {
    if (isAndroid) {
    }else{
        $(document).on("touchend", function () {
            setTimeout(function () {
                let selectedText = getSelectedText();
                if (selectedText) {
                    console.log("選択されたテキスト:", selectedText);
                }
            }, 100);
        });
    }
}
```

# 【Android】selectionchangeを使う
```javascript
const isMobile = /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(userAgent);
const isAndroid = /android/i.test(userAgent);

if (isMobile) {
    if (isAndroid) {
        $(document).on("selectionchange", function () {
            setTimeout(function () {
                let selectedText = getSelectedText();
                if (selectedText) {
                    console.log("選択されたテキスト:", selectedText);
                }
            }, 100);
        });
    }
}
```

# 選択中のテキストを取得する関数
```javascript
if (isMobile) {
    if (isAndroid) {
        function getSelectedText() {
            if (window.getSelection) {
                return window.getSelection().toString().trim();
            }
            return "";
        }
    }
}
```
Application Design Centerを触ってみた

# はじめに
2025年3月，Google Cloudから新たに「Application Design Center」がプレビュー版としてリリースされました．このツールは，GUI上でインフラの設計・構築・デプロイが可能であり，Terraformコードとの連携もサポートしています．今回は，このApplication Design Centerを実際に触ってみた体験をお伝えします．

https://cloud.google.com/application-design-center/docs

# お題
## 基本的なバックエンドサービス
まず，Application Design Centerを使用して基本的なバックエンドサービスを構築してみました．GUI上で必要なリソースをドラッグ＆ドロップし，構成図を作成します．作成した構成図から自動的にTerraformコードが生成され，デプロイまで一貫して行うことができました．これにより，従来手動で行っていたコードの記述やデプロイ作業が大幅に効率化されました．

UI上で構成をペチペチすれば完了で，デプロイを押すと，裏でCloud Buildが走り，Terraformの実行をおこないます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/722cf7a7-c9d6-49d6-a5dd-84f79f601d1a.png)


## RAG

次に，Retrieval Augmented Generation（RAG）の概念を取り入れたアプリケーションを設計してみました．RAGは，外部データを参照して生成AIの回答精度を向上させる技術であり，最新情報の取得やハルシネーションの回避といったメリットがあります．RAGに関しては[こちら](https://qiita.com/mrsd/items/2269caf36bb5531ba25a)に優良記事があります．Application Design Centerを活用することで，RAGを組み込んだアプリケーションの設計・デプロイが容易になりました．RAGに関してはGoogle Cloudがテンプレートを提供しているため，そちらをそのまま使ってみます．
デプロイされたものを確認すると，一瞬でRAGが構築できておりました．今回はテンプレートのコンテナを利用しているため特に問題なくできました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/7ad614b1-7c32-42d1-a668-a23e966523fd.png)


↓ フロントエンド

![スクリーンショット 2025-03-13 16.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/5efe7d05-7c33-4a2a-aeea-362cf6da79af.png)

↓ Cloud SQL内(バックエンド起動時にデータを投入している)

![スクリーンショット 2025-03-13 16.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/f0f0adc1-f4e3-43c0-a64e-6e9634f4fa49.png)



# メリット
Application Design Centerを利用することで，以下のメリットを感じました．

- 効率的なインフラ設計：GUI上で視覚的にリソースを配置し，構成図を作成できるため，インフラ設計の効率が向上しました．
- 自動コード生成：構成図から自動的にTerraformコードが生成されるため，手動でのコード記述によるミスが減少しました．
- 一貫したデプロイプロセス：設計からデプロイまでを一貫して行えるため，作業のスピードと精度が向上しました．
- テンプレートを共有することができるので，別プロジェクトへの移行やdev, staging, prodを簡単に構築することができます．

# 所感
Application Design Centerは，インフラエンジニアだけでなく，開発者やプロジェクトマネージャーにとっても有用なツールだと感じました．特に，視覚的なインフラ設計や自動コード生成機能は，プロジェクトの効率化と品質向上に寄与します．今後，さらに機能が拡充され，正式リリースされることを期待しています．
現状コストも発生していません．

# まとめ
Google CloudのApplication Design Centerは，インフラ設計・構築・デプロイのプロセスを大幅に効率化するツールです．プレビュー版ながら，その有用性を実感できました．今後の正式リリースに向けて，さらなる改善と機能追加が期待されます．

また今後，構成図をUI上で作る必要もなくなることは明らかでしょう．「〇〇の構成でサービスを作って」と自然文を入力として，Cloudアーキテクトが完成してしまう未来はすぐに来る気がしています．Application Design Centerを使いこなす力をつけるよりも，プロンプト力を鍛えたり，出力された構成を正しく見極められる力を養ったりするところにフォーカスするほうが有益だと感じています．そのうえでサクッとCloud環境を構築してくれるApplication Design Centerを用いることが望ましいと考えます．


# 参考
- [Application Design Center 概要](https://cloud.google.com/application-design-center/docs/overview)
- [Google CloudのTerraform職人が失職する機能が出てしまった……](https://zenn.dev/nnaka2992/articles/intro_to_application_design_center)
最近良く見る「アウトプット」「アウトカム」「インパクト」とは何か？

# はじめに

最近、開発をしているとこれらの言葉を耳にすることが大分増えました。

- **Output（アウトプット）**
- **Outcome（アウトカム）**
- **Impact（インパクト）**

当たり前のように使い始めていましたが、気になったので、どのようなに経緯で広まったのか調べてみました。

簡単な言葉の解説と共に紹介します。

# 解説

大まかな関係を図示しました。

```mermaid
  flowchart LR
    Activities(プロジェクト<br>活動)-->**Output**-->**Outcome**-->**Impact**
    style Activities stroke-dasharray: 5 5    
```

## Output（アウトプット）

- プロジェクトや活動の**直接的な成果物や結果**を指す
- **具体的**で**測定可能**なものである
- プロジェクトの**完了時点で得る**ことができる

**例**

- リリースされた機能
- 公開されたマニュアル

## Outcome（アウトカム）

- Outputがもたらす**短期的な効果**を指す
- プロジェクトや活動が終了した後に**観察される変化や影響**である
- Outcomeを**複数に分けて**いるケースもある ex. 短期・中期・長期

**例**

- 機能の利用による顧客満足度の向上
- マニュアル記載による問い合わせ工数の削減

## Impact（インパクト）

- Outcomeがさらに広範囲に及ぼす**長期的な影響**を指す
- 社会全体や特定のコミュニティに対する**最終的な効果**を意味する
- **Impactがない**ケースもある（複数Outcomeのケース）

**例**

- 問い合わせ工数の削減による業務効率の向上（コスト）
- 顧客満足度の向上による契約継続率の上昇（品質）

# 経緯

どのようなに広まったのか調べた結果です。

**※個人的な調査なので、間違っている可能性があるのでご注意ください。**

## User Story Mapping（ユーザー・ストーリー・マッピング）

ソフトウェア界隈で良く使われるようになったのは、**Jeff Patton**さんの影響が強いようです。

https://vimeo.com/206617354

ご本人のサイトがあり色々と紹介されています。

https://jpattonassociates.com/story-mapping/

## Logic Model（ロジック・モデル）

上記でソフトウェア界隈と書いたのは、**政府系の政策評価**にも良く利用されているからです。
こちらは**プロジェクトの計画、実行、評価を体系的に行うための手法**のようです。

https://en.wikipedia.org/wiki/Logic_model

**構成**

このモデルだと前ステップが明示的に定義されています。

```mermaid
  flowchart LR
    **Input**:::bold-->**Activities**:::bold-->Output-->Outcome-->Impact
    
    classDef bold stroke-width:3px;
```

- **Input（インプット）**: プロジェクトや活動のために投入されるリソース
- **Activities（アクティビティ）**: インプットを使用して行われる具体的な活動

**利用例**

内閣府ホームページを始め、多くの行政の政策評価で利用されています。

[[PDF] 社会的インパクト評価の普及促進に係る調査 最終報告書](https://www.cao.go.jp/others/kichou/ebpm/h28_si_chousa_11.pdf)

## Results Chain（リザルツ・チェーン）

日本語だと「**結果・成果の連鎖**」と言うようですが、記事は英語でも少なく、日本語は僅かでした。

以下のような使い分けのようです。

- ロジック・モデル：チェーン部分も含めた**因果関係の理論**
- リザルツ・チェーン：チェーン部分にフォーカスした**表現ツール**

# おわりに

メモ書きのような内容ですが、参考になれば幸いです。

# おまけ

話題のDeep Researchで調べてみたのですが、良く利用される単語の組み合わせだと、私の力量では期待する結果を得られなかったので、結局は自分で調べて書くことになりました。
OpenPages with WatsonでのTips - OpenPagesのフィールドとCognosのデータアイテムマッピング

OpenPages with Watsonは、Cognos Analyticsを同梱しておりCognos Analyticsのパッケージを自動的に生成する仕組みがあります。
この仕組みにより、OpenPages内の各オブジェクトが持つフィールドがCognosパッケージのデータアイテムにマッピングされるため、Cognos上でレポートを作成する際にOpenPagesで定義したフィールド名のアイテムをそのまま利用できます。

しかし、全く同じ定義をOpenPages上でしているにも関わらず、環境によってCognos上のデータアイテムが異なるOpenPagesのフィールドとマッピングされてしまう事があります。

次のようなケースです。

１．OpenPages上で、フィールドグループが異なるがフィールド名が同一、というフィールドが存在した場合
２．フィールド名が長く（40文字など）、末尾のみが異なるようなフィールドが存在した場合

１のケースでは、AというフィールドグループとBというフィールドグループがあり、それぞれにApproverという名称のフィールドが定義されていたとします。
この場合、同一名称のフィールドが同じフィールドタイプに存在する事になるため、Cognosパッケージ上では「Approver」と「Approver00」という形でアイテムが作成されます。
この時、以下のように、環境によって逆を指す場合があります。

【開発環境】
A.Approver - Approver
B.Approver - Approver00

【本番環境】
A.Approver - Approver00
B.Approver - Approver

これでは開発環境で作成したレポートが本番環境では期待通り動きませんので、このような環境による差異を是正する必要があります。

以下に是正手順を記載します。

１．環境ごとにOpenPagesのフィールドとCognosデータアイテムのマッピング情報を取得
２．差異を特定
３．修正するためのSQLを作成
４．SQLを実行し修正


１．環境ごとにOpenPagesのフィールドとCognosデータアイテムのマッピング情報を取得
下記のSQLを実行して、OpenPagesフィールドとCognosデータアイテムのマッピングを取得します。

SELECT rcp.*,pdef.name as "Field Name" ,pdef.bundlename as "Field Group Name" ,ast.name as "Object Type" FROM rps_obj_col_presets rcp ,propertydefs pdef ,assettypes ast WHERE rcp.property_def_id = pdef.propertydefid AND rcp.object_type_id = ast.assettypeid

結果は下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035689/70be9206-85fc-44be-8065-4396685ee3e5.png)


２．差異を特定
OpenPagesのフィールドは、下記の3つの列でユニークになります。
Object Type
Field Group Name
Field Name

各環境ごとに、この3つの組み合わせをユニークキーとして定義し、それぞれの環境のCOLUMN_NAMEが一致するか確認をします。
一致しない行があった場合、それぞれのOBJ_COL_PRESET_IDを記録しておきます。


３．修正するためのSQLを作成
修正するためのUpdate SQL文を作成します。
例えば、OBJ_COL_PRESET_IDが100と101でそれぞれ次のようなレコードがあったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035689/fd07cf2a-2e7b-44ed-b182-4cb2b7d5a74a.png)

これを逆にしたい場合には、次のようなSQLを用意します。
update rps_obj_col_presets set column_name = 'approver100' where OBJ_COL_PRESET_ID = 100
update rps_obj_col_presets set column_name = 'approver101' where OBJ_COL_PRESET_ID = 101

update rps_obj_col_presets set column_name = 'approver00' where OBJ_COL_PRESET_ID = 100
update rps_obj_col_presets set column_name = 'approver' where OBJ_COL_PRESET_ID = 101

最初の2行は仮のcolumn_nameにセットするためのSQL文です。
次の2行が、期待する変更を行うためのSQL文です。
OBJECT_TYPE_IDとCOLUMN_NAMEの組み合わせはユニークでなければならないためです。

他にも変更したいフィールドがある場合には、この手順を繰り返してSQL文を作成します。


４．SQLを実行し修正
このSQLを実行するためには、次の手順に従います。
１．OpenPages上でReporting Schemaを削除
２．OpenPagesのサービスを停止
３．SQLファイルを実行
４．OpenPagesのサービスを再開
５．OpenPages上でReporting Schemaを再作成
６．OpenPages上で、Framework Model Generationを実行

ここまで対応する事で、OpenPagesのフィールドとCognos Analyticsのデータアイテムのマッピングを修正する事ができます。


しかし、なにより重要な事はこのような事が起こらないようにすることです。
先に述べたような理由によりこのような事象が発生するため、OpenPagesでフィールドを追加する場合には次のルールを徹底する事を強く推奨します。

・フィールド名は全てユニークにする
・例えば、コード値で持つなど。例としては「PR001_XXX」のように、最初にオブジェクトの略称（ここではProcess）、次に通番、最後に5文字程度の分かりやすい略称、のような命名体系でフィールド名を作成する。

これにより、同一オブジェクトタイプの別フィールドグループに同一名称のフィールドが存在する事を回避でき、よって当事象も回避する事が可能です。

今回はOpenPagesでフィールドを追加する際に起こり得る問題事象の紹介とその修正方法、そもそもの回避方法をご紹介しました。
今後ともOpenPagesのTipsを紹介していきたいとおもい
Unity UGUI TextMeshProに背景色を付ける方法

以下のようにTextMeshProで文字の後ろに背景色を付ける方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/1d161384-0d7b-4a90-afe7-f8e1f04262c0.png)

TextMeshProのTextコンポーネント
![スクリーンショット 2025-03-14 150850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/55a80b5d-a4b2-4e57-a9cb-3e7b6c9b974d.png)

InspectorでTextMeshProのExtra SettingsのRich Textにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/a993b047-d7fe-4bd5-968f-61ce06ece990.png)


対象のテキストをmarkタグで囲みます。
mark=のあとにカラーコードを指定して背景色を好きな色にできます。
```
<mark=#FEE100>New Text</mark>
```
![スクリーンショット 2025-03-14 150950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/45dfd8be-dbbb-4ea8-98a3-557f5ba12900.png)


markタグの仕様では、通常テキストの前にmarkが表示されてしまいます。
以下のようにカラーコードに透明度を指定すると、後ろに表示されている文字も見えるようになります。
```
<mark=#FEE10050>New Text</mark>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/e11f9095-9451-4f6a-ab06-b15f580e86d1.png)

今回の場合は、このように表示するのではなく、文字の後ろにmarkを表示させるようにしたいので、
Extra SettingsのGeometry SortingをReverseに変更します。
![スクリーンショット 2025-03-14 151017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/04396b12-57c0-4f67-ba17-9839e10368c8.png)

文字の後ろにmarkが表示されるようになりました。
![スクリーンショット 2025-03-14 151033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/7e9d2d1d-0ace-48c6-8f29-57e948a6fe91.png)

paddingを設定することもできます。
```
<mark=#FEE100 padding="30,3 0, 0, 0">New Text</mark>
```
![スクリーンショット 2025-03-14 151102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616035/8f5b0228-c968-4b6a-9a55-862abec1b368.png)

# 参考

https://discussions.unity.com/t/background-behind-text-lines/837468/18
http://digitalnativestudios.com/textmeshpro/docs/rich-text/#mark
https://discussions.unity.com/t/how-to-set-text-background-color/718556
構造体のポインタを使う

質問：「構造体を使うとき，普通は構造体のポインタを宣言して使いますか？
構造体のポインタを宣言することのメリットは？」
以下はChatGPTの回答．

---

構造体を使用する際にポインタを使うかどうかは、状況に応じて異なりますが、**構造体のポインタを使用すること**にはいくつかのメリットがあります。以下にその利点を挙げます。

### 1. メモリ効率の向上
構造体をポインタで扱うことによって、構造体自体をコピーする必要がなくなります。構造体が大きい場合、ポインタを使ってそのアドレスだけを渡すことでメモリの使用を効率化できます。

例えば、構造体のサイズが大きい場合、構造体を値渡しで渡すとその構造体全体がコピーされてしまいますが、ポインタを渡すことでアドレスだけを渡すことができ、メモリ効率が良くなります。

```c
struct LargeStruct {
    int arr[1000];
    float val;
};

// 値渡し (コピーが発生する)
void foo(struct LargeStruct s) {}

// ポインタ渡し (コピーなし)
void bar(struct LargeStruct *s) {}
```

### 2. 関数間での変更の反映
ポインタを使うことで、関数の中で構造体の値を変更した場合、その変更が元のデータに反映されます。値渡しの場合、関数内での変更は元のデータに影響を与えませんが、ポインタ渡しであれば、呼び出し元の構造体も変更されます。

```c
struct Point {
    int x;
    int y;
};

// 構造体の値渡し
void modifyPoint(struct Point p) {
    p.x = 10;
    p.y = 20;
}

// 構造体のポインタ渡し
void modifyPointPtr(struct Point *p) {
    p->x = 10;
    p->y = 20;
}

int main() {
    struct Point p = {0, 0};

    modifyPoint(p);  // 変更なし
    printf("%d, %d\n", p.x, p.y);  // 0, 0

    modifyPointPtr(&p);  // 変更あり
    printf("%d, %d\n", p.x, p.y);  // 10, 20

    return 0;
}
```

### 3. 動的メモリ確保と柔軟性
ポインタを使うと、ヒープ領域に動的にメモリを割り当てることができます。これにより、プログラム実行中に構造体を必要なだけ動的に生成し、管理することができます。`malloc` や `free` を使ってメモリを動的に管理できるため、柔軟なデータ構造を作成することができます。

```c
struct Point {
    int x;
    int y;
};

int main() {
    struct Point *p = malloc(sizeof(struct Point));  // 動的にメモリを確保

    p->x = 10;
    p->y = 20;

    free(p);  // メモリ解放

    return 0;
}
```

### 4. 可変長構造体の作成
ポインタを使うことで、可変長の構造体を作成できます。例えば、ポインタを使って、構造体内の配列のサイズを動的に変更することができます。

```c
struct Point {
    int x;
    int y;
    int *data;  // 可変長データを格納するためのポインタ
};

int main() {
    struct Point p;
    p.x = 10;
    p.y = 20;
    p.data = malloc(100 * sizeof(int));  // 配列に動的にメモリを割り当てる

    // 使用後にメモリを解放
    free(p.data);

    return 0;
}
```

### 5. 引数の取り回しが簡単
構造体が大きくなると、関数にその構造体を引数として渡す際に、ポインタで渡す方が便利です。引数としてポインタを渡すことで、関数内で構造体をコピーするコストを避けることができ、効率的な引数の取り回しが可能です。

### 結論
- **メモリ効率の向上**: 大きな構造体をコピーせず、ポインタで渡すことでメモリを節約。
- **変更の反映**: ポインタを使えば、関数内で変更した内容が呼び出し元にも反映される。
- **動的メモリ管理**: ヒープ領域に構造体を動的に割り当て、柔軟にメモリを管理。
- **可変長構造体の作成**: 可変長のデータを扱うためにポインタを使う。
- **引数の取り回し**: 引数として構造体を渡す際に効率的。

構造体のポインタを使うことで、プログラムの効率性や柔軟性が向上します。
AndroidアプリでFlowとViewModelを使ったUIイベント管理方法の例

この記事では、Androidアプリ開発においてFlowとViewModelを利用し、ライフサイクルを意識しつつ効率的にUIイベントを処理する方法について、実例を交えて解説します。

## 構成要素の抽象化

- Fragment: イベントを受け取り、UI更新を担当
- ViewModel: イベントの発行・ビジネスロジックの実行を担当
- UseCase: ビジネスロジックを提供
- UiEvent: ViewModelからFragmentに渡されるイベント（画面遷移やエラー表示など）

## サンプルコード

### Fragment側のイベント監視設定

``` kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    viewModel.uiEvent
        .onEach { handleUiEvent(it) }
        .flowWithLifecycle(viewLifecycleOwner.lifecycle, Lifecycle.State.RESUMED)
        .launchIn(viewLifecycleOwner.lifecycleScope)
}
```

ここでのポイントは、flowWithLifecycleを使ってイベントの受け取りをライフサイクルに合わせることです。
画面が表示中（RESUMED状態）の時のみイベントが処理され、バックグラウンド状態での無駄な処理を防ぐことができます。

### ViewModelでのイベント発行（認証処理例）

``` kotlin
private val _uiEvent = Channel<UiEvent>()
val uiEvent = _uiEvent.receiveAsFlow()

fun verifyContentAccess(state: ContentAccessState) {
    viewModelScope.launch {
        val result = verifyContentAccessUseCase(state)
        _uiEvent.send(
            when (result) {
                is ContentAccessResult.Success -> UiEvent.NavigateToContent(state)
                is ContentAccessResult.Error -> UiEvent.ShowError(result.message)
            }
        )
    }
}

sealed class UiEvent {
    data class NavigateToContent(val state: ContentAccessState) : UiEvent()
    data class ShowError(val message: String?) : UiEvent()
}
```

ここではイベントを発行するのみにして、実際の処理はFragmentで行います。

### FragmentでUiEventのハンドリング

``` kotlin
private fun handleUiEvent(event: UiEvent) {
    when (event) {
        is UiEvent.NavigateToContent -> {
            navigateToContentScreen(event.state)
        }
        is UiEvent.ShowError -> {
            showErrorMessage(event.message ?: "予期しないエラーが発生しました。")
        }
    }
}

private fun navigateToContentScreen(state: ContentAccessState) {
    val action = CurrentFragmentDirections.actionToContentFragment(state)
    findNavController().navigate(action)
}

private fun showErrorMessage(message: String) {
    Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
}
```

## まとめ

Androidアプリ開発において Flow と ViewModel を活用した UIイベント処理は、
- ViewModel側でイベント発行（send）とビジネスロジックを分離し、Fragment側でイベント監視とUI処理を担当することで、役割分担が明確になります
- flowWithLifecycleを用いてライフサイクルを意識したイベント収集を行うことで、リソース消費を最適化し、画面の非表示時の無駄な処理を防ぐことができます
IPアドレス

## はじめに
みなさんこんにちは！
今回はIPアドレスについて勉強したので、アウトプットの一環として記事にしてみました！

:::note warn
※本記事はIT初学者が書いた記事のため、他の情報も参照してください。
:::

## IPアドレスとは
IPアドレスとは、ネットワークへ接続する機器に割り振られる、住所のようなものです。
ネットワークを通してやり取りを行う際に、**送信先の機器がどのネットワークに存在しているのかを識別するため**に利用されています。
手紙を送る時に、住所を書かないと手紙を送ることができないのと同じで、送信先の機器がどのネットワークに存在しているのか分かるようにする必要があります。
その際に用いられるのが、このIPアドレスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3417695/e4185afd-7ac8-4872-bba1-47bac2821bbb.png)

IPアドレスにはIPv4とIPv6があり、IPアドレスのバージョンを示しています。
普段皆さんがよく目にするのは、おそらくIPv4だと思います。
※今回はIPv6についての詳細は書きません。

## IPv4
・IPv4とは、10進数の数字を3つのドットで区切り、4つのグループに分けたIPアドレスのことで、1グループ8bitの合計32bitで構成されています。
利用可能範囲は「0.0.0.0～255.255.255.255」までの、約43億個利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3417695/bc8a0bfe-2f6b-4fdb-ba99-d3f3a6c10b68.png)

しかし、利用できるIPアドレスは約43億個しかなく、複数の機器でIPアドレスが被ることはできないため、人口や機器の数に対しIPアドレスの枯渇問題が懸念されていました。
そこで、IPアドレスをグローバルIPアドレスとプライベートIPアドレスに分けることで、IPアドレスの枯渇問題に対応しました。

## グローバルIPアドレス
外部のネットワークに接続できるIPアドレスのことで、誰でもアクセスすることができます。
しかし、グローバルIPアドレスは一意となっており、複数の機器で1つのIPアドレスを利用することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3417695/45d346ed-b673-4496-a268-aa0908f4c316.png)

## プライベートIPアドレス
プライベートIPアドレスとは、外部ネットワークに繋がらない家や会社内のネットワークのことで、主にルーターなどにつながったIPアドレスのことです。
プライベートIPアドレスの場合、自身の所属するネットワーク領域が別であれば、各領域のIPアドレス同士が被っても問題ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3417695/aeaedd8b-42d4-4c90-a472-6a5b3fd15a92.png)

しかし、私たちはGoogle検索やゲームなどで、外部ネットワークに繋がっていますよね？
なぜ繋がっているのかというと、ルーターがプライベートIPアドレスを、グローバルIPアドレスに変換してくれているため、外部のネットワークと通信を行うことができています。
この変換をNATやNAPTと言います。
NATやNAPTについては、別記事で書こうと思いますので、今回は書きません。

## まとめ
* IPアドレスとは、ネットワークを通じて機器同士のやり取りをする際に、送信先の機器がどのネットワークにいるのかを識別するためのアドレス
* IPアドレスにはIPv4とIPv6のバージョンがあり、IPv4は1グループ8bitの4グループ、計32bitで構成されている
* IPアドレスにはグローバルIPアドレスと、プライベートIPアドレスが存在している
* 自宅などから外部ネットワークとやり取りをする際には、NATやNAPTと呼ばれるもので変換され、外部のネットワークと通信することができている
他にも細かい部分はありますが、それは追々記事にできたらと思います。
オブジェクト指向とは？わかりやすく解説

# 1. はじめに
#### なぜオブジェクト指向が重要なのか？
　オブジェクト指向は、現代のソフトウェア開発において最も広く使われているプログラミングパラダイムのひとつです。
　プログラムで利用される機能を ”物/部品” として捉えて、各オブジェクトを組み合わせることによりシステムを完成させる概念です。
　Java、Python、C++ など、多くの言語で採用されており、オブジェクト指向を学ぶメリットは大きく3つあります。

①コードの再利用性：既存のクラスを流用しやすく、他のシステム開発でも再利用することも可能です。
②可読性の向上：クラスやメソッド単位で整理されるため、可読性が高くなりプログラムの質が向上します。
③拡張性の確保：仕様変更が容易となり、カスタマイズ性を高めることが可能です。

#### 手続き型プログラミングとの違い
手続き型プログラミングとの違いを理解し、オブジェクト指向の重要性を確認しましょう。
| 比較 | 手続き型 | オブジェクト指向 |
|:-:|:-:|:-:|
| コード管理 | 関数の集合 | クラスとオブジェクト |
| データの扱い | グローバル変数 | カプセル化 |
| 拡張 | 難しい | 継承やポリモーフィズム |
| 言語 | C、Bash、Pascal | Java、Python、C++ |

# 2. オブジェクト指向の基本概念
#### オブジェクトとは？
オブジェクトは「データ＝状態」と「振る舞い＝メソッド」を持つもの。
現実のモノをプログラム内で表現できる。
オブジェクト同士の関係性を作ることで、より現実的なシステムを構築できる。
#### クラスとは？
クラスは設計図であり、オブジェクトを作るためのテンプレートである。
同じクラスから複数のオブジェクトを作成することができる。
オブジェクトごとに異なるデータを持たせることができる。
#### インスタンスとは？
インスタンスは、クラスから作られたオブジェクトの具体的な実体です。
クラスをインスタンス化することで具体的なデータを持たせることができる。
インスタンスごとに異なるデータを設定することができる。

# 3. オブジェクト指向の4大要素を詳しく解説
オブジェクト指向の核となる4つの概念を、具体例と共に説明します。
#### (1) カプセル化（Encapsulation）
データを外部から直接変更できないように保護する仕組み。
データを適切に保護することでバグや不正な操作を防ぐ。
#### (2) 継承（Inheritance）
既存のクラスを拡張して新しいクラスを作る仕組み。
コードの重複を減らし、メンテナンスしやすくする。
#### (3) ポリモーフィズム（Polymorphism）
同じメソッド名で異なる動作を実現できる仕組み。
#### (4) 抽象化（Abstraction）
細かい実装を隠し、重要な部分だけを提供する仕組み。
抽象化により、共通のインターフェースを持つが実装は自由

# 4. オブジェクト指向の設計原則（SOLID原則）
#### より良い設計のための5つの原則
①単一責任の原則（SRP）: クラスは1つの責務のみを持つ
②オープン・クローズドの原則（OCP）: 既存コードを変更せず、多態性によるクラスの拡張が可能
③リスコフの置換原則（LSP）: サブクラスは親クラスと完全に置き換え可能
④インターフェース分離の原則（ISP）: 不要なメソッドを持たず、あるクラスが提供する機能のみを持つ
⑤依存性逆転の原則（DIP）: 具体的な実装ではなく抽象に依存する

# 5. よくある間違いとアンチパターン
#### 巨大クラス
1つのクラスにすべての機能を詰め込むと、管理が困難になります。
そのため、責務を分割して適切にクラス分けを行いましょう。

#### 継承の乱用
やみくもくクラスを継承しすぎてしまうと、変更が難しくなります。
オブジェクトの組み合わせを活用しましょう。

#### 過度な抽象化
抽象クラスやインターフェースを増やしすぎると、コードが複雑になってしまいます。
必要な部分だけを抽象化すると良いでしょう。

# 6. まとめ
オブジェクト指向が重要な理由は、コードを管理しやすくし、拡張しやすいという点です。
オブジェクト指向を理解することで、より保守性の高いコードが書けるようになります！
シリコンバレーのエンジニアによる講義！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032401/023b43b7-4d6c-4d39-acda-5f2173a144dd.png)



こんにちは、韓国在住のsanaです！

-UC BerkeleyEECSを専攻
-シリコンバレーで15年以上ソフトウェアエンジニア経験
-現在はシリコンバレーのビッグテック本社で、Staff Software EngineerとしてビッグデータとDevOpsを担当

現役エンジニアとしてシリコンバレーで勤務しているミクエンジニア講師による初心者から経験者にもおすすめの講義を紹介します！

講師がシリコンバレーの革新現場で得た技術とノウハウを皆さんにも共有できたらなと思いおすすめします。



:star:入門者・初心者おすすめ:star:
https://u.inf.run/3XPG7PU
https://u.inf.run/3DEa12S
https://u.inf.run/3DEa12S

:star:経験者おすすめ:star:
https://u.inf.run/4hzFWPG

今日も一緒に頑張りましょう～　ファイティン！
【Teams電話】ボイスメールが届かない原因

# はじめに


ボイスメールが録音されると、通常は Teams クライアントの着信履歴に表示され、トランスクリプトと音声を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/40510852-402d-4004-942f-f2d525030228.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/4b686450-5408-4865-9ae1-d42d06ae7300.png)

ボイスメールが録音されたにも関わらず、Teams クライアントに表示されない場合、何らかの理由でボイスメールの受信がブロックされている可能性があります。

この記事では、ボイスメールがブロックされる主な原因についてまとめました。

(参考：クラウド ボイスメールのセットアップ)
https://learn.microsoft.com/ja-jp/microsoftteams/set-up-phone-system-voicemail

# ボイスメールが届かない場合

Teams クライアントにボイスメールが表示されない場合、同じユーザーで Outlook のメールボックスを確認して、ボイスメールが届いているかどうかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ad4a4941-b839-4edc-95b6-8e79e4b557bd.png)

Outlook からもボイスメールが確認できなければ、Exchange Online でのメールの受信がブロックされていることが原因と考えられます。

::: note
Teams クライアントも Outlook と同様に Exchange Online のメールボックスに届いたボイスメールを表示しています。
:::

## ボイスメールを受信できない主な原因

ボイスメールの受信がブロックされている場合、ユーザーの Teams クライアントには、通話がボイスメールへ転送されたことを示す着信履歴のみが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/153903ff-b99c-476c-b60b-ebe06e9daed8.png)

以下のような原因が考えられます。

### 1. 送信元アドレスがブロックされている

ボイスメールは以下の送信元アドレスから送信されます。以下のアドレスからのメール受信をブロックしていると、ボイスメールを受信できません。

```
noreply@skype.voicemail.microsoft.com
```

::: note warn
Teams を利用していても、送信元のアドレスは "skype" となっているため注意が必要です。
:::

### 2. 添付ファイル付きのメールがブロックされている

ボイスメールには、録音された音声が mp3 ファイルとして添付されています。そのため、添付ファイルのあるメールの受信をブロックするよう制御している場合、ボイスメールを受信できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/2ae8ec9e-aff3-4a4e-a6ed-407b8346b702.png)

#### Exchange Online Protection (EOP) 

例えば、Microsoft Defender の EOP では、特定の拡張子の添付ファイルをブロックするポリシーを作成できます。このようなポリシーが適用されているユーザーはボイスメールを受信できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/32813d49-19ce-4132-b6eb-39be6e1aa803.png)

この場合、EOP でメールがブロックされていないかどうかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ba0b0964-9d15-4439-abfb-72b5b8a2f58b.png)

(参考：Exchange Online Protection の概要)
https://learn.microsoft.com/ja-jp/defender-office-365/eop-about
初心者が生成AIで個人開発するのは資格を問題集から勉強するのに似ているかも

生成AIを使ってプログラミングって便利だな～でも基礎を勉強したほうがいいよな～など思ったりする人も多いと思います。そこでふと思いました。

作りたいものを生成AIでコードを書きながら必要なことを学ぶことは資格の勉強をテキストから読まず問題集から始めるのと似てるのでは！？と感じる

どんな資格の勉強もテキストを読むより問題集から始めたほうが効率がよいっていいますよね

生成AIでアプリを作ったり個人開発するのは、開発したいものが問題集で、それを生成AIで答えを見てわからないところをテキストや公式ドキュメントをみて調べていくという流れなのではないかと思います。

初心者はとりあえずコードさえ動けばいいと思いますが生成AIを使えば、コードはきれいにかけますし、可読性が上がると思います

さらに、資格の試験とは違い、100％の絶対的正解があるのではなくいろんなアプローチががあるので、動いて楽しい完成して面白いという体験ができるのはとても素晴らしいのではないでしょうか

完成してあとから見直したときに無駄な処理などがあるかもしれませんが、成長していけば機能追加などするときに作り直そうって思いますよね

エラーも当然出ると思いますが、一人で悩むより生成AIに相談しながらエラーの対処法を相談していけばエラーが怖くなくなると思います

エクセルで表現すると、売り上げの合計を一つずつたすのと、sum関数で簡単に合計出すのも結果は同じ
1～100を足すのをfor文で足していくのと、数学の公式を使って足していくのも結果は同じ

AIを使うともしかしたら、数学の公式を紹介してくれて、ナニコレ便利じゃん！って教えてくれるかもしれません

まったくわからなくても、AIが作ったコードを読む練習をすることでプログラミング言語に抵抗がなくなるしこれはこれでいいのではないでしょうか

もちろんプロフェッショナルになればなるほど、いろんな制約がでてくるのでAIが使い物にならないかもしれません。でもこれからプログラミングを始めたい人は気軽に始められるいい環境なのではとおもいました

生成AIでプログラマーの仕事は減るといわれたりしますが、むしろ楽しく作れて初心者の敷居が下がり、すごいエンジニアの人たちはもっと効率よく考える時間が増えてすごいものが作れる環境になるんじゃないかなと勝手に思います
windows x chromeのkioskモードでサイネージ展示をやる

# 前提
windowsの展示のための各種セットアップが終わっている。
（アカウントもキオスク用にできるとなお良いが面倒なのでやらなくてもいい）

最新のchromeを利用している

# Google Chromeのupdateを停止する。
```
C:\Program Files (x86)\Google\GoogleUpdater\135.0.7023.0\updater.exe
```
の名前を変更する

変更後、ヘルプ→Chromeについてで下記のエラーが出ていればOK

![スクリーンショット 2025-03-14 140519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303906/2d8f44b6-e93b-47cf-a69f-0816897ccfde.png)

# 起動時にchromeのkioskモードが開く設定を行う

スタートアップフォルダへの追加では動かないので、
タスクスケジューラに追加する必要がある

タスクスケジューラ→基本タスクの作成から、

## 設定
- 名前
    - 適当
- トリガー
    - **ログオン時**
- タスク
    - **プログラムの開始**

プログラム/スクリプト

```
"C:\Program Files\Google\Chrome\Application\chrome.exe"
```

引数に、
```
--incognito --kiosk ${接続したいサイトのurl}
```

を入れる。

## ※位置調整がどうしても必要な場合
引数に下記を追加して地道に対応
```
--window-position=x,y
```

## その他設定
条件タブのチェックは全部消す

設定：
下記だけチェック入れる

- タスクを要求時に実行する
- 要求時に実行中のタスクが終了しない場合、タスクを強制的に停止する

あとはなんかあったとき用にデスクトップに復帰用ショートカットもいれｒ
FigmaのデザインからReactコードを生成するプラグインをブラッシュアップした話

# はじめに

前回の記事 [AmplifyのDesignToCodeからの脱却](https://qiita.com/mohi-to/items/4d387c5570d838bcc86b) では、FigmaのデザインをReactコードに変換するプラグインの開発を開始し、MVP（Minimum Viable Product）を作成しました。

今回は、Ver1 を実際に使ってみて見えてきた課題と、それを改善した Ver2 の開発について書いていきます。

# まずはVer1を作成
Ver1 では、以下のような機能を実装しました。

- **デザインから React のコードに変換**
  - Figma で選択したコンポーネントのデータを取得し、AWS Bedrock の Claude 3.5 Sonnet を使ってコードを生成。
- **画像とコードを ZIP でダウンロード**
  - デザイン内で使用されている画像と、生成されたコードをまとめて ZIP 形式でダウンロードできるように実装

# ハンズオンで評価してもらう
Ver1 を他チームメンバーを招きハンズオンで評価してもらいました。
「便利かも」と言う意見をもらったものの、いくつかの課題が浮かび上がってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971032/ec10ae10-8ea9-4094-bb5b-7e5438478528.png)

## **操作がわかりにくいという意見**
UI が直感的でなく、どこをクリックすれば何が起こるのか分かりづらいという意見がありました。特に次のようなフィードバックがありました。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971032/d8241308-6ee6-4558-a9f8-3c3e6e6d06ff.png)

:::note warn
【課題１】：コンポーネントを選択した状態でプラグイン起動すると処理対象のコンポーネントが選択状態になっていない
:::

:::note warn
【課題２】：生成ボタンを押した後、コード生成状況が分からず、処理が終わったのかどうかが判断しにくい  
:::

:::note warn
【課題３】：作成手順が煩雑（子コンポーネントを選んでコード生成したあと、親コンポーネントでコード生成）
:::

# Ver2 の開発と改善点

これらの課題を解決するために、Ver2 を開発しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971032/8408b7bc-2057-4b01-a111-683d44b362a9.png)

## **課題と対応**
:::note Info
【課題１】：コンポーネントを選択した状態でプラグイン起動すると処理対象のコンポーネントが選択状態になっていない

【対応】：コンポーネントを選択後、プラグイン起動で、コンポーネント選択状態にしました。
:::

:::note Info
【課題２】：生成ボタンを押した後、コード生成状況が分からず、処理が終わったのかどうかが判断しにくい

【対応】：生成ボタンを押した後、ローディング画像（ぐるぐる）を表示するようにしました。
:::

:::note Info
【課題３】：子コンポーネントを選んでコード生成したあと、親コンポーネントでコード生成の操作が煩雑

【対応】：子コンポーネントを含む親コンポーネントを選択した場合、親子のコンポーネントのコードを同時出力するようにしました。
:::

## **ローカルファイルの読み書きができない**
課題３の対応過程で、新たな問題が発生しました。

Ver1では、親コンポーネントを作成するAIプロンプトには子コンポーネントのコードを添付していました。
Ver2では生成ボタンが押されたら、子コンポーネントを先にローカルフォルダに作成し、連続して親コンポーネント作成を行い、この時、ローカルフォルダの子コンポーネントのファイルを読んで添付しようと考えました。
しかし、Figma プラグインの仕様上、ローカルファイルを直接保存することができませんでした。  

そのため、生成したコードをユーザーのPCに保存する方法を工夫する必要がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971032/20ce5c62-47d9-4aef-b162-48199978f097.png)

ローカルフォルダの代わりに、生成したコードを一時的に **AWS S3** にアップロードし、S3に保存したファイルを読むことでこの課題を解消することにしました。

この方法により、Figma のローカルファイル制約を回避しつつ、スムーズにコードを取得できるようになりました。

# まとめ

Ver1 で浮かび上がった課題を解決し、Ver2 ではより直感的な操作ができるようになりました。  
まだ改善の余地はありますが、実用レベルのプラグインに近づいてきた手応えを感じています。

今回の開発を通じて、**実際に使ってもらうことで初めて気づく課題がある** ことを改めて実感しました。  
開発者としては「これで使いやすいはず！」と思っていても、ハンズオンで実際に操作してもらうと、思わぬ意見に「はっ」とする気づきがありました。  
このことで、フィードバックをもらいながらブラッシュアップしていくことの大切さを再認識しました。

Ver2 でもこの後ハンズオンを実施する予定になっています。皆の反応が今から楽しみです！
【C#バグ探し】IList<T> は便利だけど

# お題

```c#
public void DoSomething(IList<int> numbers)
{
    foreach (int number in numbers)
    {
        Console.WriteLine($"処理1：{number}");
    }

    foreach (int number in numbers)
    {
        Console.WriteLine($"処理2：{number}");
    }

    numbers.Add(1);
}
```

# ヒント

引数をより抽象的な型で受け取ることは、一般的には推奨されます。
かといって `IEnumerable<T>` 型で受け取ると、メソッド内で複数回列挙の可能性が出てしまいます。

ビルドは通ります。
単体テストも、ケースによっては通るでしょう。
それでも安心はできません。
できればコードレビューで拾いたいポイントです。

呼び出す側に思いを馳せ、嗅ぎ分けてみましょう。

# 問題ケース

```c#
    var numbers = new int[] { 0 };
    foo.DoSomething(numbers);
```

> NotSupportedException: コレクションは固定サイズです。

`Add(T)` で例外が発生します。
配列は `IList<T>` インターフェイスを実装しますが、変更操作をサポートしない、読み取り専用コレクションです。

# ではどうすればいいのか？

まず応急処置からです。
`IList<T>` インターフェイスには `IsReadOnly` プロパティが用意されています。
これが `false` のときだけ変更操作を行うことで、ひとまず例外は回避されます。

ただ、それではメソッドの要件が実現できないと思います。
呼び出す側は漠然と `DoSomething` してくれることを期待していますので、配列を渡したときだけ処理が完遂されないのは想定外です。
この分岐がロジック的に正解だとしても、判断は中ではなく外でやる方が明示的でしょう。

引数型を `List<T>` に変えてしまえば、例外も上の懸念も解消されます。
しかし、安直なのは否めません。
根本的な問題がほかにあるかもしれません。

気になる点がいくつかあります。
- `DoSomething` というメソッド名があいまいで、ブラックボックスすぎる
- 読み取り操作と変更操作が同じメソッド内にある

正解は具体的な要件や文脈によります。
これらの点を踏まえ、リファクタリングを検討しましょう。

と放り投げたような形ですが、潜在バグを見つけるのが記事の趣旨ですので、ここまでとさせていただきます。
VerneMQ の使い方

Ubuntu 24.10 でテストしました。

## インストール
こちらからダウンロード
[Download VerneMQ](https://vernemq.com/downloads/index.html)

```bash
sudo dpkg -i vernemq-1.13.0.jammy.x86_64.deb
```

## 設定

```text:/etc/vernemq/vernemq.conf
(省略)
#allow_anonymous = off
allow_anonymous = on
(省略)
```

## 起動

```bash
sudo vernemq console
```

```text
Eshell V13.2.2.1  (abort with ^G)
(VerneMQ@127.0.0.1)1>
```

起動の確認

```text
$ sudo vernemq ping
pong
```

## 接続テスト

サブスクライブ

```bash
mosquitto_sub -h localhost -t "test/topic"
```

パブリッシュ

```bash
mosquitto_pub -h localhost -t "test/topic" -m "Hello, VerneMQ!"
```

## 停止方法

```text
(VerneMQ@127.0.0.1)1> q().
ok
```
#defineの使い道

質問：「実際の開発でデバッグ用ではなく本番用のコードに#defineを使うことはありますか？」
以下はChatGPTの回答．

---

実際の開発において、`#define` を本番用のコードで使うことはありますが、その使用方法は慎重に選ぶ必要があります。`#define` は主にコンパイル時の定数やマクロ展開に使用され、コードの可読性や保守性に影響を与える可能性があります。以下に、`#define` を本番コードで使用する代表的なケースと、それを使う際の注意点について説明します。

### 1. **定数の定義**
`#define` は、本番用コードで定数を定義するために使用されることがあります。特に、計算値やフラグ値などをコード内で繰り返し使う場合に便利です。

```c
#define MAX_BUFFER_SIZE 1024  // バッファの最大サイズ
#define PI 3.14159            // 円周率
```

#### 注意点:
- 定数値を `#define` で定義する場合、型の安全性は保証されません。たとえば、`MAX_BUFFER_SIZE` のような定数が誤って他の型と混同されることがあります。この問題を防ぐためには、`const` キーワードを使用する方が好まれることが多いです。`const` は型情報を伴って定義され、型安全が保たれるためです。
  
```c
const int MAX_BUFFER_SIZE = 1024;  // より型安全な方法
```

### 2. **条件付きコンパイル（クロスプラットフォーム対応）**
`#define` を使って、プラットフォームや環境に依存するコードを分けるために条件付きコンパイルを行うことがあります。たとえば、異なるオペレーティングシステムでコードを実行する場合に、OSごとの違いを処理するために使われます。

```c
#ifdef _WIN32
  // Windows用のコード
#elif defined(__linux__)
  // Linux用のコード
#endif
```

#### 注意点:
- 条件付きコンパイルは、異なる環境に応じたコードを分けるのには便利ですが、コードの可読性が低下する可能性があります。特に、多くの `#ifdef` と `#endif` を使用すると、コードの理解が難しくなり、デバッグが面倒になります。

### 3. **インライン関数の定義**
`#define` を使ってインライン関数を定義することもあります。特に、性能上の理由で関数をインライン展開したい場合に使います。

```c
#define SQUARE(x) ((x) * (x))  // 引数の二乗を計算するマクロ
```

#### 注意点:
- マクロはコード展開時に引数をそのまま展開するため、計算ミスや意図しない副作用を引き起こすことがあります。例えば、引数が複雑な式である場合、意図しない結果を生むことがあります（例えば `SQUARE(a + b)` のように）。
- インライン関数 (`inline` キーワード) を使う方が、型安全でエラーを減らすため推奨されます。

```c
inline int square(int x) {
    return x * x;
}
```

### 4. **デバッグ用のコードを本番用に組み込む**
`#define` は、デバッグのために追加したコードを本番コードに埋め込む場合にも使われます。たとえば、デバッグログを出力するためのコードを、デバッグビルド時にだけ有効にするために使用されることがあります。

```c
#ifdef DEBUG
    printf("Debugging: Variable x = %d\n", x);
#endif
```

#### 注意点:
- 本番環境でもデバッグ用のコードが残っていると、パフォーマンスに悪影響を与えたり、意図しない副作用を引き起こしたりすることがあります。そのため、デバッグコードはビルド設定に応じて条件付きコンパイルで適切に除外するようにします。

### 5. **ビルド時の設定やフラグ**
ビルド時にコンパイラオプションとして `#define` を利用することもあります。たとえば、コンパイル時に異なる最適化レベルやデバッグ情報の有無を切り替えるために `#define` を使用することがあります。

```c
#define VERSION "1.0.0"
```

ビルド時に `VERSION` の値を変更することで、ソースコードに埋め込まれる定義を変更できます。

### 本番用コードにおける `#define` 使用の注意点
- **型安全性**：`#define` で定義した定数は型がないため、型安全性が欠けます。可能な限り `const` や `enum` を使用した方が安全です。
- **可読性**：`#define` を多用しすぎると、コードが難解になり、意図しない副作用を引き起こすことがあります。適切な場所で使い、過剰な使用は避けるべきです。
- **デバッグ情報の除去**：デバッグ用のログや情報を本番環境で使わないように、ビルド時に除去する設定を行うことが重要です。`#define` で条件付きコンパイルを行うことが一般的です。

---

### 結論
`#define` は本番用のコードで使うこともありますが、その使い方には注意が必要です。定数や条件付きコンパイルなどでの使用は一般的ですが、型安全やコードの可読性を保つためには、`const` や `enum`、インライン関数などの別の手法を検討することも重要です。
Amazon Route53

## Route53とは
AWSが提供する高い可用性と拡張性をもつDNS（Domain Name System）サービス

## 基礎知識
### ドメイン名とは
インターネット上のIPアドレスを人間が理解しやすい形にした識別子

### DNSとは
インターネット上でドメイン名とIPアドレスを対応付けて管理・変換する仕組み

### DNSサーバーとは
ドメイン名とIPアドレスの対応を管理し、名前解決の機能を提供するサーバー
#### 名前解決
ドメイン名やホスト名とIPアドレスを相互に変換すること

## 使用目的
- AWS環境で統合的にドメインを管理したい場合
- ユーザー体験を向上させ、Webサイトやアプリの応答速度を最適化したい場合
- システムの信頼性を向上させ、障害が発生してもサービスを継続させたい場合
- AWS環境内のリソースと統合し、スムーズな運用を実現したい場合
- 費用を最適化しながら、スケーラブルなDNSルーティングを実装したい場合

## Route53の機能
### ドメイン登録
#### ドメイン名の取得
有料ですが、`.com`、`.org`、`.jp`などのドメインを簡単に取得できます

#### ドメイン移管
他のレジストラからAWS Route 53にドメインを移管できます
※レジストラ：ドメイン名をレジストリに登録するための機関(お名前.comなど)
※レジストリ：特定のTLD（トップレベルドメイン、例：`.com`や`.jp`）を管理する機関

#### ドメインの管理
取得したドメインのDNS設定を簡単に管理できます

### DNSルーティング
ドメイン名とIPアドレスの対応を管理するDNSサービスを提供し、ルーティングポリシーを使用してトラフィックを制御します
#### ルーティングポリシー
- シンプルルーティング
  - 単純なDNSの名前解決を行います。単一のIPアドレスをマップする場合に使用
- フェイルオーバールーティング
  - メインのリソースがダウンした場合にバックアップサーバーへトラフィックをリダイレクトする
- レイテンシールーティング
  - ユーザーの地理的な位置を基に最適なリージョンにリクエストをルーティングします
- 位置情報ルーティング
  - リクエスト元の地理的な場所に基づいて、異なるサーバーにトラフィックをルーティングします
- 重み付けルーティング
  - 複数のリソースにトラフィックを分散する際に、重み（割合）を指定できます
- マルチバリュールーティング
  - 複数のリソースにリクエストを分散させ、DNSレスポンスの結果を複数提供します

### ヘルスチェック
#### エンドポイントの監視
ウェブアプリケーションやサービスが正常に動作しているかを定期的に監視できます。問題があればフェイルオーバールーティングを利用してトラフィックを別のリソースに切り替えることができます。

#### 監視対象のカスタマイズ
HTTP、HTTPS、TCPなどのプロトコルを使用して、リソースの健康状態をチェックできます

### ホストゾーン
特定のドメイン名に関連するDNSレコードを管理するためのコンテナ

#### パブリックホストゾーン
インターネットでアクセス可能なドメインのDNS設定を管理するためのコンテナ

#### プライベートホストゾーン
プライベートネットワーク内で使用されるDNSレコードを管理するためのコンテナ

#### レコードタイプ
ホストゾーンを作成する自動的にレコードは作成されます
- Aレコード（IPv4アドレスの指定）
- AAAAレコード（IPv6アドレスの指定）
- CNAMEレコード（ドメイン名のエイリアス）
- MXレコード（メール交換サーバー）
- TXTレコード（任意のテキスト情報）
- NSレコード（ネームサーバーの指定）

### トラフィックフロー
DNSルーティングポリシーを視覚的に設計・管理する機能
#### DNSルーティングとの違い
DNSルーティングは、基本的なポリシーとトラフィックフローで作成したポリシーの両方を利用できる一方で、トラフィックフローは、DNSルーティングで使用するルーティングポリシーを作成・管理するためのツールであり、実際のルーティング処理はしないです。

### リゾルバー
AWS内部でVPCと外部ネットワーク間の名前解決をする機能

## まとめ
AWS Route53は、高可用性・拡張性のあるDNSサービスで、ドメイン登録、DNSルーティング、ヘルスチェック、ホストゾーン管理、トラフィックフロー、リゾルバーなどの機能を提供します。これにより、最適なトラフィック制御や高可用性の実現が可能になり、AWS環境と統合しやすい利点があります。
Laravel における SQLSTATE[42S02]: Base table or view not found: 

# Laravel Sail 起動時のエラーと対応

## 発生したエラー

`./vendor/bin/sail up -d` を実行した際に、以下のエラーが発生。


![スクリーンショット 2025-03-13 22.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/046493be-b715-42d5-8d81-ae105bc56273.png)


これは、Laravel の `sessions` テーブルがデータベースに存在しないため発生している。

## マイグレーションの実行

エラーを解決するため、以下のコマンドを実行。

```bash
./vendor/bin/sail artisan migrate
```
を実行したところ以下のようになった。

![スクリーンショット 2025-03-13 22.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/39884c09-5bc0-4ae3-bdfa-516a3dc864cb.png)

migrate を実行した際に、以下のエラーが発生した。

SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'image'

これは、posts テーブルに image カラムを追加しようとしたが、すでに存在している ために発生しているようだ。
そこで

直前の変更を取り消しするために
```bash
./vendor/bin/sail artisan migrate:rollback --step=1
./vendor/bin/sail artisan migrate
```
を実行し、マイグレーションファイル (2025_03_11_085257_add_image_to_posts_table.php) を開いて

image カラムがすでに存在している場合は追加しないように変更した。
```php
public function up()
{
    Schema::table('posts', function (Blueprint $table) {
        if (!Schema::hasColumn('posts', 'image')) {
            $table->string('image')->nullable();
        }
    });
}
```
```bash
./vendor/bin/sail artisan migrate
```
を実行して無事エラーは解決。
constの有用性

質問：「constはどういう時に有用ですか？」
以下はChatGPTの回答．

---

`const` は主に次のような状況で非常に有用です。`const` を使うことでコードがより安全、効率的、そして理解しやすくなります。

### 1. **不変のデータを定義する場合**

`const` は変数やポインタが「変更されない」という特性を明示的に示すことができます。これにより、コードの意図が明確になり、誤って変更されるのを防ぎます。

例えば、`PI` という円周率の値が変更されることはないと明示するために `const` を使います。

```c
const double PI = 3.14159;
```

このコードは、`PI` の値が変更されないことをコンパイラに伝えます。もし他の場所で `PI` を変更しようとした場合、コンパイル時にエラーが発生します。

### 2. **ポインタが指し示す値が変更されないことを保証する場合**

ポインタを使って、値を変更しないことを保証する場合にも `const` を使います。例えば、関数に渡すポインタの内容が変更されないことを保証するために、ポインタの前に `const` を置くことができます。

```c
void print_value(const int *ptr) {
    // *ptr = 5;  // コンパイルエラー: ptrが指し示す値を変更できない
    printf("%d\n", *ptr);
}
```

この例では、`ptr` が指し示す整数の値が変更されないことを保証します。もし関数内でその値を変更しようとすると、コンパイラがエラーを出してくれます。

### 3. **定数を使ってコードを読みやすくする場合**

`const` は、定数をコード内で意味のある名前で管理するのに役立ちます。定数を直接数値で書くよりも、名前付き定数を使用することでコードが読みやすく、理解しやすくなります。

```c
const int MAX_USER_COUNT = 100;
const int MIN_AGE = 18;
```

このように `const` を使うことで、コードをより自明にし、将来定数を変更する際に一箇所で変更を行える利点があります。

### 4. **配列のサイズを定義する場合**

配列のサイズを `const` で定義することで、サイズが変更されないことを保証できます。コンパイラは `const` 値として定義された変数を評価し、配列を正しく処理できます。

```c
const int ARRAY_SIZE = 10;
int arr[ARRAY_SIZE];  // 配列サイズが固定されている
```

この場合、`ARRAY_SIZE` は変更されないことが保証されます。

### 5. **関数の引数として不変のポインタを渡す場合**

関数にポインタを渡す際、ポインタの内容が変更されないことを明示するために `const` を使用します。これにより、他の部分で意図しない変更を防ぎ、コードの予測可能性が高まります。

```c
void process_data(const char *data) {
    // data[0] = 'A';  // コンパイルエラー: dataは変更できない
    printf("%s\n", data);
}
```

`const char *data` とすることで、関数内で `data` が指し示す文字列の内容が変更されないことが保証されます。

### 6. **マルチスレッドプログラミングでデータ競合を防ぐ場合**

複数のスレッドで共有されるデータに対して `const` を使うことで、そのデータが変更されないことを保証できます。これにより、スレッド間でのデータ競合を防ぎます。

```c
void process_data(const int *data) {
    // 他のスレッドがdataを変更できないことを保証
}
```

### 7. **型安全性の向上**

`const` を使うことで、コンパイラが変数の変更を検出できるため、予期しないバグやエラーを防ぐことができます。たとえば、`const` を使うと、誤って不変のデータを変更しようとした際にコンパイラがエラーを報告してくれます。

### 8. **関数ポインタで不変の引数を受け取る場合**

`const` は関数ポインタにも使われ、引数が変更されないことを示すことができます。これにより、関数ポインタを使ってもデータが変更されるリスクを減らすことができます。

```c
typedef void (*PrintFunction)(const char*);
```

この場合、`PrintFunction` 型の関数ポインタは、渡された `char*` を変更しないことを保証します。

### まとめ

`const` は以下のような場合に特に有用です：
- 不変の値やデータを定義したい場合。
- ポインタが指し示す値を変更しないことを保証したい場合。
- コードの可読性や保守性を高めたい場合。
- 型安全性を高め、予期しないバグを防ぎたい場合。

`const` を適切に使用することで、プログラムの信頼性、保守性、安全性を高めることができます。