OmniAICreator/Qiita-1.07M huggingface dataset:
【Your Ruby version is 2.3.7, but your Gemfile specified 2.5.3】rubyのバージョンが違うことで起きるエラー

### 環境

```gemfile.
ruby '2.5.3'
```

### 事象

Railsチュートリアルの`10.3.2 サンプルのユーザー`を進めているときに起きました。
Gemfileに`Faker gem`を追加して、`データベース上にサンプルユーザーを生成するRailsタスク`を追加する際に下記のコードを`db/seeds.rb`に記入。

````db/seeds.rb
User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar")

99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password)
end
```

上記に記載が終わり、データベースをリセットして、上記で記載したRailsタスクを実行 (db:seed) してみます。

```
$ rails db:migrate:reset
$ rails db:seed
```

### エラーが発生

```
$ rails db:seed
```

上記を実行したら下記のようなエラーが表示されました。

```
Your Ruby version is 2.3.7, but your Gemfile specified 2.5.3
```

これは`Railsアプリでrubyのバージョンを2.3.7としているのに、使用しているrubyのバージョンが2.5.3になっていて、バージョンが違うために起動ができないことが原因`だと思われます。

### エラー解消

バージョンを合わせる方法を記載します。

- アプリケーションのディレクトリ直下に`ruby_version`というファイルがあるか探す
- `ruby_version`を開くとrubyのバージョンが`'2.5.3'`になっているのを確認
- `ruby_version`ファイルを削除
- `Gemfile`を開いて`ruby`のバージョンが`'2.5.3'`になっていたらその行も削除する
- 上記が完了したら`bundle install`を実行する
- 再度`rails db:seed`を実行
- 完了！

### って思ったら。。。

```
$ rails db:migrate:reset
$ rails db:seed
```

上記がうまく作動していない。
どうやら`rails server`を起動している状態だと、上記はうまく動かなくなるみたいです。
なので`ctl + c`で`rails server`を止めて、再度上記のコマンドを入力してください。
これで本当に完了しました！
Dockerイメージの操作に関するコマンドをまとめてみた

# はじめに
今さらですが、Dockerに入門しました。
書籍で勉強して知り合ったコマンドを共有させて頂きます。

本投稿では、Dockerイメージの操作に関するコマンドを記載させて頂きます。

その他、Dockerに関する記事は以下ですので、こちらもご参照頂けるとありがたいです。

[Dockerの概要と特徴について調べてみたので、学習メモを残す](https://qiita.com/ya6maDev/items/612169ff46249c5520db 'Dockerの概要と特徴について調べてみたので、学習メモを残す')
[Dockerコンテナの操作に関するコマンドをまとめてみた](https://qiita.com/ya6maDev/items/9f163fbc32ef8477b99d 'Dockerコンテナの操作に関するコマンドをまとめてみた')

# Dockerイメージの操作に関するコマンド

Dockerイメージとは、Dockerコンテナを作成するためのテンプレートのこと。
Dockerイメージを構築することを、一般的には「Dockerイメージをビルドする」と言う。

## Dockerイメージを操作するコマンドのヘルプを見る。
```docker
$ docker image --help
```

## Dockerイメージをビルドする。
```docker
$ docker image build t イメージ名[:タグ名] Dockerfile配置ディレクトリのパス
```

例えば、 Dockerfileがカレントディレクトリ直下に存在している場合は、
以下のようなコマンドとなります。


```docker
$ docker image build t example/echo:latest .
```

## Dockerイメージを検索する。

```docker
$ docker search [options] 検索キーワード
```

例えば、rubyに関連するDockerイメージを5件まで検索したい場合は、
以下のようにします。

```docker
$ docker search --limit 5 ruby

NAME                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ruby                    Ruby is a dynamic, reflective, object-orient…   1688                [OK]                
circleci/ruby           Ruby is a dynamic, reflective, object-orient…   58                                      
starefossen/ruby-node   Docker Image with Ruby and Node.js installed    28                                      [OK]
bitnami/ruby            Bitnami Ruby Docker Image                       15                                      [OK]
appsvc/ruby             ruby                                            2                                       [OK]
```

## Dockerイメージの取得

```docker
$ docker image pull [options] リポジトリ名[:タグ名]
```
取得したイメージはそのまま、Dockerコンテナとして使用が出来ます。

Jenkinsに関連するDockerイメージを取得する場合は、
以下のようなコマンドになります。

```docker
$ docker image pull jenkins:latest
```

## Dockerイメージの一覧表示

```docker
$ docker image ls [options] [リポジトリ[:タグ名]]
```

コマンド実行対象のDockerホストに保持されているイメージの一覧を表示します。

## Dockerイメージのタグ付け

```docker
$ docker image tag 元イメージ名[:タグ] 新イメージ名[:タグ]
```

例えば、latestというタグ名から「0.1.0」というタグ名に変更する場合、
以下のようなコマンドとなる。

```docker
$ docker image tag example:latest example:0.1.0
```

## Dockerイメージの公開

```docker
$ docker image push [options] リポジトリ名[:タグ]
```

保持しているDockerイメージをDockerHubのレジストリに登録することが出来ます。

パブリックなリポジトリに対してDockerイメージを公開する場合は、
イメージやDockerfile内にAPIキーやパスワードを記載しないように注意です。

# 引用

[Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2-ebook/dp/B07GP1Q3VT/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1559430603&sr=8-1, 'Docker/Kubernetes 実践コンテナ開発入門')
【コンフリクト】GemfileにFaker gemを追加する。'faker'を追加できない

### 環境

```
ruby '2.5.3'
rails '~> 5.2.3'
```

### Faker gemを追加する

Railsチュートリアルに記載されているように、Faker gemを追加しようとする。

```gemfile.
source 'https://rubygems.org'

gem 'rails',          '5.1.6'
gem 'bcrypt',         '3.1.12'
gem 'faker',          '1.7.3'
.
.
.
```

### エラーが発生

```
Bundler could not find compatible versions for gem "i18n":
  In snapshot (Gemfile.lock):
    i18n (= 1.6.0)

  In Gemfile:
    rails (~> 5.2.3) was resolved to 5.2.3, which depends on
      activesupport (= 5.2.3) was resolved to 5.2.3, which depends on
        i18n (>= 0.7, < 2)

    faker (= 1.7.3) was resolved to 1.7.3, which depends on
      i18n (~> 0.5)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```

### 解決

'Faker gem'のバージョンを変更してみる。

```
gem 'rails', '~> 5.2.3'
gem 'bcrypt', '3.1.12'
gem 'faker',  '1.9.1'
```

これで無事追加することができました。
const

`const`は定数を宣言する。文字、文字列、boolean、数値のみが使える。`:=`を使うことはできない。
関数内にもかけるが普通はグローバルに。
##書き方
```go
const Pi = 3.1415

//複数の場合は
const (
	Username = "username"
	Password = "password"
)
```
`Println`で出力

```go
const (
	Pi       = 3.1415
	Username = "username"
	Password = "password"
)

