OmniAICreator/Qiita-1.07M huggingface dataset:
Prolific PL-2303を使ったUSBケーブルについて

#Win10で、Prolific PL-2303が認識しない、動作がおかしいとき
コード10がでてデバイスが認識しない時は、USB-Serialとして使っているICのPL-2303がパチモンであることが原因のようです。
格安ハンディ機UR-5Rの送信周波数を日本の規格に合わせようと買ったケーブルが使えないので、
おかしいなと思って調べたら、以下のURLがヒットしました。

[Prolific PL-2303が認識しない、それは偽物かもしれない]
(https://www.srchack.org/article.php?story=20170514235641544)


偽物ケーブルを差し込んだ場合でも、Windows10はProlificのICとして正しく認識して、最新のデバイスドライバーを正しくインストールしてくれます。OSとしては、正しく動作します。
ただし、3.2以上のバージョンだと偽物ケーブルが動作しないようになっているようです。
今回、これにハマりました。
下のURLにはそれを回避するために、デバイスドライバのバージョンを下げる方法が書いてあります。
[Family Software Newsletter #37 - (Updated 04/09/2018)](http://www.ifamilysoftware.com/news37.html)

買ったケーブル[はこれ](https://www.amazon.co.jp/Baofeng-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-BAOFENG-UV-5R-BF-888S%E3%81%AB%E5%AF%BE%E5%BF%9C%EF%BC%81-64%E3%83%93%E3%83%83%E3%83%88%E3%81%AEWIN7%E3%81%AB%E3%82%82%E5%AF%BE%E5%BF%9C%E5%8F%AF%E8%83%BD/dp/B00CP0I474/ref=pd_lpo_107_t_0/357-6059696-2734412?_encoding=UTF8&pd_rd_i=B00CP0I474&pd_rd_r=b8fac621-5385-4f43-82ef-13aad6947140&pd_rd_w=FNqBZ&pd_rd_wg=qrWZi&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=Y37YK4SZ5FZ8A3JY6W8F&psc=1&refRID=Y37YK4SZ5FZ8A3JY6W8F)
でも、なんかめんどくさい。セキュリティ的にもよくないし。　

ケーブル買い換えようかな。
mojaloopの主なリポジトリ

# mojaloopのGitHubリポジトリは数が多い
- mojaloopの[GitHubリポジトリ](https://github.com/mojaloop)には、60個以上のリポジトリがあり、中には古い物が残されていたりします。
- 見るべきリポジトリは以下です。


# はじめに／ドキュメント／Issueトラッカー
- [mojaloop](https://github.com/mojaloop/mojaloop)リポジトリ
    - プロジェクトの概要
    - contributeフォルダにドキュメントあり。

- [docs](https://github.com/mojaloop/docs)リポジトリ
    - ドキュメント一式
    - [目次付きのドキュメント](https://docs.mojaloop.live/)と重複しているが、内容は大体同じぽい。
- [project](https://github.com/mojaloop/project/issues)リポジトリ
    - Issueトラッカー
    - Kanban形式で表示するには、[Zenhub Browser Extension](https://www.zenhub.com/extension)が必要。
        - スプリントで「Sprint 5.4 for the Mojaloop Open Source work items, part of Phase-3 PI-5」とか付けられてるが、詳細は要調査。


- [mojaloop-specification](https://github.com/mojaloop/mojaloop-specification)リポジトリ
    - 全体のAPI仕様書。PDFファイルが置いてある。

# Mojaloop Core Components (詳細は要調査)
- [Mojaloop Core Components](https://github.com/mojaloop/mojaloop/blob/master/contribute/MojaloopCoreDocumentCatalog.md)のドキュメントにあったリスト。16個。


    - [central-directory](https://github.com/mojaloop/central-directory)
        - DFSPが自分のアドレスを登録したりする。
    - [central-end-user-registry](#central-end-user-registry)
    - [central-event-processor](#central-event-processor)
    - [central-kms](#central-kms)
    - [central-ledger](#central-ledger)
    - [central-services-auth](#central-services-auth)
    - [central-services-database](#central-services-database)
    - [central-services-error-handling](#central-services-error-handling)
    - [central-services-shared](#central-services-shared)
    - [central-settlement](#central-settlement)
    - [email-notifier](#email-notifier)
    - [forensic-logging-sidecar](#forensic-logging-sidecar)
    - [interop-switch](#interop-switch)
    - [mock-pathfinder](#mock-pathfinder)
    - [ml-api-adapter](#ml-api-adapter)
    - [ntpd](#ntpd)
Chrome拡張 JetBrains Toolbox Extension、Windowsでの設定方法

#JetBrains Toolbox Extension
こちらにある、バージョン管理サイトとJetbrainsのツール群をつなげるChrome拡張。
https://chrome.google.com/webstore/detail/jetbrains-toolbox-extensi/offnedcbhjldheanlbojaefbfbllddna
すごく便利そうです。これから使っていきます。

## GitHubと連携するまでの設定手順
1. 公開鍵・秘密鍵ファイルを作成する
    - https://qiita.com/digdagdag/items/9e5c061e7d86e0af9a57
2. Githubに公開鍵登録
    - https://qiita.com/shizuma/items/2b2f873a0034839e47ce
3. Windows、ssh-key agent サービスの立ち上げ　秘密鍵の登録
    - https://qiita.com/q1701/items/3cdc2d7ef7a3539f351d
       
Jetbrainsツールの設定ではなく、Windowsの設定であります。
hashlibのハッシュ

```py
import base64
import os
import hashlib

#print(hashlib.sha256(b'password').hexdigest())

user_name = 'user1'
user_pass = 'password'
db = {}

salt = base64.b64encode(os.urandom(32))

def get_digest(password):
    password = bytes(password, 'utf-8')
    digest = hashlib.sha256(salt + password).hexdigest()
    for _ in range(10000):
        digest = hashlib.sha256(bytes(digest, 'utf-8')).hexdigest()
        print(digest)
    print(digest)
    return digest

#上記関数を下記で置き換えることもできる
#digest = hashlib.pbkdf2_hmac('sha256', bytes(user_pass, 'utf-8'), salt, 10000)

db[user_name] = get_digest(user_pass)

def is_login(user_name, password):
    return get_digest(password) == db[user_name]

print(is_login(user_name, user_pass))
```
Rでモードを表すテンプレート

###### tags: `rBasicLearning`
##  1. テンプレート
```r
mode <- function(a){
  h1 <- hist(a,
             breaks = max(a)-1)
  Mode <- which.max(h1$counts)
  
  return(c(Mode))
}
```
##  2. 具体例
###  使うデータ
```r
data <- c(1, 1, 1, 1, 2, 3, 4, 5, 16, 20)
```
###  出力
```r
mode(data)
```
```
> mode(data)
[1] 1
```
windows10(WSL2)でRailsの環境構築をしてみた (2) ~Rails導入/起動編~

#はじめに
[前回記事](https://qiita.com/yoshige/items/7a17bb7a3582d72a7e48)にてWSL2の導入ができましたが、今回はWSL2を用いて実際にUbuntu 18.04に環境を構築していきます。

#Ruby(Rails)導入
@ksh-fthr さんの以下記事を参考にしました。
[Windows10 で WSL を使って Rails 環境を構築したときのメモ](https://qiita.com/ksh-fthr/items/64a4e86c8bad08322c94)
見出し`Rails 環境を構築しよう`の`1~8`を実施してください。

今回しようとしているのは上記の記事と若干違うので、以下の点だけ異なっています。
・`Ruby 2.6.6`を導入
・sqlite3ではなくmysqlを導入するので`7.sqliteを入れよう`は実施不要

#WebPackerの導入
`rails6`から`Webpacker`が必須となり、Webpackerを入れないと、Railsアプリ作成の際にエラーが出てしまいます。
`Ubuntu 18.04 LST` にて以下コマンドを実行してください。

まず、`Webpacekr`をインストールするための`yarn`をインストールします。
単純に`apt-get install yarn`だけだとバージョンが古くてWebpackerをインストールできなかったので、以下コマンドでバージョンの新しいyarnを入れます。

```Ubuntu18.04
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install yarn
```

本命のWebpackerを導入します。

```Ubuntu18.04
rails webpacker:install
```

#mysqlの導入
今回はsqliteの代わりに`mysql`を導入します。
`Ubuntu 18.04 LST` にて以下コマンドを実行してください。

mysqlの導入

```Ubuntu18.04
sudo apt-get install mysql-server mysql-client
```

mysqlのバージョン確認

```Ubuntu18.04
実行コマンド
mysql --version
実行結果
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper
```

バージョンが表示されれば導入完了です。

`mysql`にはデフォルトで`root`ユーザが用意されていますが、これをrails上で使用するとすると、権限の問題で弾かれてしまいます。
root以外のユーザを作成し、きちんと権限も与えてあげましょう。
以下、コマンド例になります。

ユーザ作成例(rootで実行)

```mysql
CREATE USER railsuser@'localuser' IDENTIFIED BY '******(パスワード)'
```

権限付与例(rootで実行)

```mysql
GRANT ALL ON *.* TO railsuser@'localuser';
```


#Atom導入
今回はエディターとして`Atom`を利用します。
`Ubuntu 18.04 LST` にて以下コマンドを実行してください。

```Ubuntu18.04
sudo add-apt-repository ppa:webupd8team/atom
sudo 
sudo apt-get install atom
```

以下コマンドを実行すると、Atom がGUIで立ち上がってきます。

```Ubuntu18.04
atom
```

##### 2020/5/30 追記
WSL2で開発するならVScodeの方が互換性が強く、こちらを使わない理由はないです。
ここで言っていることは無視して、おとなしくVScodeを導入してください(^^;

#Rails サーバ起動
`Ubuntu 18.04 LST`上でRailsサーバを起動していきます。

###1. アプリ作成
新しいアプリ作成します。

```Ubuntu18.04
rails new sample -d mysql
cd sample
```

###2. mysql設定ファイル編集
`/config/database.yml`にmysqlのログイン情報を記載します。

```database.yml
# MySQL. Versions 5.5.8 and up are supported. 
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html
#
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: railsuser
password: ******(パスワード)
socket: /var/run/mysqld/mysqld.sock
```
`username`と`password`をmysql導入時に設定した内容にしてください。

また、テスト・開発・本番用のDBはあらかじめmysqlにて作成しておいてください。


###3. サーバ起動
サーバを起動します。

```Ubuntu18.04
rails s
```

ブラウザにて`localhost:3000`に接続して以下画面が表示されたら成功です。
<img width="613" alt="2020-04-26 (6).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626975/8ce1b32e-8061-6c65-c7aa-bd5a08186176.png">
.NET 5.0 移行準備

# はじめに
最新動向のチェックとノウハウの情報収集を兼ねて
　※以前も同じことやっていたなぁ～って懐かしくなってきた

# 最新動向(Update：2020/04/26)
◆.NET 公式サイト
　https://dotnet.microsoft.com/
　　※今は「.NET 5.0.0-preview.3」がダウンロード可能！！

◆kledgeb: .NET Core
　https://kledgeb.blogspot.com/search/label/.NET%20Core
　　※リリースの詳細を解説してくれているので要チェック！！

◆「開発ツール / 言語 / プログラミング」カテゴリの記事一覧
　https://www.publickey1.jp/tool-ide-programming/


# サポート関連
※サポート期間関連はこのサイトがわかりやすい！！
◆.NET Framework のバージョンおよび依存関係
　https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/versions-and-dependencies


# 移行ノウハウ
◆移行・マイグレーション
　https://techinfoofmicrosofttech.osscons.jp/index.php?%E7%A7%BB%E8%A1%8C%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
　　※ここベースに必要に応じて拡張...だね

## チェックポイント


# 関連ツール
◆.NET Portability Analyzer
　https://docs.microsoft.com/ja-jp/dotnet/standard/analyzers/portability-analyzer

◆.NET API アナライザー
　https://docs.microsoft.com/ja-jp/dotnet/standard/analyzers/api-analyzer

◆.NET Framework Analyzer
　https://docs.microsoft.com/ja-jp/dotnet/standard/analyzers/framework-analyzer
　　※これだけちょっと今回の意味合いと違うが一応。。。


# 参考サイト
※とりあえず貼り付け＆一言コメント（必要に応じて分類しないと...）

◆.NET Coreへの移植
　https://ufcpp.net/blog/2016/2/porting-to-net-core/
　　※この方のサイトは昔からよく見てた

◆第6回：Hello！ .NET 5 
　https://www.system-exe.co.jp/swarchitecture06/

◆ASP.NET 5、.NET Core への移行作業をしてみた感想
　https://qiita.com/yniji/items/958af200fed9c7bd60ee

◆.NET Framework終わる
　https://www.excellence-blog.com/2019/10/31/net-framework終わる/

◆.NET Core 3.0 をもって .NET Framework からの移植作業は完結
　https://ufcpp.net/blog/2019/10/netcore3concludesfxporting/

◆EF6 から EF Core へ移植
　https://docs.microsoft.com/ja-jp/ef/efcore-and-ef6/porting/

◆サーバー アプリ用 .NET Core と .NET Framework の選択
　https://docs.microsoft.com/ja-jp/dotnet/standard/choosing-core-framework-server

◆.NET Standardへの移行
　https://techinfoofmicrosofttech.osscons.jp/index.php?.NET%20Standard%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C

◆.NET の過去、現在、そして未来 
　https://www.slideshare.net/chack411/net-226647512?next_slideshow=1
　　★☆★

◆Docker コンテナー用 .NET Framework を選択するタイミング
　https://docs.microsoft.com/ja-jp/dotnet/architecture/microservices/net-core-net-framework-containers/net-framework-container-scenarios

◆Entity Framework 6
　https://docs.microsoft.com/ja-jp/ef/ef6/
　　★☆★一通りチェックしておいた方が良いかも
【今日Javascriptを始めた人向け2】変数の更新

[【今日Javascriptを始めた人向け１】](https://qiita.com/TOMARU4400/items/54bf0369b6fe476cf78f)の続きです。


変数に値を再代入すれば変数の値の更新が出来ます。

【例】


```Javascript:sample.js
let hoge = 3;
console.log(hoge);
hoge = 5;
console.log(hoge);
```


こちらの実行結果は

```:実行結果
3
5

```

となります。3行目の

```Javascript:
hoge = 5;
```

hoge = 5;の記述部分で値が5に更新されています。

代入は何回でも行えますが変数の値は**直前に代入した値**になります。なので変数を使用する際は直前に代入した値を把握しておきましょう。
【Unity】繰り返しアニメーションさせるだけのコンポーネント

# 経緯
Unityで2Dゲームを作る際、繰り返しアニメーションをするだけのオブジェクトや、アニメーションが終わったら消滅するだけのオブジェクトを配置する事はよくありますが、一つひとつUnity標準のAnimatorControllerを使っていてはキリがありません。そこで、**繰り返しアニメーションさせるだけのコンポーネント**を実装しました。

# 実装
「SpriteAnimation」というスクリプトを作成し、下記をコピペして使用できます。

```C#:SpriteAnimation.cs
using System.Collections.Generic;
using UnityEngine;
using System;

public class SpriteAnimation : MonoBehaviour
{
    [SerializeField]
    SpriteRenderer spriteRenderer;
    [SerializeField]
    List<Sprite> sprites;
    [SerializeField]
    bool loop, destroy;
    [SerializeField]
    float second;

    int count;
    float time;

    void Start()
    {
        spriteRenderer.sprite = sprites[0];
    }

    void Update()
    {
        time += Time.deltaTime;
        if (time > second)
        {
            time -= second;
            count++;
            spriteRenderer.sprite = sprites[count];

            if (count < sprites.Count - 1) return;
            if (loop) count = -1;
            else if (destroy) Destroy(gameObject);
            else disposable.Dispose();
        }
    }
}
```

# インスペクター上の項目説明

* SpriteRenderer : アニメーションさせるSpriteRendererをアタッチ
* Sprites : アニメーションに使用するSpriteを順番にアタッチ
* Loop : Loopさせる場合はチェック
* Destroy : アニメーションの終了後に破壊するならチェック
* Second : アニメーションの速度

# UniRX版
こっちの方が低負荷

```C#:SpriteAnimation.cs
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;

public class SpriteAnimation : MonoBehaviour
{
    [SerializeField]
    SpriteRenderer spriteRenderer;
    [SerializeField]
    List<Sprite> sprites;
    [SerializeField]
    bool loop, destroy;
    [SerializeField]
    float second;

    int count;
    IDisposable disposable;

    void Start()
    {
        spriteRenderer.sprite = sprites[0];

        disposable = Observable.Interval(TimeSpan.FromSeconds(second))
        .Subscribe(_=>
        {
            count++;
            spriteRenderer.sprite = sprites[count];
            
            if (count < sprites.Count - 1) return;
            if (loop) count = -1;
            else if (destroy) Destroy(gameObject);
            else disposable.Dispose();

        }).AddTo(this);
    }
}
```
【今日Javascriptを始めた人向け1】変数の宣言


変数は、値を格納する『箱』のようなもので、使用する際は変数を宣言する必要があります。
変数の宣言は以下のように宣言します。

```Javascript:sample.js

let 変数名;

```
【例】

```Javascript:sample.js

let hoge;       //let hoge;で変数hogeが宣言できます。

```



変数に値を格納することを代入と言います。代入には= を使います。

```Javascript:sample.js
hoge = 3;  //hoge = 3;でhogeに3を代入できます。
```

代入した値を使用するには変数名をそのまま記述します。
以下は変数hogeを宣言し使用した例です。



```Javascript:sample.js

let hoge = 3;
console.log(hoge);

```

```Javascript:実行結果
3
```
console.log(hoge);とするとhogeは3に置き換わります。
結果的には、console.log(3);が実行されるため、3が表示されます。


宣言と代入を同時に行うことも出来、記述は以下のようになります。


```Javascript:sample.js

let 変数名 = 代入する値;

```


基本的には宣言と代入は同時に行うため、通常こちらの書き方を使用します。


```javascript:sample.js

let hoge = 3; //これで変数hogeの宣言と値3の代入が行われます。

```
pycryptoの暗号化と復号化

```py
import string
import random

#pip install pycrypto
from Crypto.Cipher import AES


key = ''.join(
    random.choice(string.ascii_letters) for _ in range(AES.block_size)) #内包表記

iv = ''.join(
    random.choice(string.ascii_letters) for _ in range(AES.block_size)) #内包表記

plaintext = 'fdsfsdgsgsfgs'
cipher = AES.new(key, AES.MODE_CBC, iv)
padding_length = AES.block_size - len(plaintext) % AES.block_size #paddingする文字列の長さを計算
plaintext += chr(padding_length) * padding_length #paddingする
cipher_text = cipher.encrypt(plaintext) #暗号化
print(cipher_text)

cipher2 = AES.new(key, AES.MODE_CBC, iv)
decrypted_text = cipher2.decrypt(cipher_text) #復号化
print(decrypted_text[:-decrypted_text[-1]]) #paddingした文字列を取り除いて表示
```

```txt
b'\xba\xb5\xf6\x0f\x87\xe0N\xa1?I\xf6O\x1d\x96]\x88'
b'fdsfsdgsgsfgs'
```
MacのLaunchpadをカスタマイズ・整理する

## はじめに
お久しぶりです。今回はMacでめちゃめちゃ使う **Launchpad** のカスタマイズについてメモ程度に書いていきたいと思います。非常に簡単です。笑

前置きなんかいらないよ！って方は<font color='blue'>やり方</font>までスキップしちゃってください！

# Launchpad とは？
Macを使っていても **Launchpad** ってなに？ってなる方も多いと思います。**Launchpad** とはトラックパッド上で親指と3本指で広げると切り替わるやつです。アプリケーションからも起動可能ですよ！
![画面収録-2020-04-26-5.01.28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/50146a92-eafd-0e9c-35da-cdd2776e7836.gif)
デフォルトでは縦7横5になっていると思います。
<img width="2048" alt="スクリーンショット 2020-04-26 5.09.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/7c270330-894f-9b1b-f125-94f39c800a83.png">

## やり方
###  縦に表示する数の変更
```terminal
$ defaults write com.apple.dock springboard-rows -int y
```
y の部分に任意の数字を入れます
### 横に表示する数の変更
```terminal
$ defaults write com.apple.dock springboard-columns -int x
```
x の部分に任意の数字を入れます

### 変更の反映
```terminal
$ killall Dock
```
以上の手順で変更することができます。私の場合は縦横ともに2つずつ増やして利用しています。

<img width="2048" alt="スクリーンショット 2020-04-26 5.35.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/4fa21402-1998-c547-4eb4-5ada2793873f.png">

## おまけ
```terminal
$ defaults write com.apple.dock ResetLaunchPad -bool TRUE; killall Dock
```
これを入力することで1ページ目はネーティブのアプリケーション、2ページ目以降は追加したアプリケーションに整理してくれます。<font color='red'>が！</font>実行すると順番も変わってしまうので注意です。順番を変えて整理する前に実行しましょう。

これで今回の記事は終わりです。<strong>最後までご覧いただきありがとうございました！</strong>
windows10(WSL2)でRailsの環境構築をしてみた (1) ~WSL2導入編~

#はじめに
web開発に関してはmacユーザが多いと思いますが、windowsでも WSL( Windows Subsystem for Linux) なるものでLinuxでのRails開発環境をある程度整えることができました。
備忘として残そうと思います。

| 環境                                    
| ---------------------------
| Windows 10 Home 64bit       

また、今回導入したものは以下となります。

| 導入したもの                                    
| ---------------------------
| Ruby 2.6.6
|Rails 6.0.2.2
|mysql for linux 14.14
|Atom 1.45.0  

#WSLを導入する
WSLの導入には@yoshigeさんの以下記事が非常に参考になりました。

まずは、以下の記事を参考にWSL1を導入し、初期設定まで済ませます。
Microsoft StoreでLinuxのディストリビューションを選んで導入することになるが、自分はUbuntu 18.04 LTS を導入しました。
[初心者のためのWSL( 1 ) ~初期設定,CUI設定編~](https://qiita.com/yoshige/items/dbc85b048fba51e597ee)

GUIも使えた方が便利なので、以下記事を参考にGUI設定まで済ませます。
[初心者のためのWSL( 2 ) ~GUI設定,デスクトップ環境設定編~](https://qiita.com/yoshige/items/7a17bb7a3582d72a7e48)


#WSL2を導入する
WSL2の導入は少し複雑です。

###1. Windows10 Insider Preview に登録 ⇒　ビルド更新
WSL2はビルドが`18917`以上でないと導入できません。

以下URLの手順に沿ってWindows10 Insider Preview に登録しビルドを更新してください。
https://insider.windows.com/ja-jp/getting-started/#register

###2. ビルドを確認する
`設定` ⇒ `システム` ⇒ `バージョン情報`でOSビルド欄をみて、`18917`以上であることを確認してください。

###3. 仮想マシン有効化
以下コマンドを管理者権限のPowerShellで実行し、再起動してください。

```powershell
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
```

###4. WSL2へ切り替え
以下、コマンドを管理者権限のPowerShellで実行してください。
ビルドが`18917`以上でないと、以下コマンドは実行できません。

現在のWSLバージョンを確認する

```powershell
　実行コマンド
　wsl -l -v
　出力結果
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1
```

WSLバージョンを2へ切り替える(結構時間がかかるかもしれません)

```powershell
wsl --set-version Ubuntu 2
```

切り替え後のバージョンを確認する

```powershell
　実行コマンド
　wsl -l -v
　出力結果
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         2
```

WSLのバージョンが「2」になっていることを確認出来たらWSL2の導入は完了です。

#WSL2へ切り替えた後の設定
###1. .bash_profileを編集
WSL2に切り替えた後だと、ターミナル立ち上げの際に`.bashrc`を読み込んでくれない仕様になっているようです。

参考
[WindowsTerminalやPowerShellからWSL2を実行した際に~/.bashrcが読み込まれない](https://qiita.com/ozroro/items/0baac26be01ee5ab41d6)

自分は`.bash_profile`に以下を追加することで回避しました。

```
if [[ -f ~/.bashrc ]] ; then
　　~/.bashrc
fi   
```

###3. GUI設定の変更
WSL2はWSLと違い、仮想マシン上でLinuxを動作させています。

参考
https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html

なのでWSLと違い、window環境 ⇔ Linux環境のIPアドレスが別々に扱われます。

以下、windowsのコマンドラインでipconfigを実行した例になります。

```コマンドライン
Wireless LAN adapter Wi-Fi:

   IPv4 アドレス . . . . . . . . . . . .: xxx.xxx.xxx.xxx
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: xxx.xxx.xxx.1

イーサネット アダプター vEthernet (WSL):

   IPv4 アドレス . . . . . . . . . . . .: yyy.yyy.yyy.yyy
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .: yyy.yyy.yyy.1

```

新しく`イーサネット アダプター vEthernet (WSL)`が追加されていることがわかります。
IPが起動するたびに変更されるので、Xlaunchの待受け先もそれに伴い修正する必要があります。

GUI設定にて.bashrcに`export DISPLAY=localhost:0`と記載していた部分を以下のように修正します。

```
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0 
```

これで、IPアドレスが変更されても、設定しなおすことなくGUIが立ち上がります。

###ビープ音を止める
デフォルトではビープ音が鳴る設定になっており、これがうるさいので鳴らない用に設定していきます。

`ubuntu18.04` で以下コマンドを実行

```
vi /etc/inputrc
```

以下行のコメントアウトを削除し、設定を有効化します。

```
set bell-style none
```

これで設定完了です。
LaravelからJavaScriptに配列変数を引き渡す方法

Laravelで、コントローラから受け渡した配列変数をJavaScriptに渡す方法。

普通に、

const data = '{{json_encode($data)}}';
console.log(data);

のように渡すとダブルコーテーションが&quotのような文字になってしまう。

調べると、

https://qiita.com/azumagoro/items/51a884eb9840b08a29ee

JSON_UNESCAPED_UNICODEを、json_encodeの第二引数に入れてunicode文字列にされることを防ぎ。
!!で囲って、&quotにされることを防げるという。

そして、Laravel5.5以降は、@json()というbladeテンプレート用の関数で簡単にできるという。

const data = @json($data);

という書き方が結論のようにも思いましたが、今後外部ファイル化した時に、このことを忘れてはまる原因になりそうでしたので、一度は基本でやるということで、

const data = {!!json_encode($data, JSON_UNESCAPED_UNICODE)!!}

で対応しました。
HerokuでのデプロイでPrecompiling assets failed.が出たときの対処法

初めてHerokuでデプロイを行なったら<font color="Red">Precompiling assets failed.</font>というエラーが出てきてしまったので備忘録として投稿します。こちらのエラー、原因は色々あるみたいですので、下記の解決法が全てではありません。

## 開発環境

MacOS 10.15.4
Ruby 2.5.1
Rails 5.2.3

## 最初に
エラーは<font color="Red">目立つ部分</font>が全てではない!!

```
remote:  !     Precompiling assets failed.
```
こちらの一文は<font color="Red">赤字</font>で目立ちますが、実は大事な部分がターミナルをさかのぼると出てきます。

## エラー１
さかのぼるとこの様なエラーが出てきました。

```
NoMethodError: undefined method `[]' for nil:NilClass
```
[]を見て思い出しました!!
環境変数セットしてなかった...
私はcredentials.yml.encを使っていたので、下記のコードで環境変数を設定致しました。

```
$ heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```
デプロイします。

```
$ git push heroku master
```

##エラー２
上記で環境変数をセットしたにもかかわらず、またしても<font color="Red">Precompiling assets failed.</font>が出現しました。
ターミナルをさかのぼります。
エラー文が変わっている！！先ほどのエラーは解決できた様です。

続いてはこちら

```
Uglifier::Error: Unexpected token: name (任意の内容). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
```
「ES6を使うにはUglifier.new(:harmony => true)でharmony modeを有効してください」ということらしいです。エラー文で検索するとすぐに対処法が出てきました。
config/environments/production.rbを編集します。

config/environments/production.rb


```rb
config.assets.js_compressor = :uglifier #削除
config.assets.js_compressor = Uglifier.new(harmony: true) #追加
```

gitに変更を上げて、再度

```
$ git push heroku master
```

無事デプロイできました！！


## 最後に
冒頭にも書きましたが、こちらのエラーはターミナルをさかのぼるとエラー内容が分かりますので、まずはそちらのエラー内容でググってみてください！

## 参考
https://teratail.com/questions/163759
https://qiita.com/terufumi1122/items/27bf288414569e13e050
論文まとめ：Tracking Objects as Points

# はじめに
今月 arXiv に上がった以下の論文
[1] X. Zhou, et. al."Tracking Objects as Points"
の logic 部分だけざっくりまとめ

arXiv:
https://arxiv.org/abs/2004.01177

github:
https://github.com/xingyizhou/CenterTrack

提出先の journal や conference 等は不明。

# 概要
1. multi-object tracking 系の論文
2. １つのモデルで物体を detect して tracking まで行う 1-shot 系
3. CenterNet から出力される変位情報を元にマッチングさせる

# 手法
## 1. 各フレームでbounding box等の検出
CenterNet（[2]） そのものなので略。

参考：私のQiita記事
https://qiita.com/masataka46/items/cb5b05090746c7f3b826

ざっくり言うと、画像（$I^{(t)} \in \mathcal{R}^{W \times H \times 3}$）を入れて物体の heat-map と off-set 、矩形の縦横 を出力する。これらから物体の位置 ${\bf p}$ 、サイズ ${\bf s}$ 、信頼度 $w$ 等を計算する。 

## 2. 変位チャンネルの出力
このモデルの核心部分。

中身はSTAFモデル等のsequentialな骨格系で使われる Temporal Affinity Fields 的なもの。

つまり、$t-1$ 時の物体位置

```math
\left\{ {\bf p}_0^{(t-1)}, {\bf p}_1^{(t-1)}, \cdots \right\}
```
から $t$ 時物体位置

```math
\left\{ {\bf p}_0^{(t)}, {\bf p}_1^{(t)}, \cdots \right\}
```

への変位を表すベクトル

```math
{\bf d}^{(t)}_i = {\bf p}_i^{(t-1)} - {\bf p}_i^{(t)} \ (i=0,1,\cdots)
```
を同じチャンネルにマッピングしたベクトル場。

## 3. 変位チャンネルの loss
ターゲットとで L1 をとる。

```math
L_{off} = \frac{1}{N} \sum^N_{i=1} | \hat{D}_{{\bf p}_i^{(t)}} - ({\bf p}_i^{(t-1)} - {\bf p}_i^{(t)}) |
```


# reference 
[2] X. Zhou, et. al."Objects as Points"
arXiv:
https://arxiv.org/abs/1904.07850
私のQiitaまとめ：
https://qiita.com/masataka46/items/cb5b05090746c7f3b826
【プログラムと証明】線分を描画する「ブレゼンハムのアルゴリズム」を検証する

# Status

いまのところ描画と人力での証明のところまで。次は TLA+ か Coq などの定理証明系で証明したい。
ところで、MathJax の垂直位置ずれすぎじゃね？

# 概要

ブレゼンハムのアルゴリズムとは、ピクセルで表現された画面上に線分を描画するためのアルゴリズムである。
ピクセルの座標は整数値しか持てないため、近似アルゴリズムが必要になる。
そのときに、誤差を持つ浮動小数点演算を行わないで計算を行える点がこのアルゴリズムの長所である。

# 参考文献

- Wikipedia, ブレゼンハムのアルゴリズム: https://w.wiki/P2G

# 問題設定

端点 $(x_0,y_0)$ と $(x_1,y_1)$ を結ぶ線分を描画する。ただし、

- 端点は格子点、つまり座標値は整数である。
- 端点はどちらも第一象限にある、つまり、$0<x_0, 0<y_0,0<x_1,0<y_1$ とする。
- 右上に向かう線分である。つまり、$x_0 < x_1, y_0 \le y_1$ とする。なお、水平線を含んでよいが、垂直線は含まない。
- さらに、線分の傾きは $1$ 以下である、つまり、$$\frac{y_1-y_0}{x_1-x_0} \le 1$$ である。

仮定がいろいろついているが、他のケースもすべてこのケースに帰着できるので、こう仮定して一般性を失わない。[^1]

[^1]: なお、「一般性を失わずに」を、英語では "without loss of generality"、略して "w.l.o.g." とか "wlog" と書くことがある。

# アルゴリズム

以下、$x_1-x_0 = \Delta x$, $y_1-y_0=\Delta y$ とおく。傾きは $\Delta y/\Delta x$ と表せる。

傾きが $1$ 以下であることから、端点間の整数値の $x$ 座標 $X$ に対して、$y$ 座標 $\hat Y(X)$ を整数になるように計算し、点 $(X,\hat Y(X))$ を描画していけば直線っぽく見えると思われる。
ただし、本来の直線の近似でなければいけないから、本来の $y$ 座標 $Y(X)$ と $\hat Y(X)$ の誤差の絶対値 $|\hat Y(X)-Y(X)|$ が $1/2$ 以下になるようにするとよい。$y$ 座標値を四捨五入しながら描画していくイメージである。

## 具体例

たとえば、$(1,1)$ から $(12,5)$ (傾き $4/11$) への線分を描画するとこのようになる (matplotlib で描いた)。

![bre1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58848/e2ce416b-3a26-24ef-cf8d-5ceb4779d896.png)

## プログラム

Wikipedia にある最初のアルゴリズムは分数 (`deltaerr` の分母の $\Delta x$ および if 文の `0.5` の分母の $2$) を使用しているため、浮動小数点演算が必要である。そこで、誤差計算の部分についてすべてを $2\Delta x$ 倍すると、以下のような Python プログラムになる。
なお、`grid` を NumPy の配列としておくと matplotlib の `imshow()` や `matshow()` で描画できる。

```python
def Bresenham(grid, p0, p1):
    def plot(grid, x, y):
        grid[y,x] = 1
    x0, y0 = p0
    x1, y1 = p1
    deltax = x1 - x0
    deltay = y1 - y0
    error = 0
    y = y0
    for x in range(x0, x1+1):
        plot(grid, x, y)
        error += 2*deltay
        if error > deltax:
            y += 1
            error -= 2*deltax
    return grid
```

先ほどの図は `grid = Bresenham(np.zeros((7, 14)), (1,1), (12,5))` として作った配列を描画したもの。

## 証明

これで線分を近似的に描画できることについて証明する。
以下、$X$ に対する $Y,\hat Y$ の値を $Y(X), \hat Y(X)$ とかく。さらに、誤差 $\hat Y(X)-Y(X) = \varepsilon (X)$ とかく。
証明するのは、$x_0$ と $x_1$ の間のすべての $X$ に対して、$-1/2 < \varepsilon(X) \le 1/2$ であること。右側の不等号のみに等号がついている。
帰納法で証明する:

1. $X=x_0$ のとき、$\hat Y(X) = y_0$ であるため、$\varepsilon(X)=0$ であるから題意を満たす。
2. ある $X$ について $-1/2 < \varepsilon(X) \le 1/2$ であるとする。線分の傾きは $\Delta y/\Delta x$ であるから、もし、$\hat Y(X+1)=\hat Y(X)$ のままにすると、$\varepsilon(X+1) = \varepsilon(X) + \Delta y/\Delta x$ であることと、傾き が $0$ 以上 $1$ 以下であることから $-1/2 < \varepsilon(X+1) \le 3/2$ となる。
  3. もし $-1/2 < \varepsilon(X+1) \le 1/2$ の範囲に収まっていればこのままで題意を満たす。
  4. もし $1/2 < \varepsilon(X+1) \le 3/2$ ならば、$\hat Y(X+1)=\hat Y(X)+1$ とすることにより、$-1/2 < \varepsilon(X+1) \le 1/2$ とできるので題意を満たす。

以上により、題意は示された。(証明終)

さらに、画面上で連続しているように見えること、つまり、$\hat Y(X+1) - \hat Y(X) \in \\{ 0, 1 \\}$ であることを示してもよいかもしれない。もっとも、これはプログラムからほぼ自明である。
[python] tkinter コンボボックスの値を連動させる

# 記事の内容
pythonでtkinterを使ったGUIアプリを製作中、comboboxの扱いで少し悩んだのでメモ。
コンボボックスA,Bを2つ作成し、Combobox-Aの値に連動してCombobox-Bの値が変わるようにしたかった。

例えばCombobox-Aには県名、Combobox-Bには市名を選択する際に
Combobox-Aで県名を選択 -> その県に含まれる市名をCombobox-Bで選択可能にする、といった具合。

## 用意するもの
- 県名をキー、市名のリストを値にもつ辞書
- tkinter

## 実装

```
import tkinter as tk
import tkinter.ttk as ttk

dict = ['県名1':[市名1, 市名2, ... ], '県名2':[市名1, 市名2, ... ], ...]
  ：
  ：
root = tk.Tk()
var_material = tk.StringVar()
combo_A = ttk.Combobox(root, values=list(dict.keys()) , textvariable=var_material)
combo_A.bind('<<ComboboxSelected>>', lambda event: combo_B.config(values=dict[var_material.get()]))

combo_B = ttk.Combobox(root, values=list(dict[var_material.get()]))
```
---------
```
var_material = tk.StringVar()
combo_A = ttk.Combobox(root, values=list(dict.keys()) , textvariable=var_material)
```
combo_Aで選択できる値には、辞書のキーを設定する。
また、変化する値としてtextvariableにvar_material(=tk.StringVar())を設定。

-----

```
combo_A.bind('<<ComboboxSelected>>', lambda event: combo_B.config(values=dict[var_material.get()]))
```

combo_Aで選択された際のイベントとして、combo_Bの値を、辞書の市名リストに変更するようにバインド。

-----

```
combo_B = ttk.Combobox(root, values=list(dict[var_material.get()]))
```
combo_Bで選択できる値に、辞書からキーに対応するリストとする。
pythonでGoogle Driveの任意のフォルダにスプレッドシートを作成・編集する

題名の通りです…。

（個人的な話ですが、）スクレイピングしたデータをスプレッドシートに書き出したかったのですが、
既存のスプレッドシートを編集する方法の記事はよく見かけても、
スプレッドシートを新規作成して編集する記事を見つけられなかったので共有します…！

この記事では、Google Driveの扱い方とスプレッドシートの扱い方を同時に簡単に紹介しています。

# 対象読者
- pythonでgoogleスプレッドシートを扱いたい
- 任意のフォルダを指定してスプレッドシートを新規作成したい

# 流れ
- サービスアカウントキーの取得 (jsonファイル)
- スプレッドシートを作成したいフォルダをサービスアカウントと共有
- プログラミング！！

# サービスアカウントキーの取得 (jsonファイル)
プログラミングでDriveとスプレッドシートを扱うためには、Google Drive ApiとGoogle Sheets Apiを有効にしたサービスアカウントを用意する必要があります。

以下の記事がとても参考になったので、こちらを参考にサービスアカウントキーを取得します。
[PythonでGoogleスプレッドシートを編集](https://qiita.com/akabei/items/0eac37cb852ad476c6b9)

# スプレッドシートを作成したいフォルダをサービスアカウントと共有
スプレッドシートを作成したいフォルダを共有します。
[共有＞他のユーザーと共有] でサービスアカウントのメールアドレスを入力します。
(サービスアカウントのメールアドレスはサービスアカウントキーのファイルのclient_emailでも確認可能)

また、ここでフォルダのIDを確認しておきます。
フォルダのIDは以下のように、urlの一部になっています。

```
https://drive.google.com/drive/folders/<フォルダのID>
```

# プログラミング!!
## 環境
- macOS 10.15.4
- python 3.7.3
- pip 19.3.1

## 環境構築
```
pip install gspread oauth2client google-api-python-client google-auth-httplib2 google-auth-oauthlib pydrive
```

## プログラム作成
下準備は完了しました！
これより、write_spread.pyに書いていきます。
特定のフォルダにsample_spreadというタイトルのスプレッドシートを作成します。

ディレクトリ構成

```
app/
 ├ write_spread.py
 └ サービスアカウントキー.json
```

```python:write_spread.py
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import pprint

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
json_keyfile_path = 'サービスアカウントキー.json'

# サービスアカウントキーを読み込む
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    json_keyfile_path, scope)

# pydrive用にOAuth認証を行う
gauth = GoogleAuth()
gauth.credentials = credentials
drive = GoogleDrive(gauth)

folder_id = '<フォルダのID>'
f = drive.CreateFile({
    'title': 'sample_spread',
    'mimeType': 'application/vnd.google-apps.spreadsheet',
    "parents": [{"id": folder_id}]})
f.Upload()

# 作成したスプレッドシートの情報を出力
pprint.pprint(f)

# gspread用に認証
gc = gspread.authorize(credentials)

# スプレッドシートのIDを指定してワークブックを選択
workbook = gc.open_by_key(f['id'])
worksheet = workbook.sheet1

# A1のセルに入力
worksheet.update_acell('A1', 'Hello World!')

# 2行目の1~3列目に入力
cell_list = worksheet.range(2, 1, 2, 3)
cell_list[0].value = '連番'
cell_list[1].value = '名前'
cell_list[2].value = '電話番号'

# スプレッドシートを更新
worksheet.update_cells(cell_list)
```

## プログラム実行

```
$ python write_spread.py
```

以上で、Google Driveの指定のフォルダに```sample_spread```というスプレッドシートが作成されていて、書き込みもされていると思います！


# 参考文献
[PythonでGoogleスプレッドシートを編集](https://qiita.com/akabei/items/0eac37cb852ad476c6b9)
[GoogleDriveとColaboratory間のデータ操作まとめ [PyDrive]](https://qiita.com/Hyperion13fleet/items/14a4f9ff1a41a3ab0301)
[サーバでGoogleDriveAPI + Python【導入編】](https://watason.com/python-googledriveapi-install/)
Pyinstallerによるpyスクリプトのexe化

# 記事の内容
Pyinstallerを使ってGUIを使うpyスクリプトを実行ファイルにしようとした所、少しハマったのでメモ。

## 環境
- Windows10
- python3.7
- pyinstaller (pip install pyinstallerでインストール)

## 現象
pyinstallerでexeファイルを作成したところ以下のようなエラーを吐いた。

```
Traceback (most recent call last):
  File "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", line 13, in <module>
  File "c:\users\username\.virtualenvs\foo_project-uuzswlzx\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pkg_resources\__init__.py", line 86, in <module>
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[14256] Failed to execute script pyi_rth_pkgres
```

ぐーぐる先生に聞いて出てくる日本語記事はイマイチなものばかり。
どうやら、pip installでpyinstallerをインストールすると同じ現象が発生するようです。
環境・バージョン依存のバグ？？

## 解決策
pipでインストールしたpyinstallerはアンインストールして、githubからインストールする。

```
pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
```

さらに同様のエラーが出る場合は、--hidden-importオプションをつける。

```
pyinstaller --hidden-import pkg_resources.py2_warn example.py
```
【ざっくりと理解する】インターネットの世界〜RFCとIETF〜

# 概要
　普段プログラミングをしていくなかで、良いライブラリがなかったから自分で書くことや、そもそも機能の標準仕様について調べる時にRFCを使用することがあるかと思います。
　そもそもRFCの正式名称やどうやって決めているの？などからはじめ、インターネットの世界を学びます。

# RFCとは
　RFCとは<font color="DeepPink">Request for Comments(コメントを求める)</font>の略です。
wikipediaには下記のように記載があり、
>もともとは技術仕様を公開し、それについての意見を広く募集してより良いものにしていく観点から始められたようである

　　　　　　　　　　(引用：https://ja.wikipedia.org/wiki/Request_for_Comments)
　RFCにはIETFのものと、他にもPHP,RUST,Vue.jsなどで存在しているようです。

IETFのURLは→ https://tools.ietf.org/html/ にあります。
日本語訳版があるものもあり、こちらでまとめられています。
→ https://www.nic.ad.jp/ja/tech/rfc-jp-links.html

ただ、最近は翻訳技術が優れているので、google翻訳などの翻訳機能で和訳するのが良いと思います。

# IETFとは
IETF(The Internet Engineering Task Force)は、インターネット技術の標準化を推進する任意団体(株式会社やNPO法人のように権利の主体になることができる「法人格」を持たないものの、「組織」としての活動実態をある程度認めることができる団体のこと)です。
参加者は企業ではなく、個人単位での参加になります。
ここが技術仕様としてあるのがよく言うRFCですね。
RFCとして主にまとめているものは

```
・プロトコル関連：　TCP/IP、IPV6、HTTPなど
・メールアプリケーション関連：　SMTP、POP、IMAPなど
・ドメイン関連：　DNS、DHCPなど
・セキュリティー関連：　FEP、公開鍵など
・文字符号その他：UFT-7、UTF-8など
```
です。

#インターネットの世界の統治〜ISOCとIETF〜
IETFはISOC(Internet Society)に属します。
ISOCは、1992年に設立された国際的非営利組織です。
インターネット関連の標準・教育・方針についてリーダーシップを提供していて、
目的は「全世界のあらゆる人々の利益のため、インターネットのオープンな開発/進歩/利用を保証する」ことです。
インターネットの世界をざっくりまとめると、こんな感じになっています。
<img width="569" alt="スクリーンショット 2020-04-26 2.58.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/535eba9a-ecf1-0d9c-4bab-f68e00413483.png">


上から順に説明すると、(W3Cについては次の章で書きます)
ISOC(Internet Society)：インターネット統治のトップ。
IAB (Internet Architecture Board)：ISOCがインターネットの技術的・工学的開発を監督するために設置した委員会。
配下に多くのタスクフォースを持つ。代表的なものはIETFとIRTF。
IETF(Internet Engineering Task Force):インターネット技術の標準化を推進する任意団体。RFCを管理している。
IESG(Internet Engineering Steering Group)：IETFの活動と標準化プロセスの、技術的な側面についての責任を担っているグループ。IETFを監督する。
IRTF(Internet Research Task Force)はIETFの姉妹団体であり、「長期的視野で小規模の研究グループにより、インターネットのプロトコル、応用、アーキテクチャ、技術など、インターネットの未来の革新に重要と思われる研究を推進する」組織です。
IRTFで議論、検討された結果、IETFでの検討や標準化が必要と判断された場合は、IETFに提案され、標準化に向けた議論、検討が開始されることとなります。
詳細は　RFC2014 https://www.ietf.org/rfc/rfc2014.txt
IRSG(Internet Research Steering Group):研究グループの管理をしています。また、IRTFを監督しています。
ICANN(Internet Corporation for Assigned Names and Numbers):ドメイン名やIPアドレスの管理、各プロトコルで使われる名前や番号の管理、DNSルートサーバーシステムの運用、これらに関連するポリシー策定の調整などを行なっています。

Steering Groupは運営という意味です。

#ISOCとW3C
ここまでの話だと、HTMLやCSSの仕様を確認するときはW3Cのドキュメントを確認するけどW3CはISOCはどういう関係なの？と疑問に思うかもしれませんので補足します。
まず、W3C(World Wide Web Consortium)は、World Wide Webで使用される各種技術の標準化を推進する為に設立された標準化団体、非営利団体です。
Web標準とガイドラインの作成を通じて、主にその使命を追求しています。
ISOCとW3Cはどちらも、同じ価値観のもと、インターネットとWebをどのように使用するかを推進するオープンスタンダードの促進に取り組んでいます。
W3CはISOCにより支援され、HTML、CSS、SVGなどのweb標準に取り組んでいます。
例えば、HTMLは、従来IETFでRFCとして標準化されていましたが、HTML 3.2以降はW3Cへと引き継がれました。
これらは独立しつつ、連携しながらWEBの世界の標準化に取り組んでいます。
中でもHTMLやCSSなどを扱っているのがW3Cということです。
そしてそれを支援しているのがISOCという関係です。

#引用・参考
インターネットソサエティ
https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%82%BD%E3%82%B5%E3%82%A8%E3%83%86%E3%82%A3
日本ネットワークインフォメーションセンター
http://rfc-jp.nic.ad.jp/what_is_ietf/ietf_section3.html
ISOCとW3Cに関するFAQ
https://www.w3.org/2009/11/isoc-w3c-faq
React内でsetIntervalを実現する (LiveScript版)

ReactでsetIntervalが効かなくて困ったので調査
スマートな解決方法が載っている記事がヒットしたので備忘録として残しておく。

参考記事: [Making setInterval Declarative with React Hooks](https://overreacted.io/making-setinterval-declarative-with-react-hooks/)

> 数時間以上React Hooksを使っていたら、
おそらく興味をそそられる問題にぶつかったことでしょう。
setIntervalを使っても思ったようにはいかないのです。

という訳でこの記事のコードをLiveScriptで書き直したのがこちら。
JavaScriptのコードは上記の記事を参考。

```functions/use-interval.ls
require! {
  react: {use-ref, use-effect}
}

module.exports = (cb, delay) !->
  saved-cb = use-ref!
  use-effect do
    -> saved-cb.current = cb
    [cb]
  use-effect do
    ->
      if delay isnt null
        id = set-interval _, delay <| -> saved-cb.current!
        return -> clear-interval id
    [delay]
```
【猫でもわかる】ラズパイ4で自動水やり

# この記事について
この記事はラズパイ４を使用した自動水やりを行うための、
必要な道具や手順を、可能な限り分かりやすく記述していきます。

著者が作成しようとしたときに色々なサイトを拝見しましたが、
ある程度の知識がある前提で書かれていたり、道具の詳細が省いてあったりと、
かゆいところに手が届く記事が見当たりませんでした。

なので、今後同じような人が出ないように猫でも分かるレベルで書き記します。
知識０でも、見よう見まねでとりあえず作れます。

# 必要な道具
・[Raspberry Pi 4 Model B （メモリは2GBで十分）](https://raspberry-pi.ksyic.com/news/page/nwp.id/86) 
・[TypeC充電器](https://www.amazon.co.jp/dp/B071D8THD2)
・[ブレッドボード](https://www.amazon.co.jp/dp/B009ALRR9M)
・[ジャンパーワイヤー(オス-メス) x2](https://www.amazon.co.jp/dp/B00P9BVKOK)
・[ジャンパーワイヤー(オス-オス) x2](https://www.amazon.co.jp/dp/B00Q0UE8R0)
・[リレー(G6E-134P-US DC5) x1](https://product.rakuten.co.jp/product/-/f38a7d73e95de1c64da3f443610dd9e2/?scid=s_kwa_pla_app&gclid=EAIaIQobChMI-bHWqPeD6QIVSaqWCh26igFWEAYYBCABEgLzzvD_BwE&gclsrc=aw.ds)
・[ハンダゴテ (お好きなものを)](https://www.amazon.co.jp/dp/B07RKSKXSK)
・[給油ポンプ(電動)](https://www.amazon.co.jp/dp/B00NN2BOL6)
・[給油ポンプ用の単三電池](https://www.amazon.co.jp/dp/B0016JUS8I)
・[灯油缶(水が一定量入れば何でもOK)](https://www.amazon.co.jp/dp/B00P346NCW)

# ラズパイ4のセットアップ
ラズパイのセットアップがまだ済んでいない方は、[ここ](https://pcmanabu.com/raspberry-pi4-install/)を参考にセットアップをお願いします。
セットアップを行うには、本体以外に下記の道具が必要になります。
・マウス、キーボード、モニター
・[microSDカード](https://www.amazon.co.jp/dp/B074B4P7KD)
・[HDMIケーブル](https://www.amazon.co.jp/dp/B014I8U33I)

microSDカードの容量は16GB程度あれば安心です。
データ書き込みの最低保証速度が10(10MB/秒)のものを選ぶとストレスフリーです。
(カード本体に ⑩ と書かれているもの)

HDMIケーブルはラズパイ4側(マイクロタイプDオス)と、
お使いのモニターの端子に繋げられるよう、必要であればコンバーターをご準備下さい。
モニターがHDMI対応なら、上記リンクのもので問題ありません。

# 構築していく
ここでは回路に関しては細かな説明は載せませんので、
興味があれば、[ここ](https://robot-workshop.net/raspberry-pi-gpio)などを参考に勉強してみて下さい。

画像を参考に、同じように繋げて行って下さい。

### イメージ図
赤がジャンパーワイヤー(メス-オス)
青がジャンパーワイヤー(オス-オス)
![unnamed (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623244/6ece5049-5078-13a3-fa9c-2a4ca63651fc.jpeg)

### 実物
![iOS の画像 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623244/ea2b2b0a-53bc-5a67-3814-50364c6f4d04.jpeg)

ラズパイ4の電源が入っている状態だと常に通電しているので、
上記のように繋げるだけでポンプが動くのが分かると思います。
(給油ポンプとジャンパーワイヤーはハンダゴテで接着しましょう)

あとは、この電気の流れをプログラムでコントロールするだけです。

# プログラミング
## （作成中）
brew install yarn --ignore-dependencies で困ったのでメモ

# 概要
フロントエンド勉強しようと思って、 
nodebrewからnodeを入れたはいいが、
brewからyarn入れようと思ったときにハマったのでメモとして残しておく。

手順としては下記の記事を参考にした。
https://qiita.com/morikiyo/items/cd219a0b7aaed5b23d51

# エラー内容
yarnの公式（ https://classic.yarnpkg.com/ja/docs/install#mac-stable ） 見ると、nodebrewでnodeを入れてる場合は下記コマンドを叩くとのこと。

`brew install yarn --ignore-dependencies`

そうするとこんなエラーが。

```
Warning: --ignore-dependencies is an unsupported Homebrew developer flag!
Adjust your PATH to put any preferred versions of applications earlier in the
PATH rather than using this unsupported flag!

Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/node not present or broken
Please reinstall node. Sorry :(
```

色々いじってる環境なので発生しない人には発生しない問題だとは思う。。。
npmで最終的にyarn入れた人はこの問題にぶち当たったのではないかと。。。

# 対応策
こんな感じで、最新のnode使うようにシンボリックリンクを貼った。

```
$ mkdir /usr/local/opt/node
$ ln -s .nodebrew/current/ /usr/local/opt/node/
```

```
$ brew install yarn --ignore-dependencies
Warning: --ignore-dependencies is an unsupported Homebrew developer flag!
Adjust your PATH to put any preferred versions of applications earlier in the
PATH rather than using this unsupported flag!

==> Downloading https://yarnpkg.com/downloads/1.22.4/yarn-v1.22.4.tar.gz
Already downloaded: /Users/xxx/Library/Caches/Homebrew/downloads/42f75ed3036d8636bc54f4cf04cd43310a9662428287c2f0187e82ebedf82c95--yarn-v1.22.4.tar.gz
🍺  /usr/local/Cellar/yarn/1.22.4: 14 files, 5MB, built in 4 seconds
```

というわけで、yarnを入れることに成功。

```
$ yarn -v
1.22.4
```
evalのリスク

　普段はサーバーサイドですが、フロントエンドの仕事も少し増えたので、Javascript勉強中にevalすごく便利！と思ったら、とてもリスクがあることを知ったので、メモとして残しておこうと思いました。
　もうすでにネット上でたくさん情報は転がっているので、当たり前じゃん！というツッコミもあるかと思いますが。。。

## やりたかったこと
以下のような仕組みを実装しようと試みました。

 - 動的にObjectのキーと値を生成する。
 - 生成したObjectにキーを指定して、値を取得する。


## ダメな例
実証例のため、はちゃめちゃなコードですが、ご了承を。。。

```Javascript:ng.html
<body>
	名前：<input type="text" id="name" value="NG NAME"></input>
	年齢：<input type="text" id="age" value="NG AGE"></input>
	<input type="button" id="btn" value="送信"></input>
	<div id="output"></div>
	
	<script>
		window.addEventListener('DOMContentLoaded',function(){
			
			function init(){
				const ids = ['name', 'age'];
				const MyObj = {};

				// ids配列の値をidとして、各要素を取得。
				// idをMyObjのキーとして、要素の値を設定する。
				for(let i = 0, ilen = ids.length; i < ilen; i++){
					const elm = document.getElementById(ids[i]);
					eval('MyObj.'+ids[i]+'="'+elm.value+'";');
					document.getElementById('output').textContent += eval('MyObj.'+ids[i]);
				}
				const btn = document.getElementById('btn');
				btn.addEventListener('click', init, false);
			}
			init();
		});
	</script>
</body>
```
初期表示時点ではこのような感じ。
><img width="384" alt="eval_ng.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433423/8761825a-bef5-b4e3-825b-bd3b1a9d6872.png">

下記のように入力して、送信。
><img width="383" alt="eval_ng2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433423/688534d5-3a64-5f6c-e1c0-9ced743a0d95.png">

><img width="334" alt="eval_ng3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433423/14d6c4c2-5b08-b2a3-9599-cc5cda2ed157.png">

これで任意のコードが実行できてしまう。。。


## 解決策
ブラケット構文を使用しましょう！

```Javascript:ok.html

	for(let i = 0, ilen = ids.length; i < ilen; i++){
		const elm = document.getElementById(ids[i]);
		MyObj[ids[i]] = elm.value;
		document.getElementById('output').textContent += MyObj[ids[i]];
	}
```

><img width="393" alt="eval_ok1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433423/563e3489-eebd-f1af-7fdc-ce1b9efaea1f.png">

変数に入っている値をキーとして使用できるのは、とても便利ですね。




evalはパフォーマンスにも影響があるそうなので、上記のリスクも踏まえるとevalを使用するのはなるべく避けた方がよさそうです！
駆け出しエンジニアの自粛期間の学習内容

唐揚げと二郎が好きなエンジニア、ロンロンと申します。

コロナ騒動で大変ですよね
コロナの外出自粛要請に伴い
私事ですが15日付で所属のSES企業さんに休職扱いで自宅待機を命じられました。
・・・この状態抜け出したい(笑)
この度ツイッターアカウントを開設しました。
URL記載しておきますので
同じ駆け出しエンジニアの方は仲良くしてください。
https://twitter.com/Ron_Engineers

さて本題ですが4月の半ばに緊急事態宣言が発令されて自宅待機になってしまいましたが
その際私がやったことを振り返っていきます。
【学習期間4/14夜～4/25夜】

【HTML・CSS】
・Progateにて初級・中級を学びました。
正直marginとpaddingの使い分けがプレビュー見ないとわからないレベルなのでもう一周かなあ・・・
・自己紹介ポートフォリオ作成
自分の名前・どの言語興味あるのか・これからどうしたいといった殺風景なものですが
サイトを作成しました。その際にGoogle先生に頼っていくつかタグの意味とか調べまくりました。やり切った感！！！


【Ruby・Rails】
・ProgateにてRuby(オブジェクト指向)を一周＋オブジェクト指向部分をもう一周しました。
こちらは二日半かかりました！

・Udemyで電話帳アプリの作成
実際にAWSの会員登録→IAMユーザー作成→Cloud９の環境構築とProgateだけじゃわからない
ことを体験できました。ProgateでRubyやったけどRails興味ある！！！
Railsチュートリアルで挫折した(私もこれからチャレンジします。)、MVCの編集とかなんやねん？って方
下記講座、おすすめです。
https://www.udemy.com/share/101BpCAEMYcllRQ3QE/

【jQuery】
progate初級編、Sildeup/hide/fadeoutなどクラスの学習をしました。
おしゃれなサイト作れることの理由が分かった。

【その他】
オンラインサロンに入会・他もくもく会や勉強会を開催しているコミュニティに入れてもらう。
エンジニア勉強中のお姉さんのツイート眺める(←モチベになるんですｗｗｗ)
【総評】
睡眠不足過ぎてだらだらしてしまった自負はあります・・・。
正直若い人や向上心がある人なら２．３日でできる内容だと思う・・・
なまけすぎたのと何よりエラーの切り分けや一旦飛ばして他のことをやってみるといった
学習のノウハウがまだ確立できていない感じがあります。

【今後の対策と目標】
学習ノウハウについて・・・
Progateの進め方
→おそらくわからなかったらう～んって何時間も眺めても進まないので開き直って答えを一回
メモ帳などにコピペして模写する。→なんとなく理解につながる・効率アップ

もくもく会に参加頻度上げる・勉強会参加
→元取ってやりたいし、だらけられない環境づくり適度にね・・・

アウトプット増やす
→来週火曜日から模写に入れるようにする。
道場コースが火曜日9時までの締め切りで頑張ります！！！

【最終目標】
スキルセット
①HTML/CSS　静的サイトでコーディング(1.5日)
jQuery(js)でスライド部分の導入など(1日)
サイトのWP化(1日)
1日テスト作業・SEO用のMetaタグなど編集・添削(1日)
上記の内容をこなせるWEBデザイナーになりたいですね！！！！


付加価値として
Ruby(PHP)の理解・SQLの理解・Gitの共有・photoshopなど頑張っていきたいですね！！！！
がんばろ！！！

来週は駆け出しエンジニアの勉強のつらさなど書いてみましょうか。
最後の言葉みんなどうクローズしてるんだろ・・・・。
JSにおけるfor文とwhile文の違い

JavaScriptの繰り返し処理でfor文とwhile文の違いについてまとめます。

同じブロックを繰り返し表示したり、同じ処理を繰り返したいときなどに繰り返し文を使用します。

##1 for文の構造

for文は以下のように記述します。

```js
for (let i = 0; i < 5; i ++){
     document.write(i);
}
```

上記のfor文は初期値iに0をセットして、iが5より小さい間処理を繰り返すfor文です。

```js
for (初期値; 条件式; 増減式){
     命令文;
}
```

##2 while文

while文は以下のように記述します。

```js
let i = 0;
while (i < 5){
    document.write(i);
    i ++;
}
```

上記のfor文と同じでこちらも初期値iに0をセットし、iが5より小さい間繰り返す処理です。

```js
初期式;
while (条件式){
    命令文;
}
```

##3 両者の違い

簡単にいうとfor文は繰り返し回数を指定したい場合に使用し、
while文は繰り返す回数がわからない時に使用します。
【VSCode】開いたエディタタブを保存・復元する方法

# VSCodeのエディタタブを保存する拡張が地味に便利だった件

自分は普段、エディタはVSCodeを使うことが多いです。
複数のファイルを同時に開いて作業することが多いのですが、長く作業していると使わないタブは邪魔になるので閉じてしまうのですが、後でまた使うときに開くのが面倒だなぁと以前から思ってました。

デフォルトでは保存する方法は無いようなので、そんな機能の拡張がないかなぁと探してみたところありました。

## *Restore Editors*：エディタタブを保存・復元できる拡張

それがこちら。

[Restore Editors](https://marketplace.visualstudio.com/items?itemName=eamodio.restore-editors&ssr=false#overview)

開いているエディタタブを保存・復元するだけのシンプルな機能ですが十分でした。
よく見ると作者は[GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)と同じ方です。

![preview.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173746/816323d0-be2f-5c44-da58-3348dbea445f.gif)
（※ 画像はリンク先から引用）

インストールすると、`ctrl-kのあとにctrl-e` (Macでは`cmd-kのあとにcmd-e`)でメニューが上部に出るようになるので、その中から項目を選択するだけです。


|メニュー項目|機能|
|:-----------------:|:------------------:|
|*Save Opened Editors*|開いているエディタを全て保存|
|*Open Saved Editors*|以前保存したエディタを全て開く|
|*Clear Saved Editors*|保存したエディタをクリアする|

保存されたタブはメニュー下部に一覧がでるのでその中から開きたいタブを選択することで個々のタブを開くことも可能。

ちなみに**タブはワークスペースごとに保存できる**ようなので、自分は同じフォルダでよく使うタブごとにワークスペースに分けて使っています[^1]。便利。

[^1]: 同一フォルダでワークスペースを複製する方法は[VS Code1.24の新機能 - 同一ワークスペースを複数ウィンドウで開く](https://qiita.com/12345/items/ea4bb9fbbf1a24435431)を参照
【AWS】CloudWatchでEC2のネットワークログを取得する

# CloudWatch Logsについて
全てのシステム、アプリケーション、AWSのサービスからのログを高度にスケーラブルな単一のサービスに集中管理する事ができます。

# EC2のネットワークアダプタのログの取得設定
ロググループを作成し、ネットワークアダプタの情報をロググループで確認できるように設定します。

## ロググループの作成
CloudWatchのサービス画面で、`ロググループ`のページを開きます。
`アクション`のボタンを選択し、`ロググループの作成`を選択します。
ロググループ名に任意の名前を指定します。

## EC2インスタンスの設定
確認したいEC2インスタンスの`詳細モニタリング`を有効にする必要があります。
EC2のサービスメニューに移動し、インスタンスの一覧から、モニタリングしたいEC2インスタンスを選択し、`アクション`ボタンから`詳細モニタリングを有効化`をクリックしてください。
※ 上記の操作は追加料金が発生します。
　料金に注意してください。

## ネットワークインターフェイスへの設定
インスタンスの詳細モニタリングが完了したら、次はネットワークインターフェイスのフローログの設定です。
確認したいインスタンスを選択し、下に表示される詳細情報から、ネットワークインターフェイスの部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/a7c82c68-2eaa-797a-9f22-4e08ca1b0265.png)
下記の図のように、インターフェイスIDが表示されているので、IDをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/6b040e2a-c6f9-cdd4-4f46-99a2496406a3.png)

ネットワークインターフェイスが表示されたら、選択してから、`アクション`ボタンを押して、`フローログの作成`をクリックします。

下記の設定内容で設定します。

- Filter： All
- Maximum aggregation interval：	10 minutes
- Destination log group ：先ほど作成したグループ
- IAM role： 一番初めは「Set Up Permission」を選択する

# 確認
上記の設定でネットワークの情報が全て、CloudWatch Logsに転送する事ができ、簡単に確認する事ができるようになりました。

集まったログを「インサイト」機能を利用して分析する事で、さらに詳しい分析を行う事が可能になります。

# まとめ
今回の設定でCloudWatch Logsの必要性をしみじみと感じる事ができました。
今後、EC2でサービスを構築する際は、CloudWatch Logsを上手く利用し、運用していければと思います。
【Swift】Main.StoryBoardを消して新しいStoryBoardでスタートさせるときの留意点

#シミュレーターがずっと真っ暗
毎度おなじみ初心者応援記事（未来の自分への備忘録）です。
一緒に一つずつクリアしましょう。

今回はxcodeで新規プロジェクトをcreateしたときに、Main.Storyboardを消して、自作のStoryboardを起動してみようと初心者から一歩進んだ方向けかと思います。
まぁ今更感もあるかもしれませんが、探すのに苦労した自分が忘れないようにしたいのです。
アウトプット大事。

iOS12以前ではIs Initial View Controllerという項目にチェックをつけるだけで自作のStoryboardに切替られたはずでした。
<img width="256" alt="スクリーンショット 2020-04-26 1.27.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/9a9ac04b-6a73-9908-eba1-e2377520d780.png">

しかしながらiOS13からiPadで同一アプリを複数画面で起動できるようにしたとかしてないとかっていう頭がいいのか悪いのかわからない使い方ができる（？）ようになった関係で、いろいろと仕様変更があったようです。
詳しくは@omochimetaru様の[iOS13のSceneDelegate周りのアプリの起動シーケンス](https://qiita.com/omochimetaru/items/31df103ef98a9d84ae6b)で書かれてます。

まぁ僕のような初心者には何度読み返しても仕様が変わったんだなということしか理解できないのですが、この為に一手間加えないといつまでもシミュレート起動できないことになりました。
いつまでもログに「Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?」と表示されていろいろいじってみても治らず、頭を捻っている方への処方箋となれば幸いです。

なお、今回はStoryboardを使って行きます。コードだけで書かれる方には非対応ですので、ご了承ください。

##脱・Main.Storyboard、脱・超初心者
早速行きましょう
さっさとMain.Storyboardを削除します。
↓のような選択が表示されますが、Move To Trashでいいと思います。これは表面上は消えるけど、プロジェクトフォルダには残す？残さない？という問いで、今回はMainに完全に消えてもらいます。
<img width="547" alt="スクリーンショット 2020-04-26 1.44.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/c34c8ec8-d76a-08a6-1679-68d449cb91ad.png">
消した後に、初期画面は認証画面にしようと思いAuth.StoryboardというStoryboardを作成しました。
<img width="268" alt="スクリーンショット 2020-04-26 2.00.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/466a103a-9c97-0a05-bf94-ae72967cde6b.png">


このまま一度Runさせようとすると、もはや起動しません。
まずはIs Initial View Controllerにチェックを入れてください。
<img width="256" alt="スクリーンショット 2020-04-26 1.27.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/1277bd54-15ee-9bfc-9582-eca55076267f.png">
(画像は使い回し)

##TARGETSの変更
さて、ここで勘の良い方はTARGETS内にMain Interfaceがあることに気づいたはずです。
<img width="1017" alt="スクリーンショット 2020-04-26 2.02.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/fb8d6090-cae9-499b-ff3d-a158a94a8be5.png">
でもこれは空白でも動きました。今回は一応Auth.Storyboardを選択しておきます。詳しいかた教えてください。

でもRunしても起動しません。

##真犯人はInfo.plist
犯人はこいつだ！
ということでInfo.plist内の「Main storyboard file base name」といういかにもなプロパティがありました。こいつを直しましょう
<img width="1017" alt="スクリーンショット 2020-04-26 2.05.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/12ddeb20-1151-c500-5296-0184249e9dee.png">



はい。

**起動しません！**


なんとApplication Scene Manifestというプロパティの中に真犯人がいました。
<img width="1021" alt="スクリーンショット 2020-04-26 2.08.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/88e46330-2e9d-1dae-b236-ca35ed9621ce.png">
**こいつがMainのままや！**

というわけでこいつを「Auth」にしたら起動できるはずです。

<img width="361" alt="スクリーンショット 2020-04-26 2.12.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/cb9b8f7f-8232-e7ce-bc16-3bbc0132cb38.png">


お疲れ様でした。
この記事が誰かの手助けになれば、恐悦至極にございます。
【AWS】CloudWatchの新規サービスについて 2020年4月

CloudWatchの新規サービスが利用できるようになっていたので、どんなものが存在するのか調べてみました。

# ServiceLens 2019年12月
メトリクスをより、詳細に確認できる物
様々なマイクロサービスのメトリクス、ログ、トレースなどを統合して可視化する事ができる

マイクロサービスとは・・・
- Docker
- コンテナサービスなど

## 利用方法
サービスマップを作成して、ログ等の情報をまとめる
トレースのタブで情報を絞り込んで確認する事ができる！

# Synthetics 2020年1月
Canaryテストを使用して、ウェブアプリケーションをモニタリングするサービスです。
Canaryテストは、顧客と同じアクションを設定して、テストを実行する事ができます。
エンドポイントの可用性とレイテンシーをチェックして、ロード時間データとUIのスクリーンショットを保存できます。

## Canaryでチェックできる項目
下記の項目をチェックできるようにカスタマイズする事が可能です。

- 可用性
- レイテンシー
- トランザクション
- リンク切れ・リンク壊れ
- タスクのステップごとの完了
- ページロードエラー
- UIアセットのロードレイテンシー
- 複雑なウィザードのフロー
- アプリケーションでのチェックアウトフロー
- など

# Contributor Insights 2020年4月 一般提供開始
システムとアプリケーションのパフォーマンスに影響を与えている上位のコントリビューターをリアルタイムで簡単に表示できます。

## 利用方法
ルールを作成し、何かしらのコントリビューターを特定します。