OmniAICreator/Qiita-1.07M huggingface dataset:
STM32F103C8T6 開発ボード（通称 Black Pill）STM32CubeIDEでLチカ ～ 書き込み

USBコネクター部分を不注意で壊してしまったBlack Pill 1枚，

ちょうどお仕事でArduinoじゃなくて素のSTM32としてビルドしたい事があって，やってみた。

書き込みで注意点があったけど，切り抜けられた。

1. STM32F103C8Tx として，STM32CubeIDEでビルドできるようにする。
1. Debugフォルダーに出来上がる ***.bin を，STM32CubeProgrammerで書き込む。

STM32CubeIDEでは，Runコマンドでは実行できない。STLINKも互換品を使っていて，ファームのアップデートができず，それ以上進まないため。

ビルドは成功して，バイナリーができているので，STLINKファームアップデートをせずにSTM32CubeProgrammerで書けばOKだった，というオチだった。

STM32CubeIDEでピン設定。BlackPillはPB12にLEDがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/9162bec0-6286-1af3-83e0-fdfaa6e271b4.png)

Generate Code して，何度か怒られたけど，しつこく実行していたらできるようになった。（不明瞭，ごめんなさい）

main.c に以下のように追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/e1ed2df9-c0c7-3ff3-0009-b733ff240e4a.png)

BlackPillとSTLINKを接続。コネクター側のピンを写真下側にセット。BOOT0=H ISPモード。
![P1170724_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/d8dc6b4b-1613-2be3-d096-87636b8e39f2.jpeg)

STM32CubeProgrammerを起動し，STLINKを接続。Erasing & Programming で *.bin を選び，[Start Programm...] をクリックするとOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/4d571877-4c32-0913-dd14-ab605262073c.png)

BlackPillのピンをもとに戻し，STLINK経由で電源を入れると見事に起動する！

（夕方 早速追記）
上記記事ではSTLINK互換品を使ったが，NUCLEO-64をST-LINKがわりにして書き込むこともできた。

多くの先輩達の記事のとおり，NUCLEOのCN4を一旦はずし，
Black PillとNUCLEO CN11を接続。

| BlackPill | Nucleo CN11 |
|:-:|:-:|
|GND|3:GND|
|CLK|2:CLK|
|DIO|4:DIO|
|3V3|1:VDD|

BlackPillのブートピンをISP状態にセット。NUCLEOをパソコンに接続。STM32CubeProgrammerで見事書き込み成功。

Black Pillに別途電源は不要だった。Nucleoから供給されるようだった。

パソコン上で *.bin をドラッグ＆ドロップでも書き込みできた。すごい。

Nucleo CN11 1ピンから，実行時の電源は供給できないみたい。
PythonでYYYYMMDD形式の文字列を取得する

## YYYYMMDD形式

```
import datetime
format(datetime.date.today(), '%Y%m%d') # -> '20210805'
```

## YYYY/MM/DD形式
```
import datetime
format(datetime.date.today(), '%Y/%m/%d') # -> '2021/08/05'
```

## フォーマット方法が知りたい

Pythonのドキュメントはこちら。
[strftime() と strptime() の書式コード](https://docs.python.org/ja/3/library/datetime.html?highlight=datetime#strftime-and-strptime-format-codes)

## なんでこんな単純な記事書いたの？

ググって出てきたコードがコピペで動かないやつばっかでイラっとしたから。
[備忘録]SQLクエリまとめ②

前回に引き続き、SQLのクエリまとめをサクッとしていきます。

基本情報技術者試験の学習中にデータベースの扱い方で、SQL文が出てきて「まとめておいてよかったー」となったので、基本的なクエリについてもう少しまとめておきます。

#DISTINCT

- 検索結果から重複するデータを除くことができる
- `SELECT DISTINCT(カラム名)`

```sql:productsテーブルのnameカラムの重複を除く
SELECT DISTINCT(name)
FROM products;
```

#GROUP BY

- データをグループ化できる
- `GROUP BY カラム名`
- SELECTで使えるのは、`集計関数とカラム名のみ`

```sql:priceの合計を日別でグループ化
SELECT SUM(price), producted_at
FROM products
GROUP BY producted_at;
```

#HAVING

- グループ化したデータを更に絞り込める
- `GROUP BY カラム名 HAVING 条件;`

```sql:priceの合計を日別でグループ化して、1000円以上のもののみ
SELECT SUM(price), producted_at
FROM products
GROUP BY producted_at
HAVING SUM(price) >= 1000;
```

#関数

関数を使うことで、集計がかんたんにできる！

####SUM関数

- 数値の合計を計算
- `SUM(カラム名)`

```sql:categoryが、カレーの商品の合計金額
SELECT SUM(price)
FROM products
WHERE category = "カレー";
```

####AVG関数

- 数値の平均を計算
- `AVG(カラム名)`

```sql:categoryが、ラーメンの商品の平均金額
SELECT AVG(price)
FROM products
WHERE category = "ラーメン";
```

####COUNT関数

- 指定したカラムのデータの合計数を計算
- `COUNT(カラム名)`

```sql:categoryが、ラーメンの商品のデータ数
SELECT COUNT(*)
FROM products
WHERE category = "ラーメン";
```

####MAX・MIN関数

- 指定したカラムの最大、最小のデータを取得
- `MAX(カラム名)`
- `MIN(カラム名)`

```sql:priceが一番高い商品のデータ
SELECT MAX(price)
FROM products;
```

```sql:categoryが、ラーメンの商品の中で、1番安い商品のデータ
SELECT MIN(price)
FROM products
WHERE category = "ラーメン";
```

#さいごに

直接SQL文を書くことはそんなにないですが、ログを見てどういうデータを取得しているかがわかるので、いい勉強になります。
Jira バグタイプの課題にStory Pointを設定する

## はじめに

弊社ではJiraを活用してスクラムを行っており、Story Pointを使った見積もりで、スプリントの管理をしています。
そのため、できる限り多くの課題にStory Pointを振っておきたいです。しかし、デフォルトの設定では、ストーリーとエピックにしかStory Pointを振ることができません。
この設定の変更方法が少しややこしかったので、備忘録として残しておきます。


## 手順

1\. Jiraの設定から「課題」を選択する

![作業_-_Jira.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208752/a9290d14-a705-7ed5-22d7-8e2b0467c6c8.jpeg)

2\. 左サイドメニューから「カスタムフィールド」から、Story Pointを検索、「・・・」から「コンテキストと既定値」を選択

![カスタム_フィールド_-_Jira.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208752/4ff23e5e-3f2c-7adf-c824-89070dfe9258.jpeg)


3\. 「コンテキストの編集」をクリックして、「適用する課題タイプの選択」で課題タイプを選んで保存

![カスタム_フィールドの設定___Story_Points_-_Jira.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208752/50eebbd8-6b8d-ef7e-473a-20eb67da7333.jpeg)

![変更_設定スキーム_コンテキスト_-_Jira.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208752/024886b0-98a6-24f5-4628-1ddb617db99e.jpeg)


これで、課題ページやバックログにStory Pointのフィールドが登場し、編集できるようになります。

![MP_ボード_-_アジャイル_ボード_-_Jira.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208752/0186fd4a-c4be-bd9a-a7fc-20bb35643dbf.jpeg)

## あとがき

弊社([株式会社esprot](https://www.esprot.co.jp/))では、一緒にサービス開発を行ってくれるメンバーを募集しています。スクラム開発に興味がある方、事業の成長に直接貢献したい方など、もし興味がございましたら、[こちら](https://www.wantedly.com/projects/701007)までご連絡ください！
59日後にITパスポートを受けるFラン私大文系既卒(7日目)

# プロジェクト
* プロジェクトとは?
 * 期限内に独自のモノやサービスを作るための業務
* 特徴 
 * 期限がある(有期性)
 * 独自性

# プロジェクトマネージャ
* プロジェクトマネージャとは?
 * プロジェクトを管理する人

# プロジェクトマネジメント
* プロジェクトマネジメントとは?
 * 作業範囲(スコープ)、期限(スケジュール)、費用(コスト)を管理すること

# PMBOK(Project Management Body of Knowledge)
* PMBOKとは?
 * プロジェクトマネジメントの体系化された知識
 * プロジェクトマネージャのための教科書
* PMBOKの10の知識
 * プロジェクト統合マネジメント
 * プロジェクトスコープマネジメント
 * プロジェクトステークホルダマネジメント
 * プロジェクトスケジュールマネジメント
 * プロジェクトコストマネジメント
 * プロジェクト品質マネジメント
 * プロジェクト資源マネジメント
 * プロジェクトコミュニケーションマネジメント
 * プロジェクトリスクマネジメント
 * プロジェクト調達マネジメント

# プロジェクトスコープマネジメント
* プロジェクトスコープマネジメントとは?
 * プロジェクトに必要な作業を抽出すること
 * プロジェクトが生み出す製品やサービスなどの成果物を定義すること
 * それらを完成させるために必要な作業を定義すること

# WBS(Work Breakdown Structure)
* WBSとは?
 * プロジェクトを細かく分割すること
 * それを表した図
 * 時間やコストが見積もることができる大きさまで分割する

# ワークパッケージ
* ワークパッケージとは?
 * WBSでの一番小さい単位
 * 8〜80時間程度で作業が完了するくらいの大きさ

# プロジェクトステークホルダマネジメント
* プロジェクトステークホルダマネジメントとは?
 * プロジェクトのステークホルダー(利害漢検者)を特定して、その人たちに積極的にプロジェクトに参加できるように調整すること

# プロジェクトスケジュールマネジメント
* プロジェクトスケジュールマネジメントとは?
 * プロジェクトがスケジュール以内に終わることを目標にします
* プロジェクトスケジュールマネジメントに使う2つの図
 * ガントチャート
 * アローダイアグラム

# ガントチャート
* ガントチャートとは?
 * プロジェクトの進捗状況を視覚的に表す図

# アローダイアグラム
* アローダイアグラムとは?
 * 作業の流れを矢印で表した図
 * 前後の作業と依存関係がある場合はアローダイアグラム 

# PERT(Project Evaluation and Review Technique)
* PERTとは?
 * アローダイアグラムを使ったプロジェクト解析方法

# ダミー作業
* ダミー作業とは?
 * 所有日数が0日の作業
 * 依存関係を示すために記載する

# クリティカルパス
* クリティカルパスとは?
 * もっとも時間のかかる経路
 * ここで遅れが出るとやばい

# プロジェクト資源マネジメント
* プロジェクト資源マネジメントで大切なこと
 * プロジェクトメンバが全員各自の役割と責任、必要なスキルを把握し、参加時期も明確にすること

# プロジェクトコミュニケーションマネジメント
* コミュニケーションで伝達すること
 * プロジェクトの進捗
 * 会議の日程
 * 議事録
* コミュニケーション手段
 * 口頭
 * 電話
 * メール
 * テレビ電話
 * チャット
 * 掲示板サイト

# プロジェクト憲章
* プロジェクト憲章とは?
 * プロジェクトの目的を記載した文書
 * プロジェクトマネージャを決める
 * プロジェクトマネージャの責任と権限を明確にする

# プロジェクトリスクマネジメント
* 4つの対応策
 * リスク回避
 * リスク転嫁
 * リスク軽減
 * リスク受容
Error: npm ls -prod -json -depth=1 failed with code 1

AWS CLIの`serverless package`コマンドでデプロイパッケージ作成処理を行った際に、以下のエラーが出た。

`Error: npm ls -prod -json -depth=1 failed with code 1`

node_modulesでエラーが出ているということなので、削除した後、`yarn install`を行ったが、解決しなかった。

## 解決方法
Nodeをダウングレードした。

Node Version：　15.8.0
↓
Node Version：　14.15.4

```
nvm list
```

![スクリーンショット 2021-08-05 10.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232501/5118b2bb-d5b3-88ca-a225-c67bea7f4efb.png)

```
nvm use v14.15.4
```

以上。
よく使うDOSコマンド

# CMDを開く
* 窓口から開く
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/a6520c27-8299-2547-a66f-e66b7e9f28e2.png)
* WINキー + R後cmdを入力する
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/9bd14f1b-f305-800b-d24b-87aa1db69c2d.png)
* Shift + 右クリック、「PowerShellウィンドをここで開く」をクリック
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/b3d1ee86-9938-14b2-e9e7-d60aa4df052f.png)
* cmd + " " + 住所 + Enter
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/67b8d728-c58d-7bc3-d6e0-1bbd17a14adb.png)