func main() {
	fmt.Println(Pi, Username, Password)
}
```
##番外編
```go
var long int = 9223372036854775807 + 1
func main() {
	fmt.Println(long - 1)
}
```
`var long int = 9223372036854775807 + 1`この時点でオーバーフローとなってエラー。ところが以下のコードはOK

```go
const long = 9223372036854775807 + 1
func main() {
	fmt.Println(long - 1)
}
```
constは型を宣言しない。
Goのコンパイラに解釈はされてるけど実行されてない。だから最後の例では、`fmt.Println(long-1)`に代入されるまで`const long = 9223372036854775807 + 1`は実行されてなくて、代入された時点で実行されるけど`-1`されるのでオーバーフローしない結果になる。
varではオーバーフローするものを定義した時点でエラー発生するが、constの場合は大丈夫ってことで。（あまり使われないけど一応）

>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
初心者が初心者にCのポインタを教えて気がついたポイント

プログラミングを初めて半年弱程度と、初心者によるQiita初投稿になるが最後まで大雑把でも目を通していただけると嬉しい。

#もくじ
- 事の発端
- なぜ初心者は初心者なのか
- なんでプログラミングは初心者にとって大変なのか
- ポインタの何が原因だったのか
- まとめ

#事の発端
大学で、プログラミング部に入部し、周りが初心者だらけだったこともあり、昔から多少プログラミングをかじったことのある自分が教える立場となり、学校でもC言語の授業があるので、C言語を題材として1から勉強していた。

ここでは、私の立場を明確化した上で以下の内容を読んでほしい。
初心者である私からみたプログラミングについて体感した雑記程度だと思って頂ければ幸いだ。

すぺっく
- 大学生
- プログラミング歴5ヶ月
- 言語C#のみ（一応C)

#なぜ初心者は初心者なのか
そもそも、初心者はパソコンについて知悉しているとは限らないし、メモリと記憶媒体の違いを気にしたことすらない層が大半だろう。実際、言葉の意味を全く理解していないで使っている例としては、高校生を中心に蔓延っている「ギガが足りない」とか…とにかく、Qiitaを読むような人たちには想像もできない世界がそこには広がっていて、特に大学1年生なんて90％くらいが「パソコンなんていらなくね？」っていう考えで生きてきた人たちであり、ソフトウェアが仕様通りに動作していたとしても、彼らの思い通りにソフトが動かなかったらすぐ「バグった！」と騒ぐような人たちが多いのである。（情報系の学部は違うかも）

#なんでプログラミングは初心者にとって大変なのか
そもそも、C系統の言語しかほとんど触ったことがなく、JSとかPythonとかRubyとか今ホットな言語には、未だに殆ど触れていない私が言うのも偏っているかもしれないが、プログラミング言語は、わたしたちが日常的に用いる自然言語並に、意味不明で気持ち悪いものである。唯一の違いといえば、前者には曖昧さという余地が一切なくて、定義どおりに記さなければすぐエラーを吐いて言うことを聞いてくれない。逆に後者は、そういった曖昧さが時には功を奏して仮に文法的に間違っていたとしても、人から人のコミュニケーションはなんとなくて伝わっていた節があった。しかし、そこには認識の違いがあって、重複；「ちょうふく」を「じゅうふく」と読んでも伝わってしまったり、それこそ言語自体が生命体のように日々変化し得るものであって個々人の持つ言語は完全に一致することは絶対に無い。

話が、それてしまったが、プログラミング言語が気持ち悪いものなのは、その定義が複雑で難解でパット見じゃさっぱりわからず、やっぱり最初に踏み出す一歩には大きな勇気が必要とされるから気持ち悪いのである。

それは、いわゆる格差社会みたいなもので、一度分かり始めれば、指数関数的なスキルの向上が実現するが、それに到達する前に独習者の半数以上はやめてしまうのではないだろうかと思った。それが、作り出す構造は全く分からない層とわかっている層で、ネット上に転がっている玉石混交な記事から初心者が自分に最適なものを見つけるのはシビアなものであると自分の経験から感じた。

#ポインタの何が原因だったのか
本題となるが、基本的にCは最初から丁寧に積み上げていけばポインタまではものすごく自然で順調にいけるような言語であると思っている。初心者に教えるときには、どこの界隈でもそうであるように、たとえ話が適切で、パソコンの部品も人間と机と引き出しを用意すればプログラミングに必要な最低限の知識は備えることができる。ポインタはその知識の上に成り立っているものであり、だからこそ初心者はまずそこでつまづいてしまう。

「RAM? What?」

な世界なのだ、ポインタが理解できるわけがない。
野球だって素振りするよりも実際にボールを打ったほうが楽しい。
つまり、そういうことだ。

では、その問題が解決できたとしよう。次に待ち受けているのはなんと残酷なことであろう、普通の変数とポインタ変数の振る舞いの圧倒的なあべこべ感。

| 変数 \ 接頭語 | なし | あり |
|:-:|:-:|:-:|
| 通常変数  | 値  | アドレス(&)  |
| ポインタ変数  | アドレス  | 値(*)  |
追記：（ポインタ変数も先頭に`&`をつけるとアドレスを渡します）

歴史的な背景は私は理解していないが、正直始めてみたときは意味不明すぎて怒りすら覚えた。そもそも、人間が厳密に定義するような言語にこのような分かりづらさを仕組んでもいいのかすらという疑問を覚えた。これに関しては、私がよっぽどお金持ちになって社会的地位を獲得しない限りにおいては、普遍の事実であるだろうし、受け止めなければならない。しかし、過去にこれで挫折を味わった自分にとってはポインタはC言語においては鬼門であると思っている。授業で7月頃にポインタの授業があるのでそこでの初心者の反応を集約できれば面白いと思っている。それに関しては、気が向いたら追記なりしたいと思っている。

#まとめ
最後に、まとめとして少々、過激かもしれないがこれくらいの考えで教えるとたいていの人には対応できると思う。

1. 初心者はパソコンを知らない
2. たとえ話でうまくいくことが多い
3. ポインタは通常変数の関係を明確にするような図を用意するとうまくいく
4. 初心者は歴史的背景なんてどうでもいいと思っている。
同じものを含む円順列（数学A）

# 同じものを含む円順列
『同じものを含む円順列を求めるには全部調べるしかないんですか？』という質問があったので，いくつかの問題を考えてみたいと思います。

### 問題
白玉4個，黒玉4個を円形に並べる方法は何通りか？

###解答
まず，白玉4個，黒玉4個，合計8個を一列に並べます。並べ方法は
$${}_{8}\text{C}_4=\frac{8\cdot7\cdot6\cdot5}{4\cdot3\cdot2\cdot1}=70\text{（通り）}$$
となります。

この70通りをみていくと，円形にすると同じになるものがあります。円順列ではそれらをまとめて1通りと数えます。

#### 8つをまとめて1通り
まずは，8つをまとめて1通りとする並びの例を紹介します。

○○○○⚫︎⚫︎⚫︎⚫︎
⚫︎○○○○⚫︎⚫︎⚫︎
⚫︎⚫︎○○○○⚫︎⚫︎
⚫︎⚫︎⚫︎○○○○⚫︎
⚫︎⚫︎⚫︎⚫︎○○○○
○⚫︎⚫︎⚫︎⚫︎○○○
○○⚫︎⚫︎⚫︎⚫︎○○
○○○⚫︎⚫︎⚫︎⚫︎○

この8つは円形に並べると同じ並びとなるので，8つで1通りです。

#### 4つをまとめて1通り
次に，4つをまとめて1通りとする並びです。

○○⚫︎⚫︎○○⚫︎⚫︎
⚫︎○○⚫︎⚫︎○○⚫︎
⚫︎⚫︎○○⚫︎⚫︎○○
○⚫︎⚫︎○○⚫︎⚫︎○


#### 2つをまとめて1通り
最後に，2つをまとめて1通りとする並びです。

○⚫︎○⚫︎○⚫︎○⚫︎
⚫︎○⚫︎○⚫︎○⚫︎○


この分け方は4と4の公約数（今回は同じ数なので4の約数です）1，2，4が関係しています。

- 公約数1...$\frac{8}{1}=8つで1通り$
- 公約数2...$\frac{8}{2}=4つで1通り$
- 公約数4...$\frac{8}{4}=2つで1通り$

#### 求めてみよう。

- 公約数4...$\frac{8}{4}=2つで1通り$

⚫︎○の円順列の個数を考えます。
$$\frac{2 !}{2}=1\text{（通り）}$$


- 公約数2...$\frac{8}{2}=4つで1通り$

⚫︎⚫︎○○の円順列の個数を考えます。注意すべき点は2つで1つと数える2通りを除くことです。
$$\frac{{}_{4}\text{C}_2-2}{4}=\frac44=1\text{（通り）}$$

- 公約数1...$\frac{8}{1}=8つで1通り$

残りはすべて，8つで1通りです。全体から『2つで1つと数える2通り』と『4つで1つと数える4通り』を除きます。
$$\frac{{}_{8}\text{C}_2-2-4}{8}=\frac{64}{8}=8\text{（通り）}$$


以上より，白玉4個，黒玉4個を円形に並べる方法は
$$1+1+8=10\text{（通り）}$$
となります。
Nuxt 2.8.0 で nuxt generate に失敗する

## 前提
Gitlab PagesにNuxt.jsで生成した静的ページをホスティングしているのですが、
Nuxt.jsのバージョンを上げたところ、`nuxt generate` の実行に失敗するようになりました。

### 環境
* node.js 10.15.3
* yarn 1.16.0
* nuxt.js 2.1.0 -> 2.8.0

## 現象
```
% yarn run generate
yarn run v1.16.0
$ nuxt generate
ℹ Preparing project for development
ℹ Initial build may take a while
✔ Builder initialized
✔ Nuxt files generated

✔ Client
  Compiled successfully in 6.76s

✔ Server
  Compiled successfully in 5.56s

ℹ Waiting for file changes

 FATAL  ENOENT: no such file or directory, stat '/home/epaew/workspace/nuxt_app/.nuxt/dist/client'




   ╭─────────────────────────────────────────────────────────────╮
   │                                                             │
   │   ✖ Nuxt Fatal Error                                       │
   │                                                             │
   │   Error: ENOENT: no such file or directory, stat            │
   │   '/home/epaew/workspace/nuxt_app/.nuxt/dist/client'        │
   │                                                             │
   ╰─────────────────────────────────────────────────────────────╯

