OmniAICreator/Qiita-1.07M huggingface dataset:
@Injectって結局何？　例えながら理解する


@Injectについて自分のメモのために初心者が簡単にまとめたものになります。(もし間違ってる点等ありましたら是非教えていただきたいです)
コードのみではなかなか理解しづらいので例えながらまとめていこうと思います。
今回は**コーヒーショップ**に例えながら説明していきます。

# 前提
コーヒーショップで働くバリスタがいます。
バリスタはコーヒーメーカーに依存（なければコーヒーを淹れられない）
コーヒーメーカーはコーヒー豆に依存（豆がなければコーヒーを作れない）
コーヒー豆は 仕入れ業者 に依存（業者がいないと豆が手に入らない）
これがいわゆる依存性になります。


# @Injectを使用しない場合
バリスタがコーヒーメーカーからコーヒー豆まですべて一人で管理する状態
```java:CoffeeShop.java
// 仕入れ業者（CoffeeSupplier）がコーヒー豆を提供する
class CoffeeSupplier {
    public String provideBeans() {
        return "新鮮なコーヒー豆";
    }
}

// コーヒーメーカー（CoffeeMaker）がコーヒーを淹れる
class CoffeeMaker {
    private final CoffeeSupplier supplier;

    public CoffeeMaker() {
        // CoffeeMaker が自分で仕入れ業者を作る（依存関係を自前で管理）
        this.supplier = new CoffeeSupplier();
    }

    public void brew() {
        System.out.println("コーヒーメーカー: " + supplier.provideBeans() + " を使ってコーヒーを淹れます。");
    }
}

// コーヒーショップ（CoffeeShop）はバリスタの役割
public class CoffeeShop {
    private final CoffeeMaker coffeeMaker;

    public CoffeeShop() {
        // CoffeeShop がすべての依存関係を自分で作る
        this.coffeeMaker = new CoffeeMaker();
    }

    public void serveCoffee() {
        System.out.println("コーヒーショップ: お客様にコーヒーを提供します。");
        coffeeMaker.brew();
    }

    public static void main(String[] args) {
        // コーヒーショップを作成してコーヒーを提供
        CoffeeShop shop = new CoffeeShop();
        shop.serveCoffee();
    }
}

```

# @Injectを使用した場合
コーヒーショップを 仕入れ業者と契約 して、バリスタが直接農園に行かずに済むようにしましょう。

バリスタは「仕入れ業者」から必要な材料を受け取るだけでよい。
バリスタは「どの業者か」は気にせず、コーヒー作りに専念できる。

```java:CoffeeShop.java
import jakarta.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;

// 仕入れ業者（CoffeeSupplier）がコーヒー豆を提供する
@ApplicationScoped
class CoffeeSupplier {
    public String provideBeans() {
        return "新鮮なコーヒー豆";
    }
}

// コーヒーメーカー（CoffeeMaker）がコーヒーを淹れる
@ApplicationScoped
class CoffeeMaker {
    private final CoffeeSupplier supplier;

    // 仕入れ業者を @Inject で受け取る
    @Inject
    public CoffeeMaker(CoffeeSupplier supplier) {
        this.supplier = supplier;
    }

    public void brew() {
        System.out.println("コーヒーメーカー: " + supplier.provideBeans() + " を使ってコーヒーを淹れます。");
    }
}

// コーヒーショップ（CoffeeShop）はバリスタの役割
@ApplicationScoped
public class CoffeeShop {
    private final CoffeeMaker coffeeMaker;

    // @Inject を使って CoffeeMaker を受け取る
    @Inject
    public CoffeeShop(CoffeeMaker coffeeMaker) {
        this.coffeeMaker = coffeeMaker;
    }

    public void serveCoffee() {
        System.out.println("コーヒーショップ: お客様にコーヒーを提供します。");
        coffeeMaker.brew();
    }
}

```


# メリット
少し長いコードになってしまいましたが、注目してほしいのは@Injcetを使用すると　**「new」を用いることがない**ということです。つまり毎回バリスタがコーヒー豆の仕入れまで考える必要がなく、自分の仕事に専念できるのです。

ほかにもたくさんのメリットがあります(保守性・再利用性など)

# 結論
@Injectを用いることで、依存性の管理が柔軟に！
一つ一つのクラスの結合が弱くなり、自分の仕事に専念できるようになります！
AVD用のFirewallpolicyをある程度ぱぱっと入れる


# はじめに

AzureFirewall×AVDの検証をする際、AVD用のFirewallポリシーが多すぎて何かいい方法はないかと公式ドキュメントを見ていたのですが、下記を見つけました。

https://learn.microsoft.com/ja-jp/azure/firewall/protect-azure-virtual-desktop#azure-firewall-policy-sample

下記を実行すればある程度ポリシーを入れてくれるようです。
https://github.com/Azure/RDS-Templates/tree/master/AzureFirewallPolicyForAVD

# コード編集

下記がパラメータを集約してくれたコードになっているので編集
FirewallPolicyForAVD-parameters.json

＜コメント＞の部分を消去して、ご自分の環境のパラメータに置き換えてください

~~~


{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "firewallPolicies_AVD_DefaultPolicy_name": {
            "value": "＜ポリシーの名前＞"
        },
        "location": {
            "value": "＜japaneastなどfirewall作成したリージョン＞"
        },
        "firewall-policy-tier": {
            "value": "＜standardなどSKUを入力＞"
        },
       "dns-server": {
            "value": "＜192.168.0.5などDNSのIP入力＞"
        },
        "avd-hostpool-subnet": {
            "value": "＜192.168.100.10/16などhostpoolのアドレスレンジ入力＞"
        }
    }
}
~~~

# 実行

下記２つが任意の場所に格納されていることを確認
（Azureportal上のpowershellを使用する場合はアップロード)
- FirewallPolicyForAVD-parameters.json
- FirewallPolicyForAVD-template.json

powershellで下記を実行
<<<>>>の部分を置き換えてください
Run the deploymentの部分でAVD用のポリシーが作成されます。

~~~
Connect-AzAccount
Select-AzSubscription -Subscription "<<<Your Subscription ID >>>"

# Variable definition
$ResourceGroupName = "<<<Your Resource Group Name>>>"
$Location = "<<<Your Azure Region>>>"

# Run the deployment
New-AzResourceGroupDeployment -ResourceGroupName $ResourceGroupName -Location $Location -TemplateFile ".\FirewallPolicyForAVD-template.json" -TemplateParameterFile ".\FirewallPolicyForAVD-parameters.json"

# Once completed, review all the Policy settings and rules, then associate to an existing Firewall: #

$fwpolicyname = "<<<Your AVD Firewall Policy Name>>>"
$fwpolicyresourcegroup = "<<<Resource Group where the Policy has been created>>>"
$fwname = "<<<Your Firewall Name>>>"
$fwresourcegroup = "<<<Resource Group where the Azure Firewall is located>>>"

$azFw = Get-AzFirewall -Name $fwname -ResourceGroupName $fwresourcegroup
$azPolicy = Get-AzFirewallPolicy -Name $fwpolicyname -ResourceGroupName $fwpolicyresourcegroup

$azFw.FirewallPolicy = $azPolicy.Id
$azFw | Set-AzFirewall
~~~

# 確認
AzureFirewallの
ネットワーク規則とアプリケーション規則にルールが登場します。
こんな感じです。

![rule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248327/0bc1cd73-655d-4d07-afb5-bfbbba818794.png)

これだけの数手動でいれるのはめんどうなのでいいですね～

# 留意点①

AzConnectで下記のような警告が出る場合があります。

:::note warn

WARNING: Interactive authentication is not supported in this session, please run cmdlet 'Connect-AzAccount -UseDeviceAuthentication'.
:::

この警告が出た場合は素直にコマンドを下記に変えてください
~~~
Connect-AzAccount -UseDeviceAuthentication
~~~

実行すると
URLとコードが発行されると思うので
URLに飛んでコード入力してログインすればOKです。

# 留意点②

セッションホスト→pip向けの通信を許可しているので
それ以外の通信に関しては追記してあげる必要があります。
また、PrivateLinkを使用している場合は余計な通信を許可していることになるのでPrivateLink分（AVD、ストレージアカウントなど）は削除してあげるとよりセキュアになります。

環境によりますが、AVDの通信のうち接続クライアントのグローバルIP向け通信もAzureFirewallを経由させる場合はこのルールだけでは足りません。

内容はよくご確認の上使用ください。
ACCESS Macro If Message 确认选择的用法

在Access的Macro里面需要用到 
if (msgbox("xxxx", vbYesNo) = vbYes) then else end if 
这样的语法时，Macro无法使用vbYesNo这样的英文
这时候可以直接使用数字带入

可将上面的式子置换成
MsgBox("xxxx",4)=6
即可做到相同的功能

![图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026376/aaf0a27e-85df-4c26-a5ad-19be1c71c1f7.png)

详细说明见以下表格

