OmniAICreator/Qiita-1.07M huggingface dataset:
【VPC】 VPCエンドポイントの作成

## やること
- NATゲートウェイを経由してネットワーク接続しているプライベートインスタンスのネットワーク接続を解除する
- VPCエンドポイントを作成する
- VPCエンドポイントを経由してS3にアクセスする

## 1. ルートテーブルからNATゲートウェイを外す
ルートテーブルに関連付けられているサブネットのインターネット接続が解除される
![スクリーンショット 2020-08-15 16.15.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/d726ad8d-995c-67fd-2fc4-992d1a7cce20.png)

## 2. 再度プライベートインスタンスからS3にアクセスする
応答が無く、アクセス出来ないことが確認出来る

```
[root@ip-[プライベートインスタンスのプライベートIP] ~]# aws s3 ls
∎
```

## 3. エンドポイントを作成する
![スクリーンショット 2020-08-15 16.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/c86cf65d-a3e9-56b8-038a-5d939e8baf23.png)

## 4. エンドポイントを使ってアクセスをするサービスを選択する
今回はS3にアクセスするため、S3を選択
![スクリーンショット 2020-08-15 16.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/e58acc2d-000b-9088-8b8d-23ad534bfc88.png)

## 5. エンドポイントにアクセスするVPC、ルートテーブルを選択する
プライベートサブネットと関連付けられたルートテーブル（1でNATゲートウェイとの接続を解除したルートテーブル）を選択する
![スクリーンショット 2020-08-15 16.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/2716ffa3-1661-444e-b941-22f9b83c8738.png)

### 作成完了
![スクリーンショット 2020-08-15 16.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/e9363800-09f9-e250-3bc9-5ae6f67bf4e9.png)

## 6. 再度プライベートインスタンスからS3にアクセスする
エンドポイントを経由したアクセスが成功していることが確認出来る

```
[root@ip-10-0-10-173 ~]# aws s3 ls --region ap-northeast-1
2020-08-02 14:42:00 test-bucket2020
2020-08-15 06:48:29 test-vpc20200815
```
Contentfulのコンテンツ更新時にAmplify Console（Gatsuby）を自動ビルドする（WebHook）

AmplifyでGatsuby+Contentfulを利用する際のビルド設定です。
Contenfulでは、ブログやメニュー、カテゴリなどを管理する想定です。

## Amplify側（Amplify Console）

Amplify Consoleに移動して、ビルドの設定 - 「Create webhook」 でwebhookを作成します。

![スクリーンショット 2020-10-18 13.42.43 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/babe24d3-bc5a-2a8b-f505-e47b6508b6f6.jpeg)

## Contentful

Settings - Webhooks - 「Add Webhook」 でwebhookを作成し、
Amplify ConsoleからコピーしたURLを貼り付けて、Content Typeを "application/json" に設定します。

![スクリーンショット 2020-10-18 13.51.35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/c255c0b4-5f5e-1924-1349-dabf80385809.jpeg)

![スクリーンショット 2020-10-18 13.47.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/2c513056-20b8-1f6c-7eea-c7aef8067381.jpeg)

コンテンツを更改すると、Webhookを経由して、Amplify Consoleのビルドが走ります。

![スクリーンショット 2020-10-18 13.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/dba3e873-1653-b5da-8d0c-78e3107520a1.png)
Ubuntuのシステム管理Tips

# はじめに　
Ubuntuのシステム管理のことをネット上で検索したことを、ここでまとめておこうと思います。
（そのため、情報は偏っているものと思います）

# システム関連
## システムの確認
システムの確認をしたい場合は以下のコマンドで解決できます。

```bash
neofetch
```

このような感じで、グラフィカルに表示されます。

![Screenshot from 2020-10-19 13-55-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/68b90e40-dace-c9a9-a8b5-3b6b5e480eb9.png)

または、

```
cat /proc/cpuinfo
```

```
cat /proc/meminfo
```

![Screenshot from 2020-10-19 13-58-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/4d11ad21-9cfe-8066-bb19-9c379c4033aa.png)


でCPUやメモリの確認ができます。


## keymapの変更
```bash
sudo dpkg-reconfigure keyboard-configuration
```
で、所望のキーマップを選択(__Generic 105-key PC (intl.)__など)。
その後、mozcでキーマップを確認すればよいが、これでも変更が有効にならない場合もある。そのときは、``/usr/share/ibus/component/mozc.xml``の``<layout>``を以下のように変更すればよい。

```bash:mozc.xml
<setup>/usr/lib/mozc/mozc_tool --mode=config_dialog</setup>
<layout>jp</layout>
<name>mozc-jp</name>
```

## プリンター
コマンドラインからファイルを印刷したい場合は、`e2ps`などをインストールしたのち、

```bash
e2ps -box <file> | lpr -P <printer name>
```

とすれば良い。なお、接続されているプリンターの確認を行う際は、

```bash
lpstat -t
```
によりプリンター名などを確認することができる。

# アプリの管理
## リポジトリの削除

```bash
sudo apt remove <application>
```

上記のようにアプリを削除したのち、そのアプリのリポジトリも削除したいという際は、

```
cd /etc/apt/sources.list.d/
ls
```

として、当該アプリのリポジトリファイルを探します。
`hogehoge`というアプリのリポジトリを削除したい場合は、

```bash:example
rm hogehoge.list hogehoge.list.save
```

のようにファイルを削除すれば、作業完了です。

# HDDの管理

## 接続ディスクの確認
```bash
sudo parted -l
```

```bash:partedの出力例
Model: ATA INTEL SSDSC2KW25 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name                  Flags
 1      1049kB  538MB  537MB  fat32        EFI System Partition  boot, esp
 2      538MB   256GB  256GB  ext4

Model: ATA WDC WD40EFRX-68N (scsi)
Disk /dev/sdb: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  4001GB  4001GB  ext4
```

## UUIDの確認

```bash
sudo blkid /dev/確認したいディスク
```



## GPGの管理

### 登録されているGPGキーの確認

```bash
sudo apt-key list
```

以下は、あるソフトの表示例になります。

```bash:example
pub   rsa4096 2020-01-29 [SC]
      D2A5 FEB3 4881 60F0 28CC  1791 8DA8 4BE5 DEB4 9217
uid           [ unknown] hogehoge Germany GmbH (hogehoge Linux 2020) <support@hogehoge.com>
```

### 登録されているGPGキーの削除

`apt-key list`で当該ソフトのfinger printを確認します。上記の例ですと、40文字のfinger printの最後8文字`DEB4 9217`が、必要な情報になります。

```bash
sudo apt-key del <keyid>
```

```bash:example
sudo apt-key del DEB49217
```

## ファイル共有
ファイル共有は、GUI上で`Local Network Share`をオンにすれば良いです。
自動的に必要に応じたアプリ（samba）がインストールされます。

クライアントからアクセスできないことがありますが、おそらくsambaでのアクセス設定が通っていないことによるものと思われます。

```bash
sudo pdbedit -a <hoge>
```

でユーザー、パスワードを設定することにより、解決できます。



# おわりに
随時、更新予定でいます。
pythonユーザーへ権限付与からmakemigrations して migrate までの流れ整理

git hubでclone作成から、各人が手を動かすためのbranchを作るためにsqlへの記録が必要になりますが、今回はその記録までの流れと、ひっかかったので、そのトラブルシュートも記載します。

まずpythonユーザーへの権限付与はこちら

```
grant CREATE, DROP, SELECT, UPDATE, INSERT, DELETE, ALTER, REFERENCES, INDEX on saku202010.* to python@localhost;
```

ですと、

そのあとにmakemigrationをします。

```
# python manage.py makemigrations register

```
```
# python manage.py makemigrations shop
```
こちらは各アプリケーションごとに行います。

順調かとおもいきやこんなエラーがでました。

![スクリーンショット 2020-10-17 15.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/3649ab0b-38e0-7b17-08ce-6841b4921879.png)

`no changes detected in app ','`

これは、データベースに変化はない。ってやつで、もうやらなくてもいい「ことがある」という意味です。
結論としては次のステップにいってOKです。

```
yuota@MacBook-Pro-3 saku202010 % python3 manage.py migrate
```
でmigrateを実行してもらうと、
![スクリーンショット 2020-10-17 16.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/44824f03-39c5-5daa-9a59-14e58d3c3c8e.png)

