OmniAICreator/Qiita-1.07M huggingface dataset:
M1 MacでVivadoが動いた！

## 概要

- ARM版MacでVivado/Vitisを動かすことができました！
- 実行環境: M2 MacBook Air (24GB)
- 必要なディスク空き容量: 約400GB

## 手順

### 1. Lima、XQuartz、Rosettaのインストール
```bash
$ brew install lima
$ brew install xquartz
$ softwareupdate --install-rosetta
```

### 2. Apptainerのコンテナを作成
```bash
$ limactl start template://apptainer --name=default --cpus=4 --memory=8 --disk=400 --vm-type=vz --rosetta --mount-writable --set=.ssh.forwardX11=true
```

- `--vm-type=vz`は、MacOSのVirtualizationを使用する仮想化環境を指定します。
- `--rosetta`は、Rosettaを有効にし、x86_64のバイナリを実行可能にします。
- `--cpus=8`や`--memory=16`などを指定して、リソースを調整します。
- メモリやSwapが足りないと前触れなくクラッシュするので注意して下さい。
- 以下のSIFイメージのビルドを行う場合は、`--disk=400`以上を指定して下さい。
- 詳細な設定は[Limaの公式ドキュメント](https://github.com/lima-vm/lima/blob/master/examples/default.yaml)を参照して下さい。
- ~~追記：--cpusを多くしすぎると、稀にsegfaultが発生するようです。~~
- 　↑単にVMのメモリ不足が原因でした。Swapを追加して解決しました。

### 3. Vivado/VitisのSIFイメージのビルド

```bash
# Limaにログイン
$ lima

# Swapを追加(1GBでも良いので必須)
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab

# SIFイメージのビルド準備
$ git clone https://github.com/jin0g/singularity-xilinx-vivado-vitis
$ cd singularity-xilinx-vivado-vitis
$ mv /PATH/TO/FPGAs_AdaptiveSoCs_Unified_2023.2_1013_2256.tar.gz ./

# SIFイメージをビルド
$ sudo apptainer build ./xilinx_2023.2.sif ./xilinx.def
```

- 事前に、Vivadoの統合インストーラー(SFD)を公式サイトからダウンロードします。
- Swapは必須です。メモリが十分にあってもSwapがないとハングアウトします。
- この手順をスキップして、事前にビルドした`xilinx.sif`をコピーしても良いです。
- ビルドスクリプトの詳細は[こちら](https://github.com/jin0g/singularity-xilinx-vivado-vitis)を参照してください。
- 追記: この後に一度、VMを再起動する必要があるかもしれません。コメント参照。

### 4. Vivadoの起動
```bash
$ lima apptainer exec ./xilinx_2023.2.sif vivado
```
- XQuartzが起動し、VivadoのGUIが表示されれば成功です。
- パス等を適切に通すことで、`$ lima vivado`のように簡単に起動できます。

## ベンチマーク

- 折角なので、仮想環境でVivadoのパフォーマンスはどうか調べます。
- 当然ですがMacネイティブでVivadoは動かないので、IntelのCPUと比較します。
- シングルコア性能がM2と同じくらいの、i9-12900Kを比較対象にしました。
- こちらのをVitis HLSで合成し、VivadoでBitstreamを合成しました。
- 追記: ベンチマークのスクリプトは[こちら](https://github.com/jin0g/vitis-hls-benchmark)です。

|    Platform   |Mem|Container Build|Vitis HLS|Vivado|
|:-------------:|:-:|:-:|:-:|:-:|
|Intel i9-12900K|128GB|6h| 14.6s | 260.4s |
|    Apple M2   | 24GB | 2h | 18.5s | 375.1s |

## 感想
- さすがに処理速度はネイディブより30\%ほど遅いですね。QEMUよりは爆速です。
- HLSの合成や、小規模な回路の合成なら、ARM Macでも実用的だと感じました。
- Vitisも動くと思うのですが、必要ライブラリなど確認していません。人柱募集します。
- ~~追記: LimaのVMの動作が不安定で、ハングアップすることが稀に良くあります。~~
- 　↑単にVMのメモリ不足が原因でした。Swapを追加して解決しました。

## TIPS
- 以下のようなスクリプトをMacに用意すると、利便性が向上すると思います。
- このスクリプトに実行権限を付与して、パスを通してください。
- ファイル名を実行したいコマンドにしてください(例えば`vivado`など)
```
#!/bin/sh
lima apptainer exec --bind $HOME ~/containers/xilinx_2023.2.sif $(basename "$0") $@
```
LeetCode 17. Letter Combinations of a Phone Numberの解説

#問題概要
2～9の数字を含む文字列が与えられたとき、その数字が表す可能性のあるすべての文字の組み合わせを返せ。答えを任意の順序で返せ。

数字と文字の対応表（電話のボタンと同じ）を以下に示す。1はどの文字にも対応しないことに注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165131/d71c11d4-d908-6a6b-ced7-5a16caffdb49.png)

例えば"23"という入力に対しては'2'に対しては'a','b','c'が、'3'に対しては'd','e','f'がそれそれひとつずつ割り当てられることになる。'2'が'a'を、'3'が'd'を選ぶと'ad'になる。

Example 1:

Input: digits = "23"
Output: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
Example 2:

Input: digits = ""
Output: []
Example 3:

Input: digits = "2"
Output: ["a","b","c"]

#答え
```
class Solution:
    def letterCombinations(self, digits: str) -> List[str]:

        phone = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"}
        res = []
        
        if not digits:
            return []
        
        def backtrack(combination, next_digits):
            if not next_digits:
                res.append(combination)
                return
            
            for letter in phone[next_digits[0]]:
                backtrack(combination + letter, next_digits[1:])
        
        backtrack("", digits)
        return res
```

注目するのはbacktrack()。再起的に呼び出されている。
combinationは"ad"のような文字列であり、最初は空で渡されbacktrack()が呼び出されるたびに文字を付け足していく。
next_digitsは"23"のような数字であり、呼び出されるごとに減っていき、最終的に空になる。
for文の中ではnext_digitsの最初の数字に当たる文字に対してbacktrack()をそれぞれ呼び出している。

例えば"23"であれば次に呼び出されるのは
backtrack('a', '3')
backtrack('b', '3')
backtrack('c', '3')
になる。

backtrack('a', '3')の次に呼び出されるのは
backtrack('ad', '')
backtrack('ae', '')
backtrack('af', '')

ここから先はnext_digitsが空なのでresにその文字列が追加され、return。

#コード改造
```
class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return []

        phone = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"}

        def backtrack(combination, next_digits):
            if not next_digits:
                yield combination
                return

            for letter in phone[next_digits[0]]:
                yield from backtrack(combination + letter, next_digits[1:])

        return list(backtrack("", digits))
```

グローバル関数resを消去するのと、データ節約にyieldを使う。（再帰関数にはyieldが使いやすい？）
```
yield combination
```
でデータを保持し、
```
yield from backtrack(...)
```
でデータを統合している。

これでよりbacktrack()が独立しやすくなった。
EC2をIPv6にする方法

2024年2月より、IPv4を利用すると1時間あたりで課金されると通達が、、、
いつかはIPv6にしないとなぁとぼんやり思っていたものの、めんどくさくてやってませんでしたが、お金が絡むと、優先順位が変わるみたいです。

今回は、EC2インスタンスをIPv6を有効にした形で起動する手順について、まとめようと思います。

# VPCの設定
まずは、VPNへIPv6 CIDRを追加します。
VPC設定画面より、設定を行うVPCを選択し、画面上部の"Action" -> "Edit CIDR"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/8a25418e-a246-a932-447f-11e830db0820.png)

"Add new IPv6 CIDR"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/24b7b6e9-459c-d5c8-1447-3f17ea0cae68.png)

"Amazon-provided IPv6 CIDR block"を選択し、Network border groupを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/654bc7fa-9bc8-f0d0-ea9c-b263ef211e19.png)

# Subnetの設定
次に、Subnetの設定を行います。

設定を行うSubnetを選択し、画面上部の"Action" -> "Edit IPv6 CIDRs"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/bb75a2a8-033c-254e-2995-23bdda8be334.png)

IPv6 CIDRを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/2a3c8ded-4c9f-59b8-30a2-11916e68a146.png)

IPv6アドレスを入力し、"Save"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/facae78b-a0c5-25d8-1c2b-7f081fc50bf0.png)

最後に、IPv6アドレスの自動割り当てを有効化します。

画面上部の"Action" -> "Edit subnet settings"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/e8f1838d-31e8-e55c-135e-574bbf8a9d3d.png)

"Enable auto-assign IPv6 address"をチェックし、"Save"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/e4c58a1f-053c-33a8-e765-24ef5fbea46a.png)

# Route Tableの設定
IPv6で通信するために、Route Tableの設定を行います。

設定するRoute Tableを選択し、、画面上部の"Action" -> "Edit routes"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/a7752ed7-7684-4c9c-0cf4-d46bcb74ac0c.png)

::/0に対し、Internet Gatewayへのルートを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/56a7e82f-6646-51cb-3927-d34ee011529a.png)

# EC2インスタンスの設定

:::note warn
既存のインスタンスに対して、IPv6を有効にすることは管理画面からでは無理そうだったので、新しいインスタンスを作成し、既存のDiskをアタッチする形で設定しました。
:::

EC2のインスタンスを新規に立ち上げます。
ポイントは、Network Settingのセクションで、以下の設定を忘れないことです！！
- IPv6の設定を行ったVPCを選択すること
- IPv6の自動割り当てにチェックすること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/f1ef4d83-8c90-314e-3ddf-bd989cf45b42.png)


