OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでAnaconda環境構築(Mac)

機械学習を始めるにあたってAnacondaをインストーラーDLして、、、みたいな手順ではなくDockerでスマート(?)に環境構築をしたくやってみたら意外と簡単だったので紹介します。

# 実行環境
・OS：MacOS
・Docker version：20.10.10

# 手順①イメージの取得
Docker HubにてAnaconda公式がイメージを提供してくれているので取得する。(下記参照)
https://hub.docker.com/r/continuumio/anaconda3

```
$ docker pull continuumio/anaconda3
```

下記コマンドにて取得したイメージを確認
```
$ docker images
```

下記のように表示されれば取得成功。(IMAGE IDはそれぞれ違います)
```
REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
continuumio/anaconda3   latest   hogehoge1234   5 months ago   3.27GB
```


# 手順②取得したイメージを元にコンテナの作成
下記コマンドで手順①で取得したイメージからコンテナを作成
（今回nameオプションでコンテナ名をanacondaとしていますが任意の名前で構いません）

```
$ docker run -i -t -p 8888:8888 --name 'anaconda' continuumio/anaconda3 /bin/bash
```

下記のような表示になれば作成が成功しています。
(作成するとコンテナの中に入っている状態になります)
```
(base) root@hogehoge1234:/#
```

# 手順③jupyter notebookをインストール
下記コマンドでjupyter notebookをインストールします。
```
(base) root@hogehoge1234:/# conda install jupyter

Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /opt/conda

  added / updated specs:
    - jupyter


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    conda-4.13.0               |   py39h06a4308_0         895 KB
    ------------------------------------------------------------
                                           Total:         895 KB

The following packages will be UPDATED:

  conda                               4.10.3-py39h06a4308_0 --> 4.13.0-py39h06a4308_0


Proceed ([y]/n)? y //ここで「y」を押してください。


Downloading and Extracting Packages
conda-4.13.0         | 895 KB    | ################################################################################################################################################# | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
```

続いて、base環境をjupyter notebookから利用できるようにするために、base環境のカーネルをjupyterに追加します。

```
(base) root@hogehoge1234:/# ipython kernel install --user --name base
```

下記コマンドを実行し、base環境が追加されたか確認します。(base があれば追加が成功しています)

```
(base) root@hogehoge1234:/# jupyter kernelspec list
Available kernels:
  base       /root/.local/share/jupyter/kernels/base
  python3    /opt/conda/share/jupyter/kernels/python3
```

# 手順④jupyter notebookをブラウザで開いてみる
ここまで来たら最後はjupyter notebookをブラウザで開いてみましょう。

```
(base) root@hogehoge1234:/# jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root
```

上記コマンドを実行するとjupyter notebookのURLが表示されるので、それをブラウザで開きます。
![スクリーンショット 2022-06-04 16.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370336/ce8ef421-78c6-e16e-951c-c159be1cbdc4.png)

無事jupyter notebookが開きました。


# おまけ

## jupyter notebookを閉じる


jupyter notebookを閉じたい場合、ターミナルでControl + Cでシャットダウンすることが可能です。

もしくは下記画像のようにjupyter notebookの画面の右上にある「Quit」でもシャットダウンが可能です。

![スクリーンショット 2022-06-04 16.36.29 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370336/546ab0c8-eea9-f95b-1ce6-ef39a058cbe9.png)


## jupyter notebookを再度開く
jupyter notebook再度開きたい場合、手順④のコマンドを再度実行してください。
プログラマーは、詳細設計書をそのまま実装するだけの簡単な仕事。

# はぁ？
お前は、何を言っているのだ。

### こんにちは、Javaおじさんのシキムです。


40才目前で、プログラム工学に興味を持ったので本や記事で読んだ難しい話を
咀嚼して簡単な言葉で語りたいと思います。

-----

今回は、**プログラムコード**というものについてです。

システム開発において大体は、以下のような設計書を作ることから始まります。

1. 要件定義書
2. 外部設計書
3. 内部設計書
4. 詳細設計書(プログラム設計書)

ここまで来れば、プログラマーは詳細設計書をそのまま**プログラムコード**をコーディングするだけなので簡単な仕事ですね。
。。。


## ちょっとまて

とりあえず、設計書が何のためか考えてほしい。

* 要件定義書とは、要望を詳細にして、外部設計書を作るため。
* 外部設計書とは、要件定義書を詳細にして、内部設計書を作るため。
* 内部設計書とは、外部設計書を詳細にして、詳細設計書を作るため。
* 詳細設計書とは、内部設計書を詳細にして、プログラマーを動かすため。

これだと、プログラマーが動くために見えてくると思う。
しかし、実際に動くのはプログラマーではない。

### 動くのは、コンピューターだ。
-----
それを踏まえて何のためなのかもう一度考えてみてほしい。

* 要件定義書とは、要望を詳細にして、外部設計書を作るため。
* 外部設計書とは、要件定義書を詳細にして、内部設計書を作るため。
* 内部設計書とは、外部設計書を詳細にして、詳細設計書を作るため。
* 詳細設計書とは、内部設計書を詳細にして、プログラムコードを作るため。
* **プログラムコードとは、詳細設計書を詳細にして、コンピューターを動かすため。**

こうすると**プログラムコード**とは詳細設計書よりも詳細な、**最も詳細な設計書**であることがイメージつくかと思います。

詳細設計書にすべての**プログラムコード**と同程度の詳細を書こうとした場合、プログラミング言語の50年以上の歴史での最適化と同じくらいの最適化を施した設計書を作る必要があり現実的ではないかと思います。

**最も詳細な設計書**は一番書くのが難しいと理解し、**プログラムコード**を作る人間を一番優秀なものにしたほうがいいのではないか？
<br>
<br>
というお話でした。
<br>
<br>



「プリンシプルオブプログラミング」を参考にしております。
以上。Javaおじさんがお送りしました。
できるだけ安くブログを立ち上げたいので色々比較してみた

# はじめに
ブログ立ち上げてうきうきアフィリエイト生活！ってところはまだ見当がつかないけど
ブログ立ち上げるとなると
　・サーバ構築
　・WordPressセットアップ
　・ドメイン取得
　・アフィリエイト契約
　・Googleアナリティクス設定
などが実践的に試せそうだな！って思ったので。実益も兼ねて挑戦しようと思う。

# 先に結論：amazon LightSail × Wordpressでの構築がオススメ
ある程度、技術的に明るい人ならこの方式が一番いいかなって思いました。
「ブログ書きたいだけなんで、他は何も考えたくないんやー」って人はきっとConoHa WINGがいいんだろうと思いました。

# 選択肢を調べてみよう

こちらでは、ConoHa WINGの「WordPressかんたんセットアップ」を活用してのブログ構築を推奨している。
「WINGパックのベーシックプラン（1年契約、月額931円）」を契約したらいいよってことだそうです。

https://liberaluni.com/blog-3steps

こちらはもう少し技術的な要素が多く、amazon LightSail(AWS)を利用してのブログ構築。
$3.5/月で運用できるそうです。３分の１になった。

https://www.takoboolog.com/blog-start-lightsail/

ロリポップっていうレンタルサーバ会社のサービス、推奨はベーシックプランで550円/月で運用できる。意外と安い。

https://lolipop.jp/pricing/?utm_source=google&utm_medium=cpc&utm_campaign=search&utm_content=sitelink&gclid=Cj0KCQjw4uaUBhC8ARIsANUuDjXAwy7N2_TopHYtD96sJf1eECec9q6eLAsnseix6dJU6s_bnbFXjuYaAgHrEALw_wcB

ためさんっていうブロガーの記事。めちゃくちゃあっさりとした説明で「なんやかんやでConoHa WING」を進めた。
こういう記事をみると「ブログで副業する人たちって、多少金がかかってもいいから『ブログを書く』以外のことを考えたくない」ということがよくわかる。

https://tameblog.conohawing.com/wordpress-opened/

# 脱線：ほかにもブログって無いのか調べてみた
「ブログ開設　おすすめ」で検索したら

すがすがしいくらいわかりやすい説明がgoogle検索結果にでてた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/344c786a-05a6-4107-8970-13ac3275c144.png)

↑↑の説明書きのもとになるサイトがこちら。

https://www.conoha.jp/lets-wp/blog-recommendation/

によると、当然存在する。けど、収益化に難点があったりするのでなんやかんやWordpressが一番いいねって話なんだと思いました。
特にCMSでいうとほぼWordPress一択の様子。それ以外だったら、もう無料ブログサービスを使った方がいいよみたいな感じ。

# LightSailって何？
wordpress立ち上げるならAWS EC2の無料枠でケチケチ運用でしょ！って思っていたところ、
ネットで調べてみたらまさかのamazon LightSailのご紹介。ちょっとサービスを調べてみよう。

## Azureサービスとの比較
自分、Azureをよく利用しているのでそれと比べてくれたら世界一よくわかるので比較

https://docs.microsoft.com/ja-jp/azure/architecture/aws-professional/services