MsgBox の引数
| 定数 | 値 | 説明 |
| - | - | - |
| vbOKOnly | 0 | [ OK ] ボタンのみ (既定値) |
| vbOKCancel | 1 | [OK] ボタンと [キャンセル] ボタン |
| vbAbortRetryIgnore | 2 | [ 中止 ]、[ 再試行 ]、[ 無視 ] の各ボタン |
| vbYesNoCancel | 3 | [ はい ]、[ いいえ ]、[ キャンセル ] の各ボタン |
| vbYesNo | 4 | [ はい ] ボタンと [ いいえ ] ボタン |
| vbRetryCancel | 5 | [ 再試行 ] ボタンと [ キャンセル ] ボタン |
| vbCritical | 16 | 重大なメッセージ |
| vbQuestion | 32 | 警告クエリ |
| vbExclamation | 48 | 警告メッセージ |
| vbInformation | 64 | 情報メッセージ |
| vbDefaultButton1 | 0 | 1 番目のボタンが既定 (既定値) |
| vbDefaultButton2 | 256 | 2 番目のボタンが既定 |
| vbDefaultButton3 | 512 | 3 番目のボタンが既定 |
| vbDefaultButton4 | 768 | 4 番目のボタンが既定 |
| vbApplicationModal | 0 | アプリケーションのモーダル メッセージ ボックス (既定値) |
| vbSystemModal | 4096 | システムのモーダル メッセージ ボックス |
| vbMsgBoxHelpButton | 16384 | メッセージ ボックスに [ヘルプ] ボタンを追加する |


MsgBox の戻り値
| 定数 | 値 | 説明 |
| - | - | - |
| vbOK | 1 | [ OK ] ボタンが押された |
| vbCancel | 2 | [ キャンセル ] ボタンが押された |
| vbAbort | 3 | [ 中止 ] ボタンが押された |
| vbRetry | 4 | [ 再試行 ] ボタンが押された |
| vbIgnore | 5 | [ 無視 ] ボタンが押された |
| vbYes | 6 | [ はい ] ボタンが押された |
| vbNo | 7 | [いいえ] ボタンが押された |


https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/msgbox-constants
【小ネタ】ChatGPTさんに依頼すればコーポレートページもサクッと作ってくれるのでは？

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

個人的にChatGPTを活用しながら開発業務を行っていますが、その中で**ChatGPTにある程度条件を投げれば、いい感じのコーポレートページを生成してくれるんじゃ...**と思いましたので試してみました。

## プロンプト内容

ChatGPT o3-mini-highを利用して以下プロンプトを投げてみたいと思います。

```プロンプト内容
## 前提条件
あなたはベテランのフロントエンジニアです。そのうえで、Webマーケティングに関してもある程度知見を持っています。そんなあなたに、簡単なコーポレートページの生成をお願いしたいです。

## 要件
・ITソリューション企業向けのトップページ
・企業名は「株式会社通信ほげほげ」
・メッセージは「技術を通じたソリューションを」
・メンテナンス性を考慮して簡単にメンテナンスできる言語にしたい
```

## 推論内容

推論内容として次のような内容が出てきました。

```
このコーポレートページの要件に基づいて、メンテナンス性を重視した言語が求められています。要件としては、ITソリューション企業のトップページを作成すること。言語としてはHTMLが無難かもしれませんが、CSSのインライン方式や、シンプルな静的サイトジェネレーターも考えられます。特に「Webマーケティング」も少し関係するので、シンプルで効率的な構成が求められ、Reactやテンプレートエンジンは過剰かもしれません。

ITソリューション企業のトップページ作成において、メンテナンス性を重視すると、HTML＋CSSが最適かもしれません。静的なHTMLは簡単で扱いやすいので、「簡単にメンテナンスできる言語」という要求にぴったりです。CSSに関してはインラインか外部ファイルでリンクする形が良さそうですが、シンプルなHTML5を使ってセマンティックタグ（例：<header>, <nav>, <footer>）を使うと、より可読性と保守性が確保できるはずです。
```

意外といい提案かと思いつつ、Reactは学習コストが高いのでうーんといった印象を持ちました。

## 生成コード

以下のようなコードを生成してくれました。

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>株式会社通信ほげほげ</title>
  <style>
    /* ベーシックリセット */
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    body {
      font-family: Arial, sans-serif;
      line-height: 1.6;
      color: #333;
    }
    header, footer {
      background-color: #f4f4f4;
      padding: 20px;
      text-align: center;
    }
    /* ヒーローセクション */
    .hero {
      background: url('hero.jpg') no-repeat center center/cover;
      padding: 100px 20px;
      color: #fff;
      text-align: center;
    }
    .hero h2 {
      font-size: 2.5em;
    }
    /* コンテンツエリア */
    .content {
      padding: 40px 20px;
      text-align: center;
    }
  </style>
</head>
<body>
  <!-- ヘッダー: 企業名を表示 -->
  <header>
    <h1>株式会社通信ほげほげ</h1>
  </header>

  <!-- ヒーローセクション: メッセージを表示 -->
  <section class="hero">
    <h2>技術を通じたソリューションを</h2>
  </section>

  <!-- コンテンツエリア: サービス紹介など追加可能 -->
  <section class="content">
    <p>当社は最新のIT技術を活用し、企業の課題解決をサポートいたします。ここにサービス内容や特徴を記載してください。</p>
  </section>

  <!-- フッター: コピーライト等 -->
  <footer>
    <p>&copy; 2025 株式会社通信ほげほげ. All Rights Reserved.</p>
  </footer>
</body>
</html>
```

## 実際のページ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/84d53671-8ad9-42ad-be2c-3b8cf8d2bca5.png)

たたき台としてはいい感じのページができましたね。
（かなり手を入れる必要がありますが）

## まとめ

中堅企業であれば**そのまま利用する**というのは難しいかなぁと思いつつ、中小企業のホームページであれば、ChatGPTさんにコード生成を丸投げしても意外となんと中なるのではないかなぁと思いました。

正直、CoTやヒューショット学習などのテクニックを活用していないので、生成物としてはいまいちでしたが、繰り返し実行していけばいい感じのアウトプットが生まれるのではないかなぁと思いました。

かなりこすられたネタですが、最後までお読みいただきありがとうございました！！
AWS IoT Device Defenderで証明書有効期限チェックの柔軟な設定が可能に

## 概要
AWS IoT Device Defenderにおいて、デバイス証明書の有効期限チェック機能が改善されました。従来は固定で証明書期限切れの30日前にのみチェックが可能でしたが、本アップデートにより、最大10年前から任意のタイミングでチェックを設定できるようになりました。
## 主な変更点
- 従来の制限：証明書有効期限切れの30日前のみチェック可能
- 新機能：30日前から最大10年前までの任意の期間でチェック設定が可能に
## メリット
1. より柔軟な証明書管理が可能に
2. 組織のセキュリティポリシーに応じたカスタマイズが可能
3. 長期的な証明書管理計画の立案が容易に
## 実務への影響
本アップデートにより、IoTデバイスの証明書管理において、より戦略的な計画立案が可能になります。例えば、証明書の更新作業に十分な時間的余裕を持たせたい場合は、1年前からの通知を設定するなど、柔軟な運用が実現できます。

## 設定方法
### 設定環境
- 設定方法：AWS CLI（2025年3月現在、マネージメントコンソールでの設定は未対応）
- 使用したAWS CLIのバージョン情報：
```bash
$ aws --version
aws-cli/2.24.15 Python/3.12.9 Darwin/23.6.0 exe/x86_64
```
### 設定手順
#### 1. 証明書有効期限チェックの設定
以下のコマンドで、証明書の有効期限切れ100日前にチェックを行うように設定します：

```bash
aws iot update-account-audit-configuration \
  --audit-check-configurations '{
    "DEVICE_CERTIFICATE_EXPIRING_CHECK": {
      "enabled": true,
      "configuration": {
        "CERT_EXPIRATION_THRESHOLD_IN_DAYS": "100"
      }
    }
  }'