Security Groupの設定に、IPv6アドレスからの通信が許可されていないと、SSHで接続することができないので、こちらも合わせて確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/9f32cbba-6b72-afe4-d9a4-d52fb2586955.png)

Puttyで接続する際は、設定次第ではありますが、以下でインスタンスに接続することができます。

- ec2-user@IPv6 address

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/d261ccdc-4b28-59d7-e2fa-b0219bf63056.png)

---
これで、EC2にIPv6で接続できるようになるので、不必要な課金を減らすことができるはず、、、、、
Auto Layoutの制約の付け方と削除の仕方

## 制約の付け方と削除の仕方

## Labelを配置して、制約の削除をやってみよう!
画面右上の`+`ボタンを押します。押すと部品となるオブジェクトを選ぶことができます。

![スクリーンショット 2023-11-20 6.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/41f1a2c7-4e8a-5229-4c2a-d3044cb48e15.png)

Labelを選択して、ドラッグ&ドロップで配置してみましょう。

![スクリーンショット 2023-11-20 6.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/42d3717d-3d14-929f-8176-01d6dfd9872e.png)

Labelを配置したら、画面右上の赤い丸で囲んだ場所をクリックします。
![スクリーンショット 2023-11-20 6.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/ec0f8d00-dc37-5106-47fa-324c1618854b.png)

赤い丸で囲んでいる場所で、Labelのタイトルと変えたり、テキストの色、フォントサイズを変更できます。
![スクリーンショット 2023-11-20 6.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/1cee7353-3007-8219-73f4-2c7e251dbe84.png)

画面右下のiconをクリックして、y軸とz軸を固定する制約をつける。

![スクリーンショット 2023-11-20 7.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/2b817033-5dca-6dd6-58c4-f82cf2587a38.png)
![スクリーンショット 2023-11-20 7.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/18a7f66c-9b14-9db0-a019-2f25a09aa50f.png)

もし、一を変えてもこのように、画面中央に固定されています。でも設定間違えたので制約を削除したい場合もある。
![スクリーンショット 2023-11-20 7.06.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/38fe8ef7-b341-e704-59ee-3127bd524b91.png)

こちらの青いiconの部分を選択して、delete keyを押せば制約を削除することができる。
![スクリーンショット 2023-11-20 7.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/02f48d57-b2e6-59e1-4eb6-ec8bbe0c989f.png)

もう一度ビルドすると、制約が削除されて画面上に、Labelを寄せることができました🙌

## 最後に
コード書いて、UIを作る技術とは文化が違うので戸惑うところが多かったです💦

こちらのサイトが参考になりました。
https://dev.classmethod.jp/articles/xcode-5-auto-layout-4/
mindの研究 その29

# 概要
mindが謎なので調べてみた。
練習問題、やってみた。

# 練習問題

mindで、数9を4個使って、1から15までの数を表す式をつくれ。

# サンプルコード

```

メインとは

	9から 9を 引く 9を 9で 割る 数値表示して 改行する

	9を 9で 割る 9を 9で 割る 加え 数値表示して 改行する

	9と 9を 加え 9を 加え 9で 割る 数値表示して 改行する

	9と 9と 9を 加え 9で 割る 複写 加え 数値表示して 改行する

	9と 9と 9を 加え 9で 割る 複写 加え 引く 数値表示して 改行する

	9を 複写 9を 加え 9を 加え 9で 割る 引く 数値表示して 改行する

	9と 9と 9を 加え 9で 割る 引く 数値表示して 改行する

	9と 9と 9を 捨てる 9で 割る 引く 数値表示して 改行する

	9から 9を 引く 9を 掛け 9で 数値表示して 改行する

	9を 9で 割る 9を 複写 9で 割る 加え  数値表示して 改行する

	9と 9と 9を 加え 9で 割る 加え 数値表示して 改行する

	9を 複写 9と 9を 加え 加え 9で 割る 加え 数値表示して 改行する

	9と 9と 9を 加え 9で 割る 複写 加え 加え 数値表示して 改行する

	9を 複写 9と 9を 加え 9で 割る 複写 加え 引く 加え 数値表示して 改行する

	9を 複写 複写 9を 加え 9を 加え 9で 割る 引く 加え 数値表示して 改行すること

```


# 実行結果

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


```

以上
再帰回数の限界

フラクタル図形のような自己相似図形を描くのに、再帰プログラムが、理にかなっていると思うのだが、多くのマンデルブロ集合プログラムは、再帰が使われていない。なにか不都合があるのだろうか。

簡単な例として、`1+2+3+`の再帰を考える。このプログラムは一見問題なさそうであるが、いざ実行してみると、値を増やしていくと、27000前後でstack　overflowのエラーを出す。関数から関数を呼び出すわけで、そのムダがちりつもになることは容易に総合できるが、意外と早く来た。
　まぁ、そういう理由でマンデルブロ集合も再帰プログラムではないのだろう。メリット少ないし。
　実行環境にかなり左右されるようで、実行の度に、エラーだったり、エラーでなかったりする。このあたり、うまくやるとコンパイラが、回避するコードに変換してくれるようだが、javaにはそういう機能はないらしい。
```java
void setup() {
  print(f(27000));
}

int f(int n) {
  if (n<=0) {
    return 0;
  }
  return n+f(n-1);
}
```
再帰を使わずに描くと、こうなる。
```java
int n=27000;
int s=0;
while(0<n){
  s+=n;
  n--;
}
print(s);
```
nはもっと大きくても問題ない。
計算結果は両者とも同じ。
計算時間は短すぎて計測不能。
※もちろんintの大きさを超えたら、おかしくなる。

よくあるフラクタルのコードは、この末尾再帰問題を回避したコードって、ことなんだろう。
オセロのコードなんかだと、再帰使うはずだけど、無限を目指すような分野では使えないってことね。







# 参考（末尾再帰最適化）
https://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0

https://note.com/moli9ma/n/n7a96550cf72d

https://qiita.com/tosh_m/items/2be312ba08c8b7ecb3b6
PlatformIOのSenseCAP Indicator用ボード定義ファイルを作る

2023/11/23: seeed_indicator_esp32.jsonにパーティション設定を追加
2023/12/3: タッチパッドの情報を追加
## 1. はじめに
購入してからしばらく放置していたSenseCAP Indicatorを使ってみようと思い、ビルド時の設定を調べていたところ、以下の記事を見つけました。この情報をもとにSenseCAP Indicator用のボード定義ファイルを新規に作ってみました。

https://qiita.com/fukuebiz/items/de6007c651255dd2458b

## 2. ボード定義ファイルをを作る
上記の記事を参考にしてボード定義ファイルを作ります。
ファイルC:\Users\%USERNAME%\.platformio\platforms\espressif32\boards\esp32s3box.jsonをコピーしてC:\Users\%USERNAME%\.platformio\platforms\espressif32\boards\seeed_sensecap_indicator.json(ファイル名は既に存在するものでなければ何でもよい)というファイルを作ります。
そして、以下の部分を修正します。
```diff
--- esp32s3box.json     2023-09-01 01:24:58.789845900 +0900
+++ seeed_indicator_esp32.json  2023-11-23 09:59:22.842950100 +0900
@@ -2,12 +2,13 @@
   "build": {
     "arduino":{
       "ldscript": "esp32s3_out.ld",
-      "memory_type": "qio_opi"
+      "memory_type": "qio_opi",
+      "partitions": "default.csv"
     },
     "core": "esp32",
     "extra_flags": [
       "-DBOARD_HAS_PSRAM",
-      "-DARDUINO_ESP32_S3_BOX",
+      "-DARDUINO_SEEED_INDICATOR_ESP32",
       "-DARDUINO_USB_MODE=1",
       "-DARDUINO_USB_CDC_ON_BOOT=1"
     ],
@@ -34,14 +35,14 @@
     "arduino",
     "espidf"
   ],
-  "name": "Espressif ESP32-S3-Box",
+  "name": "INDICATOR ESP32",
   "upload": {
-    "flash_size": "16MB",
+    "flash_size": "8MB",
     "maximum_ram_size": 327680,
-    "maximum_size": 16777216,
+    "maximum_size": 8388608,
     "require_upload_port": true,
-    "speed": 921600
+    "speed": 460800
   },
-  "url": "https://www.adafruit.com/product/5290",
-  "vendor": "Espressif"
+  "url": "https://www.seeedstudio.com/SenseCAP-Indicator-D1-p-5643.html",
+  "vendor": "SeeedStudio"
 }