できました！ということです。
【VPC】VPC外のサービスへのアクセス

## やること
- プライベートサブネットに配置したDBサーバー用のEC2インスタンスからS3にアクセスする

## 1 .IAMロールを作成する
EC2からS3へのアクセスを許可するロールを作成する
![スクリーンショット 2020-08-15 15.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/3087172a-e8d6-088a-bbfc-9175dda4c9c2.png)
![スクリーンショット 2020-08-15 15.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/b90d0d62-7f49-70b0-ea4e-476752afcd84.png)
![スクリーンショット 2020-08-15 15.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/508835af-dd8a-705d-cce2-ac87e4963e55.png)
![スクリーンショット 2020-08-15 15.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/30361022-1c92-6cb6-5d66-92b2bc9e3a26.png)

## 2. インスタンスにロールを割り当てる
DBサーバー用のプライベートインスタンスに割り当てる
![スクリーンショット 2020-08-15 15.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/f6523001-d713-5067-0853-ff8142b13c7f.png)
![スクリーンショット 2020-08-15 15.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/b5639f91-f0c3-0ce5-e961-9da9f495983c.png)

## 3. S3バケットを作成する
![スクリーンショット 2020-08-15 15.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/69572b97-d8ed-6a55-df9a-1fadac7f096a.png)
![スクリーンショット 2020-08-15 15.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/a568bf77-8378-19f5-f286-61a35973293f.png)

## 4. サブネットをネットワークACLに関連付ける
パブリックサブネットとプライベートサブネットをフルオープンのネットワークACLに関連付ける
![スクリーンショット 2020-08-15 15.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/e5c3770e-8149-3801-fc3a-2bc769c24545.png)

## 5. パブリックインスタンスからプライベートインスタンスにアクセスする
```
[ec2-user@ip-[パブリックインスタンスのプライベートIP] ~]$ sudo su -
[root@ip-[パブリックインスタンスのプライベートIP] ~]# ssh ec2-user@[プライベートインスタンスのプライベートIP] -i [秘密鍵名].pem

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-[プライベートインスタンスのプライベートIP] ~]$
```

## 6. プライベートインスタンスからS3にアクセスする
バケット名が表示され、アクセスが成功していることが確認出来る

```
[root@ip-[プライベートインスタンスのプライベートIP] ~]# aws s3 ls
2020-08-02 14:41:59 kowata
2020-08-15 06:48:28 test-vpc20200815
```

**※ ルートテーブルにNATゲートウェイがアタッチされているため、プライベートインスタンスからインターネットへの接続が可能な状態**
Vue3の基本構文②

Vueの構文についてコードベースで簡単にまとめます。
今回は以下の三つです。
ちなみに前回は[こちら](https://qiita.com/takayuki-nakamura/items/86b763b2405384554017)

- eventハンドリング
- class & styleバインディング
- computedプロパティー

#eventハンドリング

```index.html
<div class="cart">Cart({{ cart }})</div>
...
<button class="button">Add to Cart</button>
```

```javascript:main.js
data() {
  return {
    cart: 0,
    ...
  }
}
```
`button`をクリックした際に`cart`の値を増やしたい場合、以下のように書くことができます。

###インラインで書く（処理がシンプルな場合）
```index.html
<button class="button" v-on:click="cart += 1">Add to Cart</button>
```
処理がシンプルな場合この様にインラインで書くことができますが、より複雑な場合は以下の様に`methods`を使います。

###メソッドを使って書く（基本的にこちらを使うことが多いです）
```index.html
<button class="button" v-on:click="addToCart">Add to Cart</button>
```
`button`をクリックすると、`addToCart`メソッドが呼ばれます。

```javascript:main.js
const app = Vue.createApp({
  data() {
    return {
      cart: 0,
      ...
    }
  },
  methods: {
    addToCart() {
      this.cart += 1
    }
  }
})
```
`methods`オプションの中にインラインで書いた処理と同じロジックの`addToCart`メソッドを追加します。ここで注意したいのが、`methods`オプションの中では`this.cart`を使ってVueインスタンスdataにある`cart`を参照します。

###ショートカット
```index.html
<button class="button" @click="addToCart">Add to Cart</button>
```
`v-bind`の`:`のように`v-on`も`@`で短縮形で書くことができます。

#class & styleバインディング

```index.html
<div 
  ...
  class="green" >
</div>
```
`green`クラスのCSSを要素にバインディング

```index.html
<div 
  ...
  :style="{ color: green }" >
</div>
```
要素に直接スタイルをバインディング

#computedプロパティ
```javascript:main.js
const app = Vue.createApp({
  data() {
    return {
      firstName: '太郎',
      lastName: '田中'
      ...
    }
  },
  computed: {
    fullName: function () {
        return this.firstName + ' ' + this.lastName
    }
  }
})
```
```index.html
<h1>{{ fullName }}</h1>
```
Vueインスタンスdataのプロパティからcomputedプロパティを生成することができます。computedプロパティは一度アクセスされると内部メモリに保存され高速で処理ができます。そして、computedプロパティ(`fullName`)が依存しているdataプロパティー(`firstNmae`,`lastName`)が変更された場合、再度関数が評価され`fullName`が更新されます。
golangでbashを呼び出す

## コマンド結果を受け取らず、実行完了まで待機
- Run

```golang

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    err := exec.Command("pwd").Run()
    if err != nil {
        fmt.Println("Command Exec Error.")
    }
}
```

## コマンド結果を受け取る
- Output

```golang

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	out, err := exec.Command("pwd").Output()
	if err != nil {
		fmt.Println("Command Exec Error.")
	}

	// 実行したコマンドの結果を出力
	fmt.Printf("pwd result: %s", string(out))
}
```

## 標準出力エラーを受け取る

```golang
- CombinedOutput

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	out, err := exec.Command("ls", "dummy").CombinedOutput()
	if err != nil {
		fmt.Println("Command Exec Error.")
	}

	// 実行したコマンドの標準出力＋標準エラー出力の内容
	fmt.Printf("ls result: \n%s", string(out))
}
```

## コマンド実行終了を待たない
- start
- waitとの組み合わせで待つことができる

```golang

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	cmd := exec.Command("sleep", "10")

	fmt.Println("Command Start.")

	err := cmd.Start()
	if err != nil {
		fmt.Println("Command Exec Error.")
	}

	//コメント外すと待機する
	//cmd.Wait()

	fmt.Println("Command Exit.")
}
```

## 参考
https://blog.y-yuki.net/entry/2017/04/28/000000
[Unity] resource busy or lockedがでてきてPackageManagerがインストールできない

# 現象

Package ManagerでCinemachineをインストールしようとすると、以下のエラーメッセージが表示

```
Cannot perform upm operation: EBUSY: resource busy or locked, open '~~~'
[NotFound].See console for more details
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()
```

![スクリーンショット 2020-10-18 134251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/d8f638aa-bbf4-1853-760e-72935896b1aa.png)

# 解決方法
Unity以外のアプリを全て閉じ、再インストール

エラーメッセージ的に、何かで影響するファイルが読み込み中の可能性が高いです。
自分は開発中だったため、VSCodeやVimで編集中にしたファイルがあったため閉じて再実行すれば解決しました。
django-adminが使えない

この記事は__django-admin__で__新しいプロジェクト__を作る方法を説明する。

#環境設定(Anaconda)
まず、anacondaをインストールする。
インストールは以下から
https://www.anaconda.com/products/individual#windows

Anacondaのコマンドプロンプトを使用する

#新プロジェクト作成の手順
以下にanacondaを使用したdjagoの新プロジェクト作成方法を示す。

__1.仮想環境を作る__
以下のように
conda create --name (仮想環境名) python=(pythonのバージョン)
を実行する。

*(仮想環境名)は仮想環境をたくさん作ったときに何の仮想環境か分かるようにする。
*(pythonのバージョン)は共同作業で何かを作製するときに有用。
それは、共同作業をする一人がpython3.6で、また違う人がpython3.7でコードするとコードの書き方が違うので、その環境でのpythonのバージョンを固定する。

```
C:>conda create --name py37 python=3.7
```

py37という名前の仮想環境が作られる。

__2.仮想環境名の確認__

```
C:>conda info -e
```

現在ある仮想環境の一覧が表示される。

__2.仮想環境に移動__
conda activate (移動したい仮想環境名)

```
C:>conda activate py37
```

指定した仮想環境に移動する。



#djangoのインストール

```
C:(py37)>conda install django
```

ここで、
>==> WARNING: A newer version of conda exists. <==
>  current version: 4.5.10
>  latest version: 4.8.5

という警告が出る時がある。
これは、新しいバージョンのcondaがあることを示している。

#新しいバージョンのconda入手

```
C:(py37)>conda update -n base -c defaults conda
```

これでcondaがアップデートされる。

#新プロジェクト作成
以下のように
django-admin startproject (プロジェクトの名前) (作成する場所) 
を実行する。

```
C:(py37)>django-admin startproject project .
```

これは、新プロジェクトのprojectという名前のディレクトリを現在のディレクトリに作っている。
client-goでDeploymentでUbuntuを起動するサンプル

```
package main

import (
    "context"
    "fmt"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/client-go/dynamic"
    "k8s.io/client-go/tools/clientcmd"
    "os"
    "path/filepath"
)

func main() {
    // Kubeconfigのファイルパスを指定
    kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        panic(err)
    }
    client, err := dynamic.NewForConfig(config)
    if err != nil {
        panic(err)
    }

    namespace := "default"

    deploymentRes := schema.GroupVersionResource{Group:"apps", Version: "v1", Resource: "deployments"}


    deployment := &unstructured.Unstructured{
        Object: map[string]interface{}{
            "apiVersion": "apps/v1",
            "kind":       "Deployment",
            "metadata": map[string]interface{}{
                "name": "ubuntu-deployment",
            },
            "spec": map[string]interface{}{
                "replicas": 2,
                "selector": map[string]interface{}{
                    "matchLabels": map[string]interface{}{
                        "app": "demo",
                    },
                },
                "template": map[string]interface{}{
                    "metadata": map[string]interface{}{
                        "labels": map[string]interface{}{
                            "app": "demo",
                        },
                    },

                    "spec": map[string]interface{}{
                        "containers": []map[string]interface{}{
                            {
                                "name":  "ubuntu",
                                "image": "ubuntu",
								"command": []string{
									"sleep",
									"infinity",
								},
                            },
                        },
                    },
                },
            },
        },
    }

    fmt.Println("Creating deployment...")
    result, err := client.Resource(deploymentRes).Namespace(namespace).Create(context.TODO(), deployment, metav1.CreateOptions{})
    if err != nil {
        panic(err)
    }
    fmt.Printf("Created deployment %q.\n", result.GetName())

}

```
Semi Lattice

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>)