```

**注意点**：
- コマンド実行時は特に結果は表示されません
- マネージメントコンソールでも設定値の確認はできません

#### 2. 設定の確認方法
設定が正しく反映されているかは、以下のコマンドで確認できます(見やすさのために改行しています)：

```bash
aws iot describe-account-audit-configuration
```

実行結果（一部抜粋）：
```json
{
    "auditCheckConfigurations": {
        "DEVICE_CERTIFICATE_EXPIRING_CHECK": {
            "enabled": true,
            "configuration": {
                "CERT_EXPIRATION_THRESHOLD_IN_DAYS": "100"
            }
        }
    }
}
```

### 確認ポイント
- `CERT_EXPIRATION_THRESHOLD_IN_DAYS` の値が指定した「100」に設定されていること
- `enabled` が `true` になっていること

## まとめ
このように、シンプルながら実用的な機能強化により、IoTデバイスのセキュリティ管理がより効果的になることが期待されます。

## 参考情報
- [本機能のアナウンスメント:Announcing new features for AWS IoT Device Defender to improve IoT certificate lifecycle management](https://aws.amazon.com/jp/about-aws/whats-new/2025/02/aws-iot-device-defender-iot-certificate-lifecycle-management/)
- [「デバイス証明書の有効期限が切れます」チェックの説明ページ](https://docs.aws.amazon.com/ja_jp/iot-device-defender/latest/devguide/audit-chk-device-cert-approaching-expiration.html)
静的サイトと動的サイトの違いについて

# はじめに
「***静的サイト***」と「***動的サイト***」という言葉はよく聞きますが、具体的にどう違うのか、どんな場面で使い分けるべきか を整理できていませんでした。そこで、改めてまとめて記事にしてみました。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::


# 静的サイト
静的サイト とは、***アクセスするユーザーや場所に関係なく、常に同じ内容が表示されるサイト***のことです。

## 静的サイトの使用例
+ ポートフォリオサイト（作品紹介ページなど）
+ 企業の公式サイト（会社概要や採用情報など）
+ マニュアルサイト（製品の使い方ページなど）

これらのサイトは頻繁な更新を必要とせず、誰が見ても同じ内容を提供するため、静的な構成が適しています。

# 動的サイト
動的サイト とは、ユーザーの情報やリクエストに応じて、異なるコンテンツを表示するサイト のことです。バックエンド（データベースやAPI）と連携し、ユーザーごとに異なる情報を表示できます。

`JavaScript`を使用してアニメーションや動きをつけることは可能ですが、それだけでは 動的サイトにはなりません。「***表示する内容が変化するかどうか***」がポイントです。

## 動的サイトの使用例
+ ショッピングサイト（ECサイト） 
→ ログインすると購入履歴やおすすめ商品が表示される
+ SNS（Twitter, Instagramなど） 
→ ユーザーによってタイムラインの内容が異なる
+ オンライン予約サイト 
→ ユーザーごとに予約情報が異なる

動的サイトは、ユーザーに合わせた情報を提供したい場合に適しています。

# 終わりに
静的サイトと動的サイトの違いを理解することで、用途に応じた適切なサイト構築ができるようになります。

「***更新が少なく、誰が見ても同じ情報を表示したいなら静的サイト***」
「***ユーザーごとに異なるデータを表示するなら動的サイト***」
と覚えておくと良さそうです。

# 参考

https://wepage.com/blog/article/251/index.html
Raspberry Pi 5 で Orange Data Mining を動かそうとしてしてつまづいた話

# ノーコードで機械学習がしたい！

ノーコードで機械学習を試したいと思い、我が家のメインマシンである Raspberry Pi 5 で Orange Data Mining を動かそうとしました。

しかし、インストールの過程でつまずいた点があったので、備忘録として記録しておきます。

# インストール手順（公式サイトに従った方法）

公式サイトの [Download ページ](https://orangedatamining.com/download/) に記載されている手順に従い、以下の方法でインストールを試みました。

1. 仮想環境を作成
1. 仮想環境をアクティベート
1. 必要なライブラリ `PyQt5` と `PyQtWebEngine` をインストール
   ```sh
   pip install PyQt5 PyQtWebEngine
   ```
1. Orange をインストール
   ```sh
   pip install orange3
   ```

しかし、この手順のうち **PyQt5 のインストール** でつまづきました。

# 発生した問題

以下のように、`pip install PyQt5 PyQtWebEngine` の実行中に強制終了してしまいました。

```text
$ pip install PyQt5 PyQtWebEngine
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting PyQt5
  Using cached PyQt5-5.15.11.tar.gz (3.2 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... -強制終了
```

# うまくいった方法

試行錯誤の末、以下の方法でインストールに成功しました。

1. `apt` を使ってシステムに `PyQt5` をインストール
1. 仮想環境を作成（システムのグローバルな `site-packages` にアクセスできるようにする）
   ```sh
   python -m venv --system-site-packages env
   ```
1. 仮想環境をアクティベート
1. Orange をインストール
   ```sh
   source env/bin/activate
   pip install orange3
   ```

## 参考にしたサイト

- [Raspberry Pi Forums: Installing PyQt5 on Raspberry Pi](https://forums.raspberrypi.com/viewtopic.php?t=374922)

## まとめ

Raspberry Pi 5 では `pip install PyQt5` によるインストールがうまくいかない場合があるようです。その場合は、`apt` を使って PyQt5 をシステムにインストールし、`--system-site-packages` オプション付きの仮想環境を利用することで回避できる可能性があります。

同じ問題に遭遇した方の参考になれば幸いです！
エンジニアとしての成長記録を残します。

## はじめ

はじめましてmasaSystemです。
サービス開発ができるようになりたくて、成長記録を残すことにしました。同じような境遇の人ががんばる刺激になれば嬉しいです。

まずは私の現状を箇条書きで残します。

## 現状
・IT企業で保守開発PJに参画
・新人研修で進捗がぶっちぎり最下位
・基本情報技術者試験5回落ち
・エラーログの読み方あやふや
・エンジニア歴3年目で、このままではやばいと思いブラインドタッチの練習からやり直す


（書いていて自分で引きました。。。）

なぜ成長記録を残すかというと将来やりたいことがあるからです。
それに向けて進んでいるのか確認したくて残します。
次は将来どうなりたいか目標を書きます。

## 将来
・3ヶ月後：個人で開発ができるようになる
・6ヶ月後：エンジニアとして一人前という自信を持つ
・1年後：自分でサービスを開発する

よろしくお願いします。
AWS GuardDuty で EC2 のポートスキャンを検出できるのか？



## はじめに
AWS GuardDuty は AWS 環境の脅威を自動で検出するセキュリティサービスです。VPC フローログや DNS クエリログを分析し、不審なアクティビティを検出します。

本記事では、GuardDuty は EC2 のポートスキャンを検出できるのかについて解説します。

---

## ポートスキャンとは？
ポートスキャン（Port Scanning）とは、攻撃者が EC2 やその他の AWS リソースの開いているポートを調査する行為です。

例えば、以下のようなポートスキャンがあります。
- 全ポートスキャン（全範囲のポートに対してスキャン）
- 特定ポートスキャン（SSH(22) や RDP(3389) など狙い撃ち）
- ランダムスキャン（ランダムなポートに断続的にアクセス）

これによって、攻撃可能なポートやサービスを特定しようとします。

---

## GuardDuty はポートスキャンを検出できる
結論：AWS GuardDuty は EC2 に対するポートスキャンを検出できます。

GuardDuty は、VPC フローログや DNS クエリログを解析し、不審なスキャン行為を自動検知します。

### 検出される具体的な Findings（脅威）
GuardDuty では、ポートスキャンに関連する以下の Finding（検出結果）を出します。

| Finding 名 | 説明 |
|------------|----------|
| `Recon:EC2/PortScan` | EC2 インスタンスに対するポートスキャンを検出 |
| `Recon:EC2/PortProbeUnprotectedPort` | インターネットに公開されたポートに対するスキャンを検出 |
| `Recon:EC2/PortProbe` | 攻撃者が EC2 の複数ポートをスキャンしている |
| `Recon:EC2/PortProbeUnprotectedPort` | 特定のポート（例：22, 3389, 80）へのスキャンが発生 |

---

## どのような場合にポートスキャンを検出するのか
GuardDuty は、次のような条件でポートスキャンを警告します。

- 短時間に複数のポートにアクセスされた場合  
- 外部の IP アドレスから多数のポートへ通信が発生した場合  
- 異常なトラフィックパターンを持つアクセスがあった場合  

特に、SSH (22), RDP (3389), HTTP (80), HTTPS (443) などのポートへのスキャンがあるとアラートが出やすいです。

---

## GuardDuty のポートスキャン検出を活用するには

### 1. GuardDuty の Findings を監視
- AWS マネジメントコンソール > GuardDuty から Findings（検出結果）を確認
- ポートスキャン関連の Finding (`Recon:EC2/PortScan`) をチェック

### 2. SNS 通知や EventBridge を活用
GuardDuty の Findings を Amazon EventBridge に送信し、SNS や Lambda で自動対応できます。

例：
- GuardDuty が異常なポートスキャンを検出したら、Security Group を自動変更する。
- Lambda でスキャン元の IP を Deny List に登録する。

### 3. セキュリティグループや NACL で対策
- 必要のないポートを開放しない（最小権限の原則）
- 特定の IP アドレスのみ許可（ホワイトリスト化）
- AWS WAF や Firewall Manager で異常なアクセスをブロック

---

## まとめ
- GuardDuty は EC2 に対するポートスキャンを検出できる
- `Recon:EC2/PortScan` などの Findings でアラートが出る
- EventBridge や Security Group を組み合わせて自動対処も可能
- 不要なポートは閉じて、最小権限の原則を守る

---

## おわりに
AWS GuardDuty を有効化することで、EC2 に対するポートスキャン攻撃をリアルタイムで検出し、迅速に対応できるようになります。

GuardDuty を有効にするだけでポートスキャンが検出されるので、まだ使っていない方はぜひ試してみてください。

**参考情報:**  
- [AWS GuardDuty 公式ドキュメント](https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html)
- [AWS Security Hub と GuardDuty の統合](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-guardduty.html)
子供の頃に感電しているとエンジニア適正があがる?

みなさんは幼少期に感電した事がありますか?

つい数日前に知って驚いた事があります。
子供の頃に感電しているとちょっと変わり者になるがエンジニア適正も得るのではという仮説が二十年以上前に提唱されていました。

https://softether.hatenadiary.org/entry/20041001/p3

自分は、自身のエンジニアとしての能力は『常にまだ足りない、まだ足りない』という気持ちで鍛錬を怠らない姿勢が引き出してきたのだと信じ切っていたのですが、もしかしたら単に子供の頃に感電した事があったから人より向いているだけなのかもしれないと思って衝撃を受けています。

# 私の場合
はい、私は幼稚園児の頃にコンセントに父の工具箱の中の部品(抵抗かコンデンサのようなもの、何なのか理解してなかったので何なのか把握していない)を突っ込み、ブレーカーを落としています。
そして、自他ともに認めるちょっと変わった人で、ソフトウェアエンジニアとしての自分を「少なくともそこそこ以上にできる」と評価しています。
どうやらこの仮説にぴったりと当てはまっている人間のようです。

# 冷静な意見もある
もちろんこの仮説には反証も出ています。

これは因果が逆であろう、感電するような好奇心が強すぎるタイプがエンジニアに向いているのだ。

という意見はいくつか見かけました。確かにそうである可能性もありそうです。
ただ、やっぱり当事者として考えてみると、
『電撃で頭のネジ二～三本ぶっ飛んだ結果、普通の人とちょっと違ってしまうものの、代わりにエンジニア適正としては上がるのでは』
という気がしています。

# 注意点
ただ何よりも気を付けるべきなのは、これをもって安易にお子様を感電させるような事があってはならないという事です。
この適正は、ある種の生存者バイアス的なものである可能性もあります。
生き残ったからそんな事言えるのであって、亡くなってしまったり重度の障害が残ったりしたらそんな事とても言えないのです。

それに自分自身「変わり者である」という事を肯定的な意味で言っているのは強がりの部分もありました (今は本気で肯定しています)。
開き直って普通の人と違う人生を楽しむことにしていますが、それができるようになるまでは厳しい人生でした。

なので、決して故意に周囲のお子様を感電させるような事だけはされないようにお願いしたいです。

# みなさまはどうでしょうか?
その上で、あくまでも偶然で、子供時代に感電経験があると、本当にエンジニア適正があがるのか (そして変人になるのか) というのはすごく気になります。
みなさまとみなさまの周りの方々はどうでしょうか?
【競技プログラミング】AtCoder Beginner Contest 368_E問題

# 問題
https://atcoder.jp/contests/abc368/tasks/abc368_e

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)


# 解法手順1

## 1. 入力の処理

1. N（街の数）、M（電車の数）、X（X1の値）を入力から読み取る。
2. 各電車について、出発地(a)、到着地(b)、出発時刻(s)、到着時刻(t)を読み取る。

## 2. イベントの作成

1. 各電車の出発と到着を別々のイベントとして扱う。
2. 出発イベントは(時刻, 1, 出発地, 電車番号)のタプルで表す。
3. 到着イベントは(時刻, 0, 到着地, 電車番号)のタプルで表す。
4. これらのイベントをリストDに格納する。

## 3. 遅延時間の初期化

1. ansにX1の値（X）を設定する。
2. 他の電車の遅延時間（ans[1:]）を0で初期化する。
3. 各街の遅延時間（delay）を0で初期化する。

## 4. イベントの処理

1. イベントリストDを時刻順にソートする。
2. 各イベントを順番に処理する：
   - 出発イベント（f == 1）の場合：
     * 電車1以外（ind != 0）について、その街の現在の遅延時間から出発時刻を引いた値と0の大きい方を遅延時間として設定する。
   - 到着イベント（f == 0）の場合：
     * 到着地の遅延時間を更新します。新しい遅延時間は、現在の遅延時間と（到着時刻+その電車の遅延時間）の大きい方になる。

## 5. 結果の出力

1. ans[1:]（電車2からMまでの遅延時間）を出力する。


# ACコード1
```python:ac.py
import sys
import logging

def setup_logger(debug_mode):
    logger = logging.getLogger(__name__)
    if not logger.handlers:
        logger.setLevel(logging.DEBUG if debug_mode else logging.INFO)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        
        file_handler = logging.FileHandler('program_trace.log', encoding="utf8")
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    logger.debug(f"ロガーのセットアップが完了しました。デバッグモード: {debug_mode}")
    return logger

logger = setup_logger(True)

def io_func():
    logger.debug(f"入力処理を開始します")
    N, M, X = map(int, sys.stdin.readline().split())
    D = []
    for i in range(M):
        a, b, s, t = map(int, sys.stdin.readline().split())
        a, b = a - 1, b - 1
        D.append((s, 1, a, i))
        D.append((t, 0, b, i))
    logger.debug(f"入力処理が完了しました: N={N}, M={M}, X={X}, イベント数={len(D)}")
    return N, M, X, D

def solve(N, M, X, D):
    logger.debug(f"解法処理を開始します")
    ans = [0] * M
    ans[0] = X
    delay = [0] * N
    D.sort()
    logger.debug(f"イベントをソートしました")
    
    for t, f, v, ind in D:
        if f:
            if ind:
                ans[ind] = max(0, delay[v] - t)
                logger.debug(f"出発イベント処理: 電車{ind}の遅延時間を{ans[ind]}に設定")
        else:
            delay[v] = max(delay[v], t + ans[ind])
            logger.debug(f"到着イベント処理: 街{v}の遅延時間を{delay[v]}に更新")
    
    logger.debug(f"解法処理が完了しました")
    return ans[1:]

def main():
    logger.debug(f"メイン処理を開始します")
    N, M, X, D = io_func()
    result = solve(N, M, X, D)
    print(*result)
    logger.debug(f"メイン処理が完了しました")

if __name__ == "__main__":
    main()

```
WPFのアイコンについて_VSCode

WPFのアプリを作っていてアイコンの設定が毎回よく分からなくなるのでそのメモ。
以前につくったWPFでタスクトレイに表示するアプリで設定した内容。
- [プリザンターの予定をAPIでトースト通知する](https://qiita.com/msms/items/8f6066f0500c6ed0145e)
- [C#でAPIがないサイトのスクレイピング](https://qiita.com/msms/items/c9d84cefb6c9b5aec5e9)

Visual Studioでのリソース設定とかが、VSCodeで編集する時にcsprojのどの事か分からなくなってしまうので。

# 環境
- vscode .NET9

# アイコン設定
`logo.ico`というファイルを`csproj`と同じ場所に保存したとして。
- アイコンはこちらより [icooon-mono](https://icooon-mono.com/11354-%e6%a1%83%e3%81%ae%e3%82%a2%e3%82%a4%e3%82%b3%e3%83%b3%e7%b4%a0%e6%9d%90-3/)
- pngをicoに変換 [freeconvert](https://www.freeconvert.com/ja)

## タスクバーに表示
これでタスクバーとアプリ左上に表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/b13650e2-bd97-4f4d-85e7-2f31d1737f6b.png)

- `MainWindow.xaml`へアイコンを追加
```xml
<Window x:Class="TaskReminder.MainWindow"
    ～
    Title="MainWindow" Height="150" Width="250"
    Icon="logo.ico">
    ～
</Window>
```

- app.csprojへリソース追加
```xml
  <ItemGroup>
      ～
    <Resource Include="logo.ico" />
  </ItemGroup>
```

## タスクトレイへの表示
これでタスクトレイに表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/f838ca6b-5af6-4740-a8f2-b7e5a63480af.png)

- `App.xaml.cs`への追加

```cs
using System.Windows;

namespace TaskReminder;

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : System.Windows.Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var icon = GetResourceStream(new Uri("logo.ico", UriKind.Relative)).Stream;
        var menu = new ContextMenuStrip();
        menu.Items.Add("開く", null, Open_Click);
        menu.Items.Add("閉じる", null, Exit_Click);
        var notifyIcon = new NotifyIcon
        {
            Visible = true,
            Icon = new Icon(icon),
            Text = "リマインダー",
            ContextMenuStrip = menu
        };
        notifyIcon.MouseClick += new MouseEventHandler(Open_Click);
    }
    private void Open_Click(object? sender, EventArgs e)
    {
        MainWindow.Show();
        MainWindow.WindowState = WindowState.Normal;
    }
    private void Exit_Click(object? sender, EventArgs e)
    {
        Shutdown();
    }