```

## 3. プロジェクトを作る
SenseCAP Indicator用のプロジェクトを作ってみます。 Espressif32以下にあるボード選択リスト内に"INDICATOR ESP32 (SeeedStudio)"が追加されていますので、それを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193997/39655198-78eb-68e1-b2bd-f6c775f71526.png)

生成されたplatformio.iniは、以下のようになりました。
```:platformio.ini
[env:seeed_sensecap_indicator_esp32]
platform = espressif32
board = seeed_sensecap_indicator_esp32
framework = arduino
```
## 4. ビルドと書き込み
参考にしたページにあるプログラムをビルドし、書き込んでみました。LCDの左上にはStartと表示され、本体左上のボタンを押すと以下の文字列が表示されました。
```
[ 49179][I][main.cpp:264] loop(): [test] pressed
```
しかし画面をタッチしても、シリアルポートには何も出力されませんでした。これについては、引き続き調べてみようと思います。

## 5. タッチパネルの動作について
以下の場所に動作するタッチパネル設定がありました。

https://github.com/shi78ge/LovyanGFX/blob/master/src/lgfx_user/LGFX_ESP32S3_SenseCAPindicator_sample.ino

こちらもため沿てみようと思います。
Mac シェル　zrcとかbashとかの謎の解明

# シェルとは何？

ターミナルからコマンドを入力すると、OSやカーネルを操作させることができる機能

## シェルの種類

大きく分けると、

`
ログインシェル
`

と

`
非ログインシェル
`

の２種類がある

[ログインシェルの種類を詳しく解説してる記事](https://rainbow-engine.com/loginshell-nonloginshell-difference/)

ざっくり言えば、シェルの起動と操作に、ログインが必要か不必要か、ということだと思う。


## 自分のMacPCのシェルを確認してみよう

```
echo $SHELL
```

## bashとzrcの違い

bash：スタンダードなシェル
zrc：万能なシェル

zrcは、その他のさまざまなシェルの機能を網羅しているようです。
2023/11/20主にITとかセキュリティの記事

フォーティネットなど国内のネットワーク製品狙うサイバー攻撃が多数報告、警戒を(11/18)
https://news.mynavi.jp/techplus/article/20231118-2820790/

イスラエル・ハマス戦争から破壊目的のワイパーが増加、警戒を(11/18)
https://news.mynavi.jp/techplus/article/20231118-2818412/

米国／レガシー医療機器には将来のポリシーをサポートするためのデータの必要(11/18)
https://www.gmp-platform.com/article_detail.html?id=22524&lang=ja

10月ダークWeb調査結果、複数のランサムウェアグループが解体(11/18)
https://news.mynavi.jp/techplus/article/20231118-2820082/

2023年版 – 仮想通貨Chainlink ($LINK) とは？特徴と”将来性”を解説(11/18)
https://crypto-times.jp/chianlink/

中国工商銀を攻撃のハッカー集団、米金融機関２社にも攻撃と主張(11/18)
https://www.bloomberg.co.jp/news/articles/2023-11-17/S4A3XOT1UM0W01?srnd=cojp-v2

ウォレットのハッキング（および、あらゆる暗号資産エクスプロイト）と税金の関係(11/18)
https://www.coindeskjapan.com/208332/

個人開発におけるインフラ設計~どのような点に考慮するべきか~(11/17)
https://qiita.com/ryu235464345/items/fa0e4e458759183312d0

北朝鮮のサイバーが狙う全世界の軍事メーカー(11/18)
https://www.sankei.com/article/20231118-3JL66TXKX5N33NJR4AA7VKQYHI/

生成ＡＩ県が運用指針　翻訳やアイデア補助的に(11/18)
https://www.yomiuri.co.jp/local/aichi/news/20231117-OYTNT50145/

（短信）政府、「基幹インフラ」に210事業者指定　経済安保で(11/18)
https://www.nikkei.com/article/DGKKZO76237490X11C23A1EA3000/

トヨタ子会社、不正アクセス検知(11/18)
https://www.nikkei.com/article/DGKKZO76234830X11C23A1TB0000/

中高生に流行る「チェーンLINE」の実態と対処法--不幸の手紙、チェーンメールは現在も(11/18)
https://japan.cnet.com/article/35211710/

手元にあるのに解約？そのスマホ乗っ取られているかも(11/17)
https://www3.nhk.or.jp/news/html/20231117/k10014259641000.html

宮内庁長官による“皇族との極秘メール”誤爆事件　高度なプライバシーを含む私信が流出、危機管理は大丈夫なのか(11/18)
https://news.livedoor.com/article/detail/25373826/

「会社に恨みを晴らしたかった」39歳無職男を逮捕　勤務していた総合商社のシステムに不正アクセス(11/18)
https://nordot.app/1098442434670920366
JavaScript ループ（繰り返し）

## for文

```
//関数定義
function hasOdd(numbers) {

  result = false;
  for(i = 0;i < numbers.length;i++){
    s = numbers[i]
    o = s % 2;
    switch (o) {
      case 0:
        continue;
      default:
        result = true;
        break;
    }
    if(result == true){
      break;
    }
  }
  console.log(result);
}

//関数呼び出し
hasOdd([1, 2, 3, 4, 5])
```

例えば、このコードは、
受け取った関数の要素の中に、1つでも奇数があった場合には、trueをコンソール出力するプログラムです。




## do...while文




## while文



## for...in文

```
//関数定義
function square(numbers) {

  for(var item in numbers){
    numbers[item] = numbers[item] * numbers[item]
  }

  console.log(numbers);
}

//関数呼び出し
square([1, 2, 3, 4, 5])

```

## for...of文

```
//関数定義
function hasOdd(numbers) {

  result = [];
  for(let num of numbers){
    check = num % 2;
    switch (check) {
      case 0:
        break;
      default:
        result.push(num);
        break;
    }
  }
  console.log(result);
}

//関数呼び出し
hasOdd([1, 2, 3, 4, 5])
```

## labelについて



## continueについて



## breakについて
XiaoR GEEK Raspberry Pi TH Robotのサーボを自前で操作してみる

# 概要
XiaoR GEEK Raspberry Pi TH Robotを購入してさあ動かすぞとした際に、付属のライブラリが動かず、自前で動かすハメになりました。しかし、ソースコードやドキュメントといった情報がなかったので調べてみました。

# 困ったこと
そもそも以下のことに困っていました。
- 付属のライブラリがPython2用であり、かつ32bitのため最新のOSに対応していない
- 付属しているドライバ基板がPWR-A53-B2なのですが、ドキュメントはバージョンが古く、PWR-A53-Aを対象としている。回路図上ではサーボ信号とラズパイは直結ですが、実物をみると間にICが挟まっている
- そのICの通信は、ドキュメント上ではUARTで通信しているように見えるがそうじゃないらしい。どうもI2Cのように見える
- じゃあ自前で操作したろうと思っても、通信仕様がどこにもない

と言うことで大変困っていました。

# やったこと
## i2cdetect
なんとなくi2cdetectしてみると、0x17に反応あり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549340/c758b771-1f2a-1e30-4d04-db31ce2433fd.png)
他には何も繋いでないので、これがドライバ基板のICっぽい気がした。

## 制御
じゃあ、適当に書き込んだれと思いましたが、反応なし。
ただ、何回かi2cdumpするとサーボのトルクが0になる謎の挙動が。
色々調べていくと以下のことがわかった。
- i2c読み取りで制御しているっぽい
- 特定のフレームシーケンスでメモリアドレスを読み取ると動くっぽい

と言うことで、以下のフレームシーケンスで読み取ると何かしら制御できるっぽいことがわかった。

| 0 | 1 | 2 | 3 | 4 | 5 | 
| ---- | ---- | ---- | ---- | ---- | -  
| 0xFF | 0xFF | 0xFF | コマンド種別 | 値 | 0xFF | 
- コマンド種別: 制御対象となるモノ
- 値: 制御値 0x00-0xFEまでの値？

ちなみに先述の通りi2cdumpをするとicにリセットがかかる模様でしばらくトルクが0になります。


### コマンド種別
これらは全て当方による推測です。ご承知おきください。
| 種別番号 | 値 |内容 |
|----|----|----|
|0x01|角度 00-FE |Servo1 角度|
|0x02|角度 00-FE |Servo2 角度|
|0x03|角度 00-FE |Servo3 角度|
|0x04|角度 00-FE |Servo4 角度|
|0x05|角度 00-FE |Servo5 角度|
|0x06|角度 00-FE |Servo6 角度|
|0x07|角度 00-FE |Servo7 角度|
|0x08|角度 00-FE |Servo8 角度|

# サンプルコード
各サーボを0x10-0x70の範囲で動かします。

```python
import time
import smbus

if __name__ == '__main__':
    data=[
        [0xff,0xff,0xff,0x01,0x10,0xff,],
        [0xff,0xff,0xff,0x01,0x70,0xff,],
        [0xff,0xff,0xff,0x02,0x10,0xff,],
        [0xff,0xff,0xff,0x02,0x70,0xff,],
        [0xff,0xff,0xff,0x03,0x10,0xff,],
        [0xff,0xff,0xff,0x03,0x70,0xff,], 
        [0xff,0xff,0xff,0x04,0x10,0xff,],
        [0xff,0xff,0xff,0x04,0x70,0xff,],
        [0xff,0xff,0xff,0x05,0x10,0xff,],
        [0xff,0xff,0xff,0x05,0x70,0xff,],
        [0xff,0xff,0xff,0x06,0x10,0xff,],
        [0xff,0xff,0xff,0x06,0x70,0xff,],
        [0xff,0xff,0xff,0x07,0x10,0xff,],
        [0xff,0xff,0xff,0x07,0x70,0xff,],
        [0xff,0xff,0xff,0x08,0x10,0xff,],
        [0xff,0xff,0xff,0x08,0x70,0xff,],
    ]
    i2c=smbus.SMBus(1)
    addr=0x17
    for d in data:
        print(d)
        for c in d:
            # read
            _=i2c.read_byte_data(addr,c)
            time.sleep(0.05)
        time.sleep(1)