によると、App Service に相当するサービスであることがわかった。なるほどね。
単発のサーバだし、確かにCMS向きだと思う。DNSの設定も確かに…簡単だろうし。。。
LightSailにしちゃおうっと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/2a20ecfc-dc4d-9025-5f8f-87168a9ff79b.png)

もうEC2と比較する必要もなくなったけど、こんな素朴な質問に答えるサイトをamazon自らが出していた。感謝。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/lightsail-differences-from-ec2/

# 無料枠もあるよ！
https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all&all-free-tier.q=LightSail&all-free-tier.q_operator=AND

より、３か月までなら無料で使える。※ただし一部バンドルに限る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/794dc666-913a-7ebf-4e34-48837070528b.png)
JupyterからBlender操作メモ

## 概要

JupyterからBlenderを使ってみたメモです。

## JupyterからBlenderを使うには

記事「[Jupyter NotebookからPythonのAPIでBlenderを操作する](https://qiita.com/odu_beyond/items/8bfb73bc24e8014e0903)」の通りにしてできました。

以降では下記を実行しているとします。

```py
from pathlib import Path
from subprocess import run
import bpy
from mathutils import Vector
from ipywidgets import interact
```

## コマンドの関数を取得するには

メニューやボタンで、`Ctrl + C`を押すと実行用のコードを取得できます。
あるいは、コマンドを実行すると、情報画面に実行したコードが出力されます。
これらのコードはメニューと同じ動作ですが、複数回実行する場合に効率的でないこともあります。
実際に立方体を作成して実行時間を比較してみましょう。

### 実行時間の比較

#### メニューのコード（立方体作成）
```py
%timeit -n 5 -r 5 bpy.ops.mesh.primitive_cube_add()
>>>
1.02 ms ± 138 µs per loop (mean ± std. dev. of 5 runs, 5 loops each)
```

#### 低レベルのコード（立方体作成）
```py
%%timeit -n 5 -r 5
pts = [[-1, -1, -1], [-1, -1, 1], [-1, 1, -1], [-1, 1, 1], [1, -1, -1], [1, -1, 1], [1, 1, -1], [1, 1, 1]]
verts = [Vector(pt) for pt in pts]
faces = [[0, 1, 3, 2], [4, 5, 7, 6], [0, 1, 5, 4], [2, 3, 7, 6], [0, 2, 6, 4], [1, 3, 7, 5]]
mesh = bpy.data.meshes.new(name="Cube")
mesh.from_pydata(verts, [], faces)
obj = bpy.data.objects.new(mesh.name, mesh)
bpy.context.scene.collection.objects.link(obj)
>>>
58.7 µs ± 7.88 µs per loop (mean ± std. dev. of 5 runs, 5 loops each)
```

低レベルのコードの方が、ややこしいですが10倍以上速いです。

## 関数のヘルプを見るには

通常、Jupyterでは、カーソルを関数にあるところで`Ctrl + Tab`を押すとヘルプが見れます。しかし、Blenderの関数だと、詳しくわからないことがあります。その場合は、関数の括弧をつけずに実行すると、デフォルトの引数を確認できることがあります。

## 引数の書き方

Blenderの関数のいくつかは、位置引数ではなくキーワード引数にしないといけないことがあります。

## インタラクティブ操作

Jupyterでは、ipywidgetsを使って、関数の引数をインタラクティブに変更できます。
以下を実行すると、プルダウンから立方体の色を変更できるようになります。

```py
@interact
def cube_color(color={"red": (1, 0, 0), "green": (0, 1, 0), "blue": (0, 0, 1)}):
    if not (obj := bpy.data.objects.get("Cube")):
        bpy.ops.mesh.primitive_cube_add()
        obj = bpy.context.object
    if not obj.active_material:
        obj.active_material = bpy.data.materials.new("Material")
    mat = obj.active_material 
    mat.use_nodes = False
    mat.diffuse_color = color + (1,)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/1106e742-2558-4c11-cdcd-b48d153c5ce1.png" width="600">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/72f5efe8-cc9d-d996-77b3-02529c4213a4.png" width="300">

ちなみに、Jupyter Labだと、ipywidgetsが表示されませんでした。

## 複数のblendファイル

Jupyterから複数のblendファイルも扱えます。
下記は、特定のフォルダのblendファイルのオブジェクト数を出力するコードです。

```py
%%time
for fnam in Path(特定のフォルダ).glob("*.blend"):
    bpy.ops.wm.open_mainfile(filepath=str(fnam))
    print(len(bpy.data.objects))
>>>
Wall time: 131 ms
```

blenderのコマンドで、同様のことができますが、時間がかかります。

```py
%%time
cmd = "/Applications/Blender.app/Contents/MacOS/Blender"
for fnam in Path(特定のフォルダ).glob("*.blend"):
    run([cmd, "-b", fnam, "--python-expr",
         'print(len(__import__("bpy").data.objects))'])
>>>
Wall time: 2.98 s
```

20倍以上の時間がかかっています。

以上
Certificate Authority Authentication (CAA) エラーにより、1 つ以上のドメイン名が検証に失敗しました。

# はじめに
AWS外部（今回はXserver）で管理しているドメインのサブドメインに対してACMの証明書をリクエスト。この際表題のエラーが発生。

# 原因
すでに他サービスで当該ドメインの証明書が発行されている。
（今回は別チームが開発中のShopifyアプリで当該サブドメインのTLS設定が既にされてあった。）
上記のサービスで証明書が発行された際、ShopifyドメインのCAAレコードも一緒に設定されてしまっており、下記AWSのCAAを許可していなかった。

- amazon.com
- amazontrust.com
- awstrust.com
- amazonaws.com

https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/troubleshooting-caa.html

# 確認方法
例えば、`yahoo.co.jp`のCAAレコードを確認すると、下記のように4つのCAAレコードが設定してある。
この中にAWSのCAAは含まれていいないため、ACMを使って証明書（例えば`test.yahoo.co.jp`）を勝手に発行することはできない。

```sh
$ dig caa yahoo.co.jp

; <<>> DiG 9.10.6 <<>> caa yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60261
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;yahoo.co.jp.			IN	CAA

;; ANSWER SECTION:
yahoo.co.jp.		900	IN	CAA	0 issue "cybertrust.ne.jp"
yahoo.co.jp.		900	IN	CAA	0 iodef "mailto:nic-admin@mail.yahoo.co.jp"
yahoo.co.jp.		900	IN	CAA	0 issue "digicert.com;cansignhttpexchanges=yes"
yahoo.co.jp.		900	IN	CAA	0 issue "globalsign.com"

;; Query time: 21 msec
;; SERVER: 240b:251:a2a0:1e00:8222:a7ff:fe23:d5a4#53(240b:251:a2a0:1e00:8222:a7ff:fe23:d5a4)
;; WHEN: Tue Jun 07 03:40:56 JST 2022
;; MSG SIZE  rcvd: 216
```
# 対応
## ①ドメイン管理画面からAWSのCAAレコードを追加する
外部ドメインサービスの設定でAWSのCAAレコードを設定する。（[XserverはCAAレコード未対応](https://support.xserver.ne.jp/manual/man_domain_dns_setting.php)）

https://www.riscascape.net/archives/19704

https://help.sakura.ad.jp/ssl/2347/?article_anchor=js-nav-0

## ②当該ドメインを諦め、CAAレコードが設定されていない別ドメインを使う
CAAレコードが設定されていないドメインであれば、ACMで新たに証明書を発行することができる。
`dig caa <your-domain>`コマンドで利用可能な別ドメインを探して使う。

# 参考
https://rms.ne.jp/sslserver/basis/caa/
TransferTransactionのスキーマを読み解こうその１

# これからやりたいこと

これから各種トランザクションのスキーマを読み解いていきます。
このスキーマを解析することでSDKを作る上で非常に重要になるのかな？とは思いつつ、（間違っていてもいいんじゃ、失敗したらやり直せばええんじゃ）
進めていきます。

## TransferTransaction

まずはTransferTransactionです。

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/transfer/transfer.cats#L28

```
# Send mosaics and messages between two accounts.
struct TransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

	inline Transaction
	inline TransferTransactionBody
```

TransferTransactionの定義内容はこちらです。
struct TransferTransactionとなっているのでここで間違いないはずです。

定義構造を確認しましょう。

```
# Send mosaics and messages between two accounts.
```

コメントで二つのアカウント間でモザイクを送信するとなっています。
なので、この構造体の定義はモザイク送信の定義と思って問題ないです。

```
struct TransferTransaction
```

構造体の名前は「TransferTransaction」です。

![スクリーンショット 2022-06-22 20.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/3e3c4b3e-e072-7069-2651-a639a6b27c69.png)


```
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)
```

ここでは構造体には含まれませんが、定数が含まれます。
TRANSACTION_VERSIONは型がuint8(10進数表現で0~255,16進数表現だと00~FF）値が１

![スクリーンショット 2022-06-22 20.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/a9b9279e-2db3-748c-1af8-c2d991accbe2.png)


TRANSACTION_TYPEは型がTransactionTypeで、値がTRANSFERです。

TransactionTypeはuint16の型なので２バイト分になります。

![スクリーンショット 2022-06-22 20.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/fa03107f-8218-d23d-25f6-ca23936c627e.png)


```
	inline Transaction
	inline TransferTransactionBody
