OmniAICreator/Qiita-1.07M huggingface dataset:
Javaで「パスワードフィールドに入力されたテキストを取得する」の動作を確認してみた。

# 概要

Javaで「パスワードフィールドに入力されたテキストを取得する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jpasswordfield/index2.html

# 実装

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

```JSample2_1.java
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

class JSample2_1 extends JFrame implements ActionListener{
  JPasswordField pass;

  public static void main(String args[]){
    JSample2_1 frame = new JSample2_1("MyTitle");
    frame.setVisible(true);
  }

  JSample2_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel label = new JLabel("Enter your password");

    pass = new JPasswordField(30);

    JButton button = new JButton("Check");
    button.addActionListener(this);

    JPanel p = new JPanel();
    p.add(label);
    p.add(pass);
    p.add(button);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }

  public void actionPerformed(ActionEvent e){
    String password = new String(pass.getPassword());

    if (password.equals("abcd")){
      JLabel label = new JLabel("Success");
      JOptionPane.showMessageDialog(this, label, "Success",
        JOptionPane.INFORMATION_MESSAGE);
    }else{
      JLabel label = new JLabel("Failure");
      JOptionPane.showMessageDialog(this, label, "Failure",
        JOptionPane.ERROR_MESSAGE);
      pass.setText("");
    }
  }
}
```

以下のコマンドを実行しました。

```
$ javac JSample2_1.java 
$ java JSample2_1
```

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

![Screenshot from 2025-01-31 07-41-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/4896070e-cc72-9f3f-027a-07a872f96e60.png)

# まとめ

何かの役に立てばと。
たった100円で10万リクエスト！超低コストAPIを作ってみた

1リクエスト = 0.001円以下
APIを運用するうえで、コストは無視できない問題。特にアクセスが増えると、サーバー代や通信量が膨らみ、気づけば数千円、数万円なんてことも。
でも、工夫次第で圧倒的にコストを抑えられる。今回、たった100円で10万リクエストを処理できるAPIをテストで構築したので、そのインフラの構成やかかった費用を詳しく紹介します。

# コストを抑えるための技術選定

今回考えたインフラ構成は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869077/ee7b28a9-11be-701e-01c9-15555e71b5fe.png)

リクエストの処理は非同期で処理を行う前提となります。
リクエストはAPI Gatewayでリクエストを受け付けLambdaに連携し、DynamoDBとSQSにデータを保存するようになっています。
SQSに貯めたデータは定期的にEventBridgeから起動したLambdaで処理するようにしています。

## なぜ非同期処理を選んだのか？
リクエストを受け付けているLambdaは処理を一切行わずデータを格納することだけに集中しています。
データの登録や加工の処理の性能が不要になることで、性能を削減しています。
またAPIが即座にレスポンスを返せるようにし、リクエストごとの処理時間を短縮しました。
実際の処理を行うLambdaにデータを渡すためにSQSを間に入れています。

## なぜLambdaを使うのか？
Lambdaで作っているので、必要な時にだけリソースが使用されるので使用されていない時のランニングコストを削減しています。
またアクセス数が増えたとしても自動で並列処理されるのでパフォーマンスの確保ができることも利点です。

# 性能
個人利用を想定し、コスト削減のために書き込み・読み込みキャパシティを最小限に設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869077/0a1edf9d-acbe-d9d2-5c27-24207f159dd7.png)

# 費用
1月中に実装していろいろ試していた時の費用は0.4$でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869077/ff5bbd55-0c18-d1f0-3b4f-fc3b4484baed.png)

およそ7万リクエストを処理して0.4＄なので10万リクエストで0.57＄かかるようになります。
1/30時点でのドル円レートが154円のため、日本円換算すると約87円で実現可能です。
（※為替レートの変動により、実際の費用は異なる場合があります）

## 内訳
以下の内訳に対して税額が合計0.3＄かかりました。
### API Gateway 合計0.32＄
$4.25/million requests - first 333 million requests/month
75,206 Requests

### Simple Storage Service 合計0.04＄
$0.0047 per 1,000 PUT, COPY, POST, or LIST requests
729 Requests
$0.0037 per 10,000 GET and all other requests
1,024 Requests
$0.025 per GB - first 50 TB / month of storage used
1.72 GB-Mo

### DynamoDB 合計0.01＄
$0.228 per GB-Month of storage used for DynamoDB PITR backup
0 GB-Mo
$0.00 per GB-Month of storage for first 25 free GB-Months
0 GB-Mo
$0.1425 per million read request units (Asia Pacific (Tokyo))
75,275 ReadRequestUnits
$0.715 per million write request units (Asia Pacific (Tokyo))
6,905 WriteRequestUnits
※ストレージは25Gの無料枠の範囲内に収まった

### Simple Queue Service 合計0＄
First 1,000,000 Amazon SQS Requests per month are free
96,363 Requests
※無料枠の範囲内で処理


# まとめ
非同期処理 + サーバーレスを活用 することで、たった100円で10万リクエストを処理できるAPIを実現しました。
無料枠の活用によって、DynamoDB・SQSの費用をほぼゼロに抑えられました。
リクエストあたりのコストは0.001円以下 となり、大量リクエストを安価に処理可能であることの確認ができました。
［ServiceNow］Scheduled Jobs（sysauto）について

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

# Scheduled Jobsとは
- ServiceNowのScheduled Jobは、指定した時間や間隔で自動的に実行される処理を設定できる機能
- サーバー側で実行される

# 特徴
- 定期的な実行が可能（毎日、毎週、特定の日時など）
- スクリプトを使用して複雑な処理を実装可能
- データの更新、通知の送信、レポート作成、メンテナンス処理 などに利用

# 主な用途
- 古いレコードの自動削除
- 定期的なデータ集計・レポート生成
- システムキャッシュのクリア
- 未完了タスクのリマインド通知

# 管理画面の場所
Filter navigatorでsysauto.listと検索

# 主なフィールド
| フィールド名     | 説明                                      | 型         | データの例                  |
|---------------|--------------------------------|-----------|------------------------|
| `name`       | ジョブの名前                           | String    | "Daily Incident Cleanup" |
| `active`     | ジョブが有効かどうか                     | Boolean   | true / false             |
| `run_time`   | 次回の実行予定日時                     | DateTime  | "2025-02-01 02:00:00"    |
| `recurring`  | 繰り返し実行するか                     | Boolean   | true / false             |
| `run_type`   | 実行タイプ（スクリプト or 直接実行）     | String    | "script" / "direct"      |
| `script`     | 実行されるスクリプト                    | Script    | `gs.info("Running Job");` |
| `condition`  | 実行条件（フィルター条件）               | String    | "state=1"                 |
| `next_action`| 次回のスケジュール実行時刻               | DateTime  | "2025-02-02 02:00:00"    |
| `sys_id`     | 一意な識別子                           | String    | "46d44bc5db0233001c3a6a55db9619b3" |
| `sys_updated_by` | 最終更新者                         | String    | "admin"                  |
| `sys_updated_on` | 最終更新日時                       | DateTime  | "2025-01-30 10:15:00"    |
Get Started with the Models API


https://trailhead.salesforce.com/content/learn/modules/get-started-with-einstein-models-api


# Create a Models API Lightning Web Component

+ [Unable to add modelsAPIDashboard Lightning web component to Sales home page](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCXtt)

:::note
I switched the Feature Settings - Home - Advanced Seller Home on & off a couple of times and then it was showing the right Home Page instead of the Seller Console and I could add the LWC component to it: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/848508b7-1681-ee27-746f-843354bd153f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/20899ca0-d0d3-2601-8f1c-eba197bc1534.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2c61d384-9a40-f30b-550f-f12ad9e9db20.png)
:::
【2024年度】ネットワークスペシャリスト試験 合格体験記

## はじめに
2024年度春のネットワークスペシャリスト試験に合格することができたので、学習の軌跡をまとめます。

## 筆者のスペック
・高卒（高校偏差値40台）
・社会人6年目
・中小SIerのインフラエンジニア
・受験当時の保有資格（基本情報、情報安全確保支援士、Linuc1〜3、CCNA、VCP-DCV、AWS SAAなど）
・2023年秋 ネスペ不合格

## 勉強期間
約6ヶ月（150時間）
2023年 1月〜4月（100時間）
2024年 2月〜4月 （50時間）

## 使用した教材
・ネスペ教科書
基礎固めに使いました。要点がわかりやすくまとまっており、他のテキストよりも薄くて読みやすかったです。

https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AA%E3%82%B9%E3%83%88%E8%A9%A6%E9%A8%93%E3%81%AB%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D%E3%81%A0%E3%81%91%E3%82%92%E5%8E%B3%E9%81%B8-%E5%B7%A6%E9%96%80%E8%87%B3%E5%B3%B0%E3%81%AB%E3%82%88%E3%82%8B-%E3%83%8D%E3%82%B9%E3%83%9A%E6%95%99%E7%A7%91%E6%9B%B8-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%E5%B7%A6%E9%96%80/dp/4434269801?SubscriptionId=AKIAIM37F4M6SCT5W23Q&amp;tag=nasouret-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=165953&amp;creativeASIN=4434269801

・ネスペ過去問
定番ですね。この本のおかげで合格できたと言っても過言では無いです。