```
動画
![img.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549340/f538eec0-0d0d-a3a2-97f5-3810e26f307e.gif)

# 続き
しばらく動かしていたらアームのサーボが動かなくなりました。
カメラのサーボはどの端子に繋いでも動くのですが、アームの方はカタカタ言うだけで動きません。一応、手で支えてやると指定した角度で止まりますが・・・色々試していたら電流流せなくなったのかな。

なので、最終的には諦め別で用意したサーボコントローラを使用することとなりました。ちゃんちゃん。
JavaScript 条件分岐


# 条件分岐

JavaScriptの条件分岐コードには、

`
if
`

と

`
switch
`

の２種類がある


## if

```
if (条件式) {
    実行する文;
}
```

が、コードの基本形

例えば、


```
//関数定義
function checkTemperature(t) {

  if (t >= 30) {
    result = "Hot"
  }

  else if(t < 30 && t >= 15){
    result = "Warm"
  }

  else if(t < 15){
    result = "Cold"
  }

  console.log(result);
}

//関数呼び出し
checkTemperature(30)
```

というコードは、

もし、受け取った変数tに格納されている値が、

30以上だったら、Hot
30未満、15以上だったら、Warm
15未満だったら、Cold

と表示するプログラムである

## switch

```
function checkOddOrEven(s) {

  o = s % 2;
  switch (o) {
    case 0:
        console.log("Even");
        break;
    default:
      console.log("Odd");
      break;
  }

}

checkOddOrEven(2)

```

例えば、このコードは、

受け取った値が、偶数（2で割り切れる）場合には、Even
奇数（2で割った時、余が出る）場合には、Odd

になる
JavaScript コメントアウト （コメントの書き方）

## Jabascript コメント

JavaScriptのプログラムファイルには、コンピュータが実行をスルーしてくれる人間のためのメモ書きを記述できる


下記のようにかくと、
`
//
`
以降の文章が、コメントアウト（コンパイラが、コメントとして認識）される
```
// コメント
```

下記のように書くと、
`
/*
`
と
`
*/
`
の間の文章が、コメントアウトされる

```
/*
コメント
*/
```
Javascript 関数の作り方

# JavaScriptプログラマーによるJavascriptプログラマーのためのJavaScriptでの関数の作り方


```
function greet(name) {
  //関数の内容を書く
}
```

このように、関数は作成できる

例えば、

`
名前を受け取り、
挨拶する関数プログラムは、以下のように作成する
`

1. 挨拶関数greetを作る

2. greetを呼び出す


### 完成系

```
function greet(name) {
  var message = "Hello, " + name + "！"
   console.log(message)
}

greet("Hikaru");
```

のように記述する
【Tailwind】li要素のマーカーの色を設定する

## 概要
HTMLで箇条書き的な表示をする際に、li要素を使うと思います。
今回はTailwindで、この箇条書きの先頭のマーカー（中点）の色を設定したいという時にどうすればよいかメモ書きします。

## 対応方針
[How to get colored bullet list dots just using TailwindCSS utility classes](https://stackoverflow.com/questions/66983358/how-to-get-colored-bullet-list-dots-just-using-tailwindcss-utility-classes)の記事にある通り、classで`marker:text-green`のような指定で色を設定できます。

## 実装サンプル
上記で紹介した記事ほぼそのままですが、以下のような感じで色を設定できます。

<img width="210px"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/5558c987-e36c-85fc-b327-c1067477be7a.png" />

```html
<ul class="list-disc">
  <li class="marker:text-red-700">
    マーカーサンプル
  </li>
</ul>
```
コマンドを mac のアプリにする

# よく忘れるのでメモ

以下のようなコマンドを自作している。

mac の App バンドル用は .app ファイルにしてくれる make_app というコマンド。

て便利だけど、たまにしか使わないのでググったり gpt ったら出てくるようになったらいいので、ここに書いておく。

コードは以下

https://github.com/amachang/homebrew-random-scripts/blob/ff8d5db204db1b585b101fd4b8a7c6414a7b5deb/python/random_scripts/make_app.py

# 使い方

```
make_app -c 'mdimport -i /Volumes/HDD-* ~/Downloads' -a /Applications/Reindex.app
```

上の例だと Reindex.app が生成され、その app を実行すると mdimport コマンドを実行して Spotlight の index を更新してくれる。

# 作ったアプリは

Finder のカスタムバーに入れておくと便利

![スクリーンショット 2023-11-20 2.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21864/e95f2782-8e28-0f0d-09d4-46e9086466e2.png)
コミットメッセージを変更したい

# 初めに
コミットメッセージを間違えた経験って開発者なら誰でもあると思うんですよ。
初心者からしたらGit周りの操作を間違えると、もう取り返しのつかないことをしてしまった。。。という焦りを覚えるかと思いますが、コミットメッセージの修正はなんて凝ったありません！！
変更方法をまとめていますので、必要なときに見てください。

:::note alert
記載されている内容は、**プッシュする前**のコミットメッセージの変更方法です。
:::

### 目次
* 直前のコミットメッセージを変更する方法
* 2つ以上前のコミットメッセージを変更する方法

## 直前のコミットメッセージを変更する方法
まずは過去のコミットを確認しましょう。
```
git log --oneline
```

```
00000000 直前のコミット //ここのコミットメッセージを変更する
11111111 2つ前のコミット
22222222 3つ前のコミット
```
今回は、直前にコミットしたコミットメッセージを変更します。
直前のコミットを修正する場合は、`--amend`オプションを使用します。

```
git commit --amend -m "修正後のコミットメッセージ"
```

もう一度`git log --oneline`を叩いて実行結果を見てみましょう。
直前のコミットメッセージが修正されているはずです。

```
00000000 修正後のコミットメッセージ
11111111 2つ前のコミット
22222222 3つ前のコミット
```
## 2つ以上前のコミットメッセージを変更する方法

次は2つ以上前のコミットメッセージを修正します。
`git log --oneline`実行して、修正したいコミットメッセージがいくつ前のコミットなのかを確認します。

```
git log --oneline
```
実行結果
```
00000000 直前のコミット //1つ前のコミット
11111111 2つ前のコミット // 2つ前のコミット //ここのコミットメッセージを変更する
22222222 3つ前のコミット // 3つ前のコミット
```
今回は2つ前のコミットメッセージを修正したいので、以下コマンドの`HEAD~`の後に、`2`を入力して実行します。

```
git rebase -i HEAD~2
```
実行結果、以下のように2つ目のコミットが1番上に表示されている状態で、viエディタが開きます。

```
pick 11111111 2つ前のコミット
pick 22222222 3つ前のコミット

# Rebase ~~~~~
# ~~~~~~~~~~~~
```

viエディタが開いたら、編集モードに切り替えて、コミットメッセージを修正したいコミットの左に記載されている、`pick`を`edit`に変更します。
変更が完了したら、編集モードを終了し、保存してviエディタを終了させます。

```
edit 11111111 2つ前のコミット
pick 22222222 3つ前のコミット

# Rebase ~~~~~
# ~~~~~~~~~~~~

:wq // 入力してEnter
```

```
git commit --amend -m "修正後のコミットメッセージ"
```

直前のコミットメッセージ変更の操作と違って、2つ以上前のコミットメッセージを修正した際は、これで終わりではありません！
以下のコマンドで作業完了です。

```
git rebase --containue
```

必ず最後に確認しましょう。

```
00000000 修正後のコミットメッセージ
11111111 2つ前のコミット
22222222 3つ前のコミット
```

## 最後に

この投稿は再投稿になっているので、前回の記事はこちらになります！
もう少し詳しく説明している部分もあるので、見てみてください。
子要素への一括スタイリング

CSSセレクタ 「.test > *」 は、クラス名が .test である要素の直下に存在する全ての子要素にスタイルを一括で適用します。

・.test クラスに直接子要素として配置されているものに対象が限定される
・.test クラスの直下にある p、div、span などの子要素全てにスタイルが適用される
・.test クラスの直下にある子要素のみが対象。ネストされた要素は影響を受けない

同じスタイルを複数の子要素に適用したい場合、このセレクタを使用することで冗長なコードを避けられます。
<br>
<b>HTMLの例</b>
```ruby:index.html
<div class="test">
  <p>子要素1</p>
  <div>子要素2</div>
  <span>子要素3</span>
</div>
```

<b>CSSの例</b>
```ruby:style.css
.test > * {
  border: 1px solid #333;
  margin: 5px;
  padding: 10px;
}
```
Railsコールバックのchanged?って？

## きっかけ
「order_idが変わったらorder_statusの値を変更する」という実装でコールバックを使用した際に、
コールバックの挙動を理解できておらず躓いてしまったのでアウトプットとしてまとめてみました。

## ケース1
コールバック発火しない
```ruby:order.rb
  enum status: {
    unchecked: 0,
    checked:   1,
    error:     3
  }

  after_update :order_status_reset, if: -> { order_id_changed? }

  def order_status_reset
    self.unchecked!
  end
```
### 原因
after_updateではorder_id_changed?に該当しない。

after_saveも同様だが、changed?は
現在の値と変更しようとしている値を検証するもの。

そのため、updateやsaveした後は
すでに変更しようとした値は保存されており、
changed?は発火しない。

## ケース2
afrter_updateでは発火しないのでbefore_updateに変更したところ
updateが無限に呼ばれ以下のエラーが発生
```
SystemStackError: stack level too deep
```

```ruby:order.rb
  enum status: {
    unchecked: 0,
    checked:   1,
    error:     3
  }

  before_update :order_status_reset, if: -> { order_id_changed? }

  def order_status_reset
    self.unchecked!
  end
```

### 原因
before_updateでorder_status_resetメソッドが実行されるものの、
メソッド内でupdateが行われており、再びbefore_updateが発火(以降繰り返し)。

## 解決策
コールバックで呼び出したメソッドの中ではupdateやsaveは行わず代入で対応。

```ruby:order.rb
  enum status: {
    unchecked: 0,
    checked:   1,
    error:     3
  }

  before_update :order_status_reset, if: -> { order_id_changed? }

  def order_status_reset
    self.order_status = :unchecked
  end
