OmniAICreator/Qiita-1.07M huggingface dataset:
【C++】基礎を学ぶ⑬～配列～

# 配列
**配列**とは、複数の値を保存できる基本的な変数型の一つ
配列を作成するときは要素数を最初に指定する必要がある

### 配列の宣言
```cpp
要素の型 配列名[要素数];
```

### 配列の初期化
```cpp
要素の型 配列名[要素数] = {要素1, 要素2, ...};
```

### 配列要素の取得
```cpp
配列名[要素の場所];
```

## 配列を使ったプログラム
```cpp
#include <iostream>

using namespace std;

int main() {
  int array[5] = {10, 20, 30, 40, 50};
  cout << array[0] << endl;
  cout << array[2] << endl;
  cout << array[4] << endl;
  return 0;
}
```
```
10
30
50
```

## 範囲`for`文
配列のすべての要素に処理を行う場合、**範囲for文**を使うとプログラムが簡潔に書くことができる

### 範囲for文の使い方
```cpp
for (配列の要素の型 変数名 : 配列変数) {
  // 各要素に対する処理
}
```


```cpp
#include <iostream>

using namespace std;

int main() {
  int array[5] = {10, 20, 30, 40, 50};
  for (int x : array) {
    cout << x << endl;
  }
  return 0;
}
```
```
10
20
30
40
50
```

## 次の記事
[【C++】基礎を学ぶ⑭～ポインタ～](https://qiita.com/rapirapi/items/9e847a75ed2155ed1774)
POSTしたデータを登録するAPIを作る

先日は一覧を取得するAPIを作りましたので今日はPOSTしたデータを登録するAPIを作ります。登録機能は認証も必要ですが後回しにしてまずは登録を優先します。

## やりたいこと
・画面上に入力フォームを設置してボタンを押下でPOSTリクエストを送る
　登録APIのエンドポイントは /api/work
・POSTリクエストを受け取りBODYの内容をDBにINSERTする

### 画面の作成
ソースコードが長くなってきたので要点だけ記載します。ファイルが確認したい場合はgitを参照お願いいたします。ボタンを押下すると入力内容をPOSTでリクエスト送付します。レスポンスを受けて画面を更新するなどが通常の動きですがここでは省略します。

```tsx:pages/work.tsx
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
  event.preventDefault();
  let data = new FormData(event.currentTarget);
  axios.post("/api/work",{
    name: data.get('textinput')
  }).then((res) => {
    console.log(res);
  });
};
//・・・中略・・・
        <Box component="form" noValidate onSubmit={handleSubmit} >
          <Grid item xs={12}>
                <TextField
                  required
                  name="textinput"
                  label="作業名"
                  type="text"
                  id="textinput"
                  fullWidth
                />
              </Grid>
            <Button
              type="submit"
              fullWidth
              variant="contained"
              sx={{ mb: 2 }}
            >登録</Button>
        </Box>
```

https://github.com/kusakari-kai/rgforcommunication/blob/main/pages/work.tsx

### APIの作成
登録先テーブルのイメージ

```db
CREATE TABLE Test(
  id TEXT PRIMARY KEY,
  name TEXT,
  create_at TEXT
);
```

API部分です。画面から送付するのはnameだけです。idはUUIDを生成して登録します。create_atは処理時刻を取得して登録します。

```typescript:api/work.tsx
import { NextApiRequest, NextApiResponse } from "next";
import { v4 as uuidv4 } from "uuid";

export default (req: NextApiRequest, res: NextApiResponse) => {
    const method = req.method;
    const nowtime = new Date();
    const datetime = nowtime.getFullYear() + (nowtime.getMonth() + 1) + nowtime.getDate() + " " + 
				nowtime.getHours() + nowtime.getMinutes() + nowtime.getSeconds();
    switch (method) {
      case 'POST': {
        const { name } = req.body;
        const sqlite3 = require("sqlite3");
        const db = new sqlite3.Database("./test.db");
        const result = db.run("insert into Test(id, name, create_at) values(?,?,?)", uuidv4(), name, datetime);
        res.status(200).json({ result });
        break;
      }
      default: {
        res.status(403).end();
      }
    }
}
```

### 画面の動き
入力欄とボタンを設置して入力欄に文字列を入れてボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110457/facbfce8-a018-8ca9-6d53-6b0e387cc101.png)

再度画面をリロードすると登録した内容が表示できます（日付が想定外なので後で直します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110457/66a76488-158d-93fa-1df9-f7842e010917.png)

この後で更新と削除も実装できればと思います。Node.jsから直接DB接続するのではなくDB接続用のアプリを作る方がマイクロサービスっぽいかと思いますが、規模の小さい開発なのでこれでいきます。

AWSの知識を棚卸ししていましたがaurora serverlessみたいな機能もあることを初めて知りました・・・！NodeにはNodeの長所を生かして、他のソフトウェアも長所を生かした美味しいとこどりの構成を作れるか？が特に重要ですし、パブリッククラウドなど色々な機能やソフトウェアを利用しやすい現代において実力差が出やすいと改めて感じます。

独自環境に慣れすぎてその環境の標準しか選択肢がない場合、その環境から外に出ると選択肢が少なすぎてすごく苦労しますし、常に理想の構成を追い求めていきたいですね！環境によってはコスパを重視したり、パフォーマンスを重視したり、と評価基準も異なるので落とし所を見極める視野の広さも身につけたい。。
Pardot 用語のまとめ

