OmniAICreator/Qiita-1.07M huggingface dataset:
RustでEthereumのRLP

# RLPとは
**R**ecursive **L**ength **P**refixのアクロニムで、バイナリで、木構造を定義するもの。
葉ノードは、バイト配列。
ノードを短く表現するために、ノードの大きさに応じたLength Prefixをつけていく。
Ethereumのトランザクションで使われている。

## ノードの種類
- バイト配列
- バイト配列のリスト

どちらのタイプのノードも、Length Prefixを除いた中身の長さは、64bitに収める必要がある。

# エンコード

## エンコード対象がバイト配列ノードの場合
まず、エンコード対象になるものを、バイト配列に変換する。
エンコード対象がIntegerの場合は、エンコード対象をBigEndianでByteに変換して、先頭の0を取り除く。それ以外の場合は、バイト列に変換してそのまま使う。

### ルール
上から順に当てはまるルールを探す。はじめに当てはまったルールを適用してエンコードは完了。見つからなければエンコードエラー。

1. エンコード対象が１バイトで、値が0x00から0x7fの範囲にある場合は、`そのバイト`がLength Prefix。またLength Prefixは同時に値としても使われるので、`Length Prefixのみ`がエンコード結果。

    （例）
        
    |エンコード対象|エンコード結果|
    |----|----|
    |0x00|[0x00]|
    |0x4a|[0x4a]|

1. 1に当てはまらず、エンコード対象の長さが55バイト以下の場合は、`0x80 + エンコード対象の長さ`がLength Prefix。`Length Prefix + エンコード対象`がエンコード結果。

    （例）

    |エンコード対象|エンコード結果|
    |------------|------------|
    |空配列|[0x80]|
    |0x80|[0x81, 0x80]|
    |"dog"|[0x83, 'd', 'o', 'g']|

1. 2に当てはまらず、エンコード対象の長さが64bitでおさまる場合は、以下の、`A + B`がLength Prefixで、`Length Prefix + エンコード対象`がエンコード結果。

    |記号|内容|
    |------------|------------|
    |A|0xb7 + エンコード対象の長さのバイト表現での長さ（3の時点で空配列は除外されているので、長さは最低1になる）|
    |B|エンコード対象の長さのバイト表現|

    例えば、長さ1024(= 0x0400)の文字列をエンコードする場合、

    |記号|内容|
    |------------|------------|
    |A|0xb9 (0xb7に、0x04,0x00の長さ2を足したもの)|
    |B|0x04, 0x00|

    なので、A + B + エンコーディング対象は、`[0xb9, 0x04, 0x00, ...1024バイトの文字列...]`

## エンコード対象がバイト配列のリストの場合
リストの要素をそれぞれエンコードして、全てを連結して一つにしたものがエンコード対象になる。要素がリストの場合は、葉ノードに当たるまで再帰的にエンコードする。

### ルール
上から順に当てはまるルールを探す。はじめに当てはまったルールを適用してエンコードは完了。見つからなければエンコードエラー。

1. エンコード対象の長さが55以下の場合は、`0xc0 + エンコード対象の長さ`がLength Prefix。`Length Prefix + エンコード対象`がエンコード結果。

    例： `["cat", "dog"]` をエンコードする場合
    1. `"cat"`に、エンコードルール２が適用されて、`[0x83, 'c', 'a', 't']`
    2. `"dog"`も、同じルールが適用されて`[0x83, 'd', 'o', 'g']`
    3. 1と2を連結したエンコード対象は、`[0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g']`
    4. エンコード対象の長さは8なので、`0xc0 + 8 = 0xc8`がLengh Prefix
    5. Length Prefix + エンコード対象で、エンコード結果は、`[0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g']`

2. 1に当てはまらず、エンコード対象の長さが64bitに収まる場合は、以下の、`A + B`がLength Prefix。`Length Prefix + エンコード対象`がエンコード結果。
   
    |記号|内容|
    |------------|------------|
    |A|0xf7 + エンコード対象の長さのバイト表現での長さ（1の時点で空配列は除外されているので、長さは最低1になる）|
    |B|エンコード対象の長さのバイト表現|

    例えば、`[長さ1024の文字列, "dog"]`をエンコードする場合、

    1. 上と同じやり方で、長さ1024の文字列をエンコードして、`[0xb9, 0x04, 0x00, ...1024バイトの文字列...]`
    2. 上と同じやり方で、"dog"をエンコードして、[0x83, 'd', 'o', 'g']
    3. 1と2を連結したエンコード対象は、`[0xb9, 0x04, 0x00, ...1024バイトの文字列..., 0x83, 'd', 'o', 'g']`
    4. エンコード対象の長さは、`3 + 1024 + 4 = 1031 (0x0407)`
    5. 0x0407は2バイトなので、Aは、`0xf7 + 2 = 0xf9`
    6. Bは、0x04, 0x07
    7. A + B + エンコード対象は、`[0xf9, 0x04, 0x07, 0xb9, 0x04, 0x00, ...1024バイトの文字列..., 0x83, 'd', 'o', 'g']`

## Length Prefixのまとめ
| Prefix | 意味　|
|--------|------|
|0x00 - 0x7f|プリフィックス自体で長さ１のバイト配列 (A)|
|0x80 - 0xb7|(A)を除いた、長さ0から55までのバイト配列|
|0xb8 - 0xbf|56以上で、64bitにおさまる長さのバイト配列|
|0xc0 - 0xf7|プリフィックスを含めたリスト要素の合計の長さが55以下の、バイト配列のリスト|
|0xf8 - 0xff|56以上で、64bit内でおさまる長さの、プリフィックスを含めたリスト要素の合計の長さを持つ、バイト配列のリスト|

# デコード
まずLength Prefixを取得して、その内容に応じてその後のデータを処理していく。詳細はサンプルコードへ。

# サンプルコード
Rustで実装。
https://github.com/parumu/eth-rlp

# 仕様
https://github.com/ethereum/wiki/wiki/RLP
Shopifyで複数のコレクションを表示する

#複数のコレクションを表示する

## 結論
```
{{ collections.COLLECTION_NAME.title }}
{% for product in collections.COLLECTION_NAME.products %}
//コレクションのアイテムを表示する記述
{% endfor %}
```

## 必要となった経緯
運営しているショッピングサイトで、1つのページに対して夏物、秋物など複数のコレクションを1ページに表示したかった。
トップページであれば管理画面から表示することができたが、
今回はコレクション画面にて複数のコレクションを表示したかったので、コードで対応することとした。
リモートワーク便利グッズ