```

## まとめ
・before_update系の中でupdateしてはいけない
・after_update系でchanged?は効かない

コールバックの中でも限られた部分ですが、参考になれば幸いです。
M5StackでLoRaWAN

この記事は、2023年の [M5Stack アドベントカレンダー](https://qiita.com/advent-calendar/2023/m5stack) の 3日目の記事です。

# はじめに

以前の記事でLoRaWANゲートウェイを設置し、LoRaWANへの接続方法を検証しました。

- LoRaWANを試す - ゲートウェイ編
- LoRaWANを試す - デバイス編

いよいよ本題（？）、M5StackでLoRaWANに接続してみます。

# 準備

今回はこのGroveユニットを使ってLoRaWANに接続します。商品ページの写真は古いですが、現在は技適マークもついていて国内で安心して利用することができます。このGroveユニットをM5Stackとシリアル接続します。M5Stackについている赤いGrove端子はI2Cでの利用が推奨されていますが、シリアルでも利用することができます。

https://www.seeedstudio.com/Grove-LoRa-E5-STM32WLE5JC-p-4867.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/c7077382-7d3d-e803-25d6-a4914d33599e.png)


### AWS IoTのデバイス登録

LoRaWANを試す - デバイス編 同様、ABPで接続します。

- DevEUIはプログラムを実行すると取得して表示します。
- NwkSKey、AppSKeyは固定で設定しています。下記のATコマンド仕様によると、デフォルトは「2B7E151628AED2A6ABF7158809CF4F3C」とのこと（34/58ページ）

https://files.seeedstudio.com/products/317990687/res/LoRa-E5%20AT%20Command%20Specification_V1.0%20.pdf

# プログラム

ソースは [こちら](https://github.com/fukuen/M5Stack-Lora-E5) です。

M5Stackには標準でLoRaWAN用のライブラリーLoRaWanが含まれていますが、今回は標準のライブラリーに含まれていないRTCの操作、温度の取得などのATコマンドを実行したいので、こちらの [andresoliva/LoRa-E5](https://github.com/andresoliva/LoRa-E5) ライブラリーを利用します。

AS923が指定できなかったり、使ってみるとデフォルトのタイムアウトでは短かったり、するので少し調整しています。

工夫した点としては、後述しますが、Groveユニットのフレームカウンター（ATコマンド仕様書ではUplink Counterと記載）がリセットされると0にリセットされるので、M5StackのPreferenceに最終のフレームカウンターを保存して、起動時に読み込むようにしています。

また、起動直後にWiFimanagerを利用してWiFi接続し、ntpでM5Stackのrtcを時刻同期した後、Grove-Wio-E5のRTCに時刻を書き込んで時刻合わせするようにしています。

1分間隔でバイナリーデータを送信するのと、BtnAを押すと温度を取得して送信します。

# 実行

1分間隔で、Wio-E5チップないの温度センサーの温度を取得して送信します。

AWS IoTのMQTTテストクライアントを利用してトピックをサブスクライブすると、次のように表示されます。PayLoadDataに送信された情報はBase64エンコードされているので、WebなどでBase64デコードすると、送信したJSON文字列が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/dfe5c013-daa4-9a8c-fe8a-acc52616f8c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/f872fdf3-26a0-de24-89da-bf730db696e7.png)


# 気づいた点

シリアル接続して、ATコマンドで操作できるので、非常に簡単に接続することができます。まだ、あまり使い込んでないですが、以下の点に気づいているので、今後確認していこうと思います。

- データが重複しないようにフレームカウンターがカウントアップされている。AWS IoTでは古いフレームカウンターを受信しない模様。Groveユニットがリセットされると0にリセットされるので、M5StackのPreferenceに最終のフレームカウンターを保存して、起動時に読み込むようにしている。AWS IoTのフレームカウンターの扱いがカスタマイズ可能か？
- データの送信に7秒程度かかっているが、通常なのか？　それとも自分の環境が遅いのか？
- ゲートウェイをしばらく停止した後、クライアントからの送信をAWS IoTの受信が再開しないことがある。フレームカウンター絡み？
- ゲートウェイを停止している際、Grove-Wio-E5の戻り値が送信失敗する場合と、見かけ上送信できているように見えるケースがある。
- まだ、OTAA接続できていない

# 最後に

どこまで離れても通信できるのか！？が気になるところですが、まだ時間が取れず試していません。。
Excelのコマンド、関数一覧【自分用】

# 目次
 * [はじめに](#はじめに)
 * [コマンド一覧](#コマンド一覧)
 * [関数一覧](#関数一覧)
 * [最後に](#最後に)
 * [参考サイト](#参考サイト)

 ## はじめに
Excelを使った業務が増えてきたので備忘録としてよく使う、今後使いそうなコマンドや関数を改めて自分用にざっとまとめてみました。

 ## コマンド一覧
以下、よく使っているコマンドから順にまとめました。

| コマンド | 説明 | コメント |
|:--------:|:----:|:-------:|
| Ctl+;  | 今日の日付を入力する  |  よく使う |
| Ctl+Z  | ひとつ前の操作に戻る  | うっかり間違えた時によく使う  |
| Ctl+Y  | ひとつ先の操作に進む  | Ctl+Zで戻りすぎた時に使う  |
| ctl+PgDn or PgUp  | シートの移動  | シートが多い時は使わないかも  |
| Ctl+矢印  | 矢印方向にワープ移動する  | 項目がたくさんあるシートに使えるかも  |
| Shift+Ctl+矢印  | セルを選択しながら矢印方向にワープする  | Shift+矢印やマウスでドラックして選択するより楽そう  |
| Ctl+Space  | 列を選択する  | 場合によってばこっちの方が楽そう  |
| **(半角モードで)** Ctl+Space  |  行を選択する |   |
| Ctl+D  | 上のセルを下にコピーする  | マウスや矢印キーで移動してコピペするより楽そう  |
| Ctl+R  | 左のセルをコピーする  |   |

## 関数一覧
こちらも使うものから順に一覧化しました。

| 関数 | 説明 | コメント |
|:-:|:-:|:-:|
| =VLOOKUP(検索値,範囲,列番号,検索方法)  | 条件に当てはまる値を指定した範囲内から自動的に探し出す  | 表の中から特定の値を探したい時に便利  |
| =COUNTIF(範囲,条件)  | 条件に合うデータの個数を数える  | 意外と使う  |
| =SUMIF(範囲,条件,合計範囲)  | 条件に合致する数値の合計を出す  |   |
| =MAX(セル範囲)  | 指定した範囲の最大値を出す  |   |
| =MIN(セル範囲)  | 指定した範囲の最小値を出す  |   |

## 最後に
基本的なものもあったかと思いますが少しでも参考になればと思います。
最後まで閲覧いただきありがとうございます。

## 参考サイト
https://excelcamp.jp/media/shortcut/5218/

https://excelcamp.jp/media/function/8387/
設計の目標　実行効率よりも保守性や再利用性が重視される時代に

### 設計の目標とは？

#### 最も重要なことは、要求仕様通りに正しく動かすこと。
ユーザーが期待する機能が実現できなければ、どんなに実行効率が良くても、優れたデザインパターンを駆使しても拡張性の高いソフトウェア構造になったとしても、何の役にも立たない。

#### 次の重要な目標は実行効率
ハードウェア能力が貧弱だった時代に求められたのは、少しでも早く動き、メモリやディスクなどのリソースを極力消費しないソフトウェアを作ることだった。

#### 保守性や再利用性が重視される時代に
しかし現在ではハードウェア能力が著しく向上した一方で、アプリケーションの規模が増大し、ソフトウェアの寿命も長くなったことから、実行効率よりも保守性や再利用性の方が重要になってきた。
web技術の基本を学ぶ

# はじめに
Web技術の基本の語句について備忘録としてまとめました。

## ステートフル
「状態」＝「ステート」
この状態を維持する仕組みをステートフルと呼ぶ。
前回のデータを保存して、データ保存した内容を処理結果に反映される仕組みのこと。

## ステートレス
ステートフルと反対で状態を維持しない仕組みをステートレスと呼ぶ。
前回のデータを保存しないため、毎回の入力のみによって一意に出力が定まる仕組みのこと。
Webで言えばリクエストとレスポンスの1回のやり取りで完結する。


## リクエスト
クライアントからサーバに対する要求をリクエストと呼ぶ。
WebブラウザからWebサーバー・ソフトに向かうのがHTTPリクエスト。

## レスポンス
サーバからクライアントに対する返答をレスポンスと呼ぶ。
HTTPリクエストに対する応答がHTTPレスポンス。
Webアクセスは、リクエストとレスポンスを繰り返すことで実現している。

## Cookie(クッキー)
Cookie(クッキー)とは、WEBサイトを閲覧したときに、ebサイトが将来必要とするであろうユーザーの情報を、スマホやPC内のブラウザにあらかじめ置いておくファイル（仕組み）。

数多くのサイトで利用されているが、クレジットカードなどの情報が保存されているため不正利用されるケースがある。
## プロトコル
「プロトコル」＝「規約」「手順」
要は約束事である。
IT関係では通信プロトコルを指すことが多い。

何かをするためにはそれに適したお約束があるので、プロトコルの種類がたくさんある。
ファイルの転送にはFTP、メールの転送にはSMTP、ホームページを見るときにはHTTPなどがある。

## ポート番号
ポート番号とはwebページを閲覧したり、データベースとやりとりするなど、アプリケーションと会話するための窓口の番号。
TCP/IPだけでは宛先など決めれるがどのアプリケーションが対応するかは決めれない。
ポート番号があらかじめ決まっていることによってそのポートを指定しているアプリケーションで対応することを取り決めることでできる。
ポート番号は、16ビットで最大「0～65535」まであり、ポート番号は、範囲ごとに3つの名前がある。

「ウェルノウンポート番号：0～1023」（TCPやHTTPなどの特定の通信プロトコルで使用されるポート番号群）
「登録済みポート番号：1024～49151」(よく使うアプリケーションに割り振られているポート番号群)
「ダイナミック/プライベートポート番号：49152～65535」(用途の決まっていないポート番号群)
UML 13種類のダイアグラム

:::note
UMLはオブジェクト指向に関する国際的な標準化団体であるOMGという組織によって採択され、１３種類のダイアグラムを規定している。
:::

|名称|用途|
|:-|:-|
|クラス図|クラスの仕様とクラス間の関係を表現する|
|複合構成図|全体ー部分構造をもつクラスの実行時の構造を表現する|
|コンポーネント図|ファイルやデータベース、プロセスやスレッドなどのソフトウェアの実装構造を表現する|
|配置図|ハードウェアやネットワークなど、システムの物理構造を表現する|
|オブジェクト図|インスタンス間の関係を表現する|
|パッケージ図|パッケージ間の関係を表現する|
|アクティビティ図|一連の処理における制御の流れを表現する|
|シーケンス図|インスタンス間の相互作用を時系列に表現する|
|コミュニケーション図|インスタンス間の相互作用を構造中心に表現する|
|相互作用概要図|条件によって異なる動作をするシーケンス図を、アクティビティ図の中に含めることで表現する|
|タイミング図|インスタンス間の状態遷移や相互作用を時間制約付きで表現する|
|ユースケース図|システム提供する機能と利用者の関係を表現する|
|ステートマシン図|インスタンスの状態変化を表現する|
【AWS】EventBridgeによるS3ファイルアップロードイベント起動の設定方法【EventBridge】

## はじめに
別のシステムが出力したファイルを使ってAWS環境で構築したシステムを実行する際に、そのファイルが連携されたことを検知してAWSサービスを実行したい要件があります。
今回の記事ではEventBridgeを使用したその要件の実現方法を記載しました。

## 使うAWSサービス
・Amazon EventBridge
・Amazon S3
・AWS StepFunctions

## アーキテクチャ図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/3c84e411-71c7-102b-24a3-99bd8e1a8111.png)


## アーキテクチャ説明
### 1．S3バケットの通知設定
①S3バケットのタブメニューから「プロパティ」を選択
![通知1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/016de794-fee1-9caf-a37a-9fa97bb1513c.png)
②「Amazon EventBridge」の「編集」ボタンを押下
![通知2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/a07ebdda-0872-c35a-c58f-3aa675e44fac.png)
③設定画面での通知を「オン」に設定する
![通知5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/bd4c3f58-e51e-0dff-5dc0-cbe88b59a02d.png)


### 2．EventBridgeの設定
①EventBridgeルールを作成
![EB1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/b08fa0ea-6976-54de-9d79-449c00d07b07.png)

②S3からの通知をイベントパターンとしてターゲットを実行するように設定
※今回はObjectCreated(オブジェクトのアップロード)を検知する
![EB2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/44275e09-2336-cee5-963f-52527f615abd.png)
※上記の設定だとバケット内のすべてのプレフィックスへのオブジェクトのアップロードが検知されてしまうため、必要に応じて「パターンを編集」ボタンから以下のような設定で検知範囲を絞ることも有効
```python:sample
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["test-bucket"]
    }, 
    "object": {  
      "key": [{  
        "prefix": "csv/"
        ※CSVというフォルダにファイルがアップロードされた時だけイベントを検知する
      }]  
    } 
  }
}
```
③特定のバケットからの通知を拾うときはバケット名を設定する
![EB3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/a12948c4-9f6a-14c8-fe30-79dbc3df953a.png)
④イベントを検知した後に実行するターゲットを設定する
![EB5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/1a6c1cd8-e3ff-7b79-08df-8cf427e0fc0f.png)


### 3．動作確認
①S3バケットにファイルをアップロード
![S3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/a5774f5c-2bfe-a40b-3704-18924965ac4d.png)

②StepFunctionsステートマシンが起動したことを確認
![StepFunctions1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/e5f02fc0-f509-20dc-7a7f-f55d33433b44.png)


## さいごに
EventBridgeは定時実行で深夜のバッチ実行によく使用される。しかし定時実行の場合、連携元のシステムが正常に稼働せず、ファイルの連携が遅れた場合に古いファイルのまま実行されてしまうことになります。
これを防ぐために、S3にファイルがアップロードされたことを検知して実行するようにすることで連携元のシステムのファイル連携が遅れても確実に新しいファイルでバッチ処理を実行することができます。

※次の記事で複数ファイルが全てアップロードされてからステートマシンを実行する実装例を記載しました

https://qiita.com/Nana_777/items/f81157e2e119a336e291
React oauthライブラリを使用し、ユーザー認可画面の表示を行う

### はじめに

個人開発メモ📝
※実装途中なので都度更新していきます。

### 使用言語

バックエンド　→ php/laravel
フロントエンド　→ React

laravel内にViteでReactを導入しています。

### 【１】Google OAuthのクライアント情報を作成する

作成手順は以下を参考にさせていただきました。
https://www.delftstack.com/ja/howto/react/react-use-google-oauth-authentication/

作成が終わると、クライアントIDとクライアントシークレットが取得できます。
※ダイアログを閉じても、後から認証情報詳細は確認できました。

### 【２】１で取得したクライアントIDとクライアントシークレットを.envファイルで管理する

```.env
// 省略
GOOGLE_CLIENT_ID=取得したID
GOOGLE_CLIENT_SECRET=取得したシークレット
GOOGLE_REDIRECT=設定時に記載したリダイレクト先
```
### 【３】react oauthライブラリの導入

```
npm install @react-oauth/google@latest
```
※reactのバージョンがv18だったので上記のライブラリを使用しました。
GitHub⇨https://github.com/MomenSherif/react-oauth

### 【４】認可画面表示の実装

ログインコンポーネントに追加しました。
```Login.jsx
import { GoogleOAuthProvider, useGoogleLogin } from '@react-oauth/google';