```

ここは外部の構造体を持ってきています。

まずはTransactionTypeを確認しましょう。

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/transaction_type.cats#L75

ここにTRANSFERの定数が書かれています。
このTRANSFERの定数は

https://docs.symbol.dev/ja/concepts/transaction.html

ここでも定義されているように、TransferTransactionを確認できます。

TransactionTypeはenumであり得る値を定義されています。
TransactionTypeは型情報がuint16となっており
バイト数で表現すると２バイト分になります。

symbolでは16進数で表現されることが多く、トランザクションタイプも例外ではありません。
転送のトランザクションの値はここで確認できます。

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/transaction_type.cats#L76

トランザクションのバージョンは型情報がuint8なので1バイトで表現できます。
1だけの値が想定されています。（今後増えたりすることがあったりなかったり）

```
TRANSACTION_VERSION = make_const(uint8, 1)
```

:::note
nemではversion1と2を区別したりするみたいです。
以下ジャガーさんの回答
当初、NEMはモザイクなしで起動されたため、転送（V1）はXEMの転送しかできませんでした。その後、フォークを介して任意のモザイクをサポートし、転送（V2）を更新してモザイクとXEMの転送をサポートしました。主な違いはモザイクフィールドで、単に量を転送できるのではなく、一つまたは複数のモザイクを転送できるようになっています。
:::
【App Mesh】ECSをApp Meshで管理する際の、メッシュ内外の通信パターンについて

Elastic Container Service (ECS)をApp Meshで管理する際の以下通信パターンについて、自分なりの理解を整理
- メッシュ外 -> メッシュ内
- メッシュ内 -> メッシュ内
- メッシュ内 -> メッシュ外

## App Meshとは
App Meshは、AWS上においてサービスメッシュを提供するサービスです
サービスメッシュそのものについては、YouTubeにてAWS Japanの公式があげている[こちら](https://www.youtube.com/watch?v=ZwfdLAClzsc)の動画がわかりやすいです

App Meshは「仮想サービス」、「仮想ゲートウェイ」、「仮想ノード」、「仮想ルータ」などといった要素で構成されており、
これらの繋がりは[こちら](https://aws.amazon.com/jp/blogs/containers/introducing-ingress-support-in-aws-app-mesh/?nc1=h_ls)の公式ブログに載っているアーキテクチャ図がシンプルでわかりやすいです

本記事においては、仮想サービスと仮想ノードを使用します
- 仮想サービス : 仮想ノードまたは仮想ルータと紐づけ、ルートの宛先や仮想ノードのバックエンドとして設定する
- 仮想ノード : 実サービス（本記事でいうと、ECSサービスやメッシュ外のエンドポイント）と紐づける

## App Mesh (ECS)における通信パターン
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697194/a0b8d593-351c-1748-232e-bc622d0078d5.png)

本記事では、上図で示している3パターンの通信についてまとめていきます
- メッシュ外 -> メッシュ内（青）
- メッシュ内 -> メッシュ内（オレンジ）
- メッシュ内 -> メッシュ外（赤）

**※ App Meshの機能にフォーカスしているので、Security Groupでのブロックは特にされていない前提で話を進めます**

### メッシュ外 -> メッシュ内
ECSの場合、デフォルトでは全てのアクセスが成功します

アクセス元の制限を行いたい場合は、クライアント証明書が利用できます（[参考](https://docs.aws.amazon.com/app-mesh/latest/userguide/mutual-tls.html)）
まぁ、基本的にはSecurity Groupでの制御が無難な気がしますね・・・

### （残り2つを話す前に）メッシュのEgressフィルター
App Meshはマイクロサービスを「メッシュ」でまとめて管理します
そんなメッシュには「Egressフィルター」という機能があり、以下2つの選択肢があります
- 外部トラフィックを許可する
- 外部トラフィックを拒否する

外部トラフィックを許可した場合、以下で話す「メッシュ内 -> メッシュ内」及び「メッシュ内 -> メッシュ外」は基本的に全て成功します
なので、以降ではEgressフィルターは「外部トラフィックを拒否する」となっている前提で話を進めます

### メッシュ内 -> メッシュ内
デフォルトではアクセスすることができません
そのため、アクセス元となる仮想ノードにてバックエンド設定を行う必要があります
![backend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697194/68affec9-08b7-81ec-2245-e1613688664a.png)
バックエンドは仮想ノードの作成時に設定できますし、作成後に編集することも可能です

### メッシュ内 -> メッシュ外
こちらもデフォルトではアクセスすることができません
そのため、以下2つのどちらかの方法を取る必要があります
- ECSタスク定義のプロキシ設定において、「無視された出力ポート」を設定
    - 「無視された出力 IP」でも設定できそうな気がしますが、今回は確認していません
- アクセス先のエンドポイント専用の仮想ノードを作成

#### ECSタスク定義のプロキシ設定において、「無視された出力ポート」を設定
そもそもの話ですが、App Meshではサービスメッシュを実現するために、コンテナの通信は全てEnvoy Proxyを経由して行われます
ECSタスク定義設定の際に、そんなEnvoy Proxyのプロキシ設定を行うことができます
![task_definition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697194/da49fbed-6117-d747-5881-88c74dc806ee.png)
ここで、「無視された出力ポート」で設定されたポートへのアクセスはEnvoy Proxyを経由しなくなり、App Meshによる制御が行われなくなります

#### アクセス先のエンドポイント専用の仮想ノードを作成
App Meshの説明をしている際に少し触れましたが、仮想ノードには**メッシュ外のエンドポイント**も登録することができます
![vn_dns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697194/5f717814-9b9a-48ca-525b-997cedd20da3.png)

そのため、例えばRDSへアクセスしたい場合は
1. RDSのエンドポントを「DNS ホスト名」に記入した上で、仮想ノードを作成
1. 1.で作成した仮想ノードに対応する仮想サービスを作成
1. アクセス元となる仮想ノードのバックエンドに、2.で作成した仮想サービスを設定

こちらの流れでアクセスが可能となります

## 参考
- [サービスメッシュは本当に必要なのか、何を解決するのか | AWS Summit Tokyo 2019](https://www.youtube.com/watch?v=ZwfdLAClzsc)
- [Introducing Ingress support in AWS App Mesh](https://aws.amazon.com/jp/blogs/containers/introducing-ingress-support-in-aws-app-mesh/?nc1=h_ls)
- [Mutual TLS Authentication](https://docs.aws.amazon.com/app-mesh/latest/userguide/mutual-tls.html)
M5Stack Core2: Grove-LCD の使い方

I2C 接続の LCD モジュールの使い方です。
こちらを参考にしました。
[Seeed-Studio/Grove_LCD_RGB_Backlight](https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/blob/master/examples/HelloWorld/HelloWorld.ino)

![IMG_20220604_155149.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/62b5c8bd-08d7-3266-5923-99582fdacb84.jpeg)


```text:grove-lcd.ino
// ---------------------------------------------------------------
//	grove-lcd.ino
//
//						Jun/04/2022
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <Wire.h>
#include "rgb_lcd.h"

rgb_lcd lcd;

const int colorR = 255;
const int colorG = 255;
const int colorB = 0;

// ---------------------------------------------------------------
void setup() {
	// set up the LCD's number of columns and rows:
	lcd.begin(16, 2);

	lcd.setRGB(colorR, colorG, colorB);
	lcd.setCursor(0, 0);
	lcd.print("			   ");
	delay(500);
	// Print a message to the LCD.
	lcd.setCursor(0, 0);
	lcd.print("Good, Morning!");

	M5.begin();
	M5.Lcd.setTextSize(3);
  
	delay(500);
}

// ---------------------------------------------------------------
void loop() {
	int it = millis()/ 1000;
	lcd.setCursor(0, 1);
	lcd.print(it);
   
	M5.Lcd.setCursor(0, 0);
	M5.Lcd.printf("LED Sample %d",it);
  
	delay(500);
}