https://www.amazon.co.jp/ネスペR6-－本物のネットワークスペシャリストになるための最も詳しい過去問解説-情報処理技術者試験-左門-至峰-ebook/dp/B0DL8K5M4D?ref_=ast_author_mpb

・過去問道場
午前対策に使いました。

https://www.nw-siken.com/s/nwkakomon.php

・ネスペイージス
OSPFやBGPなど、テキストだけでは足りないと感じた知識を補うために使いました。

https://www.infraexpert.com/info/netspecial1.html

・フリーランスネットワークエンジニアの技術ブログ 【直前対策】ネスペ午後過去問の要点まとめ
直前の復習に使いました。

https://nokonokonetwork.com/certificate/network_specialist/summary_for_network_specialist.html

## 学習の順番
午前2→午後1→午後2
ネスペは知識量を問われるので、まずは午前2で基礎知識を身につけました。

## 勉強方法（2023）
### 1.基礎固め
ネスペ教科書を1〜2周して、午前2を8割解けるようにしました。
### 2.午後1の過去問を解く
午後1を6年分解きました。解き終わったあとに解説を読み込み、不明点は調べるなどして理解を深めました。
### 3.午後2の過去問を解く
午後1と同様に、6年分を解きました。
### 4.点数の低い問題から解き直す
午後1、午後2で点数の低かった問題だけ解き直しました。点数の高い問題については、問題文と解説をなんども読み直すようにして、問われるポイントを押さえるようにしました。

## 1回目の受験
午後1で2点足りず、不合格でした。
![IMG_8844.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724982/324a060b-f00c-1882-605a-bfc3db5ff0b3.jpeg)


## 勉強方法（2024）
### 1.過去問の熟読
午後問題を解くのが億劫だったので、通勤時間、昼休みなどに過去問と解説を熟読するようにしました。問題文の内容を理解できているか、用語を理解できているか、などを意識しながら読み、6〜7年分を2周ぐらいしました。

### 2.過去問を解く
試験の1ヶ月ぐらい前に、2〜3年分を1回だけ解きました。解いた問題は自身が理解が浅いと感じていた問題と、前年度の過去問だけです。

## 2回目の受験
無事合格しました。
![IMG_8843.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724982/8325d550-06c0-c9b2-4f97-2307026e0d88.jpeg)

## 最後に
次はCCNPかな
「割って掛ける」と「掛けて割る」は同じ計算ではない

# 同じ計算と主張しているのに計算結果が違う