# イントロ

semi latticeという概念は，知識の定着を効率化するのにとても効きます．短くまとめると，

    semi_lattice = coc + chunking + memo

なんですがこれすら「なんのこっちゃ？？」でしょうね．そこで，このリンクサイトを通じて，

-   概念としての知識の構造だけでなく，
-   具体的な知識をどうpc上に構築していくか，そして，
-   自分の持っている知識を仲間とどう共有していくか

を考えてみます．


# 必要な環境あるいはツール

-   wsl(or terminal) #=> cui, ssh, emacs
-   [github](https://qiita.com/daddygongon/private/9322c4a84697afa6cdcf)
-   my\_help
-   [qiita\_org](https://qiita.com/daddygongon/items/41e4d37e75675c7db0c4)


# 概念

-   [semi lattice](https://qiita.com/daddygongon/private/c59d7a08c22ca94ac11c)
-   [pattern language](https://qiita.com/daddygongon/items/dcf50940f04fb34c5c53) 直交補空間(open, my\_help, &#x2026;)
-   [coc(あるいは守破離)](https://qiita.com/daddygongon/items/8149eba25f8fd4d6d2aa), 直交性
-   [chunking(あるいは鏡餅)](https://qiita.com/daddygongon/items/a53d806cf493b6a56dab), tight binding
-   [am/pm covid19](https://qiita.com/daddygongon/items/b0bf7fa06a3dd601529c)


# [実践I - developer side](https://qiita.com/daddygongon/items/6f38d9a04e127a7952a7)

rubyによるapplication開発を例に，ruby言語の習得をsemi latticeで構築していく実践を見てもらいます．


# 実践II - user side

VASPによる第一原理有限温度計算を例に，難しい概念を理解するsemi latticeを構築していく様子を見てもらいます．

-   my\_help
-   qiita\_org
-   Einstein model
-   Ti
-   boundary 計算
-   Frenkel法
-   surface 計算
-   vacancy 計算



------
 - **source** ~/git_hub/ruby_docs/multi_scale_22_text/excludes/semi_lattice_20f/README.org
Node.jsでTop-Level Awaitを試す


Node.jsでTop-Level Awaitがサポートされ（て）たので、非同期通信と言えばなaxiosで試してみます。

## Top-Level Await

今まではawaitを利用する際に、async関数内じゃないと使えませんでしたが、async関数を宣言せずにawaitを使えるようになります。

## v14.3.0でサポート、v14.8.0でフラグなし

* [v 14.3.0](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md#14.3.0)

Top-Level AwaitはNode.js v14.3.0でサポートされましたが、この時点だと`--experimental-top-level-await`のフラグを付けて実行する必要がありました。

* [v 14.8.0](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md#14.8.0)

v14.8.0以降でフラグ無しで利用できます。

## axiosで利用してみる

> (一応)今回試した環境はNode.js v14.14.0です。

package.jsonに`"type": "module"`を追記して利用できます。
また、拡張子をmjsにするだけでも利用できます。↓ではmjsで試してみます。

```bash
$ npm init -y
$ npm i axios
```

* `app.mjs`を作成

ES Modules形式でimportします。

```js:app.mjs
import axios from 'axios';

const res = await axios.get(`https://protoout.studio`);
console.log(res.data);
```

めちゃシンプルに書けますね。

* 実行

実行も(.jsではなく)`.mjs`のファイルを実行します。

```bash
$ node app.mjs 
```

> 参考: [Top-Level Await support in Node.js v14.3.0](https://medium.com/@pprathameshmore/top-level-await-support-in-node-js-v14-3-0-8af4f4a4d478)

### 補足: 今までの書き方

今までだと、CommonJS 形式でモジュールを読み込み、async関数の中でawait呼び出しをするというのが通常だったと思います。

```app.js
'use strict;'

const axios = require('axios');

(async () => {
    const res = await axios.get('https://protoout.studio');
    console.log(res.data);
})();
```

あと`'use strict;'`の表記もありますね。ESM形式だとStrictモードがデフォルトで有効なので省略できてます。

こちらは実行は通常通り。

```
$ node app.js 
```

## 所感

ちょっとしたことを試す時にasync関数を書くのは結構めんどくさかったので、Top-Level Awaitはありがたいですね。
Common JS(require)からES Modules(impot/from)への移行の流れもあるのでちょっとしたところから慣れていきたい。

.jsを使わずに.mjsを基本とする流れでも良いのかな...? この辺気になります。
【VPC】ネットワークACLによるアクセス制御

## やること
- 自分のPCに割り当てられたグローバルIPアドレスを確認する
- 確認したグローバルIPアドレスからのアクセスをネットワークACLで拒否設定する

## 1. グローバルIPアドレスを確認する
確認出来るサイト：<a href="http://mbsupport.dip.jp/mb/ip.php">MB-Support</a>

## 2. インバウンドルールを追加する
確認したグローバルIPアドレスを拒否設定する
![スクリーンショット 2020-08-15 15.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/0cdd6657-3c29-858e-6afc-682ea1da4026.png)
**※ ネットワークACLの設定は順番に参照されるため、設定済みのルールより若い番号を割り当てる**

## 3. ルールの適用を確認する
ネットワークACLに関連付けられたサブネットに配置されているWebサーバー用インスタンスのパブリックIPにアクセスすると、アクセス出来なくなっていることがわかる
![スクリーンショット 2020-08-15 15.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/30d69058-9522-5815-a055-22a5dfbca05b.png)
民間企業の次期ネットワーク構想に向けて　第2話

#調査はしたけど急にコロナ！
ウチはオンプレのハードウェアとしてFW，IPS/IDS，仮想にプロキシサーバを利用しています。
年間どのぐらいのコストがかかっているのかを調査すべく，保守料，リプレースタイミング，リプレース費用などを調査しました。
機器ごとに契約は異なり，かなり煩雑になっていることも分かり，契約管理も大変だなぁ，と感じました。
一番のコストはやはりIPS/IDSで，今回のリプレースタイミングで何か打つ手はないかと考えていました。
#コロナ襲来！
調査を進める中，一旦手を止めなければならない事態が発生しました。
コロナです。
関東で猛威を振るい始める中，テレワーク環境の整備が急務となりました。
社外からの接続は「FortiGate」を使ってのVPN接続を利用していましたが，出張者を対象にしていた為，接続人数が大幅に増えた時，利用する業務アプリが増えた時どうなるかなどは検証していませんでした。
スタッフ部門がコロナ感染で出社できなくなった場合を想定して数百名単位の対策を講じる事になりました。
まず，FortiGateサーバがそれだけの負荷に耐えられるか，ネットワーク帯域は大丈夫か，セキュリティ面は問題ないかを調査・検討し，課題の洗い出しをしました。

【主な課題の一部】
　①CAD(Workstationをリモデ利用)がサクサク動かない
　②社内への接続はできるがインターネットへ接続できない場合がある
　③VPNを使用しない時はURLフィルタリングが使えない
など，様々な課題が持ち上がりました。

【課題の原因調査と対策】
　①CADがサクサク動かない→ネットワーク帯域を増強する＆「FortiClient」のバージョンアップ
　②社内への接続はできるがインターネットへ接続できない場合がある→Windows10のQUを適用
　③VPNを使用しない時はURLフィルタリングが使えない→VPN接続を必須とする運用での回避
と，原因調査と対策に追われる日々でした。

FortiClientのバージョンが古いせいでFortiGateと本社の帯域を1Gにしても100Mしか出ないという事象を確認し①の対策(自宅からのVPN接続利用時は自宅のインターネット環境が大きく影響することは周知)を行い，②の原因がOS起因だと判明してからはQU適用後の業務系アプリの動作確認を急ぎ，③については運用でカバーするしかないという結論に至りました。

そんなこんなでテレワーク対応は大急ぎながらも何とか形になりました。
感染者は出ませんでしたが，安全の為，数か所の営業拠点はテレワークとなり，現在に至るまで最大規模のテレワーク人数にはならずに済んでいます。

急務となったテレワーク対応でしたが，本記事の本題である次期ネットワーク構想につながるポイントを発見する事が出来ました。

(次回：第3話)
　コロナで見えたセキュリティ問題から次期ネットワーク構想へ
【React①】Reactの概要からhello-worldまで


#Reactの概要


 [React公式](https://ja.reactjs.org/ "React")
Facebookが開発したUIパーツ構築に特化しているJavaScript用ライブラリ。Facebook、Yahoo!、Uber、Airbnb、Slack、Netflixなど有名企業で採用されていて、今後のデファクトスタンダードになると期待されるライブラリ。

###3つのコンセプト

- **Declarative**
条件と結果が明確にコードに記載される。JavaScriptと異なる点である。従来の命令型のように、欲しいUIを頭の中で一度整理して、main要素を作って次はinput要素を作って初期値にfooを入れて、、という命令に変換しなくても、「アプリの内部状態がこの状態だったら、この見た目にする！」と宣言するように実装できる。

- **Component-Based**
アプリケーションの構成要素を小さい部品(コンポーネント)の集合として考えて設計し、機能を小さい部品に分割して持たせる。部品化することで保守性を高め、再利用できるようになる。

- **Learn Once, Write Anywhere**
新しい機能を追加しやすいため、開発の途中から利用されることを想定して開発できる。また、モバイルアプリ開発ではReact Native、VR開発ではReact VRフレームワークで開発することができるなど、拡張性が高い。

###特徴 

- **レンダリングが高速 **
DOM（Document Of Model）とはHTMLにアクセスする窓口の役割を果たす。DOMを生成してHTML構造や見た目を作ったりコンテンツを変更することができる。Reactでは**仮想DOM**という技術で、Webページ内の一部を更新したいときに全てページをまるっと更新するのではなく、更新された一部のみを変更することができる。パフォーマンスが良いため、**SPA（Single Page Application）**に必要な高速な動作速度を実現できる。

- **大規模なアプリケーション管理が容易**
多数のコンポーネントの再利用化ができ、管理がしやすい。レンダリング（コンポーネント指向の機能）とその他の機能も別々のモジュールとして開発されている。

- **可読性が高い**
JSXを使用することでHTMLを書いているかのようにReact内に組み込むことができる。更にTypeScriptを使えば厳密に型チェックも可能。

- **流行のUIパーツが提供されている**
google標準で使われている[Material-UI](https://material-ui.com/) を始め、ButtonやForm、Table等の良い感じのUIパーツが提供されていて、Reactコンポーネントとして簡単にインポートして扱える。


#開発環境の準備
**1. Node.jsの最新版をダウンロード**

以下のページから最新のLTS（long term support）をダウンロード。
 [Node.js](https://nodejs.org/ja/ "Node")

ターミナルでNodeのバージョンを確認。

```
$ node -v 
```

**2. yarnをインストール**

Nodeのパッケージマネジャーであるyarnをインストール。
Node.jsをダウンロードした際に標準でダウンロードされているnpmよりも高速化つ信頼度が高い。
これらのパッケージマネジャーを使用することで、依存関係を解消できる。

```
$ npm install --global yarn
$ yarn --version
```

パッケージ管理システムについては以下参考 
[【JavaScript・React】基本知識](https://qiita.com/suema0331/private/cb60d6ae81c04e08952e)

>**主な機能**
>1. ローカル環境のパッケージを更新、検索
>2. パッケージインストール削除
>3. 依存関係の解決、必要な依存パッケージ自動インストール
>4. 設定を書いて1-3を自動化



**3. 作業用にGithubリポジトリ作成**

作業用にリポジトリ作成し、ローカルにgit cloneしておく。
 [GitHub](https://github.com/)

sample.gitをローカルのplaygroundというディレクトリにcloneする場合、

```
$ git clone sample.git playground
```

**4. create-react-appをインストール**

Facebook社が開発したreactのboilerplate(雛形)であるcreate-react-appをインストール。
これで、従来Bubbleやwebpack等様々なパッケージをマニュアルでインストールする必要があった問題が解消されている(ようです)。

```
$ yarn global add create-react-app
```
**※npm5.2以降、Node.jsがあれば以下のコマンドでcreate-react-appインストールからplayground環境構築まで一気に終わる！🏃‍♂️**

```
 npx create-react-app playground
```


**create-react-appの構成**
create-react-appすると以下のディレクトリができる。

* **src**:コンポーネントを作るJSファイル置き場
    * src/App.jsを変更すると画面が切り替わる
    * src/index.jsでDOMを使ってsrc/App.jsを呼び出し、`root`要素に置き換えている
    
* **public**：HTMLファイルや設定置き場
    * public/index.jsの`<div id="root">`がsrc/index.jsで置き換えられている
    * この中身がReactのコンポネントになる
    * faviconやロゴ
    
* **build**：本番環境用のファイル生成場所
    * `npm run build`でビルド後、webpackで**src**と**public**がバンドルされる
    * cssやjsは複数出力されず、一個にまとめて出力
    


## hello world が表示されることを確認して完了！
playgroundというディレクトリにGithubリポジトリをcloneした場合、

```
$ create-react-app  ../playground
$ yarn run start
```
Kubernetesでubuntuイメージを起動するDeploymentのサンプル


## サンプル

```ubuntu-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "ubuntu"
  template:
    metadata:
      labels:
        app: "ubuntu"
    spec:
      containers:
        - name: ubuntu
          image: ubuntu
          command:
            - sleep
            - infinity
```

これをつけないとCrashLoopBackOffになる

```
          command:
            - sleep
            - infinity
```

## 起動

```
yuta:~ $ kubectl apply -f ubuntu-pod.yaml 
deployment.apps/ubuntu created
```
qiita_org 関連の記事



# イントロ

qiitaにorgから投稿するqiita\_orgの解説関連記事のまとめサイト


# install and config

-   [org-modeのテキストをqiitaに投稿するgemを作ってみた](https://qiita.com/yamatoken/items/858692178d288c40714d)
-   [qiita\_orgのコマンドについて](https://qiita.com/yamatoken/items/9314161758e778fd82c0)


# 開発関連

-   [qiita apiに投げる，apiのデバッグ(post to Qiita api v2)](https://qiita.com/daddygongon/items/a040be4fe15c0c0b525f)
-   [Org-modeからQiita準拠のMarkdownをexportするパッケージを作ってみました](https://qiita.com/0x60df/items/3cde67967e3db30d9afe)



------
 - **source** ~/git_hub/semi_lattice/docs/qiita_org.org
Ubuntu 18.04.5のVS code(Visual Studio Code)で日本語入力ができない！？ UbuntuにVSCodeをダウンロードする場合は公式サイトから！！

#目的
表題の通りUbuntuのVS codeで日本語入力ができない方向けの記事です。
すぐに解決できます。

#手順・目次
　１. [なぜ日本語入力できないのか](#１なぜ日本語入力できないのか)
　２. [日本語入力できるようにする方法](#２日本語入力できるようにする方法)

#実施
##１．なぜ日本語入力できないのか
原因は、snapが原因のようです。
バージョンは違いますが、詳しくは下記を参照ください。
https://teratail.com/questions/121986


下記の公式サイトからダウンロードした方は、問題なく日本入力できますが
https://code.visualstudio.com/download
UbuntuソフトウェアからVSCodeをダウンロードすると日本語入力できないようです。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764570/b418a3a9-d0fe-8aa4-9587-541ae6974094.png)

LTSでもあるんですね。。


##２．日本語入力できるようにする方法
では、日本語入力をできるようにする方法です。
上でも記載しましたが、公式サイトからダウンロード再ダウンロードすればできるようになります。
https://code.visualstudio.com/download

パッケージのインストールは、前回のダウンロード内容が引き継がれるので再ダウンロードの必要はなかったです。
良かった。。

いやもうあれですね、
「UbuntuにVSCodeをダウンロードする場合は公式サイトから！！」
です。

#参考サイト様
https://teratail.com/questions/121986
Gem paranoiaを使った論理削除

## 備忘録
今回自作アプリ作成の際に論理削除を用いたので備忘録として記録します。
プログラミング初心者のため間違いがあればご指摘お願いします！
今回はrails、MySQLを使い開発を進めています。

## 論理削除とは
一般的な削除は物理削除と言い削除したらDB上からもデータが削除されます。
それに対し、論理削除とは一般的な削除とは違い、あたかも削除されたように見せてDBにはデータが残っている状態のことを言います。
削除履歴を表示したり、データの復元などにも使われます。


##ステップ１　Gemの導入
論理削除の手間を大幅にカットしてくれるGemのparanoiaを導入する。
Gemfileに記述しターミナルでbundle install

```ruby
gem 'rails_12factor'
```

## ステップ2　カラムを追加
論理削除をするとこちらのカラムに削除した日時が挿入され、削除フラグを立てる事ができます。


```ruby
class AddDeletedAtToCategories < ActiveRecord::Migration[6.0]
  def change
    add_column :categories, :deleted_at, :datetime
  end
end

```

正しければ、$ rails db:migrateして下さい。
モデルに以下の記述をします。

## ステップ３　モデルを編集する
```ruby
acts_as_paranoid
```

## まとめ
以上の設定でparanoiaを使った論理削除の設定が完了しました！
普通に実装しようとするとかなり大変だと思いますが、paranoiaを使う事で簡単に実装する事ができました！
プログラミング初心者の方の役に立てると幸いです。
#google-mapで検索が行えない。。

####googlemapで住所検索を設定するまでの過程
↓こちらを参考にさせていただきました。誠にありがとうございます。
https://qiita.com/nagaseToya/items/e49977efb686ed05eadb

##起こったエラー名
this api key is not authorized to use this service or api
（サービスやAPI使うに当たって適切な権限を持っていませんよ）＊意訳

######いろいろと調べてみて結果、、口を揃えて　「Geocoding API」が有効化されてないよ。。。という
＊（Geocoding APIは住所位置を認証する権限、、みたいな）
####①まず左にあるリストから『APIとサービス』を選びましょう
![スクリーンショット 2020-10-18 11.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/62f5302f-57e0-c87b-7e33-1d509e8b7d38.png)
####②『認証情報』を選択
![スクリーンショット 2020-10-18 11.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/d6aa6497-a176-37c0-2b0a-f5e5289e66da.png)
####③指定されたAPIキーを選びましょう
![スクリーンショット 2020-10-18 11.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/87a923a4-746c-dfec-9727-de39c468e5c6.png)
####④アプリケーションの制限を選択して保存
![スクリーンショット 2020-10-18 11.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/e4ded7ab-5a1b-36e9-b67a-3e9e80501bb4.png)

###以上です。上の検索画面からGeocoding APIと調べると、Geocoding APIを有効にするという項目が出ますが
これをやってもうまくいかなかったので上記の手順を踏んでみてください！

###以上ご一読ありがとうございました！
emacs color on terminal for catalina



# 初めに

catalinaに変えて，dark-modeを使い始めたんですが．．．terminal上のemacs のorg-modeで表示される文字が暗くて見えません．具体的には，dark-blueとかmidnight-blueです．なんで，それを変えようとしてはまりました．照度を上げると見えるんですが，エコじゃないんで，出来るだけ低い照度でしかも視認性がよくって，さらに心が躍るcolorを追求していきます．

現在の設定では次のようになっています．

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/2dca2164-8282-745d-0e88-a260161b247b.png)| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/a7ff60e3-06ab-7057-60e9-13b6f49836ad.png)|
|:------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------|
| ruby-mode                                                                                                   | org-modea                                                                                                   |

こんなのがいいよというお勧めがあったらコメください．


# [Emacsで、特定の文字の色を変更する](https://qiita.com/AnchorBlues/items/91026c4f1c0745f5b851)

ちょっとメモとる手間なやり方が書かれていますが，下の手順で簡単に可能．

1.  M-x describe-face
    1.  returnでより詳細な設定表示で，customize\_this\_faceを選ぶとそのまま編集画面
    2.  Foregound -> Chooseで選択
2.  M-x list-faces-display


# defaultに戻す

-   M-x list-faces-displayでfaceのtitleを選んだ段階で，
-   Revertボタンを押す
-   挙動が選べる
-   2(Erase custamization)でdefaultに戻る


# emacs color

-   [emacs theme gallery](https://pawelbx.github.io/emacs-theme-gallery/)


# themeのactivation

```el
(add-to-list 'load-path              "/path/to/alect-themes")
(add-to-list 'custom-theme-load-path "/path/to/alect-themes")
```

    M-x load-theme RET alect-light, black, dark

でいくはずですが，行かない．

    (setq alect-display-class '((class color) (min-colors 256)))

をinit.elに足すと行くようになりました．重たくなりそうな感じ．やめようか．


# 最終的に

-   **terminalの調整:** terminalはbasicなんですが，ANSIカラーの青系統を明るめに設定．
-   **emacs color:** themeを変えるのはやめました．defaultのcolorの多彩さがrubyを書くときに気持ちがいいから．でも，org-modeのtitleとかは読みづらいです．そこで，org-document-info, titleをcolor-21に変更しています．
-   **line high light:** ln-lineを使っているのですが，これも変更しています．これは相当悩みました．

```el:init.el
(global-hl-line-mode)
;; (set-face-background hl-line-face "gray13")
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(hl-line ((t (:inherit highlight :background "cyan"))))
 '(org-document-info ((t (:foreground "color-21"))))
 '(org-document-title ((t (:foreground "color-21" :weight bold)))))
```


# hl-line

hl-lineは遅くなるという記述があります．確認できていませんが，本当なら下を参考に．

-   <http://emacs.rubikitch.com/global-hl-line-mode-timer/>
-   <https://stackoverflow.com/questions/4495406/hl-line-mode-emacs-color-change>



------
 - **source** ~/git_hub/ruby_docs/qiita/qiita_post/emacs_color.org
より簡単に Web アプリを構築する方法

前回、[簡単にコストを節約して Web サイトを構築する方法](https://qiita.com/changeworld/items/d68ade88c2b0fa8788fe)についてご紹介しました。ご紹介した [Azure Blob Storage](https://azure.microsoft.com/ja-jp/services/storage/blobs/?WT.mc_id=AZ-MVP-5001601) は静的 Web サイトのホスティングのみ対応していました。

静的 Web サイト以外に Web アプリを構築したい場合もあるかと思います。

そこで、今回は、より簡単に Web アプリを構築する方法についてご紹介したいと思います。

※注意点※
今回ご紹介する [Static Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/static/?WT.mc_id=AZ-MVP-5001601) はまだプレビュー版のため、正式版になった際に変更される可能性があります。

## What is [Static Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/static/?WT.mc_id=AZ-MVP-5001601) ?

今年 5 月に開催された Microsoft Build 2020 で発表されたサービスです。Vue.js、React、Angular などのフレームワークで開発されたアプリや JavaScript、TypeScript などで開発する SPA（Single Page Application) などの運用に最適化されています。

詳細は[公式](https://azure.microsoft.com/ja-jp/services/app-service/static/?WT.mc_id=AZ-MVP-5001601)を読んでください。ざっと私が理解した範囲での機能や特徴は以下の通りです。

* 無償で Web アプリ、静的 Web サイトをホスティングできる
* グローバル配信
* サーバーレス API 対応
* GitHub Actions によるビルド & デプロイ ※ GitHub との連携は必須
* 無償でカスタムドメイン対応、SSL証明書の自動更新
* 認証と承認機構が利用可能
* プレビューデプロイ機能（Pull Request したブランチも自動的にデプロイされ、どのように表示されるのかが確認できる）

といった具合です。書いていて、今まで [Azure Blob Storage](https://azure.microsoft.com/ja-jp/services/storage/blobs/?WT.mc_id=AZ-MVP-5001601) で対応していた部分がかなり簡略化（シンプル）になるので、正式版になるのが待ち遠しいです。

詳細は [公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/static-web-apps/?WT.mc_id=AZ-MVP-5001601) をご覧ください。

また、実際にハンズオン形式で試してみたいといった場合は[こちら](https://docs.microsoft.com/ja-jp/learn/modules/publish-app-service-static-web-app-api/?WT.mc_id=AZ-MVP-5001601)や[こちら](https://docs.microsoft.com/ja-jp/learn/modules/create-deploy-static-webapp-gatsby-app-service/?WT.mc_id=AZ-MVP-5001601) で実際に触れてみるといいと思います。

## 参考

* [Azure Static Web Apps – App service | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/app-service/static/?WT.mc_id=AZ-MVP-5001601)
* [Azure Static Web Apps のドキュメント | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/static-web-apps/?WT.mc_id=AZ-MVP-5001601)
* [Azure Static Web Apps を使用して Angular、React、Svelte、または Vue の JavaScript アプリを発行する - Learn | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/modules/publish-app-service-static-web-app-api/?WT.mc_id=AZ-MVP-5001601)
* [Gatsby と Azure Static Web Apps で静的 Web アプリを作成して発行する - Learn | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/modules/create-deploy-static-webapp-gatsby-app-service/?WT.mc_id=AZ-MVP-5001601)
【StereoDepth】GA-Net : 3D ConvolutionよりSGAでGlobalに

<h1>GA-Net: Guided Aggregation Net for End-to-end Stereo Matching</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/619867ad-75c7-d713-c9b4-3876f49f19ad.png)

今までのEnd-to-EndのStereo Matchingでは3D Convolutionを使いW,H,Dの情報を学習していたが、この論文ではSemi Global Matchingで使われているSGAという方法を代わりに使う事で、より画像全体の情報を学習出来るようになった。



<h1>Semi-Global Guided Aggregation (SGA)</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/7487b363-e473-cfe5-ed3a-159598c50f99.png)

3D convolutionをする代わりに４方向から特徴量のSimlilarityを計算し、出力する。これによって3D Convolutionでは画像全体で同じweightを掛けていたのに対して、SGAはMatching Costを画像の端から端まで情報を伝えてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8a2878ec-b557-a7e3-d648-dd5dfaf67954.png)

<h1>Local Guided Aggregation (LGA)</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/bc408c52-6adb-bfdd-d339-4e972c220b8c.png)

downsmapleとupdasampleを繰り返し、細かい情報が失われているので、図にあるように周りのMatching Costを合計する事で、Smoothingの役割を果たしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a5cee6cc-63f9-ce79-53fa-bf9cba5161eb.png)


<h1>結論</h1>
3D convolutionよりSGAの方が画像全体のMaching Costを伝えられるので、より効果的！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/afa21009-c7dd-9517-132e-c6c7b65b9455.png)

<h1>参考文献</h1>
GA-Net: Guided Aggregation Net for End-to-end Stereo Matching
https://arxiv.org/pdf/1904.06587.pdf
iPhoneショートカットで出退勤のタイムカードを作成する


こんにちは。
今回はiPhoneのショートカットアプリを使ってタイムカードを作ってみました。

##タイムカードを作ってみたい
現在私は大学院に通っています。自分が毎日・毎週どれくらいの時間をラボで過ごしているのかが気になり、一昔前にタイムカードを作って研究室にどれくらい滞在していたかを記録していました。その時のタイムカードはIFTTTで作成しており、スマホのGPSを使って研究室のエリア内に入った時間と出ていった時間をGoogleスプレッドシートに記録するというものでした。しかし、GPSの精度がイマイチで研究室に入っていないのに近くを通過しただけで入室判定になったりと微妙な感じでした。そこで今回は本物のタイムカードのように物理的な認証によって入室・退室を記録しようと考えました。

##iPhoneショートカット×Googleカレンダー
そこで**iPhoneショートカット**と**Googleカレンダー**を利用することにしました。完成形はこのような流れです。

1. 入室時、iPhoneのNFCタグリーダーで入室のタグを読み込ませる
2. 入室タグでショートカットのトリガーが起動し、Googleカレンダーに現在の日時を登録する(仮登録)。ついでにWi-Fiオン・おやすみモードオン
3. 退室時、再びiPhoneのNFCタグリーダーで退室のタグを読み込ませる
4. 退室タグでショートカットのトリガーが起動し、Googleカレンダーの入室時刻を読み取り、入退室時刻を合わせて1つのイベントとしてカレンダーに登録する
5. 入室時の仮登録のイベントを削除

メインで使用するのはiPhoneショートカットのNFCタグリーダーとGoogleカレンダーです。NFCタグへのタッチで操作を簡素化、さらにGoogleカレンダーを使うことで可視性が良く、色々なデバイスで共有されるので便利です。

##要所解説
###0. 準備
iPhone以外で必要なものは以下の通りです。
・ NFCタグ
　amazonでの購入先リンクは[こちら](https://amzn.to/3kaYtVN)
・ 出退勤を記録したいGoogleカレンダーとそれを登録するカレンダー

###1. 入室タグの読み込み
iPhoneショートカットのオートメーションにはNFCタグをトリガーにショートカットのアクションを設定できるので、その機能を使います。自分は入室・退室用のタグそれぞれ準備しています。

###2. Googleカレンダーへの出勤記録の仮登録
ショートカットの新規イベントの作成で、出勤簿のカレンダーに入室時の時刻を記録する。この際、メモに"仮"と記載しておきます。これが1つのポイントです。

ここでの難所は時刻登録の方法です。iPhoneショートカットには時刻周りにバクが存在します。ショートカットアプリなのか、時刻の関数(?)なのかは分かりません。午前1〜6時頃までの時刻を使用すると全て午後に変換されてしまいます(どの時刻まで不正確か以前調べましたが、記事の下書きが消えてしまいました…)。こんな深夜・早朝に研究室には行かないので機能の修正はほぼ不要ですが何となく嫌なので直します。修正方法については下記のブログに記事がありました。

https://mecobalamin.hatenablog.com/entry/2019/11/30/074712

`日付フォーマット: カスタム`
`時間フォーマット: yyyy/MM/dd HH:mm:ss`
で問題なく使うことができます。

###3. 退室タグの読み込み
1と同じ

###4. 入退室時刻を合わせて一つのイベントとして登録する
ここがやや複雑です。
まずカレンダーの検索で、仮登録した出勤のイベントを取得します。出勤簿のカレンダーのうちで最も新しく、メモに"仮"の記載があるイベントを検索で取得します。取得したイベントの開始時刻を新規イベントの開始時刻に、現時刻を終了時刻にすることで、出勤・退勤時刻が1つにまとまったイベントが作成できます。

###5. 入室時の仮登録イベントを削除する
仮登録したイベントを削除します。
本来はこのイベントの退勤時刻をアップデートするのが楽なのですが、既に登録済みのイベントの時刻や詳細を変更することができないのでこうしています。

##ショートカットの全景
ショートカットのスクリーンショットを掲載します。
###出勤記録
<img width="400" alt="Screenshot at Oct 27 18-00-47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/6ef68276-8413-997d-bc68-550723ca4b03.jpeg">

###退勤記録
<img width="400" alt="Screenshot at Oct 27 18-00-47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/58c37000-b0fb-ab9e-374f-175a23f4e965.jpeg">


##ショートカットの共有
以下にショートカットのダウンロードリンクを貼っておきます。登録先のカレンダーを全て「毎回尋ねる」に設定を変更してあるので、使用前に自分の使用したいカレンダーに変更してください。

出勤記録
https://www.icloud.com/shortcuts/02a7826a34d648f6ba3c86ddd16237bd

退勤記録
https://www.icloud.com/shortcuts/6223ffea4dc74e4993d488a1aace3ff6
Buttonが反応しない時の対処法

Interactableをチェックしたら反応するようになりました

![スクリーンショット 2020-10-18 11.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712772/c147cc65-11c5-c462-e79e-938cfc6f3350.png)
terraformでgithubを管理してたら何もしてないのにwarning, error in 2020/10

# private -> visibility

`Warning: "private": [DEPRECATED] use visibility instead` というワーニングが。

```repo.tf
resource github_repository repo {
  private = true
}
```

これを

```repo.tf
resource github_repository repo {
  visibility = "private"
}
```
こう。

# repository_id

`The argument "repository_id" is required, but no definition was found.` というエラーが。

`node_id` を指定する。

```repo.tf
resource github_branch_protection repo {
  repository_id = github_repository.repo.node_id
  ...
}
```
gitignore.io をコマンドラインより利用しよう

## 前提 gitとは

バージョン管理（変更管理）システム

https://tcd-theme.com/2019/12/what-is-git.html

## 前提　.gitignoreとは

gitによるファイルの変更の管理の中には含めたくないファイルがある場合、`.gitignore`ファイルを作りその中にファイル名を書いておくと、そのファイル（フォルダ）は無視してくれる。

[.gitignoreについて](https://qiita.com/sf213471118/items/efbc0abf028a3ead72e7)

## 前提　gitignore.ioとは
 
様々な開発の場面で、典型的に.gitignoreに含めた方がいいファイル・フォルダをリストアップし表示してくれるサイト。コマンドライン ツールも用意されている。

[.gitignoreを自動的に作る（gibo, gitignore.io を使う）](https://qiita.com/yumechi/items/b7932f5b31613a1f50f9)

## コマンドラインよりgitignore.ioを使う



### コマンドラインツールインストール(macの場合)

https://docs.gitignore.io/install/command-line

```
echo "function gi() { curl -sL https://www.toptal.com/developers/gitignore/api/\$@ ;}" >> \
~/.bash_profile && source ~/.bash_profile
```

やっていることは単純で、bash_profileにgiというコマンドを追加している。
giコマンドでは、引数で入力した単語をURLの末尾に付け加え、curlコマンドを叩きURLから.gitignoreのデータを持ってくるようである。
また、source ~/.bash_profileを叩くことで、bash_profileへの変更を即座に反映している（ターミナルを一度閉じて開き直さなくても、直ちにgiコマンドを使用可能にしている）。

### 実行例
 
https://docs.gitignore.io/use/command-line

プロジェクトフォルダに移動した後、例えば以下のようなコマンドを叩く。

```
gi linux,java >> .gitignore
```

```
gi Xcode,CocoaPods,Carthage,fastlane,Swift,SwiftPM,SwiftPackageManager,Objective-C >> .gitignore
```
【StereoDepth】DSMNet(Domain Norm) : ピクセルレベルのInstanceNorm

<h1>Domain-invariant Stereo Matching Networks</h1>
Pixelレベルの影響が大きいStereo Depth Estimation
そこでDSMNetではDomain Normを提案した

<h2>アルゴリズム</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/013eec31-8791-4436-1c0d-17b7abf373b0.png)
Instance Norm=>Batch NormのBatch size=1の時
Domain Norm=>Instance Normをした後にPixel毎にChannel方向にNormalizationする


数式的に見てみよう

```
class DomainNorm(nn.Module):
    def __init__(self, channel):
        super(DomainNorm, self).__init__()
        self.instanceNorm = nn.InstanceNorm2d(num_features=channel, affine=False)
    def forward(self, x):
        x = self.instanceNorm(x)
        return F.normalize(x, p=2, dim=1)
```

InstanceNormした後に最大値の2乗の値で正規化するのか
output = x / Max(x)^2

なるほど～！

一応PytorchのF.normalizeの説明を下に付けときます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/87166685-eac0-6815-fa4e-4194dc07f5c4.png)


<h2>Stereo Depthへの実装</h2>
Feature ExtractionのBatch NormをDomain Normに代える

Domain Normを使うとcolor, style, illuminanceの影響が軽減されるらしい

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2f2fd0e7-887b-444a-4fab-243233c84e67.png)
                                                    
Domain NormはChannelをpixel levelで正規化出来ている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/86272d60-5df4-7d4c-62be-5d8fa9d68f71.png)

Domain Normを使うと精度が上がってる。

<h1>結論</h1>
・Domain Normlizationを使う事でpixel単位でchannelの正規化が出来、精度があがっている。
簡単に実装できるし一般的に有効な気がするけど、あんまり使われてないのはどこかに問題があったりするのかな～?


<h1>参考文献</h1>
Domain-invariant Stereo Matching Networks
https://arxiv.org/pdf/1911.13287.pdf

normalize(Pytorch実装)
https://pytorch.org/docs/master/nn.functional.html#torch.nn.functional.normalize

DSMNet git
https://github.com/feihuzhang/DSMNet/blob/7b7763c33f74532e2f09983731e9c1543462fbf0/models/DSMNet.py#L17
git add .した後にgit statusするとChanges not staged for commit:と出る時の対処法



#内容
GitHubにcommitしようと思いgit add . をしてgit status で確認したところ、"Changes not staged for commit:"と出てうまく反映されてなかった

#実際出たエラー内容
```:
$ git add .
$ git status
On branch login
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   app/controllers/users_controller.rb
	modified:   db/mysql/volumes/ib_logfile0
	modified:   db/mysql/volumes/ibdata1
	modified:   db/mysql/volumes/ibtmp1
	modified:   db/mysql/volumes/myapp_test/users.ibd
	modified:   db/mysql/volumes/mysql/innodb_index_stats.ibd
	modified:   db/mysql/volumes/mysql/innodb_table_stats.ibd
	modified:   spec/requests/users_signup_spec.rb

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   db/mysql/volumes/ibdata1
```
#解決方法
このエラーの場合"db/mysql/volumes/ibdata1"がうまくステージされてないよと言われているので,ファイル名を指定してgit addコマンドを実行する

```:
$ git add db/mysql/volumes/ibdata1
$ git status
On branch login
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   app/controllers/users_controller.rb
	modified:   db/mysql/volumes/ib_logfile0
	modified:   db/mysql/volumes/ibdata1
	modified:   db/mysql/volumes/ibtmp1
	modified:   db/mysql/volumes/myapp_test/users.ibd
	modified:   db/mysql/volumes/mysql/innodb_index_stats.ibd
	modified:   db/mysql/volumes/mysql/innodb_table_stats.ibd
	modified:   spec/requests/users_signup_spec.rb
```
ちゃんと反映されました！
#最後に
コミットはこまめに行うので、エラーが出たら焦らず対処していきたいです。
MaixAmigo でタッチスクリーンを使う

# はじめに

MaixAmigoは押しボタンスイッチ以外にタッチスクリーンも利用できます。Sipeed社のHPのスペックにはFT6X36という記載があります。

# タッチスクリーン

MaixPyにはtouchscreenでタッチスクリーンが使える実装もあるようですが、デフォルトのMaixPyはNS2009のみ対応していてFT6X36は直接利用できないようです。Sipeedのデモ（demo_touchscreen.py）にFT6X36から取得するロジックを追加してみます。

```python
from machine import I2C
import lcd, image
from board import board_info
from fpioa_manager import fm
from Maix import GPIO
import utime

ENTER_KEY = 23
FT6X36_ADDR = 0x38
PIN_23 = 33 # FT6X36 irq

class TouchSensor:
    i2c, key = None, None

    STATUS_IDLE = -1
    STATUS_PRESS = 0
    STATUS_MOVE = 1
    STATUS_RELEASE = 2

#    def irq(GPIO):
#        key.disirq()
#        key.irq(TouchScreen.irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7)
    
    
    def init(i2c_dev=None):
        TouchSensor.i2c = i2c_dev
        if TouchSensor.i2c == None:
            print("FT6X36 init error")
            return False
        if not (FT6X36_ADDR in TouchSensor.i2c.scan()):
            print("FT6X36 not found")
            return False
        vendorID = TouchSensor.i2c.readfrom_mem(FT6X36_ADDR, 0xA8, 1, mem_size=8)
        chipID = TouchSensor.i2c.readfrom_mem(FT6X36_ADDR, 0xA3, 1, mem_size=8)
        if (vendorID != b'\x11'):
            print("FT6X36 not found")
            return False
        if (chipID != b'\x06' and chipID != b'\x26' and chipID != b'\x36'):
            print("FT6X36 not found")
            return False
        # init
        TouchSensor.i2c.writeto_mem(FT6X36_ADDR, 0x00, 0x00, mem_size=8) # device_mode: 
        TouchSensor.i2c.writeto_mem(FT6X36_ADDR, 0x80,   22, mem_size=8) # threshhold: 
        TouchSensor.i2c.writeto_mem(FT6X36_ADDR, 0x88, 0x0E, mem_size=8) # touchrate_active: 

#        fm.register(PIN_23, fm.fpioa.GPIOHS0)
#        key = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE)
#        utime.sleep_ms(500)
#        key.value()
#        key.irq(TouchSensor.irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7)

    def deinit():
        key.disirq()
        fm.unregister(PIN_23, fm.fpioa.GPIOHS0)

    def read():
        dat = TouchSensor.i2c.readfrom_mem(FT6X36_ADDR, 0x00, 16, mem_size=8)
        status = (dat[3] >> 6) & 0x0F
        x = (dat[3] << 8) & 0x0F00 | dat[4]
        y = (dat[5] << 8) & 0x0F00 | dat[6]
        ret_x = y - 80
        ret_y = 280 - x
        if ret_y < 0:
            ret_y = 0
        return status, ret_x, ret_y

lcd.init(freq=20000000)
i2c = I2C(I2C.I2C0, freq=400000, scl=24, sda=27)
TouchSensor.init(i2c)

fm.register(ENTER_KEY, fm.fpioa.GPIO1, force=True)
btn_clear = GPIO(GPIO.GPIO1, GPIO.IN)

lcd.clear()
img = image.Image()
img.draw_rectangle(0, 0, 320, 240, lcd.RED)
status_last = TouchSensor.STATUS_IDLE
x_last = 0
y_last = 0
draw = False
while True:
    (status,x,y) = TouchSensor.read()
    print(status, x, y)
    if draw:
        img.draw_line((x_last, y_last, x, y))
    if status_last!=status:
        if (status==TouchSensor.STATUS_PRESS or status == TouchSensor.STATUS_MOVE):
            draw = True
        else:
            draw = False
        status_last = status
    lcd.display(img)
    x_last = x
    y_last = y
    if btn_clear.value() == 0:
        img.clear()

```
Gatsby+Contentful+GraphQLでデータが重複（2重）に取得されてハマった件

Gatsby+Contentful+GraphQLの構成でサイト作成をしていた際に、少しハマったのでメモしておきます。

## 状態

+ Contentful側ではデータは1件
+ GraphQLで取得するとデータが重複して取得される

それぞれの状態はこんな感じです。

### Contentful側ではデータは1件

一覧の見た目上は一件です。

![スクリーンショット 2020-10-18 10.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/9cdc94a9-8876-0afb-ccd8-3cdb0104701f.png)

### GraphQLで取得するとデータが重複して取得される

GraphQLで取得すると2件取れます...

![スクリーンショット 2020-10-18 10.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/2c958862-ba8a-18a7-c04a-1a774a12dcff.png)

## 原因

原因は、Contentful側のLocale設定でした。
→デフォルトでアカウント作成すると、複数Locale設定されていると思います(※2020/10/16現在)。

![スクリーンショット 2020-10-18 10.11.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/13fbeb71-503d-71c9-72b8-1561a6486362.jpeg)

### GraphQLでLocaleも取得する

英語（en-US）とドイツ語（de-DE）が取得できていることが確認できました。

![スクリーンショット 2020-10-18 10.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/9bd44366-f10f-f0c6-1ba3-4351ff6d9003.png)

## 対処

1. Qureyの調整（言語でフィルターする）
2. Contentful側の設定変更

### Qureyの調整（言語でフィルターする）

当然1件になります。

![スクリーンショット 2020-10-18 10.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/0e553cd9-6204-28b1-e617-46edb3ac1d21.png)

### Contentful側の設定変更

必要な言語のみEnableにします。
→今回はドイツ語（de-DE）をDisableにします。

![スクリーンショット 2020-10-18 10.39.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/34e0da67-3c79-985b-d42a-0417cd2089ad.jpeg)

![スクリーンショット 2020-10-18 10.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/1f17273e-625c-7abe-bdac-c5aeb165553a.png)

test2を追加して、確認します。
→test2は設定が反映されて、ドイツ語のコンテンツが作成されていません。
→作成済のコンテンツはContent管理画面で別途修正する必要があります。

![スクリーンショット 2020-10-18 10.44.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/c16d7777-78ef-9f42-3860-42c9faddf0b7.png)

本事象、暫く困惑しましたが、複数Locale保存したい場合は役に立ちますね。
express.jsアプリをFirebase Functionsにデプロイする

<!--# express.jsアプリをFirebase Functionsにデプロイする-->

前回：[express.jsアプリをAWS CloudFormationでデプロイする](https://qiita.com/110chang/items/e4ad9c8b0bfbacfa6e98)

## 前提

- Googleアカウント
- firebaseプロジェクト
- firebase-tools

## プロジェクト初期化

```sh
$ firebase init functions
```

## expressアプリ追加

- firebase-functionsの読み込み
- functions.https.onRequestイベントハンドラにアプリを渡す
- exportする

```js
// index.js
const functions = require('firebase-functions');
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log(req.method, req.url);
  res.send({ status: true });
});

const api = functions.https.onRequest(app);

module.exports = { api };
```

ごくごく簡単なアプリ

## 確認

エミュレータ起動

```sh
$ firebase emulators:start
```

上のアプリの場合は`http://localhost:5001/<YOUR PROJECT ID>/<REGION>/api`といったURLで確認できる。exportsに渡した名前がそのままpathになるようだ。

## デプロイ

- Firebase Functionsは従量課金(Blaze)プランでないとデプロイできない

```
$ firebase deploy --only functions
```

## その他

- 途中でつまづくようなところはなし。AWS CloudFormation(lambda + API Gateway)より簡単な印象。
- 個人でさくっとなにかしたいならFirebaseがよさそう。

## 参考

- https://taroosg.io/cloud-functions-express
検索コマンド

### 個人的に検索でよく使うコマンドメモ。

```:検索したいワードが含まれるファイルを探したい
grep -ril 検索ワード 対象ファイルorディレクトリ
```
`-r` 再帰的。ディレクトリの中を検索
`-i` --ignore-case。大文字と小文字を区別しない
`-l` --files-with-matches  通常は検索に引っかかったファイルの中身を表示するがファイル名を表示する

```:検索したいワードが複数ある時
grep -e 検索ワード１ -e 検索ワード２ 対象ファイル
```