// ---------------------------------------------------------------
```

## Arduino IDE

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/054bf704-ad1f-c868-c7df-bda90ded77d8.png)

## インストールしたライブラリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9ba7d1f2-e289-0cc6-fc0d-bcb3a20f9f22.png)
UE5 ファイル、Assetの切り替え


基底クラスをごっそり切り替えたい場合など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/6396ba70-52b4-b914-2c68-2032a4bf4767.png)

ファイルを削除しようとすると表示されるDeleteAssetsダイアログ
赤枠の部分に削除した部分に当てはめるアセットを設定してReplaceReferencesで設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/e09f6457-5c0b-93b4-9979-9883223ce0b5.png)

リダイレクターが発生しているのでFix Up Redirectors in Folderを行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/0afb6f57-f094-bbad-89ee-54d3bae72a13.png)
bootstrapで表示内容を中央揃えにする方法

こんにちは。

みなさんは普段htmlを書いていて、
一つ一つにcssを適用させるのめんどくさいなーと思ったことはありませんか？<br>
本日はbootstropで、col内にまとめたhtmlの表示位置を
一括で管理する方法について理解できたので
アウトプットをしたいと思います。
参考資料も最後の方にあるので、そちらも目を通していただければと思います。

表示させたい内容はこちら![スクリーンショット 2022-06-04 14.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687611/89af7d05-7b30-3fe4-1f9d-72daf0b79785.png)
こちらのDMの表示位置をbootstrapを使って一括管理する方法を
アウトプットしていきたいと思います。
(bootstrapに関しては調べれば出てくると思うのでここでは割愛します)
<h2>
グリッドシステムを利用した中央揃え
</h2>
<p>bootstrapのグリッドシステムにより画面が12分割されていることは
ご存じかと思います。<br>このグリッドを用いて画面を表示させることが可能です。

```show.html.erb
<div class="container">
  <div class="row">
    <div class="col-md-x"></div>
    <div class="col-md-y">
      表示内容
    </div>
  </div>
</div>
```
※見やすさと誤動作防止のためインデントは揃えましょう
※x,yは変数です。
※mdは表示する大きさです。他にも指定の大きさを変えれますので調べてみてください。<br>
先ほど画面は12分割されていると言いましたが、</br>
これを応用して、上のように記述しました。</br>
こちらの記述を解説すると、コンテナ（箱）の中にrow（箱の中に格納されている列）があり、<br>rowの中に格納されているコンテンツがあります。<br>
こちらの関係についてのイメージはこのようになります。![bootstrap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687611/e18fbb99-b1a4-2a20-bb0f-e09756c3440e.jpeg)

雑で申し訳ない。イメージとしてはこんな感じです。

例えばですが、8画面分のグリッドを使ってこれを中央で揃えたいというときは、</br>
```show.html.erb
<div class="container">
  <div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8">
      表示内容
    </div>
  </div>
</div>
```
こういう表記になります。
こちらは左右に空のカラムを追加してメインで表示したい内容を</br>
中央に持ってくる表現をしています。
12画面ということですが、これだと10画面分の表示しかできていません。
残り２画面分はどこへ行ったのでしょう？

こちらは左からグリッドを埋めていきますので、</br>
10画面を埋めれば残り２画面は何も表記しなくても</br>
メインの表示内容を中央に持ってくるという表現ができます。

左右対称に空白のカラム(col)を作ることにより、</br>
表示したい内容を中央に寄せることができます。

※col-md-x col-md-offset-yを使っても同様の表現ができるようです。

<h2>総括</h2>
いかがでしたでしょうか。
このようにbootstrapを適用することによってcssだと面倒な作業も</br>
一括して管理することができます。
また、別の記述でも一括で管理できるような方法があれば、教えていただけると幸いです。

<h2>参考資料</h2>
<li>

https://getbootstrap.jp

</li>

<li>

https://qiita.com/Rock22/items/e4e89f15c29e1415977d

</li>
この声優さんたちって共演してる気がする！！！

## はじめに

　『五等分の花嫁』っていいアニメですよね。花澤香菜さん、竹達彩奈さん、伊藤美来さん、佐倉綾音さん、水瀬いのりさん、高森奈津美さん　とさまざまな声優さんが出演されています。
　声優さんたちが他にどんなアニメに出演されているのか気になりますよね！！！全人類が気になることだと思います。そこで、Wikipediaの声優さんの記事から出演アニメを抽出するコードを作りました。

　なお、この記事では**Jupyter Notebook**で**Python3**を動かしています。

## Wikipediaをインストール

　PythonでWikipediaの記事を見るにはWikipediaライブラリが便利です。コマンドプロンプトで `pip install wikipedia` と入れることでインストール出来ます。

## Wikipediaの記事のテンプレート

　とりあえず、好きな声優さんの一人である早見沙織さんのWikipedia記事を見てみます。

https://ja.wikipedia.org/wiki/%E6%97%A9%E8%A6%8B%E6%B2%99%E7%B9%94

　出演されているアニメは「出演」の中の「テレビアニメ」の項目に書いてあります。アニメごとに

　・アニメ名（配役(配役が変更されていれば年)(注釈)）

　で書かれています。そのため、「**（**」が入っている行の「**（**」の前の部分を抽出すればよいです。


## コードを書く

 まずはインストールしたWikipediaをimportします。さらに、日本語版の記事を読み込むことを指定します。

```python:
import wikipedia
#ライブラリの読み込み

wikipedia.set_lang("ja") 
#言語を日本語に設定
```

次に、声優さんの名前が入ったリストに対して、そのリストの声優さんたちが全員出演しているアニメを返す関数を定義します。

```python:
def check(humans : list):
    ans = set()
    #関数で返すアニメのset
    for name in humans:
        Aset = set()
        
        page = wikipedia.page(name, auto_suggest=False)
        #Wikipediaの全文を取得
        
        txt = page.content
        #pageの本文にする
        
        List = list(txt.split('\n'))
        #改行文字で分けてリスト化する
        
        t = List.index('=== テレビアニメ ===')
        p = len(List)
        if '=== 劇場アニメ ===' in List:
            p = List.index('=== 劇場アニメ ===')
        if '=== ゲーム ===' in List:
            p = min(p,List.index('=== ゲーム ==='))
        for i in range(t,p+1):
            anime = List[i]
            if '（' in anime:
                z = anime.find('（')
                Aset.add(anime[:z])
        if ans == set():
            ans = Aset
        else:
            ans &= Aset
    return ans
