OmniAICreator/Qiita-1.07M huggingface dataset:
【簡単AWS】【ELB】SNIを利用したELB経由の暗号化通信とは？

# はじめに
AWSで複数のドメイン名を利用する際、**SNI（Server Name Indication）** を活用することで、複数の証明書を効率的に扱うことができます。この記事では、SNIの基本的な概念と、ELB（Elastic Load Balancer）での利用方法をわかりやすく解説します。  

---

## 通常のサーバー証明書の制限と問題点  
通常、サーバー証明書は1つのパブリックIPアドレスに1つのドメイン名を紐付ける形で使用されます。そのため、以下のような問題が発生します。

### 例：複数のドメイン名を持つWebサーバーの場合
例えば、1台のWebサーバーで**example.com**と**example.co.jp**の2つのドメインを運用する場合、それぞれに異なる証明書が必要です。通常は、ドメインごとに異なるパブリックIPアドレスを取得し、サーバー証明書を導入する必要があります。

しかし、**ELB**を使用して複数のドメイン名を同じWebサーバーに転送しようとすると、クライアント側から見たWebサーバーのパブリックIPアドレスは**ELBのパブリックIPアドレス**しかありません。そのため、通常のサーバー証明書では対応できません。

---

## SNI（Server Name Indication）の仕組み
**SNI（Server Name Indication）** とは、暗号化通信においてサーバー証明書を**パブリックIPアドレスではなく、ドメイン名によって判断する技術**です。  

SNIに対応した**ELB**に複数のサーバー証明書を導入すると、ELBは**クライアントがリクエストしたドメイン名**を確認し、適切なサーバー証明書を選択して通信を転送します。これにより、複数のドメイン名を1つのELBで効率的に処理できるようになります。

### SNIが対応するELBの種類
- **ALB（Application Load Balancer）**
- **NLB（Network Load Balancer）**

---

## SNIを利用するメリット
SNIを利用することで、以下のメリットがあります。

1. **コスト削減**
   - 複数のドメインを1つのELBで管理できるため、複数のパブリックIPアドレスを取得する必要がなくなります。
2. **運用の簡素化**
   - サーバー証明書の管理が簡単になります。複数の証明書を同一のELB上で扱えます。
3. **柔軟なスケーラビリティ**
   - SNIに対応することで、さまざまなWebアプリケーションを1つのELBでサポートできます。

---

## 具体的な利用シーン
### 例1：ECサイトで複数のブランドを運用
- **example.com** → 主力ブランド
- **example.co.jp** → 日本市場向けブランド

これらのドメインを1つのALBに統合し、SNIを活用して異なる証明書を適用することで、運用を効率化できます。

### 例2：マルチテナント環境のWebサービス
マルチテナント環境では、顧客ごとに異なるドメイン名を利用することがあります。SNIを使用することで、すべての顧客ドメインを1つのNLBまたはALBで管理可能です。

---

## SNI利用時の注意点
1. **SNI非対応クライアント**
   - 古いブラウザや一部のクライアントはSNIに対応していません。サポート対象のクライアントを確認する必要があります。

2. **証明書の有効期限管理**
   - 複数の証明書を導入する場合、それぞれの証明書の有効期限を管理する必要があります。

3. **負荷分散設定の確認**
   - ALBまたはNLBの設定で、SNIが適切に動作するように確認することが重要です。

---

## まとめ
SNIを利用することで、複数のドメイン名を効率的に1つのELBで管理でき、運用コストの削減やスケーラビリティの向上が期待できます。AWS環境で複数ドメインを扱う場合は、ぜひSNIを活用してみてください。  

---