```

## exeファイルのアイコン
これでexeファイルのアイコンが変わる
と、トースト通知のアイコンにもなる
- `TaskReminder.csproj`への追加

```xml
<PropertyGroup>
    ～
    <ApplicationIcon>logo.ico</ApplicationIcon>
</PropertyGroup>
```

このアイコンは一度設定すると簡単には変更できないようでした。
[ Visual Studio上で設定したアイコンが反映されない場合の対応方法](https://sheephuman.hatenablog.com/entry/VisualStudio_iconLocked)

# 参考
- [Window.Icon Property](https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.window.icon?view=windowsdesktop-9.0)
- [アプリケーション アイコンを指定する (Visual Basic、C#)](https://learn.microsoft.com/ja-jp/visualstudio/ide/how-to-specify-an-application-icon-visual-basic-csharp?view=vs-2022)
- [【WPF】 .ico ファイルを Window のアイコンに設定する方法](https://qiita.com/sukobuto/items/a672e945103d7dda284b)
- [VSCode＋C#でタスクトレイ常駐アプリを作りたい](https://qiita.com/kyv28v/items/0a5b078d246000cb6781)
-
α, β, RC, GM ってどうやって決めてるの？

# 開発の段階

よく開発の現場で（特にゲーム）、α版、β版、GM とかそういう単語を聞いたことがあるのではないでしょうか？
α版からβ版になったときに、何となく機能が上がってるのかなあ？って思ったりすると思います。

この α版、β版、実は各ゲームメーカーで定義がきっちり決まっています。
ここでは、弊社のα, β, RC, GM をどのような定義にしているのか紹介したいと思います。

## α版
α版の定義は下記の通りです。
```text
ゲームループが完成している
```

ゲームループとは、ゲームを開始してゲームをして終了する、という一連の流れを指します。
つまり、「開始」「ゲーム本編」「終了」が実装されていることを指します。
流れが確認出来れば良いので、「開始」「ゲーム本編」「終了」のそれぞれの内容すべてが実装されている必要はありません。
例えば、ゲームの一部分しか実装されていなくてもゲームループが確認できるのであれば問題ありません。

ここで、ゲームの手触りを確認します。
根幹部の大幅な変更ができるのはα版までです。

## β版
β版の定義は下記の通りです。
```text
全ての機能が実装されている
```

全ての機能が実装されている状態ですが、バグがあっても構いません。
とりあえず全ての機能が実装されているかどうかが重要です。
これによって、今度は全ての流れを確認出来ます。

この段階では、ゲームの大幅な変更はできません。
細部の修正がメインとなります。
※また、通常このバージョンでデバッグ会社を入れてデバッグします。

### オープンβ
β版で全ての機能が実装されているため、一応遊ぶことができるようになっています。
この段階で致命的なバグだったり、パフォーマンスをチェックするために「オープンβ」というバージョンを出す場合もあります。
オープンβは実際に一般のプレイヤーに遊んで貰ってフィードバックを得る機会です。
フィードバックで貰った意見をみて必要であれば修正したりパラメータを調整したりします。

## RC
RC は Release Candidate のことで定義は下記の通りです。
```text
βまでに見つかったバグが修正されている
```

RC 版はβ版までに発見したバグ修正や機能の調整が済んだバージョンです。
ここで、特に機能の調整を何度もしたりバグ修正がまだ合った場合は、RC1, RC2... RCn と RC の後ろにバージョン番号が振られます。
（なお、αやβでもバージョン番号が振られる場合もあります）

## GM
GM は Golden Master の事で定義は下記の通りです。
```text
リリース版
```

RC に問題がなければ、それがそのまま GM になります。

# まとめ
まとめると下記の様になります。

|版|定義|
|---|---|
|α|ゲームループが完成している|
|β|全ての機能が実装されている|
|RC|βまでに見つかったバグが修正されている|
|GM|リリース版|

何となくこうかな？と思っていた部分が明確になれば幸いです。
学習記録 その3



### **学習テーマ:**

Swift, SwiftUI

### **使用した教材:**

Swiftful Thinking (YouTube)

---

### **🔍 学習内容**

### **✏️ 学んだこと**

- Swift のアーキテクチャのMVMMとMVCの定義とそれぞれの特徴
- **data model の扱い方**
- ViewModelの使い方
- CRUDの学習
- UserDefaultsの使い方 (data save)
- Animationを実際のアプリに導入の仕方
- iPhone vs iPadの構成の学習
- Portrait vs Landscapeの構成の学習
- Light vs Dark modeの構成の学習
- App Iconの使い方
- launch screenの使い方
- **LongPressGestureの使い方**
- **MagnificationGestureの使い方**
- **RotationGestureの使い方**
- **DragGestureの使い方**
- **ScrollViewReaderの使い方**
- **GeometryReaderの使い方**
- **Multiple Sheetsの使い方**
- **Maskの使い方**
- **sound effectsの使い方**
- **haptics と vibrationsの使い方**
- Push 機能の使い方
- Core data の基礎



---

### **💡 学び・反省点**

💡 **学び**

- SwiftUIのジェスチャーやアニメーションを活用することで、よりリッチなUIを実装できるようになった。
- Core Dataの基礎を学んだことで、今後のデータ管理の幅が広がりそう。
- 実際にアプリを作りながら学ぶことで、理論だけでなく実践的なスキルも身についた。

⚠️ **反省点**

- **MVVMの理解がまだ不十分。** ある程度実装できるようになったが、より適切な責務分離ができるように、さらに深く学ぶ必要がある。
- Core Dataの使い方は学んだけど、実際にアプリに組み込むとエラーが発生しがちで、もっと深く学ぶ必要がある。
- アニメーションやジェスチャーを学んだが、実際のプロジェクトでどのように活用するか、まだ試行錯誤が必要。
- **アニメーションやジェスチャーの活用は学んだが、実際のアプリで最適な使い方を模索中。** 特に **HIITアプリ** では、トレーニングの開始・停止時のアニメーションをもっと直感的にできるように改善したい。
- **まだSwiftUIの基礎の復習が足りていないと感じる。** 新しい技術に触れるのも大事だが、以前の学びを忘れないように、定期的な復習が必要。

---

### **📆今後の予定**

🎯 **目標**

- Core Dataの理解を深め、実際のアプリで活用できるようにする。
- MVVMの実装をよりスムーズに行えるようにする。
- 自分が今作っているアプリをアップルストアの方にリリースできるようにする(App Storeの審査要件を要チェック)

📌 **行動計画**

- MVVMを意識したコードを書き、既存のプロジェクトでも適用してみる。
- App Storeの審査ガイドラインを確認し、リジェクトされないように対応
- アプリアイコン、スクリーンショット、プライバシーポリシーなどの準備
- 実機テストを行い、バグやクラッシュがないか最終チェック
- TestFlightを使ってベータテストを実施

---

### 感想

新たにたくさんの新しいことを学べて、実際のアプリ開発に活かせるスキルが増えたと感じる。ただ、学んだだけではなく、しっかりと実践に落とし込んでいくことが大事だと思った。より実践的な部分を強化しながら、開発の精度を上げていき、近いうちにアプリをアップルストアの方までリリースできるようにする。
最終行番号の取得　Cells(Rows.Count,列番号).End(xlup).Rowについて

この初心者にはまったく意味不明なコードについて解説したいと思います。
オチ

　　Cells(104万行,列番号).コントロールキー　+ ↑(PgUp) (.そのセルの行番号)

です

Rows.Count　オブジェクトの行数を数えます。
Worksheets("シート名").Rows.Countの場合は全行。
Worksheets("シート名").Range("C10:E109").Rows.Count
の場合はRangeの範囲の中の行数（つまり100行）。

Cells(行番号,列番号)

.End(xlUp)
コントロールキー　+　↑（PgUpキー）

.Row
そのセルの行番号の数字です（ただそれだけ）。

    ワークシートの最終行（100万行）に移動してから、上の空白でないセルに移動して　そのセルの行番号
    Worksheets("シート名").Cells(Rows.Count,1).End(xlup).Row

なのです。

    Worksheets("シート名").Cells(Rows.Count,1).End(xlup)

はRange（セル）なのでたった最終行の番号を調べるためだけに使い捨てにするのは非常にもったいないのです。

    Dim rng as Range,i as Long
    Set rng = Worksheets("シート名").Cells(Rows.Count,1).End(xlup)
    For i = 1 to rng.Row

の方がまだわかり易いですし、利用の可能性が広がると思います。
    
余談

Rows.Countをたった最終行の番号を調べるためだけにRows.Countを使用するのは非常にもったいないのです
列をループするときは

    For i = 2 to 最終行番号

や

    For r（Row） = 10 to 最終行番号

など、データのある行番号からループさせることが多いと思います。

Range("C10:E109").Rows.CountとすればRange("C10:E109")の行数を取得することが出来

    For i = 1 to Range("C10:E109").Rows.Count

        Range("C9").Offset(i,0).value

    Next i

    For i = 1 to Range("C10:E109").Rows.Count

        Range("C10:E109").Cells(i,1).value

    Next i

でデータ行がどこから始まろうとも、ループの開始を　1　で揃えることが出来、今後はデータがどこから始まるのか？を探すことの方が多くなると思います。
[ソフトスキル] TOEIC 900+を目指すあなたへ

**TOEICで900点以上を取得するためには、効率的なツールを活用することが重要です。** ここでは、筆者が実際に900点以上を獲得し、多くの学習者が成果を上げている**2つの強力なツール**を紹介します。

## Anki
- **シンプルで使いやすい**単語学習用のオープンソースなソフトウェア
- **間隔を空けて反復して学習する機能**で、TOEICに必要な単語やフレーズを無理なく定着
- **自分だけのカスタムデッキ**を作成して、好きなタイミングで学習可能
[Anki公式サイト](https://apps.ankiweb.net/)
[Anki用単語リスト](https://ankiweb.net/shared/info/1735294245)

## Santaアルク
- **TOEIC対策に特化した**学習アプリ
- **模擬テストや練習問題**が実際の試験環境に近い
- **AIによる予測スコアと弱点分析機能**で学習状況を把握
- **プレミアムプランへの課金**で、さらに高度な機能が利用可能
[Santaアルク公式サイト](https://santa.alc.co.jp/)

どちらのツールも、**忙しい毎日でも無理なく続けられるように工夫されています。** 自分のペースで学習を進めることで、**TOEIC 900+という高得点を目指しましょう！**

**Happy Hacking!**
#0063（2024/03/03）クラスベースとプロトタイプベースのプログラミング言語

# クラスベースとプロトタイプベースのプログラミング言語

オブジェクト指向プログラミング（OOP）のパラダイムには、大きく分けて「クラスベース」と「プロトタイプベース」という2つの方式があります。  
それぞれの方式は、オブジェクトの生成や継承の仕組みに違いがあり、言語設計やプログラミングのスタイルに大きな影響を与えます。以下では、両者の特徴、利点・欠点、そして代表的なプログラミング言語を詳しく解説します。

---

## 1. クラスベースのプログラミング言語

### 基本概念
- **クラス:**  
  オブジェクトの設計図（テンプレート）であり、属性（データ）とメソッド（振る舞い）を定義します。  
  インスタンスは、このクラスから生成される具体的なオブジェクトです。

- **継承:**  
  あるクラス（スーパークラス）の機能を、別のクラス（サブクラス）が引き継ぎ、拡張・修正できます。  
  この仕組みにより、共通の機能を再利用し、コードの重複を減らすことが可能です。

### 特徴
- **静的な構造:**  
  クラスの定義が明確に存在するため、設計段階での型チェックやコード補完など、開発ツールの恩恵を受けやすいです。
- **厳格な継承関係:**  
  クラス階層が明示的に定義されるため、設計が整理されやすいですが、複雑な階層構造になると柔軟性が失われる場合もあります。
- **代表的な言語:**  
  - Java  
  - C++  
  - C#  
  - Python（主にクラスベースですが、柔軟な面も持つ）  
  - Ruby

### 例: Python のクラスベースのコード

```python
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("サブクラスで実装してください")