# ディレクトリ移動
* 直接住所入力

```
C:\Users\hiroa\OneDrive\デスクトップ>D:
D:\>
```
* cd /d + 住所

```
D:\>cd /d c:  →　DからCに移動
C:\Users\hiroa\OneDrive\デスクトップ>

C:\Users\hiroa\OneDrive\デスクトップ>cd /d d:OS 　→　CからDのOSディレクトリに移動
D:\OS>
```
# ディレクトリー配下中身確認

```
D:\>dir
 ドライブ D のボリューム ラベルがありません。
 ボリューム シリアル番号は 24B0-FE11 です

 D:\ のディレクトリ

```

# ファイル操作

```
md + ディレクトリ名　→　ディレクトリ作成
rd + ディレクトリ名　→　ディレクトリ削除
cd> + ファイル名　→　ファイル作成
del + ファイル名　→　ファイル削除
```

# その他のコマンド

```
cls (clear screen)　→　スクリーンをクリアする
ipconfig　　→　IPを確認する
calc →　電卓開く
mspaint  →　ペイント開く
notepad 　→　ノート開く 
```
RSA 社の SecurID Software Token アプリの代替として、 stoken （CLIツール）をつかう

# はじめに

- RSA社のSecurID Software Tokenを使う場合、RSA社が提供しているアプリ（[これ](https://community.rsa.com/t5/securid-software-token-for-macos/tkb-p/securid-software-token-macos)とか） を使うケースが多いと思う。
- とはいえ、CLIで叩けたほうが楽な場合があるので、`RSA SecurID compatible` を謳っている stokenというソフトウェアを使ってみる。
  - https://github.com/cernekee/stoken
- macOS Big Sur を前提としている。

# 使い方

といっても公式のReadmeを見ればだいたいわかるが...


インストール

```bash
$ brew install stoken
```

インストール先は `/usr/local/Cellar/stoken/0.92_1/bin/stoken` とかになるので、適当にpathを通してね。

sdtidファイルのimport

```bash
$ stoken import --force --file ~/foobar.sdtid
```

pin codeの設定

```bash
$ stoken setpin
```

import と setpin した設定は `~/.stokenrc` に保管されている。
`stoken show` で設定を確認することができる。

token codeの生成

```bash
$ stoken tokencode
xxx
```


## 複数の設定を使い分けたい場合

import と setpin した設定は `~/.stokenrc` に保管されるので、 `cp ~/.stokenrc ~/stokenrc_a` などと適当にrenameしておく。

その後別のsdtidをimportしたものは `~/.stokenrc_b` などとして、以下のように使い分ければ良い

```bash
$ stoken tokencode --rcfile="$HOME/.stokenrc_a"

$ stoken tokencode --rcfile="$HOME/.stokenrc_b"
```

自分は ^ これを zsh　の alias にしています。

おしまい
基礎①〜文字列、数値、変数〜　php

<h3>-はじめに-</h3>
基礎的な部分の理解度が思ったよりできていなかったため自分なりにまとめてみた。

<h3>-内容-</h3>

・PHPについて

言語としての特徴　

・web開発に適しており、HTMLに組み込むことができる
・JavaScript とは異なりコードがサーバーで実行されその結果クライアントに送信することがでる

参考：https://www.php.net/manual/ja/intro-whatis.php

・文字列と数値の違いについて

クオテーションを使用しコンピューターの中で言語を文字として認識してもらう、数値として認識してもらうことを指します。

例１：

 echo 1+1 ;
//結果：　2

上記の場合クオテーションを使用しなかったため、コンピューター上において数値と認識されたため、結果として「２」という答えがでました。


例２：

  echo “1+1”;
//結果：　“1+1”

上記の場合ダブルクオテーションを使用したため、コンピューター上で文字列と判断され結果として「”1+1”」という答えがでました。

注意！）クオテーションには「’」シングルクオテーションと「”」ダブルクオテーション２つの種類があります。この使い分けとしては変数や配列を認識してくれるかどうかです。

例：ダブルクオテーションの場合
＄animal=　“うさぎ”;
 echo “この動物は{$animal}です。”;

//結果：　この動物はうさぎです。

例：シングルクオテーションの場合
＄animal=　“うさぎ”;
echo　‘この動物は{$animal}です。’;

//結果：　この動物は{$animal}です。;

上のように変数を値をだしたい場合はダブルクオーテーションを使用しないと結果がでてこないことになります。

・変数について

変数とは値をいれておくための箱のことを表している

例：$animal =“犬”;

 echo  $animal;

//結果：　犬

「＝」というのはプログラミンにおいて右辺を左辺に代入するという意味で使用する
また、変数は使い回しが可能となっている

echo  ＄animal ＄animal,＄animal;

//結果：　犬 犬 犬

となります。

変数にはルールがあります
・英単語が望ましい
・2単語以上は大文字で区切る

<h3>-まとめ-</h3>
ルールを守り使い分けをすることによってエラーになることを防ぐことができる。
str_replace、mb_substrについて

タイトル：str_replace　、　mb_substr　について

<h3>-はじめに-</h3>
文字列の置換について

<h3>-内容-</h3>

・str_replace
str_replaceとは
文字列に対して検索を行い一致した文字列に対して置換する関数


例：
　　\$a ="りんごを食べる”;
　　\$b= “食べた”;
この内容をりんごを食べたにしたい場合

\$りんごを（付け足したい部分） = str_replace( “食べる"（置き換えたい内容）, \$b（置き換えた後の文字列） , \$a(検索する文字列));


Print_r($りんごを);

結果　: りんごを食べた

・mb_substr
文字の一部を抽出する関数

例：


\$a = "黄色が嫌い";
\$b = "好き";

//ここでmb_substr関数を使用して\$aの”黄色が”の部分を指定してあげる
\$黄色 = mb_substr($a, 0, 3);

注意点！)　PHPにおいて文字は0から数える概念の元、文字の場所を指定する。そのため
この場合は0~3文字目の部分が「黄色が」を表しているので(\$a,0,3)となる。


print_r(\$黄色が.$b."\n");

結果 : 黄色が好き


<h3>-まとめ-</h3>

ECサイトなどの新規登録後に送られるメールにて
「（自分の名前）＋登録ありがとうございます。」等がある

この場合、str_replaceを使用し「自分の名前」の部分が置換されることで登録完了メールが成り立つ。
加算子,減算子 , count  PHP

<h3>-はじめに-</h3>
問題を解いていく中でcountと$++についてつづいたので自分なりに調べ考えをまとめてみた。


<h3>-内容-</h3>
・countについて　

count 

変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数えます。
参考：https://www.php.net/manual/ja/function.count.php

・加算子/減算子について

++\$a	前置加算子	＄a に 1 を加え、$a を返します。
 ＄a++	後置加算子	＄a を返し、＄a に1を加えます。
--＄a	前置減算子	＄a から 1 を引き、＄a を返します。
＄a--	後置減算　＄a を返し、＄a から 1 を引きます。

インクリメント演算子＝増加させる演算子
for文などの繰り返し文で、1ずつ増やす処理をする時によく使われる。

「i」が変数で「++」がインクリメント演算子で対象の値を1つ増やすことがわかったら、「i++」の意味も分かってくる。

「i++」は

変数「i」に値を１追加する

という意味になる。

参考：https://www.php.net/manual/ja/language.operators.increment.php

<h3>-まとめ-</h3>

countを使用することで、配列や文字列を数えることができるので条件の絞り込みができる。
加算子/減算子は使う場面が多いのでしっかり覚えていきたい。
AWS EKSをコマンドから構築

## はじめに

AWS EKSをWebコンソールから構築することも出来ますが、毎回毎回画面で設定値を入力するのは少々手間です。
eksctlでコマンドから構築できるようなので試してみます。

## 目的

Webコンソールは使用せず、eksctlのみでAWS EKSのクラスタを構築する。

## 前提

コンテナでaws cliが利用可能な環境が整っていること

[AWS CLIをコンテナから使えるようにする]()

## AWS EKSの構築(クラスタの作成)

```
$ eksctl create cluster --name クラスタ名 --region us-west-1 --node-type t2.micro --nodes 2 --nodes-min 2 --nodes-max 2
```

## AWS EKSの情報を確認してみる

### namespace情報の参照

```
# kubectl get namespace
```

### pod情報の参照

```
# kubectl get pod
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   177m
```

## すでにクラスタが構築されている場合

すでにクラスタが構築されている状態でAWS CLIが実行可能なコンテナを起動させた場合、aws configureのあとに以下のコマンドを実行することでeksctlやkubectlが利用可能になります。

```
$ aws eks --region us-west-1 update-kubeconfig --name クラスタ名
```

## 他のIAMにもアクセス権を与える

- クラスタ情報を確認

```
# eksctl get iamidentitymapping --region us-west-1 --cluster クラスタ名
2021-03-03 08:16:45 [ℹ]  eksctl version 0.39.0
2021-03-03 08:16:45 [ℹ]  using region us-west-1
ARN												USERNAME		GROUPS
arn:aws:iam::xxxxxxxx:role/xxxxxxxx	system:node:{{EC2PrivateDNSName}}	system:bootstrappers,system:nodes
```

- クラスタ名、IAMユーザ名を変更して実行

```
# eksctl create iamidentitymapping --region us-west-1 --cluster クラスタ名 --arn arn:aws:iam::xxxxxxxx:user/権限を付与したいIAM --group system:masters --username 権限を付与したいIAM
```

## クラスタの削除

```
# eksctl delete clister —name クラスタ名
```

## おわりに

今回はお手軽にデフォルト、最小、最大ノード数を2とし、使用するEC2インスタンスも最小のt2.microで構築しました。
このあたりの構成は規模に応じて変更すれば良いと思います。
eksctlを使用すると、VPCやサブネットも含め構築されますので、使用するリージョンにVPCを登録できるだけの空きが無いとエラーになります。
また、今回は有志含め2名で検証していたのですが、私が作成したクラスターへアクセスできず困りました。
アクセス権を与えることで有志も私と同様にコマンドを実行できるようになりました。
さらにこのあと、有志はAnsibleを使い、EKSクラスタにPodを自動でプロイする検証を進めてくれました。
とても簡単なサンプルではありますが、応用すればいろいろな環境を自動デプロイできるのではないでしょうか。
[Tableau]メジャーバリューを必要なものだけ追加する

今回は、初歩的だけどしばらく悩んでしまった「メジャーバリューうじゃうじゃ問題」についてです。


# なにを言ってるのか？

複数のバリューを並べて比較したいときなどに使う**メジャーバリュー**。
例えば、売上と販売数量を並べてみたいときなどに活躍します。

が、よし、使おう、と思って左のタブから「メジャーバリュー」をドラッグ & ドロップすると…

ズラっ！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/dc15d16f-687b-763b-0fcf-f0df93f17bd4.png)
存在する全部のメジャーが一気に追加されます。