### 参考リンク
- [AWS Elastic Load Balancing ドキュメント](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/userguide/)
- [TLSとサーバー証明書の基本](https://docs.aws.amazon.com/ja_jp/)

---

### 著者について
クラウド技術に関する情報を共有しています。この記事が参考になりましたら、ぜひ「いいね」や「フォロー」をお願いします！
個人的備忘録：AWSのサービス名に「Amazon」と「AWS」がつく違いについて、よく聞かれそうなことをまとめてみた

## はじめに  
AWSのサービスには「**Amazon**」とつくものと「**AWS**」とつくものがあります。

:::note info
**これは単なる名称の違いではなく、それぞれのサービスの背景や用途によるものです。**
:::

本記事では、その違いを整理し、理解しやすく説明します。AWSを活用する際の参考になれば幸いです。  

## 書こうと思ったきっかけ
AWSを使っていると、なぜ「**Amazon EC2**」と「**AWS Lambda**」のように名前が違うのか疑問に思うことがあります。

:::note warn
***この命名ルールを理解しておけば、新しいサービスに触れたときにも、その背景を推測しやすくなります。***
:::

そこで、名称の違いとその法則について調べ、まとめることにしました。

AWSのサービスには「**Amazon**」とつくものと「AWS」とつくものがありますが、これは命名規則の違いによるものです。それぞれの違いを簡単に説明します。

## 簡単な違い

備忘録として、AWSのサービス名の違いを簡単にまとめました。参考になれば幸いです。

| Prefix  | 特徴 | 代表的なサービス |
|---------|-------------------------------|---------------------------|
| **Amazon** | もともとAmazon社内で使われていた、またはエンドユーザー向けのクラウドサービス | Amazon EC2, Amazon S3, Amazon RDS |
| **AWS** | AWSのプラットフォームの一部として開発され、特に企業向け機能を提供 | AWS Lambda, AWS IAM, AWS CloudFormation |

基本的には上記のルールが適用されていますが、完全に統一されているわけではないので、サービスごとに確認するのがベストです！

### 参考資料

https://stackoverflow.com/questions/46069047/aws-products-and-services-naming-nomenclature-starting-with-amazon-vs-aws

https://dev.classmethod.jp/articles/awsservice_naming/

https://tatsuyashi.hatenablog.com/entry/2019/01/22/000328

## 「Amazon」がつくサービス

「Amazon」がつくサービスは、Amazonが提供するクラウドサービスとしてのブランドを強調しているものが多いです。これらのサービスは、もともとAmazon社内で使われていたものが外部向けに提供されたものや、エンドユーザー向けに提供されることが多いです。

### 代表的な例
- **Amazon EC2**（Elastic Compute Cloud）：仮想サーバーを提供
- **Amazon S3**（Simple Storage Service）：オブジェクトストレージ
- **Amazon RDS**（Relational Database Service）：マネージドデータベース

## 「AWS」がつくサービス

「AWS」がつくサービスは、AWSプラットフォームの一部として開発されたサービスや、AWSの技術基盤を強調するものが多いです。特に、企業向けの機能や統合サービスとしての側面が強いものに多く見られます。

### 代表的な例
- **AWS Lambda**：サーバーレスコンピューティング
- **AWS CloudFormation**：インフラのコード管理
- **AWS IAM**（Identity and Access Management）：アクセス管理

## 例外も存在

一部のサービスでは、例外的に「Amazon」と「AWS」のどちらがつくかが直感的でない場合もあるので、個々のサービスの歴史や開発背景を知ると理解しやすくなります。

### 代表的な例外（自分調べ）
- **Amazon VPC**（Virtual Private Cloud）：AWSのネットワーク関連のサービスなのに「Amazon」
- **AWS Fargate**（コンテナのサーバーレス実行環境）：Amazon EC2と関連があるのに「AWS」

## まとめ  
この違いは、AWS認定試験を受験する中で特に意識したポイントでした。

「**Amazon**」がつくサービスは、もともとAmazon社内で使われていたものやエンドユーザー向けのものが多く、「**AWS**」がつくサービスは、AWSプラットフォームの一部として企業向けに開発されたものが多いです。

ただし、一部例外もあるため、サービスごとの背景を知ることが重要です。
SharePoint エージェントのまとめ



+ [SharePoint エージェントの概要](https://support.microsoft.com/ja-jp/office/get-started-with-sharepoint-agents-69e2faf9-2c1e-4baa-8305-23e625021bcf)
+ [SharePoint エージェントの概要](https://learn.microsoft.com/ja-jp/sharepoint/get-started-sharepoint-agents)


**エージェントの概要**

すべての SharePoint サイトには、そのサイト上のコンテンツに自動的にスコープが設定された "ready-made-agent" が付属しています。 サイト訪問者は、このエージェントとチャットして、このサイトのコンテンツを理解し、特定の質問をし、ドキュメントを分析できます。 例を次に示します。Contoso Camera のセールス マネージャーは、マーケティング チームの SharePoint ドキュメント ライブラリの製品提案とパフォーマンスの概要を活用して、製品をより深く理解し、潜在的な顧客との利点を伝えることができます。

**エージェントを体験するには何が必要ですか?**

+ M365 Copilot ライセンス所有者は、追加料金なしで SharePoint エージェントを作成して使用できます。

+ SharePoint エージェントに対して 従量課金制サービス が有効になっている M365 以外の Copilot ライセンス所有者は、SharePoint エージェントを作成して使用できます。

**エージェントを他のユーザーと共有する**

共有したいエージェントは、エージェントの一覧から見つけることができます。 省略記号を選択し、[ 共有] を選択します。その後、[リンクの コピー ] オプションを使用して、ファイルへのリンクを取得できます。 他のファイルを共有する場合と同様に、同僚にリンクを送信できます。 リンクを受け取ったユーザーは、リンクを選択してエージェントを開くことができます。

注: 共有できるのは、作成されたエージェントのみです。 サイトに付属する既製のエージェントを共有することはできません。

----------
+ [Copilot in SharePoint についてよく寄せられる質問](https://support.microsoft.com/ja-jp/topic/copilot-in-sharepoint-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%82%88%E3%81%8F%E5%AF%84%E3%81%9B%E3%82%89%E3%82%8C%E3%82%8B%E8%B3%AA%E5%95%8F-eb1b7668-3d98-4a93-98ef-f0c6dfc694f0)
+ [Teams で AI エージェント ボットを構築する](https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/build-an-ai-agent-in-teams?tabs=buildnew)
+ [Teams で SharePoint からエージェントを共有する](https://support.microsoft.com/ja-jp/office/share-an-agent-from-sharepoint-in-teams-6dcbf7b5-8c13-44e5-a68a-dbd71fb76ad3)
+ [Microsoft 365 Copilotアクティビティ履歴を削除する](https://support.microsoft.com/ja-jp/office/microsoft-365-copilot%E6%93%8D%E4%BD%9C%E5%B1%A5%E6%AD%B4%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-76de8afa-5eaf-43b0-bda8-0076d6e0390f)
【Tableau Desktop Specialist】やったこと

## この記事は
筆者が、2025年2月にTableau Desktop Specialistを取得した際に使用した教材などのまとめです。

### 筆者のスペック
+ エンジニア2年目
+ Tableau実務未経験
Salesforceを触ることになった際にBIツールであるTableauを知りました。資格もあるのか～勉強するついでに取ってみよ～という気楽な気持ちではじめました。

## 勉強の流れ
ステップ1→1週間
ステップ2→1週間
くらいの時間配分で取り組みました。

### ステップ1：Udemy講座
Tableauの使い方を知らないところからのスタートでしたので、こちらの講座を受講しました。有料ですが、Tableauの基本から教わることができます。


https://www.udemy.com/course/tableau-x/?couponCode=KEEPLEARNING

なおハンズオンについて、講座内ではTableau Desktopを使用していますが、自分は無課金のTableau Publicを使っていました。一部使えない機能はありますが、講座のハンズオンだけなら問題なく進められるかなと思います。
講座は6割くらいまで受講して、次の問題演習に進みました。

### ステップ2：問題演習
問題集を周回していきます。
まずはUdemyの問題集を解きました。
有料で全60問×4回分収録されています。セールの時だったので2000円いかずに買えました。

https://www.udemy.com/course/tableau-desktop-specialist-2023/?utm_source=aff-campaign&utm_medium=udemyads&LSNPUBID=PPkX79%2Fc*b0&ranMID=47901&ranEAID=PPkX79%2Fc*b0&ranSiteID=PPkX79_c.b0-qdEEqwoOd_9lbe2gqIoupQ

+ 1周目：ざっくり解く（わからなくてOK）、初見の用語をまとめる
+ 2周目：解説をしっかり読んで頭に入れる
+ 3周目：再度1周して不明点を明らかにする

という流れで進めていました。

慣れてきたところでもう一つの問題集、JPN試験に取り組みます。
こちらは無料で問題数が多いですが、翻訳ブレが多い&正解が間違っていることがあるので、スプレッドシートにポイントをまとめるようにしていました。
使った問題集は以下の2回分です。

151問収録

https://www.jpnshiken.com/shiken/Tableau.TDS-C01-JPN.v2024-08-13.q151.html

152問収録

https://www.jpnshiken.com/shiken/Tableau.TDS-C01.v2023-06-27.q152.html

スプレッドシートにはこんな感じでまとめてました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/374d3d61-2617-6a91-0a21-dc11db693716.png)


## 受験
### 試験会場
+ オンサイト受験しました。早めに着きましたがすぐに受付してもらえました。他のCBT試験と同様
身分証確認→書類記入→写真撮影→手荷物をロッカーに預ける→受験室で受験
の流れで進みました。
### 試験内容
+ 回答10分+見直し10分、で20分ほどで終わりました。
スコアは 944/1000 でした。
+ Udemyの問題集の類似問題が8割、JPN試験の類似問題が2割、くらいの配分で出ていた印象です。特にトリッキーな問題はありませんでした。しっかり問題集を周回していれば大丈夫な試験だなと思いました。
+ 複数回答の個数（2個か3個か）まではシステムのほうでチェックしてくれないので、要注意です（見直しの際に、いくつか回答する個数を間違えていたことに気づきました…！）

## 終わりに
+ Tableauって何ぞや？のところからスタートしましたが、順調に勉強を進められたと思います。
+ 引き続きTableauの勉強にとりくんでいきたいです。
プログラミング言語を作る方法

今回はプログラミング言語を作る方法を紹介します。
ここでは字句解析(プログラムの意味の解釈をする)について説明します。
## 1. EBNFを使う
EBNFを使って自分のプログラミング言語の文法規則を指定します。
### メリット
- 正規表現ライクな記述法でやりやすい(無理な人もいます)
- EBNFの文法規則を指定するだけで変換は全部[Lark](https://qiita.com/k5trismegistus/items/358d58bcd50eb3f67fe8)とかがやってくれる
### デメリット
- 正規表現を超える文法は使えない
- 文法規則を一から指定する必要がある
## 2. 全部作る
全て1から作ります。
### メリット
- 字句解析の理論等を理解できる
- 全て思いのままに作れる
### デメリット
- 圧倒的にプログラミングする必要がある
## 3. 既存のプログラミング言語の字句解析エンジンを使う
例えば[acorn](https://www.npmjs.com/package/acorn)、JavaScriptのパーサーです。
### それってプログラミング言語を作っているの？
JavaScriptの標準規格の`parseInt`とかそういう関数を全部実装してなかったら、まあ、主張できるんじゃないですかね。
ライセンス表記は必要だけど。
### メリット
- 字句解析はローコードで出来る
- 既存の慣れた文法を使える
### デメリット
- 新しい文法は作れない
- 文法を消すこともできない(エラーを吐くことはできる)
## まとめ
まあ他にも色々な方法があると思いましたが、今回は
- EBNFを使う([EBNFの記事](https://qiita.com/k5trismegistus/items/358d58bcd50eb3f67fe8))
- 全自作
- 既存の物を使う([例えばacorn](https://www.npmjs.com/package/acorn))

を紹介しました。
ファイル名をフォルダごと再帰的に一括置換する【Windows】【PowerShell】

## 作成の経緯
証跡等を撮る際に、項番等を間違えてしまったことが多々あり、後から直す必要があったため作成しました。
また、何度も使う割によくコマンドを間違えてしまうので、備忘録として。

## 参考
以下の方のを参考にしました。コマンドの大元はそのままなのですが、注意点があるので以下で触れていこうと思います。

https://qiita.com/hyakuson/items/9e8e239d4ba45b595486


## コマンド
スクリプト化した際に使い勝手が良いように対話式にしています。
再帰的に置換すると上位で置換したものが置換後の値になりエラーが吐かれるので、エラーを飛ばしています。(中身は問題なく変わります。)
~~~
$ChPath = Read-Host "置換するフォルダをフルパスで入力"
$before = Read-Host "置換前の変える部分をワイルドカードなしで入力"
$after = Read-Host "置換後をワイルドカードなしで入力"

cd $ChPath
Get-ChildItem -Recurse 2>$null |Rename-Item -Newname{$_.Name -replace "${before}","${after}"} 2>$null

~~~

:::note warn
#### 注意
##### 置換前部分はワイルドカードなし！
よく間違えますが、-replaceのオプションコマンドは一致部分を探すものなので、前後にアスタリスク等のワイルドカードは不要です。ただし、置換部分を一意に絞れる範囲まで書く必要があります。
:::
M5StampS3、アナログジョイスティックの値を最小二乗法して遊ぶ



x 過去ログを見よ!!!
x 片チャンネル
x 3秒ごと
x bの値の10進固定小数点でどうするか、検討中(20250214)予定は未定
x 送信直前の値をサンプリングする予定
x M5NanoC6の場合は、電圧が直接に返つてくるので新規につくらなとダメだ
x nが10個とか15個とかが多いのは計算しやすいから。10の時は、合計は、55,平均は、5.5:15の時は、合計は、120,平均は、8,小数点以下がないのは、15,n=15のx偏差×y偏差の合計は、280


結果
----

![o_coq809.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1378de62-6850-5053-eb8c-27b0304a17eb.jpeg)



プログラム
----


```c++


//ser_analog_joystick_min2j_M5StampS3

//nは、15固定、1,2,3,4...12,13,14,15
//xの平均は、8 (計算済み)
//xの偏差の二乗の積は、280 (計算済み)


#define G_X 13
#define G_Y 15


void setup() {
  // put your setup code here, to run once:

  //gpio inte
  pinMode(G_X, ANALOG);  //gpio init
  pinMode(G_Y, ANALOG);  //gpio init

  //シリアルの初期化
  Serial.begin(9600);
  Serial.println();
  //シリアルの待ちが0.5*9
  for (int i = 0; i < 9; i++) {
    Serial.print('.');delay(500);  //接続待ち
  } //for
  Serial.println();

} //setup

void loop() {
  // put your main code here, to run repeatedly:

  float c_yl = 0;
  //float c_yr = 0;

  int y[20];
  int s = 0;  //input
  for (int i = 1; i <= 15; i++) {
    //センサー入力する
    s = s + (y[i] = analogRead(G_X));             //センサーの値
  } //for
  s = s / 15;                            // s / 15

  int xydie = 0;
  for(int i = 1;i<=15;i++){    
    xydie = xydie + (   (i - 8) *  (y[i]-s)  );
    Serial.printf("%d,",       (i - 8) *  (y[i]-s)  );
  } //for

  int b = xydie / 280;
  //int a = s -(xydie / 280)*8;
  int a = s -((xydie*8) / 280);

  Serial.printf("\n");
  Serial.printf("xydie = %d\n",xydie);
  Serial.printf("\n");
  Serial.printf("b = %d\n",b);
  Serial.printf("a = %d\n",a);

  //c_yl = ((float)(a+b*15)) * (3.3f / 4096.0f);  //  電圧こと
  c_yl = ((float)(a+((xydie*15) / 280))) * (3.3f / 4096.0f);  //  電圧こと
  

  //表示
  Serial.println(c_yl);
  Serial.println();
  delay(3000);  //ダミー 0.3秒待つ

} //loop



```

・

・

・

おまけ
----


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    //               1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
    int y[]   = {NULL, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18};
    //int x[] = {NULL,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7};

    //xの平均は、8 (計算済み)
    //xの偏差の二乗の積は、280 (計算済み)

    int sum = 0;
    for(int i = 1;i<=15;i++){
        
        sum = sum + y[i];
        //printf("%d\n",y[i]);
        
    }
    int y_ave = sum / 15;
    
    printf("y_av = %d\n",y_ave);
  
    
    sum = 0;
    for(int i = 1;i<=15;i++){
        
        sum = sum + (   (i - 8) *  (y[i]-y_ave)  );
        printf("%d,",   (i - 8) *  (y[i]-y_ave)  );
    
    }
    printf("\n");
    printf("sum = %d\n",sum);
    printf("\n");
    printf("b = %d\n",sum / 280);
    printf("a = %d\n",y_ave -(sum / 280)*8);
  
}






```



```


y_av = 11
49,36,25,16,9,4,1,0,1,4,9,16,25,36,49,
sum = 280

b = 1
a = 3




```
英語と日本語の論理名を高速で調べる方法【ServiceNow】

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

英語と日本語の論理名はsys_documaentation.listテーブルに載っており、物理名を検索することによって英語と日本語の論理名を確認できる

しかし論理名の英語と日本語をもっと簡単に確認できる方法がある

# 英語と日本語の論理名を高速で調べる方法

- 言語変換である
- 右上の設定ボタンを押下
![スクリーンショット 2025-02-12 080323.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/d291a8cb-ff93-fa25-3eba-93a69b6897a4.png)

- 言語を日本語に変更（逆も然り）
![スクリーンショット 2025-02-12 080618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/035e4640-6fbe-377c-fce1-fac0a471c7e5.png)

- 英語の論理名が記載されていたところが、日本語の論理名に変更される
![スクリーンショット 2025-02-12 080639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/50408bad-5e2e-5b82-6dce-2486ca462c27.png)

<br>
以上
【kintone】 FormBridge × kViewerルックアップ：ユーザーごとにデータを絞り込む方法

## はじめに
こんにちは！かねごん（[@hrbk25](https://x.com/hrbk25)）です！

今回はFormBridge × kViewerに関する内容になります。

FormBridgeでkViewerルックアップを使う場合に、「ユーザーごとに異なるデータを表示したい！」というケースがありますよね。

FormBridgeとkViewerの**ユーザー管理**を活用することで、
ユーザーごとに異なるデータを参照することができたので、その内容を備忘録として記事にまとめました。

### kViewerとFormBridgeとは

https://contents.kintoneapp.com/tkalp?gad_source=1&gclid=CjwKCAiAh6y9BhBREiwApBLHC5PLNVyfMtjatfu3KWplT5bAWUCf4GsVDbXCrKUilKhGseHejSmhYBoCMWoQAvD_BwE


>Formbridge：**Webフォームからkintoneに入力**
Webフォームを作成してkintoneにデータを入力できます。お問い合わせ受付や各種登録フォームなどに最適です。

>kViewer：**Webページを作成してkintoneのデータを公開**
公開したいデータを選んでWebページを作成できます。kintoneユーザーではない組織外の人にも情報共有できます。

:::note info　
ユーザー管理は、FormBridgeとkViewerともにプレミアムコース以上で利用可能です
:::


## どんな人向けの記事か
- kViewerとFormBridgeを活用している人
- ユーザーごとに異なるデータを参照してFormBridgeを利用したい人

## 実際にやってみる

### 前提
今回は、[営業支援パック](https://kintone-sol.cybozu.co.jp/apps/eigyoshienpack.html) を使用して、kintoneのアプリを作成しました。

作成したアプリは、顧客管理アプリをkViewerに、案件管理アプリをFormBridgeにそれぞれ連携させます。

設定の詳細は以下を参考にしてください。

https://guide.kintoneapp.com/formbridge/kviewer-lookup/

https://guide.kintoneapp.com/kviewer/view-filtering/



### 絞り込み無し

**kViewerの設定**：

- レコードの絞り込みを行わない

**結果**：
- FormBridgeのkViewerルックアップでは、全てのレコードが出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/27493d3e-591a-1390-ffe5-245a52afbd57.png)

### 絞り込み有り（固定の条件）

**kViewerの設定**：
- 特定の条件でレコードの絞り込みを行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/6f47f7bc-0355-feb4-be4a-50941fead41a.png)

**結果**：
- 絞り込まれた条件だけが出力されるが、ユーザーごとに異なる参照先を出力することはできない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/e04af44a-01d8-4148-4f6a-a1e33d6b4651.png)


### 絞り込み有り（ユーザー管理による条件）

ポイントにも記載されている **属性** を使用することで、kViewerルックアップでも、
ユーザーごとに条件に一致したレコードのみを出力することができます。

**ユーザー管理**の詳細は、以下をご覧ください。

https://guide.kintoneapp.com/kviewer/what-view-mail-auth/

:::note info　
**ユーザー管理**
FormBridgeとkViewerの両方でユーザー管理を設定する必要がある。

kViewerのToyokumo kintoneApp認証の設定では、属性を追加し、属性を使って公開ビューで表示する情報を出し分けることができる。

:::

**kViewerの設定**：
- ユーザー管理でメールアドレスと **属性**（例：「顧客名」）を設定し、その属性を利用して絞り込みを行う。
(「メールアドレス」："shimoyama_tatsuhito＠example.com"「顧客名」："金都運総研")


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/78ffbe56-7dc7-5e06-1abe-0c014e69b0f0.png)


**Formbridgeの設定**：
- ユーザー管理でメールアドレスを設定する。
（「メールアドレス」："shimoyama_tatsuhito＠example.com"）


**結果**：
- ユーザー管理の設定により、特定の「顧客名」（例では”金都運総研”）のレコードだけがkViewerルックアップに出力される。ユーザーごとに異なる参照先を出力することが可能になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/7c2d0e01-2543-d94d-8dff-0399ba359c0c.png)

## 実際の活用例
今回は営業支援パックを使用しましたが、応用することで、以下のような活用も可能だと考えています。

- 特定の情報のみを参照させたい場合
　例) 協力会社マスタの情報を、ユーザーごとに自社のデータのみ表示する。

- 候補数が多すぎて、絞り込みを適用したい場合
　例) 部署ごとに在庫を管理する場合、部署コードを属性に設定し、ユーザーごとに在庫情報を絞り込む。


## まとめ
いかがでしたでしょうか？

今回は FormBridge × kViewer の活用方法をシンプルにまとめました。

少しでも皆さんの参考になれば嬉しいです！
【忘備録】iTunesとかで読み込んだ音楽ファイルからexiftoolでアルバム名のタイトルだけ取得するコマンド

## コマンド概要
Albumという項目で余分なスペースを無視してawkで抽出
```shell
exiftool filename | awk -F ': ' '{gsub(/[ \t]+$/, "", $1); if ($1=="Album") print $2}'
```
## ポイント
- -F ': ' で : とスペースを区切り文字にする
- gsub(/[ \t]+$/, "", $1) で $1 の末尾の空白やタブを削除
- if ($1=="Album") で正しく判定


## 追加（参考）
### pythonで書いた場合
- #### exiftoolを使った場合（json処理）
```py
import subprocess
import json

def get_album(filename):
    result = subprocess.run(["exiftool", "-json", filename], capture_output=True, text=True)
    metadata = json.loads(result.stdout)
    return metadata[0].get("Album")  # Album がない場合は None になる

filename = "your_audio_file.m4a"
album_name = get_album(filename)
print("Album:", album_name)
```
- #### subprocessを使った場合
```py
import subprocess
import re

def get_album(filename):
    result = subprocess.run(["exiftool", filename], capture_output=True, text=True)
    for line in result.stdout.splitlines():
        if line.strip().startswith("Album"):
            return re.split(r'\s*:\s*', line, maxsplit=1)[1]
    return None  # Album情報がない場合

filename = "your_audio_file.m4a"
album_name = get_album(filename)
print("Album:", album_name)
```
## 感想
shellってなんだかんだで簡単に書けるよね。。。
画面のカテゴリー早見表

| カテゴリ    | 目的・用途 | 主なページ例 |
|------------|------------------|--------------------------------------------------|
| dashboard  | データ管理・可視化 | /dashboard/overview（概要・KPI）, /dashboard/users（ユーザー管理）, /dashboard/reports（売上レポート）, /dashboard/logs（システムログ） |
| settings   | 個人設定・アプリ設定 | /settings/profile（プロフィール編集）, /settings/security（パスワード変更・2FA 設定）, /settings/notifications（通知設定）, /settings/preferences（UI のカスタマイズ） |
| auth       | 認証関連         | /auth/login（ログイン）, /auth/register（新規登録）, /auth/reset-password（パスワードリセット）, /auth/verify-email（メール認証） |
| public     | 一般公開ページ     | /about（会社概要）, /pricing（料金プラン）, /help（ヘルプ・FAQ）, /contact（お問い合わせ） |
| user       | ユーザー専用データ | /user/orders（購入履歴）, /user/bookmarks（お気に入りリスト）, /user/messages（メッセージ一覧） |
| admin      | システム管理       | /admin/users（全ユーザー管理）, /admin/settings（システム設定）, /admin/roles（権限管理）, /admin/logs（アプリのエラーログ） |
| content    | コンテンツ管理     | /content/articles（ブログ記事管理）, /content/products（商品管理）, /content/categories（カテゴリ管理）, /content/uploads（画像・ファイルアップロード） |
| search     | 検索機能         | /search（全体検索）, /search/users（ユーザー検索）, /search/documents（ドキュメント検索）, /search/articles（記事検索） |
| error      | エラーページ       | /404（ページが見つかりません）, /500（サーバーエラー）, /forbidden（アクセス拒否） |
cscの作法 その558

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
chartをドッキングせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/210085bb-47d2-7a74-5f41-2827ee48a4c1.png)


# サンプルコード

```

using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using System.Drawing;
using System.Globalization;
using System.Windows.Forms.DataVisualization.Charting;

namespace Dock
{
	public partial class Win1: WeifenLuo.WinFormsUI.Docking.DockContent {
		public TextBox bo1;
		public Win1() {
			bo1 = new TextBox();
			bo1.Text = "";
			bo1.Multiline = true;
			bo1.Font = new Font("ＭＳ Ｐゴシック", 12);
			bo1.Dock = DockStyle.Fill;
			Controls.AddRange(new Control[] {
				bo1
			});
		}
	}
	public partial class Win2: WeifenLuo.WinFormsUI.Docking.DockContent {
		public Win2() {
			Chart chart1 = new Chart();
			chart1.ChartAreas.Clear();
			chart1.Series.Clear();
			chart1.Legends.Clear();
			chart1.Dock = DockStyle.Fill;
			chart1.ChartAreas.Add(new ChartArea());
			ChartArea chartArea = chart1.ChartAreas[0];
			chartArea.AxisX.IsMarginVisible = false;
			chartArea.AxisY.IsMarginVisible = false;
			chartArea.CursorX.IsUserSelectionEnabled = true;
			chartArea.CursorY.IsUserSelectionEnabled = true;
			chartArea.CursorX.Interval = 0;
			chartArea.CursorY.Interval = 0;
			chartArea.InnerPlotPosition.Auto = false;
			chartArea.InnerPlotPosition.X = 8.0f;
			chartArea.InnerPlotPosition.Y = 4.0f;
			chartArea.InnerPlotPosition.Width = 84.0f;
			chartArea.InnerPlotPosition.Height = 84.0f;
			this.Controls.Add(chart1);
			Series series = new Series {
				Color = Color.Blue,
				MarkerColor = Color.Blue,
				MarkerSize = 7,
				MarkerStyle = MarkerStyle.Circle,
				ChartType = SeriesChartType.Line
			};
			for (double i = 0; i < 720; i++)
			{
				double v = Math.Sin(i / 360 * 3.14 * 2);
				series.Points.AddXY(i, v);
			}
			chart1.Series.Add(series);
		}
	}
	public partial class Form1: Form {
		public Form1() {
			ClientSize = new Size(900, 600);
			Text = "dock";
			Test1();
		}
		private void Test1() {
			var dockPanel1 = new DockPanel();
			dockPanel1.ShowDocumentIcon = true;
			dockPanel1.Dock = DockStyle.Fill;
			dockPanel1.DocumentStyle = DocumentStyle.DockingWindow;
			Controls.Add(dockPanel1);
			var left1 = new Win1();
			left1.TabText = "left1";
			left1.Show(dockPanel1, DockState.DockLeft);
			var right1 = new Win1();
			right1.TabText = "right1";
			right1.Show(dockPanel1, DockState.DockRight);
			var bottom1 = new Win1();
			bottom1.TabText = "bottom1";
			bottom1.Show(dockPanel1, DockState.DockBottom);
			var center1 = new Win2();
			center1.TabText = "center1";
			center1.Show(dockPanel1, DockState.Document);
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```


以上。
paizaの新作ゲームでSQLの問題をやってみた【電脳少女プログラミング2088 | 壊レタ君を再構築】（二人が通った教室）

paizaの新作プログラミングゲームをやってみました。

https://paiza.jp/entry/denno2088_qiita

AtCoderみたいな感じでプログラミングの問題が出されるのかなと思ったのですが、それだけでなくSQLの問題もありました。
私は今までSQLの問題に挑戦したことはなかったので、この機会に挑戦してみることにします。

# 二人が通った教室（paizaランク：C相当）

>あなたは学校に残る会話内容の記録へアクセスし情報を得ようとしています。
memory (記憶) テーブルとperson (人物) テーブルが以下の図のようにあります。
memory (記憶) のうち id の小さい順に 10 件取得し memory.id (記憶.ID) と memory.talk (記憶.会話内容) を出力してください。

「10 件取得し」の部分以外は簡単だと思います。

```sql:MySQL
SELECT id, talk -- memory.id (記憶.ID) と memory.talk (記憶.会話内容)
FROM memory -- memory (記憶) のうち
ORDER BY id -- id の小さい順に
```

しかし、10件だけ取得する部分は考えてもわかりませんでした。
この問題に限れば```WHERE id <= 10```とすれば良さそうですが、一般的に指定した件数だけを取得したい場合はどうすべきなのかがわかりません。

仕方がないので、Googleで「MySQL n件」のような感じで調べてみると、```LIMIT```句を使えば良さそうだということがわかりました。

https://dev.mysql.com/doc/refman/8.0/ja/select.html#:~:text=LIMIT%20%E5%8F%A5

```LIMIT 10```と指定して提出することでクリアできました！

```diff_sql:MySQL
  SELECT id, talk -- memory.id (記憶.ID) と memory.talk (記憶.会話内容)
  FROM memory -- memory (記憶) のうち
  ORDER BY id -- id の小さい順に
+ LIMIT 10 -- 10 件取得
```

![paiza.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200302/b2133381-4c16-d1e5-bec8-45a3433b0311.png)

提出したコードに対して、フィードバックを返してくれるみたいです。

## MySQL以外の場合

PostgreSQLやSQLiteでも```LIMIT```句を使えば良さそうです。

- [PostgreSQL](https://www.postgresql.org/docs/current/queries-limit.html)
- [SQLite](https://www.sqlite.org/lang_select.html#the_limit_clause:~:text=in%20the%20compound.-,5.%20The%20LIMIT%20clause,-The%20LIMIT%20clause)

一方で、SQL Serverでは```LIMIT```ではなく、```TOP```を使うようです。
（そういえば、何年か前にそうやってデータを取得したような……）

- [SQL Server](https://learn.microsoft.com/ja-jp/sql/t-sql/queries/top-transact-sql?view=sql-server-ver16)

```LIMIT```は標準SQLの機能ではないため、RDBMSによって対応状況が異なるようです。[^1]

# 感想
Cランクなら簡単だろうと思っていましたが、自分の知識不足が露呈する結果となりました……。
SQLもちゃんと勉強しようと思います。

[^1]: [第19回　SELECT文のLIMITとOFFSET](https://oss-db.jp/dojo/dojo_19)
次世代AI旅行アプリの可能性｜撮影シナリオ自動生成でインスタ映え動画を時短作成する方法

とあるブログ書いている。
これまでｇｅｍｉｎｉを使っていたが、ｄｅｅｐｓｅｅｋに乗り換えようかと思わざる得ない。

ちなみに、下記記事を書かせたのでQIITAに投稿する
https://ameblo.jp/motochan1969/entry-12886090900.html



### 記事本文  

#### はじめに｜「旅行計画＋動画制作」の一体化がクリエイターの新常識  
「AIが旅行プランを作るのは当たり前。でも、撮影シナリオまで自動生成してくれるアプリがあれば…」  
私も城崎温泉旅行で、この課題を痛感しました。せっかくの絶景も、撮影ポイントや構図の選定に時間を取られ、肝心の家族との時間が削られる矛盾。既存のAI旅行アプリは「移動効率化」に特化していますが、**「コンテンツクリエイション支援」**が圧倒的に不足しています。  

本記事では、以下の視点で深掘りします：  
1. **2025年最新AIツールの限界と可能性**  
2. **撮影シナリオ生成の技術的実現性**  
3. **プロYouTuber流・時短編集術**  
4. **近未来アプリ開発の展望**  

過去記事：[城崎温泉で実践した動画編集術](https://ameblo.jp/motochan1969/entry-12886090310.html)  

---

#### 第1章｜現状分析：AI旅行アプリの「できる」と「できない」  
##### ＜主要ツール比較＞「計画」と「創作」の分断  
| サービス名 | 強み | 撮影支援機能 |  
|-----------|------|-------------|  
| AVA Travel | 自然言語入力で10秒プラン生成 | △（写真スポット表示のみ） |  
| YesChat AI | リアルタイム天候対応 | ×  |  
| Plaru | Instagram連携でスポット選定 | ◯（位置関係可視化） |  
| Wanderboat | 動画付き提案 | △（テンプレート限定） |  

特に**Plaru**の「経路最適化アルゴリズム」は、城崎温泉の7外湯巡りで移動時間を23%短縮できた実績あり。しかし「どの角度で撮影すればバズるか」までは提案不可。  

##### ＜クリエイターの本音＞「3大悩み」  
1. **構図選定**：御所の湯の滝つぼ撮影で、光の角度を計算する時間がない  
2. **編集負担**：1TBの素材選別に8時間費やし断念（私の失敗談）  
3. **モチベ維持**：非公開動画は「見返り」がないため作業が後回しに  

---

#### 第2章｜技術的可能性：AIが「監督」になる日  
##### ＜核心技術＞「3D空間認識AI」の応用  
Googleの「SceneXplain」技術を応用した未来像：  
- **ARシナリオプレビュー**：スマホをかざすと過去のバズった構図が表示  
- **光線シミュレーション**：城崎温泉の夕景撮影に最適な時間帯を予測  
- **被写体追跡**：子供の動線を予測し、自然な笑顔を自動キャッチ  

##### ＜開発実例＞「CapCut」の革命  
実際に但馬屋で実験したワークフロー：  
1. 竹林映像をAIに解析 → 和風テンプレート自動適用  
2. BGMを映像のテンポに合わせて生成（Splice AI連携）  
3. 文字起こし機能で子供のセリフをPOPテロップ化  
結果：編集時間が3時間→20分に短縮  

---

#### 第3章｜実践テク：今日から使える「AI連携術」  
##### ＜三段階カスタマイズ法＞  
**Step1：骨格抽出**  
- プラン作成：Plaruで城崎温泉の基本ルート策定  
- 撮影ポイント選定：Googleマップ「フォトスポット」レイヤー活用  

**Step2：AI強化**  
- 構図提案：Runway MLで笑顔シーン自動抽出  
- BGM選曲：Splice AIが映像テンポに合った曲を推薦  

**Step3：人間らしさ注入**  
私の独自手法「感情マッピング」：  
1. 各スポットで感じたい感情を選択（例：御所の湯＝「神秘」）  
2. カラーパレット作成（神秘＝深緑×金色）  
3. フィルターで色調統一  

##### ＜機材選びの極意＞  
おすすめ商品：  
- [DJI Pocket 3](https://amzn.to/3ViABC1)：手ブレ補正＆構図ガイド機能  
- [SanDisk 2TB Extreme PRO](https://amzn.to/3ViGHI4)：4K動画の大量保存に必須  

---

#### 第4章｜近未来予測：2026年の旅行アプリ像  
##### ＜衝撃機能＞「AI監督モード」  
開発中の概念：  
1. 旅行プラン作成時に「動画のテーマ」を選択（例：家族団らん／アート系）  
2. AIがシナリオを自動生成：「10秒オープニング→メイン90秒→エンディング」の構成提案  
3. スマホが振動で撮影タイミングを通知  

##### ＜倫理的課題＞「画一化 vs 個性」  
懸念点：  
- 誰もが同じ構図を追求し「旅行の均質化」が進む  
- 実際の体験よりSNS映えを優先する行動の一般化  
対策として**Trip Planner AI**は「倫理ガイドライン」機能を開発中  

---

#### まとめ｜「テクノロジーは筆、感動は自分で描く」  
城崎温泉で気づいた真実：  
「AIが千の構図を提案しても、子供が自然に笑う瞬間には勝てない」  

ツールを活用しつつ、**「撮影より体験を優先する」**バランスを忘れないでください。次回の旅行では、Plaruで計画を立てつつ、家族との会話を最優先にしてみてはいかがでしょうか？  

---

### 画像生成プロンプト（追加）  
**城崎温泉の木屋町通り、AIホログラムが映るスマホ画面を持ち笑い合う家族、夕暮れ時の温かい光 (miniture)**  

### アフェリエイトリンク  
- [DJI OM 6 手持ちスタビライザー](https://amzn.to/45xYzTV)  
- [Canon PowerShot V10 旅行用コンデジ](https://amzn.to/3LJjwQJ)  

---

※記事内の技術情報は[Google AI Blog](https://ai.googleblog.com/)を参考にしています。温泉画像は[城崎温泉観光協会](https://kinosaki-spa.gr.jp/)の公式素材を使用。人物写真はAI生成のため肖像権問題なし。
CUIで関数電卓を作ってみよう

### 概要
　以前Pythonで作成し、他の方からのアドバイスのお陰でCLIの関数電卓的なものが一応完成しました。
以下のものがソースコードとなっております。

### ソースコードの内容
```cli_calc.py
import math

def title():
    print("------------")
    print("|Calcurator|")
    print("------------")

def begin():
    global first_num
    global second_num
    global calc
    print("-----------------------------------------------------------------------------------")
    print("|記号(足し算:+,引き算:-,掛け算:*,割り算:/,剰余無し割り算://,剰余:%,累乗:**)　　　 |")
    print("|記号(円:pi,対数:log2,平方根:sqrtと入力,sin:sinと入力,cos:cosと入力,tan:tanと入力)|")
    print("-----------------------------------------------------------------------------------")
    first_num=int(input('1つ目:数値入力>>'))
    calc=input('記号>>')
    if calc=='pi' or calc=='log2' or calc=='sqrt' or calc=='sin' or calc=='cos' or calc=='tan':
        second_num=None
    else:
        second_num=int(input('2つ目:数値入力>>'))

def sum():
    print(first_num+second_num)

def minus():
    print(first_num-second_num)

def inc():
    print(first_num*second_num)

def div():
    print(first_num/second_num)

def div2():
    print(first_num//second_num)

def joe():
    print(first_num**second_num)

def extra():
    print(first_num%second_num)

def circle():
    print(round(math.pi**first_num,2))

def bottom():
    print((math.log2(first_num)))

def sqrt():
    print((math.sqrt(first_num)))

def sin():
    print(round(math.sin(math.radians(first_num))))

def cos():
    print(round(math.cos(math.radians(first_num))))

def tan():
    print(math.tan(math.radians(first_num)))

title()
while True:
    begin()
    if calc=='+':
        sum()
    elif calc=='-':
        minus()
    elif calc=='*':
        inc()
    elif calc=='/':
        div()
    elif calc=='//':
        div2()
    elif calc=='**':
        joe()
    elif calc=='%':
        extra()
    elif calc=='pi':
        circle()
    elif calc=='log2':
        bottom()
    elif calc=='sqrt':
        sqrt()
    elif calc=='sin':
        sin()
    elif calc=='cos':
        cos()
    elif calc=='tan':
        tan()
```

### 実行結果
![スクリーンショット 2025-02-12 060439.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747052/ceedeeba-adf6-d125-87d9-972aff4295c7.png)


### まとめ
　ハッキリ言ってまだ詰めの甘いプログラムなんじゃないかと思いますが、なんとか形にしてみました。
グローバル関数の所や演算を行っている箇所なんかは、改善の余地ありと言ったところでしょうか。
今後は、よりグラフィカルなものにアップデートできるといいなと思っています。
JavaScriptで「JavaScriptのコードを別のファイルに記述する」の動作を確認してみた。

# 概要

JavaScriptで「JavaScriptのコードを別のファイルに記述する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/before/index4.html

# 実装

以下のファイルを作成しました。

```sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>JavaScript サンプル</title>
</head>
<body>

<p>
この下に JavaScript を使って文字列を出力します。
</p>

<script src="./sample.js">
</script>

</body>
</html>
```

```sample.js
document.write("<p>JavaScriptファイルの読み込みテスト</p>");
```

実行結果は以下の通りでした。

![Screenshot from 2025-02-12 05-51-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/b1e03ab5-2bec-3eb9-65d2-a98abdc5c6f2.png)

# まとめ

何かの役に立てばと。
Mac Pro (2013)+Debian12+Samba(iOS対応)

# はじめに
MacPro(2013)にインストールしたDebian12でSambaServerを動かしてみたところはまりポイントがいくつかあったので備忘録として残しておく。

# Debinのインストール
1. Optionキーを押してブートメニューを表示しインストールUSBを選択
2. Wi-Fiは認識しないので有線でインストールを進める

# Wi-Fiを認識させる
```sh
lspci | grep -i net
```
を実行すると

> Network controller: Broadcom Inc. and subsidiaries BCM4360 802.11ac Wireless Network Adapter (rev 03)

と表示されたので `BCM4360 linux` で検索して出てきたこの動画を参考にした。
https://www.youtube.com/watch?v=JW0f3NOjWys

無線関連のパッケージをインストール
```sh
sudo apt install \
wireless-tools \
network-manager-gnome \
wpasupplicant
```

/etc/apt/sources.listを編集して　`main contrib non-free` も対象にする
```sh
sudo nano /etc/apt/sources.list
```
```sh
sudo update && apt dist-upgrade && reboot
```

プロプライエタリなドライバを使用する
```sh
sudo apt install broadcom-sta-dkms
```
```sh
sudo modprobe -r b44 b43 b43legacy ssb brcmsmac bcma
```
```sh
sudo modprobe wl
```
```sh
sudo reboot
```
https://wiki.archlinux.jp/index.php/Broadcom_%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9

# 自動サスペンドを抑制する
下記のようにgsettingsを変更するも自分の環境では効果なし
```sh
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type nothing
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 0
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type nothing
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
```
https://rokuen.work/bv/859/2020/01/

下記の設定変更で効果ありでした
```:/etc/systemd/logind.conf
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
IdleAction=ignore
```
```:/etc/gdm3/greeter.dconf-defaults
[org/gnome/settings-daemon/plugins/power]
sleep-inactive-ac-timeout=0
sleep-inactive-ac-type='nothing'
sleep-inactive-battery-timeout=0
sleep-inactive-battery-type='nothing'
```
https://tamapoco.com/archives/9602

# Sambaを入れるもiOSから書き込めない
iOSから書き込みができなかったが下記を追加すると書き込めた
```:smb.conf
[global]
    mangled names = no
    vfs objects = catia fruit streams_xattr
    fruit:metadata = stream
    fruit:model = MacSamba
    fruit:posix_rename = yes
    fruit:veto_appledouble = no
    fruit:nfs_aces = no
    fruit:aapl = yes
    fruit:wipe_intentionally_left_blank_rfork = yes
    fruit:delete_empty_adfiles = yes
    server min protocol = SMB2
    client min protocol = SMB3
```
https://note.com/662611034/n/n9e9e0308db95
「次世代リーダー交流イベント」でLT登壇しました!!

# 🟢 はじめに
先日、若手AWSエンジニアが集まった「**次世代リーダー交流イベント**」にてLT登壇しました！
本イベントでの登壇内容や学びを記載します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/7274221f-6cee-41fa-804b-ed985e958538.jpeg" width="500">

# 🧑‍🏫なぜ登壇しようと思ったか？
ひとことで言えば、成長の機会だ‼︎と思ったためです。
最近は会議等も含めてリモートで話すことが多く、人前で発表する機会が減っている状況下、有識者の前で発表＆フィードバックを得られる良い機会だと思いました。

# 🎙️当日の様子
会場には**100人**ほどが参加しており、計6人が次々とLTしました。
テーマは、トラブルシューティング、構築方法、サステナビリティ...など様々でした！
LT後の質疑応答はありませんでしたが、イベント後の懇親会にて発表についての質問やフィードバックをいただきました。

LTイベント後には参加者と交流させていただきました。
本イベントの参加者は社会人4年目までが主だったため、同世代の他社エンジニアと1時間ほどお話しできました。

# 📚登壇内容
登壇内容は以前Qiitaにも投稿した「AWSコンソールへのログイン通知実装」についてです。
持ち時間が多くなかったため、具体的な実装方法はあまり触れずに採用案とボツ案を通して学んだことをメインにお話ししました。

よかったら以下記事も読んでいただけると嬉しいです。

https://qiita.com/rolfern/items/779d300e0bee50ff8d6f


# 💎得たもの/感想
密度濃くたくさんの学びを得ました。
* LT時間が短く(5分)発表をコンパクトに収めるのが大変でした。
　⇨伝えたいポイントを絞ること、発表練習をすることなど基本の大切さを再認識しました。
 　#皆さん見事に5分ぴったりの発表でした👏
* 他の方の発表を間近で聞くことができた。
　⇨発表内容はもちろん、資料構成や話し方などもとても参考になりました。
* フィードバックやリアクションは素直に嬉しい。
　⇨発表後に興味を持っていただいた方から質問いただいたり、発表が上手などの声もいただき更なるモチベーションにつながりました。
 　#Xでも投稿いただいた方ありがとうございました。
* 懇親会で色々な方と交流できた。
　⇨自社であまり扱っていない領域の業務や、日頃のAWS学習内容など色々と情報交換ができました！

# 🏃‍♂️次のアクション
* オンライン/オフライン問わずLTイベントにはどしどし参加する。
* 会社の若手も誘ってイベント参加する。
* LT登壇のメリットを社内発信。
* 様々な領域、サービスに挑戦して情報発信の幅と質を向上する。

# 🟢おわりに
本イベントを運営いただいたAWS Jr.Championsの方々、AWSの方がありがとうございました。
とても有意義な時間を過ごすことができました。

今後も機会をつくってコミュニティへの参加を続けたいと思います。
ip ruleコマンドメモ

ip ruleコマンドで、ポリシーベースルーティングの設定ができる。
見るには、下記のように打つ
ip rule show
sudo ip rule show

出力例
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
10000:  to 100.64.0.0/10 lookup 100

読み方
この例では、10000: という番号がついたルールが 100.64.0.0/10 に適用され、lookup 100（ルーティングテーブル 100 を参照）となっている。

ポリシールーティングとは
ポリシールーティング（Policy-Based Routing, PBR）は、通常のルーティングテーブル（main）とは異なるルールを適用し、パケットの送信先や経路を柔軟に制御する仕組み。

通常のルーティング（デスティネーションベースのルーティング）は「宛先 IP アドレス」に基づいてルートを決定するが、ポリシールーティングでは送信元 IP や特定のプロトコル、インターフェース、ポートなどに基づいて異なるルートを適用可能。

用途例
1. マルチホーム環境（複数のインターネット接続）
例: あるサブネット (192.168.1.0/24) のトラフィックは ISP1 を使い、別のサブネット (192.168.2.0/24) は ISP2 を使う
* ip rule add from 192.168.1.0/24 table 100
* ip route add default via ISP1_GW dev eth0 table 100

2. VPN や特定ネットワークへのトラフィック制御
特定の宛先（例: 100.64.0.0/10）への通信は VPN（Tailscale, WireGuard, OpenVPN）を経由させる
* ip rule add to 100.64.0.0/10 table 200
* ip route add 100.64.0.0/10 dev vpn0 table 200

VPN 経由で特定のネットワークにアクセスさせることで、セキュリティやプライバシーを確保

3. 送信元 IP ベースのルーティング
複数の IP アドレスを持つサーバーで、送信元 IP に応じて異なるルートを設定
例: 192.168.1.100 からのパケットは eth0 を、192.168.2.100 からのパケットは eth1 を使う
* ip rule add from 192.168.1.100 table 101
* ip rule add from 192.168.2.100 table 102
* ip route add default via 192.168.1.1 dev eth0 table 101
* ip route add default via 192.168.2.1 dev eth1 table 102

4. ロードバランシング
複数のネットワークインターフェース（NIC）を持つサーバーで負荷分散
例: eth0 と eth1 を使い、一定の条件でパケットを分散させる
* ip rule add fwmark 1 table 103
* ip route add default via 192.168.1.1 dev eth0 table 103
* iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 1
* iptables -t mangle -A PREROUTING -j MARK --set-mark 2

これにより、パケットの 50% を eth0、残りを eth1 に分ける
MM-ToF10のライブラリを作ってみた

# 初めに

サンハヤトさんのToFセンサーは以前も使っていたのですが、新しいものが販売されるようになりました。
こちらは、少しお高くなっていますが、広角のバージョンなどもあり、無効ピクセルの情報が入手できるようになったりして、
バージョンアップしているようです。

MM-ToF10 : https://shop.sunhayato.co.jp/products/mm-tof10-is

MM-S50MV : https://shop.sunhayato.co.jp/products/mm-s50mv

<img width="300" alt="mojikyo45_640-2.gif" src="https://camo.githubusercontent.com/c7898002517e0130e1506add6172b3d9c3f85bbba29ee4a987d44cb06a2ece96/68747470733a2f2f73686f702e73756e68617961746f2e636f2e6a702f63646e2f73686f702f66696c65732f696d6167652d6d6d2d746f6631302d69732d30315f38666265336166652d623333312d343033652d623464332d3435393735316463303230355f363036783630362e6a70673f763d31373239343733343337">

ただ、今回もサンプルのスケッチが1つあるだけで、ちょっと使いにくいので、
簡単にライブラリ化してみました。

# ブログ（元ネタ）

この記事は、以下のブログにあるものです。

https://spresense.livedoor.blog/archives/37699035.html

#  製品情報

センサーは、以下の2種類ありますが、制御は同じです。
製品の詳細は、各商品サイトでご確認ください。

[ToFセンサーボード（SPRESENSE用）（MM-TOF10-IS）](https://shop.sunhayato.co.jp/products/mm-tof10-is)
ToFセンサーボード「MM-TOF10-IS」はレーザーと複数の受光素子により0.01～3mまでの高精度3D距離測定と高速サンプリングが可能です。
こちらは広角タイプです。

[ToFセンサーボード（SPRESENSE用）（MM-TOF10-GS）](https://shop.sunhayato.co.jp/products/mm-tof10-gs)
ToFセンサーボード「MM-TOF10-GS」はレーザーと複数の受光素子により0.01～10mまでの高精度3D距離測定と高速サンプリングが可能です。
こちらは標準タイプです。

どちらも前のバージョン同様高速サンプリングできるようです。

# MM-S50Vとの違い
以前のバージョンのプロトコルとかなり近いので、ライブラリの修正で使えるのですが、いくつか変更点があるので、このあたりの注意が必要です。
特にLED制御は、以前と異なりRGB各色の設定を別々なコマンドで行う必要がありそうでした。

また、今回は、ピクセル単位で、異常かどうかの状態も返してくれるので、前回みたいに値がおかしくて悩む場合、
正しく距離が取れていないことがわかります。
※今回は、こちらの対応はできてませんが…。（苦笑）

ということで、前回のライブラリをさらに整理した形で、ライブラリ化をしました。

# GitHub

ソースコードはこちらになります。
まずは、取り急ぎ作ってみた感じなので、ピクセル状態なども見れていません。
距離は、定規で測ってそれっぽいのを確認したので、正しいかとおもいま～す。

https://github.com/Interested-In-Spresense/SpresenseIMU

コードをもうちょっと整理して、無効ピクセル情報の対応などをしたら、
Arduinoのライブラリ登録しようかな…。
Buildした.bundleの保管場所【 Swift 】

# はじめに
Xcodeにてbundle作成しようとしたときに、bundleの保管場所を探すのに手こずったので、備忘録として残しておく
Xcodeを開いたうえで，上のメニューバーから`Product > Show Build Folder in Finder`を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/9a42931c-42c3-70f9-bea6-26dff62bfa3d.png)

↓

`Finder`でbuildのディレクトリを開いてくれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/24b057c0-2b92-30fe-6fc4-62373cb31222.png)
`Products`を開くと中に.bundleが入っているはずです
【Liquid】 フィルターとは

<!--
・https://www.shopify.com/jp/blog/partner-shopify-template-language-liquid-overview#4
・https://shopify.dev/docs/api/liquid/filters
-->

# フィルターとは
https://shopify.dev/docs/api/liquid/filters

フィルターは、出力するStringの出力や変数を制御・変更するために仕様される。
フィルターを出力に適用するには、フィルタとフィルターを出力の中括弧の区切り文字 {{ }} の中に追加し、その前にパイプ文字 | を付ける。

### 使い方
以下の例だと、product がオブジェクト、title がプロパティ、upcase が適用されるフィルター。
```:Code
{% # product.title -> Health potion %}

{{ product.title | upcase }}
```
```:Data
{
  "product": {
    "title": "Health potion"
  }
}
```
```:Output
HEALTH POTION
```

### フィルターとパラメーター
多くのフィルターはパラメーターを受け付け、フィルターの適用方法を指定することができる。
フィルタの中には、パラメータが有効であることを要求するものもある。
```:Code
{% # product.title -> Health potion %}

{{ product.title | remove: 'Health' }}
```
```:Data
{
  "product": {
    "title": "Health potion"
  }
}
```
```:Output
potion
```

### 複数のフィルターを使う
1つの出力に複数のフィルターを使用でき、左から右に適用される。


```:Code
{% # product.title -> Health potion %}

{{ product.title | upcase | remove: 'HEALTH' }}
```
```:Data
{
  "product": {
    "title": "Health potion"
  }
}
```
```:Output
POTION
```

今回はここまで。
Arrayフィルターなどはまた改めてまとめます。
【VSCode】MarkdownをHTMLに変換するツール

## はじめに

MarkdownをHTMLに変換する方法は数多くありますが、少し手順が複雑です。

そこで、ワンタッチでHTMLに変換しクリップボードへ貼り付ける拡張機能「**Markdown Clip**」を作りました。



## Markdown Clip
Markdown Clip はVScodeの拡張機能です｡
検索窓で「Markdown Clip」と打てば見つかります｡

![markdown-clip_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/39a96d54-5918-f5f1-fe48-fcab934cb105.png)


### 使用例
アイコンをクリックすると、ファイル全体のMarkdownテキストをHTMLに変換しクリップボードに自動コピーします。

![markdown-clip_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/63b92c3f-1fe2-1208-526c-bbea4399ebdf.gif)



### 使い方
| コマンド                                                   | キーボード                                        | アイコン                                      | 
| ---------------------------------------------------------- | ------------------------------------------------- | --------------------------------------------- | 
| HTML に変換してクリップボードに貼り付ける | <kbd>CTRL</kbd> + <kbd>Shift</kbd> + <kbd>c</kbd> | <p align="center"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/3fddce44-25c4-eefe-e425-2cce5ef4284b.png" width="50%"/></p> | 





### 解説
「Markdown Clip」は、MarkdownをHTMLに変換し、クリップボードに貼り付ける Visudal Studio Code 拡張機能です。




1. Markdownファイルを開く
2. 変換したい範囲を選択（任意）
3. 任意の方法でコマンドを実行
4. クリップボードにHTMLがコピーされます


```markdown
// Markdown の文章
**文字** 
```
```html
// HTML に変換されてクリップボードに貼り付けられる
<strong>文字</strong>
```

### 特徴: WordPressで便利！
他の拡張機能を通じてインストールした**Markdownプラグイン**も記法通りに変換することができます。

例えば、「 [Markdown MojiColor](https://qiita.com/yusu79/items/2c81ee7a9716a41de685) 」をインストールすると、`%文字%{オレンジ}`のような書き方で、プレビュー画面に色付き文字が反映されます。

![markdown-clip_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/f5bd798e-20ce-dcef-7666-a8a56af0b989.png)


これを Markdown Clip で変換すると、きちんと`<span style="color: #ee7800;">文字</span>`のように、`<span>`で囲まれてレンダリングされます。

![markdown-clip_05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395294/a6186000-5a43-4bc8-3616-793d1c833668.gif)


この独自記法は、[markdown-it-mojicolor](https://github.com/yusu79/markdown-it-mojicolor) というnpmパッケージをインストールすることで使えるようになります。

VScodeは拡張機能を通じてインストール出来ますが、WordPress はnpmパッケージをインストール出来ません。

しかし、VScode で作成した文章を Markdown Clip を通じてHTMLに変換することで、**間接的に Wordpress 等にもプラグインを反映**させることができます。




## GitHub
- [yusu79/vscode-markdown-clip](https://github.com/yusu79/vscode-markdown-clip)
Astroを使ったGitHub Pagesがビルドできなくなった時の対処法

<!-- Astroを使ったGitHub Pagesがビルドできなくなった時の対処法-->

## はじめに

[公式で公開されている方法](https://docs.astro.build/ja/guides/deploy/github/)を使ってAstroで作成したブログを[GitHub Pages](https://gitudon.github.io/)で公開していたのですが、ファイルを更新してもビルドが通らない、という現象に遭遇しました。

これはよくないということで対処してみたのですが、結構格闘する羽目になったので、その時の対処法を記録しておきます。

## 対処法

結論から言うと、GitHub Actionの設定ファイル、(```.github/workflows/deploy.yaml```のようなもの)を以下のように変更することで解決することができました。

```yaml
name: Deploy to GitHub Pages

on:
  push:
    branches: [ master ]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Install, build, and upload your site
        # v1→v2
        uses: withastro/action@v2
  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        # v1→v4
        uses: actions/deploy-pages@v4
```

これでGitHub Pagesへデプロイできるようになりました。

上記の通り変更は二か所だったのですが、どこを直せばいいのかが調べても中々分からず、GitHub Actionのエラーログとにらめっこしてなんとか原因をつかみました。

```withastro/action@v1```はどうやら```actions/upload-artifact@v2```を使っているようです。しかし、最近```actions/upload-artifact@v2```が廃止され、```actions/upload-artifact@v3```を用いないといけなくなったそうです。

```
Error: This request has been automatically failed because it uses a deprecated version of `actions/upload-artifact: v3`. Learn more: https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/
```

なので、```withastro/action@v2```に変更してこれに対応する必要があったわけです。

最初は```actions/upload-artifact@v3```を明示的に書いてどうにかしようとしたのですが、結局```withastro/action@v1```が存在していると```actions/upload-artifact@v2```を呼び出そうとするようで永遠にエラーが解消されませんでした。

## おわりに

Astroは静的なサイトジェネレータとして人気なので、GitHub Pagesで公開する人も多いと思います。しかし、最近の仕様変更で今回のようなエラーが発生する可能性が出て来たようです。

上記のようにGitHub Actionの設定ファイルを変更することで解決できるので、同じようなエラーに遭遇した方は参考にしてみてください。

それではまた。
特定のGemをupdateする方法

# 概要
RubyonRails・Dockerを使用したプロダクトにおいて`rubocop`というGemを`bundle update rubocop`しようとしたら、versionが上がらず、`parallel`や`parser`というものしか上がらず、versionを上げたい`rubocop`が上がらなかった。
今回は最新である1.71.2にあげます。(この記事執筆日において最新)


# 解決方法（２パターン）
docker環境なので
```
docker compose up 
```
```
docker compose exec コンテナ名 bash
```
これでコンテナの中に入り、以下のパターンを試してください。

## 1パターン目
一度消してから再度入れ直す。
```
bundle remove rubocop
```
```
bundle add rubocop --version 1.71.2
```
## 2パターン目
正直こちらは何も変わりませんでした。他の記事だと上がるらしいですが、このプロダクトでは何んの変化もありませんでした。なので私的にはパターン１を推奨します。これでできたという人は教えていただけると幸いです。
```
bundle update --conservative rubocop
```

# 追記
```
gem "rubocop-airbnb", "~> 5.0"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553821/bfe3c9dc-4f21-ccc1-1187-f0efd61dd649.png)

というものが入っており、エラーが出ました。その場合、後ろの`, "~> 5.0"`を消してあげましょう。その後、再度、`add`や`update`をしてあげる。
TerraformでWAFをimportしたらルールが消えた！？

先日、手動で作成したAWS WAFをTerraformの管理下に置こうと思い、`import` してみました。すると…

🤔 **なぜかルールを追加するような差分が出る！？**

## 🧐 ステートを確認すると `rule` が空！？

「単に差分が出ているだけかな？」と思い、Terraformのステートを確認したところ、なんと…

💥 **`rule` の情報が空！**

```hcl
resource "aws_wafv2_web_acl" "this" {
    arn           = "arn:aws:wafv2:us-east-1:????????????:global/webacl/test/aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb"
    capacity      = 2000
    description   = "WAF for test"
    id            = "aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb"
    lock_token    = "xxxxxxxxxxxxxxxxxxxxx"
    name          = "test"
    scope         = "CLOUDFRONT"
    tags          = {}
    token_domains = []
    
    default_action {
        block {}
    }
    
    visibility_config {
        cloudwatch_metrics_enabled = true
        metric_name                = "dev-test-waf-ap-northeast-1"
        sampled_requests_enabled   = true
    }
}
```

「え、そういう仕様なの？🤨 さすがにそんなはずはないよな～」
「capacityはコンソールで確認した値と一緒だな～ :thinking: 」

## 🔍 `import` ログを確認すると `rule` は認識している！？

`import` のログを見てみると… **`rule` 自体は認識してるっぽい！**

なのに、なぜか `rule` が Terraform の管理下に入らない…🤔

## 🛠 TerraformのProviderバージョンを最新にしてみる

「もしかしてバグ？」と思い、一旦 **Terraform AWS Provider のバージョンを最新に更新** してみました。

- **現在のバージョン**: `5.85`
- **更新後のバージョン**: `5.86.1`

## ✅ `plan` を再実行 → 差分が消えた！

Provider のバージョンを更新後、再度 `terraform plan` を実行したところ…

🎉 **謎の差分が消えて `rule` も正しく管理されるようになった！**

## ✨ 結論

💡 **Terraform AWS Provider のバグでした！**

分かってしまえば簡単ですが、実際にこの状況に遭遇するとかなり戸惑いますね…😅

## 📌 対策まとめ

✅ **Terraformのimportログを確認する**
   - ステートではなく、ログの中身もチェック！
✅ **Terraform Provider のバージョンを確認・更新する**
   - 古いバージョンを使っている場合は、バグの可能性を疑ってみる。
✅ **ドキュメントやIssueを調査する**
   - 似たような事例がないか、公式ドキュメントやGitHubのIssueをチェック！

同じような問題に直面した方の参考になれば嬉しいです！😆
【LeetCode】167. Two Sum II - Input Array Is Sorted 解いてみた【Medium】

<!--quiita leet code テンプレ-->

<!--

## 技術記事のタイトル

【LeetCode】167. Two Sum II - Input Array Is Sorted 解いてみた【Medium】

### 【 】(墨付き括弧)

タグ

LeetCode 競技プログラミング Python 

-->

## 問題の概要
昇順にソートされた番号のリストから足したらターゲットになる2つの数字のインデックスを返す

Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].


## 最初に考えた解き方
・まあまずインデックス0固定で2つ目の数字を足してターゲットより高くなるまで＝＝をチェック
＞いけるだろう。だが単調である
＞O(（n-1)!)だよねたぶん
問題文にこう書いてあった
The tests are generated such that there is exactly one solution. You may not use the same element twice.

Your solution must use only constant extra space.
同じ要素使いまくってるな！考え直そう
・一回しか使えないので
＞各要素チェックする際に
＞target - num 
＞if それ in nums:
＞for i in range(いまのインデックス+1, len(nums)-1):
＞if それ == nums[i]
＞return いまのインデックス, i
いけそう


```
for i, num in enumerate(numbers):
    remainder = target - num
    if remainder in numbers:
        for j in range(i + 1, len(numbers)):
            if numbers[j] == remainder:
                return (i+1, j+1)
```

Time Limit Exceeded
two pointerという題材はどこへ？
考え直そう
思いつかない

## 何がよくなかったか？

ブルートフォースを考えた時に数字を実際に書いて見てみれば解決策を思いついたのかもしれない


## 解き方

### 2ポインター数が大きいなら右を左へ。逆も

```
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        l, r = 0, len(numbers) - 1

        while l < r:
            curSum = numbers[l] + numbers[r]

            if curSum > target:
                r -= 1
            elif curSum < target:
                l += 1
            else:
                return [l + 1, r + 1]
        return []
```



#### 簡単じゃないか

例をを実際に書いてみること
流れを書いてみること
それをしよう

## 参考資料

https://neetcode.io/solutions/two-sum-ii-input-array-is-sorted

## おわりに

コードは考えをアウトプットしているにすぎない。
考えがなしにコードは生まれない
ホワイトボード欲しい
Amazon Route 53 学習メモ

# Amazon Route 53 とは
可用性が高くスケーラブルなDNSウェブサービス。

:::note info
**DNS (Domain Name System)**
人間が読み取れるドメイン名を機械が読み取れるIPアドレスに変換する仕組み
:::

- VPC作成時にVPC内にデフォルトDNSサーバ(DNSリゾルバ)が作成される。
    - DNSサーバのIPアドレスは、VPCのベースアドレス+2となる。
例) VPCのCIDRが10.0.0.0/16の場合、10.0.0.2となる。

![スクリーンショット 2025-02-11 23.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875356/d3d2cb8e-d394-ca97-6329-2a9cf2d81848.png)

- VPCのDHCPオプションによって、VPCにどのDNSサーバを使用するか指定できる。
    - デフォルトではAWSが提供する「AmazonProvidedDNS」がネームサーバとして指定される。
    - EC2インスタンスを起動すると、DHCPオプションのパラメータがインスタンスに適用される。

![スクリーンショット 2025-02-11 23.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875356/57d1fb8f-641c-7c4f-36ed-eb9c8d6f0e33.png)

- VPCのDNS属性
    - VPCのプライベートDNSの管理にAmazon Route 53のプライベートホストゾーンを使用する場合、以下両方の属性を有効にしておく必要がある。

|項目|内容|初期値|
|-|-|-|
|DNS解決を有効化|ドメイン名をIPアドレスに変換する機能を有効にする。|有効|
|DNSホスト名を有効化|EC2がパブリックDNSを受け取る機能を有効にする。|無効|

![スクリーンショット 2025-02-11 23.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875356/8c7305ac-b8e0-6652-e9eb-74048066110b.png)


# 参考
- [Amazon Route 53](https://aws.amazon.com/jp/route53/)
- [AWS Black Belt Online Seminar - Amazon Route 53 導入編](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-Route53-Intro_0530_v1.pdf)
- [AWS Black Belt Online Seminar - Amazon Route 53 Resolver](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-Route53-Resolver_0530_v1.pdf)
- [AWS Black Belt Online Seminar - Amazon Route 53 Hosted zone編](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AmazonRoute53-hostedZone_0531_V1.pdf)