OmniAICreator/Qiita-1.07M huggingface dataset:
ネットワーク系で使いそうなコマンドを列挙

ネットワークで使用しがちなコマンドを列挙してみました。間違っている部分あれば指摘お願いします。

#ss
今いる場所のソケットの状態を見る(どんな状態で接続待ちをしているのか)
Ss -tlを使うことが多い
Dockerのコンテナ内で使って今このコンテナはどんなipとportで受け付けているのかわかる
参考：[【 ss 】コマンド――ネットワークのソケットの情報を出力する](https://www.atmarkit.co.jp/ait/articles/1710/06/news014.html)

#ifconfigやip add
今発動しているipアドレスを確認する

#iptable
Firewallの設定などでどこからどこに繋ぐ接続が許可されているのかわかる
ホストosでdockerなどを立てた時に、確認のためホストos内で使用したりする
参考：[iptableに関して](https://qiita.com/dtanimoto00/items/1d0a9b02867add646ea5)、[dockerでのiptableの使い方](https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46)


#lsof -i:ポート番号
そのportがどんな内容に使用されているか確認するコマンド
このポートできた時に、このプロセスを発動することになる
参考：[Linuxでプロセスが何のポート使っているかを調べる](https://qiita.com/sonoshou/items/cc2b740147ba1b8da1f3)


#ping
指定したホストが動いているか確認する
標準のpingではport指定ができないため。npingを使用する


#その他・補足
###vagrantの上にdockerを立てる方法
[Vagrantを使う「Mac最速のDocker環境」を初心者向けに解説【遅いMac for Dockerを卒業】](https://qiita.com/necocoa/items/bd62ed3dba14b17552f2)

###Vagrantのネットワーク
Vagrantのポートフォワーディングしている場合
localhostである127.0.0.1で繋いでも良いし、vagrantfileで設定したprivateアドレスを使って192.168.33.11しても良い。[こちら](https://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11])のポートフォワーディングが参考になりました。


###0.0.0.0というIPアドレスとは
どのipでもあるという意味になり、どこからでも繋がる?
Osでlocalhostに変換している場合もある
参考：[0.0.0.0にはアクセスしないこと](https://qiita.com/amuyikam/items/0063df223aed40193ba9)

Dockerでは0.0.0.0でhostを設定することが多い?
参考：[docker上のアプリにlocalhostでアクセスしたらERR_EMPTY_RESPONSEが出る](https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46)
時系列分析2　定常性、ARMA・ARIMAモデル

[Aidemy](https://aidemy.net/)　2020/10/29
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、時系列分析の2つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・定常性について
・ARMA・ARIMAモデルについて

#定常性
##定常性とは
・時系列データにおいて、__「時間経過に依らず常に一定の値を軸に、同程度の幅で揺れて変化する」__ものを__定常性がある__と表現する。
・定常性があるかどうかは、データを一回__可視化__し、上記特徴を有しているかを目視で確認する必要がある。
・時系列分析においては、定常性のない時系列をそのまま扱うと無意味な相関（__擬似相関__）を検出してしまう恐れがあるため、__定常性のある時系列に変換する必要がある__。

##弱定常性/強定常性
・__弱定常性__とは、時系列データの__期待値と自己共分散が常に一定である__ことを指す。
・期待値が一定であることから「常に一定の値が軸に」なっているといえ、自己共分散が一定である事から「同程度の幅で揺れて変化する」と言えるので、定常性がある状態だと言える。

##ホワイトノイズ
・__ホワイトノイズ__とは、__全ての時点で期待値が0で、分散が一定で、共分散が0である__こと（弱定常性）を表す。
・時系列モデルのパターンのうち、__不規則変動（誤差）__は数学的に表すのが難しいため、ホワイトノイズを用いて対応することになっている。

#ARMA/ARIMA/SARIMAモデル
##ARMA/ARIMA/SARIMAモデルについて
・__ARMA(アーマ)/ARIMA(アリマ)モデル__は時系列分析を行う際に使われるモデルである。
・この二種類の発展型に__SARIMA(サリマ)__と言うモデルも存在し、最終的にはSARIMAモデルで時系列分析を行う。
・ARMA/ARIMAモデルは__「AR」「MA」__と言うモデルが組み合わされたモデルである。次項以降で詳しく説明する。
＊これらのモデルを実際に構築するのは「時系列分析4」になるので、そちらを参照のこと。

##ARモデル
・ARモデルでは、__ある時点kの時系列データ「yk」を、その一つ前の時点のデータ「yk-1」を使って表す__ことで自己相関が作られる。
・このように過去の値から回帰的にデータの値を推定するので、ARモデルは__「自己回帰モデル」__とも言われる。またこの時、過去のp個のデータを使って次のデータを予測する時,__AR(p)__と表す。

##MAモデル
・MAモデルでは、__ある時点kの時系列データのうちホワイトノイズ「εk」をひとつ前のホワイトノイズ「εk-1」を使って表す__ことで自己相関が作られる。
・ホワイトノイズは不規則変動（誤差）を示すので、MAモデルは__過去の誤差に影響されるモデルである__と言える。またこの時、過去のq個の誤差を使って次のデータを予測する時、__MA(q)__と表す。

##ARMAモデル
・先述の通り、ARMAモデルはARモデルとMAモデルを組み合わせてできたモデルである。
・AR(p)とMA(q)を組み合わせたときは__ARMA(p,q)__と表現される。

##ARIMAモデル
・ARIMAモデルとは、「原系列で渡されたデータを階差系列に変換するARMAモデル」のことである。
・原系列が渡されるARMAモデルは定常性のあるデータや過程でしか扱うことができないが、階差系列に変換するARIMAモデルでは定常性のないデータや過程も扱うことができる。

・モデルがARMA(p,q)で、変換するときの階差がd（差分を取るのがd時点前）であるときは__ARIMA(p,d,q)__と表す。
・このときの「p」を__自己相関度__、「d」を__誘導__、「q」を__移動平均__と言う。

#まとめ
・定常性のうち弱定常性は、時系列データの__期待値と自己共分散が常に一定である__ことを指す。
・__ホワイトノイズ__とは、__全ての時点で期待値が0で、分散が一定で、共分散が0である__ことを表す。
・時系列分析を行う際に使われるモデルとして、ARMAモデルとARIMAモデルがある。これらのモデルはARモデルとMAモデルが組み合わされてできたものであり、ARIMAモデルの方ではデータが階差系列に変換されるので、定常性のないデータも扱うことができる。

今回は以上です。最後まで読んでいただき、ありがとうございました。
UnityにてVSCodeの場合に、UniRx・UniTaskの補完が効かない時の対処

UnityでVSCodeを使ってる場合に、UniTaskとUniRxの補完が効かず、半日ぐらいハマって補完が効くようにできたので参考になったページなど。

◇ monoをアンインストールしてインストールすると補完できるようになる
https://unity-yuji.xyz/editor-visual-studio-code-complement/

◇ VSCodeのSettingsで「Omnisharp: Use Global Mono」という項目を「always」
https://unity-yuji.xyz/vscode-unity-omnisharp-netframework-mono/

◇ Visual Studio Code Editor を最新版にUpdate
https://unity-yuji.xyz/unity2019-2-later-vscode-visual-studio-code-dont-open/

◇ プロジェクトファイル、*.csprojが壊れてる時には生成し直す。（今回は関係なかった）
https://qiita.com/honmaaax/items/da39d7b854c39c3ea110


◇
あと、私の場合は、UniRxとUniTaskがパッケージとプラグインの両方に入っていたので、Pluginの方を消してからPackagesの方を再インストールしました。
(Unityのフォルダ)/asset/Plugins ← ここのUniRx、UniTaskを消した。
(Unityのフォルダ)/Packages ← ここのUniRx、UniTaskを再インストール。

（実行環境用に、Buildした時に動くもののエラーが出てたので気がついた。）

◇
環境はUnity 2020.1.9f1でMacにて
「ruby」２重ハッシュの取り出し　※復習

```ruby.rb

user_data = [
  {
   
 user: {
        profile: {
            name: 'takeshi'
        }
    }
  },
  {
    user: {
        profile: {
          name: 'tanaka'
        }
    }
  },
  {
    user: {
        profile: {
            name: 'tosiki'
        }
    }
  }
]


```




#*内容*
上記のコードには配列の中に個別のデータが二重ハッシュで存在します。
__**ユーザー名だけを全て順番にしたい！！！**__

#*実装*
###1.

```ruby.rb

#eachメソッド
使用しないパターン

puts user_date[0]["user"]["profile"]["name"]
puts user_date[1]["user"]["profile"]["name"]
puts user_date[2]["user"]["profile"]["name"]
```

###2.

```ruby.rb
#eachメソッド使用パターン

user_date.each do |date|
  puts date [:user][:profile][:name]
end
```
#####*!重要*
ハッシュが複数重なっている時はハッシュの1番最初の”キー”から順に連続で表示したいキーまで指定していくことでnameキーのバリューを表示できる。





#**結果**
__見事に名前だけ出力することができました！！__
1. eachメソッドを使用しない場合は１つずつ添字を指定しキーを連続で記述した
2. eachメソッドを使用し簡潔にキーを連続で指定することができた

 ```
???????????@MacBook-Pro ruby % ruby posi.rb
takeshi
tanaka
tosiki
```
#**考察**
1番上のコードの記載方法だと見にくく感じるは初心者だからなのかもしれないが、下記の様なコードの記述方法に変換して見た、、、

```
user_date = [
  { user: { profile:  { name: "takeshi" }}},
  { user: { profile:  { name: "tanaka" }}},
  { user: { profile:  { name: "tosiki" }}}
]
```
ブロックの中央よせのしかた・HTML・CSS

#はじめに
今回は、HTMLとCSSについてです。
毎回検索しているので、忘備録として、、、

#ブロックの中央よせ（左右）

```index.html
<div class="parent">parent
　　　　<div class="child">child</div>
</div>
```

```main.css
.parent{
      height: 200px;
      width: 200px;
      background: blue;
    }

    .child{
      height: 100px;
      width: 100px;
      background: red;
      margin: 0 auto;
    }
```
#ブロックの中央よせ（上下・左右）

```index.html
<div class="parent">parent
       <div class="child">child</div>
     </div>
```

```main.css
.parent {
        position: relative;
        width: 200px;
        height: 200px;
        background-color: blue;
      }

      .child {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 100px;
        height: 100px;
        text-align: center;  /*以下2行で文字を中央よせにする*/
        line-height: 100px;
        background-color:red;
      }
```
npm-scripts の 順次・並列実行（npm-run-all）

# npm-run-all

> 公式 [npm-run-all](https://www.npmjs.com/package/npm-run-all)

npm-run-all は複数の npm-scripts を実行できるコマンドラインツールです。
オプションをつけることで引数の npm-scripts の順次実行 または 並列実行することができます。

# 実行コマンド

- 順次実行
  - `npm-run-all --serial <task>` = `npm-run-all -s <task>` = `run-s <task>`
- 並列実行
  - `npm-run-all --parallel <task>` = `npm-run-all -p <task>` = `run-p <task>`

# 実際にやってみた

## npm-scripts の準備

```shell
# 以下のような hello:foo と hello:bar という npm-scripts を追加
# （ちなみに && は左の処理が成功したら右の処理を実行するというもの）
$ vi package.json
{
  (省略)
  "scripts": {
+   "hello:foo": "sleep 1 && echo FOO",
+   "hello:bar": "sleep 1 && echo BAR"
  },
  (省略)
}

# 1秒後に "FOO" を echo する
$ npm run -s hello:foo
FOO

# 1秒後に "BAR" を echo する
$ npm run -s hello:bar
BAR
```

## npm-run-all のインストール

```shell
# npm-run-all のパッケージをインストール
$ npm install --save-dev npm-run-all
```

## 実行

```shell

# hello:foo と hello:bar を順次実行する hello-s と hello:foo と hello:bar を並列実行する hello-p を登録
$ vi package.json
{
  (省略)
  "devDependencies": {
    "npm-run-all": "^4.1.5"
  },
  "scripts": {
    "hello:foo": "sleep 1 && echo FOO",
    "hello:bar": "sleep 1 && echo BAR",
+   "hello-s": "run-s hello:foo hello:bar",
+   "hello-p": "run-p hello:foo hello:bar"
  },
  (省略)
}

# FOO が echo されて 1秒後に BAR が echo される（順次実行）
$ npm run -s hello-s
FOO
BAR

# FOO と BAR がほぼ同時に echo される（並列実行）
$ npm run -s hello-p
BAR
FOO
```

# ハマったこと

## npm-run-all は scripts に登録したことしか実行できない

なのでこういうことはできません。

```json:package.json
{
  (省略)
  "scripts": {
    "hoge": "npm-run-all -s 'sleep 1'"
  },
  (省略)
}
```

以下のように怒られます。

```
$ npm run hoge

> vpass_api_spec_document@1.0.0 hoge /Users/sugurutakahashi/git/vpass_api_spec_document
> npm-run-all -s 'sleep 1'

ERROR: Task not found: "sleep"
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! vpass_api_spec_document@1.0.0 hoge: `npm-run-all -s 'sleep 1'`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the vpass_api_spec_document@1.0.0 hoge script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/sugurutakahashi/.npm/_logs/2020-11-03T16_29_57_468Z-debug.log
```
これは sleep コマンドが npm でインストールされたコマンドではないから、というわけでもなく、scripts にないコマンドは実行できないみたいです。

あくまでも npm-run-all は scripts の実行順のコントロール専用ということでしょうね。

scripts にワンライナーで一気に登録するより、細かく scripts にコマンドを登録して、それを npm-run-all でコントロールするという使い方が適切なようです。
npm-scripts の pre, post プレフィックス



npm-scripts には、`pre` または `post` プレフィックスをつけることで、その npm-scripts の前後に実行される処理を記述することができます。

- **pre**xxxx
  - npm-scripts の `xxxx` の**前**に実行される
  - ex) `prestart` は`start` の**前**に実行される
- **post**xxxx
  - npm-scripts の `xxxx` の**後**に実行される
  - ex) `prestart` は `start` の**後**に実行される

```
# cowsay 実行前に実行する precowsay、cowsay 実行後に実行する postcowsay を追加（内容はechoされる簡単なもの）
$ vi package.json
{
  (省略)
  "dependencies": {
    "cowsay": "^1.4.0"
  },
  "scripts": {
    "cowsay": "cowsay",
+   "precowsay": "echo 'pre cowsay'",
+   "postcowsay": "echo 'post cowsay'"
  },
  (省略)
}

# npm-scripts の cowsay コマンド実行によって package.json の npm-scripts の precowsay と postcowsay が実行されることの確認
$ npm run -s cowsay -- "hoge"
pre cowsay
 ______
< hoge >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
post cowsay
```
長文を早く理解する為に銀座で文章を要約する（GiNZA ver4）

# 1.長文を早く読む技術
菅内閣初の第14回経済諮問会議。

サントリーの新浪さんの発言が日本の危機感を簡単に表現していて、中々面白かった内容で是非興味の有る方は読んでいただきたい。
[議事要旨はこちら](https://www5.cao.go.jp/keizai-shimon/kaigi/minutes/2020/index.html#tab1006)


しかし...この議事要旨、要旨っていう割には2万文字もある。
400文字詰作文要旨で50枚。ゲッ...こんなん毎回読むの面倒だな、と思う方も多いはず。

じゃあニュースを見ようと思っても、自分が知りたい部分が端折られているケースであったり、そもそも自分より知識が低い記者の幼稚な記事に出会ったりと、こちらも徒労に終わることも多い。

やっぱり原文の議事要旨を、早く読む方が良いわけだ。400文字詰作文要旨で50枚。

うーん...

# 2.銀座が力を貸してくれる
そこで、最近NLPの界隈で話題になっている銀座もとい「GiNZA」を使ってみる。
~~銀座のカフェで集中した、という話ではございません。GINZA SIXでもないです。~~

GiNZAは日本語対応番spaCyと考えると理解が早い
[spaCy 入門](https://note.com/npaka/n/nc608b9392300)
GiNZAはさすがに銀座だけあって出来ることが幅広い。
その中でも、私の悩みを早速解決してくれる機能が「文章要約」。

# 3.文章要約機能を使う。
 大体はサンプルを用いたけど、要約された文章の「重要度」がアウトプットとしてなければ評価も比較もできず納得感が無いことから、採点のアウトプット部分だけロジックを追加している。
[サンプルのgoogle colab](https://colab.research.google.com/drive/1b50Jp2eO6P080vZLz84fR-9UBnuA64hg?usp=sharing)
実行する時はコピーして自分のgoogle driveに持ってきて実行するのが吉。

# 4.結果
菅内閣初の第14回経済諮問会議。
385文章中スコア上位の文章をピックアップ。
結局第14回経済諮問会議は**「人材」**を題材とした会議で有ることが伺える。

また、**「地方の活性化」「官民一体」「使いやすい制度設計」**もキーワード。

```xml:rank.xml
0.645,こういうことによって大きな地域の活性化ができる。

0.556,そのためには実際に人がある程度は動かないといけないので、そこをしっかり考えつつ、やはり地域の活性化を目指していくということが重要だと思うし、そのためには、ペーパーでいろいろ書いてある個別具体的な課題に関して、しっかり対応して一気に全体が取り組んでいくということが令和2年第 14 回経済財政諮問会議的な成果につながっていって成長戦略になるのだと思う。

0.632,やはりこういう今まで議論されてきたことを、しっかりここで実行していくということが大事かと思っている。

0.612,こういう形のことをしっかりやっていく、そういう意味での誰もが便利さを実感できるためのデジタル活用というのを官民一体で考えていく必要があると思う。

0.587,それから、もう一つは、外国人人材の活用の問題で、これはやはりコーポレートガバナンス改革としてしっかりやっていくということが重要だと思う。

0.554,そうであれば、日本で本当に活躍してくれる人材というのを作り上げていくということはこれからもっと考えて良いことだと思う。

0.636,という話を聞き、非常に単純なことなのだが、制度はあります、ルールはありますと言っただけでは来てくれないので、やはりワンストップで便利なものをしっかり作っていくということが重要ではないかと思う。

0.682,そこでいろいろ人の大きな流れを作っていくということが非常に重要なことかと思う。

0.725,人材について。

0.667,例えばこういう政策をするなら、週末、その人はこの地方にいるというデータが必要になる。

0.578,新たな成長という新たなという意味は、前と全く違うということを言っているわけではなく、西村大臣資料の3ページ、あるいは我々の資料の14ページのように、項目として挙がってくることは、以前から挙げられたことをしっかりやるということだとは思う。

0.576,遅れが目立つので、しっかりやるために色々な施策を打っていかなければいけないし、そうした環境の中での働き方を考えると、2020年版の経営労働政策特別委員会報告、これは我々の春闘に向けたドキュメントだが、ここで述べたエンゲージメント等、働き方改革自体が長時間労働の制約だけではなく、やったことの意味を感じられるように働きがいになっていかなければいけない、そうしないと生産性に結びつかないので、そういうところを徹底して議論をして改革に結びつけなければいけないし、改めて、単にテレワークをやったから地方と都市と2か所に住めるというだけではなく、地方に住む意味というのは若い人が地方で活躍していくという話に持ってこなければいけない。

0.571,また、人材の質の向上という点で、先ほど新浪議員からあった中小企業支援法に基づく中小企業診断士の試験の活用、在り方というものも考えてみる必要があるかと思う。 
```
 

私も要旨を全部読んでいるわけじゃないけど、
だいたいの議事の流れを知ることができて便利な要約機能。

これを記事にすることができれば、尚良し。
AndroidStudioでエディタの縦線を消す

エディタに表示される縦線(下記画像のオレンジ矢印参照)を非表示にする方法です。
毎回忘れてググっているので備忘録に
![スクリーンショット 2020-10-18 16.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311273/3a1f4b33-f880-b3f4-aedb-3c0b67abe7c8.png)


1. Preferences
2. Editor
3. General
4. Appearance
5. Show hard wrap and visual guidesのチェックをはずす
![スクリーンショット 2020-10-18 16.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311273/ddad0056-15c2-3b2b-4a5c-348ea306805d.png)
[Scala] Future[Option[T]]をZIOで合成

## 動機

昨日の[ScalaMatsuri](https://scalamatsuri.org/ja)で、モナド・モナドトランスフォーマーの話が出てきて、そー言えば業務でZIO使ってるけど、なんとなく使ってるなあああと思ったので、よくある問題（自分がよく直面する問題）をZIOを使って解決してみた。

## 問題
以下の定義があるとき、`getIds`と`getUser`メソッドを組み合わせた関数の戻り型を、`Future[Option[User]]`として返したい。
scalazでいう、OptionT的なことをしたい。（scalaz使ったことないけど。。。）

```scala
case class User(name: String)
implicit val ec = ExecutionContext.global

def getIds: Future[Option[String]] = Future(Some("uuid"))
def getUser(id: String): Future[Option[User]] = Future(Some(User("jon")))
```

## 力技でやってみる

`flatMap`, `map`でいけるか？

```scala
val result1: Future[Option[Future[Option[User]]]] = getIds.map(maybeId => maybeId.map(id => getUser(id)))
```

上の糖衣構文

```scala
val result2 = for {
  maybeId <- getIds
} yield {
  for {
    id <- maybeId
  } yield {
    getUser(id)
  }
}
```
流石にflatMapとmapだけじゃ無理や。。。
下のようにパターンマッチングを利用するしか。

```scala

val result3: Future[Option[User]] = getIds.flatMap {
  case None => Future(None)
  case Some(id) =>
    getUser(id).map {
      case None       => None
      case Some(user) => Some(user)
    }
}
```

一応できたけど、連結したいメソッドが増えれば増えるだけネストが深くなってしまう。
さらに、Future(None)みたいな書き方もなんかなあ。


## ZIOでやってみる

そこで、ZIOのmonad transformerを使って、Future[Option[T]]を合成していく。

```scala
val result4: ZIO[Any, Throwable, Option[User]] = {
  ZIO.fromFuture{implicit ec => getIds}.flatMap((maybeId: Option[String]) =>
    ZIO.fromOption(maybeId).mapError(_ => new Exception).flatMap(id =>
      ZIO.fromFuture{implicit ec => getUser(id)}
    ))
}
```
fromFuture, fromOptionを使うことで、Future, Optionをいい感じに合成できるようだ。
ちょっと読みにくいので、for式で書いてみる。

```scala
val result5: ZIO[Any, Throwable, Option[User]] = for {
  maybeId <- ZIO.fromFuture{ implicit ec => getIds}
  id <- ZIO.fromOption(maybeId).mapError(_ => new Exception)
  user <- ZIO.fromFuture{implicit ec => getUser(id)}
} yield {
  user
}
```

お、だいぶ綺麗になった。
さらに以下のように書ける。

```scala
val result6: ZIO[Any, Throwable, Option[User]] = (for {
  // ZIO.fromFuture{ implicit ec => getIds}: ZIO[Any, Throwable, Option[String]]
  // .someとすると、ZIO[R, Option[E], B]が返る
  // Option[String]がNoneの場合は、ZIO.failが返り、処理が途中で終わる
  // someメソッドの中身に詳細書いてる
  id <- ZIO.fromFuture{ implicit ec => getIds}.some
  user <- ZIO.fromFuture{implicit ec => getUser(id)}.some
} yield {
  user
}).optional
```

## まとめ
scala初めて一年くらいだが、最近やっと関数型の良さを理解し始めた気がする。（遅い）
scalaz, catsとかも使ってみよう。

## 参考
- https://loicdescotte.github.io/posts/scala-compose-option-future/
- https://zio.dev/docs/overview/overview_creating_effects
- https://stackoverflow.com/questions/61045887/composing-multiple-futures-and-option-in-scala-with-zio
日付と時刻を指定の書式で取得する

<h2>前書き</h2>
データを扱う際やログを取得する際に日付と時刻が必要になる機会は多いのですが、datetimeから欲しい書式のテキストを取得するためのメモ。

<h2>環境</h2>
Windows10 18363.1139
Python 3.9.0
Visual Studio Code 1.5.0

<h2>参考</h2>
[datetime — Basic date and time types](https://docs.python.org/3/library/datetime.html)

<h2>サンプルコード</h2>
```python:sample.py
from datetime import datetime

timestamp = datetime.now().strftime('%Y年%m月%d日%H時%M分%S秒')
print(timestamp)
```

<h2>結果</h2>
```
2020年10月18日15時45分50秒
```

<h2>補足</h2>
サンプル以外の使えるディレクティブは参考先ページの`strftime() and strptime() Behavior`を参考にする。
MySQLでもできる！ 全文検索のやり方と条件検索！

# はじめに
MySQLで、全文検索ができるって知ってましたか？
今回はMySQLでの全文検索のやり方について簡単に紹介していきます！！

[【YouTube動画】 MySQL 全文検索 高度な検索のやり方](https://youtu.be/1gjqB8QrGPk)
[![MySQL 全文検索 高度な検索のやり方](https://img.youtube.com/vi/1gjqB8QrGPk/0.jpg)](https://www.youtube.com/watch?v=1gjqB8QrGPk)

# MySQLの全文検索
全文検索とは、複数の文章群から特定の文字列を検索することです。
全文検索として、grep型とindex型があります。

grep型は実行時に中身を走査する方式で、検索対象が大きくなると、速度が低下します。
MySQLでいうとLINKE句を使って、文字列を検索することに相当します。

index型はDB登録時にIndexを作成する方式で、メモリ消費が多い代わりに、高速に検索できます。
MySQLで使用する場合は、MATCH句やAGAINST句を使って、検索します。

# 全文検索の実行方法
以下のようにして、全文検索用のインデックスを作成できます。

```sql
CREATE FULLTEXT INDEX idx on articles(body);
```

実行するときは、MATCHで検索対象のカラムを決め、AGAINSTで条件を決めます。

```sql
SELECT id, title, body FROM articles WHERE MATCH(body) AGAINST ('TEST HOGE')
```

# 検索モード
AGAINST内で検索モードを指定することができます。
デフォルトでは、Natural Language Modeになります。

- Natural Language Mode

デフォルトで適用されるモードで、OR検索のみを実行します。
ただ、完全一致ではないため、以下のような文字もヒットします。

```
「ありがとう」で検索 -> 「ありがとう」だけでなく、「あり」も検索される
```

- Boolean Mode

AND, NOT, グルーピングなど高度な検索が可能になります。
実行時は以下のように指定します。

```sql
SELECT id, title, body FROM articles WHERE MATCH(body) AGAINST ('TEST +HOGE' IN BOOLEAN MODE)
```

- Natural Language Mode with Query Expansion

1度 Natural Language Modeと同じように検索します。
1度目の結果で、該当する文字周辺にあった文字も記録します。
そして、周辺にあった文字も含めて検索し直すことで、関連語を表示したり、スペルミスを修正することができます。
ただ曖昧検索ができる反面、2度実行するので、結果表示が遅くなります。

# 演算子について (Boolean Mode)
Boolean Modeで使用できる演算子について詳しくみていきます。

何も演算子を付けない場合、OR検索になります。

```sql
AGAINST ('TEST HOGE' IN BOOLEAN MODE)
```

+を付けると、AND検索ができるようになります。

```sql
AGAINST ('+TEST +HOGE' IN BOOLEAN MODE)
```

NOT検索は-ででき、グルーピングは()で括ります。

```sql
AGAINST ('(TEST HOGE) -TE' IN BOOLEAN MODE)
```

完全一致をするには、""で括る必要があります。

```sql
AGAINST ('"HOGE"' IN BOOLEAN MODE)
```


# まとめ
今回はMySQLの全文検索について紹介しました。
使い所は悩みますが、意外と簡単にできます！

MySQL編は一旦ここで終わりですが、他に何か紹介して欲しいことがあれば、ご連絡お願いします！

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
OCI PL/SQL SDKを使用する準備と実行サンプル

# はじめに
2020年10月より、Oracle Cloud InfrastructureのSDK提供言語にPL/SQLが追加されました。本記事作成(2020年10月18日)時点では、[英語ドキュメント](https://docs.cloud.oracle.com/en-us/iaas/pl-sql-sdk/index.html)のみの提供となっています。
本記事作成時点では、本SDKの提供対象はAutonomous Databaseのみとなっています。一方、Autonomous Databaseのサービスさえあれば、特段他の有償サービス利用せずとも、更にFree Tierであっても、PL/SQL SDKを使用してOracle Cloud関連の情報を取得してデータベースに格納することが可能です。さらにAPEXで閲覧や分析を行ったり、独自管理画面を作成することも可能になっています。他の言語に比べるとまだAPIが揃ってはいないようですが、現時点でも色々試せそうです。
本記事では、PL/SQL SDKを使用するために必要な事前設定の手順と、サンプルアプリケーションの実行について解説します。

# 事前準備
SDK自体のインストールはすでに行われているので、他の言語よりは簡単に使い始めることが可能です。
ただし、他の言語やoci-cliの利用の経験がない方は、以下を参照して、可能であればoci-cliのセットアップを実施すると、事前準備に必要な情報も揃うのでお勧めです。
事前準備の際に具体的に何を指定すればいいのかわからない場合は、以下をご参照ください。
[Oracle Cloud : コマンド・ライン・インタフェース(CLI) をインストールしてみた](https://qiita.com/shirok/items/e63be9a22158fef10ba9)

### 1. 権限の付与
ADMINユーザーを使用する場合は特段気にする必要はありませんが、他のユーザーを使用する場合は、事前準備のステップを実行するために最低限以下の権限が必要です。
- CREATE SESSION
- EXECUTE ON DBMS_CLOUD
本記事ではAPEXPRODというユーザーを作成して上記権限を付与しています。

```
SQL> grant create session to apexprod;

Grant succeeded.

SQL> grant execute on dbms_cloud to apexprod;

Grant succeeded.
```

### 2. 資格証明の作成
SDK利用DBユーザーでログインし、DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、SDKを利用するための資格証明を作成します。

```
begin
    dbms_cloud.create_credential(
        credential_name => 'CRED1'
        , user_ocid => 'ocid1.user.oc1..(以下省略)'
        , tenancy_ocid => 'ocid1.tenancy.oc1..(以下省略)'
        , private_key => 'MIIEogIBAAKCAQEAo9h5dW6upKC5yEk/0e5Qt7zPbu6myWVaYIFFgZPFAlqVKfct
(中略)
7SGwpn9klpQCj9Mg5ZxOTKe+96QrV26jvdfqRQxitgfUdB6YlSQ='
        , fingerprint => 'cb:4d:(以下省略)'
    );
end;
/
```

| 引数名 | 指定内容 |
|:-----------|:-----------|
| CREDENTIAL_NAME | 資格証明の名称 |
| USER_OCID | SDKを使用するOracle CloudのユーザのOCID |
| TENANCY_OCID | SDKを使用するOracle CloudのテナントのOCID |
| PRIVATE_KEY | 秘密鍵。パスフレーズの利用不可 |
| FINGERPRINT | ユーザーに登録した公開鍵のフィンガープリント |

登録に成功すれば、登録された資格証明の情報はディクショナリUSER_CREDENTIALSで検索できるようになります。


# サンプルアプリケーションの実行
今回はOracle Cloudの監査ログの保存日数を取得するAPIを実行する、サンプルの無名PL/SQLを作成、実行します。

### 1. 権限の付与
OCIのPL/SQL SDKは「DBMS_CLOUD_OCI_」で始まる名称のパッケージの形態で提供されており、「DBMS_CLOUD_OCI_」で始まる名称のユーザー定義型(オブジェクト型)を多用しています。ADMIN以外のユーザーでSDKを使用するためには、利用するパッケージやユーザー定義型の実行権限を付与する必要があります。以下では、今回のサンプルアプリケーションを実行するために必要な権限を付与しています。

```
SQL> grant execute on dbms_cloud_oci_ad_audit to apexprod;

Grant succeeded.

SQL> grant execute on dbms_cloud_oci_ad_audit_get_configuration_response_t to apexprod;

Grant succeeded.
```

### 2. アプリケーションの作成と実行
```
SQL> set serveroutput on
SQL> declare
  2      result dbms_cloud_oci_ad_audit_get_configuration_response_t;
  3  begin
  4      result := dbms_cloud_oci_ad_audit.get_configuration(
  5          compartment_id => 'ocid1.compartment.oc1..(以下省略)'
  6          , region => 'ap-osaka-1'
  7          , credential_name => 'CRED1'
  8      );
  9      dbms_output.put_line(to_char(result.response_body.retention_period_days));
 10  end;
 11  /
365

PL/SQL procedure successfully completed.
```
Pytorch、Tensorflowのいくつかのバージョンに対して(NVIDIA)GPUを使うための環境

#目的
Pytorch、Tensorflowのいくつかのバージョンに対して(NVIDIA)GPUを使うための環境
に関する記事です。

例えば、自力だけで何かをつくる場合には、Tensorflowの2.Xを使うとか、決めることもできるかもしれませんが、github等で示された（示されている）他の方の例を参照する場合など、まだまだ、Tensorflow1.Xを動作させることも多いはず。
同様に、Pytorchのバージョンもいろいろ。
それに対して、NVIDIAのCUDAの対応バージョンが狭い気がする。
しかも、10.0と10.1で違うとか、細かいことを言われると心が折れる。

この記事前提：

* 複数の環境をうまく併設できる方は、この記事は関係ないと思います。
* ここでは、Windowsユーザ向けに記事を書いています。


#TensorflowとかPytorchで示されている組合せの推奨

##Tensorflow
以下は、source_windowsとなっているとおり、Windowsに関する情報です。
https://www.tensorflow.org/install/source_windows?hl=ja



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/9b1a1c8f-66cf-578c-33fc-d1365aabedab.png)

##Pytorch
https://pytorch.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/ff1a02e7-57ab-db81-e8f5-2b487295200b.png)


#対策
（あまり、細かいことを気にされない方は、）
Tensorflowにて、1.X⇔2.X　は、pip一発ということで許容するとして、
さて、GPU側をどうするかですが、
以下のように併設するでどうでしょう。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1

実際に使う側をPATHで優先的にみせる。

対策を整理すると、

* **Tensorflowについては、1.X⇔2.X　は、pip一発**
* **GPU(CUDA)は、複数を併設し、Pathでどちらを使うか切り替える。**

:notepad_spiral: CUDA_PATHは、手で10.0⇔10.1とか、書き換える必要あり。ただし、
　　作業内容によっては、CUDA_PATHの影響は、ないのかも。

（すみません、PytorchもTensorflowと同様であることを期待しています。あんまり、経験値なし。。。）


#補足
#cuDNNのバージョンの調べ方（ベターな方法）

以下の手順で調べられる感じ。
ヘッダファイルを調べる方法がよく示されているが、それでは、有効でないヘッダファイルを調べる可能性もあると思うので。

手順は以下。

* 使おうとしているCUDAのバージョンにあったcupyをインストール
* `from cupy.cuda import cudnn`
* `cudnn.getVersion()`
* `8004`であることがわかる

全然スマートではないが、**ベター**な気がします。


```
D:\_qiita>python -m pip install cupy-cuda101
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: cupy-cuda101 in c:\users\XYZZZ\appdata\roaming\python\python37\site-packages (8.0.0)
Requirement already satisfied: fastrlock>=0.3 in c:\program files (x86)\microsoft visual studio\shared\python37_64\lib\site-packages (from cupy-cuda101) (0.5)
Requirement already satisfied: numpy>=1.15 in c:\users\XYZZZ\appdata\roaming\python\python37\site-packages (from cupy-cuda101) (1.17.2)

D:\_qiita>
D:\_qiita>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from cupy.cuda import cudnn
>>> cudnn.getVersion()
8004
>>>
```

#【備忘のための】マイブックマーク
##NVIDIA cuDNN 7 のインストール（Windows 上）(金子邦彦研究室) 

https://www.kkaneko.jp/tools/win/cudnn.html

cuDNNをCUDAのフォルダに上書きする、ちょっと、気持ちの悪い処理を
こんなに丁寧に記載しているページはないのでは？

該当記事の抜粋。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/158e546e-fc07-d532-5254-b6f168148557.png)


#まとめ
自分の備忘のために、もう少し、情報を別途増やすつもりです。
【Effective Java】不必要なオブジェクトの生成を避ける

Effective Javaの独自解釈です。
第3版の項目6について、自分なりにコード書いたりして解釈してみました。

# 概要
- どこでオブジェクトが生成されるかを意識する。
- 用意されているオブジェクトの存在を知る。
- 何度も同じ値で再利用されるようなオブジェクトは定数化する。
- ボクシングでオブジェクトが意図せず作成されることに注意する。

# 不必要にオブジェクトが生成される例と対策
## String

```java

  String s = new String("hoge");  
```

このコードでは、まず`”hoge”`という文字が入ったオブジェクトが作成され、次に`new String(“hoge”)`で`”hoge”`という文字が入った別のオブジェクトが作成される。
要するに中身が同じオブジェクトが二重に生成されるのである。以下のようにすることで、オブジェクト生成を一回で済ませられる。

```java

  String s = "hoge";  
```

## Boolean
`Boolean`オブジェクトは実は以下のように、`String`オブジェクトを引数にすることで生成することができる。

```java

  Boolean b = new Boolean("true");  
```

しかしそもそも`Boolean`は`null`, `true`, `false`の三つの値しかとらない。`Boolean`クラスには`true`と`false`のオブジェクトが定数の形で予め用意されている。

**Booleanクラスの一部**

```java

    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);
```

また、これらの定数を返す`valueOf`メソッドも用意されている。

```java

    public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
    }
```

ということで、以下のように`valueOf`メソッドを利用して`Boolean`オブジェクトを宣言すれば、元々`Boolean`クラスで用意されているオブジェクトを参照し、あらたに生成する必要することがなくなる。

```java

  Boolean b = Boolean.valuOf("true");  
```

## メソッドが呼ばれる度に生成されるオブジェクト
以下の、文字列が正しいローマ数字であるか判定するメソッドを考える。

```java

  static boolean isRomanNumeral(String s) {
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
              + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
  } 
```

`String.matches`は、内部的に`Pattern`オブジェクトを生成しているので、このメソッドが呼ばれる度に新たな`Pattern`オブジェクトが生成されてしまう。
予め`Pattern`オブジェクトを定数として定義しておけば、`Pattern`オブジェクト生成はクラス初期化時の一回で済ませることができる。

```java

  public class RomanNumerals {
    private static final Pattern ROMAN = Pattern.compile(
              "^(?=.)M*(C[MD]|D?C{0,3})"
              + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
                
    static boolean isRomanNumeral(String s) {
      return ROMAN.matcher(s).matches();
    } 
  }
```

※ `String.matches`は内部的に`Pattern`オブジェクトを生成し、そのオブジェクトから`.matcher(判定対象文字列).matches()`を呼んでいるので、`Pattern`オブジェクト生成部分が丸ごと省略された形となる。

## 不必要なボクシング
以下のコードを考える。

```java

private static long sum() {
  Long sum = 0L;
  for (long i = 0; i <= Integer.MAX_VALUE; i++)
    sum += 1;
    
  return sum;
}
```

`sum += 1`は内部的に`Long sum = sum + (Long)1`のように毎回キャストされて演算されているので、毎回`Long`オブジェクトが生成されてしまう。
そもそもこのメソッドは`sum`が`Long`型である必要がないため、`sum`を`long`型で宣言するだけで大幅に速度改善できる。
これはわかりやすい例だが、わざわざラッパークラスを使用する必要があるかどうかは常に意識すべきである（`null`を取る必要性、シチュエーションがありえるかどうかなど）。

# 注意
メソッドの引数のオブジェクトは、メソッド内部で状態を変更すべきではないという考えがある。今そのオブジェクトがどういう状態になっているかが見えにくく、バグ発生リスクが上がるからである。
よほどパフォーマンスが求めらていない限り、この場合はメソッド内で新たにオブジェクトを生成し、引数のオブジェクトの内容をコピーすることでバグ発生リスクの低減を優先すべきだと考える。
競プロの機械翻訳でハマったこと

適宜追加。

まず、最初に断っておくのは、DeepLの精度（それっぽさ｝は非常に素晴らしく、私の海外のコンテストの問題解釈のスピードは格段に上がりました。ただ、時折、気を付けないとならない翻訳結果になることがあります。


# distinctが抜けた
https://codeforces.com/contest/1327/problem/A
> You are given two integers n and k. Your task is to find if n can be represented as a sum of k <b>distinct positive odd</b> (not divisible by 2) integers or not.

- DeepL(×)
> あなたの課題は，n が k 個の<b>正の奇数</b>（2 で割り切れない）整数の和として表現できるかどうかを見つけることです．

- Google翻訳(〇)
> 2つの整数nとkが与えられます。あなたの仕事は、nがk個の<b>異なる正の奇数</b>（2で割り切れない）整数の合計として表現できるかどうかを見つけることです
。

ここでは`distinct(それぞれが異なる)`がポイントになるのですが、 DeepLがこれを読み飛ばしました。

# 文章が消失する
https://codeforces.com/contest/1316/problem/C

> Print a single integer t (0≤t≤n+m−2)  — the appropriate power of x in h(x) whose coefficient isn't divisible by the given prime p. <b>If there are multiple powers of x that satisfy the condition, print any.</b> Example...

- DeepL(×)
> 単一の整数 t (0≤t≤n+m-2) - 係数が与えられた素数 p で割り切れない h(x) の適切な x のべき乗を表示します。 例題

- Google翻訳(〇)
> 単一の整数t（0≤t≤n+ m-2）を出力します—係数が与えられた素数pで割り切れないh（x）のxの適切な累乗。条件を満たすxの累乗が複数ある場合は、いずれかを出力します。例...

なぜか、DeepLではIf...の文章が消失しました。

# "returnable"
> Each snake wants to leave its room and come back to it later. A room is returnable if the snake there can leave the room, and later come back to it using the conveyor belts. How many such returnable rooms are there?

- DeepL
> 各ヘビは自分の部屋を出て、後で戻ってきたいと思っています。その蛇が部屋を出て、後からベルトを使って戻ってくることができれば、その部屋は返却可能な部屋となります。このような返却可能な部屋はいくつあるだろうか？

- Google翻訳
> 各ヘビは自分の部屋を出て、後で戻ってきたいと思っています。ヘビが部屋を出て、後でコンベヤーベルトを使って部屋に戻ることができれば、部屋は返却可能です。そのようなリターナブルルームはいくつありますか？

英語の限界だが、"returnableなRoom = 戻ってこられる部屋"を"返却可能"と訳されました。


# Print Any

自動翻訳問題じゃないのですが、これは、anyをprintしろではなくて、(複数の答えがある場合は)どれかを出力しろ。です。
Atcoder Biggner Contest 180 C問題

## 初めに
昨日C問題を解いてて詰まったところをまとめようと思います

##C:Cream puff
>問題
N個のシュークリームがあります。シュークリームを分割することなく平等に分けることができるような人数としてあり得るものを全て求めてください。
$条件:1≤N≤10^{12}$

初めに以下のコードで実行したのですが当然TLE

```python:test.py
N = int(input())
for i in range(1,N+1):
    if N%i==0:
        print(i)
```
##解法について
この問題は言い換えると「Nの約数を列挙する」ことと同値になります。なので1~Nまでの正の整数でNが割り切れるかどうかを判定すればよいことになります。しかし今回条件よりNが$N^{12}$までという条件なので普通に実装すれば時間が$O(n)$となるので時間切れになります。そこで[AtCoder 版！マスター・オブ・整数 (素因数分解編)](https://qiita.com/drken/items/a14e9af0ca2d857dad23#3-%E7%B4%84%E6%95%B0%E5%88%97%E6%8C%99) の記事を参考にしたところどうやら$\sqrt{N}$まで調べればよさそうです。なのでコードを

```python:test.py
import math
N = int(input())
num = []
for i in range(1,math.sqrt(N+1)):
    if N%i==0:
        num.append(i)
        if i != N//i: #iとついになる約数
            num.append(i)
num.sort() #小さい順に並べ替え
for j in num:
    print(j)
```

以上のようにすればよさそうです。これにすることで$O(\sqrt{N})$の時間で済みそうです。
TensorRTって何者？

## 経緯
最近、業務で機械学習モデルを高速化させる必要があり、色々調査した結果、TensorRTを使うことにしました。ただ、TensorRTの概要を理解するのに少し時間がかかったので、自分なりのTensorRTのイメージをまとめてみました。

## この記事の対象
これからTensorRTを使ってみようとしている方に向けて書いています。**TensorRTって何者なんだろう**って思っている方がざっくりとした理解が得られえばいいと思っています。TensorRTの詳しい機能や使い方の詳細は、[公式](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html)や[こちら](https://tech-blog.optim.co.jp/entry/2020/02/12/160000)の記事を見たほうがいいと思います。

## TensorRTがやっていること
TensorRTがやっていることはたくさんありますが、大きく分けると**推論エンジンの生成**と**推論実行**があります。なので、今回はその２つについて説明します。

### 1. 推論エンジンの生成
TensorRTは高速化を可能にするSDKですが、高速化を可能にしているのはTensorRT用に作成する推論エンジンです。最近のネットワークは巨大化しているので、マシンの処理速度が遅くなったり、メモリ使用量が多くなるという問題が発生しています。そこでTensorRTは、その問題に対して下の図のサークル状に記述されている技術を用いて対応しています。**ノードを結合して最適化したり**、**量子化してメモリ使用量を減らしたり**しています。

![Screenshot from 2020-10-17 19-30-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/14363b32-135f-9f7a-7964-634829f52fec.png)

自分はyoloを使うことが多いので、yoloを例に取って説明します。yolov4の学習が終わるとyolov4.weightsのような学習済みモデルが作成されます。この中身は、それぞれの層の膨大なノードの数値などが保存されています。![Screenshot from 2020-10-18 14-45-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/1d85ac49-0fdb-b6be-2ebf-ebb50247e271.png)
yoloはweightsファイルに加えて、ネットワークの定義(何層目にConv層、その後はBN層とか)をしているconfigファイルと、推論するクラス名とかを記述してるconfigファイルを読み込んで推論します。これらをまとめて、かつネットワークを様々な工夫により高速化したものが推論エンジン(trtファイル)です。推論エンジンの作成にはだいたい5分ぐらいかかるので、推論実行前にあらかじめ作成しておいた方がいいです。ちなみにdarknet yoloのweightsファイルのtrtファイルへの変換は[こちら](https://git.hipert.unimore.it/fgatti/darknet)のリポジトリでできます。

### 2. 推論
推論実行時には、まず作成しておいたtrtファイルから高速化したネットワークを復元します。あとは高速化しないときと同じで、入力の画像データ等を引数として、ネットワークに渡すと推論してくれます。


## まとめ
今回は、TensorRTに対する自分のイメージをまとめてみました。エッジデバイスだけでなく、デバイスの可能性を広げるための高速化ソフトウェアまで作っているNVIDIAはやっぱりすごい！

**間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。**
rubyでinjectに初期値を指定した場合と指定しなかった場合の走査方法の違い

rubyでinjectを使って自乗和を計算しようとしたら計算結果がずれていたので、少し原因を調査した。
非常に簡単な理由だったが、一応備忘録として残しておく。

### 原因

injectで初期値を指定した場合と指定しなかった場合でレシーバの走査方法が異なる


### 検証

2〜5の自乗和を求める

```
# 初期値を指定した場合
(2..5).inject(0) { |res, i| res + i**2 }
=> 54
```

```
# 初期値を指定しなかった場合
(2..5).inject { |res, i| res + i**2 }
# => 52
```

計算結果として正しいのは「初期値を指定した」場合である。

```
2 ^ 2 = 4
3 ^ 2 = 9
4 ^ 2 = 16
5 ^ 2 = 25
4+9+16+25=54
```

ここで[injectの定義](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html)を確認すると、「初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要素をブロックに渡します」とある。

これを踏まえて、上記のケースについて計算過程の詳細を確認してみる。

```
# 初期値を指定した場合

1回目  
res=0 i=2
0+2^2=4

2回目
res=4 i=3
4+3^2=13

3回目
res=13 i=4
13+4^2=29

4回目
res=29 i=5
29+5^2=54
```

```
# 初期値を指定しなかった場合

1回目  
res=2 i=3
2+3^2=11

2回目
res=11 i=4
11+4^2=27

3回目
res=27 i=5
27+5^2=52
```

ということで、計算結果が一致した。

### まとめ

自分が使おうとするメソッドの挙動を把握しておこう
【M5Stack】Arduino IDEでの書き込みが絶望的に遅いのでPlatform IOを試してみた


##状況
最近M5Stackを使うことが多いのですが、Arduino IDE でのM5Stackへの書き込みが絶望的に遅いです。
サンプルコードの「Hello World」でも、５分かかっているほどです。

##環境
Windows 10
Visual Studio Code インストール済み

##Platform IO 
「Arduino IDE 遅い」
で、Twitter検索してみますと、みなさん不満を持っているようです。
このリンク先参照
https://twitter.com/search?q=Arduino%20IDE%20%E9%81%85%E3%81%84&src=typed_query

そのなかで、このようなツイッターのやりとりを発見。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">私もそんな感じだったので、PlatformIOに乗り換えたのですが、快適ですよ。</p>&mdash; akita11/JunichiAkita (@akita11) <a href="https://twitter.com/akita11/status/1221899189694554112?ref_src=twsrc%5Etfw">January 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<br>
ふむふむ、Platform IOなるものがよいとの情報を得ました。


##やってみた

こちらの記事を参考にしました
- [M5Stackの開発環境を整える - PlatformIO IDE編](https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7)
- [マイコン開発するならPlatformIOがめちゃくちゃいいぞ](https://qiita.com/JotaroS/items/1930f156aab953194c9a)


###Visual Studio Codeの拡張機能

Visual Studio Codeの拡張機能にあるので楽ちんです。


[![Image from Gyazo](https://i.gyazo.com/4885a36d3d238603f0f05277a2527b52.png)](https://gyazo.com/4885a36d3d238603f0f05277a2527b52)

<br>
###手順
さっそくHello Worldをやってみます。
　
NEW Projectを選択
[![Image from Gyazo](https://i.gyazo.com/adbcd213b2d2066c30b172f6224a0383.png)](https://gyazo.com/adbcd213b2d2066c30b172f6224a0383)

[![Image from Gyazo](https://i.gyazo.com/cbb1566a02459d894af8ceedbde32ac7.png)](https://gyazo.com/cbb1566a02459d894af8ceedbde32ac7)

プロジェクトができたら、

M5Stackのライブラリをプロジェクトに追加
（これ、プロジェクトを作る都度やる必要がある）
[![Image from Gyazo](https://i.gyazo.com/87d2a5a884708e55de3548dd95ae8853.png)](https://gyazo.com/87d2a5a884708e55de3548dd95ae8853)

[![Image from Gyazo](https://i.gyazo.com/bc29c874d6fc0cb51d8dbf97bdaba566.png)](https://gyazo.com/bc29c874d6fc0cb51d8dbf97bdaba566)

src > main.cpp 
に　"Hello World"のコードを入力

```main.cpp 
#include <Arduino.h>
#include <M5Stack.h>

void setup(){

  M5.begin();
  M5.Power.begin();
    
  M5.Lcd.print("Hello World");
}

```
<br>

ビルド　＆　書き込み
[![Image from Gyazo](https://i.gyazo.com/bece4bb9b6bd38a7f98eb2464a432455.png)](https://gyazo.com/bece4bb9b6bd38a7f98eb2464a432455)

<br>

ビルド、書き込みともに約１０秒、
合計２０秒くらいで
あっという間に、できました。

<br>
さようなら Arduino IDE
こんにちは Platform IO

<br>
python 外部ファイル読みこみ

(サンプル ファイル名:urls.py)

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('polls/', include('polls.urls')),
        path('admin/', admin.site.urls),
    ]

単体関数呼び出し
from ファイル名　import　関数名

複数関数呼び出し
from ファイル名　import　関数名` , 関数名 `
wsl2/docker 環境で単体ロボットシミュレータをインストール/実行する！

#概要
TOPPERS/箱庭WGでは，[単体ロボットシミュレータ](https://toppers.github.io/hakoniwa/prototypes/single-robot/)を一般公開していますが，インストールの手間が結構かかります．そこで，wsl2/dockerを使って，一括インストーラ作りましたので，ご紹介します．早いマシンなら約10分くらいでインストールおわります．


#前提
以下の環境はインストール済みであることを前提とします．

* Windows10 Home or Pro(どちらでも大丈夫)
* WSL2
* docker

また，インストール実施前に docker は立ち上げておく必要あります．

```
$ sudo service docker start
```

#インストール手順
手順は以下の通りです．

1. 箱庭WGリポジトリ(hakoniwa-Unity-HackEV)をクローンする
2. インストーラを叩く

##箱庭WGリポジトリ(hakoniwa-Unity-HackEV)をクローンする
WSL2 上で，Windows上の任意のフォルダに移動し，作業用ディレクトリを作成/移動します．

```
$ mkdir toppers_work
$ cd toppers_work
```

クローンする．

```
$ git clone https://github.com/toppers/hakoniwa-Unity-HackEV.git
```

## インストーラを叩く
以下のディレクトリに移動します．

```
$ cd hakoniwa-Unity-HackEV/docker/v850
```

インストーラを叩きます(約10分くらいと思います)．

```
$ utils/install.bash
```

インストールが成功すると，以下の docker image が入っているはずです．

```
$ sudo docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
kanetugu2015/athrill-v850   v1.1.1              05fbd93397be        4 hours ago         370MB
kanetugu2015/ev3rt-v850     v1.0.0              f0c6b1412652        6 days ago          1.78GB
```

#ビルド方法
EV3RTのアプリケーションは，base_practice_1 というフォルダで作成しています．
ビルド方法は以下の通りです．

## ビルド用 docker コンテナ起動

WSL2上から，以下のコマンドで ビルド用コンテナを起動します．

```
$ bash run-builder.bash
root@MyComputer:~#
```

## ビルド実行
起動した docker コンテナ上で以下のコマンドを叩くだけ．

```
# ./clean_build.bash base_practice_1
```

#シミュレーション実行方法
シミュレーションを実行するには，Unityアプリとathrillをそれぞれ起動する必要があります．

##Unityアプリの実行
Unityアプリは，wsl2 上で，以下のコマンドで起動します．

```
$ ./utils/start-unity.bash single-robot
```

成功すると，以下のUIが起動します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/da06e51a-340d-908a-92aa-9459d848779f.png)


##athrillの実行
athrillの実行は docker コンテナで行います．

WSL2上から，以下のコマンドで athrill 実行用コンテナを起動します．

```
$ bash run-athrill.bash base_practice_1
```

起動したら，athrill実行コマンドを叩くだけ．

```
# ./start-athrill.bash
```

#デモ
シミュレーション実行のデモはこんな感じです．
![pv-run4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7c3faef6-b131-1f9d-0d23-2575814c09f2.gif)

#補足
注意点として，現状の WSL2は MMAP の不具合があるようです．
ですので，Unityとathrillの通信方式はUDP通信にしています．
WSL2のMMAP不具合が解消したら，MMAP方式の検討も進めたいと思います．
go言語学習雑記 1 

ちょっと前にGo言語を勉強していて、備忘録がてらその時のメモを書いていきます。

# パッケージ
goはパッケージと言う単位で構成され、その中の関数や変数の単位でimport,exportをしていきます。
できるかどうかは、文字の大文字小文字で判別されています。

```go
 package main
 
 import (
 	"fmt"
 	"math"
 )
 
 func main() {
 	fmt.Println(math.Pi) //OK 
 	fmt.Println(math.pi)  // error
 }

```

大文字の場合はexport されず
小文字の場合はexport されます。

# 変数宣言

変数は var <変数名> <型名>　の形で宣言されます。
また分割代入っぽくかけます。

セイウチ演算子(:=)を使うと型推論を効かせて型名を省略して宣言できます。その場合はの宣言は <変数名> := <値> となります

定数は const <変数名> = <値> となります。　定数の場合は勝手に型推論が働きます。

```go
 var i, j int = 1, 2
 test := "string" // 型推論を効かせて変数初期化
 const Pi = 3.14 // 定数、この場合型推論を効かせて定数初期化はできない
```

# 基本型

go は　zero valueと言う機能があり、特定の型で値が代入されなかった場合自動的に値が代入されます。
なので、値を入れ忘れてがnullになってると言うケースを防ぐことができます。

```go
 bool // zero value はfalse
 
 string // zero value は ""
 
 int  int8  int16  int32  int64 // zero value は０
 uint uint8 uint16 uint32 uint64 uintptr
 
 byte // uint8 の別名
 
 rune // int32 の別名
      // Unicode のコードポイントを表す
 
 float32 float64
 
 complex64 complex128
```


なお、なぜか基本型に複素数があります。

# 型変換

<型名>(<変数名>)で型変換ができる

```go
 var i int = 42
 var f float64 = float64(i)
 var u uint = uint(f)
```
まるばつゲームの制作

### まるばつゲームの制作
3×3のマス目を作り、マスをクリックすると○と×を交互に表示できるようにします。

まず、body要素にonload属性を付与して、ブラウザがページを読み込んだときにマス目を画面に表示するように設定します。

```html
<body onload="init()">
  <h2>⚪︎×ゲーム</h2>
  <table id="table"></table>
  <p>※ マスをクリックしてください。</p>
</body>
```

script要素内ではまず、変数countを定義します。初期値はfalseにします。

init関数内はtable要素に「createElement」メソッドで作成したtr要素を3つ追加します。tr要素には同じく「createElement」メソッドで作成したtd要素を3つ追加します。
「document.createElement("要素名")」で指定した要素を作成することができます。
「要素名.appendChild(要素名２)」で親要素（要素名）に子要素（要素名２）を追加することができます。
tdにはonclickプロパティでmark関数を代入します。これでtd要素であるマス目をクリックしたときにマス目に○や×を表示できるようにします。

```javascript
  <script>
    let count = false;

    function init() {
      for(let r = 0; r < 3; r++) {
        let tr = document.createElement("tr");
        for(let d = 0; d < 3; d++) {
          let td = document.createElement("td");
          td.onclick = mark;
          tr.appendChild(td);
        }
        table.appendChild(tr);
      }
    }
```

mark関数には引数にeを指定します。マス目をクリックしたときのクリックしたtdのデータを取得することができます。
「let src = e.target;」で取得したデータを変数srcに代入します。
その後のif文は変数countがfalseのときは「src.textContent = "○";」でマス目に○が表示されるようにします。そしてcountにtrueを代入します。
elseの後はcountがfalseでないときはマス目に×を表示してcountにfalseを代入します。
countがfalseのときは○、trueのときは×を表示することを交互に行えるようにしています。

```javascript
    function mark(e) {
      let src = e.target;
      if(count === false) {
        src.textContent = "⚪︎";
        count = true;
      } else {
        src.textContent = "×";
        count = false;
      }
    }
  </script>
```

以下のコードをコピーしてファイルに貼り付ければ試すことができます。

```html
<!DOCTYPE html>

<html>

<head>
  <meta charset="UTF-8">
  <title>marubatu</title>

  <style>
    table {
      border-collapse: collapse;
    }
    td {
      width: 100px;
      height: 100px;
      font-size: 60px;
      text-align: center;
      border: 1px solid black;
    }
  </style>

  <script>
    let count = false;

    function init() {
      for(let r = 0; r < 3; r++) {
        let tr = document.createElement("tr");
        for(let d = 0; d < 3; d++) {
          let td = document.createElement("td");
          td.onclick = mark;
          tr.appendChild(td);
        }
        table.appendChild(tr);
      }
    }

    function mark(e) {
      let src = e.target;
      if(count === false) {
        src.textContent = "⚪︎";
        count = true;
      } else {
        src.textContent = "×";
        count = false;
      }
    }
  </script>
</head>

<body onload="init()">
  <h2>⚪︎×ゲーム</h2>
  <table id="table"></table>
  <p>※ マスをクリックしてください。</p>
</body>
</html>
```
テスト15

```vb

Public fileName As String '保存先フォルダパス＆ファイル名

Sub PDF変換()

'アクティブシートをPDF変換
'Dim fileName As String '保存先フォルダパス＆ファイル名
Set FSO = CreateObject("Scripting.FileSystemObject")

fileName = ThisWorkbook.Path & "\" & FSO.GetBaseName(ThisWorkbook.Name) & ".pdf"

'シートが3つあって、3つ選択されていたら3つ分合わさったPDFができる
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName

'shellオブジェクトを生成
'Dim sh As Variant
'Set sh = CreateObject("Shell.Application")

'単独でPDFを表示
'sh.ShellExecute fileName

'webbroserにPDFを表示
UserForm1.Show

End Sub

'--------------------------------------------

Private Sub UserForm_Initialize()

'webbrowserに指定のパスのPDFを表示(別途フォームを用意しておく必要がある)
WebBrowser1.Navigate fileName

End Sub

```
iosのアプリ審査でリジェクト（Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage）

アプリをアップデートしたらリジェクトされたのでメモ。
カメラあたりはアップルはいろいろ煩いです。前にもカメラあたりで指摘をもらってました。
審査はipadでもしっかり確認するようで、ipadだとカメラがずれてるとか、そういう指摘もくる。キャプチャーももらえてテスターとしては優秀。だけどメッセージしても返事に数時間かかるから厄介。
もうipadも確認して来られるとandroidと変わらなくなってきてるぐらいiosも面倒です。

```
Hello,

Thank you for providing this information.

Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage

We noticed that your app requests the user’s consent to access the camera but does not clarify the use of the camera in the applicable purpose string.

To help users understand why your app is requesting access to their personal data, all permission request alerts in your app should specify how your app will use the requested feature.

Next Steps

Please revise the relevant purpose string in your app’s Info.plist file to specify why the app is requesting access to the camera. Make sure the purpose string includes an example of how the user’s data will be used.

You can modify your app’s Info.plist file using the property list editor in Xcode.

Resources

For additional information and instructions on requesting permission, please review the Requesting Permission section of the iOS Human Interface Guidelines and the Information Property List Key Reference. You may also want to review the Technical Q&A QA1937: Resolving the Privacy-Sensitive Data App Rejection page for details on how to provide a usage description for permission request alerts.


We hope that you will make the appropriate changes to your app to bring it into compliance with the App Store Review Guidelines and resubmit your app for review.

We look forward to reviewing your resubmitted app.


Best regards,

App Store Review

```

アプリでカメラを使うときに、カメラ利用の目的を小さなダイアログでユーザに伝えますが、その文言の指摘でした。それじゃーわからんということのよう。

元々出力してたのは「take your camera」でした。
そっか、これじゃーだめか。UI的にここでカメラならわかるだろって発想で適当に設定してました。
そして変更後
「Use the camera to change the background image」
こんな感じにしてみました。

そしたらこれは通った様子。
しかしこの後に他にもいくつか指摘が来て、大変だった。
特に前回指摘なかったところでも、後から気がついて指摘してきてリジェクトしてくるからつらい。
そこは前できてたじゃんと思いつつ直す。

参考までに。
Cypress でカスタムヘッダーを付ける方法

## はじめに
Cypress を使ったE2Eテストに取り組んでおり、環境に応じたrequest headerを付ける必要があった。
公式ドキュメントに従ったやり方だとうまくheaderを付けることができなかったが、ワークアラウンドを見つけたのでQiitaにメモすることにする。

## 開発環境
- cypress: 4.11.0

## システム構成

```
Browser <--> CDN <--> Reverse Proxy <--> Application Server 
```

## やりたかったこと
テストの特性上、CDNを経由せずReverse Proxyに直接接続したかったのだが、CDNを経由する際にcustom request headerが付与されるため、headerを明示的に付与する必要があった。

Cypressのドキュメントを確認するとrequest headerには2つの方法が用意されていたが、いづれも今回のユースケースには合わなかった。

### 方法１: visit()のオプションとしてヘッダーを渡す。

```javascript
cy.visit(url, {
  headers: {'CUSTOM-HEADER':  'Header value'}
})
```

この方法の問題は[ドキュメントにも記載](https://docs.cypress.io/api/commands/visit.html#Arguments)のあるとおり、initial request にしかヘッダーが付与されないこと。つまりHTML内の画像/JS/CSSなどのサブリクエストにはヘッダーが付与されない

Cypressから発せられるすべてのリクエストに対してカスタムヘッダーを付与したいため、このやり方だと今回のユースケースでは使えない。

### 方法２: server()のonAnyRequestをフックしてヘッダーを付与する。

```javascript
cy.server({
  onAnyRequest: (route,  proxy) => {
    proxy.xhr.setRequestHeader('CUSTOM-HEADER',  'Header value')
  }
})
```

この方法は[ドキュメントに記載](https://docs.cypress.io/api/commands/server.html#Options)があるのだが、私が試したところコード自体は発動していいないように思える。または最初の一発だけ発動して他ではトリガーされない感じ、、、


## ワークアラウンド：visit() + ModHeader Extension

テストはChromiumで動けば良いので、ModHeader というChrome拡張でヘッダーを付与できないか試したところ、visit()には付与されなかったが、サブリクエストには付与されることがわかった。

そのためあまりスマートな解決策ではないが、下記で対応することにした
1. initial request は visit()のオプションでカスタムヘッダーを付与
2. サブリクエストはModHeader で付与

### initial request は visit()のオプションでカスタムヘッダーを付与

```javascript
cy.visit(url, {
  headers: {'CUSTOM-HEADER':  'Header value'}
})
```

### サブリクエストはModHeader で付与
1. cypress panel からChromiumを起動
2. Chromiumから `ModHeader` を検索し普通にChromeExtensionとして普通にインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64854/d4a79267-d19f-67ff-dd88-c81c6f104d70.png)
2. インストールが完了したら `ModHeader` のアイコンをクリックし ＋ボタンをクリック -> `Request header` をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64854/2ad32f73-1c60-8a27-f2c4-13e8a94a94d3.png)
4. カスタムヘッダーを登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64854/a34b87f7-5394-e98c-e798-460a943d22c8.png)

ModHeaderの設定内容はChromiumを閉じても維持されるため、次回Cypress経由でChromiumを起動したときはカスタムヘッダーが不要される設定の状態で起動する。

## 最後に
全くスマートさにかける解決策なので `onAnyRequest` の正しい使い方を教えてください。
ラズパイでサーボライブラリpiServoCtlを使う(ハードウェアPWM使用)

ここではRaspberryPi4でPython3.7を使用しました。
![DSC_0033.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445338/3711596f-f59f-9cce-8732-d6101b497ea0.jpeg)
ホビー用サーボ（左から[SG92R](https://akizukidenshi.com/catalog/g/gM-08914/)、[SG90](https://akizukidenshi.com/catalog/g/gM-08761/)）

## ライブラリをインストールする
piServoCtlライブラリを使用します。
Github: https://github.com/naoto64/piServoCtl
以下のコマンドを打ってインストールできます。

```shell
$ sudo pip3 install piServoCtl
```

## 使い方
このライブラリは、pigpioを使用しているため、pigpiodを起動する必要があります。コマンド```sudo pigpiod```を打つか、pigpiodを自動起動させておいてください。pigpiodの自動起動については、このサイトが参考になります。
https://hakengineer.xyz/2017/09/22/post-318/
サーボはSG92RやSG90を使用しましたが、他のサーボでも動くと思います。

```python:example.py
from piservo import Servo # piservoモジュールをインポート（piServoCtlと間違えないように）
import time

myservo = Servo(12) # GPIO12にサーボをつなぐ

myservo.write(180)
time.sleep(3)
myservo.write(0)
time.sleep(3)
myservo.stop()
```

このプログラムを実行すると、サーボが180度、0度の位置に動きます。ですが、0度付近でサーボがガタガタ動きます。サーボモータに若干のズレがあるようで、少し修正が必要なようです。

```python
myservo = Servo(12, min_pulse=0.61, max_pulse=2.34)
```

```myservo = Servo(12)```の部分を上のように変更すると、ほぼ正確に動くようになりました。サーボは個体差があるようなので、サーボに合わせて```min_pulse, max_pulse```の部分を適宜書き換えて下さい。

## 実行結果
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PythonのpiServoCtlライブラリでサーボを動かしてみた。<a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a> <a href="https://twitter.com/hashtag/Raspberry?src=hash&amp;ref_src=twsrc%5Etfw">#Raspberry</a> <a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4?src=hash&amp;ref_src=twsrc%5Etfw">#ラズパイ</a> <a href="https://twitter.com/hashtag/%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&amp;ref_src=twsrc%5Etfw">#電子工作</a> <a href="https://twitter.com/hashtag/%E3%82%B5%E3%83%BC%E3%83%9C?src=hash&amp;ref_src=twsrc%5Etfw">#サーボ</a> <a href="https://twitter.com/hashtag/Servo?src=hash&amp;ref_src=twsrc%5Etfw">#Servo</a><a href="https://t.co/VuUtBdYo1a">https://t.co/VuUtBdYo1a</a> <a href="https://t.co/css7esWEjw">pic.twitter.com/css7esWEjw</a></p>&mdash; naoto64 (@naoto64_2000) <a href="https://twitter.com/naoto64_2000/status/1317696541226790914?ref_src=twsrc%5Etfw">October 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【VPC】VPC Flow Logsの設定

## 1. CloudWatchのロググループを作成する
![スクリーンショット 2020-10-18 14.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/32347bd2-1918-d87c-e1b1-ad9bada1b28a.png)

### 作成完了
![スクリーンショット 2020-08-15 16.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/5d5af264-99e3-9dee-33fe-8b79a8eeebeb.png)

## 2. フローログを作成する
![スクリーンショット 2020-08-15 16.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/c31333e8-8219-af09-9af2-da81a99bb756.png)

- ログの集約間隔は10分、1分を選択可能
- 送信先はCloudWatchログ、S3バケットを選択可能
![スクリーンショット 2020-08-15 16.49.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/9a1b6cf6-bffa-f50f-410d-554f87fe04c5.png)

### 作成完了
VPCのログがCloudWatchに出力されるようになる
![スクリーンショット 2020-08-15 16.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/cf417f8b-329c-cc78-082b-81f30528dd93.png)