そして、いやいや売上と数量だけでいいんだよ！ と言って、いらないものを1つ1つ枠から外していきます。

**…めんどくさいわ！！**

しかも、↑くらいならいいですが、大きなデータソースだとメジャーの数も多くなって、表示までに数十秒待たされることもしばしばです。


# 欲しいものだけ選んで追加したいんだけど

と、当然思うわけですが、結論から言うと、できます。

メジャーバリューの追加の前に、メジャーネームでフィルターしてやればいいのです。


まず、メジャーネームをフィルターに追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/b26a4f01-87f2-79c8-b54f-2b1b6bfe581c.png)

で、フィルターの編集で欲しいメジャーにだけチェックをつける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/995894a2-e9c4-3882-bfc2-f7110ce39459.png)

そしてメジャーバリューをいつも通り追加してやれば、はい、すっきり！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/a4994134-6a7d-b621-9cdc-232dfb60271d.png)


考えてみれば当然なんですが、「特定のものだけ追加しよう！」というときに想像するUIとはちょっとイメージが違うので、しばらく気が付きませんでした。


ちなみに[公式ドキュメント](https://help.tableau.com/current/pro/desktop/ja-jp/datafields_understanddatawindow_meavalues.htm)を見ると…
> [メジャー バリュー] フィールドには、データのすべてのメジャーが連続する値を使用して 1 つのフィールドに集められています。個々のメジャー フィールドを [メジャー バリュー] カードの外にドラッグして、これらのフィールドをビューから削除します。

とありますので、1つ1つ手で外せよとのこと。
いやです。

# 終わりに

Tableauを触ってると、ツールの操作で「これどうやるんだろう」と思うことがしばしばあります。

一回ハマるとドキュメントを読んでもなかなか解決しないことが多いですが、気持ちを強く持って模索し続けたいと思います。
While(flag) 無限ループを使う時の注意

### はじめに
これは、私が無限ループを使うときに失敗して今後、注意しようと思うことである。
初心者の方で同じ落とし穴に落ちた人の役に立てば何よりである。
そして、これは自分の備忘録でもある。

### はじめに
ここで問題になるのは、arraySort()メソッドにおけるwhileの無限ループである。
Whileの無限ループは仕事が終わったらflag=false;にしてループを止めるのであるが、このflag=false;の位置について論じたい。

これを私ははじめ、１８行目に入れていた。
そしたら、結果は
{31,29,45,77,84,96}となり並び替えが完了していない。
そこで、並び替えの様子を書き出してみた。
![スクリーンショット 2021-08-05 8.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762776/375f20bd-0ac3-bd7e-147a-817bdfecf433.png)

これをみると、ループは調度２回、回ったところで止まっている。
２巡目の最後は、{８４、９６}という数字で入れ替わりが発生しない。そこで、ここで、flagがfalseになり３巡目に行かなくなっている。
当たり前であるが、flag=false;はforループの外側に出すという癖をつけようと思う。


### 該当するソースコード
```java
public class Main5_7 {//1
	public static void main(String[] args){//2
		int[] arrays1= {96,45,31,29,84,77};

		display(arrays1, false);
		arraySort(arrays1, true);
		display(arrays1, true);
		arraySort(arrays1, false);
		display(arrays1, true);
	}
	public static void arraySort(int[] array, boolean orderType) {
		//3
		boolean a = true;
		if(orderType) {//4
			while(a) {
				a=false;  //16行目
				for(int i=0 ; i<array.length-1 ; i++) {
					// a=false; //なぜ、ここにあったらいけないのかわかりません。//18行目
					//最後に入れ替えがないとだとfalseになる。
					if(array[i]>array[i+1]) {
						a=true;
						change(array, i, i+1);
					}
				}
			}

		} else {
			while(a) {
				a=false;
				for(int i=0 ; i<array.length-1 ; i++) {
					if(array[i]<array[i+1]) {
						a=true;
						change(array, i, i+1);
					}
				}
			}
		}//4
	}//3

	public static void display(int[] array, boolean isSorted) {
		if(isSorted) {
			System.out.println("配列は整えられています。");
		} else {
			System.out.println("配列は整えられていません。");
		}
		for(int value : array) {
			System.out.print(value + ",");
		}//3
	}

	public static void change(int[] array,int i, int j) {
		int temp;
		temp = array[i];
		array[i] = array[j];
		array[j]= temp;
	}
}
```


以下は改良中のコードの備忘録です。

```
配列は整えられていません。
96,45,31,29,84,77,
```


```
配列は整えられていません。
96,45,31,29,84,77,
配列は整えられています。
31,29,45,77,84,96,
配列は整えられています。
96,84,77,45,31,29,

```




### 改良中のコード
```java
public class Main5_7_1 {//1
	public static void main(String[] args){//2
		int[] arrays1= {96,45,31,29,84,77};

		display(arrays1, false);
		arraySort(arrays1, true);
		display(arrays1, true);
		arraySort(arrays1, false);
		display(arrays1, true);
	}
	public static void arraySort(int[] array, boolean orderType) {
		//3

		if(orderType) {//4
			while(true) {
				for(int i=0 ; i<array.length-1 ; i++) {
					if(array[i]>array[i+1]) {
						change(array, i, i+1);
					} else {
						break;
					}
				}
			}

		} else {
			while(true) {
				for(int i=0 ; i<array.length-1 ; i++) {
					if(array[i]<array[i+1]) {
						change(array, i, i+1);
					} else {
						
					}
				}
			}
		}//4
	}//3

	public static void display(int[] array, boolean isSorted) {
		if(isSorted) {
			System.out.println("配列は整えられています。");
		} else {
			System.out.println("配列は整えられていません。");
		}
		for(int value : array) {
			System.out.print(value + ",");
		}//3
		System.out.println();
	}

	public static void change(int[] array,int i, int j) {
		int temp;
		temp = array[i];
		array[i] = array[j];
		array[j]= temp;
	}
}
```
お名前comでDNSレコード設定したはずなのに反映されていない？設定していないかもしれないですよ。

<img width="480" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/c12f6982-511e-135f-6509-eb44a86aba6c.png">

---

##はじめに
10年に一回くらいしか需要がなさそうな記事です。
そこそこ大きな勘違いと、少しの苦労が発生していたので記録。

##TL;DR
- お名前comでドメイン取得
- さくらサーバーでメール利用
- Wixでドメイン利用

という条件の場合、DNSレコードを書き換えるためにはWIXから変更設定すべしでした。
ドメインについて何も理解していなかったことがバレてしまいましたね。

##困っていたこと
DNSレコードを書き換えたいです。
HP構築サイトやAnalytics系のサービス(GAなど)でドメインの所有権を証明する必要が出てくることが、たまにあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/9016609a-6e24-b6e3-2430-867fcce8a714.png)
↑みたいなやつですね。