function loginUserForm() {

     省略

    return(
        {/* Googleログイン */}
        <div className={ Login.login__google }>
            {/* GoogleOAuthProviderでラップする */}
            <GoogleOAuthProvider clientId={ import.meta.env.VITE_GOOGLE_CLIENT_ID }>
                <ProsessToProvider />
            </GoogleOAuthProvider>
        </div>
    );
};

// Googleログイン処理
export function ProsessToProvider() {
  const login = useGoogleLogin({
    // 認証が成功した際に実行される、コールバック関数　※現時点ではまだ使用していません
    onSuccess: (codeResponse) => console.log(codeResponse),
  });

  return (
    <button onClick={ login }>Google Login</button>
  );
};
```

```
// laravelの.envファイルにあるIDを使用するため環境変数の呼び出し
<GoogleOAuthProvider clientId={ import.meta.env.VITE_GOOGLE_CLIENT_ID }>
```
今回、laravelにViteでreactを導入しているため、import.meta.envで呼び出しています。Viteの環境変数として呼び出す際には、先頭にVITE_を付ける決まりがあるそうです。
参考サイト⇨https://ja.vitejs.dev/guide/env-and-mode.html

上記の呼び出しを行うため、laravelの.envファイルも変更しています。
```.env
VITE_GOOGLE_CLIENT_ID=XXXXXXXXXXX
```

### 挙動確認

![スクリーンショット 2023-11-20 3.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/48a7aaf2-79a5-fe95-955c-4392d59dc8be.png)

![スクリーンショット 2023-11-20 3.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/fcb20ffc-1b8a-ecec-ec3f-ed84818572f1.png)

認可画面が表示されるようになりました。
別記事で今度は、認証を行なっていきたいと思います。
【Zod】ファイル拡張子のバリデーション

以下のようにすることでファイル拡張子のバリデーションを設定できます。

```js
const schema = z.object({
  avatar: z
    .any()
    .refine(
      (files) => ['image/jpeg', 'image/png'].includes(files?.[0]?.type),
      '.jpg, .jpeg, .pngのファイルを選択してください。'
    ),
})