class Dog(Animal):
    def speak(self):
        return "ワンワン"

class Cat(Animal):
    def speak(self):
        return "ニャー"

dog = Dog("ポチ")
cat = Cat("タマ")

print(f"{dog.name} は {dog.speak()} と鳴く。")  # 出力: ポチ は ワンワン と鳴く。
print(f"{cat.name} は {cat.speak()} と鳴く。")  # 出力: タマ は ニャー と鳴く。
```

## 2. プロトタイプベースのプログラミング言語

### 基本概念
- プロトタイプ:
    - クラスのようなテンプレートは存在せず、既存のオブジェクト（プロトタイプ）をもとに新しいオブジェクトを生成します。
    - オブジェクトは、他のオブジェクトを直接コピー（または委譲）することで作られ、必要に応じてプロパティやメソッドを追加・修正できます。
- プロトタイプチェーン:
    - オブジェクトは自身のプロパティを持たない場合、プロトタイプチェーン上のオブジェクトからそのプロパティを探し出す仕組みを持ちます。
    - これにより、継承のような効果が動的に実現されます。

### 特徴
- 動的な拡張性:
    - 実行時にオブジェクトに新しいプロパティやメソッドを追加できるため、非常に柔軟です。
- シンプルなオブジェクト生成:
    - クラス定義が不要なため、軽量なオブジェクト生成が可能です。ただし、設計がゆるくなる可能性もあります。
- 代表的な言語:
    - JavaScript（代表例）
    - Self（プロトタイプ型の先駆け）
    - Lua（テーブルを使ったプロトタイプ的手法）

### 例: JavaScript のプロトタイプベースのコード

``` javascript
// 基本となるプロトタイプオブジェクト
let animal = {
    speak: function() {
        console.log("音が出る");
    }
};