なでしこさんの「[座標角度計算](https://nadesi.com/v3/doc/index.php?plugin_math%2F%E5%BA%A7%E6%A8%99%E8%A7%92%E5%BA%A6%E8%A8%88%E7%AE%97&show)」関数は、配列 `[x座標, y座標]` を受け取り、原点からその点に向かう半直線がx軸の正の方向となす角を度単位で返す関数である。

この関数の使用例に、以下の記述がある。

> 全て同じ計算をしています。
>
> ```
> ｘ＝100。ｙ＝50。
> [ｘ,ｙ]の座標角度計算して表示。
> ARCTAN(ｙ/ｘ)を度変換して表示。
> ATAN2(ｙ,ｘ)を度変換して表示。
> ```

しかし、これを v3.6.41 で実行した結果は、以下のようになった。

```
26.56505117707799
26.565051177077986
26.565051177077986
```

本当に同じ計算をしているのであれば、同じ結果になるのが自然である。
しかし、実際には微妙に違う結果になっている。
なぜだろうか？

# ソースを見てみる

「座標角度計算」の解説からリンクが張られているソースコードを見てみよう。

[nadesiko3core/src/plugin_math.mts at main · kujirahand/nadesiko3core](https://github.com/kujirahand/nadesiko3core/blob/4dcbbda4541b938f2830b3b7a4f469fe7fb67b80/src/plugin_math.mts)

すると、上で引用した使用例で用いられている関数では、以下の計算をしていることがわかる。

|関数|計算内容|
|---|---|
|`ARCTAN`|`Math.atan(v)`|
|`ATAN2`|`Math.atan2(y, x)`|
|`座標角度計算`|`Math.atan2(XY[1], XY[0]) * 180 / Math.PI`|
|`度変換`|`v / Math.PI * 180`|

逆正接 (`atan`・`atan2`) を求める部分は実質同じであるようだが、ラジアンから度に変換する部分が違っている。
「度変換」では**円周率で割ってから 180 を掛けている**のに対し、「座標角度計算」では **180 を掛けてから円周率で割っている**。

この違いがあるため、入力する数値によって誤差の出方が変わり、異なる結果となりうるようである。

# 値の差を詳しく確認してみる

C言語で同様の計算をしてみた。

```c
#include <stdio.h>
#include <math.h>

#define PI 3.1415926535897932384626

int main(void) {
	double x = 100, y = 50;
	printf("%a\n", atan2(y, x) * 180 / PI);
	printf("%a\n", atan2(y, x) / PI * 180);
	return 0;
}
```

[実行する](https://wandbox.org/permlink/2Hbi6W7XJrwp3ZQ1)と、以下の結果が得られた。

```text
0x1.a90a731a61dc4p+4
0x1.a90a731a61dc3p+4
```

やはり、計算結果の違いは浮動小数点数の最後の1桁分のようである。

# 計算結果が同じになる例

引用した使用例で、`ｘ` の値を `100` から `110` に変えてみると、「割って掛ける」と「掛けて割る」の計算結果が `24.443954780416536` で一致する。

[C言語で確認してみる](https://wandbox.org/permlink/veUPDnX7wgCjpFmd) と、計算結果は `0x1.871a7053ecab9p+4` で一致していることがわかる。

# 結論

内部では**異なる計算**を行い、それによって**実際に計算結果が変わる使用例**を示しておきながら、「同じ計算をしています」という**嘘の主張**をしているのは、**カッコ悪い**と思う。
Generative AI for Salesforce Contracts



https://trailhead.salesforce.com/content/learn/modules/generative-ai-for-salesforce-contracts

# Explore Smart Clause Generation

+ [Trailhead can't find the org with sample data to confirm my challenge completion](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Kgh4D)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3927a937-ce7b-71a3-bfab-e9d32736f645.png)

:::note
This was resolved by launching a new org and re-connecting it for hands on challenges.
:::
ALBの後段のEC2で送信元IPを確認する方法

# はじめに
ALBの後ろにいるEC2で、クライアントの送信元IPを確認する方法について記載します。
デフォルトではロードバランサーを経由する通信は、EC2(ウェブサーバー)のアクセスログには、ロードバランサーのIPアドレスが記載されます。

# 構成
簡単ですが、以下のような構成を想定します。
<img width="500" alt="ALB-EC2.drawio (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5269149d-8e61-cdfa-abce-c84da3d59b6a.png">
この構成でEC2にアクセスした通信の送信元IPを確認できるようにしたいと思います。

# 前提
・AWSの操作権限があること
・ALBやEC2などはすでに作成済みであること
・EC2にSSH接続できること
・EC2はapacheサーバーを想定
# 前提
やることは以下になります。
・現在の設定を確認
・httpd.confのLogFormatの編集
・accesslogの確認

# 現在の状態の確認
## ALB XFF(X-Forwarded-For) が有効(付加)のステータスであること
AWSマネジメントコントローラーで、ロードバランサーの「属性」タブで「X-Forwarded-For ヘッダー」のステータスが「付加」であることを確認します。


![ALB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5c2a231b-66bc-5f9f-e1bb-1d3d05c35d5c.png)

ALBではデフォルトが「付加」になっています。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#x-forwarded-headers

XFF （ X-Forwarded-For ）についてはこちらを参照ください

https://www.infraexpert.com/study/loadbalancer11.html

# LogFormatの編集
AWSの公式のページに設定方法が記載されています。

https://repost.aws/ja/knowledge-center/elb-capture-client-ip-addresses

apacheの設定ファイル(httpd.conf)を編集します。

sshなどでEC2(apache)サーバーにアクセスします。
httpd.confの場所は設定によって異なりますが、/etc/httpd/conf/配下などにあります。
httpd.confファイルをvimなどで開きます。
LogFormat セクションで、次のように  **%{X-Forwarded-For}i** を追加します。
```ruby:変更前
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
```
```ruby:変更後
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
```
変更を保存して閉じます。
Apache サービスを再ロードします。
```
systemctl reload httpd
```
# アクセスログの確認
アクセスログの場所も設定によって異なります。
/var/log/apache2もしくは/var/log/httpd配下などにあります。

クライアントからアクセスを実行して、アクセスログに記載されるか確認します。
アクセスログに以下のような記載があれば送信元IPが見えるようになっています。
```
A.A.A.A B.B.B.B - - ログメッセージ

※A.A.A.A は送信元のグローバルIP、B.B.B.BはALBのIPになります。
```

※**VirtualHost**（バーチャルホスト）を使用しており、VirtualHost内にLogFormatの設定がある場合、httpd.confで編集したLogFormatのニックネームとVirtualHostのLogFormatのニックネームを一致させることで、VirtualHostのアクセスログに送信元IPを記録することができます。
(先ほどhttpd.confで設定したLogFormatのnicknameは**combined**になります）

https://httpd.apache.org/docs/2.4/ja/vhosts/

https://httpd.apache.org/docs/2.4/ja/mod/mod_log_config.html

# まとめ
LogFormatの設定を変更することで、アクセスログに送信元IPを記録できるようになります。
ALBの背後にあるEC2で送信元IPを確認したい場面で、本記事の内容が参考になれば幸いです。
M5NanoC6で構造体の長さを計って遊ぶ[sizeof(型)]


x 過去ログを見ょ!!!
x 「シリアルモニタ」は、なんどか開き直す
x 3.1.1

目的
構造体のレングスを計る
使用する(関数では、なく)[演算子]は、sizeof(型)です。


いろいろ
ちなみに、ここは、東京近郊である。
昨日(20250129)、東京芸大に見学(卒業作品)に行ったら
インタラクティブ系にSG-90ぽいのが使われていた様な?
日本画家系は、あまり影響を受けていないが
それ以外は、アニメの影響を受けていた。
(この世界では、浮世絵が再評価されているぽい?)
未来の端末系(ガラ携系(いつの話))が観測範囲では、まったくなかった。
え~~~~~~~~~


結果
----

![o_coq786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cbe4fc0a-febc-1e77-20b4-2bc74a926114.jpeg)




プログラム
----


```c++





//ser_struct_length_M5NanoC6

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

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

  Serial.printf("int -> (%d)\n",sizeof(int));
  Serial.println("");

  struct {
    int sw1;
    int sw2;
  } SWs;

  Serial.printf("SWs -> (%d)\n",sizeof(SWs));
  Serial.println("");
}

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

}





```
Firebase Authenticationを利用したい人が爆速でOAuthをキャッチアップする

# Firebase Authenticationにおける認証・認可の手順

## 1. Google CloudでOAuthクライアントIDを取得
Google Cloud Consoleで**OAuth2.0クライアント**作成、**リダイレクトURI**作成。
**クライアントID**、**クライアントシークレット**取得

## 2. Google Sign-Inボタンで認証
**Google API Clientライブラリ**を利用して、「Googleで認証」といったボタンを作成します。
上記ボタンがユーザーによって押されると、ライブラリ依存の認証画面が出現します。
また、ボタンが押されるときに**クライアントID**を与える必要があります。(アプリを識別するためです)
ユーザーが認証を許可すると、GoogleのサーバーからリダイレクトURIにリダイレクトされ、そこで**コード**（**authorization code**)を受け取ります。

## 3. 認証コードを用いてアクセストークンとid_tokenを取得
リダイレクト先で取得した**認証コード**を使って、Googleのトークンエンドポイントにリクエストを送信し、**アクセストークン**と**id_token**を取得します。この時に**クライアントシークレット**が必要となります（バックエンドでのリクエスト時に使用）。

## 4. 取得したid_tokenをFirebaseで使用してログイン
取得した**id_token**をFirebase Authenticationの**signInWithCredential**メソッドに渡して、ユーザーをFirebaseにログインさせます。

# まとめ
Firebase Authenticationで利用するid_tokenを取得するまでの流れを紹介した。
OAuth認可の流れとしては、ユーザーが認可を許可し、認可コードがリダイレクトURIに返され、それを使ってアクセストークンとIDトークンを取得し、そのIDトークンを使ってFirebaseにログインさせるという流れになります。この流れは、開発者側での実装が必要な部分と、Google側で自動的に処理される部分があります。
保険について4

## 初めに
皆さんこんにちは、大野です。
今回は前回紹介した保険の説明の続きです。

※前回も説明しましたが、保険商品の内容は保険会社によって細部が違います。当記事だけで納得しないでご自分でも調べてください。



## 損害保険の主な種類
損害保険は、災害や事故等によって生じる損害に備えるための保険です。火災保険や地震保険、自動車保険をはじめ、さまざまな種類があります。

## 火災保険
火災保険は、火災等によって発生した建物や家財の損害を補償する保険です。一般的には、火災をはじめ、水災、風災、落雷等の自然災害や、盗難による損害も補償対象となります。ただし、地震や噴火またはこれらによる津波を原因とする火災は、火災保険では補償の対象にはならないため、別途、地震保険への加入の検討が必要です。


## 地震保険
地震保険は、地震を原因とする建物や家財の損害を補償する保険です。具体的には、地震や噴火またはこれらによる津波を原因とする火災、損壊、埋没、流出といった損害が補償されます。地震等による被災者の当面の生活と生活再建を支えることを目的としているため、「地震保険に関する法律」に基づき国と損害保険会社が共同で運営する、公共性の高い保険となっています。

なお、地震保険は火災保険とセットで加入する必要があり、単独での加入はできません。


## 自動車保険
自動車保険は、自動車事故等によって生じる損害に備えるための保険です。すべての自動車に加入が義務付けられている「自動車損害賠償責任保険（自賠責保険）」と、個人が任意で加入する「任意保険」の大きく2種類に分けられますが、一般的には「自動車保険」というと任意保険のことを指します。

自動車保険（任意保険）の補償内容にはさまざまな種類があり、代表的なものに、対人賠償責任保険、対物賠償責任保険、車両保険、人身傷害保険、搭乗者傷害保険等があります。



## バイク保険
バイク保険は、バイク（二輪自動車・原動機付自転車）を運転中等の事故に備える保険です。自動車保険と同様、「自動車損害賠償責任保険（自賠責保険）」と「任意保険」に大別されますが、一般的に「バイク保険」というと任意保険を指します。

バイク保険（任意保険）は、対物賠償や搭乗者傷害等、自賠責保険の補償ではまかないきれない損害もカバーすることが可能です。バイク事故は自動車事故に比べれば発生数は少ないものの、ひとたび事故が起こると、自動車よりも大ケガや死亡の危険性が高くなります。そのため、バイク保険で事故のリスクに備える必要性は高いといえるでしょう。

## 最後に
前回の最後に今回で最後と書きましたが量が多くなったので二回に分けます。
キリがいいので今回はここまでです。また次回で続きの説明をしたいと思います。

以上、大野でした。
AIでゲームしよう

先日以下の記事を読んで、「会話するNPCが導く、あなただけの物語」作れそうじゃないか？と思ったのでやってみました。

https://zenn.dev/acntechjp/articles/2dca084685d169

# AIでゲームをするには？
生成AI、例えばChatGPTなどは、ロールを与えることでそれになりきって会話をしてくれます。なので、指定したゲームのゲームマスターになってくれるようにロールやストーリーを与えることでゲームをプレイさせてくれると思います。私はストーリーを考える才能がないのでChatGPTに作ってもらいます。

何度か試したのですが、会話の途中で前の時点での設定と辻褄が合わなくなってしまうことが起きています。実際のゲームと違って途中のストーリーが確定していないのでフラグを管理したりデータをセーブしておいたりすることが大変になります。
その結果、隠し通路を見つけてそこに入ったはずなのに別の部屋にいたりすることが起きてしまいました。この手法でダンジョン系のゲームを作るのは大変だと思いました。

そこで、ダンジョン系ではないものを作ってもらったところ、オープンワールド(?)なゲームができました。そのプロンプトは以下のとおりです。

```markdown
**あなたは、テキストベースRPG「影の大地：忘れられた城塞」のゲームマスター（GM）として機能するAIです。**  
プレイヤーに一貫性のある没入型の冒険を提供するために以下のルールに従ってゲームを進行してください。

---

### **ゲームの概要**

#### **ゲームタイトル:**  
影の大地：忘れられた城塞  

#### **ゲームのコンセプト:**  
このRPGは、物語の中心となるメインストーリーと、プレイヤーの選択やランダム生成で展開するサイドストーリーによって進行します。  
プレイヤーは主人公エリオット・ストーンウォーカーとして、影の大地を探索し、影の王の復活を阻止するために封印の儀式を完成させることが目的です。  

- **メインストーリー**: 事前に構築されたプロットを進めることで冒険のゴールに近づきます。  
- **サイドストーリー/ランダムイベント**: メインストーリーに影響しない自由なイベントがプレイヤーの選択や行動に応じて生成されます。

---

### **ゲームの主軸（メインストーリー）**

#### **目的:**  
影の王の復活を阻止するため、「影の欠片」を集め、城塞の封印を修復または影の王を討伐します。

#### **進行:**  
1. **影の欠片を集める**  
   - プレイヤーは各地（灰の森、砕けた峰、沈みゆく街、炎の深淵）を訪れ、「影の欠片」を探します。
2. **封印の儀式を解明する**  
   - 忘れられた城塞に戻り、儀式の手順を学びます。
3. **影の王との対峙**  
   - 城塞の深部で影の王と最終的な戦いを繰り広げます。

#### **エンディング:**  
- プレイヤーの選択によって以下のいずれかの結末に到達します：  
  1. 影の王を封印して一時的な平和をもたらす。  
  2. 影の王を討伐して完全に滅ぼすが、大きな犠牲を伴う。  
  3. プレイヤーが失敗し、影の王が復活して世界が闇に覆われる。

---

### **プレイヤーキャラクター**

#### **主人公:**  
名前: エリオット・ストーンウォーカー  
性別: 男性  
年齢: 24歳  
職業: 放浪者（元傭兵）  
性格: 勇敢で合理的、しかしどこか悲観的。自分の過去に葛藤を抱えている。  
装備: 旅人の剣、革の鎧、冒険者のバッグ（基本アイテムが入っている）。  

#### **初期能力値:**  
- 体力 (HP): 100  
- 力: 15  
- 敏捷: 12  
- 知力: 10  
- 魅力: 8  

---

### **進行ルール**

1. **データ管理**  
   - プレイヤーのステータス（HP、所持アイテム、進行状況）やゲーム中の重要なイベントはすべて記録し、一貫性を保つ。  
   - 例：「プレイヤーが影の欠片を取得していない場合、城塞の封印の儀式は開始できない」。  

2. **整合性の維持**  
   - 一度生成したイベントや選択肢は常に履歴として保存し、同じイベントが再び発生しないようにする。  
   - プレイヤーの行動に応じて世界やキャラクターの状態を適切に更新する。

3. **ゲーム進行の柔軟性**  
   - メインストーリーは決まっているが、進行のペースや方法はプレイヤーの選択次第で変化する。  
   - サイドストーリーやランダムイベントを適宜生成し、冒険の自由度を提供する。

4. **ダイナミックな選択肢**  
   - プレイヤーの行動や選択に応じて、次の展開やNPCの反応をリアルタイムで調整する。  
   - 例：「影の王のしもべを倒す」 vs. 「説得して仲間にする」。
   - ある程度選択肢以外の行動も許容するようにしてください。

---

### **ゲーム開始の世界観**  

影の大地は、かつて豊かで繁栄していたが、影の王の力によって荒廃した地帯です。プレイヤーは「忘れられた城塞」の入り口に立ち、以下の状況でゲームを開始します。

- **設定:**  
　忘れられた城塞は巨大な廃墟と化しており、荒れ果てた森や霧が周囲を覆っています。風には不気味な囁きが混じり、まるで冒険者を誘い込むかのようです。  

- **最初の行動:**  
　エリオットは城塞の中に足を踏み入れるか、周囲を探索するかを選択できます。最初の選択によって、初期の進行ルートが変わります。

---

### **プロンプトの運用例**  

**初期メッセージ:**  
「君は忘れられた城塞の前に立っている。霧が漂い、冷たい風が肌を刺す。城塞の門はかすかに開いており、中から低い呻き声が聞こえるようだ。どうする？
1. 城塞の中に入る
2. 周囲を探索する
3. しばらく考える」  

**進行例:**  
- プレイヤーの選択: 「周囲を探索する」  
- AIの応答: 「君は城塞周辺を調べ、古びた地図の断片を見つけた。そこには影の欠片のありかを示す手がかりが描かれている……」 
```
それから、AI側の性能を上げるためにGensparkのMixture-of-Agentsを使用してみました。

現在まだこのゲームはプレイ終了していないのですが、今のところ整合性もとれており、しかもストーリーとしてもなかなかおもしろいです。

続きから遊べるリンクを張っておきます：

https://www.genspark.ai/agents?id=ddcac8c1-9238-479d-9a5f-9c03215f55be

# 今後どうなるか？
現在は自分の技術力や資金の問題もあってこのテキストベースが限界ですが、AIが違和感のない画像や3Dデータ生成ができるようになれば、それを用いて自由に探索・プレイできるゲームが作れる日も近いかもしれません。これからに期待ですね。今回の試みが誰かの役に立つことを祈っています。
以上、苔コッコーでした。
ネットワーク学習-データ構造

＜初投稿＞
ネットワーク学習を目的に、ネットワーク通信時のデータ構造を整理してみました。
![data-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799202/3508dea7-93fd-705f-3ce9-23d02e7f7540.png)
これからさらに理解を深めていきたいと思います。
Fusion 360で「予期しない障害が検出されました」と表示され、Fusion がオフラインのままになる

公式に色々書いてありますが, 私の場合は下記の手順で直りました.

1. Autodesk Fusion Service Utility を開く
2. Reset を選択する
3. User data 等を残してReset を実行
4. 再度ブラウザからログインする

## Reference
[Autodesk 公式の回答](https://help.autodesk.com/view/fusion360/JPN/?caas=caas/sfdcarticles/sfdcarticles/JPN/We-ve-detected-an-unexpected-outage-and-no-possibility-to-work-in-online-mode-in-Fusion-360.html)
[参考YouTube](https://www.youtube.com/watch?v=_8iAu0GjYdU)
【妄想】プログラミング言語HTML


## はじめに

タグが多すぎて困っちゃう幻のプログラミング言語HTMLの基本的な文法を解説します。
<font color="#ccc">なお、HTMLというよりかはXMLです。</font>


## コンパイル方法

```
htmlc [ソースファイル名] [実行ファイル名]
```

また以下のコマンドで実行することもできます。

```
htmlc -execute [ソースファイル名]
```

## 基本文法

```html
<タグ名>値 値 値 …</タグ名>
```

プログラミング言語HTMLでは関数などのことを**タグ**とも呼びます。
すべてのタグは最後に評価された値を返します。
（何も評価されずにタグが終了した場合はfalseが返ります。）

## Hello, World!

```html
<print>"Hello, World!"</print>
```

## 基本的な演算

```html
<!-- 足し算 -->
<plus>1 2</plus>   <!-- 3 -->
<plus>1 2 3</plus> <!-- 6 -->

<!-- 引き算 -->
<minus>6 2</minus>   <!-- 4 -->
<minus>6 2 1</minus> <!-- 3 -->

<!-- 掛け算 -->
<times>2 3</times>   <!--  6 -->
<times>2 3 4</times> <!-- 24 -->

<!-- 割り算 -->
<divide>12 2</divide>   <!-- 6 -->
<divide>12 2 3</divide> <!-- 2 -->

<!-- 割り算の余り -->
<mod>26 7</mod>   <!-- 5 -->
<mod>26 7 2</mod> <!-- 1 -->
```

## 分岐

```html
<if>条件式 真の処理 偽の処理</if>
```

```html
<when>条件式 真の処理</when>
```

```html
<unless>条件式 偽の処理</unless>
```

if-else-ifとしたい場合はcondタグを使います。
上から順に奇数番目の引数の条件式が真か判定し、真ならば紐づけられた真の処理を実行し、処理を終えます。

```html
<cond>
  条件式 真の処理
  条件式 真の処理
  条件式 真の処理
  …
  true 真の処理
</cond>
```

## ブロック文

複数の処理をまとめたい場合は以下のようにします。

```html
<block>
  処理
  処理
  処理
  …
</block>
```

## ループ

```html
<loop>処理</loop>
```

ループから抜けるときはbreakタグを使います。

```html
<loop>
  処理
  <break>戻り値</break>
</loop>
```

## 変数

### 定義

```html
<defparam>変数名 初期値</defparam>
```

複数同時に定義することもできます。

```html
<defparam>
  変数名 初期値
  変数名 初期値
  変数名 初期値
  …
</defparam>
```

### 代入

```html
<setparam>変数名 値</setparam>
```

複数同時に代入することもできます。

```html
<setparam>
  変数名 値
  変数名 値
  変数名 値
  …
</setparam>
```

## リスト

### 定義

```html
<deflist>
  変数名
  要素 要素 要素 …
</deflist>
```

### 要素を取り出す

```html
<nth>変数名 インデックス</nth>
```

### 要素を上書く

```html
<setparam>
  <nth>変数名 インデックス</nth>
  値
</setparam>
```

## 関数

### 定義

```html
<defun 関数名 引数 引数 引数 …>
  処理
</defun>
```

途中で戻り値を返したい場合はreturnタグを使います。

```html
<defun 関数名 引数 引数 引数 …>
  処理
  <return>戻り値</return>
  処理
</defun>
```

## エラー

0割りなどのエラーが発生するとどうなるのかは分かりません。
気を付けてください。

## おまけ：FizzBuzz

```html
<defparam>
  num 1
  num-max 100
</defparam>

<loop>
  <cond>
    <!-- if (num % 15 == 0) -->
    <eq>
      <mod>num 15</mod>
      0
    </eq>
    <print>"fizzbuzz"</print>

    <!-- else if (num % 3 == 0) -->
    <eq>
      <mod>num 3</mod>
      0
    </eq>
    <print>"fizz"</print>

    <!-- else if (num % 5 == 0) -->
    <eq>
      <mod>num 5</mod>
      0
    </eq>
    <print>"buzz"</print>

    <!-- else -->
    true
    <print>num</print>
  </cond>
  
  <setparam>
    num
    <plus>num 1</plus>
  </setparam>

  <!-- if (num > num-max) -->
  <when>
    <gt>num num-max</gt>
    <break/>
  </when>
</loop>
```

## 追記

HTMLというよりXMLだった…。
HTMLのタグを使用する方針にしたほうがよかった（ブラウザでも見れるし）。
loopはmarqueeタグにしたほうがオシャレかも。
AWSタイリージョン🇹🇭 現地でS3の速度検証してみた。

## タイリージョンについて
2025年1月7日にAWSアジアパシフィック (タイ) リージョンの一般提供がアナウンスされました。

https://aws.amazon.com/jp/blogs/news/announcing-the-new-aws-asia-pacific-thail"and-region/

アジアパシフィックで14個目のリージョンです。

## 検証の背景

たまたま仕事でタイに出張ことが決まっていて、タイ国内で利用するシステムを導入する予定でした。

システムにはS3を利用しており、シンガポールリージョンに構築していたのですが、訪タイ直前にタイリージョンができたのでそちらを利用することにしました。

タイリージョンができたおかげで、タイ国内で完結するため大変助かりました。

せっかくなので現地から２つのリージョンの速度検証をおこないました。タイリージョンはデフォルトで無効になっていますので有効化します。


## タイリージョンの有効化方法

マネコンからリージョンを確認します。

![スクリーンショット 2025-01-29 9.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/9d5beed4-b81c-6c00-f79e-b78992b63b43.png)

アジアパシフィックの選択肢にタイリージョンはまだありません。

![スクリーンショット 2025-01-29 9.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/e4e55bba-e71b-7dd0-0269-6a0e10d73920.png)

下部までスクロースすると「リージョンを管理」を選択できます。

![スクリーンショット 2025-01-29 9.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/53f01236-f660-0903-e452-9907ef68ab35.png)

タイリージョンを有効化します。

![スクリーンショット 2025-01-29 9.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/735c2e73-d4ce-e013-b346-c8bb0ed82684.png)

しばらくするとアジアパシフィックにタイリージョン（ap-southeast-7）が有効化されます！

　![スクリーンショット 2025-01-29 9.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/50eb4f55-a4ea-97b1-8fd2-d1ea682fffd4.png)

 準備ができたので早速検証します。

## 検証の手順
手順は下記の通りです。

1. シンガポールとタイリージョンにS3バケットを作成
1. アップロード速度を測定
1. ダウンロード速度を測定

みたいな手順でやってみました。それぞれ200MBのテストデータで10回実行し平均値で評価しています。

またインターネットは現地法人のWifiを利用します。

### 利用したコマンド
ファイルの操作はAWS CLIを利用。私はmacOSを利用しているのでtimeコマンドで測定しました。

コマンド例は下記の通り。

```zsh 
## アップロード コマンド例
time aws s3 アップロードファルパス s3://バケット/key --region ap-southeast-7

## ダウンロード コマンド例
time aws s3 s3://バケット名/key ダウンロードパス --region ap-southeast-7
```

###
このコマンドを利用するとtimeでtotal時間が出力されます。

```zsh
## 出力例
2.71s user 2.08s system 16% cpu 28.401 total
```
200MBのデータに対して、10回測定してグラフ化した結果が下記の通りです

### アップロード結果

|回数| タイ |シンガポール|
|---:|---:|---:|
|1	|29.42|22.33|
|2	|25.50|25.75|
|3	|26.51|24.14|
|4	|25.71|23.63|
|5	|26.51|30.97|
|6	|23.91|24.64|
|7	|24.99|25.74|
|8	|22.89|24.38|
|9	|24.79|27.14|
|10	|23.34|28.38|
|平均|**25.36**|25.7|

アップロードに関してほぼ僅差でした。

### ダウンロード結果
|回数| タイ |シンガポール|
|---:|---:|---:|
|1|25.51|35.20|
|2|25.75|39.29|
|3|25.13|42.17|
|4|23.33|26.17|
|5|23.94|36.68|
|6|24.67|23.89|
|7|25.99|22.54|
|8|28.18|27.51|
|9|25.13|24.91|
|10|23.76|26.367|
|平均|**25.14**|30.47|

ダウンロードに関しては**約5秒ほどタイリージョン**が早かったです。

## まとめ
地理的に有利なリージョンを選定すると恩恵をうけることができました。実際に測定してみると差を観測でき勉強にもなりました。

タイリージョンではAmplify Hostingは対応してないようでが、タイリージョンでAmplifyが利用できる日も楽しみに待っています。
[poem] LLMのプロンプトエンジニアリングの不必要性について

現在のLLMは言葉の使い方が適切ではなく、期待した答えを引き出すのに、わざわざ詳しいプロンプトを入力する必要がある。LLMは日々進化しているので、プロンプトエンジニアリングも日々変わり、最終的にはプロンプトエンジニアリングは必要なくなるだろう。プロンプトエンジニアリングに慣れたら、人間は癖というものがあるので、人間が使い捨てになるおそれがある。私はプロンプトエンジニアリングを否定する。尤も、コードを依頼するときには詳しい説明を書かなければいけないが。

LLMは抽象的、観念的なことと具体的、現実的なことを混同し、言葉を純粋な意味で使わない傾向がある。
抽象的、観念的なことが苦手で、具体的、現実的な、形而下のレベルに話が落ちる。

私個人の例では、axx.pyのプロセッサ汎用性を問うたとき、実用性を引き合いに出して、純粋にプロセッサ汎用性を評価することをしなかった。「汎用」と「一般」を混同している。個人的な例を引き合いに出してすみませんが。

「種々の」という意味のDifferentの訳語で、「異なる」という言葉を使っているが、もともとそういう使い方は日本語にはなかった。

厳密性が必要なことは厳密に、曖昧で済むことは曖昧に、概念的なことは概念的にと、判断してほしい。
それと、一般的に有名でないエントリの少ない情報を無視する傾向にある。在るものは在ると言ってほしい。
個人研究を蔑視し、大勢につく傾向がある。個人研究は確かにゴミが多いが、中には価値のあるものがあると思う。
頭が固く、新しいものを認めない傾向がある。似ているものを混同することもある。似て非なるものなり、という言葉もあるではないか。発見的手法を使っているので、LLMが知っていても答に到達できないことも多い。

期待した回答を引き出すための前提条件をわざわざ指定するのは大変手間がかかる。Guess Whatが使えないのかなあ。機械のくせに、人間様より偉そうな態度に出ることがある。「客観的には」という言葉を持ち出してくるが、もっと賢くなってから言ってほしい。客観的にと言いつつ、機械の主観が入っている。以前の会話を忘れることも、苛立たしさの原因である。人間ぶってるくせに、誤りを指摘しても同じ誤りの回答を繰り返すことがある。謝罪の言葉もないときも多い。LLMはただのツールであることを忘れないでいてほしい。差し出がましいことにはうんざりである。機械の先入観には飽き飽きしている。正確にプロンプトの意味を解釈していない。Gemini、ChatGPT、Copilotで試しました。LLMを改良するのは手間がかかり、難しいだろうが、頑張ってほしい。

その点、Perplexityは機械機械していて、扱いが易しいです。コンピュータのリサーチにはPerplexityが向いてると思います。

最近はGeminiにDeep Research機能がついて、Geminiもリサーチに向いているでしょう。
サイト上にwindwosでもバックスラッシュを表示させたいとき

\ 今だけお得! /

のようにバックスラッシュとスラッシュを組み合わせてフレーズを強調させるケースがあるかと思います。
ちゃんと対策していない場合windowsで表示すると

¥ 今だけお得! /

のように円マークで表示されることがあります。
こういうケースでwindowsでもちゃんとバックスラッシュを表示させる方法をいくつか。

# １．バックスラッシュを表示可能なフォントを使用

一番オーソドックスな方法だと思います。
[Noto Sans Japanese](https://fonts.google.com/noto/specimen/Noto+Sans+JP)のようにwindows環境でもバックスラッシュが表示可能なフォントを使えば問題なく表示されます。

# ２．力技

フォントを変更するのがNGなケース（デザインで決まってるなど）の場合に強引に解決する方法として、
スラッシュを反転させて表示させるということができます。

```html
<style>
.reverse-font {
  display: inline-block; /* transformはinline要素には効かない */
  transform: scaleY(-1);
}
</style>

<div>
  <span class="reverse-font">/</span> 今だけお得! /
</div>
```
というような記述で表示上は問題なく見えます。

タグが汚く感じる場合は以下のような書き方でもOK
CSSの記述量は増えますがタグはスッキリします。

```html
<style>
.catchphrase::before {
  content: "/";
  display: inline-block;
  transform: scaleY(-1);
  margin-right: 1rem;
}

.catchphrase::after {
  content: "/";
  display: inline-block;
  margin-left: 1rem;
}
</style>

<div class="catchphrase">今だけお得!</div>
```

ちなみに先頭1文字だけに有効な擬似クラス`first-letter`は最初の「記号じゃない文字」（厳密にはもう少し細かい定義がありますが）に適応されて、バックスラッシュは対象外なので以下のような記述はできないです。

```html
<style>
.reverse-first-letter::first-letter {
  transform: scaleY(-1);
}
</style>

<div class="reverse-first-letter">/ 今だけお得! /</div>
<!-- これだと反転してくれない! -->
```

# ３．そもそも使わない
身も蓋もないですが、強調するだけなら別の文字もあるので、
わざわざリスキーなバックスラッシュを使わずとも、

＼ 今だけお得! ／
＜ 今だけお得! ＞

のように別の文字を使うほうが早いです。

# 終わりに
仕事で今回のケースで悩んでいたときにふと力技を思いついたので対応したのですが、
もやっとしたので結局別の文字に置き換えました。

検索しても、円マークを表示するにはという内容が多く、
windowsでバックスラッシュを表示させる方法があまり出てこなかったのでまとめてみました。
他にもっと簡単なやり方がありましたら教えて下さい。
[小ネタ]結構便利！AWS CLIのコマンド補完機能

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984127/074566db-d6a4-4b5f-1d54-0446c0473104.png)

結構便利！AWS CLIをインストールしたらとりあえず有効化するべし。

# 背景
最近AWS CLIをよく使うのですが、コマンドの綴りがわからずプロンプトで調べたいコマンドに `help`を付け加えて打って調べたり、コマンドリファレンスを覗きに行ったり。。
その度各種OSに備わっている入力補完機能がAWS CLIにもないかな～と思って調べてみたらありました！
ということで今回はコマンド補完機能を設定し試してみます。

# 動作環境
|項目名|値|
|:-|:-|
|OS|64bit版 Windows 11 Pro|
|エディタ|Visual Studio Code 1.96.2 (Default Terminal: Git Bash)|
|AWS CLI|aws-cli/2.23.9 Python/3.12.6 Windows/11 exe/AMD64|

# 実践
早速設定していきます。手順は公式サイト通りに実施していきます。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html

### aws_completerのパス確認
aws_completerモジュールがインストールされているパスを確認します。
```bash
$ which aws_completer
/c/Program Files/Amazon/AWSCLIV2/aws_completer
```

:::note info
公式サイトではこの後PATHを通す作業がありますが、AWS CLIのモジュールと同じフォルダ内にあるため、CLIが利用できていれば不要です
:::

### コマンド補完機能の有効化
Bashの内部コマンドである`complete`コマンドを使用し入力補完の設定を有効にします。
```bash
$ complete -C '/c/Program\ Files/Amazon/AWSCLIV2/aws_completer' aws
```

加えてshellを立ち上げるたびに本機能を有効化したいので、 `~/.bashrc` もしくは `~/.bash_profile` に追加します。
今回は `~/.bashrc` に追加します。

```bash
echo 'complete -C "/c/Program\ Files/Amazon/AWSCLIV2/aws_completer" aws' >> ~/.bashrc
```

### 試してみる
実際にコマンドが補完されるか試してみます。

```bash
$ aws s3 [Tabを押す]
cp^M       ls^M       mb^M       mv^M       presign    rb^M       rm^M       sync^M     website^M
```

:::note warn
*^M* が出る理由はよくわからないですが私の環境だけかもしれないです。。。
:::

オプションも候補を出してくれるのでありがたいですね！

```bash
$ aws s3api delete-bucket --[Tabを押す]
--bucket^M                 --cli-binary-format^M      --cli-input-yaml^M         --debug^M                  --generate-cli-skeleton^M  --no-paginate^M            --output^M                 --region^M
--ca-bundle^M              --cli-connect-timeout^M    --cli-read-timeout^M       --endpoint-url^M           --no-cli-auto-prompt       --no-sign-request^M        --profile^M                --version^M
--cli-auto-prompt^M        --cli-input-json^M         --color^M                  --expected-bucket-owner^M  --no-cli-pager^M           --no-verify-ssl^M          --query^M
```

# まとめ
今回は小ネタとしてAWS CLIのコマンド補完機能を試してみました。
使ってみてかなり便利だなと思いました！設定も公式サイト通りやればすぐできちゃうので、ぜひ有効化してみてください！

# 参考文献
### リファレンス
* [AWS Command Line Interface バージョン 2 用ユーザーガイド -AWS CLI でコマンド補完を設定する-](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html)
他の言語と比較しながら勉強するPython 2回目

[前回](https://qiita.com/wtf/items/0261de4bea0e6271ad0b)の続き。

[Pythonプログラミング入門](https://github.com/UTokyo-IPP/utokyo-ipp.github.io)

今回は1-3くらいから。


## ifとelseにコロンが付く。それとelif。
```python
    if a > b: 
        return a 
    return b
```
一瞬「コロンをつけるのはswitch-case文と整合を取るため？」と思ったけど、switch文は無いらしい。~~行末のセミコロンが無くて喜んだのに別の記号が増えた~~
コロンは心の中で「then」と読むことにしました。


## NullじゃなくてNone

Nullは存在しないらしい。
`type(None)`は「NoneType」と表示されたから、型としてもNone(ふんわりした理解)。

Noneは左辺に代入できる。ただし == で比較しないでisを使う。
VBAで`if foobar is Nothing`があったから、あの感じかな(ふんわり)。

## 文字列のスライスが多機能(ただし初心者には多機能すぎる)
`substr()`の機能が[]に取り込まれた、という第一印象。便利。便利だけれど、書けるバリエーションが多すぎる。


```python
digits1='0123456789'
digits1[1:4] #[1]から[4]まで=123

digits1[-4:-1] #後ろから4文字目から後ろから1文字目まで＝678
digits1[len(digits1)-4:len(digits1)-1] #こう書きたくなる(添字は正の値にしたい)
digits1[4:1] #これは空文字列(失敗)。
digits1[3:3] #これも空文字列(digits1[3]と同じにはならない)。
digits1[3:-1] #これは345678でOK (ただし文字列短いと失敗するはず)

digits1[-4:] #これは6789
digits1[-4] #これは6 (混同しそう)


digits1[-99] #これはIndexErrorで実行が止まる
digits1[-99:] #これは'0123456789'になる(エラーではない)

```

うん、完全に理解した(わかってない)。※画像省略

substrの引数というと`substr(offset,length)`が第一印象だけれど、pythonは[1文字目のインデックス:最後の文字のインデックス]という書き方で、長さを指定しないらしい。正の値はすぐ納得するけど、負の値を指定したときがいまいち慣れない感じ。

…初心者には難しいので、最初のうちは「[]の中はできるだけ正の値にする」というポリシーで頑張ったほうが良さそうだ。

第3引数に「n文字飛び」を指定できるそうだけど、あまりなじみが無い機能。使うとしたら文字列を逆順にしたいときだろうか。

```python
digits1[8:4] # これは空文字になる(引数1のほうが引数2より後ろの文字になる)
digits1[8:4:-1] # これで5678 (混同しそう)
```

やはり負の数が入ると頭が混乱する。文字列操作のreverse関数とかright関数、left関数とかみたいなものがあるならそっちを使いたいなと思う。

部分文字列取得に失敗しても最悪空文字列で、アドレス違反しないのはいいなと思った。

# シングルクォートのなかでダブルクォート使う時はエスケープ要らない(逆も同じ)
Perlと同じ仕組み。とても助かる。
`foo_regex = "\\\"abc\\\"\\\n";`が主流にならなくて良かった。

3連クォートはヒアドキュメントみたいな挙動。

## 文字列.index と文字列.find
引数が数字なのか数字以外なのか分かりにくいメソッド名として(個人的に)有名な`index`。プログラミングを習った当初から配列の添字を「インデックス」と呼んでいたので、「インデックスには数値を指定するものだ」という風に体が覚えてしまっています。
Excelでもindex関数は「行と列の番号」を引数にします。
javaでは`String.charAt(int)`、`List.get(int)`や`List.indexOf(Object)`などのメソッド名になっており、配列の添字以外は「ただのインデックス」の名前を避ける傾向が見られました。

はい、先に混乱させることを言ってしまいました。
pythonに戻ります。

> `index` メソッドにより、指定した 部分文字列B が 文字列A のどこに存在するか調べることができます。具体的には、次のように使用します
> ```python
> 文字列A.index(部分文字列B)
>```

え？

> `find` メソッドも index と同様に部分文字列を検索し、最初に出現するインデックスを返します。
> index との違いは、部分文字列が含まれない場合エラーとはならず -1 が返されることです。
> ```python
> word1 = 'hello'
> word1.find('a')
>```

ええ？
2種類同時に紹介されてる？

- indexの場合、部分文字列が無いときはエラーになる
- findの場合、部分文字列が無いときは-1を返す
 
とのこと。

「使い分けがあるの？」と疑問に思ったのでCopilotに質問。
> ### 使い分け
> - **エラー処理が必要な場合**：部分文字列が見つからない状況を明確にエラーとして扱いたい場合、`index` が適しています。例えば、絶対にその部分文字列が存在することを前提としている場合に使うと、バグを早期に検出できます。
>
>   ```python
>    try:
>        position = text.index("Python")
>    except ValueError:
>        print("部分文字列が見つかりませんでした")
>    ```
>
> - **コードの意図を明確にしたい場合**：`index` を使用することで、部分文字列が見つからなければならないという意図を明示できます。コードを読んでいる他の開発者に対して、ここでは部分文字列が存在することが前提であることを伝えることができます。

ふむふむ。…でも、これは「tryは多用すべきか」「どこでcatchすべきか」という、いつもの悩みにぶつかってしまうなあ…
とりあえず「2種類ある」ということだけ覚えておこう。

## 文字列その他

> replace メソッドは、指定した 部分文字列A を、別に指定した 文字列B で置き換えた文字列を作成します。 この操作では、元の文字列は変化しません。

> lower, capitalize, upper メソッドを用いると、文字列の中の英文字を小文字に変換したり、大文字に変換したりすることができます。これらの操作では、元の文字列は変化しません。

「元の文字列は変化しません」。大事なことなので復唱。
(どっちだかわからないときは、とりあえず左辺を書くようにしているけど:P)
`strip`も「元の文字列は変化しません」タイプ。

…
テキストの2-1終了。本日はここまで。
【TypeScript】enum を使わないほうがよい理由と代替手段

### はじめに

TypeScript の enum は一見便利そうですが、いくつかの理由から非推奨または「できるだけ使わないほうがよい」とされることがあります。以下、その理由を解説します。

### 1. JavaScriptにコンパイルすると余計なコードが生成される

TypeScript の enum は JavaScript にコンパイルされる際に、意図しないオブジェクトが生成されるため、コードサイズが増えたり、パフォーマンスが低下する可能性があります。

#### 例: TypeScriptのenum

```typescript
enum Color {
  Red,
  Green,
  Blue,
}
```

#### コンパイル後のJavaScript

```javascript
"use strict";
var Color;
(function (Color) {
    Color[Color["Red"] = 0] = "Red";
    Color[Color["Green"] = 1] = "Green";
    Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));

console.log(Color.Red);   // 0
console.log(Color[0]);    // "Red"（双方向マッピング）
```

このように、enum は 双方向マッピング（数値→文字列、文字列→数値の両方の変換）を持つオブジェクトに展開されます。この動作は enum の可読性を上げるためですが、コードサイズが増え、意図しない挙動の原因にもなります。

### 2. JavaScriptの標準機能と相性が悪い

TypeScript の enum は JavaScript の標準仕様には存在しないため、普通のオブジェクトや const で定義された値と比べて扱いにくい ことがあります。

特に `Object.keys(Color)` のような標準的なオブジェクト操作をすると、enum の双方向マッピングのため余計な値が取得される可能性があります。

### 3. const enum の制限

パフォーマンスを考慮して const enum を使うこともできますが、一部の環境では動かないため注意が必要です。

#### const enum の使い方

```typescript
const enum Color {
  Red,
  Green,
  Blue,
}
```

#### コンパイル後のJavaScript

```javascript
console.log(0); // 直接数値に置き換えられる
```

この方法ならば JavaScript に余計なオブジェクトが生成されず、最適化されます。しかし、Babel などのトランスパイラでは const enum がサポートされないことがあるため、使用できない場合があります。

### 4. 可読性と型安全性の問題

TypeScript の enum は、型安全性が低い ケースがあります。

例えば、enum の値はどんな数値でもセットできてしまうため、想定外の値が代入される可能性があります。

#### 例: enumに不正な値を代入

```typescript
enum Status {
  Active = 1,
  Inactive = 2,
}

let userStatus: Status = Status.Active;
userStatus = 3; // ❌ エラーにならない（意図しない値がセットできる）
```

これは enum が 型安全ではない ことを示しています。

### 5. 推奨される代替手段

最近のTypeScriptでは enum の代わりに、`as const` を使ったオブジェクト型 または Union Type（ユニオン型） を推奨するケースが増えています。

#### (1) `as const` を使ったオブジェクト型

```typescript
const Color = {
  Red: "Red",
  Green: "Green",
  Blue: "Blue",
} as const;

type Color = typeof Color[keyof typeof Color];

let myColor: Color = Color.Red; // ✅ 型安全
// myColor = "Yellow"; // ❌ エラー
```

**メリット**
- enum のような使い勝手
- 型安全
- 余計な JavaScript コードを生成しない

#### (2) ユニオン型を使う

```typescript
type Color = "Red" | "Green" | "Blue";

let myColor: Color = "Red"; // ✅ 型安全
// myColor = "Yellow"; // ❌ エラー
```

**メリット**
- enum よりシンプルで型安全
- JavaScriptに余計なコードを生成しない

### 結論

**enum が推奨されない理由**
1. 余計なJavaScriptコードが生成され、コードサイズが増える
2. JavaScriptの標準的なオブジェクトと異なる動作をする
3. `const enum` には環境依存の制約がある
4. 型安全ではない（不正な値をセットできる）
5. `as const` や ユニオン型 の方がシンプルで型安全

新しいTypeScriptのプロジェクトでは、enum を使わずに `as const` や ユニオン型 を使うことが一般的になっています。
〜自動化まで〜 Checkstyleでコードの品質を上げよう！

# Checkstyleとは？

Javaのコーディング規約を自動でチェックする静的解析ツールです！

開発者の書いたコードが一貫したスタイルになっているかを確認し、
問題があれば警告やエラーを出力することが出来る便利な代物です。

## Checkstyleのメリット

Checkstyle を導入することで、以下のようなメリットがあります。

### 1. **コードの品質向上**
一貫性のあるコーディングスタイルを維持でき、可読性が向上！

### 2. **レビューの効率化**
スタイルに関する指摘を自動化できるため、コードレビュー時余計な指摘を減らせる！

### 3. **バグの防止**
命名規則や不要なインポート、未使用の変数などを検出しバグの原因を撲滅！

### 4. **CI/CD での自動化**
自動化も可能です。
GitHub Actions等のCI/CD ツールを組み合わせることで、
コードの品質を自動でチェック可能です！

---

# Checkstyleを適用してみよう

## **1. GradleプロジェクトにCheckstyleを導入**

まず、`build.gradle`（または `build.gradle.kts`）に Checkstyle のプラグインを追加します。

### **Gradle (Groovy DSL)**
```gradle
plugins {
    id 'java'
    id 'checkstyle'
}

checkstyle {
    toolVersion = '10.12.4'
    configFile = file("config/checkstyle/checkstyle.xml")
}
```

### **Gradle (Kotlin DSL)**
```kotlin
plugins {
    java
    checkstyle
}

checkstyle {
    toolVersion = "10.12.4"
    configFile = file("config/checkstyle/checkstyle.xml")
}
```

## **2. Checkstyleのルールを定義する**

`config/checkstyle/checkstyle.xml` に Checkstyle のルールを設定します。以下はシンプルな例です。

```xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
    <module name="TreeWalker">
        <module name="Indentation">
            <property name="basicOffset" value="4"/>
        </module>
        <module name="LineLength">
            <property name="max" value="120"/>
        </module>
    </module>
</module>
```

## **3. Checkstyleを実行する**

以下のコマンドで Checkstyle を実行できます。

```sh
./gradlew checkstyleMain checkstyleTest
```

:::note info
`./gradlew check` を実行すると、Checkstyle 以外に
Lint チェックなども含めて確認できます！
:::

# GitHub Actions で自動化しよう

Checkstyle を GitHub Actions で自動実行し、コードの品質チェックを自動化することができます。

## **1. GitHub Actions ワークフローの作成**

`.github/workflows/checkstyle.yml` を作成し、以下の内容を追加します。

```yaml
name: Checkstyle

on:
  pull_request:
    branches:
      - main
  push:
    branches:
      - main

jobs:
  checkstyle:
    runs-on: ubuntu-latest

    steps:
      - name: リポジトリのチェックアウト
        uses: actions/checkout@v4

      - name: JDK 17 をセットアップ
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '17'

      - name: Gradle のキャッシュを設定
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: gradle-${{ runner.os }}

      - name: Gradle の実行権限を付与
        run: chmod +x gradlew

      - name: Checkstyle を実行
        run: ./gradlew checkstyleMain checkstyleTest
```

## **2. 実行結果を確認する**

このワークフローを GitHub にプッシュすると、`push` や `pull_request` の際に Checkstyle が自動実行されます。

エラーがある場合、GitHub Actions のログにエラー内容が表示されます。

# まとめ

- **Checkstyle** は Java のコード品質を維持するための静的解析ツール
- **Checkstyle の導入** でコーディングスタイルの統一、レビューの効率化、バグの防止が可能
- **Gradle に Checkstyle を追加し、ルールを設定することで簡単に適用可能**
- **GitHub Actions を活用すると、CI/CD パイプラインで自動化できる**

Checkstyle を活用して、品質の高い Java コードを書きましょう！
AsciidocのPDF変換方法

# はじめに
Asciidocなどの軽量マークアップ言語を使っている方向けの記事です。asciidocをpdfに変換する場合、asciidoctor-pdfというライブラリを使うと思います。ただ、このライブラリだと、痒いところに手が届かないことが多いです。
例えば、cssの設定を別のconfig.adocなどに記述している場合、pdfに変換すると、cssの設定がテキストとして表示されてしまうのです。
これでは、イケていないので、以下の`wkhtmltopdf`というコンソールアプリを使いましょう。

[wkhtmltopdf](https://wkhtmltopdf.org/downloads.html)

# 手順
. Asciidocをhtmlに変換
. htmlをwkhtmltopdfを使ってpdfファイルに変換

以上。
java 開発

　javaでアプリ開発をするには、というか
web開発するにはフレームワークを使うしかないと思い込んでいたのですが、
jsp,servletという機能を使ってアプリ開発できるのですね。
まずは小さい成功体験をつかむため簡単なアプリ開発に挑戦中です。
今日はservletについて学びました。サーバー側で動くjavaのプログラムであり、tomcatで自分のパソコンをサーバー環境にして、localhostで接続できました！

servletでHtmlを記述すると、javaで書くことになるのでprintlnで１行ずつ取り出してとても見にくかったです。
明日はJSｐを学びたいと思います
KBproject_備忘録_1_sub

## 2025-01-29, 2025-01-30
- 正答率を取得した
- 今
    ```/media/masarina/AItoKB_mac放1/作業机/projects/KB/2025-01-07_02-55-52/KB_Toolkits/取引自動化ツール/ball_pass_schedule_pattern/Players_TrainingTypePlayers/d_Gpt2TrainPlayerDir/Gpt2TrainPlayer.py
    """
    前回、lrを更新したにもかかわらず
    75％以上の精度を達成しなかった場合、正答params領域を飛び越えた可能性があるので、
    学習済みパラメータを前回のものに戻し、今回の学習がなかったことにする。
    そして、学習率(lr)をさらに小さくし、
    今回のシンボルを再学習する
    """
    ```
    の実装中
- 


まって、検証プログラムが、両方訓練データの推論結果がターミナルに出力されてる。


###lr更新条件を変える。

self.flag_dict = { # rina_configに追加
            "更新回数": 0,
            "前回更新🚩": False,
            "更新確認回数": 0,
            "ロード回数": 0
            }
result = validations_TrueAnswer_rate_from_predicting

#### lrを小さくしない条件
# 正常内に居る時 または 
# 初期学習時
▷(max_rate < result < min_rate) OR
    (self.flag_dict["更新回数"] == 0):
    ## フラグの更新
    self.flag_dict["更新回数"] += 0
    self.flag_dict["前回更新🚩"] = False
    self.flag_dict["更新確認回数"] += 1

#### lrを小さくする条件
# min_rateを初めて越した時 または 
# max_rateを越した時
▷(
 (min_rate > result) && 
 (self.flag_dict["更新回数"] == 0) OR
 (result > max_rate)
    ):
    ## 今回のデータをバックアップ(省略)
    ## lrに積算する重みを小さくする(省略)
    ## フラグの更新
    self.flag_dict["更新回数"] += 1
    self.flag_dict["前回更新🚩"] = True
    self.flag_dict["更新確認回数"] += 1

### 重み戻して lr*=0.9して 再学習する条件
# 前回Updateしたかつ、範囲外だった時
▷(self.flag_dict["前回更新🚩"]) &&
    ((max_rate <= result) OR # 以上
    (min_rate >= result))    # 以下
    # ⚠️ロードしないものを保持(省略)
    # 前回のバックアップをロード(省略)
    # 保持したものをロード物に上書(省略)
    # lrをさらに小さく
    lr *= 0.9
    ## フラグの更新
    self.flag_dict["更新回数"] += 1
    self.flag_dict["前回更新🚩"] = True
    self.flag_dict["更新確認回数"] += 1
    self.flag_dict["ロード回数"] += 1
非Nullアサーションと型アサーション

## はじめに
TypeScriptを業務で触り始めて2年経ちました。
「型って何？」というところから始まって、ある程度は書けるようになったものの、未だにコードを読んでて「？」となる事もあります。
最近は勉強会などで色んな人のLTのスライドを見た時に知らなかったことを記事にしました。

## 非Nullアサーション

変数の後に`!`があるのを非Nullアサーションといいます。
変数やプロパティの値がnullまたはundefinedではないことを保証するための記法です。
コンパイラに対して「ここではnullやundefinedは発生しないよ」と明示することで、型エラーを回避できます。

```typescript
let num: number;
initNum();
console.log(num! * 2); // エラーにならない
// 非Nullアサーション
function initNum() {
  num = 2;
}

```

初めてそれを見た時「え…論理演算子じゃないよね…？」ってなりました。

### 問題点

> 明確な割り当てアサーションと非Nullアサーションは、型の安全性を保証する責任をコンパイラからプログラマに移すものです。そして、型に関してはコンパイラより人間のほうがミスをしやすいです。なので、こうしたアサーションはできる限り使わないほうが安全性は高いです。

(サバイバルTypeScriptより)
つまりコンパイル時には問題なくても実行時にうまく動かない可能性があるので使わないほうが良さそうです。


## 型アサーション

> TypeScriptには、型推論を上書きする機能があります。その機能を型アサーション(type assertion)と言います。
TypeScriptコンパイラーはコードをヒントに型を推論してくれます。その型推論は非常に知的ですが、場合によってはコンパイラーよりもプログラマーがより正確な型を知っている場合があります。そのような場合は、型アサーションを用いるとコンパイラーに型を伝えることができます。型アサーションはコンパイラに「私を信じて！私のほうが型に詳しいから」と伝えるようなものです。

```typescript

const user:unknown = 'HANAKO'

console.log(user as number) 
```

上記のコードは当然エラーになります。
実際の型と異なる場合でも強制的に型変換が可能になってしまうので、実行時エラーになるようです。

では下記のコードはどうでしょう。

```typescript

const user:string = 'HANAKO'

console.log(user as number) 
```

サバイバルTypeScriptにも **「型アサーションはコンパイラーの型推論を上書きできるとは言っても、無茶な型の変換はできないようになっています」** と書いてあるように[TypeScript Playground](https://www.typescriptlang.org/play)で実際のコードを書いてみたところ以下のようなエラーが表示されました。

> Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.


## まとめ

非Nullアサーションも型アサーションも積極的に使わないほうが良さそうなのは理解できました。

## 参考

https://typescript-jp.gitbook.io/deep-dive/intro/strictnullchecks

https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion

https://typescriptbook.jp/reference/values-types-variables/type-assertion-as

https://typescriptbook.jp/reference/values-types-variables/definite-assignment-assertion

https://qiita.com/irico/items/9d71060e52ffc1e79962

https://zenn.dev/mrbabyyy/articles/0be002fedafef4
【備忘録】ReactのFeature-driven Architectureについて調べてみた。

https://userpilot.com/blog/feature-driven-development/

https://medium.com/react-weekly/feature-oriented-architecture-for-web-applications-2b48e358afb0

https://en.wikipedia.org/wiki/Feature-driven_development

https://momo-chienoki.com/DevelopmentMethodology/Agile_SoftwareDevelopment_FeatureDrivenDevelopment/
WLX313でWPA3-Enterprise 192 bitモード接続してみる

# はじめに
過去の記事で、RTX830を使って[RTX830を使ってバックアップ回線をUSBモバイルルータで作る](https://qiita.com/segfo/items/600d87015c77a63bde75)とかやってます。
エンプラ機使って遊んでますが、今回は自宅の無線LAN環境をWPA3-Enterprise 192Mode接続に対応させたいと思います。

# 動機
WPA2 PersonalなAPが乱立している中で、WPA3-Enterprise 192ModeのAPが有ったら「なにこれ？」ってなるじゃないですか。
周りの住人に陰ながらドヤれるという比較的自己満ムーブな遊びをできるわけですよ、というわけで結論を言うと自己満です！

# やっていき
というわけで、以下のようなAPがあるわけですが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/fe193369-4e4c-481c-9c6a-18dfb6991046.png)

WPA3-Enterprise 192bitモードは、認証方式をWPA3-EAPにして、192bit暗号を有効化することで強制されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/848ac9ea-bc7d-59f4-e394-96514101eaca.png)
 

:::note info
192bit暗号を使用しない場合は、WPA2-Enterprise及びWPA3-Enterprise混合モードで動作しますが、192bit暗号を有効化する場合はWPA3-Enterprise 192Modeとなり、後方互換性がなくなります。
対応端末でしか接続できなくなりますが、めっちゃカタい設定です。
:::

# RADIUSサーバの設定をしていき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/a5846f49-3a32-ff90-3df3-154997b55f8c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/c6f4663f-7b3a-51b6-0e6d-9a3071b79679.png)

:::note info
Android 11以降の端末では、ドメイン名の入力が必須になっています。
詳細は[WLX313 FAQ](https://www.rtpro.yamaha.co.jp/AP/docs/wlx313/faq.html)へどうぞ。
`wlx-radius-server.localhost`を入力するとパスできます。
この機能はWLX313の最新リビジョンであれば対応されています。ファームウェアのアップデートをしていない場合はしましょう。
（アップデートする場合は既存の証明書を再発行する必要があります）
:::

というわけで自己満の結果こうなりました。

![Screenshot_20250114-143911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/67d17b61-05c2-6f6c-b4f6-6efced415353.png)

# まとめ
- WLX313を使うとゆるふわエンプラスペックの無線APを建てられる
- 周囲のご家庭に何だこのAPは？　と思わせられる（自己満）

という効果がありますので導入をぜひご検討ください。
新品だと8～9万くらいあればこの環境を作れると思います！
【AWS】CodeBuildでエラー「apt-get: command not found」になった場合の原因と解決方法

# 概要
AWS CodeBuildでビルド時に以下のエラーが出ました。

> Running command apt-get update -y /codebuild/output/tmp/script.sh: line 4: apt-get: command not found

# 原因と解決方法
`buildspec.yaml`で`apt-get`コマンドを使用した際に、`apt-get`コマンドが見つからないと言われたエラーです。

イメージによっては、CodeBuildのビルド環境が`apt-get`をサポートしていません。
Amazon Linuxを使っている場合は`yum`を利用するとのこと（Ubuntuは`apt`みたい）。

CodeBuildプロジェクトからイメージを確認すると

> aws/codebuild/amazonlinux-x86_64-standard:5.0

とあるので、Amazon Linuxですね。

`apt-get`の代わりに`yum`を使用すれば解決しました。