その際、TXTレコードをお名前comで変更していたのですが、(ドメインによって)うまく行くときと行かない時があり、「なんでだろうなあ～。まあいいか。」みたいなことになっていました。

##構成
まず、弊社で管理しているドメイン(ここでは「x.jp」とします)について、

- お名前comでx.jp のドメイン取得、ネームサーバも基本ココ
- さくらサーバーでメールサービス利用 ([こちらなど参照](https://qiita.com/ishizukih/items/52099399c81aee89f728))
- Gmailからx.jp ドメインのメールを送れるよう設定([こちらなど参照](https://qiita.com/ishizukih/items/52099399c81aee89f728))
- Wixでx.jp ドメインのウェブサイト構築
- ちなみにx.jp のサブドメインはさくらサーバーで取得し運用

という感じで取得、運用していました。
個人的に罠だったのが

- x.jp ドメインのネームサーバだけ、Wixに委譲している
- それ以外の yy.x.jp やzz.xjp のようなサブドメインのネームサーバはお名前comのままだった

ということです。つまり、
**いくらお名前comからx.jp のネームサーバ書き換えても全く反映されない**、ということです。

冒頭でお伝えした「うまく行くときと行かない時がある」のはこれのせいです。
サブドメインのTXTレコードなどを書き換える時については、しっかりうまく行っていたのだと思います。

##まとめ
今後、GAやその他サービスで「ドメインの所有権を証明して？」と言われて、「書き換えているはずなのに」「数分で終わるはずなのに」、終わらないということがあったら、ネームサーバがどこにあるのか、うっかり(?)移管していないか考えてみようと思います。

<img width="480" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/6321b696-d208-9fe2-03bd-08ce6b790bb1.jpeg">
まだ赤ちゃんであることを自覚せず得意げになっている私です。お納めください。

##参考

https://qiita.com/ishizukih/items/52099399c81aee89f728

https://kohimoto.com/labo/study/gmail%E3%81%AB%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/
Go言語クロージャーについての豆知識

###背景###
for分の中に関数を書くときに、特にfor分のスコープと関数の組み合わせによって、クロージャーが生成され、関数の実行タイミングはfor分と一致ではない場合は、バグは発生しやすいです。
例えば、javascriptでは以下のようなクロージャー典型例があります。
[Javascriptの豆知識(let,var,クロージャーに関する面接問題)](https://qiita.com/xu1718191411/items/88dee669da14bc8ba749 "Javascriptの豆知識(let,var,クロージャーに関する面接問題")

Javascriptではletという変数宣言方法を活かすことによって、うまくfor分共にあるクロージャー問題点を解消できますが、Go言語だと、どうやって解消できますでしょうか

####問題####
#####コード#####

```golang
func main()  {
	n := 5

	funcs := []func(){}

	for i:=0;i<n;i++ {
		// fmt.Println(&i)  // コメントアウトを外してみたら、iのメモリアドレスは同じものです。
		funcs = append(funcs, func() {
			fmt.Print(i)
		})
	}
	for i:=0;i<n;i++ {
		funcs[i]()
	}
}
```

#####出力#####

```
5
5
5
5
5
```

#####原因#####
原因は二つがあります

* これはfor分からループするタイミング(funcsスライスに関数を作って入れるタイミング)とfuncsスライスにある関数が実行されるタイミングは違います。
* funcスライスにあるすべてな関数にある変数iは同じところに参照しています。(for分ではメモリアドレスが同じなiを使っているためです)
* そのため、関数が実行するタイミングでは、すべてな関数から参照しているiはすでに5になりましたので、すべてな関数は同じi(10)を出力しました。
![closure scope.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/7f9e440f-a7fe-1cef-11b9-5de463067111.jpeg)



javascriptだと、for分にiをletで定義することによって、問題を解消できますが、Go言語はどうなるですか＞＜？
いろいろ調べました。


####解決方法1####
新しい変数iを作ることによって、新たなiをメモリ場で開拓し、funcsスライスに入れる関数はこちらのiを記憶します。
![closure scope.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/b32bec82-dcd3-e12e-e3b9-037d283f751c.jpeg)

#####コード#####
```golang
func main()  {
	n := 5

	funcs := []func(){}

	for i:=0;i<n;i++ {
		i := i
		// fmt.Println(&i) //コメントアウトを外して見たら、iのメモリアドレスはそれぞれ異なります。
		funcs = append(funcs, func() {
			fmt.Println(i)
		})
	}

	for i:=0;i<n;i++ {
		funcs[i]()
	}
}
```

#####出力#####

```
0
1
2
3
4
```

####解決方法2####
実行された関数Aが関数Bをreturnします、関数Bをfuncsスライスに入れます。関数Aに渡した引数は値渡しなので、関数Aが実行されるときに、iが新しく作られています。
これによって、関数Bは関数Aとクロージャーが生成され、関数Aの中に新たなiがメモリ場で開拓され、関数Bがそのiを参照します。それぞれの関数Bはそれぞれのiを参照しています。
![closure scope.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/1994b3ac-5f28-48c4-fa15-4df9839f5680.jpeg)


#####コード#####
```golang
func main()  {
	n := 5
	funcs := []func(){}
	for i:=0;i<n;i++ {
		funcs = append(funcs, func(i int) func() {
			// fmt.Println(&i) // コメントアウトを外してみたら、iのメモリアドレスはそれぞれ異なります。
			return func() {
				fmt.Println(i)
			}
		}(i))
	}　// ここ　→　関数Aにforループのiを渡し、関数Bを返されます。

	for i:=0;i<n;i++ {
		funcs[i]()
	}
}
```

#####出力#####

```
0
1
2
3
4
```

ちなみに、関数Aに引数をポインター渡しとして実行したら、どうなりますか？


```
	for i:=0;i<n;i++ {
		funcs = append(funcs, func(i *int) func() {
			fmt.Println(i)
			return func() {
				fmt.Println(*i)
			}
		}(&i))
	}
```

当然、すべてなiが同じメモリアドレスに参照し、全てのfuncの出力は同じ5になります。

```
0xc00001c080
0xc00001c080
0xc00001c080
0xc00001c080
0xc00001c080
5
5
5
5
5
```

<iframe width="560" height="315" src="https://www.youtube.com/embed/g0nGWyLbrNQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

###参考資料###

https://qiita.com/taka011239@github/items/dd22e2ad1dd56c77be10

https://qiita.com/xu1718191411/items/88dee669da14bc8ba749

https://qiita.com/blackdot/items/42e379c6aab219b9e3a9
Google ColabでTreeTaggerとstopword

#準備


```
!mkdir treetagger
%cd treetagger
# Download the tagger package for your system (PC-Linux, Mac OS-X, ARM64, ARMHF, ARM-Android, PPC64le-Linux).
!wget https://cis.lmu.de/~schmid/tools/TreeTagger/data/tree-tagger-linux-3.2.4.tar.gz
!tar -xzvf tree-tagger-linux-3.2.4.tar.gz
# Download the tagging scripts into the same directory.
!wget https://cis.lmu.de/~schmid/tools/TreeTagger/data/tagger-scripts.tar.gz
!gunzip tagger-scripts.tar.gz
# Download the installation script install-tagger.sh.
!wget https://cis.lmu.de/~schmid/tools/TreeTagger/data/install-tagger.sh
# Download the parameter files for the languages you want to process.
# list of all files (parameter files) https://cis.lmu.de/~schmid/tools/TreeTagger/#parfiles
!wget https://cis.lmu.de/~schmid/tools/TreeTagger/data/english.par.gz
!sh install-tagger.sh
%cd ..
!pip install treetaggerwrapper
```

```
import treetaggerwrapper as ttw
from nltk.corpus import stopwords
```


```
nltk.download('stopwords')
stop_words = stopwords.words('english')
print(stop_words) #確認
```



```
def pos_tagger(sentence, pos):
    result = []
    tagger = ttw.TreeTagger(TAGLANG='en', TAGDIR='treetagger/')
    tags = tagger.TagText(sentence)
    for tag in tags:
      #if re.search('<rep', tag):
      tag = tag.split('\t')
      if len(tag) != 3:
        continue
      if (tag[1] in pos) and (not (tag[1] in stop_words)):
        result.append(tag[2])
    return ' '.join(result)
```


#確認

```
pos = ['NN', 'NNS', 'NP', 'NPS', 'VDG', 'VVG'] #ほしい品詞
pos_tagger('Hello world!', pos)
"""
hello world
"""
```
CloudFormationで遊んでみる(VPC編)

###概要
CloudFormationでVPCを作成します。

###実装コード
```yml:vpc.yml
AWSTemplateFormatVersion: '2010-09-09' 
Description: vpc create
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/24
  VpcCidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 192.0.0.0/24
  VpcCidrBlockIpv6:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      VpcId: !Ref VPC
      AmazonProvidedIpv6CidrBlock: true

Outputs:
  VpcId:
    Value: !Ref VPC
  PrimaryCidrBlock:
    Value: !GetAtt VPC.CidrBlock
  Ipv6CidrBlock:
    Value: !Select [ 0, !GetAtt VPC.Ipv6CidrBlocks ]
  CidrBlockAssociation:
    Value: !Select [ 0, !GetAtt VPC.CidrBlockAssociations ]
```

###作成インスタンス         
 ![vpcのリソース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/26a8a6ba-1390-a132-e294-cdd210b5a5f2.png)
                                                                                                                                                                                                                               
![スクリーンショット 2021-08-04 14.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/f986b30c-302e-ef34-322f-92153130bcf0.png)

![スクリーンショット 2021-08-04 14.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/eb7d6088-ed36-be0d-ea8f-042c9db410da.png)

###コード解説
```:コード説明
①AWSTemplateFormatVersion:テンプレートのver。2010-09-09がデフォルトと思っておけばOK!!
②Description：作成テンプレートの説明。
③Resources：テンプレートで作成するAWSのリソースの一覧を明記する。
④Outputs:CloudFormationで作成した際の値を表示する事ができる。なかなか便利なやつ。
```
①と③だけ必須。他は任意で良い。

```yml:Resourcesの中身
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/24
  VpcCidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 192.0.0.0/24
  VpcCidrBlockIpv6:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      VpcId: !Ref VPC
      AmazonProvidedIpv6CidrBlock: true
```
作るリソースは下記3点
①VPC
②VpcCidrBlock
③VpcCidrBlockIpv6

##VPCの説明
```
Properties:
 CidrBlock: 10.0.0.0/24
```
CIDRとは、インターネット上のIPアドレスの割り当てと経路選択（ルーティング）を柔軟に運用する仕組み。IPアドレスのクラス分けを廃止し、組織の規模に応じて割り当てるアドレスの数を柔軟に選択できるようにした上で、アドレスブロックをグループ化して経路情報を集約するようにしたもの。([引用元](https://e-words.jp/w/CIDR.html))
早い話が、IPアドレスはどこのネットワークのどの端末であるかを示すためのもの。で、どこまでがNWアドレスでどこまでがホストアドレスなのかを判断するために、CIDRがある。今回の例だと24なので、24ビットまでがネットワークアドレスになる。
今回の例は「10.0.0.0/24」、ネットワークIPは「10.0.0.0」。ネットワークの計算は[リンク先](https://www.softel.co.jp/labs/tools/network/)からできるので、試して見ましょう。
![スクリーンショット 2021-08-04 14.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/63fef832-51ed-e490-087a-73f0caabea63.png)
よくよく考えてみると②と③はいらなかったなぁ。
【Ruby on Rails】devise実装後にログイン・ログアウト後のリダイレクト先を指定する方法


#対象者

* deviseを実装済の方
* 管理者・ユーザーで２つのdeviseを実装した方
* ログイン・ログアウト後の動作を考えている方


#目的

* devis実装後にログイン・ログアウト後の遷移先を指定する条件を作ること


#実際の手順と実例
###1.前提
* devise実装済（実装方法は下記の通り）

https://qiita.com/nao0725/items/83c73c417be01913a857

* Admin/User２つのモデルを作成している


###2.今までの方法（devise1つだったとき）

`````
private
def after_sign_in_path_for(resoure)
    root_path
end
````

###3.新しい実装方法（devise 2つ実装した場合）

````application_controller.rb
private
def after_sign_in_path_for(resource_or_scope)
    if resource_or_scope.is_a?(Admin)
        admins_orders_top_path
    else
        root_path
    end
end

def
after_sign_out_path_for(resource_or_scope)
    if resource_or_scope == :user
        root_path
    elsif resource_or_scope == :admin
        new_admin_session_path
    else
        root_path
    end
end

````

上記では２つ指定しています

1. サインイン後　

* Admin →　管理者ルートパスへ（Top）
* User → ルートパス（Top）

1.　サインアップ後

* Admin →　管理者ログインへ
* User → ルートパス（Top）
　


####投稿者コメント
PF作成で管理者とUser分けて実装していたのでこちらを記事にしました。早速チーム開発時の復習ができて記憶に定着できそうです。

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
【Laravel】Class (...) not foundの対処

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874156/f96022de-e4c3-5807-a5bf-d6130d77060a.png)

#結論
###自分で作成したモデルのnamespace宣言が誤っていた。

`php artisan make:model`コマンドでモデルを作成した場合は自動的に名前空間が登録されるようですが、
コマンドを使用せず自分でモデルを追加した場合、別途登録してあげる必要があるようです。

#発生したコード

```php
// App\Models\PasswordResetsという名前空間をインポートしているのに
use App\Models\PasswordResets;

class ResetPasswordController extends Controller
{
...
    public function showResetForm(Request $request, $token = null)
    {
        // PasswordResetsが見つからずにエラー発生
        $record = PasswordResets::where('email', $request->email)->first(); 

```

#解消

###1. namespaceの宣言を確認
PasswordResetクラスのほうを見てみるとnamespaceの宣言が誤っていました。ので修正。

```php
<?php

// 自分でModelsフォルダを作成してそこに格納しているので、namespace App\Models;と記述する必要がある...当たり前
namespace App;

use Illuminate\Database\Eloquent\Model;

class PasswordResets extends Model
{
...
```

###2. `composer dump-autoload`の実行
コマンドの実行によって独自に実装した名前空間も拾って、設定ファイルに保存してくれます。

```
> composer dump-autoload
```

###3. 名前空間に追加されたことを確認
`laravel/vendor/composer/autoload.classmap.php`に名前空間が追加されていればOKです。

```php
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
'App\\Models\\PasswordReset' => $baseDir . '/app/Models/PasswordReset.php',
```
フレッツ光でインターネット接続が不安定な時の対策

フレッツ光で、RS500-MI を使っていて、zoom などを使っている時に接続が不安定になるという状態でした。
>ルーターを再起動すると問題は解消しました。
>ルーターの交換をしましたが、問題は解決しませんでした。

そこで提案された解決策です。
>IPV4 と IPV6 の両方が有効になっているが、IPV4 だけにする。
>IPV4 と IPV6 の両方が有効な時は、PPP の LED がオレンジ
>IPV4 だけが有効な時は、PPP の LED がライム

設定の変更は、ブラウザーで、http://192.168.1.1 に接続し、ログインして行います。

>ログイン後、
>接続先設定（IPv6 PPPoE）を選びます。
>IPV6 セッションの　「切断・停止」をクリックします。

![ipv6_aug05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/54e72ae6-0a45-6702-0505-017be63a0909.png)

設定変更後、再起動ボタンを押して、再起動をかけます。

RS500-MI は、「ホームゲートウェイ + ルーター」というもので、ホームゲートウェイ付きのルーターは市販されていません。
AWS DataSync とは

## 勉強前イメージ

データの連携とかしてくれるサービス？

## 調査

### AWS DataSync とは

オンプレとAWS間、またAWSのサービス間でのデータの移動を簡単に自動で行うサービスになります。
転送中のデータに関しては暗号化されており、セキュリティ面でも安心です。

### AWS DataSync のメリット

- 転送の簡素化と自動化

オンプレのストレージとAWSのストレージ、AWSのストレージ間の転送が簡単になり、
転送プロセスとデータ転送に必要なインフラ、両方の管理を自動化します。

- データを安全に転送する

暗号化や整合性検証を行っており、それによってセキュリティを強化します
また、ネットワークの切断等で転送に失敗した場合でも自動的に転送を実施します。

- データをより速く移動する

専用のネットワークプロトコルとパラレル・マルチスレッドで転送を高速化します。

- 運用コストの削減

価格設定をきちんと設定するとスクリプトの開発とデプロイ、メンテナンスを節約できます。

### AWS DataSync の特徴

- s3以外のデータ移行がある

データ移行は基本的にはs3が使われることが多かったですが、
SMBとNFSもサポートされています。
AWSのサービスでも特定のサービスへ転送するサービスは存在します。(複数サービス使えるのもあります。)

`移行元 → 移行先` で記載しており、以下になります。
```
NFS → s3,NFS,SMB
SMB → s3,NFS,SMB
s3  → NFS,SMB
```

- 除外パターンの設定も可能

syncなどは設定で除外するファイルを設定することが出来ますが、
DataSyncも除外パターンを設定することが可能です。

### AWS DataSync のコンポーネント・用語

![12021-08-02 # AWS DataSync とは - diagrams.net - Google Chrome 2021-08-02 16.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/092f896f-bdbf-8555-ce5e-ebe73b118beb.png)

- エージェント

自己管理ストレージとのデータの読み書きに使用する仮想マシンになります。
同一アカウントのAWSストレージ間での転送を行う場合は不要です。

- ロケーション

送信元・送信先のストレージを指し、s3・EFS等のことです。

- タスク

送信元と送信先のロケーション、またデータ転送に関する設定から構成されます。
転送は送信元から送信先の方向で行われていて、設定にはスケジュールやネットワークの帯域制限が含まれます。

- タスク実行

実行されたタスクで、開始・終了時間やタスクの状態が書かれています。

## 勉強後イメージ

最初はs3とかあるやんって思ってたけど、
複数サービスとかオンプレ→AWSが対応してないから・・・


## 参考

- [AWS Black Belt Online Seminar AWS DataSync](https://d1.awsstatic.com/webinars/jp/pdf/services/20210316_AWSBlackBelt2021_AWS-DataSync-v1.pdf)
- [AWS DataSyncでデータ移行 ～他のサービスと何が違う？～](https://blog.serverworks.co.jp/tech/2020/02/14/lets-use-aws-data-sync/)
- [AWS DataSyncとは？オンラインデータ転送サービス](https://www.skyarch.net/column/aws-datasync/)
リード変換時の数式

[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)

設定があるようです。これが設定されていないと、数式がうごかないみたい。

+ [Make field mandatory when lead status = qualifying or prior to converting](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Br4ry)
+ [フローでのLeadの変換について](https://qiita.com/Keiji_otsubo/items/bc46dece08259b96ee95)
+ [【ヘルプ】リードの取引を開始する際に入力規則が動作しない](https://help.salesforce.com/s/articleView?id=000331020&type=1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a496de0c-0251-c774-06f7-052c44571c0c.png)


# Leadのコンバートに使う入力規制

色々式を試してやっとたどり着いた。

ポイントは AND条件に必ず　IsConvertedを入れること。
**他に条件があれば、ORで続ける。(これがポイント大切忘れるな)**

[Create Validation rule - Email, Phone, and Country are required on lead conversion.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BrWgmSAF)

IsConvertedを入れないと変換の時に働かない。


```
AND(
IsConverted,
OR(
OR(
 ISBLANK(TEXT(LeadSource)),
 ISBLANK(State)
 ),
NOT(OR(
 ISPICKVAL(Level_of_Interest__c, "4"),
 ISPICKVAL(Level_of_Interest__c, "5")
))
)
)
```

[How can I convert a Lead only if a 4 or 5 is selected from a Custom field?](https://trailblazers.salesforce.com/answers?id=9064S000000Dr8GQAS)

So if you want the rule to fire if the User attempts to convert the Lead AND all of the other three criteria exist, then it would look like this:

```
AND(
IsConverted,
ISBLANK(TEXT(Current_Software__c)),
TEXT(Status) = "Marketing Qualified Lead (MQL)",
NOT(ISBLANK(Original_Inbound_Owner__c))
)
```

[I want to create a validation rule so a lead will not convert to an opportunity if certain fields are left blank. I want it to only not convert but the lead page to still save before it is converted if these fields are blank. Is there a way to do this?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A8okzSAB)

# Apexからのコンバートでの問題

['Use Apex LeadConvert'を有効にする](https://help.salesforce.com/s/articleView?id=000334707&type=1)

リードを変換するときに検証ルールを適用する場合は、「変換されたリードの検証を要求する」を有効にする必要があります。


注： 「変換されたリードの検証が必要」が利用できない場合は、 Salesforceサポートに連絡して、 「 Apexリード変換の使用」権限のアクティブ化をリクエストしてください。

[リード変換ボタンでは、既存の連絡先やオプションに関連付けることができません](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Ddc6y)


# リードの年齢を求める式

[Lead Status / Qualified Age](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000DyEEASA3)

```
CONVERTED_DATECONVERTED_DATE-CREATED_DATE
```

# 取引先責任者レコードのリードフィールド履歴

リードとして始まったContactの履歴を知ることは常に役に立ちます。ただし、Salesforceのリードが変換されると、その履歴は失われます。
[連絡先レコードのリードフィールド履歴](https://www.redargyle.com/blog/lead-field-history-on-a-contact-record/)

[Joined report on lead and contact history](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G4j1ISAR)
[JS]イテレータ&ジェネレータはもう理解した？

# はじめに
まず、イテレーターとジェネレーターという言葉を耳にしたことはありますか？
自分はこの記事を書く数時間前に初めて知りました。。w
よく使うわけでは無いかもしれないですが、JavaScriptを理解する上で大事な概念だと思うので、この記事で概要や使い方を掴みましょう！

# イテレータとは
イテレータとは、シーケンスおよび潜在的には終了時の戻り値を定義するオブジェクトのことです。具体的に言えば、2つのプロパティを持つオブジェクトを返す`next()`メソッドを持つことによってイテレータープロトコルを実装するオブジェクトです。
イテレーターを反復することを、`消費する`と言います。(一般的に1回しか実行できないため)

- value
    - イテレータを実行した際に際に返ってくる値
- done
    - 処理が完了したかどうかの真偽値

## イテレータ使用例
10になるまでループする処理をしてみます。

```js
// イテレータを定義(初期値を設定することで無限ループを回避)
function genIterator(max = 10) {
  let i = 0;

  return {
    next: function() {
      if(i >= max) {
        return {
          done: true
        }
      } else {
        return {
          done: false,
          value: i++
        }
      }
    }
  }
}

// イテレータを変数itに格納
const it = genIterator(10);

// next()メソッドを呼び出して、返り値を格納
let a = it.next();

// next()でtrueが返るまでループ
while(!a.done) {
  console.log(a.value);
  a = it.next();
}
```

以下のように`for...of`を用いて短く記載することも可能です。(というかこの書き方の方が良い)
for...〇〇はいくつかあるので、混乱しないようにしましょう。

| 構文 | 内容 |
|:-:|:-:|
| for...of  | 渡した値のvalueを取得  |
| for...in  | 渡した値のindexを取得  |
| for...Each  | 渡した値を一つずつ取り出すメソッド  |

```js
function genIterator(max = 10) {
  ...
}

// 値がイテレータを返すオブジェクトを生成
const obj = {
  [Symbol.iterator]: genIterator.bind(null, 10)
}

// イテレータのnext()メソッドを実行して、trueが返るまでループする
for(const i of obj) {
  console.log(i);
}
```

# ジェネレータとは
イテレータを使いこなすとなると、複雑な部分が多く実装が少し難しいです。そこで、イテレータを簡単に実装する手段としてジェネレータを利用します。
ジェネレータ関数は、`function* 構文`を使用して記述されます。

## ジェネレータ使用例

```js
// ジェネレータを定義(初期値を設定することで無限ループを回避)
function* genIterator(max = 10) {
  let i = 0;

  while(i < max) {
    yield i++; // valueとdoneを返す
  }
  return;
}

// ジェネレータを変数itに格納
const it = genIterator(10);

// next()メソッドを呼び出して、返り値を格納
let a = it.next();

// next()でtrueが返るまでループ
while(!a.done) {
  console.log(a.value);
  a = it.next();
}
```

## yield*
`yield*`を用いると、渡した値を一つずつ取り出してくれます。
以下の例では、渡した配列の中身をnext()メソッドを呼び出すたびに取り出して返してくれます。

```js
function* genIterator(){
    yield* [1, 2, 3];
}

var it = genIterator();

console.log( it.next() ); // { value: 1, done: false }
console.log( it.next() ); // { value: 2, done: false }
console.log( it.next() ); // { value: 3, done: false }
console.log( it.next() ); // { value: undefined, done: true }
```

# 終わりに
最後になりますが、イテレータやジェネレータでは`next()`メソッドを呼び出すまでは関数が実行されることはないので注意が必要ですね。しかし、ループ処理を簡単に実装できるのは嬉しい限りですね！

# 参考
[イテレーターとジェネレーター]
(https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators)

[JavaScript の イテレータ を極める！]
(https://qiita.com/kura07/items/cf168a7ea20e8c2554c6#254-map-set-weakmap-weakset)

[JavaScript の ジェネレータ を極める！]
(https://qiita.com/kura07/items/d1a57ea64ef5c3de8528)
Atlassian Confluence 概要と、Notionとの比較

Confluence、どういう事ができるの？について。

https://www.atlassian.com/software/confluence

https://support.atlassian.com/confluence-cloud/resources/


## 動画

<iframe width="624" height="576" src="https://www.youtube.com/embed/WqKm6GJbZ6k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## Cloud Free plan 

10人まで、1サイト。

https://www.atlassian.com/software/confluence/pricing


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/613ae961-a00c-6d15-6906-72ad7dc6d04d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/177e6727-0994-c3f0-45c8-0b0df5c4efba.png)

### Markdownでも書ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/8e7afa09-6cd6-5549-b9d7-9f188bdbc5ae.png)

### Confluenceに移行
https://qiita.com/tomoyk/items/4020fda3535a10ecb2a6

### Confluenceから移行

https://ja.confluence.atlassian.com/doc/export-content-to-word-pdf-html-and-xml-139475.html

https://www.notion.so/confluence


## サーバー製品

サポート終了案内あり。

https://www.atlassian.com/ja/migration/journey-to-cloud

https://qiita.com/nh321/items/5c7ff470214fd371e5ee


## 比較: Notion

一方でConfluenceからNotionにした、の声も稀に見るのでメモ。日本語対応のニュースも。

https://www.itmedia.co.jp/news/articles/2110/13/news100.html

https://note.com/leaner/n/n8a2c0f9458b7

https://qiita.com/shushutochako/items/7b91f446f224aae23986

よく見ると両者、お互いによく比較されている...

https://www.atlassian.com/software/confluence/comparison/confluence-vs-notion


以上、参考になればさいわいです。
qiita の投稿からランダムで1記事選んで twitter に自動で投稿する

2~3 年前くらいに twitter を始めましたが、とくに呟くことがないので qiita の記事をテキトーに投稿する bot 化させることにしました。
手始めにまずは、qiita の投稿からランダム1件記事を取得して twitter に投稿するスクリプトを python で書いてみます。

## qiita から記事を取得
まずは qiita へ投稿した記事の中からランダムに 1 件取得するスクリプトです。投稿を取得する処理は以前に記事にしたことがあるので、そちらを参考にして作っていきます。
https://qiita.com/kiyo27/items/e444c257ce7026c4572b

```python:qiita.py
import urllib.request
import json
import os
import random

API = 'https://qiita.com/api/v2'

def send_request(url):
    req = urllib.request.Request(url)
    req.headers = {
        'Authorization': 'Bearer ' + os.environ['TOKEN']
    }
    with urllib.request.urlopen(req) as response:
        return json.loads(response.read().decode('utf-8'))

def get_article_ids(user, page=1, per_page=20):
    url = f'{API}/users/{user}/items?page={page}&per_page={per_page}'
    decode = send_request(url)
    ids = []
    for s in range(len(decode)):
        ids.append(decode[s]['id'])
    return ids

def get_article(id):
    url =  f'{API}/items/{id}'
    decode = send_request(url)
    return decode

def get_random_article(user):
    ids = get_article_ids(user)
    l = len(ids)
    i = random.randint(0, l - 1)
    article = get_article(ids[i])
    return article

if __name__ == "__main__":
    get_random_article()
```

ランダムに 1 件取得する処理ですが、全投稿の中からではなく今のところ ``per_page`` で記事数を限定した中で取得しているので、ここが今後の課題です。ひとまずはこれで進めます。

## tweepy インストール

python でツイートするために便利な sdk を利用します。[こちら](https://developer.twitter.com/en/docs/twitter-api/tools-and-libraries)のページで sdk とか tool が紹介されています。今回は [tweepy](https://docs.tweepy.org/en/latest/install.html)を使用してみます。

```terminal
pip install tweepy
```

## twitter に投稿

sdk をインストールしたら、qiita から取得した記事をツイートする処理を書いていきます。 Twitter API を使用するにあたっては、 ``consumer key`` や ``access token`` などが必要になってきます。各キーの取得は[Twitter Application Management](https://developer.twitter.com/en/portal/projects-and-apps)から行えます。

```python:tweet.py
import tweepy
import qiita
import os

consumer_key = os.environ['CONSUMER_KEY']
consumer_secret = os.environ['CONSUMER_SECRET']
access_token = os.environ['ACCESS_TOKEN']
access_token_secret = os.environ['ACCESS_TOKEN_SECRET']

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

user = 'kiyo27'
article = qiita.get_random_article(user)
message = article['title'] + "\n" + article['url']

api.update_status(message)
```

スクリプトが用意できたら、ターミナルから ``python tweet.py`` と入力してツイートできていれば完成です。
![tweet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/6f90713c-e678-5530-5e25-45b2ec733ef0.png)
vue-cliでどうやってbuildされるのか（1）

# vue-cliでどうやってbuildされるのか
# vue-cliとは？
vue-cliはwebpackを利用して設定などを出力してくれる雛形作成ツール
内部でcli-serviceというライブラリを使っている
→ これがwebpackをラップして使いやすくしてくれている

webpackは拡張仕事にプラグインに渡すことで「前処理」的なことをしてくれている
.vueファイルは、jsでそのまま読み込める形に変換する必要があり、それをvue-loaderというwebpackのプラグインがやってくれている
処理後のファイルは build.js で、.vueファイルはjsのオブジェクトに変換される
→ その後、webpackで他のjsライブラリとまとめて1つのファイルが作成される

なるほど、webpackについて理解する必要がありそう。。。

# webpackについて
## webpackの用途
- pug, haml, ejsのようなテンプレートエンジンのコンパイル
- sassなどのcssプリプロセッサのプリコンパイル
- TypeScriptのようなAltJsのトランスコンパイル
- Linterを用いたjsの構文チェック
- Angulaer,React,Vueのようなjsフレームワークの実行

## webpackとは？
JSの静的モジュールバンドラー
モジュールに分割され、別々になったJSファイルの依存関係を解決して、1つのファイルにまとめるツールの総称
モジュールバンドラーが登場したことによって、複数のjsファイルをまとめ htmlは1つのファイルを読み込むだけでよくなる

webpackはモジュールバンドラー

### webpackの4つの基本要素
- Entry
- Output
- Loader
- Plugins

#### Entry
JSをバンドルする上で、どのファイルを基準として依存関係を解決するかを指定
エントリーには複数ファイルを指定できる
エントリーポイントを指定するとwebpackはエントリーポイントで指定したファイルが依存する他のモジュールとライブラリを読み込んでくれる

#### Output
webpackがまとめたファイルを「どこ」に「どのような名前」で出力するかを指定します。

#### Loader
webpack自体はJSしか理解できない。Loaderを使用することで、JS以外のファイルをモジュールに変換して処理を行える。
設定ファイルには「ファイル名」と「適用する処理内容」を記述する

#### Plugins
ファイルを纏める以外のタスク（カスタムタスク）の実行ができる

#### 流れ
Entry → Loaders → Plugins → Output

### webpackと似た仕組み
Gulp
GRUNT
npm script
PARCEL
...etc

gulpはタスクランナー
web制作で自動化したい処理を定義し、自動的に実行するのが目的

## 続きは今度
webpackを軽く理解したところで、vue-cliの構成ファイルを見ていく
Python初心者を脱するために作ったプログラムをまとめてみた

僕はデータエンジニアをやっていて、日頃からデータを収集したり自動化したりしています。

エンジニアになりたての頃に勉強のために作ったプログラムをまとめました。各リンクはGitHubに飛びます。
動かなくなっているものもありますが、誰かの役に立てば幸いです。
<br>

- [メルカリから商品情報をスクレイピングするプログラム](https://github.com/nakatatsu711/scraping_mercari)
- [Google検索を自動化するプログラム](https://github.com/nakatatsu711/scraping_google)
- [Yahoo検索を自動化するプログラム](https://github.com/nakatatsu711/scraping_yahoo)
- [【改良版】Yahoo検索を自動化するプログラム](https://github.com/nakatatsu711/scraping_yahoo2)
- [クラウドソーシングサイト「ランサーズ」の検索案件を自動化するプログラム](https://github.com/nakatatsu711/Archive/tree/master/automate_lancers)
- [法律事務所の情報をスクレイピングするプログラム](https://github.com/nakatatsu711/Archive/tree/master/scraping_law_in_tokyo
)
- [PythonでGoogleスプレッドシートを操作するプログラム](https://github.com/nakatatsu711/Archive/tree/master/operate_googlespreadsheet)
- [Flaskで作る小規模なWebアプリ](https://github.com/nakatatsu711/html_with_flask)
- [Flaskで作るドラマレビューサイト](https://github.com/nakatatsu711/drama_reviewsite)
- [Scrapyでニュースサイトをスクレイピングするプログラム](https://github.com/nakatatsu711/scraping_news_with_scrapy)
- [ヤフオク出品ツール](https://github.com/nakatatsu711/Archive/tree/master/yahooauc_selling_tool)
- [Amazon、ヤフオクからスクレイピングしてスプレッドシートに出力するプログラム](https://github.com/nakatatsu711/Archive/tree/master/scraping_amazon_and_yahooauc)
- [EcoRing the Auction、メルカリからスクレイピングするプログラム](https://github.com/nakatatsu711/Archive/tree/master/scraping_ecoauc_and_mercari)
GitHubで管理しているUnityプロジェクトへのシーンの変更を含むPull Request

# はじめに

https://qiita.com/YoshitakaAtarashi/items/5f7543808a5d9935c8fe

こんな感じでGitHubを使っている場合のお話です。主に自分が開発しているプロジェクトに対して修正依頼が来た場合にどのように対処しているかについて説明します。

# UnityのPull Requestの課題：　Sceneの変更

下記は少し古いですが、Unityを複数人で開発する場合の課題がまとまっています。

https://tsubakit1.hateblo.jp/entry/20140613/1402670011

最近はUnityもかなり安定化し、Pull Request自体を処理できないとか、コンフリクトが解消できない、というようなことはあまり起こらないように思います。しかし、Sceneの変更を伴うPull Requestが来ると緊張します。なぜなら、どこを変更したのかが差分を見てもわからないからです。下図はオブジェクトを6つ追加した例でのPull Requestの一部ですが、Sceneに998行の変更が発生しており、これを見て問題ないと判断できる気はしません。

修正依頼者に悪気はなくても、実験的にいじったり、うっかり変更してしまったパラメータがPull Requestに紛れ込んでても受け入れ側は気が付かず、これを安易に受け入れてしまった後に挙動が変になってもなかなか原因がわからなくて大変な思いをすることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1804036/954bef0c-b20b-3c68-3f3a-bdbd6af489ae.png)


## 対処法1. Pull Requestを出さず、Prefabファイルを提供してもらう。

変更箇所を一つのGame Objectの下に集めて、これをPrefab化し、Prefabをエクスポートしてファイルを提供してもらえると、Sceneへの変更は自分で管理できるので安心です。

## 対処法2. Sceneの変更が発生していないPull Requestを出してもらう。

Prefabを作るところは同じです。Sceneへの変更をDiscardして、Prefab関連の修正だけをコミットして、Pull Requestを出してもらえると、受け手の手間が少なくなるのでうれしいです。

## 対処法3. Sceneの変更が発生しているPull Requestを出された場合に、受け手が頑張る。

一旦受け入れます。変更箇所を教えてもらい、Game Objectの下に集めてPrefab化し...は対処法1と同じ。エクスポート後にPull RequestをRevertしてPrefabをインポートして対応すればよいです。

## 対処法4. 数値変更レベルの修正であれば、Excelとかで変更指示書を作ってもらう。

配置しているコンポーネントの座標を変えたいとか、角度を変えたい、というような場合は、数次第ではありますが、ローテクで対応する方が安全な場合も多いです。

# 最後に

以上、どの方法でも良いのですが、とにかくSceneへの変更を受け入れてしまうと地獄を見るので、そこだけは責任者一人がしっかり管理するようにしておくべきだと思います。もっとうまいやり方があればぜひ教えてください。
電話番号チェックに NumberUtils#isNumber() を使ってはいけない

> Non-hexadecimal strings beginning with a leading zero are treated as octal values. Thus the string 09 will return false, since 9 is not a valid octal value. However, numbers beginning with 0. are treated as decimal.
> https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html

頭にゼロが付いていて16進数でない文字列は8進数として扱われます。
よって9は有効な8進数ではないため、文字列 "09" はfalseを返します。
ただし、（頭ゼロの次が）0で始まる文字列の場合は10進数として扱います。

つまり、電話番号の数値チェックで `NumberUtils#isNumber()` を使うと "090" や "080" が数値ではないと判定されてしまいます。
この場合、 `NumberUtils#isDigits()` を使うのが正解です。

結合テスト以降の工程で意味不明なバグとして顕在化するので、マジで勘弁してください。

なお、 `NumberUtils#isNumber()` はDeprecatedなので注意。
Deprecatedになった理由は知りませんが、やはり間違えやすいからではないですかね。
OpenCVでcv2.imshowのエラー

今まで問題なく使えていたOpenCVの仮想環境で下のエラーが発生

```
The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
```

# 解決方法
一度アンインストールして再度インストール

```console
$ conda uninstall opencv
$ conda install opencv
```

conda uninstall opencvのコマンドだけだとアンインストールしきれないパッケージもあったので、conda listで確認して個別にアンインストールが必要になるかも。
※古いバージョンのパッケージが残っているとそっちにバージョンが引っ張られたりする。
EC2でパケットモニタ

EC2インスタンスのパケットをモニタします。

下記を参考に設定すればできます。
https://aws-saas-privatelink.workshop.aws/13_mirroring.html

じゃあ、なんでこの記事を残すのかというと、
パケットをモニタリングするEC2インスタンスにセキュリティグループを設定するとしてどうするか、ということです。
UDPの4789番ポートをインバウンドで許可しましょう。

> UDPかよ。。。