// animal を元に新しいオブジェクト dog を生成
let dog = Object.create(animal);
dog.speak = function() {
    console.log("ワンワン");
};

dog.speak();  // 出力: ワンワン
```

## 3. クラスベースとプロトタイプベースの比較

| 特徴         | クラスベース                                    | プロトタイプベース                                    |
|--------------|-------------------------------------------------|-------------------------------------------------------|
| 設計方法     | 事前に定義されたクラス（設計図）から生成         | 既存のオブジェクト（プロトタイプ）を元に生成            |
| 継承         | クラス間の明示的な継承（階層構造）                | プロトタイプチェーンによる委譲（動的な継承）            |
| 柔軟性       | 静的で型安全、設計が整理されやすい                | 実行時に動的に変更可能、柔軟だが設計が曖昧になりやすい      |
| 代表言語     | Java, C++, C#, Python, Ruby                     | JavaScript, Self, Lua                                 |
| 学習曲線     | クラスや継承の概念に慣れる必要がある              | 直接オブジェクト操作ができるが、プロトタイプチェーンの理解が必要  |

## まとめ

- **クラスベース**の言語は、明確なクラス定義と継承を利用してオブジェクトを生成し、型安全性や設計の整理がしやすい一方で、柔軟性に欠ける場合があります。
- **プロトタイプベース**の言語は、既存のオブジェクトを元に動的にオブジェクトを生成できるため、柔軟で簡便ですが、設計の一貫性や可読性の面で課題が出ることもあります。
[Kotlin] null == falseは true ではない

# 概要
勘違いをしてしまっていたため、備忘録的に残します。
```kotlin

val flag : Boolean? = null

falg == true // false
flag == false // false  <- 無意識にtrueが返ってくると思い込んでいた


```
`null`な`Boolean`に `== true` も `== false` をしてもどちらも `false` になる。

以下のような思い込みがあった
- あるオブジェクトへ`== true`を行った結果が`false`の場合、`==false`の比較をした結果は`true`になる
- `null`に対して`==false`をした時に`true`になる。
    - `false`に何となくマイナス属性なイメージでも持ってしまっていていて、`==null`をした時に`true`が返るとでも思っていたのだと思う。`false`はただのBooleanの片方の値でしかないのに。

当たり前だが、`null`は 「値が存在しない」ことを表現しており、`true`でも`false`にもなれない。


# ちょっと詳細

## `null` は `null` との比較でだけ`true`になる
Kotlin では `Boolean` 型は `true` または `false` の **2つの値** しか持たない。  
一方、`null` は「値がない」ことを表す特殊な値であり、`Boolean` の値ではない。比較できない。
`null`と比較されて`true`になるのは`null`だけ。


## `==` 演算子の動作
Kotlin では `==` は 構造的等価 をチェックする演算子で、以下のように展開される。
(参照等価性は`===`)
https://kotlinlang.org/docs/equality.html

```kotlin
a?.equals(b) ?: (b === null)
```

動作は以下の通り。
1\. aが`null`じゃない場合はそのままオブジェクトが持つ`equarls`関数を呼び出す
2\. aが`null`だった場合に、bも`null`なのかどうかチェックし最終的な戻り値の`true`/`false`を決める。

```kotlin

val flag : Boolean? = null

falg == true // false
flag == false // false  <- 無意識にtrueが返ってくると思い込んでいた