[Pardotの質問と回答をまとめに戻る](https://qiita.com/Keiji_otsubo/items/a3ccd1370697dd914723)


+ **Lead (or demand) generation** : リードの生成 (または需要の創出): マーケティング活動を通して製品やサービスに対する関心を喚起すること。

+ **Visitor** : ビジター: Web サイトを訪問し、Pardot での追跡の対象となる匿名の人。 

+ **Conversion** : コンバージョン: ビジターが Pardot のランディングページまたはフォームに連絡先情報 (メールアドレスなど) を記入して登録すると、プロスペクトに変換されます。

+ **Prospect** : プロスペクト: 匿名のビジターが変換され、識別情報が特定された人。プロスペクトのレコードは Pardot 内に存在します。これは、Sales Cloud やその他の CRM のリードレコードと似ています。

+ **Lead nurturing** : リードの育成: プロスペクトが実行したアクションおよび特定の評価条件を満たすかどうかに基づいて、対象を絞ったメッセージを一定の間隔で送信すること。 

+ **Lead qualification** :  リードの評価: 組織ではおそらく何千人 (あるいは何十万人) もの人々とやり取りしていることでしょう。営業チームがこの全員に連絡することはできないため、最適なプロスペクトを営業に伝えることがマーケティング担当者の職務になります。プロスペクトという干し草の中から金の針を見つけ出すプロセスをリードの評価といいます。プロスペクトを営業担当に割り当ててフォローアップしてもらうかどうかのしきい値を決定します。

Pardot では、リードの評価にスコアとグレードという 2 つの指標を使用します。 

+ **Prospect score** : プロスペクトのスコア: プロスペクトのスコアは、プロスペクトが製品またはサービスにどのくらい関心を持っているかを示す数値です。プロスペクトのスコアは、プロスペクトがマーケティング資料にどのような操作を行ったかに基づいて増減します。

+ **Prospect grade** : プロスペクトのグレード: プロスペクトのグレードは、文字 (A、B、C、D など) で表されます。  これは、プロスペクトの理想像となるプロファイルにプロスペクトがどのくらい合致しているかを示します。

スコアとグレードを活用することで、どのプロスペクトがファネルの終点に到達する準備ができていて、営業担当者がフォローアップを行うべきかを判断できます。Pardot オートメーションを使用すれば、評価済みプロスペクトを適切な営業担当にすばやく割り当てることができます。

+ **Campaigns** : キャンペーン: キャンペーンはマーケティング活動のパフォーマンスを把握するのに役立ちます。キャンペーンは、Pardot と Salesforce のマーケティング ROI レポートの基盤になります。Pardot でキャンペーンを使用するにはいくつかの方法があります。たとえば、Pardot のすべてのプロスペクトにはキャンペーンが割り当てられていて、そのプロスペクトが会社と最初に行ったマーケティング関連のやりとりがわかります。また、キャンペーンを使用して関連するマーケティング資料をグループ化することもできます。そして最も重要なのは、キャンペーンと併せて Pardot オートメーションを使用することで、プロスペクトのジャーニーのすべてのマーケティングタッチポイントを追跡できるため、ROI レポートが向上することです。

 + [作成されたプロスペクト] テーブルに表形式で表示されるのはどのようなプロスペクトですか? -->　フォームの登録によって変換されらプロスペクト

+ [スコアリングカテゴリ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000IQNRISA5)
【Git】cherry-pickを利用して別のブランチにある特定のコミットを取り込む方法

## はじめに
業務でGitを触る際にcherry-pickコマンドを利用して現在いるブランチに別のブランチにある特定のコミットを取り込む機会があったので、ついでに記事にしていきたいと思います。

## 今回やること
以下のように別のブランチにある特定のコミットを取り込みます。

![cherry-pick.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/daba2768-cc99-25e1-9cf0-b98f110053fa.png)

## 作業手順

### 特定ブランチを取り込みたいブランチに移動する。

```zsh:コマンド
git checkout <特定のブランチ>
```

```zsh:コマンド例
git checkout update-readme
```

### 事前にコミットログを確認する。

```zsh
% git log --oneline
2ce9304 (HEAD -> update-readme, origin/update-readme) Update README.md
4fb0e46 (master) Update README.md
714f797 Update README.md
5de7b2b Merge pull request #2 from satton-infra/20211112
ec722ab 20211112 csvとPictureの追加
18a246f Merge remote-tracking branch 'origin/20211112' into 20211112
4c7b065 Merge pull request #1 from satton-infra/20211112_PictureAdd
3a24abe 20211112_PictureAdd
f90876e 20211112 Picture削除
2a19889 20211112 Picture追加
98eaa09 2021/11/12 first commit
%
```

### 別のブランチにある特定のコミットを取得する。

```zsh:コマンド
git cherry-pick <コミットID>
```

```zsh:実行例
% git cherry-pick 2aeb460
[update-readme 2938cee] Add user for users.csv
 Date: Sun Jul 10 12:45:14 2022 +0900
 1 file changed, 2 insertions(+), 1 deletion(-)
%
```

※今回は別ブランチにあるコミットID`2aeb460`を取り込みます。

```zsh:別ブランチのコミットログ
% git log --oneline
2aeb460 (HEAD -> add-user-for-users-csv, origin/add-user-for-users-csv) Add user for users.csv
2ce9304 (origin/update-readme, update-readme) Update README.md
4fb0e46 (master) Update README.md
〜〜〜省略〜〜〜
%
```

### 特定のコミットが取得できていることを確認

```zsh:作業ブランチのコミットログ
% git log --oneline
2938cee (HEAD -> update-readme) Add user for users.csv ← これ
2ce9304 (origin/update-readme) Update README.md
4fb0e46 (master) Update README.md
714f797 Update README.md
〜〜〜省略〜〜〜
%
```

## 参考記事
https://www.r-staffing.co.jp/engineer/entry/20200327_1

https://git-scm.com/docs/git-cherry-pick
LaravelをApache上で実行するときの備忘録（htaccessが動作しない）

## 経緯と現象

- Apache Webサーバ上でLaravelプロジェクトを動かしたい
- トップページは表示される
- 他のページへ遷移しようとすると、[404 Not Found]エラー

## 環境

- Virtualbox`6.1.34`
- CentOS`7.9`
- Apache`2.4.6`
- PHP`7.1.33`
- Laravel`5.6`
- プロジェクトルートパス`/var/www/html/project`

## 原因

### Apacheが「htaccessによるディレクティブ（指示）の上書き」を許可していなかった

- そのため、トップページ以外は正しいリクエストがLaravelプロジェクトに届いていませんでした

### .htaccess（エイチティーアクセス）ってなに？

- Apacheの動作を**ディレクトリ単位で制御する**ためのファイルです
（Nginxでは使えない）
- リダイレクトやBASIC認証、アクセス制限などを設定できます
- ちなみに、Apache自体の制御は`httpd.conf`ファイルで行います（セキュリティ的には極力confファイルで制御するのが良いらしいです）

### Laravelと.htaccess

- Laravelプロジェクトを作成するとpublic/に`.htaccess`が作られます
- Laravelプロジェクトにきたリクエストは、すべてpublic/index.phpを経由することになります
- そのため、public配下にある.htaccessによって制御が行われます

## 解消方法

### Apacheの設定ファイル（`httpd.conf`）で、.htaccessによる制御を許可します

- 設定ファイルを開く

```bash
sudo vi /etc/httpd/conf/httpd.conf
```

- 書き換え許可を設定
    - ⚠️Apacheのバージョンによっては書き方が違います

```
<Directory "var/www/html/project">
	Require all granted 👈 指定ディレクトリへのアクセスをすべて許可 
	AllowOverride All 👈 .htaccessで全てのディレクティブを許可
</Directory>
```

- Apacheを再起動

```bash
systemctl restart  httpd
```

- 無事アクセスできました🎉

## 参考

[Apacheディレクティブの使い方 - hana_shinのLinux技術ブログ](https://hana-shin.hatenablog.com/entry/2022/05/03/201550)

[Requireディレクティブ：アクセスの許可や拒否などのアクセス制限を行う(Apache2.4以降)](https://www.javadrive.jp/apache/allow/index1.html#section1)

[core - Apache HTTP サーバ バージョン 2.4](https://httpd.apache.org/docs/2.4/ja/mod/core.html#allowoverride)
【C++】基礎を学ぶ⑫～関数の作成～

# 関数の作成
自分で関数を作成することを関数を**定義**するという
**関数**はデータを投入すると処理を行い、新しい結果を返します

## 関数を作成するメリット
* プログラムの**可読性**が向上する
* **再利用**することができ、何度も同じコードを書く必要がなくなる

## 関数の構文
```cpp
返り値の型 関数名(引数の型 引数の名前, ...) {
  // 処理
  return 返す値;
}
```

### 小さい値を返す関数
```cpp
#include <iostream>

using namespace std;

int my_min(int x, int y) {
 
  if (x < y) {
    return x;
  }
  else {
    return y;
  }
 
}
 
int main() {
  int answer = my_min(10, 5);
  cout << answer << endl;
}
```
```
5
```

### 返り値がない関数
返り値の型`void`にすることで、返り値のない関数を作成できる
```cpp
#include <iostream>

using namespace std;

void hello() {
  cout << "Hello World!" << endl;
}
 
int main() {
  hello();
  return 0;
}
```
```
Hello World!
```

## 呼び出し元よりも上に関数を定義する
関数の呼び出し元よりも下に関数を定義するとエラーが発生する
```cpp
#include <iostream>

using namespace std;

int main() {
  hello();
  return 0;
}

void hello() {
  cout << "Hello World!" << endl;
}
```
```
ビルドを開始しています...
C:\MinGW\bin\g++.exe -fdiagnostics-color=always -g C:\Git\C++\test.cpp -o C:\Git\C++\test.exe
C:\Git\C++\test.cpp: In function 'int main()':
C:\Git\C++\test.cpp:6:3: error: 'hello' was not declared in this scope
    6 |   hello();
      |   ^~~~~

ビルドが完了しましたが、エラーが発生しました。
```

### プロトタイプ宣言
**関数名**と**引数と返り値**だけを先に宣言する
```cpp
#include <iostream>

using namespace std;

// プロトタイプ宣言
void hello();

int main() {
  hello();
  return 0;
}

void hello() {
  cout << "Hello World!" << endl;
}
```
```
Hello World!
```
## 次の記事
[【C++】基礎を学ぶ⑬～配列～](https://qiita.com/rapirapi/items/5db9df6b8e661c6df1cf)
【簡単】Node.jsにsassをインストールする手順

## はじめに
- Node.jsにsassをインストールした際に、エラーになったので、解決手順を備忘録として残します。

## 環境
- Mac
- node バージョン：16.15.1
- npm　バージョン：8.11.0

## 前提
- Node.jsはインストール済み(公式サイトから推奨版をインストール)
  [Node.js公式サイト](https://nodejs.org/ja/)

## 状況

- sassのバージョンを指定してインストール
```
$ npm install --save-dev node-sass@4.14.1 sass-loader@10.0.2
```

- 上記のコマンド実行後に、下記エラー【抜粋】が発生。

```
npm ERR! gyp verb check python checking for Python executable "python2" in the PATH
npm ERR! gyp verb `which` failed Error: not found: python2
```

## 原因
- 参考記事によると、Nodeのバージョンが原因。
(今回は、16.15.1のバージョンをインストールしていたため、node-sassが対応していないバージョンだったみたいです。)

## 手順

- Node.jsをアンインストールする。

- 下記のコマンドでアンインストールできるとのことなので、実行
(検索して沢山出てきたコマンド)
```
$ lsbom -f -l -s -pf /var/db/receipts/org.nodejs.node.pkg.bom \
> | while read i; do
>  sudo rm /usr/local/${i}
> done
$ sudo rm -rf /usr/local/lib/node \
>     /usr/local/lib/node_modules \
>     /var/db/receipts/org.nodejs.*
```

- 下記エラー発生。(よく分からずにコマンド実行は改めて良くないと思いました。)

```
can't open /var/db/receipts/org.nodejs.pkg.bom: No such file or directory
**** Can't open /var/db/receipts/org.nodejs.pkg.bom.
```

- Nodeのパスを取得する
```
$ which node
/usr/local/bin/node
```

- 削除する
```
$ sudo rm -rf /usr/local/bin/node
```

- 削除できたか確認
```
$ node -v
zsh: command not found: node
```

削除できました。削除方法は、パッケージ（pkg）版かソース版かで異なるみたいです。(参考記事より)なるほどー。

- バージョンを指定してNode.jsをインストールする。(バージョン14.19.2は下記からどうぞ)
[Node.js v14](https://nodejs.org/es/blog/release/v14.19.2/)

- バージョンを確認する
```
$ node -v
v14.19.2
```

- sassのバージョンを指定してインストールする。無事にインストールできました！
```
$ npm install --save-dev node-sass@4.14.1 sass-loader@10.0.2
```
```
Testing binary
Binary is fine
+ sass-loader@10.0.2
+ node-sass@4.14.1
```

## まとめ
- 簡単にsassの導入方法をまとめました。お役に立てれば幸いです:relaxed:

## 参考記事
- [gulp-sassインストール時のエラー「`which` failed Error: not found: python2」の対処方法（Windows）](https://kenyo--c.com/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/2147/)
- [インストールしてあるNode.jsやnpmをアンインストール](https://ima-wc.jp/blog/1357)
- [【Mac版】node.jsのアンインストールと再インストール手順メモ](https://qiita.com/wagi0716/items/94193a80502f9d81a9e0)
CMakeでhello world

# 内容
- 基本的なCmakeLists.txtの作法について
    - CmakeLists.txtを使ってvisual studio環境(2019)で"hello world"を表示する方法を学ぶ
        - コンパイル対象の指定
        - インクルードパスの追加
        - リンク対象の指定
        - サブフォルダ指定
        
# 基本操作
CmakeLists.txtを使ってvisual studio環境(2019)で"hello world"を表示することを目指します

フォルダ構成は以下
```
.
├── CMakeLists.txt
├── include(project1とproject2からincludeされる.h)
│  └── hello.h
│      
├── project1(exe作成用)
│  ├── CMakeLists.txt
│  └── main.cpp
│      
├── project2(lib作成用)
│  ├── CMakeLists.txt
│  └── hello.cpp
```

各ソースファイル
```c++:main.cpp
#include "hello.h"

int main() {
    hello();
}
```

```c++:hello.h
#pragma once
void hello();
```

```c++:hello.cpp
#include "hello.h"
#include <iostream>

void hello() {
    std::cout << "Hello World" << std::endl;
}
```

プロジェクトディレクトリ上のCmakeLists.txtは以下
使用言語やインクルードパスの指定、ビルド対象のフォルダ指定などを行う
```./CmakeLists.txt
# CMakeのバージョンを設定
cmake_minimum_required(VERSION 3.8)

# プロジェクト名と使用する言語を設定
project(test_cmake CXX)

# インクルードパスを追加する
# サブディレクトリの追加より先に行う必要がある
include_directories(${PROJECT_SOURCE_DIR}/include)

# サブディレクトリを登録
add_subdirectory(project1)
add_subdirectory(project2)

```
- cmake_minimum_required()
    - CMakeの最低バージョンを指定
- project()
    - プロジェクト名と使用する言語を設定
- include_directories()
    - インクルードパスを追加
        - これでサブディレクトリに追加したフォルダにもインクルードパスが通る
- add_subdirectory()
    - サブディレクトリを登録
    - 指定したフォルダにCmakeLists.txtがある場合はそのCmakeLists.txtのビルド方法に従う

Project1下のCmakeLists.txt
実行ファイルの作成を行っている
```Project1/CmakeLists.txt
# tmp.exeという実行ファイルをmain.cppから作成
add_executable(tmp main.cpp)

# tmpを作る際にhello.libをリンクする
target_link_libraries(tmp hello)
```
- add_executable()
    - ビルドする実行ファイルを指定
- target_link_libraries()
    - リンク対象を指定

Project2下のCmakeLists.txt
実行ファイルの作成を行っている
```Project1/CmakeLists.txt
# hello.libといファイルhello.cppから作成
add_library(hello STATIC  hello.cpp)
```
- add_library()
    - ビルドするライブラリを指定

以上
CentOS7でpythonをdaemon化してみた

最近某ドラマでdaemonという言葉を知った。
名前からして興味が湧いたため(小並感)CentOSでやってみることにした

◆そもそもdaemonとは？
UNIX系のOSでバックグラウンドで常駐し動作している(動作できるように待機している)プログラム。
内容にもよりますが、自動化させたいシステムがあればdaemon化すると何かと便利かもしれません。

今回は3秒事に現在時刻を取得し、それをtextに保存するpythonをdaemon化してみます。

[環境]
CentOS7(virtualBOX)
rootユーザー（daemon作成できればそれでいいや！と思いrootで操作します🍞
（一般ユーザーの場合はところどころroot権限が必要な点があるのでsudo等活用ください）

やってみる！

◆python環境構築
python3をインストール
`# yum install python3`

install後、pythonがinstallされていることを-Vオプションにて確認。
`# python3 -V`
-> Python 3.6.8

◆作業場所確保
今回/workPlaceというディレクトリで作業します。
`# mkdir /workPlace && cd /workPlace`

この/workPlaceにviコマンドなどで
1.daemon_ts.py
2.daemon_st.service
ファイルを作成します。

◆python, serviceファイル作成
まずはpythonファイル作成から・・・
```python:daemon_ts.py
#!/bin/python3

#↑シェバンも忘れずに！/bin/python3を使ってこのpythonを実行するように
#シェバンを記述しておきます。(# which python3 の出力結果をシェバンに記述しました)

#この度利用する標準ライブラリをimport
import time
import datetime
path = '/workPlace'

#無限ループ作成
while True:
	now_time = datetime.datetime.now() #現在日時取得
	#workPlace配下にLog.txtを作成。また'a'モードによりtxtを上書きしていく。
	with open(path + '/Log.txt', 'a') as f: 
		#以下現在日時をtxtに記述していく
		f.write("Hello! Current Time : " + str(now_time) + "\n")
	#一連の動作が終えたら3秒pythonをsleep(一時停止)する
	time.sleep(3)
```

daemon_ts.pyに権限付与
`# chmod 755 daemon_ts.py`
<font color="red">↑ これ忘れるとdaemon動作しないので重要！です</font>

◆serviceファイル作成
```unit-file:daemon_st.service
[Unit]
Description = hello daemon #任意の内容で大丈夫です。systemctl statusとかで表示されます。

[Service]
ExecStart = /workPlace/daemon_ts.py　#daemon起動時に実行するスクリプトの絶対パスを記述。
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

serviceファイルを以下にコピー。
`# cp daemon_st.service /etc/systemd/system`

systemディレクトリに移動
（ディレクトリ移動しなくともよいですが、enable時、ファイル名をtab保管しやすいので移動します）
`# cd /etc/systemd/system`

◆daemon起動！

`# systemctl enable daemon_st.service`
`# systemctl start daemon_st.service`
`# systemctl status daemon_st.service`
`# cat /workPlace/Log.txt`

コマンド説明補足。上から
 1.daemon自動起動有効
 2.daemon開始
 3.daemonの状態確認
 4.Log.txtの中身の確認
になります。

以下のようになっていればdaemon起動成功です
![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301926/c0623d79-9748-700d-8a7d-fb5587014d80.png)

↑ 3秒ごとの現在日時を取得するpythonがちゃんと仕事していることがわかる

◆daemon停止、後始末
`# systemctl stop daemon_st.service`
`# systemctl disable daemon_st.service`
`# rm -f daemon_st.service`
`# systemctl daemon-reload`

コマンド説明補足。上から
　1.daemon停止
　2.daemon自動起動無効
　3.serviceファイル削除
　4.設定ファイルの再読み込み
になります

以上です！
今回virtualBOXにてdaemon化を取り組みましたが
dockerでも実現可能だったりするので
よければお試しください〜！（ちなみにdockerではOSをdebianにて取り組みました）

最後までご閲覧ありがとうございました！
Amazon CloudFrontの用語要点まとめ（自分用メモ

・Amazon CloudFront
AWS上で動作する安全で高速なコンテンツ配信ネットワーク。CloudFrontを利用すると、世界各地に配置されているエッジロケーションから、自動的にクライアントと地理的な距離が近いエッジロケーションが選択。そしてエッジロケーション内のエッジサーバーがコンテンツを配信します。
CloudFrontのオリジンサーバーには、インスタンスやS3などのAWSサービスや、オンプレミスのサーバーを設定できます。

コンテンツ配信ネットワーク（Content Delivery Network:CDN）
インターネット上のコンテンツを高速化して配信するためのネットワークのこと。世界各地の配信サーバー（エッジサーバー）がオリジナルデータがあるサーバー（オリジンサーバー）のコンテンツをコピーして保管（キャッシュ）。クライアントはオリジンサーバーへアクセスする代わりに、エッジサーバーのキャッシュからコンテンツを受け取ります。
コンテンツ配信ネットワークを利用することにより、クライアントがコンテンツに低遅延でアクセス可能になる他、オリジンサーバーへの負荷軽減にもなります。

CloudFrontでは、静的なコンテンツのほか、ライブストリーミングやオンデマンドストリーミングなどの動的なコンテンツも高いパフォーマンスで配信できます。AWSメディアサービス（動画伝送サービスや、動画変換サービスなど）と連携して、世界中にいるクライアントからのリクエストに対して低遅延で動的コンテンツを配信。

・エッジロケーション
AZとは異なるAWSデータセンターで、AZよりも数多く世界中に配置されています。Amazon CloudFrontやAmazon Route 53など一部のグローバルサービスを提供するとともに、AWS Global Acceleratorを利用してユーザーからリージョンサービスへアクセスする際の通信経路でもあります。

・ディストリビューション
CloudFrontを使用するには、はじめに「ディストリビューション」を作成します。ディストリビューションではオリジンサーバーやキャッシュなど、コンテンツを配信するために必要な各種設定をします。
ディストリビューションを作成するとCloudFrontを通してコンテンツにアクセスするためのURL「http(s)://xxxxxx.cloudfront.net」が発行されます。URLは通信の暗号化の有無（HTTP/HTTPS）を選択できます。AWS Certificate Manager（サーバー証明書を管理するサービス）から発行したサーバー証明書をインポートすることで、URLに独自ドメイン名を使用することもできます。

■オリジンサーバーの設定
オリジンサーバーは、S3バケットやELBなどのAWSサービスから選択するか、ドメイン名を入力します。
すでにS3の静的Webホスティング（バケットに保存している静的コンテンツをWebサイトとして公開できる機能）を設定しているS3バケットもオリジンサーバーとして指定できます。

■キャッシュの設定や機能
○キャッシュTTL（Time To Live:TTL）
キャッシュを保持する時間のことです。URLパスごとに指定できます。CloudFrontはキャッシュTTLが超過した後にクライアントからのリクエストを受けると、オリジンサーバーにコンテンツの更新有無を確認し、更新されていればキャッシュに反映しつつ応答を返します。
キャッシュTTLを含むキャッシュの設定のことを「キャッシュBehavior（ビヘイビア）」といいます。

○キャッシュ削除（Invalidation）
エッジサーバーに保存されているキャッシュを即座に削除できる機能です。キャッシュを削除した後にクライアントからデータのリクエストを受け取ると、エッジサーバーは必ずオリジンサーバーへコンテンツを取得しにいくので、クライアントへ配信するコンテンツが最新化されます。削除対象のデータはフォルダ名やファイル名で指定できます。

・OAI（Origin Access Identity）
OAIは、S3バケット内のコンテンツへのアクセスをCloudFront経由でのアクセスに限定し、クライアントからS3バケットへ直接アクセスされないようにする機能です。クライアントからオリジナルコンテンツへの直接アクセスを制限することにより、オリジンサーバーのデータを保護できます。
オリジンサーバーにS3バケットを選択すると、OAIの設定が表示。

・CloudFront署名付きURL
CloudFront署名付きURLは、URLを知っている特定のクライアントが期限付きでコンテンツへアクセスできる機能です。S3の署名付きURLと同じく、CloudFront署名付きURLは非常に長いランダムな文字列で作成されているため、URLを知らない人が推測することはほぼ不可能です。
CloudFront署名付きURLを利用する時は、OAIを有効にしてS3バケットへ直接アクセスされないように設定します。また、URL発行時に有効期限を設定すると、有効期限の過ぎたURLは無効になります。

・地理的制限
クライアントからのアクセスを国別に制限できる機能です。クライアントの接続情報から接続元の国を判別して、ホワイトリストに設定した国からのアクセスは許可、ブラックリストに設定した国からのアクセスは拒否します。例えば、特定の国に対して法律上の理由でコンテンツの配信ができない場合などに利用します。
【メモ】Tech系Podcastや動画 全員 DI Podcast デザインパターン ナレッジ

## 開発
### 設計
　　GofデザインパターンとDI 前編　https://castbox.fm/x/28wF7
　　GofデザインパターンとDI 後編　https://castbox.fm/x/29dOx
  　VO（Value Object）
 https://fukabori.fm/episode/73

## イベント
### JJUG
2022 Fall
https://youtube.com/playlist?list=PLy44EKO1L0eIl0VIYmGXk9635j6QQ7cF0

### OpenAI
GPT4
https://www.youtube.com/live/outcGtbnMuQ?feature=share
VirtualBox Guest Additionsがインストールできない

# はじめに
この記事は、GuestAdditionがインストールできないときに、疑ってみると良いことを備忘録のように、書いています。
具体的な解決方法は、載せていませんので、ご了承ください。
ちなみに、筆者は解決までに3時間を無駄にしました。依存パッケージをインストールしたり、再起動も確認しました。しかし、メモリをもっとゲストOSに割り振ってあげればよかっただけでした(経験談)

# 概要
VirtualBoxで仮想マシンを使いたいときに、**VirtualBox Guest Additionsをインストールしたい**ことがあります。失敗しても、適当に記事を検索して、試行錯誤するとインストールが成功します。しかし、改善しないことがあります。その時は、**ユーザー固有の環境や設定が原因**を疑ってみてください。ユーザー固有の問題だと、検索しても具体的な解決方法が載っていないので、解決できないことが多いです。もし時間が限られているハンズオンに参加しているなら、無駄に時間を消費しないためにも、GuestAddionsを使わない手段を考えることも、良い解決策でしょう。(ホストからSSH接続して使うなど)
さて、この記事では、そういったGuestAddionsがインストールできないときに、**疑うべき項目**について整頓しておきます。

# 疑うべき事項
1. 依存パッケージがインストールされていない
    * GuestAddionsをインストールするときに必要なものです。それが足りてないことがあります。
    * CentOS8.0における、解決策の一例を下記「依存パッケージインストールの例」で、説明します。
    * 足りていないパッケージは個々に異なるので、すべて網羅することはできません。そこで、エラーメッセージを見たり、ログを確かめて、足りないパッケージをインストールしましょう。
1. 再起動をしていない
    * 再起動後にGuestAddionsは有効になるため、なぜ成功しなかったか問題がわからなかったら、とりあえず再起動してみましょう。再起動を忘れてるだけかもしれません。
1. **ゲストOSに振っているリソースが足らない**
    * ゲスト環境に、十分なリソースを渡していないと、インストールが失敗するケースがあります。**このケースでの失敗は、検索しても、解決策が出てこない**ことが多いです。個々の環境で異なる部分だから、明確な解決策がありません。
    * だいたい、ビデオメモリー、メモリー(RAM)を多く渡してあげると解決します。
    * 例（注意: ゲストOSによって、動作推奨環境は異なる）
        * メモリー
            * 2048Mb→4096Mb
        * ビデオメモリー
            * 10Mb→50Mb
           
## 依存パッケージインストールの例　(例：CentOS 8.0)
依存パッケージで問題が解決するときはだいたい下記のように、依存パッケージをインストールすることで解決します。
下記は、CentOS8.0のときの事例です。
1.システムをアップデートします
```
yum update
```
2.依存パッケージをインストールします
```
yum install bzip2 gcc make perl kernel-devel kernel-headers elfutils-libelf-devel
```
3.VirtualBox Guest Additionsインストールします
4.再起動
5.インストール成功

## おわりに
割と、ゲストOSに割り振っているメモリー容量が足らないとか、気づきませんよね。もし共感できる方はいいねしてください。
同じとこで詰まってしまった方が、早く気づいて無駄な時間を浪費しないと良いです。
【AWS】EC2

# EC2とは？
仮想サーバを提供するコンピューティングサービス。オンプレミス環境でサーバーを用意しようとすると、OSのインストール、ラックの増設、ネットワークや電源の管理（面倒な配線の敷設）といった様々な作業が必要となってしまう。
加えて新サービスを構築する際は、必要となるコンピューティングリソースの「見立て」に基づいて、上記の作業を実施する必要がある。万一リソースが足りない際は、サービスとして致命的だし、リソースが大きすぎた場合は採算が取れなくなる。

そこでAmazon Elastic Compute Cloud (EC2)の出番。
「インスタンス」と呼ばれる単位でサーバが管理される。これさえあれば簡単にOSまで搭載された「箱」が用意された状態まで持っていける。なのでWebサイトを公開したいとなったときも、「まずはApacheをインスタンスにダウンロードして、Webサーバを作って。。。」というところから話を始められるようになる。
EC2を起動するときは、元となるイメージを選んでインスタンスを作成する。Amazon Machine Image (AMI)と呼ばれる。

インスタンスは「箱」でありハードウェア。
AMIはOS諸々の設定を担う「種」のような存在。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/5c1f17c9-b25d-c5fc-9665-327e0119965a.png)
画像引用：[Amazon EC2のAMIとインスタンスの違いは何か？](https://ssaits.jp/promapedia/technology/post-1305.html)

こんな形で、インスタンスにインストールするOSを選択することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/bb94936e-648d-1343-796d-2147a30140f2.png)
画像引用：[Amazon EC2のAMIとインスタンスの違いは何か？](https://ssaits.jp/promapedia/technology/post-1305.html)

AMIにはAmazon Linux AMIやRed Hat Enterprise linux, Microsoft Windows Serer といったAWSが標準で提供しているものや、各ベンダーがサービスをプリインストールしたAMIがある。

https://eng-entrance.com/linux-centos-ubuntu#CentOSUbuntu


# インスタンスタイプ
EC2ではインスタンスのスペックを選択することができる。
インスタンスタイプは「m5.large」「p3.8large」といった形で表記される。

https://aws.amazon.com/jp/ec2/instance-types/

# EBS
ディスク機能であるEBSがセットになる。AWSが提供するブロックストレージサービス。
EC2→仮想サーバ
EBS→HDD
のような関係性。EBSの性能が優秀であればパフォーマンスも上がる。


# 状態
Running
Stopped
Terminated

の3つがある。Stopped（停止中）としてもEBSの料金は課金され続けるので注意。


# コスト最適化のための方法
需給を一致させる方法と、トリッキーなインスタンス購入方法を採用する方法の２パターンがある。

1. 需給を一致させる方法
CloudWatchで日頃から自分のサービスで動いているデータ量を観測し、EC2のAutoScalingでリソースの調整を行うことができる。

2. トリッキーなインスタンス購入方法
通常使うインスタンスは「オンデマンドインスタンス」と呼ばれ、これの価格が定価にあたるもの。
これに対して1年〜3年の利用を約束することで3~7割の値引きを受けられるのが「リザーブドインスタンス」である。
さらにその時の余剰リソースを入札性で購入するのが「スポットインスタンス」である。MAX9割ほどの値引きになることもあるとか。



いろいろな単語が出てきたが、
要は電力や資源の購入と同じで、先物で大量購入したり余剰在庫を安く買い取ったりするイメージ。
【Python】appendでNoneが返ってくる

appendの使い方について躓きがあったので共有します。

# 環境
Python 3.7.13
Google Colaboratory

# 経緯

for文で計算した値をリストに代入しpandasでデータフレームに変換して値の推移のグラフを描きたかった。その時に計算結果をappendで代入してNoneが返ってきてしまい困り果てる。

# appendを関数の引数や式に代入するとNoneが返ってくる

appendで値を代入してリストを作成するとNoneになります。
```python
a = [1]
b = [1, 2]

#appendを式に代入。c = [[1], [1, 2]]となることを期待。pythonならいけると思った
c = a.append(b)
#この時cはNoneになるみたい。Colaboratoryでcを表示させても何も出てこない

print(c)

#printの出力としてNoneが返ってくる
```

また、関数の引数にappendを使ってもNoneが返ってくる。
```python
print(a.append(b))

#None
```

# 対策

あらかじめ空のリストを作成し、それにappendで代入する。
```python
a = [1]
b = [1, 2]

#あらかじめ空のリストを作成
c = []

#空のリストに代入。appendは一つずつしか代入できないことに注意
c.append(a)
c.append(b)

print(c)

#[[1], [1, 2]]
```

Noneではなくエラーになってくれた方が分かりやすくて助かるのですが、そういう仕様みたいなのでどうしようもないですね。横着せずに正確にコードを書きたいものです。
【C++】基礎を学ぶ⑪～while文～

# `while`文
条件式が**真**（`true`）の間、**繰り返し**処理を実行する

## `while`文の使い方
```cpp
while (条件式) {
  // 繰り返す処理
}
```
## N回処理を繰り返すプログラム
```cpp
int i = 0;
while (i < N) {
  // 繰り返す処理
  i++;
}
```
## `while`文で0から5まで出力するプログラム
```cpp
#include <iostream>

using namespace std;

int main(){
  int i = 0;
  while (i <= 5) {
    cout << i << endl;
    i++;
  }
	return 0;
}
```
```
0
1
2
3
4
5
```
## 次の記事
[【C++】基礎を学ぶ⑫～関数の作成～](https://qiita.com/rapirapi/items/2107c0e6b29147bd6b74)
【AWS】ストレージサービス群

# Amazon EBSとは
AWSが提供するマネージド・ストレージサービスの１つ。
Amazon EBS(Elastic Block Store)の略称。


# S3との違い

この記事がめちゃくちゃ分かりやすい。

https://tech-dive.xyz/2018/10/30/post-147/

EBSはPCでいうHDDに当たる存在。直接EC2とアタッチされている関係性。
一方S3はネットワークを介した接続となる。なので、アップロードの速さに関してはEBSに軍配が上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/7e2206ff-b470-f029-4bd7-7956d6840053.png)

画像引用：[同じストレージなのに何が違うの？EBSとS3の違い](https://tech-dive.xyz/2018/10/30/post-147/)


ちなみにアタッチとマウントの違いは。。。。

[アタッチ](https://e-words.jp/w/%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81.html)：ストレージ装置や記憶領域といったハードウェア資源を、特定の仮想化環境に追加して利用できるようにすることを指す。

[マウント](https://www.idcf.jp/words/mount.html#:~:text=%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB,%E3%81%AE%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%80%8D%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82)：コンピュータに接続した周辺機器や外部記憶装置等をオペレーティングシステム（OS）に認識させ、利用可能な状態にすることを指す。


あとは料金体系も違うらしい。S3はデータ量に応じて課金されるのに対して、EBSは確保した枠に対して課金されるとのこと。S3の方が安い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/e901772d-6028-5a39-76cd-0820d7252672.png)

個人的にS3一択になる気がするのだが（どちらも可用性99.9999....%で変わらないし）
どういう場面でEBSが使われるのだろう。。。。。



>EBSはEC2にアタッチするだけでは使用できません。
アタッチしただけではOS側から"ただのディスク"としか見られていないため、
使用するにはEBSをフォーマットした上でマウントする必要があります。


# EBS最適化インスタンス
EC2とセットで使用されるストレージであることに注意する。これはつまりネットワークが共有されているということ。EC2の通常のネットワーク帯域とEBSアクセス用の帯域を別々にするオプションを適用することで、最適化が図れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/a86a7943-1a0a-4066-8d97-3bb16816b5ed.png)


画像引用：[【初心者】 EC2のインスタンスタイプが多すぎて、どれを選べばいいか分からない問題に立ち向かう](https://biz.nuro.jp/column/aws-mama-022/)


# IOPSとは
1秒当たりにディスクが処理できるI/O（Input/Output）アクセスの数のこと。
ストレージの性能の指標の1つ。
数値が大きい方が「優秀」ということになるが、細かくはまだ分からない。
こちらの記事が参考になりそう。

https://www.storage-channel.jp/blog/iops.html


# EBSのストレージタイプ
SSDタイプが２種類。HDDタイプが２種類ある。

・汎用SSD
・プロビジョンドIOPS SSD （io1）
・スループット最適化 HDD（st１）
・Cold HDD (sc1)
※別途旧世代のもので「マグネティック」と呼ばれるものがある。こいつは最大200IOPS程度しか出せない。




# EFS (Elastic File System)
容量無制限で複数のEC2インスタンスから同時にアクセスが可能なファイルストレージサービス。
EBSとの違いは[こちら](https://dev.classmethod.jp/articles/comparison_ebs_efs/)で分かりやすく解説されていた。
EBSは1つのEC2に対してマウントされるものであるが、EFSは複数のEC2からアクセス可能である。そしてEFSは容量無制限である。使い分け方はよくわからないので勉強中。
NASみたいなイメージ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/8b448c43-85eb-3445-44ce-706017c589a9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/bbfdc394-afc0-2243-7209-090f0f407abd.png)

画像引用：[[初心者向け] Elastic Block StoreとElastic Files Systemの略称が似てるのでイメージを比較しました](https://dev.classmethod.jp/articles/comparison_ebs_efs/)


# 参考
https://bcblog.sios.jp/what-is-amazon-ebs/

https://qiita.com/centerfield77/items/6ab66cf39427164b16da

https://biz.nuro.jp/column/aws-mama-022/

https://dev.classmethod.jp/articles/comparison_ebs_efs/
Jupyter Labのインストール方法

## 仮想環境を作成します
※この処理はしなくても良いです。
JupyterLabが不要になった際にすぐ削除できるので便利です^^

```
python -m venv jupyter
.\jupyter\Scripts\activate
```

## JupyterLabをインストールし、実行します

```
pip install jupyterlab
jupyter-lab
```

たったこれだけでインストールし、実行できるようになります。
Jupyterlabは便利ですので、是非利用してみてくださいね。

## youtubeで確認
[![altテキスト](https://storage.googleapis.com/zenn-user-upload/ad1dd585da92-20220710.png)](https://www.youtube.com/shorts/0GkjbKSnM9M)
Yolov7でた！〜２０２２夏〜高速・高精度物体検出

# より高速な物体検出モデルを使いたい！！

<img src=https://user-images.githubusercontent.com/23278992/178129396-419500fd-ec4c-4902-867e-908fae4e0f43.gif>

![1427b9c1-5d23-4db2-bafe-45b2f0299c11.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/4e3aa42e-2356-974a-0167-25a66c910867.jpeg)

かんたんに使える物体検出モデル、家電と同じで、どうせなら一番新しくていいやつを選びたいじゃないですか。

# Yolov7〜高速物体検出シリーズの新しいバージョンでました、２０２２夏〜

https://github.com/WongKinYiu/yolov7

Yolov5より１２０％高速とのこと。

**【オリジナル・リポジトリより】**
<img src=https://github.com/WongKinYiu/yolov7/raw/main/figure/performance.png width=400>

# 使い方

### 学習済みモデルによる推論

```shell
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg
```

sourceには画像パス、もしくは画像フォルダ・パス、もしくは0（Webカメラ）を指定します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3d0e4a35-af80-4a5e-6dbf-f4604ddc53d5.jpeg width=400>

ColabのGPUで0.057sで推論できました。

### 学習

```shell
python train.py --workers 8 --device 0 --batch-size 32 --data data/coco.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights '' --name yolov7 --hyp data/hyp.scratch.p5.yaml
```

### モバイル・デバイスでの使用

リポジトリには、TorchScript、ONNX、CoreMLへのエクスポート・スクリプトがあり、かんたんにモバイル形式に変換して、アプリで使えます。

```shell
python models/export.py --weight yolov7.pt
```

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5cae74df-d9b7-39e4-22d1-277e6ac8618f.png width=400>

僕がCoreMLに変換したモデルはこちら（NMSつき）

https://github.com/john-rocky/CoreML-Models#yolov7
 
オリジナル・データでトレーニングして、便利なアプリを作りましょう！

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
jenkinsパイプラインでのジョブ完了時間の取得方法　

会社でCI構築で、このビルドジョブは一体どのぐらい時間がかかったのか？をWEB上ではなくて、完了時にSlack通知する時に一緒に渡したいと思った時にやったメモ。

# jenkinsブラウザ上で見る所要時間
ちなみに、ブラウザ上だと、ジョブのビルド番号ごとのジョブに飛んだ後、右TOPに出てきますね。
![スクリーンショット 2022-07-10 11.19.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/89d5afde-714c-a58a-f2e5-f8454739cb92.png)

所要時間一時間ってことです。

# 所要時間はどこで取れるか？

```groovy
println "ビルド所要時間${currentBuild.durationString}"
```
こんな感じで取れます。
この値をslackに渡せば良いのですが、なぜか `以上`という言葉が含まれてしまいますね。
まあ、removeしてもいいんだけど、なんでこうなるんよ　と思った状態でそのままカスタマイズせずに渡しています。

# Slackでの見た目
![スクリーンショット 2022-07-10 11.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/879b1b69-2c40-5902-8ab0-ada1ddcd7bfc.png)

# currentBuildのプロパティ一覧

https://opensource.triology.de/jenkins/pipeline-syntax/globals
【個人用メモ】SSH関連

# 設定の優先順位
1. コマンドラインオプション
2. `~/.ssh/config` 
3. `/etc/ssh/ssh_config`

# その他
- 文頭を `#` から始めると**コメント**として扱われる
- 引数を`"` で囲めば、スペースを含めて引数を表現できる

# キーワード
1行につき、キーワードと引数のペアを記述していく。

## Host
要するに接続先ホストのエイリアス。好きな名前を設定できる。
スペース区切りで複数設定もできる。

## AddKeysToAgent
起動中のssh-agentに自動で秘密鍵を登録するかどうかを指定する。
引数が`yes` なら、コマンドラインで`ssh-add` するのと同じように秘密鍵ファイルをssh-agentに追加する。

## UseKeychain
macOS上で、システムがパスフレーズをキーチェーンから探すかどうかを指定する。また、ユーザーがパスフレーズを入力して正しく承認されたときに、そのパスフレーズをキーチェーンに保存するかどうかもこの指定に依拠する。

# 参考文献
- `man ssh`
【AWS】プロビジョニングサービス群

# 主な構築自動化・プロビジョニングサービス
1. Elastic Beanstalk
定番構成の自動構築
1. OpsWorks
Chef環境を提供し、OSより上のレイヤーの自動構築をサポート
1. CloudFormation
JSONあるいはYAMLのテンプレートを作成して、OSより下のレイヤーの自動構築をサポート

https://capsulecloud.io/blog/aws/4925

# Cloud Formation
環境構築を自動で作成してくれるツール。
最初はEC2やELBなどの設定をコンソールで一から手作業で入力していくことは大事ですが、パターン化した設定や工数の多いものは自動化した方がミスも少なくなる。
バッチファイル的な感じで簡単なコードを書いておけば、パターン化した環境構築を自動でやってくれるイメージ。

## スタックとテンプレート
各種リソースの設計書を記述するのが「テンプレート」。JSONかYAML形式で定義される。
テンプレートに従って自動構築されたリソース群は「スタック」という単位でまとめられる。スタックを削除するとそれに紐づくリソース群は全て削除される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/880bc2e1-28fa-e5d4-1973-716bd2f93156.png)
画像引用：[AWSのリソースをコードで自動構築する「AWS CloudFormation」とは？実際に使用してみた](https://business.ntt-east.co.jp/content/cloudsolution/column-try-44.html)

「リソース群」って何よ？となるが、以下の9つが挙げられる。
>Format Version (任意)
Description (任意)
Metadata (任意)
Parameters (任意)
Mappings (任意)
Conditions(任意)
Transform (任意)
Resources (必須)
Outputs (任意)

Resourcesのみ必須となっており、これはスタックに含めるAWSリソース（EC2/S3）を定義するもの。確かにこれがないと何も始まらないな。

# OpsWorks
>Chef や Puppet のマネージド型インスタンスを利用できるようになる構成管理サービスです
　
ChefやPuppetはオープンソースの構成管理ツールである。
構成管理ツールって何ぞや？という質問に対しては以下のイメージとなる。


手作業で構築の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/235bbfec-c0cc-21ea-3084-7d7dbd384114.png)

構築管理ツールで構築の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/1a44f9a2-ed27-f5ef-d3d7-1d45d2adff2b.png)


画像引用：[構成管理の自動化とは](https://www.yrl.com/column/yds_configuration_management_automation.html#:~:text=%E6%A7%8B%E6%88%90%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AF%E3%80%81%E3%80%8C%20%E9%81%8B%E7%94%A8,%E3%82%92%E5%90%AB%E3%82%81%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)


# Elastic Beanstalk
デプロイ管理ツールのようなイメージ。アプリをweb公開したいときに（しっかりしたサービスであるほど）考慮しなければならない構成が大量にある。ただそれにはある程度の知識＆経験が必要。その辺りを自動的に行なってくれるのがElasticBeanstalkである。

CloudFormationとの違いは？となってしまうが、CloudFormationは「自分で何をすべきか考える、それに従って自動的に作業を行なってくれるもの」、ElasticBeanstalkは「裏側の仕組みは特段考えなくても大丈夫、魔法のようなもの」となる。また、ElasticBeanstalkはデプロイ周りに限定されており、自由度が少ない。（魔法だから仕方ない）
CloudFormationは対象範囲は広く、IAMの自動作成なども可能。

https://qiita.com/yShig/items/2120bba6649321623cad

# ３者の違いは？
一見似たような役割を果たしているため使い分けがわかりにくい。初心者ながらのざっくりとした理解は以下。[こちらの記事](https://juso.site/it-skill/aws/aws_differencez)が参考になりました。

・CloudFormation
デプロイまでのAWS環境構築を全てやってくれるもの。幅広くプロビジョニングしてくれるもののデプロイはしてくれない。

・ElasticBeanstalk
アプリをWeb公開するまでの実行環境の手配からデプロイまで一貫して行ってくれるサービス。

・OpsWorks
ほぼ同上。こちらはChefを利用してサーバーの構成を自動化することができる。

これだけ見るとElasticBeanstalkとOpsWorksの違いがわからない。
ElasticBeanstalkは「定番の構成（オーソドックスな構成）を全自動で用意してくれる。手間要らず。」
OpsWorksは「Chefを使っているのでちょっとした細かい仕様にも対応できる。ちょっと手間かける。」のようなイメージで。


# 参考
https://www.ctc-g.co.jp/solutions/cloud/column/article/07.html

https://www.web-dev-qa-db-ja.com/ja/amazon-web-services/net%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEelastic-beanstalk%E3%81%A8cloudformation%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1071632807/

https://www.fenet.jp/aws/column/aws-beginner/305/

https://business.ntt-east.co.jp/content/cloudsolution/column-try-44.html
小数点を含む数の表し方

表し方は２つある。
* 固定小数点数
* 浮動小数点数

## 固定小数点数
ビット列のどこの位置に小数点があるかを暗黙的に了解し、表現している。
### 例 ８桁のビット列の場合
右側から５番目の左側に小数点をおくことを決めてしまえば、整数部は５桁少数部は３桁になる。
また
最下位ビットの右側かに小数点をおくことを決めれば、少数部は０になる。なので整数しか表せない。

#### ビット列
ビットが並んだもの
出典 https://wa3.i-3-i.info/word17968.html

### ８ビットで表せる整数
#### 符号無し    0~255 
00000000~11111111
0~2^n-1
#### 符号有り -128~127
10000000~01111111
-2^(n-1)~2^(n-1)-1

## 浮動少数点数
0.000000025は８進数では表せない。が小数点の位置を変えてやれば表せる。
移動分は指数で表現する。
この場合は+-0.25(2を基数)^-6
限られたビット列の中で最初に```符号```、```指数部```、```仮数部```に分けて表現する。

## 浮動小数点数の正規化
### 気づき
正規化とは?
### 同じ小数点数をどのように表現するといいか？
```0.12345^-4```と```0.012345^-3```の意味は一緒だ。
これらを５桁で仮数部を表現する時
```仮数部```を表現するときは両方```12345```と```01234```5となる。
５が溢れてしまう。

どれも間違いはない。
しかし```限られたビット数の中でより多くの桁数を保持する```目的だとどれでもいい問うわけでは無い。
そのために```0.12345^-4```と```0.012345^-3```を比べると```0.12345^-4```がいい。
0.00101^-3の場合は0.101^-5がいい。
このように有効な桁数が多く取れるように小数点の位置を調整する。これを```正規化```という。

## よく使われる浮動小数点数形式
仮に３２ビットで表す。

* 仮数部の符号に１ビット
* 指数部に７ビット(2進数を基数とする）
* 仮数部に２４ビット
で扱う。

### ```0.375```を３２ビットで表す
まず２進数で表す。
```0.011```これを正規化```0.11^-1```（基数は２）になる。
これを浮動小数点数形式に合わせて表現
* 仮数の符号は聖なので```0```
* 指数部は```-1```なので2の補数で表現なので```1111111```
* 仮数部は11なので```11000...000```（２４ビット)となる。

以上により```011111111100...0```（３２ビット)で```0.375```は表現された。
Lambda用コンテナイメージ作成時、コンテナ内でテストする方法

# はじめに
前回AWS Lambdaを、コンテナイメージから作成しました。

https://qiita.com/a_b_/items/d9398fd6efe0f66b6c6f

その中でローカルテストとして、RIEを使ってローカルでLambdaをエミュレートする内容を記載しました。
ですがさらにその前段階の、コンテナ上でコードが動くのかを確認する方法を記載します。

Dockerを使い慣れた方には当たり前のことかもしれませんが、自分のような初学者や、備忘録として記事にしました。

# 結論
- `docker run`の際に、`--entrypoint= `でエントリポイントを無効化
- ホスト-コンテナ間は`docker cp`でファイルをやり取り

# 環境
いつものCloud9だけです。

# やったこと
## イメージ作成まで
イメージ作成までは前回と同じです。
```bash
# ファイル作成
$ touch app.py
$ touch Dockerfile
```
```python:app.py
import json

def handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "message": "hello world",
            }
        ),
    }
```
```dockerfile:Dockerfile
FROM public.ecr.aws/lambda/python:3.8
COPY app.py   ./
CMD ["app.handler"]
```
```bash
$ docker build -t func1 .
```

## コンテナ作成・スクリプト実行
この後コンテナを作成して中に入ろうと思いますが、（恐らく）エントリポイントとして以下のページにある`entry.sh`のような「環境変数が指定されていなければRIEを使いローカルでLambdaをエミュレート、あればRICで動作」というシェルを指定しているものと思われます。

https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-container-image-support/

```shell:entry.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
    exec /usr/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $1
else
    exec /usr/local/bin/python -m awslambdaric $1
fi
```

なので、`docker run`する際に引数でエントリポイントを無視するようにします。
```bash
$ docker run --rm -it \
  --entrypoint= \
  func1 bash
```
これでコンテナの中に入れましたので、Pythonでapp.pyのhandlerを実行できます。
```python
$ python
>>> import app
>>> app.handler(None,None)

{'statusCode': 200, 'body': '{"message": "hello world"}'}
```
修正する場合は`docker cp`を使えば、ローカルとコンテナ内のファイルをやり取りできそうです。

https://qiita.com/gologo13/items/7e4e404af80377b48fd5

```bash
# コンテナのワークディレクトリを確認。AWS公式のイメージだと以下
$ pwd
/var/task

# 別ターミナルより
$ docker ps
# 上記で確認したIDを指定
$ docker cp app.py <コンテナID>:/var/task/app.py
```

# おわりに
Lambdaをコンテナから作成する際に知った、エントリポイントを無視する方法と、ホストからコンテナへのファイルのコピーを記事にしました。
自分のような、Docker素人でLambdaをコンテナから作る、という方々の助けになれば幸いです。
TypeORM 0.3系のマイグレーション

2022/3/17に行われた0.2から0.3へのアップデートでcliの仕様が大幅に変更されてしまったようですね。なのになぜかTypeORM公式ドキュメントの[CLIのページ](https://typeorm.io/using-cli)をみてもその変更が反映されていない...(?)
具体的には以下のような変更が行われました。

TyepORM 0.2系ではormconfig.jsなどの場所で `cli` という設定項目でマイグレーションファイルの出力先を指定していたかと思います。
ですが、公式ドキュメントにある[変更ログ](https://typeorm.io/changelog#breaking-changes-1) を見ると、0.3.0からその cli オプションは消えてしまったようです。
> cli option from BaseConnectionOptions (now BaseDataSourceOptions options) was removed (since CLI commands were re-worked).

ほな0.3系でマイグレーションファイルの出力先を指定するにはどうすりゃええねん
ってなってしまった人向けの記事になります。
# 前提
package.jsonがあるディレクトリでtypeorm0.3系をインストールしていることを前提としています。
```
$ npm -v
8.12.1
$ node -v
v14.19.1
$ npx typeorm -v
0.3.7
```
↓DB接続の設定
```typescript:src/data-source.ts
import "reflect-metadata"
import { DataSource } from "typeorm"
import { User } from "./entity/User"

export const AppDataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "test",
    password: "test",
    database: "test",
    synchronize: true,
    logging: false,
    entities: [User],
    migrations: ['src/migration/*.ts'],
})
```
# create (空のマイグレーションファイル作成)
src/migration の中に UserMigration という名前でマイグレーションファイルを作りたいと思っているとします。
src がある場所と同じディレクトリで次のようにコマンドを実行してください。
```
npx typeorm migration:create src/migration/UserMigration
```
するとsrc/migration内に`1655392769030-UserMigration.ts`のように空のマイグレーションファイルが作られます。
# generate (entityからのマイグレーションファイル作成)
src/migration の中に UserMigration という名前でsrc/entityにあるuserのエンティティからマイグレーションファイルを作りたいと思っているとします。

次のようにコマンドを実行してください。今回のようにDB接続設定ファイルがtsの場合は`typeorm`ではなく同時にコンパイルも行う`typeorm-ts-node-commonjs`を使う必要があります。
```
npx typeorm-ts-node-commonjs migration:generate src/migration/UserMigration -d src/data-source.ts
```
するとsrc/migration内に`1655392769030-UserMigration.ts`のようにuserエンティティの内容が反映されたマイグレーションファイルが作られます。
# run (マイグレーション実行)
src/migration にマイグレーションファイルがあるとして、マイグレーションを実行したいとします。
以下のコマンドを実行してください。
```
npx typeorm-ts-node-commonjs migration:run -d src/data-source.ts
```
するとマイグレーションが実行されます。revert (マイグレーションのロールバック)も同様で、上記の run を revert に変えるだけです。　

# 設定ファイルの参照先とファイル出力先の設定
0.2系ではormconfig.jsなどに以下のようにして、あらかじめマイグレーションファイルの出力先の設定をしていたかと思います。
```javascript:ormconfig.js
{
    //　DB接続などの設定

    cli: {
        migrationsDir: "src/migration"
        entitiesDir: "src/entity"
    }
}
```
それを知ってて上記の方法を見た方だと、コマンドを打つたびにいちいち指定しないといけないの？どこかに設定しておくことはできないの？って思った方もいると思います。
そんな方はとりあえず package.json の scripts に以下のように設定しておくのが無難かと思います。
```json
   "scripts": {
      "start": "ts-node src/index.ts",
      "typeorm": "npx typeorm-ts-node-commonjs",
      "migration:create": "npx typeorm migration:create src/migration/${npm_config_name}",
      "migration:generate": "npx typeorm-ts-node-commonjs migration:generate src/migration/${npm_config_name} -d src/data-source.ts",
      "migration:run": "npx typeorm-ts-node-commonjs migration:run -d src/data-source.ts"
   }
```
このように設定しておけば、例えばgenerateは以下のコマンドで実行できます。
```
npm run migration:generate --name=UserMigration
```
だいぶスッキリしましたね(^^)

---

↓参考
https://github.com/typeorm/typeorm/issues/8810
DFS(深さ優先探索)基本コードサンプルまとめ【C#】

# DFS(深さ優先探索)基本コードサンプルまとめ【C#】

お久しぶりです。
Atcoderをやり始めてそろそろ1年経つのですが、800-900あたりの緑ギリギリをさまよってます。

今回はAtcoder解いてて、あまりにDFS(深さ優先探索)のコードが書くのが遅い事に気づいたので、弱点克服学習兼、備忘録です。

自分がうまく解けなかった問題一例(2022-07-09 ABC259-D)

https://atcoder.jp/contests/abc259/tasks/abc259_d


## DFS使用例

DFSの考え方で扱える現実問題には色々あると思いますが、Atcoderではグラフや木の問題で使うことが多いと思います。

DFSとは？ってのはもっとスゴイ方がたくさん説明されてると思うので省きます。
今回参考にした記事だけ張っておきます。

参考:

https://qiita.com/drken/items/a803d4fc4a727e02f7ba#4-1-s-%E3%81%8B%E3%82%89-t-%E3%81%B8%E8%BE%BF%E3%82%8A%E7%9D%80%E3%81%91%E3%82%8B%E3%81%8B


## グラフ移動可能問題

問題例:
グラフG(頂点N個) の二頂点 s,t∈V　が与えられたとき、si から辺をたどって **ti に到達できるかどうか**を判定する問題。

→s を始点とした DFS。
※有向グラフでも無向グラフでもそこまで変わらないので一緒に記載します。

```c#
// ここにグラフの接続状態を以下のようにセットする。(非接続:0)
// 有向グラフのとき：
// mapped[s,t] = 1  :  s→tと接続している。
// 無向グラフのとき：
// mapped[s,t]、mapped[t,s] = 1  :  s↔tと接続している。
var mapped = new int[N,N]; 
var seen = new bool[N]; //DFSで既に確認したフラグ
int si = 1;// スタート(仮)
int ti = 123;//ゴール(仮)

//下記のように使用
if (DFS(s))
    Console.WriteLine("Yes"); // si->tiは接続している
else
    Console.WriteLine("No");

//------------------------------------------
    bool DFS(int st)
    {
        seen[st] = true; //調査済
        if (st == ti) return true;//接続状態である

        for (int i = 0; i < N; i++)
        {
            if (seen[i]) continue; //既に調査済みのときは飛ばす
            if (mapped[st, i] == 1)
                if (DFS(i)) return true;//子が接続していることを発見した
        }
        return false;
    }
```

## 閉区間チェック
問題例:
グラフG(頂点N個) の二頂点 s,t∈V　が与えられたとき、si から辺をたどって **閉区間があるかどうか**を答える問題。

→基本はさっきと同じ。
1つ前の値を保持ししておき「今来た辺を戻っていく動作」を禁止することで、閉区間チェックができる。

```c#
// ここにグラフの接続状態を以下のようにセットする。(非接続:0)
// 有向グラフのとき：
// mapped[s,t] = 1  :  s→tと接続している。
// 無向グラフのとき：
// mapped[s,t]、mapped[t,s] = 1  :  s↔tと接続している。
var mapped = new int[N,N]; 
var seen = new bool[N]; //DFSで既に確認したフラグ
var seen_finish = new bool[N]; //DFSで閉区間がないことを確認下フラグ

// 下記のように使用
if (DFS(s))
    Console.WriteLine("Yes"); // 閉区間がある
else
    Console.WriteLine("No");

//------------------------------------------
    bool DFS(int st, int bf = -1)
    {
        seen[st] = true; //調査済

        for (int i = 0; i < N; i++)
        {
            if (i == bf) continue; // 逆流禁止
            if (seen_finish[i]) continue; // 確認済スルー
            if (mapped[st, i] == 1)
            {
                if (seen[i] && !seen_finish[i]) return true; //閉区間!!
                if (DFS(i, st)) return true;//次へ移動
            }
        }

        seen_finish[st] = true;
        return false;
    }
```

## グラフが連結ではないときの、全グラフの閉区間チェック
DFSはさっきと同じ。
DFSを呼ぶとき、全頂点をループする必要がある。
```c#
// 下記のように使用
for (int i = 0; i < N; i++)
{
    if (seen[i]) continue; //別のグラフで確認済みなので飛ばす

    if (DFS(s))
        Console.WriteLine("Yes"); // 閉区間がある
    else
        Console.WriteLine("No");
}

```

## その他

以下はDFSでも解けるが、BFS(幅優先探索)でやるべき問題…？たぶん？

・**最短経路**を求める問題
・t→sに移動可能な時、**その経路全て**を返す問題
・(i-1)回目の移動情報が(i)回目の移動に影響を与える問題

これからも経験値つんでいきます。
SQLってどこから読むの？

# SQLの読み解き方

SQLがわからない、という相談を受けたのでこう答えましたよ、という備忘録。

## SQLは3つのブロックに分かれる

- select
- from
- where

この3つのブロックの読む順番が大事です。
ここから例えに沿って見ていきましょう。

「世界の国々から、アジア圏の国名・首都を知りたい」というお題にしましょう。

これを少しSQLに寄せた表現にしてみると

1. 世界の国々というテーブルから
1. アジア圏を絞って
1. 国名・首都を表示する

少しSQLに近づきました。

## fromでテーブルを指定

では早速、SQLに当てはめて行きましょう。

まずは、世界の国々というテーブルを指定します。
(countryというテーブルがあるとしましょう)

> from country

これで、何から情報を得たいのか、SQLで伝えることができました。

## whereで条件指定

次に、アジア圏という条件を指定してあげます。
(countryテーブルには、continentというカラムがあるとします)

> where continent = ‘アジア’

これで、どんな情報を得たいのか、SQLで伝えられました。

## selectで表示する項目を指定

最後に、私たちは国名・首都を知りたいんでしたね。では、指定してあげましょう。
(countyテーブルにはname、capitalというカラムがあるとします)

> select name, capital

これで、何を表示してほしいのか、SQLに伝えることができました。

## まとめ

では、全部合わせるとどうなるか見てみましょう

> select name, capital
> from country 
> where continent = ‘アジア’

書く順番と読み解く順番が異なるのが、混乱するポイントでしたね。

このSQLを実行すると何が返ってくるのか。

> name | capital
> 日本  | 東京
> 韓国  | ソウル
> タイ | バンコク
> 

私たちの目的が何だったのか、振り返ってみましょう
「世界の国々から、アジア圏の国名・首都を知りたい」でした。叶いましたね！
Instagramのアプリ作成の準備（APIキー作成）

# はじめに
InstagramAPIを利用するために、アカウント登録後にAPIキーを作成するための手順をまとめた

# InstagramAPIの種類
InstagramAPIの種類は2種類あり(2022年7月現在）
・Instagram Basic Display API
　プロフィール情報や写真、動画を取得することができる

https://developers.facebook.com/docs/instagram-basic-display-api

・Instagram Graph API
　メディアの取得と公開、メディアへのコメントの管理と返信、他のInstagramユーザーが@mentionしたメディアの特定、ハッシュタグ付きのメディアの検索、他のInstagramビジネスやクリエイターに関する基本メタデータと指標の取得を行えます。

https://developers.facebook.com/docs/instagram-api/?locale=ja_JP

# APIキー取得手順
1.「アプリを作成」を押下する
![スクリーンショット 2022-07-10 9.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/1c884a09-f120-899e-851f-d631b6e5e330.png)

2.適当なアプリタイプを選択してチェックし、「次へ」を押下する
![スクリーンショット 2022-07-10 9.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/0fee9ef4-85b9-0e6c-d4de-b82ee1d9d27b.png)

3.「表示名」を入力し、「アプリを作成」を押下する
![スクリーンショット 2022-07-10 9.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/d588ea28-164f-0408-acb9-54a271340de4.png)

APIが作成されました！
![スクリーンショット 2022-07-10 9.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/65d274f5-e165-6765-cfd3-6f750d0aa819.png)

Instagramでは直接の画像の保存ができないため
（規約違反の）スクレイピングをする選択肢がありますが
APIで取得するようにした方が安全だと思います。
Minikube on M2 MacBook Pro with Podman

## やりたいこと

* M2 MacBook Proを買ったので、K8sの検証用環境を用意したい

## なぜPodman？

* Kubernetes v1.24からDockerが[非推奨になった](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md#dockershim-removed-from-kubelet)ので、Docker Desktopを使いたくなかった。
* 仕事で使うK8sがOpenShiftなので、ホストOSやコンテナランタイムから合わせたかった。

## 検証環境

* MacBook Pro（13インチ、M2、2022）
* Memory 16GB

## Homebrew のインストール

[Homebrewのサイト](https://brew.sh/index_ja)からインストールコマンドを拾ってきて、実行する。（買いたてなので、ここから...）

```bash
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

パスを通す。

```bash
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/xxx/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
```

確認する。

```bash
% brew --version
```

## Podman と Minikube をインストール

インストールする。

```bash
% brew install podman
% brew install minikube
```

podmanを初期化し、Fedora CoreOSのダウンロードを行う。
気持ち程度、リソースを積んでおく。

```bash
% podman machine init --cpus 4 --memory 8192 --rootful
% podman machine start
```

MinikubeのランタイムにPodmanを使うときは、ドライバオプションを渡す必要がある。

```bash
% minikube start --driver=podman
```

確認する。

```bash
% kubectl describe all
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.96.0.1
IPs:               10.96.0.1
Port:              https  443/TCP
TargetPort:        8443/TCP
Endpoints:         192.168.49.2:8443
Session Affinity:  None
Events:            <none>
```

プロセスを見ていると、`% podman machine start`した時点で、QEMU上でFedora CoreOSを動かしている模様。
![スクリーンショット 2022-07-10 8.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/f2dc5f99-40de-387a-cf5a-8616cb0ccfd2.png)


## テスト（適当）

NginxのPodを起動する。

```bash
% kubectl run nginx --image=nginx --restart=Never
```

起動を確認する。動いてそう。

```zsh
% kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          26s
```

## クラスタを消して作り直すとき

```zsh
% minikube stop
% minikube delete
% minikube start --driver=podman
```

## Closing... and TODO

* Apple Siliconになってから、この辺の構成で試行錯誤している記事が多かったけど、自分はしばらくこれで試してみたいと思う。（色んなもん踏むかもしれんけど）
* TODO
    * dashboard
    * istio+kiali+jaeger
    * and so on ...
Arduino UNOと温度センサーS-8120Cで温度をシリアル出力(浮動小数点)


目的
安価に温度を測る。

v = -8.2 * t + 1705

式の変形

t = (v - 1705.0) / -8.2;


![o_con569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6f189210-28e4-cf8c-dc90-efd7fea0df91.jpeg)



![o_con571.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a08859ae-886d-0967-3061-04e135b50892.jpeg)


プログラム


```c++


//SER_S-8120C_float_UNO_1

#include <Arduino.h>

//初期化処理
void setup()
{

  //シリアルの初期化
  Serial.begin(9600);

} //setup

//メインループ
void loop()
{

  //センサーの値を読み込む
  int s = analogRead(A0);   //  センサーの読み取り値

  //センサーのADC値を電圧に変換
  float v = s * (5000.0 / 1024.0);

  //センサーの電圧を温度に変換
  // v = -8.2 * t + 1705  =>  t = (v - 1705.0) / -8.2;
  float t = (v - 1705.0) / -8.2;

  //温度の表示
  Serial.println(t);

  //1秒の待ち
  delay(1000);

} //loop




```