```

というわけで、この関数に五等分の五つ子の声優さんのリストを入れてみましょう。

```python:
p = ['伊藤美来','竹達彩奈','花澤香菜','水瀬いのり','佐倉綾音']
print(check(p))
```

『五等分の花嫁』のみが出力されました。
これで、様々な声優さんのペアで一緒に出演しているアニメが分かりますね....(テレビアニメだけでなくゲームも入れると面白そうですね)

というわけで、皆さん映画を見ましょう！！！

https://www.tbs.co.jp/anime/5hanayome/
PyenvでAtcoder用のPythonバージョンを管理する

# 動機
AtcoderではPythonのバージョンが最新でなかったり、使用できるライブラリが限定されていたりして、ローカル環境とは勝手が違います
現在(2022/06/04)Cpythonでのバージョンは`3.8.2`でPypyでのバージョンは`3.6.9`(Pypy自体は `7.3.0` )ですが、
自分の場合は、AHCの時にPypyでPython3.8から追加された`typing.Literal`を使おうとしてWAしたことが2回あるので、いい加減に手を打つことにしました

今回は仮想環境は`pyenv local`だけで擬似的に対応できそうだったので使わないことにしました

# 環境構築
最初に言っておきますが、
ローカルでPypyを使うWindowsの方はこの方法はつかえない(後述)ので、ローカルではCPythonを使うことになります

ここからはWin10の場合の説明です
Mac等の場合はリンクを貼るだけにします

## Pyenvのインストール
[Macの場合はこちら](https://github.com/pyenv/pyenv#homebrew-in-macos)

Windowsの場合は、[公式にサポートしていないらしい](https://github.com/pyenv/pyenv#homebrew-in-macos)ので、
[pyenv-win](https://github.com/pyenv-win/pyenv-win)を使います
PowerShellで以下を実行
```PowerShell
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
```
`FullyQualifiedErrorId : UnauthorizedAccess`とエラーが出た場合はPowerShellを[管理者として実行]→以下のコードを実行してから上のコードを再度実行(自分は出なかった)

```PowerShell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
```

## Pythonのインストール
多分Mac,Windows共通です
```PowerShell
pyenv install -l
```
でインストールできるバージョンの一覧が確認できるので、インストールしたいバージョン名をコピー


:::note warn 
**Pypyを使う方へ**
Windowsの場合(Macは不明)、[現在Pypyに非対応](https://github.com/pyenv-win/pyenv-win/issues/317)でインストールできないので、CPythonをインストールして、Pypyとバージョンだけ合わせておくのがいいと思います(3.6.8が一番近い)

追記:自分の環境だけかもしれませんが、[PyenvとVSCodeでpython3.6のコードをデバッグしようとしたらできなかった](https://qiita.com/sin471/items/10f41785da8b0193c6fa)ので、デバッグに[pdb](https://docs.python.org/ja/3.6/library/pdb.html)を使うことをおすすめします(面倒くさい...)
[Python3.7の新機能](https://qiita.com/ksato9700/items/35a0bdc04693b3b09757#contextvars)を使わない自信がある方は3.7.xを使うのもいいと思います
:::

コピーしたバージョンを使って下のコマンドを実行
```PowerShell
pyenv install インストールしたいバージョン
```
[Macでpypy3.6-7.3.1インストールでエラーが出る場合](https://qiita.com/snjot/items/d7690f38e34277d672a1)

競プロ用のフォルダに移動して、local バージョンをセットする
```PowerShell
cd 競プロフォルダまでのパス
pyenv local さっきインストールしたバージョン
pyenv rehash
```
`rehash`はよくわかっていませんが、新しいバージョンを入れたときや、`pip install`の後などに必要らしいです

これで、競プロ用フォルダでのみ、自動でさっきインストールしたバージョンに切り替わります
また、ここで`python -V`(Vは大文字)をすると、バージョンが変わっていることが確認できます

そして、以下を実行すると、グローバル(localで設定したフォルダ以外)のバージョンが指定されます
Atcoder以外では最新バージョンを使いたいときなどに実行してください
```PowerShell
pyenv install バージョン
pyenv global バージョン
pyenv rehash
```
ライブラリはバージョンごとに管理されているみたいなので、必要なものは入れ直してください
`pyenv local`を設定してからライブラリをインストールすれば、今回の用途では仮想環境は不要になりそうです

# 参考サイト
- [Pyenv](https://github.com/pyenv/pyenv#readme)
- [Pyenv-win](https://github.com/pyenv-win/pyenv-win#usage)
WIP:自分で成長していくNFTを作りたいから必要な技術セットを整理してみた

## モチベーション
- 相互作用して成長していくNFT as a ALIFEを作りたい
- 相互作用そのものによって生じる新しい価値をトレースできるようにするモデルとして観測したい
- ALIFEの成長に、どんなインプットが影響したのかを可視化したい
- ALIFEにカンブリア爆発的な可能性の爆発を引き起こしたときに、絶滅する種族を補完したい
- この先来るであろう知識NFTに対して、進化(深化?)計算ができるようにしたい
- DAOの中にあるネズミ講的な側面を打破する可能性としてALIFEに感じている
- ランダム性の導入に対して現実からの観測値を入れたい
(継ぎ足し形式で記載するため、WIPで公開しながら編集を進めています)

## 技術セット
- ALIFE
    - 概略 :
    - 言語 : 
    - モデル :
    - キーワード : 
    - サービスとして提供している企業 :
 
- NFT
    - 概略 : 
    - 言語 : 
    - モデル : 
    - キーワード : ミントする(Minting), Opensea  

- dAPPs
    - 概略 : 
    - 言語 : 
    - モデル : 
    - キーワード : クリプトゾンビ

- 相互作用の計算
    - 概略 : 
    - 言語 : 
    - モデル : 
    - キーワード : 

- 探索アルゴリズム
    - 概略 : 
    - 言語 :
    - モデル : 
    - キーワード : 新規性探索アルゴリズム、品質多様性アルゴリズム 

## やることリスト
- [作って動かすALife ―実装を通した人工生命モデル理論入門](https://www.amazon.co.jp/dp/product/4873118476/ref=as_li_tf_tl?camp=247&creative=1211&creativeASIN=4873118476&ie=UTF8&linkCode=as2&tag=bookmeter_book_image_image_pc_logoff-22)
- OpenSeaでMintしてみる
- [クリプトゾンビ](https://cryptozombies.io/jp/#learn-more)をする
- システム的にMintをしてみる


## 考えたいことリスト
- NFT × ALIFEに対して、死の概念をどうするか >> 世界の入力リソースの循環としては必要
- 収束 = 種族としての死に近い?
- ガス代を考えたときに前提としてシステムは成り立つのか?

## 関連した研究している人
- 池上高志先生
- 岡瑞起先生
- ドミニク・チェン先生

## キーワードメモ
- Minting ; 総じてNFTを作ることとして使われている

## 参考資料
- [Alife x NFT [ 23.4.2022 @ Proof of X ]](https://www.youtube.com/watch?v=MThy50fri3Y)
- [KAZOKUTCHI](https://www.youtube.com/watch?v=nTrz5BO7x8Q)
    -すでに、NFT × ALIFE × ROBOTであることで作られているプロダクト
    -蚕のような、共依存関係を持っている
- [NFTにおけるMint(ミント)とは？仕組みやOpenSeaを用いたやり方・かかるガス代について徹底解説](https://www.caica.jp/media/crypto/nft-mint/)
- [これからEthereumでDApps開発する人にオススメサイト](https://qiita.com/yukatou/items/05652ba149266f81d4fe)
- [NFT, Web3完全に理解した　になるためのチュートリアル](https://note.com/djrio/n/n9385c61aa402)
CentOS7 + pyenv + python3.10

```
yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git libffi-devel
yum install epel-release
yum install openssl11 openssl11-devel
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
mkdir -p ~/tmp
export TMPDIR=~/tmp
pyenv install 3.10.4
pyenv versions
* system (set by /root/.pyenv/version)
  3.10.4