error Command failed with exit code 1.
```

## 解決策
GitHub に issue が上がっていました
https://github.com/nuxt/nuxt.js/issues/5840#issuecomment-497521402
> Solution: You are mixing cjs with es syntax for nuxt.config. Simply using export default fixes issue.

nuxt.config.js を以下の通り修正

```diff
-module.exports = {
+export default {
```

古い Nuxt で `create-nuxt-app` した場合、 `nuxt.config.js` あたりに CommonJS の記法が残ってしまっているみたいです。
【Mac買えなくても大丈夫】Windows10でLinuxを動かすだけでは飽き足らずHomebrewもinstallする

#はじめに
Web業界で使われるPCですが、Windowsに比べてMacのシェアが圧倒的であることは、Qiitaの投稿記事にある開発環境情報や、企業の採用情報にある開発環境に関する記述を見ても明らかなことです。事実、僕も会社からはMacが貸与されています。

しかし、新卒1年目でお金に余裕のない僕の家には、ゲーム用のWindowsしかありません。

これは本来、由々しき問題ですが、ここ最近は風向きが変わりつつあります。

最近のWeb業界では[WSL2(Windows Subsystem for Linux 2)](https://devblogs.microsoft.com/commandline/announcing-wsl-2/)や[Windows Terminal](https://devblogs.microsoft.com/commandline/introducing-windows-terminal/)が2019年夏に登場することが話題になっており、Windowsが注目を集めている状況といえるからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/fbbb9e45-b59c-b7d5-b0ee-9c6699feb61f.png)

あるいは今後、Windows上でLinuxを動かし、高性能なWindows Terminalでババっと開発、空いた時間でゲーム、開発者はハッピー！PCの価格が安いから会社もハッピー！な未来が来るかもしれません！

そこで今回は、WSL2に先駆けて現WSLを導入して、自宅でWindowsを使った開発ができるようにします。

# WSLの導入
### WSLの有効化設定
管理者としてWindows Power Shellを開き、以下のコマンドでWSLを有効にします。

```
$ Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```
終わったら一度、PCを再起動しましょう。

### Linuxディストリビューションのインストール
Windows Storeから任意のLinuxディストリビューションをダウンロードし、インストールします。今回はUbuntuにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/33493b2f-f936-ed64-dffa-1b2706076786.png)
インストールが終わったら、起動しましょう。

### Ubuntu初回設定

自動で追加インストールが始まります。
コーヒーブレイクタイム…(僕はコーヒー飲めませんが)

☕　☕　☕

インストールが終わると、ユーザネームとパスワードの入力が求められます。

これが終わったら、以下のコマンドを入力してパッケージマネジャを更新しましょう。

```
$ sudo apt update && sudo apt upgrade
```
ズラーーっとダウンロードが始まります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/3711d4c9-e246-b8fb-5513-daf86c9f8c64.png)

### WSLの確認
Ubuntuバージョン情報確認

```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:        18.04
Codename:       bionic
```
CPU情報の確認

```
$ cat /proc/cpuinfo | grep "model name"
model name      : Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
```
メモリ情報の確認

```
$ cat /proc/meminfo | grep MemTotal
MemTotal:       16704324 kB
```
ハードウェアはPCのもので、OSだけUbuntuに変わっていることが確認できますね！！！！

# Linuxbrewのインストールと設定
[ここ](https://docs.brew.sh/Homebrew-on-Linux)を参考にMacOS用のパッケージマネージャであるHomebrewのLinux版であるLinuxbrewをインストールします。

まずはこれらのコマンドで、Linuxbrewとその周辺ライブラリをダウンロードおよびインストールします。

```
$ sudo apt-get install build-essential curl file git
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
ただし、この状態ではパスが通っておらず、brewコマンドは使えません。

```
$ brew
Command 'brew' not found
```
そのため、次のコマンドでパスを通してください。

```
$ test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
$ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
$ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
```

やったー、これでLinuxbrewを使うことができます。

```
$ brew --version
Homebrew 2.1.2
Homebrew/linuxbrew-core (git revision ac44; last commit 2019-05-19)
```

# あとがき
これで、Macを使う場合とそれほど大差なく、諸々の開発環境構築ができるのではないでしょうか・・・？

使っていく中でなにかと不満はでてきそうですが、Windowsのローカルファイルにもアクセスできるようですし、WSL2までのつなぎ、Macを買うまでのつなぎ、としては充分かと思います。

Mac買うお金が無いからWeb系の勉強が始められない！！！という初学者のやらない理由つぶしに貢献できれば幸いです。
~~の意味について

## はじめに
本文は他の方のプログラミングを読んでいた際、見かけた~~という謎記法について調べてみたという話です。

## 具体的に使われていたコード
``` 
input = input.split(/\n|\s/).map(v => ~~v)
``` 
## "~"について

### 読み方
読み方はチルダ

### 意味
javascriptの場合、意味は「ビット反転演算子」

#### ビット反転演算子って？
> オペランドの各ビットを反転します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

## ~~はどういう意味なのか？

Math.floorの代用

### ちなみにMath​.floor()とは？
引数として与えた数以下の最大の整数を返します。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

## 参考
http://naoyashiga.hatenablog.com/entry/2013/10/29/184914
AndrodのToast

#Toast
Toastは短いメッセージをユーザーに知らせるもので、自動的に消えます。Toast自身がユーザーの入力や操作を待つことはしません。
ユーザーの操作に対するフィードバックを伝える感じです。

#ソースコード
```Kotlin:ToastActivity.kt
class ToastActivity : AppCompatActivity() {

    private lateinit var helloTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_toast)

        helloTextView = findViewById(R.id.helloTextView)
        helloTextView.setOnClickListener {
            val toast = Toast.makeText(applicationContext, "Hello Toast", Toast.LENGTH_SHORT)
            toast.setGravity(Gravity.TOP or Gravity.START, 0, 0)
            toast.show()
        }
    }
}
```

#使い方
`Toast.makeText(applicationContext, "Hello Toast", Toast.LENGTH_SHORT).show()`
基本的にこれだけです。
**makeText()**でToastを作成し、**show()**で画面に表示します。

##makeText()について
ここでは3つのものを引数として与えています。

###context: Context!
普通はApplicationかActivityのインスタンスです。
確認する限り`applicationContext`でも`application`でも`this`でも動作します。何を指定するべきか詳しくはわかっていませんが、公式ドキュメントの例に則って`applicationContext`がいいかと思います。
※Android Javaの場合はおそらく匿名クラスの中で使うことになると思うので、`this`は**View.OnClickListner**を指しコンパイルエラーとなります。

なぜToastがContextを取るかというと、Viewとして管理してもらう必要があったり、リソースIDにアクセスする必要があったりするためです。

###text: CharSequence!
表示するテキストです。ここではベタに書いていますが、リソースIDも受け付けるのでそちらを指定する方がいいです。

###duration: Int
表示される持続時間です。`Toast.LENGTH_SHORT`の`Toast.LENGTH_LONG`の2種類しかありません。ソースを追ってみるとそれぞれ4秒と7秒を指定しているように見えますが、体感としては2秒半と4秒くらいで消えます。

#setGravity()について
デフォルトでは画面下にToastは表示されますが、このメソッドを使って配置を変更することができます。
例えば第一引数に`Gravity.TOP or Gravity.START`と指定することで、画面左上に表示されます。
（なんか論理和使っていますね）
※`Gravity.TOP or Gravity.START or Gravity.BOTTOM`と指定してしまうと、画面左側に縦長に伸びたToastが表示されてしまいます。

第二引数と第三引数はそれぞれX座標とY座標の調整です。
pixel単位で移動でき、マイナスの数値を指定して逆方向に動きます。

#参考
[トーストの概要](https://developer.android.com/guide/topics/ui/notifiers/toasts?hl=ja)
[Toast | Android Developers](https://developer.android.com/reference/kotlin/android/widget/Toast.html?hl=ja#setDuration(kotlin.Int))
[Android Programming: The Big Nerd Ranch Guide (3rd Edition) (Big Nerd Ranch Guides)](https://amzn.to/2K8OlO7)


#補足
いろいろ調べたあとにMaterial Design的には「snackbarのほうがいいぜ」って書いてあって悲しい。
https://material.io/develop/android/components/snackbar/
> Android also provides a Toast class with a similar API that can be used for displaying system-level notifications. Generally, snackbars are the preferred mechanism for displaying feedback messages to users, as they can be displayed in the context of the UI where the action occurred. Reserve Toast for cases where this cannot be done.
メカトロ講座06 モーター関連部品の選定

# 概要
前回はモーター周りの技術を説明しました。しかしこれらの技術も実際のハードウェアが無くては実現できません。日本の店や通販で手に入るものを中心に移動ロボットに使用できる物を以下のカテゴリでピックアップしていきます。
（まだ書きかけですが）

* モーター＋タイヤ
    * ダイセン系
    * タミヤ系
    * イモネジ系
* モータードライバ
    * DCモーター用
    * ステッピングモー用
* 電源
    * 壁電源
    * バッテリー
    * 充電器

# モーター＋タイヤ
モーターそのものの性能も大事ですが、選定する場合はモーターとベース部材の接続やモーターの軸の形状に注意が必要です。

## ダイセン系
ダイセンの割ピン＋ねじで固定する系統の部品です。ロボカップサッカーJrなどオムニホイールを使用するためによく使われている部品です。エンコーダーがつかないのが残念。軸の取り付けが特殊なので以下の組み合わせ以外では使いにくいでしょう。

### ダイセン：ロボサイトモーター

| 項目 | 値 |
|:-:|:-:|
| 電圧 | 3~6V |
| 電流 | 0.15(フリー)～??（ストール） |
| 回転数 | 7000rpm |
| ギア比 | 1/15,30,60,100 |
| エンコーダー | なし |
| 軸 | 4mm(先端M3、割ピン) |
| 価格 | 1500円 |

[ダイセンオンラインストア](http://daisen-netstore.com/shopdetail/000000000098/Motor-Wheel/page1/brandname/)

### ダイセン：オムニホイール

| 項目 | 値 |
|:-:|:-:|
| 直径 | 40mm |
| 価格 | 1500円 |

[ダイセンオンラインストア](http://daisen-netstore.com/shopdetail/000000000055/ct37/page1/brandname/)

### ダイセン：ハブ

| 項目 | 値 |
|:-:|:-:|
| 直径 | 40mm |
| 素材 | プラスティック |
| 価格 | 280円 |

[ダイセンオンラインストア](http://daisen-netstore.com/shopdetail/000000000056/ct37/page1/brandname/)

## タミヤ系
タミヤ系は3mmの6角軸で固定するものが多いですね。数が多いのでここでは省略します。

## イモネジ系
これはモーターの軸はただの円柱（もしくはDカット）でハブのイモネジで軸に固定するタイプです。

### スプロケット＆チェーンセット
珍しいプラスティック製のチェーンのセットです。

(タミヤオンラインストア)[https://tamiyashop.jp/shop/g/g70142/]

### GA370モーター
本命のモーターです。エンコーダーとギアの両方がついている数少ないモーターです。

| 項目 | 値 |
|:-:|:-:|
| 電圧 | 12V |
| 電流 | 0.06(フリー)～1.3A（ストール） |
| 回転数 | 60～1360rpm |
| エンコーダー | あり |
| 軸 | 4mm |
| 価格 | 1500円 |
6V、24V品もあります

[Aliexpress](https://ja.aliexpress.com/item/25GA370-dc/32839617639.html?spm=a2g0s.9042311.0.0.27424c4ddl0Hlb)

### Nexusオムニホイール
安くて使いやすいオムニホイールです

| 項目 | 値 |
|:-:|:-:|
| 直径 | 38mm |
| 素材 | プラスティック |
| 価格 | 450円 |

[vistonオンラインストア](https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&cPath=72_336_836&products_id=4568)

### Nexusオムニホイールハブ
上記のオムニホイールに使用できるハブです。

| 項目 | 値 |
|:-:|:-:|
| 直径 | 38mm |
| 素材 | 真鍮 |
| 軸系 | 3,4mm |
| 価格 | 270円 |

[vistonオンラインストア](https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&products_id=4909)

# モータードライバ

## DCブラシモーター用

### L298
2chついていたり、電流がそこそこ流せたりと使いやすいものです。

| 項目 | 値 |
|:-:|:-:|
| チャンネル | 2 |
| 電圧 | 46V |
| 電流 | 2A |
| パッケージ | Multiwatt(スルーホール)、SOP |
| 価格 | 350円 |

## ST VNH系
強力な3種類のラインナップがあります

| 項目 | VNH5019 | VNH3SP30 | VNH2SP30 |
|:-:|:-:|:-:|:-:|
| チャンネル | 1 | 1 | 1 |
| ロジック電源 | 3.3, 5.0V | 5.0V | 5.0V |
| 電圧 | 41V | 15V | 16V |
| 電流 | 9A | 14A | 12A |
| パッケージ | SOP | SOP | SOP |
| 価格 | 1500円 | 1500円 | 1500円 |

価格はチップ単体の価格です。モジュールだと4000円程度します。

[朱雀技研](https://store.shopping.yahoo.co.jp/suzakulab/pololu-1451.html)
Visual Studio CodeのFontをDejaVu Sans Monoに変換

# VS code のfontをDejaVu Sans Monoに変換(windows10)

下記URLより[dejavu-fonts-ttf-2.37.zip](https://sourceforge.net/projects/dejavu/)をダウンロード

ダウンロードしたファイルから「DejaVuSansMono.tff」をダブルクリックし、インストール。
インストールできていることを確認(C:\Windows\Fonts\DejaVuSansMono.ttfが表示されればOK)
```C:\Windows\Fonts> where "DejavuSansMono.*"
C:\Windows\Fonts\DejaVuSansMono.ttf
```
Visual Studio Codeを開き、Setting.jsonファイルに以下を記載
```
editor.fontFamily": "'DejaVu Sans Mono', ['Meiryo UI', monospace",]
```
設定が変更される。
[]内の記載はそれぞれの好みで。。
Oculusブラウザからリモートデスクトップ

# はじめに
OculusQuestからリモートデスクトップを実行する方法は、有料アプリだと[Virtual Desktop]
(https://www.oculus.com/experiences/quest/2017050365004772/)があるのですが、無料アプリがなく、ほかに気軽に試せる方法はないか探していたのですが、Oculusブラウザからリモートデスクトップすればできそうだと思い試してみました。

#環境
・ホスト側（操作される側）PC
Windows 10
Chromeブラウザ
・クライアント側（操作する側）OculusQuest
Oculusブラウザ

#手順
1. PCのChromeブラウザで、[Chromeリモートデスクトップ]
(https://remotedesktop.google.com/home)にアクセスします。「使ってみる」ボタンをクリックして利用するGoogleアカウントでログインします。拡張機能とコンパニオンアプリのインストールが完了したあと、PINの設定までするとホスト側の準備は完了です。
2. OculusQuestのChromeブラウザで、[Chromeリモートデスクトップ]
(https://remotedesktop.google.com/access/)にアクセスします。事前準備のときと同じGoogleアカウントでログインし、表示された接続先PCをクリックします。これで接続先PCのデスクトップがブラウザ内に表示され、操作できるようになります。

#そのほか
リモートデスクトップ経由でPC上のUnityでビルドして実行したところ、OculusQuestに書き込んでそのまま実行できました。[UnityでOculusQuestの開発環境構築]
(https://qiita.com/Satoshi_Takahama/items/0b3e13d8976b7f57e4a8)のWiFi経由でADB接続の手順と合わせて、ケーブルレスでOculusQuestをかぶったまま開発を実行できるようになりました！

#Oculusブラウザでのブックマーク登録について
自分は普段PCとスマホではChromeを使用しているのですが、登録したブックマークを
OculusQuest上のOculusブラウザで使用するために、booky.ioを使用しています。
手順は、
	1. PC上のChromeブラウザでbooky.ioにアクセス、アカウントを登録してSign Inする
	2. Chromeブラウザのブックマークをインポートする
	3. OculusQuest上のOculusブラウザでbooky.ioにアクセス、Sign Inする
と簡単です。

#参考リンク
[Google Chrome：アプリからWeb版へと進化した「Chromeリモートデスクトップ」を使ってみる]
(https://4thsight.xyz/3763)
コーディングするときに心掛けている 5 つのこと


20 年以上ソフトウェアを作り続けている会社員の私が、コーディングするときに心掛けている 5 つの事柄をここにまとめてみました。ひとりよがりな持論もあるかとは思いますが、そこは寛大な気持ちで読んでいただければと思います。
#コードをたくさん書かない
なるべくコードを書かない、書いたら負け、くらいの勢いです。世の中で使われているフレームワークやライブラリは、多くの人たちにテストされ、デバッグされ、洗練されてたものばかりで、これらを最大限に利用しない手はありません。手間暇かけて高い信頼性を勝ち取ったソフトウェアを使い倒して、自分のコードを最小限にすることで、バグの少ないソフトウェアが比較的短い時間でできあります。
#コメントをなるべく書かない
変数や関数の命名に気を遣い、コードを読めば何をしているのかわかるように書きます。少々名前が長くなっても、いまどきの IDE は補完機能があるので問題ありません。こうすると結果的にコメントを書く必要がなくなります。
#正常終了コードをはじめに書かない
正常に終了するコードよりも前にエラー処理を書きます。最後に正常終了処理を書くことで、エラー処理の漏れを防止できます。デモ用途や簡易的な結合テスト用に先に正常系だけ完成させたい場合は、エラー処理をすべき場所に TODO: error handling などとコメントを入れておき、後でエラー処理を充実させます。
#サンプルコードを疑う
ネットで拾ったサンプルコードや SDK についているサンプルコードが、そのまま自分の作りたいきもの使えるのは稀です。終了処理が書かれていなくてメモリリークが発生したり、そもそもビルドが通らなかったりすることもあります。サンプルコードの処理を理解して、必要なものと不必要なもの、正解と不正解を見極める必要があります。
#夜書いたコードは見直す
定時を過ぎて集中力が切れた状態で書いたコードには、無駄な処理が入っていて実行時間が必要以上に長かったり、最悪バグが混入しているなんてこともあります。夜に書いたコードはすぐにコミットせず、一旦帰宅してしっかり睡眠をとり、翌朝出社してからもう一度見直してコミットします。
「docker-machine env」実行時のエラー対処法

# はじめに
「docker-machine env」を実行した際、エラーが出たので対処法をまとめました

# TL;DR
「docker-machine regenerate-certs」コマンドを実行して、TLS証明書を再作成することでエラーを解消できました

# エラー解消前の流れ

## 現在の状況は以下の通り

```bash
$ docker-machine ls
NAME        ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
hoge   -        virtualbox   Stopped                 Unknown   
```

## hogeを起動します

```bash

$ docker-machine start hoge
Starting "hoge"...
(hoge) Check network to re-create if needed...
(hoge) Waiting for an IP...
Machine "hoge" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

## 「docker-machine env hoge」を行ったところ、エラーが発生しました

```bash
$ docker-machine env hoge
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": x509: certificate is valid for 192.168.99.101, not 192.168.99.100
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which might stop running containers.
```

## エラーにあるコマンドを実行します

```bash
$ docker-machine regenerate-certs hoge
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
```

## もう一度、「docker-machine env hoge」を行います。今度はエラーがありませんでした

```bash
$ docker-machine env hoge
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/xxx/.docker/machine/machines/hoge"
export DOCKER_MACHINE_NAME="hoge"
# Run this command to configure your shell: 
# eval $(docker-machine env hoge)
```

### hogeをactiveにします

```bash
$ eval $(docker-machine env hoge)
```

## 無事にhogeがActiveになりました

```bash
$ docker-machine ls
NAME        ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
hoge   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.6
```

# まとめ
「docker-machine env」でエラーが出たときは、参考にしてみてください


# 参考
[regenerate-certs](http://docs.docker.jp/machine/reference/regenerate-certs.html)
UnityのAudioMixerでダッキング再生とかあれこれ

#AudioMixerの音量の設定とか

まぁここ見て、その通りにやればいいよ。
http://tsubakit1.hateblo.jp/entry/2015/05/23/234053

ただAudioMixerの音量は**デジベル**(-80~0)なので注意。
AudioSource.volumeの0f～1fの感覚でやるとダメだぞ。
`0.5f = -40dB` とか思ってやると、全然音が50%より小さくなるぞ。

※あと20dBとか設定できて、音量上げれると思うが、
　ただ音割れするだけだからやめたほうがいい

詳しいことはググれ。
結果だけ載せる。

デジベル(dB)変換の式は、
`dB = 20.0 × log10(i0/i1)` ※「i0/i1」は割合
なので、C#で書くと、
`20 * Mathf.Log10(volume);`
すりゃええねん。

`volume`にはスライダーの値とか(0f～1f)を送ればいい。
丁寧に値のバリデートするなら以下のように。

```c#
public void SetBgmVolume(float _volume)
{
	float volume = Mathf.Clamp(_volume, 0.0001f, 1.0f);
	var volumeDB = (float) (20.0d * Math.Log10(volume));
	audioMixer.SetFloat("BGMVol", Mathf.Clamp(volumeDB, -80.0f, 0.0f));
}
```

#AudioMixerのダッキング再生の方法とか

そもそも**ダッキング再生**ってなんぞや？

例えば、キャラクターがセリフをしゃべっている時に、
BGMがそのまま鳴っているとセリフが聞こえにくいから、BGMの音量さげる的な奴のこと。

~~そんなん、自分で好きに音量設定したらええやろ、って思うが。~~

まぁここ見て、その通りにやればいいよ。
http://kikikiroku.session.jp/unity5-basic-audio/#Voice

ただこの方法だと、
**ボイスが再生されているときは、必ずBGMの音量が下がってしまう。**

「戦闘中のボイスではBGN下げたくないんだよねぇ」

とか~~無能プランナーが~~言ってくるのはざらなので、
その場合は、ダッキングさせないボイスの別グループを作るか、SEで鳴らすとかで。

#さて本題

**音量設定しつつ、その音量設定の元、ダッキング再生する方法**

http://kikikiroku.session.jp/unity5-basic-audio/#Voice
ここの設定では固定値で-40dB 
ダッキングでBGM音量を下げるようになっているので、
その固定値で音量が下がってしまう。

「音量設定した音量の50%の音量でダッキング再生してくれ」

とか~~無能プランナーが~~言ってくるのはざらなので、
ダッキングの音量をスクリプトで設定できるようにしておく。

やり方は簡単。

ボリューム設定の時と同じ感じで、
InspectorビューでBGMのDuck VolumeのThresholdを右クリックし、
Export ’Threshold (of BGM→Duck Volume)’ to scriptを選択。

![Test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352508/cb60eacf-c626-6131-77de-8197c0416907.png)

Exposed Parametersで、「DuckVol」とか好きな名前に変更。

あとは、BGMの音量設定を変更するときなどに、
一緒に(スライダーの値を送って)設定してあげればいい。

```c#
public void SetDuckVolume(_volumeRate)
{
	float DuckVolumeRate = 0.5f // どっかに定数定義してもいい
	float duckVolume = Mathf.Clamp(_volumeRate * DuckVolumeRate , 0.0001f, 1.0f);
	var duckVolumeDB = (float)(20.0d * Math.Log10(duckVolume));

	audioMixer.SetFloat("DuckVol", duckVolumeDB);
}
```

#サウンドの実装であれこれ困った場合

Unityのサウンド周りは、
Unity5で~~特大のクソからクソになっただけ~~少しはマシになったが、
必要な最低限な機能しかないので、
だいたいCRIの『ADX2』を導入すれば解決してくれるよ。
https://game.criware.jp/products/adx2-smartphone/

ただUnityの~~ポンコツ~~AssetBundleとの相性は最悪だけど。

Unityのサウンドが最低限の~~クソみたいな~~機能しかないのは、
こういうミドルウェアに配慮~~という名の手抜き~~なんじゃないかな。
RailsでReactを使うには？（プロジェクト作成から）

##概要
Rails new (プロジェクト作成)からRailsのViewにReactを使えるようになるまでの手順です。
Bundlerを使った手順になるので、Bundlerのインストールは先に実施しておいてください。
##実行環境
macOS Mojave 10.14.4
Rails 5.2.3
※Reactを使うのでnpmやyarnはインストールしておいてください
##手順

### Gemfile作成

```
bundle init
```
```:Gemfile
source "https://rubygems.org"
gem "rails"
```

### Railsインストール

```
bundle install --path vendor/bundle
```

### Railsプロジェクト作成

途中Gemfileを上書きするか聞かれるがYesで。

```
bundle exec rails new .
```

### React インストール

```
gem 'react-rails'
gem 'webpacker'
```

下記コマンドでインストール。
webpackで利用するファイルとコマンドのインストールとreactをインストールする。

```
bundle install
bundle exec rails webpacker:install
bundle exec rails webpacker:install:react
bundle exec rails generate react:install
```

この段階で下記にjsが作成されています。

```:app/javascript

├── components
└── packs
    ├── application.js
    ├── hello_react.jsx
    └── server_rendering.js
```

### 確認用コントローラ作成

コントローラ名はなんでも大丈夫です。


```
bundle exec rails g controller StaticPages home
```

ここまでで、いったん下記にアクセスできるはずです。
http://localhost:3000/static_pages/home
本当は config/route.rb をいじってパスをいじりたいところですが、本筋からそれるのでそのまま進めます。

### React読み込み準備

app/javascript 配下の components, packs を読み込むため、下記のファイルに読み込み処理を追加します。

```ruby:app/views/layouts/application.html.erb

<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

これで app/javascript/components 配下にReactコードを書けば読み込むことができます。

### Reactファイル作成
テスト用に下記のファイルを追加します。

```ruby:app/javascript/components/test_react.jsx

import React from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'
const Hello = props => (
  <div>Hello {props.name}!</div>
)
Hello.defaultProps = {
  name: ‘Rails'
}
Hello.propTypes = {
  name: PropTypes.string
}
export default Hello
```

あとはviewにReactを読み込む処理を書くだけです。

### Reactファイル読み込み

以下のように読み込み処理を追加します。場所はどこでもいいです。

```ruby:app/views/static_pages/home.html.erb

<%= react_component("test_react", name: 'React') %>
```

”Hello React!” と表示されていればOKです。
以上

##参考
ReactをRailsと共に使う方法
https://qiita.com/k-penguin-sato/items/e3cc04f787cf3254cfae
Mac OS Mojaveにアップデート後にターミナルでGitコマンドエラーが出た時の対処法 

MacのOSをMojaveにアップデートした後にターミナルでGitを扱おうと思ったらエラーが出てきてしまいました。

こちらがエラーメッセージです。

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

こちらの対処方法について記載していきます。

##エラーメッセージをコピペ→検索→xcodeのインストール
まずこういった場合の対策としてエラーメッセージをコピペして検索するのが一番です。

検索で調べたことを元に記事にしますと、

ターミナル上で

$ xcode-select --install

と入力しEnter、xcodeをインストールすることで解決できました。
【視聴メモ】AMP Stories: Visual Stories for the Web (Google I/O'19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References

https://www.youtube.com/watch?v=L_waSaTNlqM
Speaker(s): Wei Hong, Vinay Mahagaokar

## Abstract

> As people’s mobile consumption habits shift, more visual forms of storytelling are gaining popularity. However, the story format, while popular in some apps, is not widespread across the open web. In this talk, you’ll learn more about AMP stories, how to build them, and how Google is surfacing stories within its own experiences, including Search.


訳

> 人々のモバイル体験が変化するにつれて、より視覚的なストーリーテリング形式が人気を集めています。 ただし、ストーリー形式は、一部のアプリでは一般的ですが、Web全体には普及していません。 このセッションでは、AMP Stories、それらの作成方法、およびGoogleが検索を含む独自の経験の中でストーリーをどのように活用しているかについて詳しく説明します。

## Contents

* AMP Stories
    * TwitterとかInstagramのストーリーを表示するためのAMPコンポーネント
* StoryはWebのように「見つけやすい」「共有しやすい」「リンクしやすい」という特性がない
    * AMP StoriesこそがStoryにそれをもたらす
* ご存知の通り、Google Searchの結果でStoryが出るようになってる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/096fd223-1d67-8414-27dd-ba7bcf5b7919.png)

**AMPの新機能**

* Localization
    * 21の新しい言語に対応
    * HTMLタグに`dir="rtl"`で右から左に書く言語にも対応
* フォーカルポイント
    * 写真の中のフォーカルポイントをX座標とY座標のパーセンテージで指定できるようになった
    * デバイスサイズが変更してもコンテンツがうまい具合に表示されるようになる
    * `amp-story`の中の`amp-img`で`object-position`を指定するだけでOK
* Sidebar
    * Storiesからサイトのメニューを見れるハンバーガーメニュー
* Attachments
    * ストーリーを下から上にスワイプすると出てくる詳細画面のようなもの
    * `amp-story-page-attachment`タグで追加する
* Embeds
    * `amp-twitter` とかでツイートを埋め込めるようになったりする
    * Google MapとかYouTubeとかで対応予定

マネタイズ

* Story Ads
    * Immersive → フルスクリーンで広告が表示できる
    * Flexible → 広告のロードが完了したらユーザーコンテンツの間にそっと差し込めばいい
        * ロード中のウザさが気にならない
        * AMPタグを使って記述するのでデバイスサイズの影響が少ない
    * Google Ad Managerで簡単に対応できる
    * DV360に対応
    * amp.devから広告テンプレートをダウンロード可能
* Affiliate Link
    * 現状はストーリー上のリンクをクリックすると別ページに遷移するだけだが、クリック時にポップアップメニューを表示したりできるようになる
* Sponsored Stories
* MakeStories
    * AMPストーリーを作るためのツール
    * 他にもいろいろなツールがある
    * WordPressも対応した

## Memo

* AMPコンポーネント、リッチでアクセシビリティが高くどこでも動くのでAMP関係なしにすぐ使いたい
* Ad系のアピールが強かったしGoogleとしてはかなりAMPに力を入れたいのだなと感じた
C++のデバッグ中に便利なマクロ

# はじめに
最近競技プログラミングに興味を持ち，参加しています．また，それ以外でもプログラミングをする機会が増えてきました．
まだ全然慣れていないので，よくくだらないミスをします．
今までは，変数の中身を確認するためには，

```cpp:
cout << "変数名 : " << val << endl;
```

などといちいち書いていたのですが，これを短縮するためにマクロを定義することにしました．
数日間使用したところ，非常に重宝しているので，晒しておきます．

# 設定

```cpp:macro
#define debug(var)  do{std::cout << #var << " : ";view(var);}while(0)
template<typename T> void view(T e){std::cout << e << std::endl;}
template<typename T> void view(const std::vector<T>& v){for(const auto& e : v){ std::cout << e << " "; } std::cout << std::endl;}
template<typename T> void view(const std::vector<std::vector<T> >& vv){ for(const auto& v : vv){ view(v); } }
```

# 使用例
以下のように変数の中身を確認する際に用いる．

```cpp:main.cpp
#include <iostream>
#include <vector>
#define debug(var)  do{std::cout << #var << " : ";view(var);}while(0)
template<typename T> void view(T e){std::cout << e << std::endl;}
template<typename T> void view(const std::vector<T>& v){for(const auto& e : v){ std::cout << e << " "; } std::cout << std::endl;}
template<typename T> void view(const std::vector<std::vector<T> >& vv){ for(const auto& v : vv){ view(v); } }
using namespace std;

int main(){
  int i1 = 5;
  debug(i1);
  vector<double> v(5, 0.0);
  for(size_t i=1; i<v.size(); ++i){
    v[i] = v[i-1]+1;
  }
  debug(v);
  vector<vector<string>> vv(5, vector<string> (2, ""));
  for(size_t i=0; i<vv.size(); ++i){
    for(size_t j=0; j<vv[i].size(); ++j){
      vv[i][j] = to_string(i)+to_string(j);
    }
  }
  debug(vv);
  return 0;
}
```

上のプログラムの実行結果が以下である．

```bash:output
i1 : 5
v : 0 1 2 3 4 
vv : 00 01 
10 11 
20 21 
30 31 
40 41 
```

このように，任意の型に対して，`vector`の２次元配列まで変数名と値を出力確認することができる．
２次元配列については，２行目以降は変数名分ずれるのが難点であるが．

# ちょっとした解説

```cpp:
#define debug(var)  do{std::cout << #var << " : ";view(var);}while(0)
```

これがメインで，`#var`によって変数名を取得し，出力．`view()`関数は下で定義している．`do-while()`は，マクロが複数行にまたがっていると`if`や`for`内で使用する場合に不便であることから使用している．

```cpp:
template<typename T> void view(T e){std::cout << e << std::endl;}
template<typename T> void view(const std::vector<T>& v){for(const auto& e : v){ std::cout << e << " "; } std::cout << std::endl;}
template<typename T> void view(const std::vector<std::vector<T> >& vv){ for(const auto& v : vv){ view(v); } }
```

`view()`関数，`template<typename T>`とすることで，任意の型に対して出力する関数とした．

# おわりに
今回は、変数名を出力するために仕方なくマクロという形にしました。しかし、実を言うとマクロはあまり良くないらしく、本当は避けたいです。今後他の方法が見つかり次第変更しようと考えています。
本記事のマクロを使用する際は、デバッグ中だけに留めておくと良いと思います。

# 参考
- https://aki-yam.hatenablog.com/entry/20081217/1229498370
    - 変数名の出力方法
- https://www.jpcert.or.jp/sc-rules/c-pre10-c.html
    - 複数行マクロをdo-while{}で囲み，１行にする事
[shell] ディレクトリ中の◯◯.jpegを全て◯◯.jpg に変更する

# 環境
Mac OS 10.14.3

# *.jpegを*.jpgに変更する

```
$ rename 's/jpeg/jpg/;' *.jpeg
```

# 参考URL
[renameのman pageが間違ってるよぉぉぉぉ](https://incompleteness-theorems.at.webry.info/201204/article_4.html)
【Unity】Creating Project folder failed! プロジェクトを作成できないエラー

Macbookを買い替えたら今まで作成できていた場所にプロジェクトを作成できなくなり、困りました。

こんなエラー
<img width="420" alt="ScreenShot 2019-06-02 3.17.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/ab05ae87-d39b-e89c-c4c6-116fd66fe72d.png">

ググるとデスクトップに作成すればできるよ！
みたいに書かれており、試すと確かにできた。

ディレクトリの権限っぽいなと思って確認したら、ディレクトリの所有者がrootになっており、ユーザーと異なっていたので、所有者を変更。

```
# chown azumagoro /Users/Shared
```

※自分のユーザー名、保存したいディレクトリを指定してください

無事に作成できるようになりました。
Jetson nano セットアップ方法まとめ

# はじめに
Jetson Nano 購入してから TensorFlow, OpenCV を導入するまでに苦労しましたのでセットアップ方法をまとめました。
本記事では、SD カードに OS を導入するところから DeepLearning に必要な TensorFlow, OpenCV 導入までを対象にしています。
※全工程終了には約5時間くらい掛かります。

# SD カードに OS イメージの書き込みから OS起動まで
こちらの @tsutof さんの
小型 AI コンピュータ NVIDIA Jetson Nano 開発者キットのセットアップ
https://qiita.com/tsutof/items/66e68c75b462c4faf1cb
が非常に参考になります。

# TensorFlow のセットアップ方法
TensorFlow のセットアップ方法は @karaage0703 さんの
Jetson Nano関係のTIPSまとめ
https://qiita.com/karaage0703/items/b14c249aa33112669ee4
が非常に参考になります。セットアップが簡単に行えるスクリプトをGitHubにて公開して下さっています。

# OpenCV のセットアップ方法
OpenCV のセットアップ方法は @asahi0301 さんの
Jetson Nano へ OpenCV 4.1.0 をインストールする
https://qiita.com/asahi0301/items/3c287190348552f19415
が非常に参考になります。こちらの記事にも記載してありますが、インストールに約3時間くらい掛かります。
Raspberry PiでPHP7.0を動作させる



以下のサイトが参考になりました。

・[Raspbian Stretchでサーバー構築！ PHP7.0 Apache2 / インストール編](
https://www.fabshop.jp/raspbian-stretch%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%EF%BC%81-php7-0-apache2-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E7%B7%A8/)
・[Raspbian StretchでMariaDBのインストール方法](http://carol-net.co.jp/ikakashi/2017/08/24/raspbian-stretch%E3%81%A7mariadb%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95/)
Pythonの辞書についてさらっと

# はじめに
Pythonをほとんど使ったことがなかったのですが，Pythonで辞書(dict型)を使う必要があり，少し勉強しました．
備忘録として残します．よかったらご活用します．

# 辞書とは
C++における`std::map`である。
雑に言うと，文字列(key)と数値(value)がセットになったもの．
[Pythonドキュメント](https://docs.python.org/ja/3/tutorial/datastructures.html#dictionaries)では
>辞書は キー(key): 値(value) のペアの集合であり、キーが (辞書の中で)一意でければならない
と説明されている．

# 辞書の生成
## キーと値で生成

```py:generate_dictionary
dic = {'key1': val1, 'key2': val2}
```

## 空の辞書の生成

```py:generate_empty_dictionary
dic = {}
```

# 辞書の追加

```py:add_dictionary
dic['key1'] = val1
```

コメントで教えていただいた事だが，スペース，改行区切りの文字列(`str`型)と数値(`int`型）を辞書に変換するために，以下のようにすることができる．

```py:str_to_dict
dic = {}
str1 = ["hello", "world"]
val1 = [1, 2]
dic = dict(zip(str1, val1))
```

# 辞書の値の変更

```py:change_value
dic['key1'] = val2
```

# 辞書の出力
`0`から`num`まで出力する場合は以下．

```py:output_dictionary_1
for i in range(num):
    print(dic[i])
```

辞書を全て出力する場合は以下．

```py:output_dictionary
for t in dic.items():
    print(t)
```

# ソート
いろんなページを参考にしたので，参考は後述する．
## keyで昇順

```py:key_sort_ascending_order
dic_s = sorted(dic.items())
```

## keyで降順
降順にするためには`reverse=True`をつけると良い．

```py:key_sort_descending_order
dic_s = sorted(dic.items(), reverse=True)
```

## valueで昇順
`value`でソートするためには`key=lambda x:x[1]`をつけると良い．

```py:value_sort_ascending_order
dic_s = sorted(dic.items(), key=lambda x:x[1])
```
## valueで降順

```py:key_sort_descending_order
dic_s = sorted(dic.items(), reverse=True, key=lambda x:x[1])
```

## key-valueで昇順-昇順
key-valueの両方でソートするためには`key=lambda x:(x[1],x[0])`をつけると良い．

```py:key-value_sort_ascend-ascend
dic_s = sorted(dic.items(), key=lambda x:(x[1], x[0]))
```

## key-valueで降順-降順

```py:key-value_sort_descend-descend
dic_s = sorted(dic.items(), reverse=True, key=lambda x:(x[1], x[0]))
```

## key-valueで昇順-降順
これは,調べてもなかなか出てこなかったので，少し上のlambda式を変更して作成した．
key-valueのソートで昇順と降順を混合するために，ここでは`key=value x:(-x[1], x[0])`とした．
ソートを２回連続で使う方法もあり，そのためには後述する`list`を`dict`に変換する方法が必要であった．

```py:key-value_sort_ascend-ascend
dic_s = sorted(dic.items(), key=lambda x:(-x[1], x[0]))
```

## key-valueで降順-昇順
上で述べた昇順-降順ソートを反転することでできた．

```py:key-value_sort_ascend-ascend
dic_s = sorted(dic.items(), reverse=True, key=lambda x:(-x[1], x[0]))
```

## ソートしてlistになってほしくない場合
以上で例に挙げた書き方では，ソート後には`list`型になっておった．これを`dict`型にするためには以下の方法がある．

```py:list_to_dict_1
dic = {k: v for (k, v) in dic_s.items()}
```

```py:list_to_dict_2
dic = dict(dic_s.items())
```

以下のようにすると，ソートと変換を同時に行うことができた．

```py:sort_to_dict
dic = dict(sorted(dic.items()))
```

# 参考
- https://docs.python.org/ja/3/tutorial/datastructures.html
    - 辞書について全般
- https://qiita.com/shizuma/items/40f1fe4702608db40ac3
    - ソートの基本
- https://www.headboost.jp/python-how-to-sort-dict/#23
    - ラムダ式を用いたkey-valueソート
- https://www.lifewithpython.com/2014/03/python-create-dicts-from-lists.html
    - list_to_dict変換

# おわりに
今回はさらっと撫でるようにしか書かなかったのですが，また使う機会があればその都度更新しようと思います．
カメラで顔検出して位置に応じてCSSで影をつける


# はじめに

`tensorflow`を勉強したいなと思っていて色々と調べていて簡単なデモがあったので作ってみました。
※深いところまでは全然触っていないのであしからず…


# 結果
こんなふうになりました。
カメラを起動していただければ顔を検知して、影が移動します。

![名称未設定.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/82cd4fe9-0410-52cd-26f2-eb1400dd82ad.gif)


## ソースコード
埋め込みだと動きませんのであしからず…
Codepenに移動していただければ動きます。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="hashito" data-slug-hash="xNmYBa" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="face detection shadow">
  <span>See the Pen <a href="https://codepen.io/hashito/pen/xNmYBa/">
  face detection shadow</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 内容
## 初期化部分

```javascript
// load...
const net = await posenet.load();
// 人の検出
const pose = await net.estimateSinglePose(video, imageScaleFactor, flipHorizontal, outputStride);
// video:入力元
// imageScaleFactor:イメージの縮小率
// flipHorizontal:映像を反転させるか？
// outputStride:出力ストライド数、高いほど制度が上がる(32,16,8のみ許容)
```
簡単ですね…
※複数人検出する場合は別の関数になります。

## 取得されるデータ

こちらの学習済みデータは人のボーンを推定するものですので、各特徴部位がスコアと共に帰ってくる形です。
取得されたデータがこちらになります。

<img width="628" alt="スクリーンショット 2019-06-02 2.10.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/3a2fe7cc-2299-505e-3908-97541c2404d5.png">
こちらも分かりやすい…
※スコアが低い部位はカメラに入っていないため推定できていないものと思われます。

## 顔の基準
データは色々ともらえるのですが今回は顔の中心である`nose`だけを利用します。
`nose`の位置を取得し、画面上の中心点との差分を係数で変換し、CSSを変更するだけ！
簡易なセーブデータの暗号化 (PlayerPrefs)

# 前提
- unity 2018.4.1f1、2018.4.32f1
- `System.Security.Cryptography` BlockSize 128bit, KeySize 256bit, Mode CBC, Padding PKCS7

# できること
- 標準のPlayerPrefsを置き換える形で、セーブデータの暗号化ができます。
- PlayerPrefsを継承するので、クラス名を付け替えるだけで置き換えが完了します。
- クラスオブジェクトを扱うことが可能です。(`GetObject<T> ()`、`SetObject<T> ()`)

# アセットの入手 (GitHub)
ダウンロード ⇒ [CryptoPlayerPrefs.unitypackage](https://github.com/tetr4lab/CryptoPlayerPrefs/raw/master/CryptoPlayerPreffs.unitypackage)
[ソースはこちらです。](https://github.com/tetr4lab/CryptoPlayerPrefs)

# 導入
- 最小限必要なアセットは、`Crypto.cs`と`CryptoPlayerPrefs.cs`です。
- `Sample.cs`は使用例です。シーン`SampleScene`で挙動を確認できます。

# 簡単な使い方
- `PlayerPrefs`の代わりに`CryptoPlayerPrefs`を使用します。
    - クラス名が異なる以外は同じ使い方です。
- 鍵は自動生成することも、任意に定めることもできます。
    - `Sample.cs`には、切り替えスイッチがあります。
- 鍵は、何処かに保存しておく必要があります。例えば…
    - ソース中でハードコーディングする
    - 難読化して`PlayerPrefs`でセーブする
    - Fixした画像データの一部を使用する
- `GetObject<T> ()`、`SetObject<T> ()`を使う対象には、`[Serializable]`アトリビュートの指定が必要です。
    - 具体的には、`Sample.cs`を参照してください。
    - このセーブデータは、.NETのバージョンに依存しており、異なるバージョン間では互換性が保証されません。


# 開発途中はセーブデータの内容を見たい
- `CryptoPlayerPrefs.cs`冒頭の`#define CRYPTO`をコメントアウトすると、暗号化を行いません。
    - 素の`PlayerPrefs`+オブジェクト拡張の挙動になります。

### 【参考】#define 触るの面倒なんだけど…
- こちらをお勧めします。 ⇒ [Unityで共通のdefineを定義する【Unity】【C#】](http://kan-kikuchi.hatenablog.com/entry/ScriptingDefineSymbols)  
(いつもお世話になっております。)
雑に組み合わせ数を得る

4C2のような4要素から2要素組み合わせを重複無しで得るには`Array#combination`を使う。

```irb
irb(main):034:0> (1..4).to_a.combination(2).count
=> 6
irb(main):035:0> (1..4).to_a.combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
```

重複あり組み合わせなら`Array#repeated_combination`

```irb
irb(main):037:0> (1..4).to_a.repeated_combination(2).count
=> 10
irb(main):038:0> (1..4).to_a.repeated_combination(2).to_a
=> [[1, 1], [1, 2], [1, 3], [1, 4], [2, 2], [2, 3], [2, 4], [3, 3], [3, 4], [4, 4]]
irb(main):039:0> 
```


## 参考
http://rurema.clear-code.com/2.3.0/method/Array/i/repeated_combination.html
http://rurema.clear-code.com/2.3.0/method/Array/i/combination.html
【エラー】リスト 10.32: フレンドリーフォワーディングを備えたcreateアクション

### 事象
『フレンドリーフォワーディングを備えたcreateアクション』のテストでエラーが表示される。


### Railsチュートリアルの表示

```app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  .
  .
  .
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_back_or user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end
  .
  .
  .
end
```

### エラーが表示される

```
Error:
UsersLoginTest#test_login_without_remembering:
NameError: undefined local variable or method `user' for #<SessionsController:0x0000557740d1b908>
Did you mean?  @user
    app/controllers/sessions_controller.rb:11:in `create'
    test/test_helper.rb:26:in `log_in_as'
    test/integration/users_login_test.rb:62:in `block in <class:UsersLoginTest>'
```

### `@user`がない？

```app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  .
  .
  .
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_back_or @user # ここのuserをインスタンス変数にする
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end
  .
  .
  .
end
```


### 解決！

チュートリアルの記述ミスなんですかね？？
実際はどうなんだろうか？？
はっきりと解決できるほど実力がないのが辛い…
AWS上のWindowsServerに対して、ローカルmacからansibleを実行 #7 gitbucket実行用のplaybook

gitbucketダウンロード+実行用のplaybook。
やりたかったことは、
1. ダウンロード用のフォルダ作成
2. javaインストーラをローカルからリモートにコピー
3. javaインストール
4. javaの環境変数設定
5. gitbucketダウンロード
6. gitbucket実行用のサービス作成+起動

途中から、
`
[WARNING]: ERROR DURING WINRM SEND INPUT - attempting to recover: WinRMError パイプを閉じています。  (extended fault data: {'transport_message': 'Bad HTTP response returned from server. Code 500', 'http_status_code': 500, 'wsmanfault_code':
'232', 'fault_code': 's:Receiver', 'fault_subcode': 'w:InternalError'})
`
が出力されて、サービス作成と起動部分が確認できなかった。
このエラーなんなんだろう？色々ググったけど、まだ解決できてない。


```conf:downloadGitbucket.yml
---
- hosts:
    - windows  # インベントリファイルで指定した名前

  tasks: 
    - name: create directory for gitbucket
      win_file: 
        path: C:\user_tools\gitbucket
        state: directory

    - name: create directory for java
      win_file: 
        path: C:\user_tools\java
        state: directory

    - name: copy java installer
      win_copy: 
        dest: C:\user_tools\java\jdk.exe  # 必須
        src: ローカルフォルダ/jre-8u211-windows-x64.exe  # 必須

    - name: install java
      win_package: 
        path: C:\user_tools\java\jdk.exe
        product_id: 26A24AE4-039D-4CA4-87B4-2F64180211F0
        arguments: "/s /lang=1041"

    - name: add environment
      win_environment: 
        level: machine
        name: PATH
        value: 'C:\Program Files\Java\jre1.8.0_211\bin'

    - name: download gitbucket
      win_get_url: 
        dest:  C:\user_tools\gitbucket  # 必須
        url:  https://github.com/gitbucket/gitbucket/releases/download/4.31.2/gitbucket.war  # 必須

    - name: create gitbucket service
      win_service: 
        name: gitbucket
        path: java -jar "C:\user_tools\gitbucket\gitbucket.war"
        start_mode: auto
        state: started

```
VSCode Remote Development でSSHする、お前もしろ、今すぐにだ

# vscodeでaws ec2にsshする大したことない話と紹介

初投稿です、よろしくです。

様々な言語毎とかに切り替えられる、マルチな環境をWindows環境で探して練り歩いてきました、
そして、やっと安住の地を見つけたかもしれない話

VPCでもいいけど、Linuxベースな開発を行うなら、vscodeでリモート接続して
そこで開発するのがいいよねって、早く公式バージョンにきてくれないかなぁ…

WSL2がきてくれればDockerサポートしてくれてるし、ローカルだけでも完結できそう…
WSL2くんは、もちろんcompsoeもサポートしてくるんだよね…（圧力

## 遍歴

以下遍歴を経て、これが一番いいと思います、え？macに乗り換えろ…？

お絵描きもするんだよ！！サーフェスがいいんだよくそが！！

### Windows10 + WSL(ubuntu) + GUI開発環境 VSCode(x転送) + Windows for Docker

X通信で、VSCodeを利用する、Dockerはdeamonはwindows for Docker

composeもいける、volumesのパス周りで死亡

### Widows10 + hyper-v(Linux系OS) + GUI開発環境 VSCode(x転送)

Hyper-V + VSCode GUIが重すぎて挫折

### Windows10 + hyper-v(Linux系OS） + CUI開発環境 (mobaxterm ssh + vim)

もうこれでいいんじゃないかな…、vimも慣れてくれば中々いいもんだ…
docker-compose exec ap bash ...
... ん？やめて！！Dockerくんキーバインド変わらないで！！
あと、いちいちhyper-vくんの時計なおすのめんどいんだよ！！

で、いろいろ探って、たどりついたVSCode insiders 

## 環境

AWS EC2 Amazon Linux2
Windows 10 Pro 1809
Visual Studio Code Insiders 1.35.0

## 以下手順

### vscode insiderのインストール

https://code.visualstudio.com/insiders/

### vscodeにRemote Developmentをインストール

拡張機能を開いて、Ctrl + Shift + x
Remote Developmentをインストール

### setting

Ctrl + Shift + p
Remote-SSH: Settings

ssh接続設定ファイルを指定しておく 
"remote.SSH.configFile": "C:\\project\\ssh\\ssh.conf"

```
Host aws.dev
    User ec2-user
    HostName XXX.XXX.XXX.XXX
    IdentityFile C:\Users\XXX\.ssh\aws.ec2-user.dev.pem
```

※ 鍵配置箇所に注意、パーミッション緩すぎエラーがおきる

"remote.SSH.enableHostsExplorer": true 
設定されているすべてのホストを一覧表示し、現在作業中のホストを表示して、 
フォルダ、新しいウィンドウ、および端末を開くことができます。

"remote.SSH.showLoginTerminal": true 
VS CodeがSSHコマンドを実行するたびに端末を表示。

コントロールマスターの設定は、まぁ、そうねぇ

Remote-SSH の詳しい設定回りはここみる

https://github.com/microsoft/vscode-docs/blob/master/remote-release-notes/v1_31.md

### ssh client

管理者権限でPowerShellを立ち上げて

```
PS C:\WINDOWS\system32> Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

PS C:\WINDOWS\system32> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Path          :
Online        : True
RestartNeeded : False
```

### 接続

Ctrl + Shift + p
Remote-SSH: Connect xxx
(remote or current)

うむ、ええやん