OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon EKSでGrafanaを利用する

# はじめに
Amazon EKSで [Grafana](https://grafana.com/) を利用する方法をまとめます。
Mac環境を想定しています。

# 実行環境の準備
1.  AWS CLIの設定
[AWS CloudFormationを動かすためのAWS CLIの設定](https://qiita.com/miyabiz/items/fed11796f0ea2b7608f4)を参考にしてください。

1.  EKSクラスタの構築
[Macでeksctlを利用してAmazon EKSのクラスターを構築する](https://qiita.com/miyabiz/items/75f83237795b0b7d52bd)を参考にしてください。

1.  EKSのコンテキストの設定
[MacにてAmazon EKSの設定をする](https://qiita.com/miyabiz/items/b98d145cedb35dab9524)を参考にしてください。

1.  Helmの設定
[Amazon EKSでHelmを利用する](https://qiita.com/miyabiz/items/453361e6af64b324443c)を参考にしてください。

1.  Prometheusの設定
[Amazon EKSでPrometheusを利用する](https://qiita.com/miyabiz/items/4ab6999c91b3a07c67aa)を参考にしてください。

# 環境設定
1.  `grafana.yaml` を作成する

    ```yaml:grafana.yaml
    datasources:
      datasources.yaml:
        apiVersion: 1
        datasources:
        - name: Prometheus
          type: prometheus
          url: http://prometheus-server.prometheus.svc.cluster.local
          access: proxy
          isDefault: true
    ```

1.  Grafana のチャートをHelmでインストールする
    ※事前にKubernetesクラスターのコンテキストの設定をします。

    ```sh
    # Grafana　チャートリポジトリを追加する
    helm repo add grafana https://grafana.github.io/helm-charts

    # Grafana のチャートをインストールする
    helm install grafana grafana/grafana \
        --namespace grafana \
        --set persistence.storageClassName="gp2" \
        --set persistence.enabled=true \
        --set adminPassword='${パスワード}' \
        --values grafana.yaml \
        --set service.type=LoadBalancer \
        --create-namespace

    # Grafana がインストールされたことを確認する
    helm list -n grafana
    ```

1.  Grafana パスワードを確認する
    ※デフォルトの username は `admin` になります。

    ```sh
    kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
    ```

1.  Grafana にアクセスする
    ※ELBが構築されるまで、数分アクセスできないことがあります。

    ```sh
    open "http://$(kubectl get svc -n grafana grafana -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')"
    ```

# クリーンアップ

1.  GrafanaをHelmで削除する

    ```sh
    helm delete grafana -n grafana 
    ```

1.  Namespaceを削除する

    ```sh
    kubectl delete ns grafana
    ```

# 参考
[DEPLOY GRAFANA](https://www.eksworkshop.com/intermediate/240_monitoring/deploy-grafana/)
2022/10/21主にITとかセキュリティの記事

「PAN-OS 8.1」に認証回避のおそれ - サポート対象機種にも注意を
https://www.security-next.com/140712

脆弱性対策情報データベースJVN iPediaの登録状況 2022年第3四半期（7月～9月）(10/20)
https://www.ipa.go.jp/security/vuln/report/JVNiPedia2022q3.html

マイクロソフト、新しいセキュリティ更新プログラムの配信方法を案内(10/19)
https://scan.netsecurity.ne.jp/article/2022/10/19/48357.html

バッファロー製ルーター等77製品に脆弱性。不正アクセスなどの恐れ。内26製品はサポート終了で使用停止を呼びかけ(10/19)
https://www.nichepcgamer.com/archives/buffalo-routers-multiple-vulnerabilities-cve-2022-40966-etc.html

2022年10月Oracle製品のクリティカルパッチアップデートに関する注意喚起(10/19)
https://www.jpcert.or.jp/at/2022/at220029.html

サイバー攻撃、２４％の企業が「１年以内に被害」回答　ウクライナ侵攻直後からは大幅減(10/19)
https://www.sankei.com/article/20221019-4KWSWSO5RZB4XEP42OLYPOOMF4/

警察庁、北朝鮮の下部組織とされるラザルスによるサイバー攻撃に注意喚起(10/19)
https://scan.netsecurity.ne.jp/article/2022/10/19/48358.html

名和氏が語る、サイバー攻撃激化プロセスを加速させているのは誰か？　その要因は？(10/19)
https://atmarkit.itmedia.co.jp/ait/articles/2210/19/news004.html

偽造免許証でスマホをMNPし二段階認証を突破、1千万円が引き出される被害(10/19)
https://www.zaikei.co.jp/article/20221019/693966.html

短縮URLを展開してフィッシング詐欺を見破る！「事例」三井住友カードサービスの緊急連絡(10/18)
https://iimono.town/topic/it/119064/

リスク担当者も押さえておきたい暗号資産の基礎知識
【11月1日開催】2022年11月ITリスク勉強会
https://www.risktaisaku.com/articles/-/73424

「えきねっと」でグーグル検索→最上部に詐欺サイト　「これは気付かない...」JR東が削除依頼＆注意喚起(10/19)
https://news.biglobe.ne.jp/it/1019/jc_221019_4485182638.html

カカオ大規模接続障害の翌日、北はハッキングを試みていた(10/19)
https://www.chosunonline.com/site/data/html_dir/2022/10/19/2022101980010.html

半分が犯罪利用？ビットコインの｢不都合な真実｣ 違法取引､詐欺､消失……暗号通貨の暗い一面(10/19)
https://toyokeizai.net/articles/-/623594

セキュリティ投資では「データ侵害防止」と『リモートワーク』が重要視　ウィズセキュアが調査結果を発表(10/18)
https://enterprisezine.jp/news/detail/16810

非効率業務を打破しコミュニケーションを高速化させるデジタルを用いた小売業の働き方改革(10/19)
https://diamond-rm.net/technology/229734/

「えきねっと」酷似、ＵＲＬ末尾が「．ｒｕ」のロシアサイト…グーグル検索で一時上位に(10/19)
https://news.goo.ne.jp/article/yomiuri/nation/20221019-567-OYT1T50216.html

Slackが5年放置した脆弱性をアップデート　背景にはあるベンダーの存在が？(10/19)
https://kn.itmedia.co.jp/kn/articles/2210/19/news007.html

PolygonScan（ポリゴンスキャン）とは？概要や使い方を解説(10/19)
https://crypto-times.jp/polygonscan/

「AVG」「アバスト」アンチウイルスが「Thunderbird」のアップデートを妨げる問題
AVASTは修正したベータ版をテスト中(10/19)
https://forest.watch.impress.co.jp/docs/news/1448802.html

ネットワークエンジニアの業務内容とは(10/19)
https://note.com/primalcolors/n/n6ea252f5e1a1

Disney+からTikTokまで、世界最悪のプライバシーポリシーはこれだ(10/19)
https://forbesjapan.com/articles/detail/51141

どうする？　企業内PCの4割超が「Windows 11」にアップグレード不可という現実(10/19)
https://atmarkit.itmedia.co.jp/ait/articles/2210/19/news052.html

DevOpsはここから始めよう(10/19)
https://thinkit.co.jp/article/19915

TikTokが安全保障協定締結後もデータ流出の懸念は残る(10/19)
https://www.axion.zone/tiktok-5/

デジタル庁のガバクラに米メガクラウド4社が参入、国産勢が応募できない壁は何か(10/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07267/

安くなくても採用が2年間で3倍に、SASEは日本企業のセキュリティーを変えるか(10/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00138/101801140/

どうするデータベースのクラウド移行体制、DBAやDAの役割は？(10/20)
https://xtech.nikkei.com/atcl/nxt/column/18/02196/100600002/

物事を考え抜き迷子になろう　理詰めで見つかる正解はない(10/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020900021/101300123/

競争が激しいシニア向け人材派遣　ネットワーク効果で価値を高める(10/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/040200037/101400071/
dockerのmysqlコンテナがrestartingになってしまう

解決方法
・起動に失敗した際に作られたvolumeを削除できていなかった

[手順]
1.docker-compose.ymlで指定したvolumeフォルダに移動
2.下記コマンドを実行(Permisson definedになった場合はsudoで)
```
$ rm -rf *
```

3.dockerコンテナをstop
```
$ docker-compose stop
```

4.dockerコンテナを削除(正常に動かないコンテナを指定)
```
docker-compose rm -f [コンテナ名]
```

5.使わないvolumeを削除
```
docker system pure -a -f --volume
```
6.dockerを起動
```
docker-compose up -d --no-recreate --build
```
7.コンテナのステータスを確認
```
#statusが「up」となっていたらOK
docker ps 
```
ROS2環境構築 <Part 1> Windows + VirtualBox(Ubuntu) + ROS2 Foxy

## はじめに
ROS2の環境設定を行った際の忘備録です．
VirtualBoxにUbuntuが導入済みの状態からを想定しています（下記別記事参照）
https://qiita.com/pez/items/a3ef1855f7e1e0ed3dfd

## 環境・バージョン
PC: Panasonic Let's Note CF-FV
OS: Windows11 Pro (64bit)
VirtualBox: 6.1.38 (Ubuntu20.04.2 LTS, 日本語Remix, GUI環境)

ここで導入するROSのバージョン: ROS2 Foxy
※TurtleBot3関連のパッケージもついでに導入しています

## VirtualBoxのネットワーク設定
ロボット(実機)と通信するため今のうちに下記を実施しておく
 1.  VirtualBox起動，OSを選択して「設定」⇒ 「ネットワーク」
 2.  空いている適当なアダプターを選んで有効化チェック
 3.  割り当てを「ブリッジアタプター」にして「OK」

![networkb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/1c6632b1-8e3d-6f7a-7ae3-f686b7e5fc66.png)
 
・Ubuntu20.04を起動し, ifconfigでIPアドレスを確認
```ruby:
$ ifconfig
```
もし未インストールの場合はインストールする（下記）
```ruby:
$ sudo apt install net-tools
```

（IPアドレスはいくつか出てくるがどれが今設定したやつかは・・・勘で判断）
　WiFiであれば大抵192.168.~~~となっていると思います
![ip_ex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/753477a8-b6ad-5f1d-16dc-407eac119fd7.png)

・他のPC（同じネットワーク内）からpingが通るか試してみる
![図0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/65d4af49-3f1d-4c98-6045-1a969a1264bd.png)


逆も試して相互に通ることを確認．

#### 通らなかった場合に疑うこと
・Windowsのファイヤーウォール
・IPアドレス間違い
・同じネットワーク内にない


## UbuntuへROS2をインストール
※ここでTurtlebot3関連のパッケージもインストールしています

#### 参考 : ROS Wiki
https://docs.ros.org/en/foxy/Installation/Alternatives/Ubuntu-Development-Setup.html

下記実行したコマンドのMEMO
```ruby:
$ sudo apt update && sudo apt install curl gnupg2 lsb-release
```

```ruby:ダウンロードのための公開鍵の取得
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```
```ruby:ROS2のインストール
$ sudo apt update && sudo apt install ros-foxy-desktop
```
```ruby:環境変数の設定
$ echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```
```ruby:追加のツール・パッケージのインストール
$ sudo apt install git python3-argcomplete python3-colcon-common-extensions python3-rosdep
$ sudo apt-get install ros-foxy-gazebo-* 

$ sudo apt install ros-foxy-cartographer
$ sudo apt install ros-foxy-cartographer-ros
$ sudo apt install ros-foxy-navigation2
$ sudo apt install ros-foxy-nav2-bringup
$ sudo apt install ros-foxy-dynamixel-sdk
$ sudo apt install ros-foxy-turtlebot3 ros-foxy-turtlebot3-msgs
```

```ruby:ROSの初期設定
$ sudo rosdep init
$ rosdep update
```

```ruby:
$ echo 'export ROS_DOMAIN_ID=30 #TURTLEBOT3' >> ~/.bashrc
$ source ~/.bashrc
```



## 動作確認

```ruby:サンプル１(talker)
$ ros2 run demo_nodes_cpp talker
```

```ruby:サンプル２(listener)：別のターミナルで
$ ros2 run demo_nodes_py listener
```
talkerからpublishされた"Hello World"がlistenerで受信できていればOK
Ctrl + C で終了

```ruby:gazebo立ち上げ
$ gazebo
```
エラー表示なく立ち上がればOK
同じくCtrl + C で終了
[Swift] クロージャについて理解する


Qiita初めての投稿になります。Swift初学者Yasuと申します。
Swift学習歴5ヶ月ほどの初学者ですが、
自身の学習アウトプット、整理も含め投稿始めました。
今回はクロージャについてまとめました。

## クロージャとは
####  処理を定義しつつ、周りのデータを取り込んで、後から実行できるもの。
みたいなイメージです。

初めはあまりピンとこないかと思いますが、
この記事を読み終える頃にイメージが湧いてると嬉しいです。

# クロージャの定義方法
```closure.swift
    { (仮引数: 型,...) ->  型 in
        文...
    }

//関数の場合と比較
    func 関数名(仮引数: 型,...) -> 型 {
        文...
    }
```
こうして見て見ると、クロージャと関数の共通点がいくつかあるのが分かりますね。
クロージャと関数を見極めるポイントとしては、
- funcキーワードの有無
- 関数名の有無 
- inの有無 
- {}の位置

# クロージャを実行してみる
```
//cにクロージャのインスタンスが代入される
let c = { () -> Void in print("Hello!") }         

c() //Hello!

//関数の場合と比較
func c() {
    print("Hello!")
}
c()  //Hello!
```
関数を作って動かす 関数の場合は`関数名()`で動かすが、
クロージャの場合は、変数にクロージャのインスタンスを格納し、`格納されている変数名・定数名()`で動かせる

- ### クロージャを即実行したい時
クロージャを定数や変数に代入せずに、即実行したい場合は、クロージャ式の後ろに()をつける
```
{ () -> Void in print("Hello!") }()

//Hello!  
```

# 値の渡し方、返し方
**注意すべきポイントとしては、**
- 文が複数で値を返したい場合は、`return`が必須となっているため注意する

- 関数の場合だと、`calculate(a: 10, b: 20)`　**とラベルをつけて引数を渡すが、**
クロージャの場合は、`calculate(10,20)`　**とラベルなしで引数を渡す**

```
let calculate = { (a: Int, b: Int) -> Int in
    let aa = a * 2
    let bb = b * 3
    return aa + bb  //文が複数(let定義が2つあるため)で値を返したい場合は、returnが必須
}

let result = calculate(10,20)  //クロージャはラベルなしで引数を渡す
```

### returnを省略できる場合
return文が一つだけである場合は、値として返したい式だけを返してもよい
```
let add = { (a: Int, b: Int) -> Int in
    a + b 　 //returnを省略できる
}
```

# 返り値の型推論(返り値の型を省略できる）
文が1つしか存在しない場合に、返り値の型が推論されるため省略可
```
let c1 = { () -> () in print("Swift") }

let c2 = { () -> Void in print("Swift") } //Voidと()は同じ

let c3 = { () in print("Swift") } //返り値の型を省略 中身が返り値なしのため

let c4 = { print("Swift") }  //引数を省略

//Int型の場合
let value1: Int = { () -> Int in 100}()

let value2 = { 100 }()
```

# クロージャを定数、変数に代入してみる
クロージャは同じ型の定数、変数に代入することができます。
```
let add1 = { (a: Int, b:Int) -> Int in
    return a+ b
}

let add2: (Int,Int) -> Int = add1  //add2にadd1のクロージャを代入

print(add2(10,20)) 
```
# 関数を代入するパターン
- #### 関数の区別と指定
```
func f1(value: Int) -> {}

let f2 = f1(name: ) //引数ラベルはあってもなくても良い
```
- #### 引数ラベルまで書くと指定できるパターン
この場合だと、代入する関数の引数ラベルを指定してあげないと、
どちらの関数か区別することができませんね。
```
func f1(name: String) -> {}

func f1(number: Int) -> {}

let c1 = f1(name: ) 

let c2 = f1(number: ) 
```

- #### 引数ラベルでも区別できないパターン
この場合だと、引数ラベルの指定もできません。
引数ラベルの指定が無理なら、代入先の変数、定数内で型を指定をして区別します。
```
func f1(_ name: String) -> {}

func f1(_ number: Int) -> {}

let c1: (String) -> String = f1

let c2: (Int) -> Int = f1
```
# クロージャのオプショナル
クロージャがないことをオプショナル型で表したい時
- #### 間違った書き方
これだと、Intを引数で二つ受けとって、Int型のオプショナルを返すと言う文になってしまいます。
```
var c1: (Int, Int) -> Int?
```

- #### 正しい書き方
Intを引数で二つ受けとって、Int型のオプショナルを返す関数を返すオプショナル型と言う文になります・
変数c2にはクロージャを代入することもできるし、nilを代入することもできます
```
var c2: ((Int, Int) -> Int)?
```
# クロージャの配列
Intを引数として2つ受け取り、Int型の値を一つ返すという処理自体を[]で囲んであげることで、
クロージャを配列として扱えます。
```
var c1: [(Int, Int) -> Int] 
```


- #### クロージャの型の別名を定義
毎回配列の型を定義するのは面倒、、と言うときは別名を定義し、その中に格納してあげることもできます。
`(Int, Int) -> Int　`を`CalculationCloure`に格納し、それを配列として扱ってあげることで、
`var c1: [(Int, Int) -> Int]`と同じ処理
```
typealias CalculationCloure = (Int, Int) -> Int

let c1: [CalculationCloure]   //var c1: [(Int, Int) -> Int] と同じ定義内容
```
Azureで提供される主なサービス



・コンピューティング
コンピューティングサービスにおいて代表的なものは、仮想マシンを提供するAZure Virtual Machines。クラウド上に仮想マシンのインスタンスをでデプロイし、WindowsやLinuxプラットフォームで任意のワークロードを実行するうことができる。
他には仮想マシンのスケールアウトを自動化するAzure Machines Scale Sets、Webアプリケーションを実行するAzure App Serviceが含まれる。

・ネットワーキング
仮想マシンなどAzure上のリソースをネットワーク接続するための仮想ネットワークや、オンプレミスとAzure上のネットワークを接続する仮想ネットワークゲートウェイなどがある。
また、ネットワーク通信を制御するためのネットワークセキュリティグループやAzure Firewallも含まれる

・ストレージ
Azure上にテキストデータやバイナリデータなどの非構造化データの格納や保存ができるAzure Blob StorageやAzure上でファイル共有を行うのに使用されるAzure Filesなどがある。

・コンテナ
仮想マシンではなく、アプリケーションとそのアプリケーションの実行環境だけを用意して動作させるコンテナ技術のためのサービス。コンテナの実行・管理を行うためのAzure Container Instance(ACI)や複数のコンテナ管理を行うためのオーケストレーションサービスであるAZure Kubernetes Service(AKS)などがある。

・データベース
構造型・非構造型のでーたべーすをAzure上に作成し使用するためのサービス。
構造型のDBとして使用されるAzure SQL Databaseや、非構造型のDBとして使用されるAzure Cosmos DBなどがある。
また、MySQLを基盤としたAzure Database forMySQLや、PostgreSQLデータベースエンジンに基づいたAzure Database for PostgreSQLもある。

・IoT、機械学習、人工知能
IoTデバイスからのデータ収集や中継機能としてAzure　IoT　CentralやAzure IoT Hubなどがある。その収集したデータを利用して機械学習を行うAzure Machine Learningや学習済みのAIモデルを提供するAzue Cognitive Services、ボット作成から公開までを支援すえうあずれBot Serviceなども含まれる

・ID、セキュリティ
Azureをはじめクラウドさ＾ビスにおける認証基盤として動作するAzure Active Directory(Azure AD)など。Azure AD Multi-Factor Authentication(MFA)は認証セキュリティを強化するサービス、Azureのサービス上で使用する暗号化機０ーを保護するAzure Key Vaultなど。
【WinUI3】 <WindowsPackageType>をNoneにしても"Unable to load DLL Microsoft.ui.xaml.dll"でエラーになってはまったお話

# 概要

パッケージングしないプロジェクトで、プロジェクトファイルに`<WindowsPackageType>None</WindowsPackageType>`を設定していても、下記のように`XamlCheckProcessRequirements()`で`Unable to load DLL 'Microsoft.ui.xaml.dll'`でエラーとなってはまってしまった。
しかもビルドターゲットをx64としたのときのみ現象が発生し、x86では現象が発生しないという状態で、情報をいくら探しても解決することができなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430330/bb7049e3-f96f-8e31-38cf-9ce80cdaaebf.png)

# 解決策

結論から言うと、インストールしたWindowsAppRuntimeのフォルダの権限がまずかったようで、コマンドプロンプトで下記のコマンドを実行することで解決できた。
※ ファイル名の部分はPowerShellで`Get-AppPackage`などで各々の環境のRuntimeに合わせて変更してください。
```bat
takeown /f “C:\Program Files\WindowsApps\Microsoft.WindowsAppRuntime.1.1_1005.616.1651.0_x64__8wekyb3d8bbwe” /r /d y
icacls.exe “C:\Program Files\WindowsApps\Microsoft.WindowsAppRuntime.1.1_1005.616.1651.0_x64__8wekyb3d8bbwe” /grant Users:(RD,R,REA,RX) /t
```

x64のプロジェクトファイルでのみ現象が発生していると煮え切っていたが、パッケージプロジェクトを実行した際にx64のみでXAMLのホットリロードが効かなかった。（x86では効いていた）
ここを糸口にしていろいろ探している際に、以下のgithubのissuesを見つけ、試してみるとうまくいった。

https://github.com/microsoft/microsoft-ui-xaml/issues/7687#issuecomment-1277110610

MSストアからのアップデートで権限がおかしくなったのか、はたまたVisual Studioを管理者権限で実行してデバッグしてしまったのか、真因は不明だが、何はともあれ解決できてよかった。
RSA暗号をpythonでハンズオン

私が15年前はじめて作成したプログラムがRSA暗号だったので、振り返りの意味もこめて記述します。
なお、当時はpythonではなく、Excel VBAやjavascriptを使って書いていました。

RSA暗号は、公開鍵と秘密鍵のペアで構成されるもので、名前のとおり、公開鍵は公開されたもので、秘密鍵は自分しか知らないものです。

公開鍵は、{e,n }、秘密鍵はdで表される数字で、
暗号計算は、平文aに対して、
aをe乗してnで割ったあまりを求める
というものです。
同様に、復号計算は、暗号文bに対して、
bをd乗してnで割ったあまりを求める
というものです。

たとえば、
{e,n } = {3, 15}
で、
d = 35
とします。これらの数字がどこから出てきたかは、後で説明します。

甲さんが機密事項として、"3"という数字を入手し、それを乙さんに伝えようとします。しかし、通信は傍受されています。この時、甲さんは、乙さんの公開鍵で暗号化し、"12"という数字に変換して伝えます。
この通信を傍受した人は、"12"という数字の元が何なのかを知る事ができません。
唯一、乙さんだけが、秘密鍵"35"で、元の数字"3"という情報を得る事ができるのです。

数学的には、
a = 3
b = a^3 mod 15 = 27 mod 15 = 12

復号すると、
b = 12
a = b^35 mod 15 = b^2 * b^33 mod 15
  = (b^2 mod 15) * b^33 mod 15
  = 9 * b^33 mod 15
  = (9 * b mod 15) * b^32 mod 15
  = 3 * b^32 mod 15
  = 6 * b^31 mod 15
  = 12 * b^30 mod 15
  = ...
  = 9 * b^1 mod 15
  = 3 mod 15
  = 3
となります。

普通に 12^35を計算すると数字が発散するので、剰余を途中で求めながら計算しています。
たとえば、12^3 mod 15 = (12^2 mod 15) * 12 mod 15
となります。
これは、12^3 = 12^2 * 12  = (15 * 9 + 9) * 12 
となる事を利用しています。

なお、この式をPythonで書くと、
```python:Python
b = 12
a = 1
for i in range(d):
  a *= b
  a = a % n
print(a)
```
```:console
3
```
となります。
`b`を`n`で割って余りを求めながら`d`回乗算する、という意味です。

一般的に書くとすると、
```python:Python
def decrypt_RSA(b,d,n):
  a = 1
  for i in range(d):
    a *= b
    a %= n
  return a
```
なお、暗号化の方も、
```python:Python
def encrypt_RSA(a,e,n):
  b = 1
  for i in range(e):
    b *= a
    b %= n
  return b
```
となり、復号化と同一の処理内容となります。


なお、元の文（平文）が"0"や"1"であると、暗号化しても同一の値となり、暗号化の意味がなく、"2"は、2^3 < 15 となり、暗号文 "8" が　公開鍵{3, 15}より簡単に復号されるので、意味がなくなります(i.e. "8"の3乗根が"2")。また、偶然なのか、暗号化しても平文と同一の数になるのが"4","5","6"などです。

## 鍵の求め方

RSA暗号の鍵の求め方は、Wikipediaをはじめ、多数解説されているので、それらを参考にしてください。実務上は、
「素数p, qを求め、phi(n) = (p-1) * (q-1)を計算し、これと互いに素である数eを適当に決め、そこから、 d * e = phi(n) * x + 1　を満たすdを求め、最後にn = p * qを計算する」事を行います。
Pythonで書いてみましょう。
```python:Python
p = 3
q = 5
n = p * q
phi = (p-1) * (q-1)
print(n,phi)
```
```:console
15 8
```
```python:Python
e = 3
d = 0
for x in range(0,n):
  if (phi * x + 1) % e == 0:
    d = int((phi * x + 1) / e)
print(d,x)
```
```:console
35 14
```
見事、d = 35, e = 3, n = 15が見つかりました。

この原則により、 n = 15 = (3 * 5)などと素因数分解されたら、たちまち d = 35　が解析されるため、暗号が破られた事になります。簡単に素因数分解されないものを見つける必要がありそうです。

## 素数を見つける

RSA暗号の鍵は素数から成るため、大きな桁の素数を見つける必要があります。
数が大きくなると、直感で素数か否かを判定することができないため、素数の定義に従って見つける事となります。

素数の定義は、「１と自分自身以外に約数がない」事なので、原始的には、１から自分自身に至るまで割り切れるかどうかを判定していく事となります。

もちろん、平方根より大きい数で判定しても意味はないですし、素数以外の数で割り切れるか否かを判定する事に意味はありません。(i.e. "15"で割り切れるのであれば、"3"でも"5"でも割り切れるので、"N"が"15"で割り切れる事を確かめる意味がない）

他にも、色々な計算上の工夫があるかもしれません。

まずは、原始的に判定する事にしましょう。

```python:Python
def is_prime_primitive(N):
  i_max = int(N*(1/2))
  for i in range(2,i_max + 1):
    if N % i == 0:
      return False
  return True
```
この関数を使って、例えば、３桁なら、10^2 < N < 10^3のNについてひたすら判定していく事になります。

```python:Python
def find_prime(min_N,max_N):
  for N in range(min_N, max_N+1):
    if is_prime_primitive(N):
      return N
  return 0
```

大きな数の使用例
```python:Python
import time
start = time.time()
print(find_prime(4 * 10**8,10**9))
end = time.time()
print(end - start)
```
```:console
400000009
16.155174255371094
```
9桁の数で16秒(google colabのCPU環境）かけて見つけました。
pythonの場合、べき乗は`^`ではなく、`**`を使う事に注意しましょう。
Luma AIで出力した.objファイルのメッシュを削除する

# やったこと
.objファイルをBlenderで開いて、`Box Trim`で要らないところを消します。
![ezgif-5-6d2a367681.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/21eaab16-36ea-47e3-95c6-ca2623e4454f.gif)

# 動作環境
- Luma AI ベータ版
- Blender version 3.3.1
- windows 11 pro / gigabyte x299 aorus gaming 7 pro(NVIDIA GeForce RTX 3070)

# やり方
Lumaで.objファイルを出力する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/726a0497-6493-01ca-b67a-0830cd02674d.png" width=50%>

Blenderを開いて、.objファイルをインポートする。
![スクリーンショット 2022-10-20 223012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/6dcb3a31-974b-bdec-b488-867e906d1f0d.png)

.objファイルを開いたら、モードを`Object Mode`から`Sculpt Mode`にする。
![スクリーンショット 2022-10-20 223148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/f4ec8c4a-fbc6-547b-d852-366e9ddc347d.png)

左側に表示されるアイコンの中から`Box Trim`を選択する。
![スクリーンショット 2022-10-20 223312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/96ec99e8-bf64-b5fa-d8bd-766a88712583.png)

インポートしたオブジェクトの中で、要らないところをドラッグで選択して削除する。
![ezgif-5-6d2a367681.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/ecc495b7-958c-c0bd-ff38-e6b46ee98f6c.gif)

:::note warn
注意
実際の処理は、もっと時間がかかります。
:::

要らないところをすべて消せたら、好きなフォーマットで出力する。
![スクリーンショット 2022-10-21 001321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700137/b3928f0c-4a32-efaf-0b64-ac8ee65474dc.png)
新しいサイトをgitに設定する

# GitHubにログイン
`New`をクリック
新規ネームを入力
`Private`で設定
`Create repository`で作成

# ローカルフォルダ
ローカルフォルダを作成
対象クライアント＞server＞URL

# VSCode
VSCode＞フォルダを開く
で作成した新規フォルダで開く

ターミナル＞`新しいターミナル`

```
git init
```

ローカルフォルダ内に`.git`フォルダができる

新規ファイルを作成　`test.html`
ステージング→コミット

GitHub＞`or create a new repository on the command line`コピー
VSCode＞ターミナル画面にペースト、実行

# GitHubでプッシュされたか確認

終了

***
参考記事
https://miya-system-works.com/blog/detail/vscode-github/
画像スクレイピングにタップ動作をはさみたい

# やりたいこと
サムネイル画像をタップしてすべてのサムネイル画像の元画像を取得したい

# Selenium 導入
* SeleniumとchromeDriverとやらがいるらしい
* いずれもターミナル経由でインストールが可能だった


# つまづく
15分前後見ていたけど正直Path通すのが手順よくわからない。

# 気付く
以下のサイトを参考にしてみた。


https://watlab-blog.com/2019/08/10/chromedriver-path/#chromedriver123981245212531124731248812540125232604127861

クローム立ち上げて5秒経過後にブラウザ閉じるらしい。
`そんなすごいことできるんか...!!!!`
→できた。

# 翌日も挑戦する
ログイン画面のinputエリアにID/PWを埋め込み処理をいれてみたが、おそらく指定情報が足りないもしくは齟齬があるため、うまく行かなかった。

# 次の課題
指定したurlへジャンプは初歩の初歩でできた。ページ内の項目を指定したり、文字列を埋め込む処理が全くわからない。
感覚的ではあるが、知見が足りなすぎて手を動かせない状態だと思った。



# 結局、この記事書いている人は何がしたいかというと。
子供が毎日同じ服を着る。
多分シンプルに安心するんだと思う。
でも、もし視覚情報で、`こんなコーディネートもあるんだ`と知ったら試したくなるんじゃなかろうか。
zozotownの購入履歴から必要が画像だけ数枚とってこいよ？とは、自分自身でも痛烈に感じている。このスクレイピングしているうちにも、子供は同じトレーナーに袖を通し続け私は深夜にそれを洗い続け、毛玉だらけになっているというのに、私はなんて無力なんだ。
メインフォームに簡易表示フォームを追加する方法

関連テーブルのフォームを表示させる「簡易表示フォーム」をメインフォームに追加する方法について記述します。

1. フォーム編集画面で[コンポーネント]＞[表示]＞[クイックビュー]を選択　
（ビューという名前がややこしいですが簡易表示（フォーム）＝クイックビュー（フォーム）という感じで「フォーム」が省略されてるんですね）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/9ef8c0e3-a024-043e-fce1-5c73dc1e3720.png)

2. 表示させたい簡易表示フォームの種類を選択し[完了]ボタンを押す
それぞれのドロップダウンメニューについて
[検索]：このフォームのテーブルの検索列が選択できる
[　　]：上の[検索]で選んだ列に関連するテーブルの名前が表示され、そのテーブルにおいて表示させたい簡易表示フォームの種類を選ぶ
ここでは「製品情報」という名前の検索列を指定したら、その列に関連づいている「製品」テーブルでの簡易表示フォームを選択でき、「information」という名前の簡易表示ビューを選んだ。<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/feda55a3-baeb-529d-b2d7-e4c4b9c84f1b.png" width=80%>

3. 関連テーブルの簡易表示フォームが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4c682a77-3205-2f85-4cb5-afd98ddb2ed4.png)

実際の画面
注文販売テーブルの「製品」列に関連づく製品テーブルの１行分が表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/03f2d29c-e83d-14b6-9a6d-5e7e35259e5f.png)
Raspberry Pi を WireGuard のクライアントとして構成する (Raspberry Pi OS)

## 結論

```console
$ sudo apt install wireguard-tools
$ cat << _EOT_ | sudo tee /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <Get from WireGuard VPN Server>
Address = <Get from WireGuard VPN Server>

[Peer]
PublicKey = <Get from WireGuard VPN Server>
AllowedIPs = <Get from WireGuard VPN Server>
Endpoint = <Get from WireGuard VPN Server>
_EOT_
$ sudo systemctl enable --now wg-quick@wg0
```

## 解説

[WireGuard](https://www.wireguard.com/) は UDP ベースのモダンな VPN 実装です。Raspberry Pi でも使えます。

Raspberry Pi OS には `wireguard-dkms` と `wireguard-tools` という2つのパッケージがあります。Raspberry Pi を WireGuard クライアントとして使うなら `wireguard-tools` (ユーザーランド実装) で十分です。

設定を `/etc/wireguard/wg0.conf` として作ったら、後は systemd にて起動します。再起動時の自動起動も行ってくれます。

ちなみに `systemctl enable` 時の `@wg0` は `/etc/wireguard/wg0.conf` のファイル名と対応しています。 `@wg1` なら `wg1.conf` です。複数セッションも管理できそうです(未確認)。

## あとがき

"Raspberry Pi WireGuard" でググると、Raspberry Pi を WireGuard サーバーにする話ばかりで、クライアントとして構成する話が意外にも無かったので。

EoT
【React】useParams　undefinedが返ってきてしまう

# 背景
URLパラメータを取得するのに、`useParams`を使えば簡単に取得できると聞いて使ってみました。

# バージョン等
React : 17.0.0
react-router-dom : 5.3.0

# 状況
関係するRoutes,Detailの2つの関数コンポーネントについて下記。


```typescript
// Routes.tsx
export default function Routes() {
  return (
    <Switch>
      <Route exact path={"/list/:detail"} component={Detail} />
    </Switch>
  );
}
```



```typescript
// Detail.tsx
export default function Detail() {
  const { id } = useParams<{ id: string }>(); //←undefinedになってしまっていた
  const [detail, setDetail] = useState<Hoge>();

  //初期表示処理
  React.useEffect(() => {
    requestGet(`https://hogehoge/${id}`).then((res: any) => {
      setDetail(res.data);
    });
  }, [id]);

  return (
    <div>
      <p>{detail?.hoge}</p>
    </div>
  );
}
```
みたいな感じで、URLパラメータを取得して、それをまた別のAPI呼び出し時に渡してあげようとしてました。
しかしながら、`useParams`の返り値は`undefined`でした。

# 原因
Routes.tsxの
```typescript
<Route exact path={"/list/:detail"} component={Detail} />
```
の`:detail`部分と、
Detail.tsxの
```typescript
const { id } = useParams<{ id: string }>();
```
`{ id }` 部分は同じでないとダメなようでした。

```typescript
<Route exact path={"/list/:detail"} component={Detail} />
// ↓このように修正
<Route exact path={"/list/:id"} component={Detail} />
```
useParamsを使用してはいるが、propsを取得しているだけなので、別な名前だとundefinedになるのは当然でした。恥ずかしい。

# 参考

https://reactrouter.com/en/main/hooks/use-params

https://ajike.github.io/react-router-dom_hooks/#useparams

https://reffect.co.jp/react/react-router#useParamsid
検索候補キーワードを取得する

# 前提
- Ruby 2.7.4
- 検索対象は、Google と Wikipedia
    - その他にも Amazon とか Youtube とかあるので、気になった人は👇
        - [サジェストAPIを使って、各サービスのサジェストワードを取得する](https://sakusaku-techs.com/blog/suggest/)
        - [Suggest API](https://so-zou.jp/web-app/tech/web-api/suggest-api.htm)
        - [キーワードサジェストを秒速で公開したお話](https://qiita.com/shiro_rep/items/79f5cba8764b060305ef#%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%AE%E4%BD%9C%E6%88%90)



# Google
- [Google Suggest API の仕様](https://so-zou.jp/web-app/tech/web-api/google/suggest/)
    - 試してないけど、[これ](https://developers.google.com/cloud-search/docs/reference/rest/v1/query/suggest)も同じ？

```ruby
require 'open-uri'
require 'uri'
require 'rexml/document'

keyword = '植物'
url = "https://www.google.com/complete/search?hl=ja&output=toolbar&q=#{URI.encode(keyword)}"
response = open(url)

response.charset
# =>
# "shift_jis"

# 変換前の文字コード判定が意図した結果にならないため、明示的に指定する
encoded = response.read.encode('UTF-8', response.charset)

doc = REXML::Document.new(encoded)

doc.elements.each('toplevel/CompleteSuggestion/suggestion') do |e|
  p e.attributes['data']
end
# =>
# "植物"
# "植物図鑑"
# "植物園"
# "植物英語"
# "植物園 東京"
# "植物育成ライト"
# "植物性タンパク質"
# "植物モンスター娘日記"
# "植物油脂"
# "植物人間"
```

# Wikipedia
- [Wikipedia API の仕様](https://www.mediawiki.org/wiki/API:Opensearch)
    - [戻り値は配列で返る](https://www.mediawiki.org/wiki/API:Opensearch#:~:text=try%20in%20ApiSandbox%5D-,Response,-%5Bedit%5D)

```ruby
require 'open-uri'
require 'uri'
require 'json'

url = "https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=#{URI.encode(keyword)}"

response = open(url)

response.charset
# =>
# "utf-8"

json = JSON.parse(response.read)
# =>
# [
#   "植物",
#   ["植物", "植物油", "植物園", "植物の進化", "植物油の一覧", "植物男子ベランダー", "植物園の一覧", "植物内生真菌", "植物図鑑 (小説)", "植物天然記念物一覧"],
#   ["", "", "", "", "", "", "", "", "", ""], 
#   ["https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E6%B2%B9", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E5%9C%92", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E3%81%AE%E9%80%B2%E5%8C%96", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E6%B2%B9%E3%81%AE%E4%B8%80%E8%A6%A7", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E7%94%B7%E5%AD%90%E3%83%99%E3%83%A9%E3%83%B3%E3%83%80%E3%83%BC", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E5%9C%92%E3%81%AE%E4%B8%80%E8%A6%A7", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E5%86%85%E7%94%9F%E7%9C%9F%E8%8F%8C", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E5%9B%B3%E9%91%91_(%E5%B0%8F%E8%AA%AC)", "https://ja.wikipedia.org/wiki/%E6%A4%8D%E7%89%A9%E5%A4%A9%E7%84%B6%E8%A8%98%E5%BF%B5%E7%89%A9%E4%B8%80%E8%A6%A7"]
# ]

json[1].each do |s|
  p s
end
# =>
# "植物"
# "植物油"
# "植物園"
# "植物の進化"
# "植物油の一覧"
# "植物男子ベランダー"
# "植物園の一覧"
# "植物内生真菌"
# "植物図鑑 (小説)"
# "植物天然記念物一覧"
```
３層アーキテクチャ



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916702/9623bf54-9c9f-227c-94f8-c6077a7aafc9.png)

Webアプリケーションのコードを３つの関心事に分類して実装する。
それぞれのレイヤに混ざらない実装をすることで、保守性・拡張性のあるアプリ開発ができる。
includesメソッドってなんだろな。

#### はじめに

先日、ユーザーがBookmarkした投稿の一覧を出したくてコードで悩んでいたら、
こんな書き方はどう？と教えてもらったのですが...

```ruby
@posts = Post.includes(:user).where(user_id: current_user.id)
```
このincludesってたまに見るけどよくわからないなーってことで
自分の勉強のために調べてまとめてみました。

#### includes攻略のためには「N+1問題」の理解が重要！

いや「N+1問題」ってなんだよって思いますよね。
ざっくり言ってしまうと「N+1問題」＝超非効率な状態です。
マクドナルドに行ったらハンバーガーを最初に買ってきて、その次にナゲットを買ってきて、
その後にさらにポテトを買ってくるような状態で、「いやそれまとめて一緒に買えたよね？」みたいな。
こんなことをしているとSQLが過剰に動かされてしまい、疲労困憊によりパフォーマンスが低下してしまいそうです。

（SQL＝データベースの操作を行います。Railsの裏側ではSQLが実行されていますが詳しくは下記で）
>https://www.yuta-u.com/programing/sql-basic-knowledge

includesメソッドとは、シンプルに言うと、この「N+1問題」を解決してくれるメソッドです。
このincludesメソッドを使うことで、関連している複数のテーブルから
データを取得してくるときのアクセス回数を大きく減らすことができます。

#### 「N+1問題」が起きやすいのはどんなとき？

「N+1問題」が起きやすいのは、わかりやすく言うと「UserとPost」の関係のような
いわゆる「１ : Many」の状態のときです。
ここで言うなら「顧客とハンバーガー」みたいな感じでしょうか。
一人の顧客はハンバーガーをいくつでも購入できる関係ですよね。

```ruby:app/models/customer/rb
  has_many :hamburgers
```
```ruby:app/models/hamburger/rb
  belongs_to :customer
```
顧客とハンバーガーのテーブルの一例です。
| customer | name |   
| :-- | --: | 
| 1 | Apiyo | 
| 2 | Bpiyo | 
| 3 | Cpiyo | 
| 4 | Dpiyo | 

| hamburger_id | name | customer |
| :-- | --: | --: |
| 1 |  チーズ  | 2 |
| ２ | てりやき  | 1 |
| ３ | フィッシュ | 4 |
| ４ | ベジタブル| 1 |

さて、ここで「各顧客に紐づくハンバーガー」を表示したかったとします。
まずは全てのユーザーの取得が必要です。

```ruby
@customers = Customer.all
```
これでこの例だとid_4までの顧客が読み込まれます。
次は紐づくハンバーガーの情報を取得しなければいけません。

```ruby
@customers.each do |customer|
  customer.hamburgers.each do |hamburger| 
    hamburger.name
  end
end
```
流れとしては①まず顧客テーブルで順番に顧客を取り出します。
②その顧客が購入したハンバーガーの情報を取得するため、ハンバーガーのテーブルにアクセスします。
③処理を終えたら、顧客テーブルに戻り、存在する顧客idの分だけ同じ処理を繰り返します。
このように「各顧客に紐づくハンバーガー」を表示したいために
「Customerテーブルに１回＋hamburgerテーブルに対してcustomerの数だけ＝N回」
のアクセスが起きてしまうのです。その分だけSQLが発行されています。

#### ここで本題のincludesメソッド

customersテーブルにアクセスするのと一緒に、hamburgerテーブルの情報も得られれば、
SQLの負担も減ってブラック企業状態から脱出できそうです。

```ruby
@customers = Customer.all #これを下記に変更
@customers = customer.includes(:hamburgers) #includesメソッド使用
```
この[@customers = Customer.all]を消して、includesメソッドを使用しこのように記述することで、
顧客の情報と一緒に、紐づくハンバーガーの情報も取得できます。

includesを使うことで、データベースへのアクセス回数を減らし、
アプリケーションの応答速度を上げることができるのです。
SQLの動きにも違いが現れます。

```
#「N+1問題」の状態のSQL IDの分だけ繰り返す
SELECT 'customers'.* FROM 'customers'
SELECT 'hamburgers'.* FROM 'hamburgers' WHERE 'hamburgers'.'customer_id' = 1
SELECT 'hamburgers'.* FROM 'hamburgers' WHERE 'hamburgers'.'customer_id' = 2...

#includesメソッド使用すると、、、
SELECT 'customers'.* FROM customers'
SELECT 'hamburgers'.* FROM 'hamburgers' WHERE 'hamburgers'.'customer_id' IN (1,2,3,4)
```
includesメソッドを使ったことによって、関連するデータをまとめて取得できるようになりました！
例えて言うならハンバーガー・ポテト・ナゲットをばらばらで買っていたけど、
まとめてハッピーセットで買ってくれたからレシート少なくて済んだよ！みたいな感じでしょうか(笑)
ちょっとうまく言えませんが、こちらのincludesメソッド応用編もありますので参考記事を以下に貼っておきます。
>https://nyoken.com/rails-includes
>https://pikawaka.com/rails/includes
UbuntuでSNMPを使う

環境は，Ubuntu 20.04で検証した．

SNMPのパッケージをインストールする．

```
sudo apt install snmp
```

SNMPの基本は以下の記事を参照する．

[SNMPの基本的なこと - Qiita](https://qiita.com/Tocyuki/items/9aaae3de2858b2bfed7d#snmptranslate%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)

snmpwalkでsnmpのデータを見てみる．以下では192.168.0.1の機器のsystemを参照している．

```
snmpwalk -v 2c -c public 192.168.0.1 system
```

|オプション|意味|
|---|---|
|-v|SNMPのバージョン （例：1, 2c, 3）|
|-c|コミュニティ名　（例：public）|

MIBが不足していると以下のメッセージが出る．

```
Cannot find module (XXX) At line X in (none)
```

まずは /etc/snmp/snmp.conf を修正する．コメントを読むと `mibs :` をコメントアウトする必要があると分かる．

```
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
mibs :
# If you want to globally change where snmp libraries, commands and daemons
# look for MIBS, change the line below. Note you can set this for individual
# tools with the -M option or MIBDIRS environment variable.
#
# mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf
```

以下に変更し，保存する．

```
# As the snmp packages come without MIB files due to license reasons, loading# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
# mibs :
# If you want to globally change where snmp libraries, commands and daemons
# look for MIBS, change the line below. Note you can set this for individual
# tools with the -M option or MIBDIRS environment variable.
#
# mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf
```

それでも解決しなければ，以下の記事をもとにMIBS DownloaderをインストールしてMIBをダウンロードする．

[Installing MIB in Ubuntu and Solving the Error “SNMP Cannot Find Module …” – IT Blog](https://ixnfo.com/en/installing-mib-in-ubuntu-and-solving-the-error-snmp-cannot-find-module.html)

```
sudo apt install snmp-mibs-downloader
```

以下のコマンドでMIBをダウンロードする．

```
sudo download-mibs
```

# 参考資料

- SNMP関連のコマンドの使い方
    - [snmptranslate - mib oidと名前の変換 - うまいぼうぶろぐ](https://hogem.hatenablog.com/entry/20100622/1277215889)
- SNMPの基本知識
    - [SNMPの基本的なこと - Qiita](https://qiita.com/Tocyuki/items/9aaae3de2858b2bfed7d)
- Ubuntu でSNMPを使うときのTips
    - [Installing MIB in Ubuntu and Solving the Error “SNMP Cannot Find Module …” – IT Blog](https://ixnfo.com/en/installing-mib-in-ubuntu-and-solving-the-error-snmp-cannot-find-module.html)
- ネットワーク機器のMIBとOIDを調べる場合
    - [ネットワーク機器のSNMP MIB/OIDまとめ - Qiita](https://qiita.com/Mabuchin/items/d435c0afb4f0ca17ad25)
IT初心者あるある

ボクの場合、ITの知識がまったくない状態で、ITの某会社へ就職が決まった時
※ 当時はダウンロード・インストールの違いがわからないくらいのレベル
いきなり入社までにC言語の課題をわたされた＆
1年目の4月からお客様のところへ一人で出向されたとき
大変だったことを今でもめちゃおぼえている。

ぼくはこのときひとりで必死にもがいていたが、
今考えると、ひとりである必要なんてなかったなあと思う。

よく独学で勉強してきて、ITの会社へ転職したいという
志の高い人がおおくてすごい！と感じると同時に、
まわりに「経験者」をつけた方がよいよ～とも思う。

独学だとどうしてもやる気がさがってしまう、、
習慣化しない、、、
ゴールにちかづいているかわからない、、
などなりやすい。

といっても、まわりにそんな人はいないって人も多いかなと感じる。。

いろいろ方法はあると思うが、ぼくも利用しているのが
・MENTAというサービスを使って、メンター（ITの経験者で面倒をみてもらう人）をつける
  https://menta.work/

・ITの勉強会や仲間をつくる。
  ちなみに僕はこのコミュニティにはいってます。
  https://community.camp-fire.jp/projects/view/280040


またいきなりフリーランスをめざしたいという人もおおいが、
学習より実務経験をつむ方が近道だ思う。
特に比較的しごとがしやすい、派遣からはじめるのが
ぼくのおすすめ。

派遣であればこのあたりを僕はつかってました。
  パーソルテクノロジースタッフ
  https://persol-tech-s.co.jp/

  リクルートスタッフィング
  https://www.r-staffing.co.jp/
  
  マンパワー
  https://www.manpowerjobnet.com/


・自分の周りに経験者をつける
・実務をつむ
これがボクてきには大事かなと思う。
絶対パス・相対パスについて

パスとは
特定のファイルの場所までのルートを示したもの。

絶対パスとは
https://www.amazon.co.jp/
aタグのリンク先やsrc属性に使われる。

相対パスとは
../img/common/logo.png

../→一つ上の階層を表す。
./→同じ階層を表す。わざわざ書かなくてもOK
tlmgrのアップデート

# tlmgrのアップデート

```
sudo tlmgr update --self --all
```

luatexjaで不具合が生じ，以前のバージョンに戻したい場合は以下のコマンドを実行する．
```
tlmgr restore luatexja
```
バックアップが残っている場合は，以下のようにローカルに保存されているリビジョン番号が表示される．
```
Available backups for luatexja: 39105 (2016-02-02 15:45)
```
確認したら，そのリビジョン番号を復元する．

```
sudo tlmgr restore luatexja 39105
```
以下のように，一度確認される．
```
Do you really want to restore luatexja to revision 39105 (y/N):
```

なお，フォーマット作成時に読まれるファイルを復元した場合（たとえば LaTeX 本体に不具合が生じ，過去のバージョンを復元した場合）は，手動でフォーマットを再作成する必要が生じる．

[参考文献 TEX Wiki](https://texwiki.texjp.org/?tlmgr)
22' 10/14リリースのFirebase Cloud-Functions SDK v4からAdmin SDK v9がサポート終了された

Cloud-Functions SDKをv3→v4にアップデートした時に、Breaking Changesの対応をしたので共有します

## TL;DR
Firebase Cloud Function SDKをv3→v4にアップデートしたことに伴い、Admin SDKのv9がドロップされた。
Admin SDKをv9→v11にアップデートしたことで解決した。

https://firebase.google.com/support/releases#cloud-functions-v4-SDK


## 問題

最近Firebase関連のパッケージを最新版にアップデートした時に以下の問題が起きました。

例えば、Cloud FunctionsからFirestoreのドキュメントを監視するコードがありました。

```
exports.onDocWriteTriggerThatFails = functions.firestore
    .document("collection/{doc}")
    .onWrite((change, context) => {
```

Firestore Emulator Suiteでテストしたところ、エラーを吐いて失敗します:

(一部省略)

```
function[region-onDocWriteTriggerThatFails]
TypeError: firebaseApp.getOrInitService is not a function
    at Object.getFirestore
    at beforeSnapshotConstructor
    at changeConstructor
    at cloudFunction
    at /Users/{...}/functionsEmulatorRuntime.js:516:16
    at runFunction
    at runBackground
    at processBackground
    at /Users/{...}/functionsEmulatorRuntime.js:690:27
    at Layer.handle [as handle_request]
```

### Cloud-Functions SDK v4のBreaking Changes

リリースノートを見ると、Admin SDKのv8, v9がサポート終了したとのことでした。
このリリースは `v4.0.0` October 14, 2022と、かなり最近の出来事です。

>Dropped support for Admin SDK versions 8 and 9. Update with npm install firebase-admin@latest --save.

https://firebase.google.com/support/releases#cloud-functions-v4-SDK

リリースノートの指示に従い、Admin SDKを最新版のv11にしたところ、上記の問題は解決しました。

```
npm install firebase-admin@latest --save
```

### 最後に

Firebase関係のパッケージはこまめにアップデートすることが必要だと感じました。
また、検索しても見つからない問題は、リリースノートを見たら解決することもあるようです。

https://firebase.google.com/support/releases

この記事が誰かの助けになれば幸いです！それでは、良いFirebaseライフを！
GCP: Cloud Composer / Scheduler

# Cloud Composer

## Overview

![dag_task](https://cloud.google.com/static/composer/docs/images/overview-dag-and-tasks.svg)

https://cloud.google.com/composer/docs/composer-2/composer-overview

- managed Airflow
- DAG: collection of task
- environment: Airflowを動かすためのコンポーネント群
- メータデータDBはGCP管理のもの
- GCP管理のGKEで動く
- メタデータDBはゾーンレベル
- スケジューラーなどはリージョナル

## Feature

https://cloud.google.com/composer/docs/composer-2/composer-features

- GKE: 以下のワークロードを動かす
    - scheduler
    - worker
    - Redis
    - agent
    - monitoring
- Web server
- Database: Cloud SQLを使う
- Cloud Storage: DAGs, logs, pluginsを保存する
- IAMでアクセス権をコントロールできる
- VPC-nativeのAutopilotモードでデプロイされる
    - Share VPCを利用できる
    - VPC peeringでポッドなどと通信できる
- プライベートIPにより、パブリックインターネットから隔離できる
- シークレットマネージャーの利用

 ## Security

https://cloud.google.com/composer/docs/composer-2/composer-security-overview

- データはat restで暗号化される
- バケットアクセスを一律で管理できる
- プライベートIPモード
- Shielded VMを使ったクラスター
- CMEK
- VPC サービスコントロールでネットワークリスクを下げることができる
- ウェブサーバーにアクセスできるIPアドレスの制限

## Environment architecture

https://cloud.google.com/composer/docs/composer-2/environment-architecture

パブリックIPの場合

![public](https://cloud.google.com/static/composer/docs/images/composer-2-public-ip-architecture.svg)

## Pricing

- 10 minutes interval charge
- disk size per 1 GiB
- network usage per 1 GiB
- Compute SKU
    - 1000 mCPU per hour
    - memory
    - storage
- Database Storage SKU
- Environment Fee SKU
    - Composerのマネージドインフラ環境のコスト

# Cloud Scheduler

https://cloud.google.com/scheduler/docs/overview

- 所定の時刻や間隔で実行されるジョブを管理できる
- ターゲット
    - HTTP/Sエンドポイント
    - Pub/Subトピック
    - App Engine
- App Engineとは同じリージョンである必要がある
- 繰り返し実行されるジョブ向け
    - 一度だけ実行したい場合はCloud Tasksを検討
- タイムゾーンを設定できる
- Pub/Subに限り、VPCサービスコントロールを利用できる
Permanent joints, ボッシュ自動車handbook 11版(29) p.450

Permanent joints,   ボッシュ自動車handbook 11版(29)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

# Permanent joints(永続継手)
 p.450

## Welding
## Soldering
## Adhesive technologies 
## Riveting 
## Penetration-clinching processes 
# Reference
[1] FugeteChenik, Schweißtechnik, 7th Edition, DVX media, 2007

 https://www.dvs-media.eu/de/buecher/lehrmedien-videos/3152/fuegetechnik-schweisstechnik

[2] DIN DVS Taschenbuch 284, DVX media, 2009
Schweißtechnik 7: Schweißtechnische Fertigung, Schweißverbindungen

https://www.dvs-media.eu/de/buecher/din-dvs-taschenbuecher/3886/schweisstechnik-7-schweisstechnische-fertigung-schweissverbindungen

[3] DIN 1910-100 2008
Welding and allied processes - Vocabulary - Part 100: Metal welding processes with additions to DIN EN 14610:2005

[4] DIN EN 14610:2005
Welding and allied processes - Definitions of metal welding processes


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221020

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
ポートの疎通を確認する方法

ポートの疎通を確認する方法を３つ紹介します。

# 1. Test-NetConnection（WindowsのPowerShellのコマンド）

１つ目はWindowsのPowerShellの`Test-NetConnection`コマンドです。Windowsでポートの疎通確認を行う場合はこのコマンドがよいでしょう。

コマンドの書式は以下となります。

`Test-NetConnection <ホスト名 または IPアドレス> -Port <ポート番号>`

```:成功時の例
PS C:\> Test-NetConnection 192.168.0.10 -Port 80

ComputerName     : 192.168.0.10
RemoteAddress    : 192.168.0.10
RemotePort       : 80
InterfaceAlias   : ローカル エリア接続
SourceAddress    : 192.168.0.2
TcpTestSucceeded : True

PS C:\>
```
成功時は「TcpTestSucceeded」の値が「True」となります。

```:失敗時の例
PS C:\> Test-NetConnection 192.168.0.10 -Port 80
警告: TCP connect to (192.168.0.10 : 80) failed

ComputerName           : 192.168.0.10
RemoteAddress          : 192.168.0.10
RemotePort             : 80
InterfaceAlias         : ローカル エリア接続
SourceAddress          : 192.168.0.2
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

PS C:\>
```
失敗時は「TcpTestSucceeded」の値が「False」となります。

# 2. nc（netcat）コマンド（Linuxのコマンド）
２つ目はLinuxの`nc`コマンドです。Linuxでポートの疎通確認を行う場合はこのコマンドがよいでしょう。Macでもこのコマンドが使えるかと思います。

コマンドの書式は以下となります。

`nc -vz <ホスト名 または IPアドレス> <ポート番号>`

`nc -vz 192.168.0.10 80`

```:成功時の例
[root@centos8 ~]# nc -vz 192.168.0.10 80
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.0.10:80.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@centos8 ~]#
```
成功時は「Ncat: Connected to <接続先>」と表示されます。
```:失敗時の例
[root@centos8 ~]# nc -vz 192.168.0.10 80
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connection refused.
[root@centos8 ~]#
```
失敗時は「Ncat: Connection refused.」が表示されます。

# 3. telnetコマンド
３つ目は`telnet`コマンドです。最近はwindowsもLinuxも`telnet`がインストールされていることが稀なため、使うことはほぼないかと思います。

コマンドの書式は以下となります。

`telnet <ホスト名 または IPアドレス> <ポート番号>`

```:成功時の例
[root@centos8 ~]# telnet 192.168.0.10 80
Trying 192.168.0.10...
Connected to 192.168.0.10.
Escape character is '^]'.
```
成功時は「Connected to <接続先>.」が表示されます。

```:失敗時の例
[root@centos8 ~]# telnet 192.168.0.10 80
Trying 192.168.0.10...
telnet: connect to address 192.168.0.10: Connection refused
[root@centos8 ~]#
```
失敗時は「Connection refused」が表示されます。

---
以上
"docker endpoint for "default" not found"の対処法

謎のエラーで検索しても特に情報が無かったので記録

# 症状
docker-composeでビルドオプションを付けてupしようとした際に"docker endpoint for "default" not found"というエラーが発生した
```
> docker-compose up --build
docker endpoint for "default" not found
```

# 原因
色々と調べた結果このIssueにたどり着いた
https://github.com/docker/for-win/issues/12561

ページ内でもあるが、要約すると```~/.docker/contexts```内にあるディレクトリのうち、いずれかのディレクトリの内部にある```meta.json```が壊れているとのこと

# 対処法
```~/.docker/contexts```内のディレクトリから、ディレクトリ内の```meta.json```が破損しているディレクトリを探し出し削除する
なお、削除を伴うので慎重に行うように

以上
Detachable connections ボッシュ自動車handbook 11版(28) p.426

# Joining and bonding techniques, Detachable connections 


人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

#  Detachable connections(取外可接続)

p.426

## Positive or form-closed joints 
## Frictional joints
## Threaded fasteners 
## Snap-on connections on plastic components

# Reference
[1] Haberhauer, F. Bodenstein, Maschirenelemente

https://www.amazon.de/dp/3642374166

[2] Dubbel, Taschenbuch fur deb Maschnenbau, 24th Ed.

https://link.springer.com/book/10.1007/978-3-642-38891-0

[3] F.G. Kollann,  Wella-Nabe-Verbindurgan  

https://books.google.de/books?id=lJD0BQAAQBAJ&printsec=copyright&hl=de#v=onepage&q&f=false

[4] DIN  471: 2011
Retaining rings for shafts - Normal type and heavy type



 
# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221020

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Design for Failure とは

## 勉強前イメージ

障害設計的なお話かな？

## 調査

### Design for Failure とは

障害が発生することを前提にしてシステム設計を行う考え方を言います。
サーバは落ちるもの、AZ・リージョン事落ちる可能性もあります。
そういうことを前提にして障害が発生した際にどう対応してサービスの可用性を向上させるかという考え方になります。

### Design for Failure の実現方法

- SPOFの排除

可用性を上げるためには単一障害点のSPOFを作らないことが重要です。
システムをHA構成にしたり、AWSだとマルチAZ・マルチリージョンにすることで
AZ・リージョンごと落ちてもサービスは稼働させることができるためです。

- 監視

サービスの障害の早期検知のサービス監視、性能が低下してることを検知するリソース監視など
サービス内のログやメトリクスを常時監視を行い、早期検知をして障害にならないまたは早期復旧ために設定する必要があります。

- 復旧方法

障害が発生しクライアントへの影響が出た際に、どう復旧させるかという
組織内の動き方や、復旧方法を予め決めておくことで早期復旧を行うことが出来ます。

## 勉強後イメージ

SPOFはたしかに・・・・。
基本的にサーバは死ぬものとして考えないといけないってことですね。

## 参考

- [Design for Failure](https://www.newton-consulting.co.jp/itilnavi/glossary/design_for_failure.html)
- [AWS GameDay で実践トレーニング - Design for Failure -](https://atlax.nri.co.jp/blogs/20201125/)
Seals ボッシュ自動車handbook 11版(27)p.384

Seals , ボッシュ自動車handbook 11版(27)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e

# Seals (密封)
p.384

## Seal technology 
## O-ring 
## Molded seal 
## Flat seals 
## Sealing caps 
## Radial shaft seal 
## Pneumatic seals 
## Two-component seals 
## Rod and piston sealing systems 
## Elastomer materials


# Reference
[1] ISO 3601

ISO 3601-1:2012
Fluid power systems — O-rings — Part 1: Inside diameters, cross-sections, tolerances and designation codes

https://www.iso.org/standard/58043.html

ISO 3601-1:2012/Amd 1:2019
Fluid power systems — O-rings — Part 1: Inside diameters, cross-sections, tolerances and designation codes — Amendment 1

https://www.iso.org/standard/74051.html

ISO 3601-2:2016
Fluid power systems — O-rings — Part 2: Housing dimensions for general applications

https://www.iso.org/standard/69880.html

ISO 3601-3:2005
Fluid power systems — O-rings — Part 3: Quality acceptance criteria

https://www.iso.org/standard/40409.html

ISO 3601-3:2005/Amd 1:2018
Fluid power systems — O-rings — Part 3: Quality acceptance criteria — Amendment 1

https://www.iso.org/standard/73527.html

ISO 3601-4:2008
Fluid power systems — O-rings — Part 4: Anti-extrusion rings (back-up rings)

https://www.iso.org/standard/42115.html

ISO 3601-5:2015
Fluid power systems — O-rings — Part 5: Specification of elastomeric materials for industrial applications

https://www.iso.org/standard/62902.html

[2] DIN 4768 2010
Determination of values of surface roughness parameters Ra. Rz, Rmax using electrical contact (stylus) instruments Concepts and measuring conditions

[3] DIN EN ISO 4287 2010
Geometrical Product Specifications (GPS) - Surface texture: Profile method - Terms, definitions and surface texture parameters (ISO 4287:1997 + Cor 1:1998 + Cor 2:2005 + Amd 1:2009)

ISO 21920-2:2021
Geometrical product specifications (GPS) — Surface texture: Profile — Part 2: Terms, definitions and surface texture parameters

https://www.iso.org/standard/72226.html

ISO 4287:1997
ISO 4287:1997/Amd 1:2009
ISO 4287:1997/Cor 1:1998
ISO 4287:1997/Cor 2:2002
ISO 13565-2:1996
ISO 13565-2:1996/Cor 1:1998
ISO 13565-3:1998

を統合。

 
# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221020

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.