```
データ分析を行うまでに必要なこと

# 目的
時代の流れに乗って自社のデータ活用ビジネスを行いたいと考えている企業担当者は多いです。ただそもそも何をすればいいのか分からない状態の方も一定数います。 と言うわけで、セールス視点で「何となくデータ分析を行いたいと考えている顧客に対する提案」をする際の必要知識についてまとめてみました。

# 全体像
以下のようなイメージで1つ1つ紐解いていきます。
それぞれの製品比較については別記事でまとめる予定。

![jjj.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/cea945a7-e8c2-203f-436d-e5b5ff09d8a2.jpeg)


# 1. データソース（API連携）
端的に言うならば、データ源となる資産を持っているのにもかかわらず、それを「使えるデータ」として手元に残しておく術を持っていないユーザは一定数いる。
究極は「紙でしかデータを保存していない」と言うパターン。
救急医療の現場とかでは、急患の情報を壁に張り紙形式のメモで管理しているところもあるっぽい。。。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/4b42be8a-fcc5-21c3-96e1-0d0b031dfdba.png)
画像（※写真はイメージです）：[付箋ポストイットのおすすめ強粘着。ノートに繰り返し何度も貼れて使える。アイデア出しに](https://nazokuri.com/fusen-nenchaku-ryoku-no-tsuyoi/)



ユーザ側の立場でAPI連携が充実したシステムの導入が必須の理由がよく分かる記事が以下。
グローバル化すると国産システムは土俵にも立てないよなぁ。。。

>「日本ではよくパートナーやベンダーの営業さんが『システム連携できます』と言うが、『本当にできますか？』と聞くと、『いや、CSVです』とかいう話になる。それはシステム連携とは言わないし、『シングルサインオンって何ですか？』っていう状況になることもある」
また、海外でも同じシステムを利用できるという条件もかなり厳しいものだという。実はこの条件を設定すると、国産システムはほぼ候補から外れてしまう。
「将来的に、例えばインドやシンガポールに開発拠点やサポート拠点を移すとなった場合、英語で仕事ができるシステムなのかと考えると、その時点で国産システムはほぼ選べない。同時に、日本にサポート拠点がないようなシステムは導入に失敗しかねないことや2バイトコードへの対応といった問題もある。海外ではメジャーでも日本に拠点がないようなベンダーのシステムもリスクが高い」

https://japan.zdnet.com/article/35125375/


# 2. データ収集（DataLake）


後述のDWHとの違いはInformaticaさんのサイトで解説あり。
端的に言うと、、、
Datalake→「加工していない生データを蓄積する」
DataWareHouse→「分析や解析するのに整理したデータを蓄積する」とのこと。

>先にデータウェアハウスについて説明しましょう。データウェアハウスは、社内の各種アプリケーションやデータベースに保管された規則性を持った構造化データを収集し、目的別に定義された形に統合・格納して、分析業務で利用するためのデータストアです。
一方、データレイクが得意とするのはセンサーのログやGPSデータ、SNSのテキストなどビジネスに関連して時々刻々と生み出されるようないわば生のデータを統合して取り扱うソリューションです。通常、これらの多種多様なデータはネットワークを経由して集められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/1df7f884-f52d-62b9-de59-6e529e2a1817.png)


引用：[データレイクとデータウェアハウスの違いとは](https://blogs.informatica.com/jp/2018/05/29/datalake-datawarehouse/)

## 2-1. DataLake主要製品
1. Cloudera
2. MapR


# 3. データ加工（ETL）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/9539aa78-8c97-7cd0-8480-b8777ee39d06.png)

画像引用：[【図解】BIツールと「DWH」や「ETL」との違いとは？](https://it-trend.jp/bi/article/bi-as_dwh_etl)

## 3-1. ETL主要製品
1. Informatica
2. DataSpider 

# 4. データ蓄積（Data WareHouse）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/53034751-566d-10c1-2480-62e8da7934b6.png)

画像引用：[【図解】BIツールと「DWH」や「ETL」との違いとは？](https://it-trend.jp/bi/article/bi-as_dwh_etl)

## 4-1. DWH主要製品
大量のデータを保管する必要があることから、やはり大手プレイヤーの名前が挙がる。

1. AWS Redshift
2. GCP BigQuery
3. Snowflake  

# 5. 分析①（BIツール）
ここまでの下準備ができてようやく「データ分析」ができるようになります。
近年ではBIツール自体に機械学習やETLの機能を持ち合わせたものが出てきていますが、一応定義としてはBIは「データの可視化」のニュアンスのもの。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/8588a702-c6d0-a525-b795-c7364b50776f.png)
画像引用：[【図解】BIツールと「DWH」や「ETL」との違いとは？](https://it-trend.jp/bi/article/bi-as_dwh_etl)

## 5-1. BI主要製品
1. Tableau(タブロー)
2. Oracle BI(オラクル ビーアイ)
3. MotionBoard(モーションボード)
4. Looker

# 6. 分析②（機械学習）
整形されたデータを持って初めて機械学習にかけれるようになる。



# 7. まとめ
謳い文句のように「御社でもデータ活用を！！」みたいな営業があるが、顧客の内部事情によってやることが全然違う。売る側からすれば売れればいいや、みたいな気持ちがあるのかもしれないけど、長期的に顧客に信頼されるセールスとなるためにも知識を体系化していきたいところ。
偽識別子(fake ID)と呼んでもいいですか


こんなにfollow順番が似てるのってどういう現象＝偽識別子

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

でご助言に習い、次の方をブロックさせていただきました。

followだけ31人して、投稿なし、いいねなしという方。

30人近くおみえになりました。また、ご助言にしたがい、それに近いかもしれない方を、
ねんのためにブロックさせていただきました。

ブロックさせていただきました。followを取り消させていただきました。

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

そして、次の1000通知を確認し、followしてくださっていて、いいね（LGTM)がない方も含めて、ブロックさせていただきました。あるいは、followを取り消させていただきました。

Qiitaバッチ17個頂きました。ありがとうございます。

https://qiita.com/kaizen_nagoya/items/656a340e0bf686897a95

Qiita 表彰プログラム

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

で、違和感があったことと関係するかもしれません。

年間 TOP Contributor


狙わない。５年に１度くらいは、何か機会があるかもしれない。
狙って行ってもいいことはない。

いいことはないことの一つg、この偽識別子からのfollowかもしれません。
followerが増えたと好い気になっていると、あやりげなことg裏で動いているかも。

以前から不思議に思っていた現象に、
記事にいいね（LGTM)してくれていないのにfollowerになる人がいること。

twitterのようなfollower返しのつもりなのかなってかってに思っていた。
そうか、偽識別子の現実味を出すためにfollowerになっているのだろうか。

私がそういう偽識別子作成の依頼を受けたら、
初心者がやりがちな行動を分析し、初心者の行動確率分布に沿った、
ばらけた行動を取る偽識別子を作るかもしれない。

逆に、今回は、投稿なし、いいねなしでfollowして人に限定してブロックさせていただいたが、この記事を読んで、違う行動を取られるかもしれず、今後の対応は検討させてください。

合計3000項目から240follow中、65ブロックさせていただき25followを取り消させていただきました。すでにIDがなくなっている方も9名ほどおみえでした。

今年の３月くらいから急増し、３月の行事がきっかけかもしれません。
LGTM数を競う行事は、Qiita主催では辞めた方がいいと思いました。
これらの偽識別子で、大量得票すれば、LGTM数を競うなんて楽勝ですから。


ブロックさせていただきました。followを取り消させていただきました(2)

https://qiita.com/kaizen_nagoya/items/51363c3e3e6d4396a067

# 偽識別子

Qiitaの記事を投稿する。
記事を読んで、いい記事にはいいね（LGTM)する。
意見をコメント欄に投稿する。
質問する。

などの基本行動以外の目的のために取得したであろうIDを、ここでは偽識別子(fake ID)と呼ぶことにさせてください。

スパムというのは、
同じメッセージを繰り返し送る行為を指します。

複数のIDで、同じ顔写真、同じProfile、同じfollow順番が３つ以上あれば、それはスパムと呼んでいいと思います。

今回の調べでは、たしかに何人かは、同じ顔写真だったり、同じprofileだったり、同じfollow順番だったりしました。

しかし、ほとんどは、同じではなく、何か似ているだけで、肝心なのはそこじゃないという気がしました。

何か、Qiita本来の利用方法以外に、IDを使うために、IDを作成し、誰かに転売するか、誰かの意図する行動を取ることによって金品を得るか、何かの賞賛をあびたり、動向を誘導させたりしているのかもしれません。

動向を誘導させたいというのは、spamの宣伝でspamを連呼することで同じといえば、同じです。ただs、Spamというのは、何か同じものを連続するという行為に置いて特徴がある点が大事だと考えています。

そこで、今回、ブロックさせていただいた対象は、偽識別子と類似の行動を取っている方と呼ばせていただこうと思います。
airbnbのeslintルールを利用する時にはpeerDependenciesに注意

## はじめに
VueのプロジェクトでESLintの設定をしていて、airbnbのルールを追加する際に初めて`peerDependencies`を意識したので、`peerDependencies`に関してと、実際にESLintの設定時に注意すべき事を備忘録として残す。

## Vueのプロジェクトでairbnbのルールを設定する
設定するためには以下の手順で`peerDependencies`も含めてインストールを行う必要がある。まずは以下のように、[@vue/eslint-config-airbnb](https://github.com/vuejs/eslint-config-airbnb)とeslintをインストールする。

```console
npn install -D @vue/eslint-config-airbnb eslint
```

次に、以下のように`peerDependencies`を調べて足りないものを追加でインストールする。

```console
npm info "@vue/eslint-config-airbnb" peerDependencies
```

※わざわざ`npm info "@vue/eslint-config-airbnb" peerDependencies`で依存関係を調べるまでもなく、以下のコマンドでpeerDependenciesも含めて一括で必要なものインストールしてくれる。

```console
npx install-peerdeps --dev @vue/eslint-config-airbnb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/db6cd1c2-ba50-e1c7-c928-3422ed8c9a3b.png)

あとは、以下のようにeslintrc.jsonを設定すればOK。

```json:.eslintrc.json
{
	...
	"extends": [
		...
		"@vue/airbnb",
		...
	]
}
```

ちなみに、もしpeerDependenciesのライブラリのインストールを忘れても、ESLintのコマンドを実行した時に依存が足りないという事は教えてくれはする。
```console
[study@localhost intro-vuecli]$ npx eslint .

Oops! Something went wrong! :(

ESLint: 8.17.0

ESLint couldn't find the plugin "eslint-plugin-vuejs-accessibility".

(The package "eslint-plugin-vuejs-accessibility" was not found when loaded as a Node module from the directory "/home/study/workspace/intro-vuecli".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

    npm install eslint-plugin-vuejs-accessibility@latest --save-dev

The plugin "eslint-plugin-vuejs-accessibility" was referenced from the config file in ".eslintrc.json » @vue/eslint-config-airbnb".

If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.
```