## [スタンディングデスク](https://amzn.to/2XaCWSG) + [ステッパー](https://amzn.to/3g0XUMH)
メンタリストDaigoさんのおすすめの組み合わせですね。
集中しやすい上に、運動不足も解消できるという組み合わせです。
自分は作業スペースを広く取りたかったため、[低めのハイベッド](https://amzn.to/2X61Jr1)を利用しています。
普段の生活は上で、休憩や睡眠は下でって感じで生活スペースを分けています。

## [ノイズキャンセリングヘッドホン](https://amzn.to/2TfMpXS)
自宅だと、どうしても周りがうるさい時があると思います。
そんなときにだいぶ騒音をカットしてくれます。

## [Echo Dot](https://amzn.to/3fYiflv)
いちいち見る方向を切り替えなくていいので集中力が削がれなくて良いです。
一番良く使う機能はタイマー。１日に１０回くらい使ってます。

## [Surface Go](https://amzn.to/2zQZrnC) + [タブレットスタンド](https://amzn.to/2ZafGHj)
Kindleの本を参考にしながらやりたいときとか便利。
縦置きができるのがいいですね。
安い中古のタブレットで良かったかも。

## [食洗機](https://amzn.to/2ZcDrON)
自宅で働いていると、自炊することが何かと増えると思います。皿洗いの手間が省けるだけでもだいぶ楽になります。
１００円ショップでスクレーパーを準備しておくと、更にいいかもしれません。

## [マグボトル](https://amzn.to/3fTe4HT)
これからの季節は氷の消費が激しくなります。
氷が少なくて済むし、長いこと冷たく保ってくれて、、コースターも不必要になるので助かります。


一部は廃盤だったりして無くなっているものは、似たようなものにリンクを貼っています。
3の倍数、5の倍数のとき

学習過程の覚書です。

     <script>
        var i=1; 
        while (i <= 100) {
         if (i%3 == 0 && i%5 == 0) {
           document.write("<p>A</p>")
         } else if ( i%3 == 0) {
             document.write("<p>B</p>")
         } else if (i%5 == 0) {
             document.write("<p>AB</p>")
         } else {
             document.write("<p>"+i+"<br></p>") //その他の数字
         }
         i++;
        }
    </script>
PyTorch + YOLO v3導入

# 導入
https://github.com/ayooshkathuria/pytorch-yolo-v3
に従って進める
`git clone https://github.com/ayooshkathuria/pytorch-yolo-v3.git`

重みファイル(yolov3.weights)を[ここ](https://pjreddie.com/media/files/yolov3.weights)から落としてきて、pytorch-yolo-v3フォルダに入れる。または、
`$ cd pytorch-yolo-v3
$ wget https://pjreddie.com/media/files/yolov3.weights`

## 環境インストール
`pip install pandas`

## PyTorchのインストール
`pip install torch`
失敗。

https://pytorch.org/
で、自分の環境にあったインストール方法を指南してもらう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298745/089b7628-0a2e-0ae4-f4f7-e67735c6d10f.png)

自分の環境(GPUなし)では
`pip install torch==1.5.0+cpu torchvision==0.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html`

## デモ実行

### imgsフォルダにある画像の検知デモ
`python detect.py`
を実行

## 結果(一部)

```
(略)git\pytorch-yolo-v3\imgs\person.jpg predicted in  0.568 seconds
Objects Detected:    person dog horse
----------------------------------------------------------
Traceback (most recent call last):
  File "detect.py", line 234, in <module>
    output = torch.cat((output,prediction))
RuntimeError: Sizes of tensors must match except in dimension 0. Got 8 and 86 in dimension 1
```
最後の scream.jpg (ムンクの叫び)は検知されず、エラーが出た。
このコードでは、ただ名前が列挙されるだけ。

### PCカメラによるデモ

`python cam_demo.py`
すると、PC搭載のカメラを使って物体認識デモができる。
(qを押すと終了)

### 携帯画面の中の写真を見せてみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298745/7df89da4-5019-7b11-58e8-9440cea8f9fc.png)

自分のPCはCPU core-i7。
5-6 FPS程度のスピードで検知可能。
すごい。
プログラミング初学者がGitで擬似開発する方法

# はじめに
初Qiita記事投稿です！
Boost noteに書き殴っていた内容をまとめていきたいと思います。
独学歴は４ヶ月ちょっとなので、
初学者がgitを操作してgithubにコードを上げて自分の学習時間を記録したい！という方には役立つ記事にしたいと思います(僕もそのためにgitを勉強しました）。ご指摘・ご意見等あればご連絡いただけたら幸いです。
＊lssuesから作成していくのが本来の共同開発の手順みたいなので、あくまで一連の手順を練習したい！という方向けです。流れを理解したら追記しようと思います。
#参考文献・参考記事
・【初心者必見】Gitの基本
https://www.youtube.com/watch?v
・Gitを使ったクローン、プルリク、マージの流れについて解説
https://www.youtube.com/watch?v=JispFS6zeDw&t=617s

上記２つともプログラング講師として有名なさんのyoutube動画です。
こちらの動画両方見ればgitについての一連の流れは理解できるかと思います。
無料でこれが見れるのは神すぎる！

・【Git入門】サルでも分かるGit入門の前に！Git使い方高速入門編【入門は5分で十分だと思います】
https://www.youtube.com/watch?v=i1L3A0SLDyg

gitをある程度扱えるようになってからですが、こちらの動画も大変参考になりました。（git add .でstagingに保存されるという理解はできてなかった）
５分で説明されているので、すぐにでもgitを使いたい！という方にはおすすめです。

・Githubにport:22 で push できなかった場合の対処法
https://qiita.com/SOJO/items/74b16221580a17296226
こちらがおそらくメインといっても過言ではないです笑
このエラーに1日~２日程度悩まされました。。。
手順通りしてるのにpushできない!となったときはこちらの記事を確認してみてください。

追加（2020/9/13)
・git初学者の初めてのチーム開発で気をつける事の備忘録
こちらの記事が非常にわかりやすいので、ご確認頂き、git pullではなく、git fetch・git mergeをお使い頂く方が適切かと思います。

#開発環境
OS:Macbook Pro(gitとgitHubを導入またはアカウント登録済みであることが前提）

#擬似開発するまでの手順
**1.githubにてフォルダを作成後ターミナルでdesktopに移動**

    cd desktop
**2.gitを起動してフォルダをコピー**

    git init
    git clone https://github.com/作成したフォルダの名前.git
githubに作成したフォルダのcodeにhttpsのリンクが書いてあります。

**3.エディターを使用し、index.htmlをファイルをフォルダ内に作成**

ファイルに適当にテキストを書き込んでおく。

**4.ターミナルに戻り、フォルダに移動**

    cd フォルダ名

**5.git add .でwork treeからstagingに保存し、git commit -m でローカルリポジトリに保存(自分のパソコンだけにデータを保存する）**

    git add .
    git commit -m "追加した内容"

**6.ローカルリポジトリからリモートリポジトリにプッシュ(githubに保存）**

    git push origin master
これでgithubにデータが保存されているかと思います！次はブランチを作成してプルリクエストするまでの手順を説明します。
**7.ブランチを作成し、作成できているか確認**

    git checkout -b "ブランチ名"
    git  branch
ターミナルにmasterとブランチ名が書かれていれば作成完了です。
**8.ファイルに書き込み、5の手順で保存し、プッシュします。

    git push origin ブランチ名
この後、githubにpull requestが表示されているはずなのでクリックしcreate　pull requestをクリックします。(このあとがコードレビュー)
そして、コードが問題なければブランチのプルリクエストをリモートリポジトリのマスターにmargeします。(Delete branchでブランチを削除する)

**9. masterに移動し、githubの中身をロカールリポジトリのマスターに反映**

    git checkout master
    git pull origin master
これでgithubにあるデータがローカルリポジトリに反映されました！このあとは7〜９までを繰り返していくだけで擬似開発がおこなえると思います。

**10. ローカルリポジトリのブランチ削除**

    git branch -D 削除したいbranch名
使い終わったローカルリポジトリのブランチを削除します。

#最後に
ここまで読んでいただきありがとうございます！
書いていて感じたのですがローカルリポジトリやリモートリポジトリの説明が少ないため何をしているのか理解しづらいかもしれません。一度動画を見て仕組みを理解しておいた方がいいかと思います。あとは使っていたらだんだんわかってくるのでまずやってみましょう！
Windows10でPython環境構築メモ

# Windows10でpython環境構築メモ

テレワーク等、諸事情にてパソコンを買い替えたのでWindows10にPython開発環境を作ったメモ。
古いパソコンで環境構築した際にメモっていなかったので。

URL:https://www.python.org/downloads/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/541f03ac-ce45-2170-9282-7471241e6261.png)

Looking for a specific release?で、Python 3.8.3を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/c0822fdb-6f26-5582-7680-209397f897c6.png)

Windows x86-64 executable installer　をダウンロードしてウィザードでインストール。
注）"Add Python 3.x to PATH"をチェックして環境変数に登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/4baf5383-361a-d18b-a124-a93a8e04518a.png)

”Disable path length limit ”とか言うで、クリックしてあげる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/afa04b97-db0b-33f2-c380-4a6b3f341624.png)

インストールが完了したか確認する。

CMD起動して、pythonと打つ。

![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303278/43db89ec-c4ff-485f-d56d-04a1549ae469.png)

大丈夫そう。おや、時間が。。まいっか。
後で設定を変えましょう。
Javaの配列

###配列
配列とは、複数の値をまとめられることです。

####配列の変数定義
配列を扱う場合には、配列型の変数に配列を代入します。
配列の変数定義int型とString型

```
int[]
String[]
```
int型は数値を要素に持つ配列です。
String型は文字列を要素に持つ配列です。Stringの頭文字は大文字です。
int型の配列の例

```Main.java
int[] numbers = {1,5,10};
```
String型の配列の例

```Main.java
String[] names = {"佐藤","鈴木","高橋"};
```
配列の要素には、前から順に「0, 1, 2・・・」と数字が割り振られています。
配列の各要素は、配列名[インデックス番号]とすることで取得することができます。
【例】

```Main.java
String[] names = {"佐藤","鈴木","高橋"};
  System.out.println("名前は"+names[0]+"です");
```
####配列の要素の上書き

```Main.java
String[] names = {"佐藤","鈴木","高橋"};
  System.out.println("名前は"+names[0]+"です");
  names[0] = "上野";
  System.out.println("名前は"+names[0]+"です");
```
names[インデックス] = "要素";で上書きできます。
上記の例だとコンソールの出力結果は佐藤と上野になります。
####配列の繰り返し処理
for文を使って繰り返し処理ができます。
【例】

```Main.java
String[] names = {"佐藤","鈴木","高橋"};
  for (int x = 0;x < 3;x++){
  System.out.println("名前は"+names[x]+"です");
}
```
上記の例だとインデックスの0から2までの3つをnamesから呼び出しています。
####length
lengthとは要素の数を数えるという機能です。
上記のfor文とlengthを使って、繰り返し処理ができます。
先ほどのfor文の条件式x<3を配列.lengthにすることで書き換えることができます。
【例】

```Main.java
String[] names = {"佐藤","鈴木","高橋"};
  for (int x = 0;x < names.length;x++){
  System.out.println("名前は"+names[x]+"です");
}
```
上記のように記述すれば、配列の要素数を気にする必要がなくなります。
なので、こちらの方が使いやすいと思います。
ですが、もっとシンプルなfor文もあります。それは配列拡張for文です。
####配列拡張for文
for文は配列用に拡張for文があります。これを使えば、先ほどのfor文をよりシンプルに書くことができます。

```Main.java
for (データ型 変数名:配列名) {
  繰り返す処理;
}
```
【例】

```Main.java
String[] names = {"佐藤","鈴木","高橋"};
  for (String name:names){
  System.out.println("名前は"+name+"です");
}
```
上記の例だとStringがデータ型、nameが変数名、namesが配列名です。
先ほどまでのlengthを使ったfor文と比較して、拡張for文では変数に配列の要素自体が代入されます。
私が理解するためにだらだら書きましたが、これが一番使いやすいかなと思います。
AWS Certified Security Specialty 合格記録

# この記事

**AWS Certified Security Specialty** を取得したので
どんな学習をしたかを記録します。

# about me

**インフラエンジニア**で、AWS関連のインフラ構築や保守を３年くらい経験しています。

この分野については、業務ではIAMポリシーを作成したり
直近ではCloudFormationを使っていてS3の権限調整したりしていました。

AWS資格は

```
Solution Architect Associate （7月）
SysOps Administrator Associate (9月)
Solution Architect Professional (11月)
Developer Associate (12月)
DevOps Engineer Professional (3月)
Security Specialty（5月）
```

という順で取得しました。

Specialtyの資格は初でしたが、Security分野はIAMで悩むことがあった点や、
どんな場合でも必要なので、最優先で学習してみました。


# about SCS試験

AWS 認定セキュリティ – 専門知識
https://aws.amazon.com/jp/certification/certified-security-specialty/

# 試験対策でやったこと

### 試験ガイドとサンプル問題

「試験ガイドとサンプル問題」はまず目を通します。
https://aws.amazon.com/jp/certification/certification-prep/

### 模擬試験（公式)

一番はじめに、どんなもんか解いてみます。
模擬試験結果は５0%くらいでした。
もしこの時点で全くわからなくてしんどかったら、先にProfessionalを取るべきだと思います。
２つのProfessional資格の学習は、この試験にかなり有効でした。

### whizlabs

模擬試験コースがあるので、こちらをメインに取り組みます。
https://www.whizlabs.com/aws-certified-security-specialty/

わからないことがはじめは多いですが、どんどん解いて、AWSドキュメントで覚えていきます。
例えばCMKの話があって１つのAWSドキュメントを読むと、そのドキュメントの知識で他の模擬試験の問題も数問解けたりするイメージなので、意外とモチベーション保てました。

どうしてもイメージが掴めないものは、AWSで検証します。
セキュリティ分野は、暗号化する、復号化するという具体的な作業だけで実践できてしまうので
DevOps等の**構築を行う検証に比べて大変ではない**と感じました。

### udemy

時間と体力の関係で途中まででしたが、こちらも活用しました。
https://www.udemy.com/course/aws-certified-security-specialty-practice-tests/

### 全体的に学んだサービス

ドキュメントや模擬試験からもわかるかと思いますが、個人的には以下のAWSサービス知識が重要だと感じました。

・KMS(はじめから最後まで一番時間かけた)
・IAM
・AWS WAF
・CloudFront、ELB、SGやACLなど（SAP資格の復習）
・AWS Organizations（復習）
・Systems Manager（復習）
・GuardDuty（復習）
・Secrets Manager
・Macie
・Inspector

・Active DirectoryやSAML関連、コンプライアンス
ホワイトペーパー↓
https://aws.amazon.com/jp/security/security-learning/?whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc
https://aws.amazon.com/jp/compliance/resources/


セキュリティサービス全般です。
たくさんあるかと思いますが、それぞれ何に使うのか、どんなケースで有効なのか、どうやって適用するのか、統合サービスはあるのか、など**疑問点を必ず解消してから挑む**ことが必要です。**気を抜くと失敗します。**
また、もしポリシーを自身で作成したことがない場合は結構きついので、いくつか作成することをおすすめします。


# 結果&まとめ

無事合格しました。

**試験時間**ですが、模擬試験を解いたら感じる通り全く心配しなくて良いと思いました。
わかるかわからないかの問題が多いと思うので、冷静に挑みましょう。

今回は**Professionalの資格の知識が有効だった**ため、試験対策としての学習時間は20-25時間程度でした。

こちらは今までの記事とあまり変わらないですが、AWS試験の感想としては、以下のようになります。

・**対策すれば取れる**
・問題をよく読む。何が求められている問題か？
・ラスト一週間は、問題演習をひたすら行って集中力と文章読解力を鍛える
・日本語の文章だけでは疑問を抱くことがあるので怪しいときは英語問題も読む
・日本語の問題を選択する場合、少々特殊な日本語に事前に慣れる
・今回は特に、選択肢はまず大半が切り捨てられる問題だと感じた
・最後の選択でわからなくても、確率で取れる問題が数問あった

## 次
**Advanced Networking Specialty**を取ります。
こればかりはずっと取りたかった資格なので、自分の中の一つの大きな通過点です。

この記事が何かのお役に立てられれば幸いです。
ありがとうございました！

# Qiitaへの記録

SAA
https://qiita.com/shinon_uk/items/5525178bf98034676b2f

SOP
https://qiita.com/shinon_uk/items/e60bcb946b49bf5cabda

SAP
・合格編
https://qiita.com/shinon_uk/items/c6b599d1cd3000e84d59
・失敗編（資料集め）
https://qiita.com/shinon_uk/items/ba839ba048ba439cc3ff

DVA
https://qiita.com/shinon_uk/items/8015953c792ef4bc7223

DOP
https://qiita.com/shinon_uk/items/5646d536e649b60b962a
IQ Botインストール手順（１）インストールに必要な環境を揃える

このページは<a href="https://qiita.com/IQ_Bocchi/items/529dc72b6ab3d26dbfe0" target="_new">IQ Bot インストール手順（検証用）</a>のサブカテゴリです。

このページでは、インストールに先立って必要な環境整備について記載します。

#（１）インストールに必要な環境を揃える

##必要スペックのマシンを調達する

以下のサイト（最新版は英語）を参照し、必要なスペックを持つ、互換性のあるOSのマシンを調達します。

- <a href="https://docs.automationanywhere.com/bundle/iq-bot-v6.5/page/iq-bot/topics/release-notes/iq-bot-hardware-and-software-requirements.html#Zj0vY2F0ZWdvcnkvaW5zdGFsbD9wPUluc3RhbGw=" target="_blank">マシンスペック</a>
- <a href="https://docs.automationanywhere.com/bundle/iq-bot-v6.5/page/iq-bot/topics/release-notes/iq-bot-operating-system-compatability-matrix.html#Zj0vY2F0ZWdvcnkvaW5zdGFsbD9wPUluc3RhbGw=" target="_blank">OSの互換性</a><br>
※上記ページを日本語で参照したいときは、リンク先の右上にある地球のマークから日本語を選択します

上記のマシンスペックはIQ Bot単体（CRサーバ分離）の場合のスペックですが、上記のサーバのスペックにCRを同梱させても動きます。
同梱は[本番環境用としてはベンダー非推奨](https://qiita.com/IQ_Bocchi/items/5d435b1db96f9fb21d9a#cr%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8iq-bot%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AF%E5%88%86%E9%9B%A2)ですが、今回は検証環境のインストール手順ということで同梱を前提にして説明を進めます。（前提の記載は[こちら](https://qiita.com/IQ_Bocchi/items/529dc72b6ab3d26dbfe0#%E5%89%8D%E6%8F%90)）

##必要なポートを開ける

以下のベンダー公式サイトを見て、ファイアウォールの必要なポートを開放します。

- <a href="https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/deployment-planning/on-prem-install/cloud-firewall-rules.html" target="_blank">CR</a>
- <a href="https://docs.automationanywhere.com/bundle/iq-bot-v6.5/page/iq-bot/topics/iq-bot/architecture/iq-bot-architecture-guide-ports-and-services.html" target="_blank">IQ Bot</a><br>
※上記ページを日本語で参照したいときは、リンク先の右上にある地球のマークから日本語を選択します

##ブラウザの設定

IQ BotのブラウザはChromeもしくはIE11となっています。
入っていなければどちらかを入れます。筆者の検証環境ではChromeを使っています。

###Chromeを使用する場合

インストール手順は<a href="https://support.google.com/chrome/answer/95346?co=GENIE.Platform%3DDesktop&hl=ja" target="_blank">こちら</a>。
Chromeの場合は、インストールするだけでOKです。

###IE11を使用する場合

インストール手順は<a href="https://support.microsoft.com/ja-jp/help/17621/internet-explorer-downloads" target="_blank">こちら</a>。
IE11の場合、インストール後に互換性設定で「互換表示でイントラネットサイトを表示する」を選択しておく必要があります。
やりかたは<a href="http://mtfm.me.kyoto-u.ac.jp/home2/iexplore.html" target="_blank">こちら</a>。

##Automation Anywhere Enterprise と IQ Botのインストーラーをダウンロードする

インストールサイトはベンダーから案内されるので、あらかじめダウンロードしておきます。

###V11系統の場合
Control Room, Client, IQ Botのインストーラーをそれぞれダウンロードします。

###A2019系統の場合

A2019 EnterpriseとIQ Botのインストーラーをそれぞれダウンロードします。
（A2019 Enterpriseをインストールすれば、V11系統のControl RoomとClientが使えるようになります）

#次のステップ

次は[DBのインストールと設定](https://qiita.com/IQ_Bocchi/items/7f02939799347b4db501)を行います。
Windows Terminalに直接入力ができない問題

一新された[Windows Terminal](https://github.com/microsoft/terminal) (以下wt)において最新版0.11.1333.0を含む過去5リリースほどで発生していた「入力が一切受け付けない不具合」はレジストリを設定することで是正できました。

少し前のFixedでIME入力ができるようになったのですが、同時にこの辺りで発生した問題なので関連性は疑えたものの特定には至りませんでした。

ようやく関連のIssue [#4448 (comment)](https://github.com/microsoft/terminal/issues/4448#issuecomment-617290424)で是正方法が報告されましたので記しておきます。

設定方法はレジストリ `HKeyLocalMachine` にあるInputServiceの値をそれぞれ `0` に設定すること。私も `1` になっていて発生していたので予め `0` になっていた環境では一体全体何を議論しているのか？とわからなかったことでしょうｗ

### 設定方法

レジストリ regedit.exe を起動し以下の2つのキーの値を `0` に修正しwtを再起動します。

![sharpjs-tips.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088/a965f55c-02a5-bc0b-7009-80f68b2d9dfc.png)


```
HKLM\SOFTWARE\Microsoft\Input:
  InputServiceEnabled: 0
  InputServiceEnabledForCCI: 0
```

とりいそぎこれによってWindows Terminalは正常化されました。

このあと、他のモダン アプリの入力にも影響が及ぶかもしれません。そのときは再度こちらをの設定を第一に考慮してみてください。

### 追記： Windows Terminal v1.0.1401.0 が公開

20200520 preview が取れドキュメントも[MSTF Docs](https://docs.microsoft.com/ja-jp/windows/terminal/)に移動されました。
rails初心者が好奇心でreactに手を出してみる 

フロント側も触ってみたいとおもったので、react.jsで簡単なアプリを作っていくことにしたので、環境構築について備忘録も兼ねてアウトプットしておく。

(cloud9で開発を始めたのですが、バージョン指定等で若干ハマりました。)

node.jsをインストールするのあたってhomebrewが必要になるくさいので、インストール。

```
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```

このままだとパスが通ってないと警告されるので、通します。

```
$ test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
$ test -d /home/linuxbrew/.linuxbrew && PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
$ test -r ~/.bash_profile && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bash_profile
$ echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.profile
```

これでOK。
パス通すって原理はわかるんだけど、コードの意味ちゃんと理解できてるかと聞かれるとアブないんだよな、調べとこう。

（参考：https://qiita.com/nasuvitz/items/5eec6ab9444cff8e9467）

homebrewがインストールできたら、node.jsをインストールしましょう。

```
$ brew install node
```

続いて、node.jsのバージョンを指定したいのですが、cloud9では標準で
nvm(Node Version Manager)がインストールされているようなので
(もしインストールされてなかったら、公式ドキュメントを参考に：https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-nodejs.html)
こちらを利用してバージョン指定をします。

```
$ nvm install バージョン
```

これでOK。node -v　と指定して

```
$ node -v
vバージョン
```
と表示されれば完了です。

次はJavaScriptのパッケージマネージャであるyarnをインストールします。Rubyでいうところのbundler(?)。

```
$ brew install yarn --ignore-dependencies
```
以前はオプションに --without-node　というものを使用していたみたいですが、そちらを参照したところ「知らないオプションなのでシカトします！」ってバッサリいかれたので記述を変えました。
（参考：http://babababand.hatenablog.com/entry/2019/04/06/071534）
エラーメッセージってたまに面白いのあるからいいですよね。ふふってなる。

```
$ yarn --vesion
yarn install v1.22.4
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 0.12s.
```
みたいなのが返ってくればOK。

新しいディレクトリを作成して、webpack等をインストールします。

```
$ mkdir React_TO_DO
$ cd React_TO_DO
$ git init
$ yarn init
question name (React_TO_DO): 
question version (1.0.0): 
question description: 
question entry point (index.js): 
question repository url: 
question author: 
question license (MIT): 
question private: 
```
yarn initの後に出てくるものは、全部エンターでOKです。
次のコードでwebpack等をインストールします。

```
$ yarn add --dev webpack webpack-cli 
```

とりあえずこれで開発は進めていけそうかなぁ。
apt-get install npmエラー時対処法

ubuntuでsudo apt-get install npm を実行すると下記エラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329335/f50c3095-3d70-fe2e-bddf-7134f243ee60.png)

対処法：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329335/b2ffa7da-2695-8f5b-ba34-2bb69403c44f.png)

参照サイト：
https://www.trifields.jp/how-to-install-node-js-on-ubuntu1804-3544
PythonからのYOLO v3 導入


# 前提
https://github.com/arunponnusamy/object-detection-opencv
に従う。

`git clone https://github.com/arunponnusamy/object-detection-opencv.git`

[本家](https://pjreddie.com/darknet/yolo/)のナイーブな方法、[keras-yolov3](https://github.com/qqwweee/keras-yolo3)も試したが、失敗。

## 要件
* Python 3 (2は未検証)
* opencv
* numpy
 
`pip install opencv-python`しておく


## 学習済みのweightsのダウンロード
`$ wget https://pjreddie.com/media/files/yolov3.weights`
さっき落としてきたobject-detecction-opencvに入れる

## テストコードの実行
`python  yolo_opencv.py --image dog.jpg --config yolov3.cfg --weights yolov3.weights --classes yolov3.txt`

## 実行画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298745/326cd861-af2b-1802-4172-67f1a023fc3a.png)
こんな感じで物体認識されている。
「SQLSTATE[HY000] [2002] Connection refused」エラーの解決法

![sql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433931/1d08b3c3-4f52-569e-1a03-77b706e1330c.png)



Cloud9でLaravelを使った開発をしていたら画像のようなエラーが出ました。

初めは何かわからなかったけど、原因と対策は簡単。

コマンドで初めにSQLサーバーを起動していなかったというだけでした。


#開発環境
・Windows10
・AWS（Cloud9）
・Larabel


# 解決法

初めにSQLサーバーを起動することが必要です。


◎SQLサーバ起動

 `$  sudo service mysqld start`
Amazon Cognito とは

#Amazon Cognito とは
> Amazon Cognito は、ウェブアプリケーションやモバイルアプリケーションの認証、許可、ユーザー管理をサポート

> Amazon Cognito の主な 2 つのコンポーネントは、ユーザープールと ID プールです。

##Amazon Cognito ユーザープールと ID プールを一緒に使用するケース

<img width="425" alt="スクリーンショット 2020-05-18 14.59.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/e0c056a3-9234-4fb0-31fe-2a9c1256d354.png">


## 一般的な Amazon Cognito シナリオ
* ユーザープールによる認証
* ユーザープールを使用してサーバー側のリソースにアクセスする
* API Gateway および Lambda でユーザープールを使用してリソースにアクセスする
* ユーザープールと ID プールを使用して AWS のサービスにアクセスする
* サードパーティーを使用して認証を行い、ID プールを使用して AWS サービスにアクセスする
* Amazon Cognito を使用した AWS AppSync リソースへのアクセス

###ユーザープールによる認証

<img width="650" alt="スクリーンショット 2020-05-18 15.07.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/875c3966-bdd4-11fc-7ab9-5114e04f5380.png">

> 認証に成功すると、ウェブやモバイルアプリケーションに Amazon Cognito よりユーザープールトークンが送信されます。これらのトークンを使用して、他の AWS のサービスへのアプリによるアクセスを許可する AWS 認証情報を取得したり、サーバー側のリソースへのアクセスや Amazon API Gateway へのアクセスを制御したりすることができます。

WEBIDFederationでトークンと一時認証情報を交換して使います。

###ユーザープールを使用してサーバー側のリソースにアクセスする
<img width="384" alt="スクリーンショット 2020-05-18 15.13.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/46a1d010-694e-57cb-ecb3-303cff0f708f.png">

こちらもトークンと一時認証情報を交換して使います。

###API Gateway および Lambda でユーザープールを使用してリソースにアクセスする
<img width="484" alt="スクリーンショット 2020-05-18 15.22.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/4a5ac4e9-5678-2383-1a5f-338672854b03.png">

> API Gateway を介して API にアクセスすることをユーザーに許可できます。API Gateway は、成功したユーザープール認証からトークンを検証し、Lambda 関数や独自の API などのリソースへのアクセスをユーザーに許可するためにトークンを使用します。

### ユーザープールと ID プールを使用して AWS のサービスにアクセスする
<img width="692" alt="スクリーンショット 2020-05-18 15.23.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/26b7f271-2241-1c15-e295-c54203f6bc54.png">

まずユーザープールで認証を行う。そのあとにIDプールでトークンと一時認証情報を交換。それを使ってAWSリソースにアクセスする。

[こちらの記事](https://qiita.com/fjisdahgaiuerua/items/c8183dc19e95d9e13d4b)でフェデレーションについて扱っています。

### サードパーティーを使用して認証を行い、ID プールを使用して AWS サービスにアクセスする
<img width="520" alt="スクリーンショット 2020-05-18 15.26.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/f5909605-c327-2a85-2071-f2eeaf275142.png">

ユーザープールの代わりに外部Idpを使用。そのあとは一緒です。

### Amazon Cognito を使用した AWS AppSync リソースへのアクセス
<img width="559" alt="スクリーンショット 2020-05-18 15.28.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/5857556b-0b56-6672-7504-d13ed6bcd779.png">

## Amazon Cognito のユーザープールと ID プールの違いは何ですか?
> ユーザープールでは認証 (アイデンティティの検証) ができます。ユーザープールを使用すると、アプリユーザーはユーザープールからのサインインや、サードパーティーのアイデンティティプロバイダー (IdP) を介した連携ができます。

> ID プールでは認可 (アクセスコントロール) ができます。ID プールを使用すると、ユーザーに一意の ID を作成して、他の AWS サービスへのアクセスを許可できます。

#参考文献
* Amazon Cognito とは
    * https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html
* Amazon Cognito のユーザープールと ID プールの違いは何ですか?
    * https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-user-pools-identity-pools/
MacでMagicaVoxelをインストールして起動する方法

# この記事では、Macだと一発では起動しない、MagicaVoxelのインストールと起動方法について記載しています。

動画で確認したい方はこちらで御覧ください。
https://youtu.be/t6FMA6w1twY

---

MagicaVoxel公式にアクセス
https://ephtracy.github.io/

今回の場合は、Mac版最新の0.99.4を選択します。
(0.99.5はまだwinだけでした)
<img width="833" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/51e0b7c3-bedc-f958-1278-274e0bdad9de.png">

gitHubのページヘ遷移するので、
その中から最新版を選択します。
今回は0.99.4.2を選択します。
<img width="1059" alt="a04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/53dc9afa-1000-5a34-3c1c-52167c3b6f63.png">

ダウンロードが完了しました。
<img width="244" alt="a05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/39105f07-4699-8a87-5844-31efe0886bf9.png">

ダウンロード後、解凍したフォルダはデスクトップへ移動します。
(ダウンロードフォルダでも作業できますが、セキュリティの確認で管理者の確認が発生するので、デスクトップが望ましいです)
<img width="218" alt="a06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/7b04e58e-a5f9-390e-a3eb-882ef6cb4689.png">

ここから、おまじないを行います。
フォルダ内のMagicaVoxel.appを、デスクトップへ移動します。
<img width="279" alt="a07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/144fede7-014c-75bd-85c6-e1b73ccd5bc1.png">
<img width="165" alt="a08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/8c768178-9ca0-2929-ac3f-9eea7194df17.png">

デスクトップへ移動後、
アプリを右クリックして「開く」を選択します。
<img width="365" alt="a09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/55ecbce9-5fd5-fdb1-3b69-06e9e27f8108.png">

最初はエラーが出ると思いますが、再度アプリを右クリックから「開く」を選択してください。
その後、ウィンドウの「開く」を選択します。
<img width="418" alt="a10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f5e491e3-3cf9-0fc5-0b1c-7b2e49fca94f.png">
<img width="479" alt="a11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/9d4df655-3a89-136a-e305-f68b2de96a67.png">

MagicaVoxelが起動しますが、ブラックアウト状態です。問題ありません。
<img width="702" alt="a12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/e8ee913d-0e00-eb65-9546-b49353ec27a2.png">

デスクトップ上にあったMagicaVoxel.appを、フォルダの中に移動します。
<img width="228" alt="スクリーンショット 2020-05-18 13.35.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/04ba5bdf-ac55-dba2-2638-129348119247.png">

再度、MagicaVoxel.appを起動します。
問題なく起動します。
<img width="1037" alt="スクリーンショット 2020-05-18 13.37.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/4d895b78-b7e9-2d3e-8159-a1a055479ff2.png">

あとは、使いやすいように、フォルダごとアプリケーションフォルダに移動するなどして、
快適なボクセルライフを過ごしましょう。
【Ruby】OAuth認証を使ってWeb APIへPOST HTTPリクエストの送信

# RubyでHTTPリクエストを送信する

今回は一番ベーシックなnet/httpを使用したサンプルを挙げるが、RubyのHTTPクライアントは複数ある。

## サンプルコード

リクエストパラメータについて、
GETの場合はパラメータをクエリストリングに含めるが、
POSTの場合はリクエストボディに含めるという点にてちょっとハマった。

後で書き直す。

```rb
require 'uri'
require 'net/http'
require 'openssl'
require 'base64'

## 1. Oauth認証によるアクセストークンの取得
# client_idと client_secretを使用
client_id = ENV['API_CLIENT_ID']
client_secret = ENV['API_CLIENT_SECRET']
credential = Base64.strict_encode64(client_id + ':' + client_secret)
uri = URI.parse('https://example.oauth2/token')

# アクセストークンを取得するHTTPリクエストの作成
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
# 以下は使用するWeb APIの仕様により異なる。
request_header = {
  'Authorization': "Basic #{credential}",
  'Content-Type': 'application/x-www-form-urlencoded'
}
request = Net::HTTP::Post.new(uri.request_uri, request_header)
request.body = 'grant_type=client_credentials'

# リクエストの送信・レスポンスからアクセストークンの取得
response = https.request(request)
response_body = JSON.parse(response.body)
access_token = response_body['access_token']

## 2. Web APIへHTTPリクエストの送信
# アクセストークンを使用するHTTPリクエストの作成
endpoint_uri = URI.parse('https://example.api.com' + '/v1/hoge/huga')
https = Net::HTTP.new(endpoint_uri.host, endpoint_uri.port)
https.use_ssl = true
# 以下は使用するWeb APIの仕様により異なる。
request_header = {
  'Authorization': "Bearer #{access_token}",
  'Content-Type': 'application/x-www-form-urlencoded',
  'Accept': 'application/json'
}
request = Net::HTTP::Post.new(endpoint_uri.request_uri, request_header)
data = { api_key: "abcd1234", name: "test", email: "example@foo.com" }
request.body = URI.encode_www_form(data)

# リクエストの送信・レスポンスの取得
response = https.request(request)
```

## 参考

- [Ruby 2.7.0 リファレンスマニュアル library net/http](https://docs.ruby-lang.org/ja/latest/library/net=2fhttp.html)
- [一番分かりやすい OAuth の説明
](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)
- [net/httpsでWebAPIにPOSTリクエストを投げる
](https://qiita.com/seisonshi/items/c23c0154c45ccbfa9999)
- [そのリクエストパラメータ、クエリストリングに入れますか、それともボディに入れますか
](https://qiita.com/sakuraya/items/6f1030279a747bcce648)

利用するWeb APIの仕様やサンプルコードがあればそれもちゃんと読みましょう。

## net/http以外のRubyでHTTPを扱うライブラリ

### faraday

- [lostisland/faraday](https://github.com/lostisland/faraday)
- [Ruby の HTTP クライアントライブラリ Faraday が便利そう
](https://gist.github.com/mitukiii/2775321)

### oauth2

- [oauth-xx/oauth2](https://github.com/oauth-xx/oauth2)
- [rubyのoauth2(gem)について](https://qiita.com/mm31/items/b2bfe8d43976fafd6a9b)
PHPの矢印の意味　アロー演算子「->」とダブルアロー演算子「=>」　

#アロー演算子「->」

アロー演算子はその左辺にはクラスのインスタンスを取り、右辺には左辺のクラスが持つプロパティ(変数)やメソッド(関数)を指定しプロパティへのアクセス・メソッドの呼び出しを実行します。

```php
// 人間クラス
class Person {
    $name;

    function __construct($name) {
        $this->name = $name;
    }
    function introduceSelf() {
        echo "私の名前は". $this->name"です";
    }
}

$taro = new Person("太郎");
echo $taro->$name;
$taro->introduceSelf();
```


#ダブルアロー演算子「=>」
連想配列キーとバリューを示すためのもの

```php
return view('buy/index', ['cartitems' => $cartitems, 'subtotal'=> $subtotal]);

$array = array('apple'=>'りんご', 'peach'=>'もも', 'pear'=>'なし');
```
GoogleAppsScriptを用いてスプレッドシートで日程調整

#作りたいもの
友人と3人で集まれる日付を考えたい時にスプレッドシートを使って日程調整をするコードをGASで簡単に作りたい
##GoogleAppsScript(GAS)
Google Apps ScriptとはGoogleが提供しているプログラミング環境、GAS（ガス）という略称あり

Googleのアカウントを持っていれば、利用する事ができるので、Webからファイルをダウンロードするといった事は行う必要がない
ブラウザに依存しない

GASについては[こちら](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4
)にわかりやすくまとめてあり、使用制限などもあるので一度目を通しておくと良い

##システム概要
スプレッドシートに3人ともが○をつけた日付を取得するコードをGASで書いてシステムログに出力する

##スプレッドシートで用いる関数
IF関数とAND関数を用います

=IF(and(B3="○",C3="○",D3="○"),"○","×")

のようにすると3人が共通で○としている場合は○、1人でも○がなければ×をスプレッドシートに入力する

実際に使うシートの内容は以下のよう
<img width="551" alt="スクリーンショット 2020-05-18 11.05.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405768/9fce3210-de5e-ed69-c16d-350973e8c670.png">

##GASのコード
[こちら](https://qiita.com/negito6/items/c64a7a8589faaffcfdcf)を参考にスプレッドシートとGASの紐付けを行う

```javascript

function schedule() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();//GASとスプレッドシートファイルの紐付け
  var sheet = spreadsheet.getSheetByName('日程調整');//シート名を指名してアクセス
  
  
  //シートの最終行番号、最終列番号を取得
  var startrow = 1;
  var startcol = 1;
  var lastrow = sheet.getLastRow();
  var lastcol = sheet.getLastColumn();

  
  var sheetdata = sheet.getSheetValues(startrow, startcol, lastrow, lastcol);

  for(var i=2;i<lastrow;i++){
  if(sheetdata[i][4]=="○"){
  var date=new Date(sheetdata[i][0]);//new Date()で日付データの生成
  Logger.log(date);
  }
  }
}

```


こちらのコードでスプレッドシートを以下のようにして実行します。
<img width="504" alt="スクリーンショット 2020-05-18 12.23.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405768/17924e79-433c-b518-79f5-4db1c7041b1e.png">

実行結果がこれ<img width="453" alt="スクリーンショット 2020-05-18 12.25.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405768/5eb59cd6-a7a0-bae0-cf45-386b7331bbdc.png">


見にくいのでフォーマットを変更するコードを18行目に加えて完成

```javascript
function schedule() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();//GASとスプレッドシートファイルの紐付け
  var sheet = spreadsheet.getSheetByName('日程調整');//シート名を指名してアクセス
  
  
  //シートの最終行番号、最終列番号を取得
  var startrow = 1;
  var startcol = 1;
  var lastrow = sheet.getLastRow();
  var lastcol = sheet.getLastColumn();

  
  var sheetdata = sheet.getSheetValues(startrow, startcol, lastrow, lastcol);

  for(var i=2;i<lastrow;i++){
  if(sheetdata[i][4]=="○"){
  var date=new Date(sheetdata[i][0]);//new Date()で日付データの生成
  var date = Utilities.formatDate(date, "JST","MM'/'dd")//これを追加
  Logger.log(date);
  }
  }
}
```

実行すると
<img width="242" alt="スクリーンショット 2020-05-18 12.32.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405768/3e8cd746-b736-3eb2-1674-28e331a2a54e.png">

いい感じですかね
出力となる日付をまたスプレッドシートに入力するとかlineやスラックで飛ばすとか、日付を取り出すときの条件とかいろいろいじれるので応用が利くし目で追うより作業効率を挙げられそう
[漏洞通告]CVE-2020-12720/vBulletin 5.x 前台SQLI

### 漏洞描述
vBulletin是一个收费低廉但强大的建站BBS(论坛)CMS.该CMS国外大量论坛使用,中国国内少许网站使用.近日,vBulletin 5.x爆出一个前台SQLI漏洞,无需登录即可触发.

### CVE编号
CVE-2020-12720

### 漏洞威胁等级
高危

### 影响范围
5.5.6pl1 <= vBulletin
5.6.0 <= vBulletin <= 5.6.0pl1
5.6.1 <= vBulletin <= 5.6.1pl1

### 漏洞验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/4af7221e-45e8-5409-d3bf-5638a89c7f27.png)


### 修复建议
参考官方引导安装补丁即可

### 时间轴
[0] 2020/05/18 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://www.vbulletin.com/en/customer/account/login/?goto=aHR0cHM6Ly9tZW1iZXJzLnZidWxsZXRpbi5jb20vcGF0Y2hlcy5waHA%3D
https://zh-tw.tenable.com/blog/cve-2020-12720-vbulletin-urges-users-to-patch-undisclosed-security-vulnerability?tns_redirect=true
https://zh-tw.tenable.com/blog/cve-2020-12720-vbulletin-urges-users-to-patch-undisclosed-security-vulnerability?tns_redirect=true
GPOで設定した値をコマンドライン（PowerShell）で確認する

#背景
複数のGPOで同一の設定項目の内容を調べる際に、GUI操作（画面遷移）が面倒だったので、コマンドライン上で比較できれば効率的かなと思い、調べてみました。
※とはいえ、あんまりPowershellはそこまで詳しくないので、ポチポチ叩いてたらうまくいった（うまくいってしまった）
#GPOで設定した値をコマンドライン（PowerShell）で確認する。
##GPOをXMLファイルに出力する。
GroupPolicyをpowershellにインポート後、
get-GPOReportを使って、対象のGPOをXMLファイルに出力する。

```powershell:powershell
> Import-Module GroupPolicy
> Get-GPOReport -name "GPO名" -reportType XML -path "出力ファイル名"
```

##前段で出力したXMLファイルを読み込み、標準出力させる。
Get-Contentを使って、変数XMLにXMLファイルを代入する。
あとは、変数XMLから適宜値をポチポチ叩いていき、欲しい値を探す。

```powershell:powershell
#XMLファイルを＄XMLに代入する。
> $XML = [xml](Get-Content "出力ファイル名")

#コンピュータの構成であれば
> $XML.GPO.Computer.~~~

#ユーザーの構成であれば
> $XML.GPO.User.~~~

```

##Policyとか、同一階層に複数ある場合
どうやら、階層を「.(ドット)」で区切ってあげると、配下の構成が参照できるようで。
しかしながら、policyより下の階層を参照しようとしたら、標準出力が出なくなってしまった。

どうやら、Policyが同一階層に複数存在する時は添字をつけてあげないと、うまく見れないようです。
まぁ、機械からすれば、判定できないから当然そうだよね笑

```powershell:powershell
#Policyが一つしかない時は添字がなくてもOK
> $XML.GPO.Computer. (〜省略〜).Policy.~~~
#同一階層にPolicyが複数ある時は添字をつけてあげると、うまく読み込んでくれます。ないと標準出力なし。
> $XML.GPO.Computer. (〜省略〜).Policy[0].~~~
```

#標準出力した値をGrepする
Where-Obbjectでパイプしてあげるといい感じ。

```powershell:powershell
> $XML.GPO.Computer. (〜省略〜).Policy[0].ListBox.Value.Element |
                                           where {$_.data -like "*検索文字列*"}
```

##最後に
なんかいいメモないかなと考えてて、よくみるQiitaで試しに書いてみようと思ったら、思いの外、自分のメモ用としては十分みやすく書けるなと思いました。

#参考にさせていただいたサイト
https://activedirectorymania.vamdemicsystem.black/get-gporeport/
Quickly understand FTTx / FTTC / FTTB / FTTH

What is FTTx?
FTTx is "Fiber To The x", which is a general term for various fiber-optic communication networks. X based on the location of the fiber's termination point. Such as x = H (Fiber to the Home), x = O (Fiber to the Office) , x = B (Fiber to the Building). The FTTx technology ranges from the central office equipment to the user terminal equipment, including OLT (Optical Line Terminal), ONU (Optical Network Unit), ONT (Optical Network Terminal).

Depending on the install location of the ONU at the user end of the optical network unit, there are many types of FTTx, which can be divided into fiber to Cabinet (FTTCab), fiber to curb (FTTC), fiber to building (FTTB), fiber to the home (FTTH), fiber to the office (FTTO) and other service forms. US operator Verizon refers to FTTB and FTTH as fiber-to-the-station (FTTP).

![115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/24f7f583-5da9-90a9-de72-6d311d6a5611.jpeg)

FTTCab (Fiber To The Cabinet)
The traditional electric cable is replaced by optical fiber. The ONU is placed at the cabinet. The ONU below uses copper wire or other media to connect to the user.

FTTC (Fiber To The Curb)
Optical cables will be used from the central office to roadsides within a thousand feet of home or offices. Generally, a potential broadband transmission link that is very close to the user is laid first. Once there is a need for broadband services, the fiber can be quickly led to the user and the fiber can be brought home.

FTTB (Fiber To The Building)
It is a broadband access method based on optimized optical fiber network technology, which uses fiber to the building and network cable to the home to achieve the user's broadband access. Generally, dedicated line access is adopted, which is easy to install and can provide a maximum upstream and downstream rate of 10Mbps (exclusive).

FTTH (Fiber To The Home)
FTTH is a type of optical access network application that is closest to the user except the FTTD(Fiber to the Desktop) by installing the ONU in home or business users. PON technology has become a hotspot of global broadband operators, and is considered to be one of the best technical solutions to achieve FTTH.

FTTP (Fiber To The Premise)
FTTP is a North American term. It includes FTTB, FTTC, and FTTH in a narrow sense, and extends optical fiber cables to homes or enterprises.

![117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/e98b1e60-c309-3972-736e-675351f0041b.jpeg)

HYC Co., Ltd（HYC）is a leading passive optical devices OEM ODM manufacturer engaged in R&D, manufacture, and marketing of fiber optical products. Providing professional products and services for fiber connectivity, WDM, PLC splitter, and high-density datacom cabling. HYC products and solutions widely applied in 4G/5G, Data Center and Cloud Computing industry, etc.
www.hyc-system.com
[iOS] UIWebView APIが含まれているライブラリを調べる方法

# 前置き

本記事執筆時点の2020年5月現在、
新規アプリはUIWebView APIが含まれているとすでに受付停止されており、
**アップデートは2020年12月から受付停止です。**

参考リンク：
[[iOS] UIWebViewがいよいよヤバいらしい（"ITMS-90809: Deprecated API Usage"メールが届いた件）](https://qiita.com/y-some/items/1f9baeedd160f2d0fcbb)
[[速報] [iOS] UIWebViewが使えなくなる最終期限が告知されました](https://qiita.com/y-some/items/060492caa8a74db8107a)

使用ライブラリの中にUIWebView APIが含まれているかどうかの調査、
特に、手動で導入しているサードパーティ製ライブラリ（すなわちGitHub等でPublicな情報が出ていないもの）の調査は少々面倒かと思います。

以下、私たちのチームでUIWebView APIが含まれているライブラリを調査した方法をシェアします

# 本題

**Macのターミナルで、以下のコマンドを実行**

`nm {ライブラリ導入フォルダ}/{ライブラリ名}.framwork/{ライブラリ名} | grep UIWeb`
および（または）
`nm {ライブラリ導入フォルダ}/{ライブラリ名}.a | grep UIWeb`

そうすると、該当ライブラリのシンボル内にUIWebViewに関連する箇所がある場合には以下の様に出力されます。

> U _OBJC_CLASS_$_UIWebView

UIWebView APIが含まれていなければ、何も出力されません。

以上、簡単ですが、これから同様の調査をされる方に、何かの参考になればと思います。
【初心者向けハンズオン】kaggleの「住宅価格を予測する」を1行ずつ読み解く（第1回：データの読み込み）

# お題
　サービスで不動産系システムを運用している仕事柄、これは現場レベルでハンズオンやっておいて損はないというお話が勃発。そんなわけで、有名なお題であるkaggleの「House Price」問題にみんなでチャレンジしていくことに。そんでこれは多分ちゃんとメモしておけば、後々のためになるだろうということで、1行ずつ読み解いて行った内容をqiitaに投稿することにしました。解説というよりはメモのまとめだったりもしますが、どこかの誰かのためになれば幸いです。

* 元々のお題：https://www.kaggle.com/c/house-prices-advanced-regression-techniques
* 参考にした記事：https://yolo-kiyoshi.com/2018/12/17/post-1003/

# 本日の作業

## ライブラリの準備

　各ライブラリの説明については、作業で使用した段階で１つずつ述べていこうと思うので、一旦は呪文としてこちらをコピペしました。

```
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import (
    LinearRegression,
    Ridge,
    Lasso
)
%matplotlib inline
```

## データの取り込み

　ここからが実作業。まずは使用するCSVファイルの読み込みと整形から。とりあえずこちらをコピペ。１つずつ解説。

```
# データの読み込み
train = pd.read_csv('train.csv') #訓練データ
test = pd.read_csv('test.csv') #テストデータ
# 学習データとテストデータのマージ
train['WhatIsData'] = 'Train'
test['WhatIsData'] = 'Test'
test['SalePrice'] = 9999999999
alldata = pd.concat([train,test],axis=0).reset_index(drop=True)
print('The size of train is : ' + str(train.shape))
print('The size of test is : ' + str(test.shape))
```

### CSVファイルの読み込み
* 該当ソース：`train = pd.read_csv('train.csv') #訓練データ`

* 説明：「import pandas as pd」でimportしたpandasを使って、CSVファイルを取り込み、変数「train」に格納。pandasは個人的な解釈としては、データを表計算的に簡単に処理するのに使う鉄板ライブラリ。

* 参考：https://dividable.net/programming/python-pandas/

### train変数の列に一律でデータ格納
* 該当ソース：`train['WhatIsData'] = 'Train'`
* 説明：testにあって、trainに無い項目「WhatIsData（test由来なのか、train由来なのかを見分けるための項目）」「SalePrice（testにはもともと無いデータ）」を入れる。

### testデータとtrainデータをガッちゃんする
* 該当ソース：`alldata = pd.concat([train,test],axis=0).reset_index(drop=True)`
* 説明：あとで使うまとめデータ、alldataを準備。
* concat：データを連結する。axisを特に指定しなければ、行追加っぽく連結する。
* concat参考：http://sinhrks.hatenablog.com/entry/2015/01/28/073327
* index：そもそもデータを取り扱うにあたっての基本知識。処理するのに勝手に割り振られる番号。reset_indexで使ってますね。
* index参考：https://techacademy.jp/magazine/24150

### 取り込んだデータの概要を表示
* 該当ソース：`print('The size of train is : ' + str(train.shape))`
* print：()内に入れた内容を画面表示する。
* .shape：配列の次元とか縦横とか、概要を出力する。
* .shape参考：http://www.kamishima.net/mlmpyja/nbayes2/shape.html

# おしまい。
本日はここまで。週１時間使ってまとめようと思うので、亀みたいなスピードですがご愛顧よろしくおねがいします。
Gataby  リンク　トランジションについて (メモ)

gatsby において、ページ遷移をする設定の仕方についてです.

詳しいことは、[公式ページ](https://www.gatsbyjs.org/docs/adding-page-transitions-with-plugin-transition-link/)にて載っています.

簡単なフェードトランジションです.

```Layout.js
import { TransitionState } from "gatsby-plugin-transition-link"
import posed from 'react-pose'

export const Fade = posed.div({
    hidden: { opacity: 0 },
    visible: { opacity: 1 },
  })

  <TransitionState>
                { ({mount}) => {

                return(
                <Fade
                    pose={
                        mount
                        ? 'visible'
                        : 'hidden'
                    }>
                     <main>{children} </main>
                </Fade>
                )} }
           </TransitionState>
```
[こちら](https://transitionlink.tylerbarnes.ca/docs/transitionstate/)によると、`mount`という値が、遷移ページペアのマウント状態を表すようです.

気になったのは `length` というオプションです.

```
exit={{
  length: 2
}}
entry={{
  length: 1
}}
```
[こちら](https://transitionlink.tylerbarnes.ca/docs/transitionlink/#page--template-props)の
`length option` によると、遷移したあとにトランジションリンクを押しても遷移しない時間の長さです.
遷移した後にアニメーションなどがかかる場合に有効かと思われます.

以上、参考になればなと思います !!
WindowsでDjangoが動かなかったとき

#Djangoサーバーがwindowsで起動しない。

**発生したエラー**

---
Traceback (most recent call last):
  File "manage.py", line 10, in main
ModuleNotFoundError: No module named 'django'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 12, in main
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?`

---

**行ったこと**
`pip install django`
`pip3 install django`
の二つを実行。
その後に
`python3 django runserver`

**結果**

---
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 18, 2020 - 11:53:23
Django version 3.0.6, using settings 'first.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.


---
原因はよくわかりませんが、とりあえず動きました。
GenexusのプロシージャをJavaクラスように複数メソッドに分けて記載する方法

GenexusのStubを使えば、プロシージャに複数メソッドが定義できる。

## RulesでのParm定義が使えなくなるですが、下記のように定義できる。

サンプルコード Utlity.stubファイル

```ruby:Utlity.stub
/************************************************/
//日付チェック

stub CheckDate(in:&date, out:&error)
    XXXXXXX:日付の有効チェック処理
EndStub

//桁数チェック
stub CheckLength(in:&value, out:&result)
   XXXXXXX:桁数の有効チェック処理
EndStub
/************************************************/
```

Webpanel、Procedureから呼び出す

```ruby:HogeWebPanel
/************************************************/
Event 'SearchBtn' 
    //日付チェック処理
    Utlity.CheckDate(&date, &error)
    If Not &error.isEmpty
       MSG(&error.ToString())
    EndIf
    
    //桁数チェック処理
    ........
EndEvent
/************************************************/
```
composerでrequireなどをするとインストールに失敗する

# 目的

- require時に発生するエラーを解決した話をまとめる

# 実施環境

- ハードウェア環境(下記の二つの環境で確認)

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# エラー内容

- laravel/uiをインストールしようと思い下記のコマンドを実行した。

    ```termianl
    $ composer require laravel/ui
    ```
- 下記の様なエラーが発生しインストールが失敗してしまった。

    ```terminal
    >Using version ^2.0 for laravel/ui
    >./composer.json has been updated
    >Loading composer repositories with package information
    >Updating dependencies (including require-dev)
    >Nothing to install or update
    >Generating optimized autoload files
    >> Illuminate\Foundation\ComposerScripts::postAutoloadDump
    >> @php artisan package:discover --ansi
    >Discovered Package: facade/ignition
    >Discovered Package: fideloper/proxy
    >Discovered Package: fruitcake/laravel-cors
    >Discovered Package: laravel/tinker
    >Discovered Package: laravel/ui
    >Discovered Package: nesbot/carbon
    >Discovered Package: nunomaduro/collision
    >Package manifest generated successfully.
    >10 packages you are using are looking for funding.
    >Use the `composer fund` command to find out more!

    >Installation failed, reverting ./composer.json to its original content.
    ```

# 原因

- すでにインストール済みのものをインストールしようとしてしまっていた。
- そもそも実行する必要のないコマンドを実行してエラーが出てしまっていた。
slackの通知音を変更する（Mac版slack・New UI）

# 背景
妻も私も自宅作業中で、家で仕事していると、slackでメンションされた時になる「スッコココ」音を聞いた上で、

「あれ、今どっちのslackに連絡きた？？？？」

ってなる問題が発生。

# 解決策
Slackの通知音「スッコココ」を変更してみることにした。

## やり方
下記の設定を変更すること
slack デスクトップアプリ左上 -> Preferences -> Notificationsから設定変更

<img width="776" alt="スクリーンショット 2020-05-18 11.54.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139011/cd50a675-7fb4-8938-4433-5af7203d4607.png">

## 最後に
こちら参考にしたけどできなかった。
キャッシュが残っていたのかな？
https://qiita.com/idacchi/items/5402c9eb04597aedee07
エアロバイクでストリートビュー進みたい！！ （その1）

## やりたいこと
エアロバイクしながらストリートビューでその場所に行った気になりたい。

### 背景
* 札幌なので、冬は自転車乗れないなー。運動したいなー。
で、エアロバイクを買って2年半。
こんなの。
![K0000788333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634480/df4ae070-88db-a2d0-ec96-3ed0ba877877.png)
ALINCO(アルインコ) コンフォートバイク AFB4309W 8段階負荷調節 折りたたみ機能付 アルインコ(Alinco) 
https://www.amazon.co.jp/dp/B00VHWRXYG/

* 「こころ旅」をみながら、いいなー。チャリオで行きたいなー。　あ、とりあえずストリートビュー見ながらエアロバイクこげばいいじゃん！　と気づく。

### 動機
エアロバイクは、TV兼PCモニターが正面にあるので、ストリートビューを開く。

* USBキーボードをエアロバイクのハンドルに置き、進むたびに↑↑を連打。
　→なんか、カーソルキーしか使わないのにジャマ。
* ころがっていたWiiコントローラー&ヌンチャクをBluetoothでPCに接続。ヌンチャクで↑↑で進む。
　→やっぱり、こいだら前に進ませたい。

と悩んでいたところ、

@ie4　さんの記事を見つけた！　これはすごい。　やってみよー。
https://qiita.com/ie4/items/130308793444bd98179f

## 機能

[前提]
・エアロバイクの機能はこわさない
・GoogleMapのAPIはつかわない。履歴とか特にいいや。
　→エアロバイクをこぐと、ストリートビューが前に進むことだけ。
　→1こぎxxメートルとかの距離はあんまり気にしない。風景がみれればOK。
　となると、↓だけあればいいんだな。
* エアロバイクをこぐと、キーボードの上が入力される

左右に曲がるのは、とりあえずヌンチャク利用を継続だ。

## 構成
これらを用意した。はじめてのArduinoだー。わくわく。

* Arduino Leonardo 的な、HID キーボードになるArduino
* 100均のステレオコード分岐
* 100均のステレオ延長コード

で、

* ステレオ延長コードをぶちっと切り、コードをArduinoに挿せるように加工
　→ひさしぶりのはんだ付け。
* エアロバイクの本体とモニターの間のコード連結に、ステレオコード分岐をかます
![Up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634480/f401aa1a-41c8-cd75-fa2f-f613905101d0.png)

* ステレオコード分岐から、加工した延長コードをつなぐ
* ArduinoのGNDとDigital2 に、LとRをつなぐ

## スケッチ
Arduino Leonardoにスケッチを書き込む。

```c:
#include <Keyboard.h>

int BUTTON = 2;
int HighLow = LOW;

void setup() {
  pinMode(BUTTON, INPUT_PULLUP); //default High
  Keyboard.begin();
}

void loop() {
    HighLow = digitalRead(BUTTON);
  if (HighLow == LOW) {

    Keyboard.press(KEY_UP_ARROW);
    Keyboard.releaseAll();
    delay(400);
  }
}
```

## 動作確認
動いたー！
ぐるぐるすると、進むぞ進むぞ。

行ってみて楽しかったところ

* 久慈→小袖海岸 あまちゃん好きとしては欠かせない
* 青島　ねこだらけ
* 大久野島　うさぎだらけ

## 参考

【フィットネスバイク】のインターネットを作る！！
 https://qiita.com/ie4/items/130308793444bd98179f
　※この記事があればこそ、今回できました！

DENKOのアヤしいお部屋。
https://ht-deko.com/
　※Arduino、何を選ぶか勉強させていただきました！

## 最後に
次は左右を、スイッチ化してArduinoにつなぎたいかなー。
でも、作っちゃうと、それで安心して、エアロバイクに乗る頻度が減ってるのは気のせいかなぁ。。

※エアロバイクって、商標かー。
フィットネスバイク？　コンフォートバイク？
一般的には、やっぱエアロバイクだよなぁ。。