```

冒頭の`flag == false`の処理を動かした時には、1の処理を通過し2まで進み、bが`null`ではないと判定され最終的に`false`が返る、という流れになる。
#0062（2024/03/02）Developer Tools と Page Source 

# Developer Tools と Page Source から取得できる情報

Webサイトを解析・デバッグする際に、ブラウザの **Developer Tools** と **Page Source** は非常に有用な情報源です。  
それぞれから得られる情報と用途を以下にまとめます。

---

## 1. Developer Tools から取得できる情報

ブラウザの Developer Tools（例: Chrome DevTools、Firefox Developer Tools）は、動的なサイトの内部状態やパフォーマンスの解析、デバッグに役立つ豊富な情報を提供します。

### 主な機能と情報

- **Elements/DOM:**
  - 現在のページのDOM構造（HTML要素）とCSSスタイルの詳細を確認・編集可能。
  - 実際のレンダリング結果や、JavaScriptで動的に変更された状態をリアルタイムに把握できる。

- **Console:**
  - JavaScriptのエラーメッセージやログ、警告が表示される。
  - コマンドラインでJavaScriptコードを実行して、即時に結果を確認できる。

- **Network:**
  - ページ読み込み時やその後のリクエスト（画像、スクリプト、APIコールなど）の詳細な情報が見られる。
  - 各リクエストのステータス、サイズ、タイミング、ヘッダー情報などを確認できる。

- **Sources/Debugger:**
  - JavaScriptコードのソースファイルを表示・デバッグ可能。
  - ブレークポイントを設定して、コードの実行過程をステップ実行し、変数の値やコールスタックを確認できる。

- **Performance:**
  - ページのパフォーマンス（読み込み時間、レンダリング時間、JavaScriptの実行時間など）を分析できる。
  - パフォーマンスのボトルネックやフレームレートの低下原因を特定するのに役立つ。

- **Application/Storage:**
  - クッキー、ローカルストレージ、セッションストレージ、IndexedDB、キャッシュなど、サイトが使用するクライアント側のデータを確認できる。
  - サービスワーカーやプッシュ通知の設定などもチェック可能。

- **Security:**
  - サイトのSSL/TLSの状態や、セキュリティに関する警告、証明書の詳細を確認できる。

---

## 2. Page Source から取得できる情報

**Page Source**（ページのソース表示）は、サーバーから送信された元のHTMLコードを確認するための機能です。

### 主な情報

- **HTML構造:**
  - サーバーが生成した静的なHTMLコードが確認できる。
  - ページがどのような要素で構成されているか、基本的な構造やタグの使い方が分かる。

- **メタ情報:**
  - `<meta>` タグにより、ページの文字コード、キーワード、説明、ビューポートなどの情報が含まれる。
  - SEO（検索エンジン最適化）やSNSのシェア時に利用される情報も確認できる。

- **リンク・リソース情報:**
  - CSS、JavaScript、画像などの外部リソースへのリンクが記述されている。
  - サイトのレイアウトや機能に必要な外部ファイルのパスが分かる。

### 注意点

- **動的変更は反映されない:**
  - Page Source は、ページが初めにロードされた際の静的なHTMLを表示するため、JavaScriptで動的に追加・変更された要素は含まれません。  
  - 動的な状態を確認するには Developer Tools の Elements パネルを利用します。

---

## まとめ

- **Developer Tools:**  
  リアルタイムのDOM構造、CSS、JavaScriptのデバッグ、ネットワーク通信、パフォーマンス解析、ストレージ情報、セキュリティ情報など、動的なサイトの内部状態を詳細に把握できる。

- **Page Source:**  
  サーバーから送信された静的なHTMLコードを確認でき、基本的な構造やメタ情報、外部リソースのリンクなどを把握するのに適している。

これらを組み合わせることで、Webサイトの動作や構造を総合的に理解し、問題の特定やパフォーマンスの改善、セキュリティ対策など、さまざまな面で役立てることが可能です。
[動画解説] Oracle NetSuite リリース2025.1主要なアップデート

[Oracle NetSuite リリース2025.1](https://qiita.com/fujitak/items/785ab35c47ebb0d47485) と[日本固有機能 (SuiteApp) Ver.25.00.0](https://qiita.com/fujitak/items/b05d9f9ef65cf9eb257e) の解説動画を、[NetSuite日本語コミュニティ](https://community.oracle.com/netsuite/japanese/discussion/4504569/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B92025-1%E4%B8%BB%E8%A6%81%E3%81%AA%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88) でご視聴頂けます。コミュニティのアカウントをお持ちでない方は、この記事の動画リンクをご利用下さい（その後、ぜひコミュニティのアカウントを作成下さい）。

すべての内容は、コミュニティにて2025年2月20日に公開した資料 [「NetSuite 2025.1 リリース内容のご紹介_20250221.pdf」](https://us.v-cdn.net/6032262/uploads/N32V7NZ0GG5D/netsuite-2025-1-e3-83-aa-e3-83-aa-e3-83-bc-e3-82-b9-e5-86-85-e5-ae-b9-e3-81-ae-e3-81-94-e7-b4-b9-e4-bb-8b-20250310-28japan-localization-e8-bf-bd-e5-8a-a0-29.pdf) をもとにしております。「NetSuiteの新機能を知りたい」とご希望の方は、3点目の動画からご視聴頂いても良いかもしれません。
    <br>
**0. アップデートスケジュールおよびリリースプレビュー環境**

https://videohub.oracle.com/id/1_50hy11by?width=400&height=285&playerId=54927922

**1.1 将来廃止継続利用不可となる機能・設定**


https://videohub.oracle.com/id/1_el7hb221?width=400&height=285&playerId=54927922

**1.2-4 共通_管理、会計、プロダクト業務に関わる新機能**

https://videohub.oracle.com/id/1_uyqetdjy?width=400&height=285&playerId=54927922

**2.1 売掛金調整トランザクションの戻入対応 ＆ 2.2 将来廃止/継続利用不可となる機能・設定**

https://videohub.oracle.com/id/1_y5mn91ib?width=400&height=285&playerId=54927922

上記内容をご確認いただき、必要な準備や検証を早めに進めていただくことで、NetSuite 2025.1リリースのメリットを最大限に享受いただけます。

[冒頭のリンク](https://qiita.com/fujitak/items/785ab35c47ebb0d47485) にて、「機能の追加/改善」「お客様への依頼事項」「リスク」を簡潔にまとめております。ご参考になれば幸いです。
デジタル名刺アプリ開発で得た気づき(React, TypeScript, Jest,supabase, Firebase)

# はじめに
デジタル名刺アプリ開発で得た気づきをまとめます。

### 主導権を持つ
解決するのは自分だと意識することが重要。
エラーが出た時、何も考えずにAIに質問することがあるが、
AIに質問→AIが回答→AIに質問→AIが回答...とエンドレスに繰り返すと、何をやりたいのか分からなくなっている時がある。

AIに聞くのは良いが、何も考えずに質問を繰り返していると時間が溶ける。
これを避けるために、常に次のことを考える。

- やりたいこと
- 不具合の原因となりそうなこと（どこがおかしいか）
- どうすれば解決できるか

### やりたいことを言語化する
自分の経験にないものを作る時、何がわからないのか分からないのが問題となる。
それでも、何をしたいのか、何が足りないのか、どことどこがつながっていないのか、を意識し、やりたいことを言語化する。
(そうしないとAIや検索で、良い質問ができない)

### アンテナを張る
- ドキュメントを読む
- 本を読む（最初から全部読むのは時間がかかり過ぎてしまうが、概要の勉強や知らない機能の発見には役立つ）
- Qiitaの記事を読む（特に同じコミュニティの人の記事は、新たな発見や復習になる）

### プログラムのつながりを意識する
プログラムが動くということは、どこかでつながっている。
どこがつながっていないか、どうすればつなげられるかを意識する。
（Jestのテスト環境でも環境変数を読み込めるようにするには、どのファイルに、どうコードを書いたら繋がるかなど）

理解が浅かったので、Jestで環境変数を読み込めない理由を記事にした。
[Jestで環境変数を読み込めない(React, TypeScript, supabase)](https://qiita.com/like-mountain/items/06bae5df426802bafb38)

### 詳細部分まで追う
最初から深くまではわからない。
まずはアプリが動けばいいが、深く掘り下げないと理解が深まらない。

プログラミングの流れをきちんと追うことが重要。
（とはいえ時間が経ってから分かることもあるので、解決したら進むという選択肢もあり）

### 記事を書く
文章は、理解していないと書けない。
Qiitaの記事を書くことで、言語化する必要が生まれ、曖昧な部分を掘り下げる必要が生じる。
なので記事を書くと理解を深めることができる。

### 単純化する
[「await」と「waitFor」の違いと「TypeError: Cannot read properties of null (reading 'length')」エラーの解決方法（Jest、Testing Library）](https://qiita.com/like-mountain/items/be8788a1b4889b2bc891)

上記記事を書いたが、awaitを連続して記述しても同期的な処理ができない理由を忘れてしまっていた。
やりたいことを説明すると、以下となる。

```
async function example() {
  await 選択肢のフォームを描画;
  await 選択肢1を入力する;
  await 送信ボタンを押す;
}
```

ただこれだとうまくいかない。
理由は、awaitはpromiseが解決される（正常処理、エラー）を待つだけで、前後のawaitの処理とは関係ないため。
上の例だと、「await 選択肢1を入力する」は、自身のpromiseの解決を待つ（選択肢がないのでエラーという解決になる）が、「await 選択肢のフォームを描画」を待つわけではない。
なので得たい結果が得られなかった。

# 終わりに
やはり、言語化が大事だと思いました。

アプリの開発を通して気づいたことを、今後の開発でも実践していきます。
鉱脈の利用

## 導入
ダイソンソフィアプログラムのエンドコンテンツ（？）として、無限研究の一つに「鉱脈の利用」があります。レベル 100 近くなると、鉱脈の採掘で消費する量がほぼ 0 となり、資源が無限に採掘出来るようになります。希少資源が枯渇することも無くなります。
## 仕様
「鉱脈の利用」はレベルが 1 つ上がる度に、
・-6% 鉱脈消費 / 採掘
・+10% 採掘速度
となっています。
## プログラム
これから先の変化量を手で計算するのは面倒なので、プログラムを書いて求めてみます。
```
(define (vein level speed ratio)
  (if (> level 100)
      'done
      (begin
        (print (format #f "level = ~3,'0d, speed = ~4,'0d, ratio = ~1,3f" level speed ratio))
        (vein (+ level 1) (+ speed 10) (* ratio 0.94)))))
```
現在の値を vein 手続きの引数に与えて評価すると、レベル 100 までの採掘速度と鉱脈消費の値を表示します。
## 実行
現在の鉱脈の利用の値は
・レベルは 62
・採掘速度は、 710 %
・鉱脈消費 / 採掘は、2.295 %
です。
```
gosh> (vein 62 710 2.295)
level = 062, speed = 0710, ratio = 2.295
level = 063, speed = 0720, ratio = 2.157
level = 064, speed = 0730, ratio = 2.028
level = 065, speed = 0740, ratio = 1.906
level = 066, speed = 0750, ratio = 1.792
level = 067, speed = 0760, ratio = 1.684
level = 068, speed = 0770, ratio = 1.583
level = 069, speed = 0780, ratio = 1.488
level = 070, speed = 0790, ratio = 1.399
level = 071, speed = 0800, ratio = 1.315
level = 072, speed = 0810, ratio = 1.236
level = 073, speed = 0820, ratio = 1.162
level = 074, speed = 0830, ratio = 1.092
level = 075, speed = 0840, ratio = 1.027
level = 076, speed = 0850, ratio = 0.965
level = 077, speed = 0860, ratio = 0.907
level = 078, speed = 0870, ratio = 0.853
level = 079, speed = 0880, ratio = 0.802
level = 080, speed = 0890, ratio = 0.754
level = 081, speed = 0900, ratio = 0.708
level = 082, speed = 0910, ratio = 0.666
level = 083, speed = 0920, ratio = 0.626
level = 084, speed = 0930, ratio = 0.588
level = 085, speed = 0940, ratio = 0.553
level = 086, speed = 0950, ratio = 0.520
level = 087, speed = 0960, ratio = 0.489
level = 088, speed = 0970, ratio = 0.459
level = 089, speed = 0980, ratio = 0.432
level = 090, speed = 0990, ratio = 0.406
level = 091, speed = 1000, ratio = 0.381
level = 092, speed = 1010, ratio = 0.359
level = 093, speed = 1020, ratio = 0.337
level = 094, speed = 1030, ratio = 0.317
level = 095, speed = 1040, ratio = 0.298
level = 096, speed = 1050, ratio = 0.280
level = 097, speed = 1060, ratio = 0.263
level = 098, speed = 1070, ratio = 0.247
level = 099, speed = 1080, ratio = 0.233
level = 100, speed = 1090, ratio = 0.219
done
```
## 結果
レベル 100 になると、採掘速度は 1090 %、鉱脈消費 / 採掘は、0.219 % になることがわかります。
## 資料
今はレベル 63 になりましたが、計算結果と一致しています。
![dsp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3430684/27f8fdf6-1e42-457d-81cb-4bcb2282a7c4.png)
![dsp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3430684/698c34d9-24e0-4ead-b666-5997c9183823.png)
## まとめ
このプログラムが誰かの役に立つのかは謎。
Nginx③リバースプロキシの設定

## はじめに
Nginxを使用したリバースプロキシをローカル環境で手軽に体感することを目的としておりますので、Nginxに初めて触れる方向けの内容となっております。

## リバースプロキシとは
クライアントのリクエストを受け取り、内部のサーバに転送する役割を持つサーバです

## 環境
- Ubuntu 24.04
- nginx-1.26.3
- `sites-available`と`sites-enabled`ディレクトリがある状態
- `/etc/nginx/sites-enabled/`内にあるすべての設定ファイルをNginxの設定に組み込むことができている状態
- 80番ポートでWebサーバが動作している状態
  - 80番ポートでなくても大丈夫ですが、どこかのポートでWebサーバが動作している状態にしてください

下記のサイトで上記のような環境にする方法が記載されております。

https://qiita.com/myaX/items/4212e8899a39e6800414

https://qiita.com/myaX/items/527ad2a7b02488aad454

## リバースプロキシの設定方法
1. リバースプロキシの設定
2. `sites-enabled/`にシンボリックリンクを作成
3. 設定の反映

## 手順1：リバースプロキシの設定
```
sudo vim /etc/nginx/sites-available/server.conf
```
```conf:/etc/nginx/sites-available/server.conf
server {
        listen       8080;
        server_name  localhost;

        location / {
                # Webサーバが動作しているポート番号の指定
                proxy_pass http://localhost:80;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}
```

- `proxy_pass http://localhost:80;`
  - リクエストを80番ポートのWebサーバーに転送
- `proxy_set_header Host $http_host;`
  - 元のホストヘッダーを80番ポートのWebサーバーに転送
- `proxy_set_header X-Real-IP $remote_addr;`
  - クライアントの実際のIPを80番ポートのWebサーバーに転送
- `proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`
  - クライアントIPをX-Forwarded-Forヘッダーに追加
- `proxy_set_header X-Forwarded-Proto $scheme;`
  - クライアントが使ったプロトコル（HTTP/HTTPS）を80番ポートのWebサーバーに転送

## 手順2：sites-enabled/にシンボリックリンクを作成
```
sudo ln -s /etc/nginx/sites-available/server.conf /etc/nginx/sites-enabled/
```

## 手順3：設定の反映
```
sudo systemctl reload nginx
```
`http://localhost:8080`にアクセスすると、`http://localhost:80`に表示されているページの表示ができました。

## まとめ
以上で、リバースプロキシの設定ができました。
Buffalo製Wi-Fiアダプター WI-U3-2400XE2をUbuntu24.04で使用する


# インストール

WI-U3-2400XE2ではRealtekのrtw8852cuという無線チップが使用されているようなので、
ドライバーをインストールする。

```
git clone https://github.com/lwfinger/rtw8852cu.git
cd rtw8852cu
```

os_dep/linux/usb_intf.cに下記の7行目の内容を追記する。

```
static struct usb_device_id rtw_usb_id_tbl[] = {
	/*=== Realtek demoboard ===*/
	{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xC85A, 0xff, 0xff, 0xff), .driver_info = RTL8852C},
	{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xC832, 0xff, 0xff, 0xff), .driver_info = RTL8852C},
	{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xC85D, 0xff, 0xff, 0xff), .driver_info = RTL8852C},
	{USB_DEVICE_AND_INTERFACE_INFO(0x35b2, 0x0502, 0xff, 0xff, 0xff), .driver_info = RTL8852C}, /* TP-Link AXE5400 */
	{USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x03a6, 0xff, 0xff, 0xff), .driver_info = RTL8852C}, /* WI-U3-2400XE2 */
	{}	/* Terminating entry */
};

```

効果があるのか分からないが、Makefile内のCONFIG_POWER_SAVEも無効とした。
<br>
そしてビルド＆インストール

```
make -j {並列数}
sudo make install
```
warningはたくさん出るが無視。。
再起動後、lsmodコマンドで8852cuが含まれていればOK。


https://review.kakaku.com/review/K0001604626/ReviewCD=1859618/


# その他の設定
上記だけでは次回起動時にドライバーが読み込まれなかったため、/etc/modulesに下記の通り追記する。

```
# /etc/modules is obsolete and has been replaced by /etc/modules-load.d/.
# Please see modules-load.d(5) and modprobe.d(5) for details.
#
# Updating this file still works, but it is undocumented and unsupported.

8852cu

```


<br>
また、USBが3.0として認識されず、300Mbps程度の速度しか出なかったため、下記設定を/etc/modprobe.d/8852cu.confへ記載する。

```
# Edit the following line to change, add or delete options:
options 8852cu rtw_drv_log_level=1 rtw_led_ctrl=1 rtw_vht_enable=1 rtw_switch_usb_mode=1
```

https://qiita.com/Akihiro_Kashiwagi/items/1f0b80aa1634136c1a37


# 結果
無事に1Gbps程度の速度がでるようになった。(買ってよかった)
MySQLのリストア時のエラー対処（Unknown collation: 'utf8mb4_0900_ai_ci'）

# Unknown collation: 'utf8mb4_0900_ai_ci'の対処法
mysqldumpで出力したバックアップデータを別環境でリストア（復元）できなかった際の対応メモ。

:::note warn
方法は他にも色々あるので、一例としてみてください。
:::

## エラー状況
リストア時に「Unknown collation: 'utf8mb4_0900_ai_ci'」というエラーが出てデータベースの復元ができない。

バックアップデータ内にある「COLLATE=utf8mb4_0900_ai_ci」という部分をすべて削ってしてしまえば、とりあえずエラーを出さずにリストアできる。しかし、バックアップデータが大きすぎて、テキストエディタでの編集ができない。

## 対処内容
### 1\. 「構造のみ」と「データのみ」に分けて再度バックアップを実施

```
# 構造のみ場合（-d オプションをつけてmysqldumpする）
mysqldump -d -u root -h localhost test_db > "D:\backup\test_db_d.sql"
```
```
# データのみ場合（-t オプションをつけてmysqldumpする）
mysqldump -t -u root -h localhost test_db > "D:\backup\test_db_t.sql"
```

### 2\. テキストエディタでバックアップファイルを修正
構造のみを出力したバックアップファイルをテキストエディタで開き、「COLLATE=utf8mb4_0900_ai_ci」の部分を一括置換などで除去。

:::note info
データを含んだファイルは容量が大きすぎてテキストエディタで編集ができなかったが、構造のみとなり編集が可能となった。
:::

### 3\. 再度リストアの実行
先に構造のみのバックアップファイルをリストアし、次にデータのみのバックアップファイルをリストアする。
これで完了。
SaelsforceでWebタブの挙動について調べてみた

本橋孝昭です
今回はSalesforceのWebタブについて調査しました

## Webタブとは

WebタブとはSalesforceに表示させるタブを作成できる機能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3452e8a6-b8ac-4d07-b53a-6dc0944d94b3.png)

Salesforce画面にも「ヘルプ」をクリックすれば概要が出てきます
（ヘルプ画面をクリックすればClassic画面が表示されますがLightning画面でも表示できます）


ここにカスタムオブジェクト「X1」があったとします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cd7c6d3b-38e7-4fca-bcf3-2964b00dc1ad.png)

カスタムオブジェクトのタブ名は「X1」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b0330dbc-fc47-434a-b48b-daff49571f3b.png)

このタブ名をカスタムオブジェクト名を変更しないで変更するにはどうすればいいのか
という場合、Webタブを作成します

上部URLをコピーして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b8170646-a3e4-4293-8bcc-efe37409d944.png)