## 上記の事はどこに書かれているか？
上記のような手順で設定していく事になるが、それはどこに書かれているの？となるだろう。というのも[@vue/eslint-config-airbnb](https://github.com/vuejs/eslint-config-airbnb)のREADMEには特に何も書かれていないので。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/aa8a7854-e3b0-91a3-2a6b-6c35409965aa.png)

私も最初これで戸惑ったが、vueに特化せず汎用的に使えるairbnbのルールの本体自体は[eslint-config-airbnb-base](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base)なので、もしやここに何か書かれているのでは？と思い、実際にREADMEを見ると、[Usage](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base#usage)にちゃんとpeerDependenciesに関しても記述がある。

## peerDependenciesとは何か？
以下のサイトが参考になった。

https://penpen-dev.com/blog/peerdependencies-toha/

私の手元のnpmのバージョンは6.14.15だったので、自動でインストールしてくれなかったのだろう。。。

```console
[study@localhost intro-vuecli]$ npm --version
6.14.15
```

※npmの公式で言うと[peerDependencies](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#peerdependencies)に記述がある。

## まとめ
全部が全部そのライブラリのREADMEに書いてあるわけではないんだな～と思ったのでした。
Re:ゼロから始めるSNS作り生活（一週間目＋α）

# ☆どんな記事？☆
プログラミング初心者が、イチからSNSサイトを構築する過程を記録したもの。
誰かに「勉強の状況はどう？」と訊かれたときに提示できるよう、Qiitaの記事として投稿しています。
# ☆前置きや前提☆
### 完成品のイメージ
- コンセプトは「勉強記録をポストしたり、問題を出しあったりできるSNS」
- 自分の勉強記録をポストし、閲覧できる
- 友人の勉強記録に対し、コメントやミニクイズを投稿できる（本記事では未実装）
- 自分と似た目標を持つユーザーを検索し、フォローできる（本記事では未実装）
- フォローしている人の勉強記録を一覧表示する「タイムライン」もある（本記事では未実装）
- 当然レスポンシブデザイン（本記事では未実装）
### 制作の目的
- プログラミング技術の向上
- あわよくば友人にこのSNSを使ってもらいたい
### これまでの経験や知識
- WordPressで構築されたサイトの調整経験
（2年弱従事していたため、HTML・CSS・PHPとも基礎はわかっていたつもり）
（通信をはじめバックグラウンドの知識はゼロ）
- 大昔にイチからサイトを構築した経験
（HTMLしか使用していない化石のようなサイトのみ）
- JavaScriptとSQL：1年ほど前にProgateで一応学んだだけで、ほぼ忘却
- DBの知識：応用情報技術者の合格ラインにギリギリ触れられる程度
# ☆日記☆
### 1日目（5月27日）
- 13時ごろ、大先輩に「アウトプットしろ！」と言われて、SNS作りを決意
- Visual Studio Codeの設定（なぜかインストールは済んでいた）
- XAMPPのインストールと設定
- 登録＆ログイン画面、ヘッダ、サイドバーのフロントエンドを制作
- 忘れていたHTMLやCSSのもろもろを適宜復習
### 2日目（5月28日）
- phpMyAdminの設定
- PDOについて学習
- ナンチャッテE-R図づくり
- ユーザー登録機能の実装
（IDまたはメールアドレスが重複している場合は登録できないように調整）
- そのユーザー情報をDBにinsertできるように
### 3日目（5月29日）
- セッションについて学習
- セッション変数が消えてしまう現象に6時間くらい悩む
（実際は消えたわけではなかった）
（詳細は https://qiita.com/I-know-way/items/ca95ca1c0447dcc1a19d ）
- ともあれ無事にログイン機能を実装
### 4日目（5月30日）
- プロフィール画像の登録・表示・変更機能を実装
- Twitterのように、デフォルトで仮のプロフィール画像が設定されるように
### 5日目（5月31日）
- 勉強記録の登録機能を実装
- 勉強記録の一覧表示機能を実装
### 6日目（6月1日）
- アカウント情報（IDやメアドやパスワードなど）の変更機能を実装
【ハマったドツボ】
`window.prompt`でユーザーが入力した値を、別ページ（PHP）で処理したい
→ JavaScriptの`XMLHttpRequest`を用いれば、別ページにPOST変数として値を送れる？
→ 送れない！　なんで！？
（詳細は https://qiita.com/I-know-way/questions/207ba2104ff7a349d00e ）
→ 送れてはいた。しかし`location.href`で画面遷移してしまうと、その送信した値を確認できないらしい
→ GET通信のクエリを使って値を送ることにした
### 7日目（6月2日）
- PHPもSQLも使えるサーバー選びで一日が溶けた → 結局xreaに決定
- コードの見栄えや変数の命名法がひどいことに気づき、全体調整
（画面に表示するphpファイルとDBを操作するphpファイルを分ける等）
### 8日目（6月3日）
- 各ファイルをアップロード
- アップ後もローカル環境と同様の挙動になるよう調整
【ハマったドツボ】
500エラー発生
→ ヒアドキュメントの終わり部分の前に、不要なスペースが残ってた
→ 解消したが、まだ500エラーが出ている
→ ホストかユーザー名かパスワードが変なのか？
→ サーバーの管理画面と超にらめっこ
→ https://kahoo.blog/php-pdo-check-mysql-connection-code/ を発見
→ 接続自体はできていることを確認。問題はそれ以外か……
→ `session_start();`を各ページに書いていなかったことに気づく
（ローカルの場合、各ページに`session_start();`を書くと`Session already started - ignoring session_start`とか何とか怒られるため、あえて書いていなかった）
→ `session_start();`を書いたら解決！
- 登録フォームにメールアドレスや英数字のバリデーションを設定
- 友人に依頼し、ありがたくもデバッグしてもらえることに
### 9日目（6月4日）
- ご指摘いただいたバグや懸念点の解消
1.バリデーションに合わないデータを入力できてしまう問題
2.プロフィール画像に画像ファイル以外をアップできてしまう問題
3.何を入力したら良いかわかりにくい欄がある問題
4.不要な非null制約が存在する問題
5.アップロードファイルのサイズ制限が存在しない問題
- アカウント削除機能の実装
## 来週実装したい機能など
- 勉強記録やコメントに画像を貼付する機能
- 勉強記録の編集・削除機能（つまりCRUDのUとD）
- 友人の勉強記録に対し、コメントやミニクイズを投稿する機能
- 自分と似た目標を持つユーザーを検索し、フォローする機能
- フォローしている人の勉強記録を一覧表示する「タイムライン」機能
- レスポンシブデザイン化
## いずれ行いたいこと
- よりセキュアに
- 全体的なデザインのブラッシュアップ
- androidアプリ化
【SwiftUI】ForEachの警告について

# 該当コード
```swift
import SwiftUI

struct ContentView: View {
    let fruitArray: [String] = ["りんご", "みかん", "ぶどう", "いちご", "ばなな"]
    var body: some View {
        ForEach(0..<fruitArray.count) { index in
            Text(fruitArray[index])
        }
    }
}
```

![スクリーンショット 2022-06-04 14.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dd7e61d8-d8aa-f0d6-52f1-026bce6bda2a.png)


# 警告文
```
Non-constant range: argument must be an integer literal
```

# 解決策
`ForEach`に`id`を設定する

```swift
import SwiftUI

struct ContentView: View {
    let fruitArray: [String] = ["りんご", "みかん", "ぶどう", "いちご", "ばなな"]
    var body: some View {
        ForEach(0..<fruitArray.count, id: \.self) { index in
            Text(fruitArray[index])
        }
    }
}
```
![スクリーンショット 2022-06-04 14.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/81eb48c3-05d5-4253-d0d5-ac4a21f650fd.png)
ブロックさせていただきました。followを取り消させていただきました(2)

こんなにfollow順番が似てるのってどういう現象＝偽識別子

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

でご助言に習い、次の方をブロックさせていただきました。

followだけ31人して、投稿なし、いいねなしという方。

30人近くおみえになりました。また、ご助言にしたがい、それに近いかもしれない方を、
ねんのためにブロックさせていただきました。

ブロックさせていただきました。followを取り消させていただきました。

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

そして、次の1000通知を確認し、followしてくださっていて、いいね（LGTM)がない方も含めて、ブロックさせていただきました。あるいは、followを取り消させていただきました。

Qiitaバッチ17個頂きました。ありがとうございます。

https://qiita.com/kaizen_nagoya/items/656a340e0bf686897a95

Qiita 表彰プログラム

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

で、違和感があったことと関係するかもしれません。

年間 TOP Contributor


狙わない。５年に１度くらいは、何か機会があるかもしれない。
狙って行ってもいいことはない。

いいことはないことの一つg、この偽識別子からのfollowかもしれません。
followerが増えたと好い気になっていると、あやりげなことg裏で動いているかも。

以前から不思議に思っていた現象に、
記事にいいね（LGTM)してくれていないのにfollowerになる人がいること。

twitterのようなfollower返しのつもりなのかなってかってに思っていた。
そうか、偽識別子の現実味を出すためにfollowerになっているのだろうか。

私がそういう偽識別子作成の依頼を受けたら、
初心者がやりがちな行動を分析し、初心者の行動確率分布に沿った、
ばらけた行動を取る偽識別子を作るかもしれない。

逆に、今回は、投稿なし、いいねなしでfollowして人に限定してブロックさせていただいたが、この記事を読んで、違う行動を取られるかもしれず、今後の対応は検討させてください。

合計3000項目から240follow中、65ブロックさせていただき25followを取り消させていただきました。すでにIDがなくなっている方も9名ほどおみえでした。

今年の３月くらいから急増し、３月の行事がきっかけかもしれません。
LGTM数を競う行事は、Qiita主催では辞めた方がいいと思いました。
これらの偽識別子で、大量得票すれば、LGTM数を競うなんて楽勝ですから。


# これまでの方針

基本的に、followさせていただくのは、
githubにIDのある方は、Githubで積極的に活動されている方か、
Qiitaの記事５つ拝見して、自分のいいね（LGTM)基準をみたされている方とさせていただいています。

twitterにIDのある方は、Twitterのつぶやきと、Qiitaの記事３つ拝見し、自分のいいね（LGTM)基準をみたされている方とさせていただいています。

今回、2022年3月24日以降に、なんらかの行動があった1000項目から、
followいただいた100人くらいの方のうち、40人くらいの方をブロックさせていただき、
10人の方のfollowを取り消させていただきました。

もし、記事をご投稿いただいた際に、私の記事のどれかを参照して書いていただければ、
その記事の内容にもとづいて、ブロックを取り消させていただいたり、followさせていただこうと思います。なんつう上から目線。

こちらの一方的な都合で、厳密な基準もないままの行動で申し訳ありません。

なにか、ご不明の点がありましたら、コメント欄におかきいただけると幸いです。

原則的に、いいね（LGTM)をいただいた方にのみ反応させていただいています。

よろしくお願いします。



# 背景

背景として、活動の拠点を、Githubに移行中で、
Githubでオープンソース活動をされている方を
中心にfollowさせていただくことにしていました。

３年以上前に方針を出したのに、自分のGithubの活動が、
転職を機に、１mmも進んでおらず、大手をふってGithubに移行を言えない状況が続いていました。