```
初心者のメモ　自分用

## メモ

#### Windows Terminalで空のファイルを作成する方法

~~~puts 'Qiita'
type nul > {ファイルの名前}
~~~

#### Windows Terminalでファイルを開く
~~~puts 'Qiita'
start {ファイルの名前}
~~~


他に良い方法があれば教えてください。
確率統計学・統計検定学習備忘録　④標本平均と平均（値）に関する公式の意味の違い

普段より、自分のプログラミング等に関する質問に答えて下さっている皆様ありがとうございます。m( _ _)m　よろしければ統計検定の学習等にご利用ください（自分はそもそも存在を知ったのが１０月末で、来年受けます。※１年計画です。）
<h1>標本平均の定義と（数Ⅰ、数Bの標本平均の手前で習う）平均（値）との違い

標本平均の定義は次の通りです。（自分が持っている「青チャート数学Ⅱ・B」より）

「母集団から大きさ $n$ の標本を抽出し、変量 $x$ についてその標本のもつ $x$ の値を
$X_1$、$X_2$、・・・・・、$X_n$ とする。この標本を１組の資料とみなしたとき、
その平均値 
``` math
\begin{align}
\frac{1}{n} \sum_{i=1}^n X_i = \frac{1}{n}(X_1+X_2+・・・・・、+X_n) 
　を標本平均といい、\overline{X}と表す。」
\end{align}
```
___
これに対し、数Ⅰのデータの分析で出てくる平均値の定義は次の通り
（自分が持っている「青チャート数学I・A」より）

「大きさ $n$ のデータの値を$x_1$、$x_2$、・・・・・、$x_n$ とするとき、
``` math
\begin{align}
\frac{1}{n} \sum_{i=1}^n x_i = \frac{1}{n}(x_1+x_2+・・・・・、+x_n) 
　を平均値といい、\overline{x}と表す。」
\end{align}
```
____
<h3>これ何が違うん？？ただ、大文字と小文字が違うだけなんちゃうん？？(´д｀)？？と思われた方
。実は全然違います。
<h3>一般に数学では、大文字は集合やベクトル、小文字は要素やスカラー（ベクトルの中に入っている数値、日常の計算で使う数）を表します。

結果、
<h3>標本平均は「確率「変数」」なのに対し、
数Ⅰのデータの分析で出てくる平均値（や数Bの前半で（「期待値」として）出てくる平均 

$$E(X)$$

<h3>は基本的には「定数（として計算された値）」です。

___
**※数学Bの確率分布と統計的な推測の序盤に、確率変数 $X$と 、$X$として取り得る値$x_i（i = 1, 2, …,n）$に対する確率$p_k$に対して（「期待値」として紹介されて）**
``` math
\begin{align}
E(X)=\sum_{k=1}^n x_kp_k = x_1p_1+x_2p_2+・・・・・、+x_np_n 
\end{align}
```
と定義されていますが、上記の後者の方は、
``` math
\begin{align}
p_1 = p_2 =・・・＝ p_n = \frac{1}{n}
\end{align}
```
の状態を考えていることになります。
____
また、標本平均の平均
``` math
\begin{align}
E(\overline{X})
\end{align}
```
はイメージとしては、
``` math
\begin{align}
E(\overline{X})=E(E(X))
\end{align}
```
みたいなものを実は考えていることになります。そしてさらに、前回書いた

「確率統計学・統計検定学習備忘録　③標本平均・標本分散（※復元抽出）、数Ⅰと数Bの統計の違い①」https://qiita.com/thinking-weed/items/36a3eadf0035557a1714

では、**実は暗に復元抽出を考えている**のですが、非復元抽出だと、このQiitaに記したような式がかなり気持ち悪い感じに変態します。※後ほど詳しくQiita化します。
（冗長になるので今回はこのあたりで止めますが、）とりあえず抽出の概念の大まかなイメージとしては

<h3>復元抽出

「一回取り出した玉等（にあたる確率変数）を再度（袋や箱等に）戻して、**再度引ける状態にする**」⇒「**計算するときに母数が変わらない」⇒「べき乗を考える」ことが多い。**
<h3>非復元抽出

「一回取り出した玉等（にあたる確率変数）はもう（袋や箱等に）戻さない。**（＝再度引けない）**」⇒「**計算するときに母数が１ずつ減る」⇒「階乗を考える」ことが多い。**

<h1>よくお世話になっている参考資料一覧（※全部の内容を自分も理解できているわけではないです。）

・統計検定1級公式問題集　実務教育出版　
　※過去問のページもありました。　https://www.toukei-kentei.jp/prepare/kakomon/
・青チャートI＋A、Ⅱ＋B　数研出版
・理工系の微分積分学　吹田信之、新保経彦　共著　学術図書出版書
・線形代数入門　齋藤正彦　著　東京大学出版会
・定本　解析概論　高木貞治　著　岩波書店　
**・数学シリーズ　数理統計学　改訂版　稲垣萱生　著　裳華房（一番オススメ）**
・数学シリーズ　集合と位相　内田伏一　著　裳華房
・one point 推定と検定　鷲尾泰俊　著　共立出版
・電磁場とベクトル解析　深谷賢治　著　岩波書店
・シリーズ物理数学1　フーリエ解析　江沢　洋　著　朝倉書店
（※一見、統計とは全く関係なさそうですが、実は中に統計・確率に関する章があります。しかも結構詳しく書いてくれてある。江沢さんの本は難しいけど丁寧だから基本オススメ
【Webアプリ】想いはQRコードにのせて伝えよう。

## 今日も今日とて

帰宅すると、放置されたゴミを見つけてしまいました。
あれ？ゴミ捨て、頼んどいたよね？？？
って、何度も言うのも、自分も相手も疲れちゃいますよね。

## 無言の圧力
無言の圧力ってわかりますか？例を出しましょう。

>付き合って３年、彼女の家に行くと、机の上にゼクシィが置いてあった。

分かりやすい無言の圧力ですね。

**言葉にはしない、けど強めにこの思いを伝えたい。**
**そんなことを考えてWebアプリを作ってみました。**

## こんな感じになりました
### 使い方動画

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">QRコードの使い方って色々ありますね。<br>思いついたものを形にしたら、ちょっと尖ってしまった。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/Web%E3%82%A2%E3%83%97%E3%83%AA?src=hash&amp;ref_src=twsrc%5Etfw">#Webアプリ</a> <a href="https://twitter.com/hashtag/%E5%A4%AB%E5%A9%A6%E5%86%86%E6%BA%80?src=hash&amp;ref_src=twsrc%5Etfw">#夫婦円満</a> <a href="https://t.co/EckaAueEvC">pic.twitter.com/EckaAueEvC</a></p>&mdash; そってぃ (@sotan115) <a href="https://twitter.com/sotan115/status/1726239522764329356?ref_src=twsrc%5Etfw">November 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### アプリはこちら
https://6559bbc9ddbcd002b7210893--cozy-frangollo-d426a7.netlify.app/

### 使用場面
こんなとき、QRコードをそっと置いておきましょう。
* 夫担当のゴミ出しがされてなかったとき
* お願いしてたのに、放置された洗い物を見つけたとき
* 飲みかけのペットボトルがその辺に転がっていたとき etc...

## 使ったもの
* CodePen
* Bootstrap
* qrcode
* Local Storage
--以下使用言語--
* HTML
* CSS
* JavaScript

## コードはこちら
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="RwvxzOV" data-user="sotan115" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sotan115/pen/RwvxzOV">
  想いはQRコードで</a> by sotan115 (<a href="https://codepen.io/sotan115">@sotan115</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 補足

### Bootstrap
有名なCSSフレームワーク（私は今回初めて知りました）
特徴的なUIで簡単に見栄えをよくすることができる。
今回はタイトル部分やボタン部分に使ってみました。

### qrcode
動的にその場でQRコードを生成できる。
今回は文字を入れてQRコード生成する機能を取り入れてみました。
使いようによってはゲーム感覚で楽しめるアプリできそう。便利。

### Local Storage
ブラウザの中にデータを保持できる機能の一つ。
こちらを使って、相手にコメントを残しておく機能を追加してみました。
口で言えなければこちらにお返事しておきましょう。

## 反省点・改善点
* Bootstrapが便利だったものの、上手く使いこなせず。もう少し見やすい配置にしたかった。勉強不足。
* お返事機能にタイムスタンプをつけて、いつのコメントか分かるようにしたかった。
* 生成したQRコードを画像保存したい
* QRコードを読み取ったとき、アプリに飛べるようにしたい

## 疲れているのだろうか？
前回、Webアプリを学んだときに作ったアプリはこれだった↓

https://qiita.com/sotan115/items/69296cb927605ec01520

今回も、ちょっと尖ってますね。。
でもこのほうが、口で注意されるより、ちょっとクスッってなりませんか？
（とかいってイラッとするほうが大多数だったらどうしよう・・）
家族に見つかったら怒られそうなアプリになっちゃったけど
使い道はいろいろあると思ってるよ！！！！！！
**ポジティブに使っていこうぜ！！！！**
N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力 Python3編

今日の最後の問題
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_boss

>1 行目に整数 N が与えられます。
>2 行目から (N + 1) 行目までの先頭に整数 M_i (1 ≦ i ≦ N) が与えられます。それに続いて >M_i 個の整数 a_1, ..., a_{M_i} が与えられます。
>上から i 番目、左から j 番目の整数は a_{i,j} です。
>N 行の a_1, ..., a_M をそのまま出力してください。

というもの。
以前の復習とちらっと新しい学習要素が。
どうしても次の要素からというのが見つからず。
じゃあ配列の要素を削除しちゃおう、ということで。
調べてきました。
配列の最初の要素を削除する、というもの。
`del tmp[0]`
でできる。
これを使って下記のようにした。

```py
N = int(input())
arr = []
for i in range(N):
    tmp = input().split(" ")
    del tmp[0]
    arr.append(tmp)

for i in range(N):
    print(*arr[i])

```

他にも方法があり
tmpはそのままいれて、
appendするときに、配列の[１:]とするもの。
なるほど〜！

```py
    tmp = list(map(int, input().split()))
    a.append(tmp[1:])