WebタブのURLとして貼り付けます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5895f56e-c357-4311-a9a3-51b08ba0ad51.png)

今回は「TEST」というタブを表示させました

こうすることによりカスタムオブジェクト「X1」にはタブ「X1」と「TEST」の２つが表示されます

このタブの挙動が少し複雑です

もしも「TEST」をクリックすれば「X1」に遷移します

もしも通常のカスタムオブジェクトのタブ「X1」が無い場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2ec0ee5e-5615-4d89-82fd-42fe10ece45e.png)

「TEST」をクリックするとカスタムオブジェクト「X1」が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7b5621b8-2359-4b39-bc69-42d279b60c17.png)
VSCodeを用いた"STM32 Nucleo Board STM32F446RE"のデバッグ

# 概要
VSCodeを用いた"STM32 Nucleo Board STM32F446RE"のデバッグ環境(ブレイクポイントなど)の構築方法を紹介します。
PCはWin11\(おそらく他のOSでも可)です。

# 準備
### 開発環境の構築
以下の記事を参考にVSCodeでの開発環境を構築してください。
https://qiita.com/harashi10969/items/996c183a9993dd1a44fe

### ST-LINKのアップグレード
デバッグ機能を使用するにはST-LINKをアップグレードする必要があるようなので、[ココ](https://www.st.com/ja/development-tools/stsw-link007.html)からソフトウェアをダウンロードしてください。
Zipを解凍して、exeを起動すると以下のような画面が表示されるので、"Device Connect"をクリックした後に、"Yes >>>>"をクリックしてアップグレードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/cbbfff0a-b8c0-4ca7-b23f-00115752c5ed.png)

# VSCodeでのデバッグ
プロジェクトを開いてF5を押せばデバッグ機能が動くと思います。
または"Build & Debug Microcontroller - ST-Link"を押してデバッグしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/8cd70663-ced9-4361-8764-66d07caa7a63.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370593/f626da22-0cbd-4a30-8601-77f4b71df475.png)

# まとめ
デバッグ機能に対しての知識はまだまだ浅いため、環境によっては動かない場合があるかもしれませんが、私の環境ではこれだけで簡単にデバッグ機能が利用できました。

この記事が誰かの参考になれば幸いです。

# 参考
* https://qiita.com/harashi10969/items/996c183a9993dd1a44fe
    前回書いた環境構築の記事です。
* https://community.st.com/
    公式がコミュニティサイトを開設してくれています。
* https://www.youtube.com/watch?v=DLmbNfUh62E
    拡張機能についての公式のYouTube動画もあります。