今回、何を意図するかよくわからないで、記事を書いていました。
コメントいただいて、ええ、そんなことがあるんだって、あわてて対応させていただきました。
過剰反応だと思います。ごめんなさい。

# 参考資料

上から目線の人格改造は別途取り組み中です。

人格改造　あいうえお。仮説（185）

https://qiita.com/kaizen_nagoya/items/bfae8b4a486ee5fd72de
【PHP】 bool値の文字列変換について

# はじめに
bool値の文字列変換について知らず、学んだことがあったため自分なりにまとめます。


# 公式ドキュメント
公式ドキュメントを確認すると以下の様に記載されていた。

> 文字列への変換
(string) キャストや strval() 関数を使って変数を文字列へ変換することができます。 文字列型を必要とする式のスコープにおいて、文字列への変換は自動的に行われます。 echo や print 関数を使うとき、 あるいは可変変数を文字列を比較するときにこの自動変換が行われます。 マニュアルの型 と 型の相互変換 の項を読むとわかりやすいでしょう。 settype()も参照してください。

> bool の true は文字列の "1" に、 false は "" (空文字列) に変換されます。 これにより boolean と文字列の値を相互に変換することができます。

https://www.php.net/manual/ja/language.types.string.php

らしいです。

今回私のケースとしてはjson形式の文字列にtrueをセットした変数を文字列連結した際に起こりました。

おそらく文字列連結することで、文字列へ変換され`1`になってしまったと思われます。

実際に確認してみると、確かにドキュメントで書かれている様にtrueは1に、falseは空文字列に変換されていました。falseは0ではなく、空文字列なのですね。

```php
$bool = true;
$text = "boolの値：" . $bool . "です";
echo $text; //boolの値：1です

$bool = false;
$text = "boolの値：" . $bool . "です";
echo $text; //boolの値：です
```

ちなみに上記例でtrueをそのまま出力したい場合はシングルクォートで囲うことで対応できました。

```php
$bool = 'true';
$text = "boolの値：" . $bool . "です";
echo $text; //boolの値：trueです

$bool = 'false';
$text = "boolの値：" . $bool . "です";
echo $text; //boolの値：falseです
```



# ダブルクォートとシングルクォートの違いについて
ダブルクォートとシングルクォートの違いについても改めて確認してみる

シングルクォート：囲った文字列はそのまま
ダブルクォート：囲った文字列の変数展開したり、エスケープシーケンスを特殊な文字として解釈する

```php
//変数展開の例
$string = "hoge";
var_dump("$string"); //string(4) "hoge"
var_dump('$string'); //string(7) "$string"

//エスケープシーケンス例
var_dump("\r\nおはよう\r\nいい天気だね！");
[出力結果]
string(37) "
おはよう
いい天気だね！"

var_dump('\r\nおはよう\r\nいい天気だね！');
[出力結果]
string(41) "\r\nおはよう\r\nいい天気だね！"
```

:::note info
***エスケープシーケンスとは？***
エスケープ文字とは、文字列の中に機器の制御コードや通常は表記できない特殊な文字を混在させるために規定された、特殊な記号や記法の組み合わせのこと。
引用：[エスケープ文字（エスケープシーケンス）とは - 意味をわかりやすく - IT用語辞典 e-Words](https://www.weblio.jp/content/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)
:::

こういった違いがあることを知った上で使い分ければいいのかなと思いました。


# まとめ
今回はbool値の文字列変換について調べつつ、シングルクォートとダブルクォートの違いについても軽く触れてみました。
公式ドキュメントを読むとそうだったのか色々知ることができるので、不明点が出たら都度確認してみたいと思います。

以上。
scipy.stats: クラスカル・ウォリス検定 kruskal

# scipy.stats: クラスカル・ウォリス検定 `kruskal`

独立標本の代表値の差の検定を行うノンパラメトリック検定である。

`kruskal(*args, nan_policy='propagate', axis=0)`


```python
from scipy.stats import kruskal
import numpy as np

x = np.array([2.9, 3.0, 2.5, 2.6, 3.2])
y = np.array([3.8, 2.7, 4.0, 2.4])
z = np.array([2.8, 3.4, 3.7, 2.2, 2.0])
```


```python
kruskal(x, y, z)
```




    KruskalResult(statistic=0.7714285714285722, pvalue=0.6799647735788936)




```python
a = np.array([41, 36, 12, 18, 28, 23, 19, 8, 7, 16, 11, 14, 18, 
        14, 34, 6, 30, 11, 1, 11, 4, 32, 23, 45, 115, 37])
b = np.array([29, 71, 39, 23, 21, 37, 20, 12, 13])
c = np.array([135, 49, 32, 64, 40, 77, 97, 97, 85, 10, 27, 7, 48, 
        35, 61, 79, 63, 16, 80, 108, 20, 52, 82, 50, 64, 59])
d = np.array([39, 9, 16, 78, 35, 66, 122, 89, 110, 44, 28, 65, 
        22, 59, 23, 31, 44, 21, 9, 45, 168, 73, 76, 118, 84, 85])
e = np.array([96, 78, 73, 91, 47, 32, 20, 23, 21, 24, 44, 21, 28, 
        9, 13, 46, 18, 13, 24, 16, 13, 23, 36, 7, 14, 30, 14, 18, 20])
```


```python
kruskal(a, b, c, d, e)
```




    KruskalResult(statistic=29.26657630611694, pvalue=6.900714118546782e-06)
[2022年]PythonのOpenCVを使って動画を録画する方法

# 実行環境

使用した環境
・Ubuntu 20.04
・Python 3.10.2

# Pythonライブラリのインストール
```
pip install --upgrade pip #pip更新

pip install opencv-python #カメラを使うときに必要
pip install glob #「*.jpg」で必要
pip install numpy #数値計算
```

# 外付けまたは内蔵カメラでカメラのピント調節(Escキーでカメラオフ)
```testing.py
import cv2
import glob
import os
import numpy as np
def tesing_camera():
    cap = cv2.VideoCapture(0)
    while True:
        # 1フレームずつ取得する。
        ret, frame = cap.read()
        #フレームが取得できなかった場合は、画面を閉じる
        if not ret:
            break
    
        # ウィンドウに出力
        cv2.imshow("Frame", frame)
        key = cv2.waitKey(1)
        # Escキーを入力されたら画面を閉じる
        if key == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

tesing_camera() #test camera
```

# 数秒間カメラから録画を行う。
```recording.py
import cv2
import glob
import os
import numpy as np
def Recording():
    #撮影時間を秒で指定  3分の場合は180
    time = int(input("enter the number of seconds\n>>"))
    
    #USBカメラの場合は1、パソコン内蔵カメラの場合は0
    print("PC CAMERA:0, USB CAMERA:1")
    setting = int(input("enter 0 or 1\n>>"))
    cap = cv2.VideoCapture(setting)
    
    #fpsを20.0にして撮影したい場合はfps=20.0にします
    fps = 30.0
    
    #カメラの幅を取得
    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    #カメラの高さを取得
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    #動画保存時の形式を設定
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    name = "sample.mov"
    
    #(保存名前、fourcc,fps,サイズ)
    video = cv2.VideoWriter(name, fourcc, fps, (w,h))
 
    #fps×指定した撮影時間の値繰り返す
    print("start")
    roop = int(fps * time)
    for i in range(roop):
        ret, frame = cap.read()#1フレーム読み込み
        video.write(frame)#1フレーム保存する
    
    print("stop")
    video.release()
    cap.release()
    cv2.destroyAllWindows()
    
    return video

Recording() #録画
```

実行結果です。
```
enter the number of seconds
>>3 #適当
PC CAMERA:0, USB CAMERA:1
enter 0 or 1
>>0
start

stop
```

# 録画した動画を再生する。
```playback.py
import cv2
import glob
import os
import numpy as np
def playback():
    cap = cv2.VideoCapture(r'data/sample.mov')
    if (cap.isOpened()== False):  
        print("ビデオファイルを開くとエラーが発生しました")
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret == True:
            cv2.imshow("Video", frame)
            if cv2.waitKey(25) & 0xFF == ord('q'): 
                break
        else:
            break

    cap.release()
    cv2.destroyAllWindows()

playback() #再生
```

実行結果です。
```
#再生
```
おわり
***
>他の記事
・[[2022年]SVMの学習セットのフォーマット(CSVファイル)](https://qiita.com/netineti512/items/2596d4fbdebd700a7aa0)
・[[2022年]MediaPipeで取得した座標データの統一化の方法[CSVファイル]](https://qiita.com/netineti512/items/fd5929361a6fdb8f629b)
・[[2022年]PythonのMediaPipeを使い、動画ファイルの手を認識し、CSVファイルに座標データを保存する方法](https://qiita.com/netineti512/items/b79ff4f878c7795b6b91)
・[[2022年]PythonのOpenCVを使って動画を録画する方法](https://qiita.com/netineti512/items/57b532d5acd29ab36e67)