```

これにて本日の課題はおしまい〜！
AIがテストコードを秒速で生成！？VSコード＋Copilotの驚きの力

# はじめに

VSコードの魅力的な拡張機能、GitHub Copilotを紹介します！特に便利なのが、テストコードを自動生成する機能です。これで手間のかかるテスト作成から解放されますよ。

# Copilotの特長

GitHubが提供するCopilotは、AIを活用してコードの提案や補完を行います。その中でも、テストコードの自動生成機能は特に注目に値します。AIは膨大なコード例とパターンから学習しており、生成されるテストコードは正確性と網羅性に優れています。

# テスト自動生成の手順

対象コードの選択: VSコードでテストを作成したいコードを選択します。
右クリックで操作: 選択したコードを右クリックし、「Copilotタグ」を選びます。
テスト生成: 「Generate Test」をクリックして、AIによるテストコードの生成を開始します。
このプロセスにより、AIはコードを分析し、適切なテストケースを自動生成。これにより、時間の節約だけでなく、エラーの少ない、信頼性の高いテストが可能になります。

# まとめ

VSコードとCopilotで、テストコード作成はもう簡単。このツールで時間を節約し、クリエイティブな開発にもっと集中しましょう。AIの力を活用して、開発をもっと楽しく、効率的に！
AWSクラウドプラクティショナー初学者が引っかかった用語まとめ

# はじめに
新卒入社した2023年、5月にAWS未経験でAWSクラウドプラクティショナーの試験を受け無事に合格しました。勉強をしていた際、個人的になかなか覚えられず頻繁に間違えた用語をまとめてみようと思います。

# 1.アカウント関連
- AWS Organizations ・・・複数のAWSアカウントを統合管理する。アカウント自体のコントロールをするサービス。
- IAM ・・・ユーザーのAWSリソースへのアクセスを管理する。アカウント自体のコントロールはできない。

# 2.ストレージ関連
- EFS・・・複数のEC2インスタンスから共有利用できるファイルストレージサービス。
- EBS・・・EC2にアタッチするブロックストレージサービス。複数のEC2インスタンスから共有利用はできない。
- インスタンスストア・・・一時データ保存に利用されるEC2インスタンス向けのストレージ。一時的なデータしか保存ができない。
- S3・・・インターネット対応のオブジェクトストレートサービス。複数のEC2インスタンスから接続・共有可能。

# 3.ファイアーウォール関連
- AWS WAF ・・・ウェブアプリケーションを一般的な脆弱性から保護するファイアウォールサービス。
- AWS Shield ・・・AWSリソースをDDoS攻撃から保護するサービス。


# 4.請求・料金関連
- TCO計算ツール・・・オンプレミスで構築した場合とのコスト比較に利用する。現在は廃止されている。
- Cost Explorer・・・月額コストの予測分析するツール。
- AWS Pricing Calculator・・・ユースケースのコストを見積もる際に利用するツール。

# 5.マルチAZ関連
###### デフォルトでマルチAZのサービス
S3、DynamoDB
###### マルチAZが利用不可のサービス
EBS

# 6.AWS ConfigとAmazon Inspector
- AWS Config・・・リソース設定を継続的にモニタリングして、設定が適切にされているかの評価を自動で行う。
- Amazon Inspector・・・EC2上にデプロイされたアプリケーションの脆弱性診断を自動で行う。

# 7.Elastic BeanstalkとOpsWorks
- Elastic Beanstalk・・・アプリケーションのデプロイを自動化する。
- OpsWorks・・・インフラの設定を自動化する。

# 8.セキュリティグループとネットワークACL
- セキュリティグループ・・・EC2インスタンスに対するトラフィックを制御する。許可するインバウンドのポートと送信元のホワイトリストを設定する。
- ネットワークACL・・・サブネットに対するトラフィックを制御する。拒否するインバウンドのポートと送信元のブラックリストを設定する。

# 9.Global AcceleratorとCloudFront
- Global Accelerator・・・アプリケーションのパフォーマンスを向上させるサービス。
- CloudFront・・・コンテンツ配信を最適化するサービス

# おわりに
模擬試験や実際の試験では紛らわしい選択肢がたくさん出てきます。
私はこのような紛らわしい用語たちをノートにまとめていたのですが、とても役に立ちました。
今回問題演習に使ったのはUdemyの「この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集」です。
これを80~90%解けるようになれば合格できると思います。
次はソリューションアーキテクトアソシエイトに挑戦したいです。
CHCPコマンドの使い方

# はじめに
障害調査のためコマンドプロンプトにてログを採取し、
出力されたファイルを開いてみると文字化けしていました。

原因を調べてみると文字コードの設定が関係していました。

# 文字コードとは？
文字コードとは、文字をコンピュータで処理したり通信したりするために文字の種類に番号を割り振ったものです。

今回、文字化けしてしまった原因は、出力されたログの文字コードとコマンドプロンプトのデフォルトの文字コードが違っていたため文字化けが起こってしまいました。

# CHCPコマンドの使い方
以下のようにCHCP コマンドを実行するとコマンドプロンプトで使用される文字コードを変更できます。

```
CHCP [nnn]
```

CHCP コマンドの引数には文字コードを表すコードページ番号を指定します。

コマンドプロンプトのデフォルトの文字コードは「Shift_JIS」でコード番号は「932」です。このとき私が変更したかった文字コードは「UTF-8」なので、コードページ番号は「65001」です。

文字コードをUTF-8に変更するには次のように実行します。

```
CHCP 65001
```

これで文字化けも直り、正しい文字コードでログを確認でき、
障害調査を行うことが出来ました。

# 参考
- 知っておきたい！ 文字コードの基礎知識 ……ASCII，シフトJIS，Unicode etc.
　https://gihyo.jp/book/pickup/2019/0006

- 文字コードの設定(CHCP)
　https://www.javadrive.jp/command/display/index5.html
メモとして使ってみる

雑多なメモもインターネットの到達性の高い場所に残した方が、結果的に AI が学んでくれて自分が便利になるかもしれないのでメモをプログラミングや計算機器や計算資源に関するメモは Qiita に書いていこう

なんか投稿しようとしたらタグ付けしろと言われたけど、そういうのはもう人間がやる時代ではないのではないか。
N 行 M 列の整数の入力 Python3編

前回と似たような課題
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step4

>1 行目で整数 N と整数 M が与えられます。
>2 行目以降で N 行 M 列の行列が与えられます。上から i 番目、左から j 番目の整数は >a_{i,j} です。
>N 行 M 列の行列をそのまま出力してください。

```py
arr = list(map(int,input().split()))
N = arr[0]
M = arr[1]

arr = []
for i in range(N):
    value = list(map(int,input().split(" ")))
    arr.append(value)

for i in range(N):
    print(*arr[i])

```
内容としてはこれでOKなんだけど、
最初の部分はもっと簡単にできる方法があるそうだ。

```py
N, M = map(int, input().split())
```
なるほど〜。これはもっと簡単になった。
覚えておこう。
[Riverpod] StateNotifier Class 内で別のStateProviderを呼び出す。Flutter で変数内で別の変数を呼び出す

riverpods でグローバル変数を定義している場合、変数が変わった場合、別の変数も変更する必要があったので、解決策を以下に示しておきます。

# 背景
30秒広告を一度見たら、「24時間広告が表示されなくなる」という機能を作る場合、
StateNotifer Class 内で別のStateProviderを呼び出す必要が出てきました。もっとわかりやすく説明すると、riverpod でグローバル変数を定義している場合、変数が変わった場合、別の変数も変更する必要が出てきたわけです。


# 解決策
例えば、以下の二つの変数があり、片方がもう片方に依存している関係にあるとします。
1. 「アプリ内に広告を表示するかどうか」のフラグ（showAds）
1. 「24時間広告を表示しないため」の時刻の変数（noAdsUntilDateTime）

上記の場合、1が2に依存しているわけです。

この場合、Dart コードは以下のようになります。

```dart

// whether showing ads or not 
final showAdsProvider = StateProvider((ref) => true);

// don't show ads if user has watched rewarded ad in last 24 hours
final noAdsUntilDateTimeProvider =
    StateNotifierProvider<NoAdsUntilDateTimeController, DateTime>(
        (ref) => NoAdsUntilDateTimeController(ref));

class NoAdsUntilDateTimeController extends StateNotifier<DateTime> {
  final StateNotifierProviderRef ref;
  NoAdsUntilDateTimeController(this.ref) : super(DateTime(0)) {
    init();
  }

  // initialize
  Future<void> init() async {

    // get the date that stops the ads until its time.
    state = await PreferenceKeyUtil().getDateTime(
        PreferenceKey.NO_ADS_UNTIL_DATE_TIME,
        defaultVal: DateTime(0));

    // if the no-ads time bonus is valid.
    if (state.isAfter(DateTime.now())) {
      // set showAds = false
      ref.read(showAdsProvider.notifier).state = false;
    }
  }

  // update no-ads date and set the current date.
  void updateDateTime(DateTime dateTime) async {
    state = dateTime;
    PreferenceKeyUtil()
        .setDateTime(PreferenceKey.NO_ADS_UNTIL_DATE_TIME, dateTime);

    // set showAds = false
    ref.read(showAdsProvider.notifier).state = false;
  }
}

```


こんな感じ。もっとわかりやすく一般化すると↓

# わかりやすく

aaa_StateProvider が、 BBB_StateNotifierClass に依存している場合。
（aaa_StateProvider を BBB_StateNotifierClass 内で呼び出す場合）

```dart

final aaa_Provider = StateProvider((ref) => true);


final BBB_Provider =
    StateNotifierProvider<BBB_Controller, DateTime>(
        (ref) => BBB_Controller(ref));

class BBB_Controller extends StateNotifier<DateTime> {
  final StateNotifierProviderRef ref;
  BBB_Controller(this.ref) : super(DateTime(0)) {
    init();
  }

  Future<void> init() async {
     state = dateTime;
  }

  void change_aaa_Provider() async {
    ref.read(aaa_Provider.notifier).state = false;
  }
}

```

みたいな感じ