OmniAICreator/Qiita-1.07M huggingface dataset:
Kotest初めの一歩

`Kotest`を使用してkotlinプロジェクトのテストを行います。

#準備
gradleプロジェクトであれば、以下の依存関係を追加します。

```
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    //ここから
    testImplementation 'io.kotest:kotest-runner-junit5:4.3.1' // for kotest framework
    testImplementation 'io.kotest:kotest-assertions-core:4.3.1' // for kotest core jvm assertions
    testImplementation 'io.kotest:kotest-property:4.3.1' // for kotest property test
    //↑ここまでがKotestの依存関係
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
```

また、intelliJ IDEAを使用してテストする場合、[このプラグイン](https://plugins.jetbrains.com/plugin/14080-kotest)を使用することでテストが実行しやすくなります。

#テスト対象クラス
今回は、kotestを使用したテストがどんなものなのか雰囲気だけ掴んでいただければ良いので、ごく簡単な計算用クラスをテスト対象とします。

```kotlin
class Calc {
    fun plus(a: Int, b: Int): Int {
        return a + b
    }

    fun devide(a: Int, b: Int): Int {
        return a / b
    }
}
```

#テストコード
テストしたい処理にしたがって、一つずつ書いていきます。

##テストコードを書くにあたって - StringSpecを使用したテスト
本稿ではテストコードを`StringSpec`を使用するスタイルで記述していきます。
`Kotest`では、テストクラスがどの`Spec`を継承するかで、テストの記述スタイルが異なります。他にも`WordSpec`や`FunSpec`、`ShouldSpec`などがあります。各Specの差異は[公式ページ](https://github.com/kotest/kotest/blob/master/doc/styles.md)が参考になりますので、解説は省略します。（私見ですが、初めは`StringSpec`を使えれば十分なのではないかと思います。）

##テストクラス
テスト対象クラスは以下のように記述します。前述の通りSpecによって書き方が異なりますが、`StringSpec`では以下の2つの書き方があります。

```kotlin
//StringSpecのコンストラクタにラムダを渡す書き方
class CalcTest : StringSpec({
    //ここにテストを書く
})

//initブロックを使用した書き方
class CalcTest : StringSpec(){
    init {
    //ここにテストを書く
    }
}
```
どちらで書くかは個人・チームの好きにして良いと思います。本稿ではコンストラクタにラムダを渡す書き方で統一します。
それでは実際のテストを書いていきます。

##基本のアサーション - shouldBe
以下のテストのように、`shouldBe`を使用することで値の正当性を確かめることができます。
なお、`StringSpec`を継承する場合、文字列でテスト内容を示し、`{}`で囲った部分に実際のテストを記述するスタイルとなります。

```kotlin
class CalcTest : StringSpec({
    "1 + 1は2" {
        val calc = Calc()
        calc.plus(1, 1) shouldBe 2
    }

    "10 + 3は13" {
        val calc = Calc()
        calc.plus(10, 3) shouldBe 13
    }
})
```
また、`shouldBe`のように「値がそうなっているべき」の逆を表す`shouldNotBe`もあります。こちらを使用する場合はメソッド名の通り、引数に渡される値になっていない場合にテスト成功となります。

```kotlin
    "1 + 4は4にならないこと" {
        val calc = Calc()
        calc.plus(1,4) shouldNotBe 4
    }
```

##例外をテストする - shouldThrow
例外をテストする場合は`shouldThrow`を使用します。

```kotlin
    "0で割った場合にExceptionとなること" {
        val calc = Calc()
        shouldThrow<ArithmeticException> {
            calc.devide(10, 0)
        }
    }
```
なお、`shouldThrow`は発生した例外オブジェクトを戻り値とするため、以下のように例外オブジェクトに対するテストを書くこともできます。

```kotlin
        val exception = shouldThrow<ArithmeticException> {
            calc.devide(10, 0)
        }
        exception.message shouldBe "/ by zero"
```
ただし、`shouldThrow`は指定した例外クラスもしくはそのサブクラスが投げられた場合にアサーションが成功になってしまう点に注意してください。特定の例外クラスが正確に投げられているかを確認する場合は`shouldThrowExactly`を使用しましょう。

##終わりに
上記までで、`Kotest`のはじめの一歩は十分かと思います。
他にも`Costom Matcher`や`Soft Assertions`など、`Kotest`に備わっている機能はたくさんありますが、解説の続きは[公式ドキュメント](https://github.com/kotest/kotest/blob/master/doc/reference.md)に譲ります。
Unity Reverbの性能がいいと聞いたので色々遊んでみた

# どうして、遊んでみようと思ったのか
普段DAWを用いてMIXをしているのですが、勉強会に参加した際にレコーディングエンジニアとして経歴の長い方から、
Unityのリバーブ機能を使って空間を作った方がいいものができるとアドバイスをいただいたので、
試してみようという考えになりました。

# Audio Source

Unityで音を流したいときはAudio Sourceを利用します。
見慣れた画面だと思いますが、ざっくり使い方を書きます。

・AudioClipにmp3やwavデータをアタッチし、再生を押すことで再生されます。
・GameなどではBGMをループさせておきたいのでLoopにチェックを入れます。
・PlayOnAwakeにチェックを入れることでオブジェクトが起動したときにしか音が出なくなります。アイテム仕様などのSEなどに使ったりします。
・Priorityはサウンドエンジニアの方はむしろ聞き覚えがないかもしれませんが、Unity上では同時に鳴らせる音数が限られているため、これで優先順位を付けます。
・Spatial Blendは3D空間内で音が鳴った時に位置関係から音の聞こえ方をどれくらい変化させるかを決めるものです。立体音響を作れます。
・ReverbZoneMix今回の主役。このパラメーターはReverbZoneで設定した値をどれくらいAudioに反映させるかという設定項目です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609493/3c12430a-f180-866e-4b82-d5cf2ff97dcc.png)




# ReverbZone

今回の主役です。
そもそもReverbZoneってなに？って方に軽く説明。
3D空間を利用した残響音の制作を直感的にできるようにしたスクリプトといった感じです。
Audio Mixerでもリバーブは使えますが、ReverbZoneの場合は丸い球体が出てくれるので視覚的に空間をとらえることができ、簡単に空間的残響音を作ることができます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609493/d22eb9a1-6a7e-9d7a-58c3-3f3521d1f733.png)


◆リバーブを設定する上で重要なこと
リバーブとは、エコーと勘違いされがちですが全く異なるものです。
リバーブは空間表現であり、この大きさの部屋であれば音はこれくらいで響く。だからこれくらいの残響音を加えてあげればそれっぽくできるよね？といった表現方法です。MIXでもよく勘違いされている方がいるので空間づくりという意識を持てば、リバーブをかける技術が向上するかと思います。

# それでReverbZoneの場合なにがいいのか。
例えばですが、空間を視覚的にとらえられるということは、ライブ会場と同じ距離のCubeを作り、客席と演者の距離感にAudio Sourceとカメラを配置してしまえば、とっても簡単に超リアルな（現実に近い）空間リバーブが作れてしまうことです。
MIXされたことがある人はさわったことがあるかと思いますがリバーブって通常パラメーターしかないので初めて触る人なんかはなんのこっちゃわからないものだと思うんですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609493/aa73b75f-7319-b501-9755-a96e9c438d5d.png)

このパラメーターをいじり、経験と、知識と、己の耳を頼りにリバーブを作っていくわけですが、
これを視覚的にできるのはかなりうれしいという話です。

# 今回遊んだこと
Unityで流した音源をDAWで収録するみたいなことをしてみました。
昔のラジカセ録音のデジタル版みたいな遊びですねｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609493/9b892523-4bbe-4c26-ef4c-2663171aa1a0.png)

簡単な構成ですが、
WindowsのAudio outをAN1/2に設定

AN1/2をADAT5/6に割り当てループバック

ADAT5/6をDAWで受け取るといった感じです

あとは再生して録音するだけ！めっちゃ簡単ですね

参考動画
https://youtu.be/IOSmThM5TyU

めちゃくちゃ簡単！！！しかも視覚的にできるって最高！！！ライブ会場の再現とか簡単にできちゃう！！！
以上、デモンストレーションでしたｗ
処理が重たかったりだとか、そういった部分はなにも考慮せず、今回はUnityをただリバーブプラグインとして使用するといったとっても無駄遣いをしてみました。とってもいい機能なのでいろいろ研究して活用していければと思っています

# まとめ
Angular8 -> 9 へアップグレードしたらビルドができなくなったときにやったこと

タイトルが直接の原因かどうかは不明で、不正確な可能性がありますが、
私の手元ではこのタイミングで発生したため、このタイトルで記述します。

より正確には`angular`を使用した`ionic`のプロジェクトをアップグレードした際に発生しました。
`ng serve`によるホットリロードによる開発サーバは立ち上がり、コードの開発はできるのですが、
`ng build`を実行すると以下のようなエラーがでてしまい、ビルドに成功しませんでした。

```shell
> foobar-app@0.0.1 build /Users/me/foobar-app
> ng build

Another process, with id 68428, is currently running ngcc.
Waiting up to 250s for it to finish.
```

なにやら既にプロセスが走っていると言われ、待たされた挙げ句にエラーで終了してしまいました。

# ロックファイルを削除する

```shell
$ rm node_modules/@angular/compiler-cli/ngcc/ngcc_lock_file`
```

どのようなタイミングでこうなったのか不明ですが、どうやらプロセスのロックファイルが残っていたようで、存在しないプロセスの終了を待ち続けて居たようです。
そりゃ終わらないわけだ。

というわけで上記のファイルを削除して、ビルドをし直したところ解決しました。

# まとめ

アップグレードのタイミングに限らず、なんかの表紙にロックファイルが残ってしまってこのエラーに遭遇する場合は、ロックファイルを手動で削除することで解決できそうです。

同じ問題に遭遇したひとの助けになれば幸いです。
Angular9 + Ionic5 のプロジェクトがbuildに失敗するようになった場合に対処したこと。

`Angular9 + Ionic5`のプロジェクトで、これまで`ng build`でビルドができていたのに、
どこかのタイミングで突然エラーがでてビルドができなくなりました。

```shell
$ npm run build

> foobar-app@0.0.1 build /Users/me/foobar-app
> ng build

Generating ES5 bundles for differential loading...
An unhandled exception occurred: Call retries were exceeded
See "/private/var/folders/dq/krc2_m3n1l7dz267pz551gd00000gn/T/ng-4UuNHR/angular-errors.log" for further details.
```

ログを見てみてもあまり状況がわかりません…。

```text
[error] Error: Call retries were exceeded
    at ChildProcessWorker.initialize (/Users/me/foobar-app/node_modules/jest-worker/build/workers/ChildProcessWorker.js:230:21)
    at ChildProcessWorker._onExit (/Users/me/foobar-app/node_modules/jest-worker/build/workers/ChildProcessWorker.js:307:12)
    at ChildProcess.emit (events.js:198:13)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)
```

# StackOverFlowにて解決策を発見

- [angular \- Call retries were exceeded exception while ng build \- Stack Overflow](https://stackoverflow.com/questions/59531305/call-retries-were-exceeded-exception-while-ng-build)

ここにたどり着きました。
どうやら使用するメモリ量を増やしてあげれば回避できるようです。

ビルド時に`node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build`と実行すればよいようです。

手元では`package.json`にかかれているコマンドを修正しました。

```json
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build",
```

# まとめ

プロジェクトで使用するコードが大きくなってくると発生するのでしょうか。
あまり大きいアプリケーションコードだとダウンロードにも時間が掛かってしまうので、
メモリにやさしくビルドができるようにも、余計なコードを含めないように、
コンパクトな実装をしていきたいですね。
PostgreSQL DockerコンテナのWALが壊れて起動できない状態をpg_resetwalで起動できるように

PostgreSQLのDockerコンテナを起動していたローカルのマシンのバッテリーが切れて落ちてしまい、
電源を確保して、起動し直したところ、エラーを吐いて立ち上がらなくなってしまいました。

なお、コンテナのデータはホストマシンのディレクトリにマウントして永続化しての使用です。
`docker-compose.yml`より定義部分。

```yaml
services:
  db:
    image: postgres:12-alpine
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=foobar
    volumes:
      - ./dataDir:/var/lib/postgresql/data
```

起動時のログです。

```shell
db_1                |
db_1                | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1                |
db_1                | 2020-02-07 01:36:06.106 UTC [1] LOG:  starting PostgreSQL 12.1 on x86_64-pc-linux-musl, compiled by gcc (Alpine 8.3.0) 8.3.0, 64-bit
db_1                | 2020-02-07 01:36:06.107 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1                | 2020-02-07 01:36:06.107 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1                | 2020-02-07 01:36:06.270 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1                | 2020-02-07 01:36:06.434 UTC [21] LOG:  database system was interrupted; last known up at 2020-02-07 01:19:57 UTC
db_1                | 2020-02-07 01:36:10.655 UTC [21] LOG:  invalid record length at 1/94338ED0: wanted 24, got 0
db_1                | 2020-02-07 01:36:10.655 UTC [21] LOG:  invalid primary checkpoint record
db_1                | 2020-02-07 01:36:10.655 UTC [21] PANIC:  could not locate a valid checkpoint record
db_1                | 2020-02-07 01:36:10.656 UTC [1] LOG:  startup process (PID 21) was terminated by signal 6: Aborted
db_1                | 2020-02-07 01:36:10.656 UTC [1] LOG:  aborting startup due to startup process failure
db_1                | 2020-02-07 01:36:10.661 UTC [1] LOG:  database system is shut down
```

```shell
db_1                | 2020-02-07 01:36:10.655 UTC [21] PANIC:  could not locate a valid checkpoint record
```

このログを吐いて起動が停止してしまっていました。
調べてみると、WAL(Write ahead log)が損傷してしまったとのこと。

この状態からの復旧は `pg_resetxlog` というコマンドを使用します。

> pg_resetxlogは、先行書き込みログ（WAL）を消去し、さらにオプションでpg_controlファイル内に保存された制御情報の一部を初期化します。 この機能は、これらのファイルが破損した場合に必要になることがあります。 このような破損などが原因でサーバを起動できない場合の最後の手段としてのみ、この機能を使用してください。

なお、`Postgres10`より`pg_resetxlog`は`pg_resetwal`にリネームされていました。
バージョンによってコマンド名を変えてください。

- [pg\_resetxlog](https://www.postgresql.jp/document/9.6/html/app-pgresetxlog.html)
- [pg\_resetwal](https://www.postgresql.jp/document/10/html/app-pgresetwal.html)

```shell
docker run --rm -it -v $(pwd)/dataDir:/var/lib/postgres/data/ postgres:12 /bin/bash
```

データはホストマシン側でマウントしていたので、マウントします。

```shell
gosu postgres pg_resetwal -f /var/lib/postgres/data
```

コンテナが起動したら、ログ初期化コマンドを実行。
実行は、無事起動しました。

これはあくまでログの強制初期化なので、データの整合性が破損している可能性があります。
バックアップをとって、データを入れ直すなど整合性をチェックしたほうが良さそうです。

今回は手元の開発環境であり、最悪全部消えても良かったのですが、
復旧できるならということで、ここまでの対応としました。
Django migrate時のエラー対応　'DIRS': [BASE_DIR / 'templates']

（Django学習のメモ）

djangoでdbのmigrateするときにエラーが発生しのので、その修正メモ。

/を文字列として含めてBASE_DIRと'templates'を'+'演算子で結合する。

```pthon:ターミナル（エラー内容）
$ python manage.py migrate
　・・・・
　・・・・
  File "/Users/USERNAME/mybook/mybook/settings.py", line 57, in <module>
    'DIRS': [BASE_DIR / 'templates']
TypeError: unsupported operand type(s) for /: 'str' and 'str'
```

```python:settings.py(修正前)
    'DIRS': [BASE_DIR / 'templates']
```

```python:settings.py(修正後)
    'DIRS': [BASE_DIR + '/templates']
```

動いたけど、pythonのバージョンとDjangoのバージョンの問題かな。


##　参考URL

[Django DIRS issue(stackoverflow)](https://stackoverflow.com/questions/63701560/django-dirs-issue)
[Python Django入門 (3)](https://qiita.com/kaki_k/items/7b178ad39394a031b50d)
Ubuntu-20.04LTS(WSL)を好きな場所にインストールする

## 目的
開発で読み書きが頻繁に起きるので、任意のドライブに置きたい
## 同じディストリビューションがある場合は、バックアップを取ってアンインストールする

デフォルトのインストール先

```
C:\Users\[user]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs
```

## ディストリビューションをダウンロードする
https://docs.microsoft.com/ja-jp/windows/wsl/install-manual
Ubuntu 20.04をダウンロード

## 拡張子をzipに変更して、インストールしたい場所に移動
Ubuntu_2004.2020.424.0_x64.Appx →　Ubuntu_2004.2020.424.0_x64.zip

## インストールと実行
ubuntu2004.exeを実行するとUbuntu_2004.2020.424.0_x64内にrootfsが作成される。移行は、ubuntu2004.exeを実行すればubuntuのターミナルが表示される。
Ubuntuのzfs supportを使って、アップグレード後などのrollbackを実現する

Ubuntu 20.04 -> 20.10 にアップグレード後、カーネルパニックが起こるようになり、zfsの機能で20.04に戻すことができたという記事です。

また、`/home/`である`pool/USERDATA`に対して、時間での自動スナップショットを設定しました。

## zfsを有効にする

Ubuntu 20.04 には、Experimental Supportであるが、zfs supportが入っている。

インストール時に、Installation TypeのAdvanced featuresの中に"EXPERIMENTAL: Erase disk and use ZFS"という項目があり、これを使うことでZFSを有効化できる。

※画像引用 https://ubuntu.com/blog/zfs-focus-on-ubuntu-20-04-lts-whats-new

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3413/bb011a4f-317b-8d56-0415-acf7b5cbce3f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3413/59d7c033-2e26-c803-614e-bc9d32f33ac8.png)

ZFSのツリー構成の一部は以下のようになっている。

```
$sudo zfs list
NAME                                               USED  AVAIL     REFER  MOUNTPOINT
bpool                                              337M  1.42G       96K  /boot
bpool/BOOT                                         335M  1.42G       96K  none
bpool/BOOT/ubuntu_4yihjq                           335M  1.42G      180M  /boot
rpool                                             26.8G   888G       96K  /
rpool/ROOT                                        8.73G   888G       96K  none
...
rpool/USERDATA                                    18.0G   888G       96K  /
...
```

`apt-get install`するたびにスナップショットがとられるので、いつでも戻すことができる。

## スナップショットの作成とロールバック

現在のスナップショットのリストは以下のコマンドで確認できる。

```
sudo zfs list -t snapshot
```

作成日を確認する場合は以下を実行する

```
sudo zfs list -t snapshot -o name,creation
```

個別にsnapshotを取りたい場合は、以下のようにする。`before-2010`がスナップショット名となる。`-r`はマウントポイント配下を再帰的にスナップショットに追加する。

```
sudo zfs snapshot -r bpool/BOOT@before-2010
sudo zfs snapshot -r rpool/ROOT@before-2010
```


このときのスナップショットに戻したいときは、以下のようにする。
再帰的に設定したスナップショットでも、xargsを使ってそれぞれ復帰させる必要がある。

```
zfs list -t snapshot -o name | grep @before-2010 | xargs -L 1 zfs rollback -rR
```

実際に、Recovery Modeを起動し、`sudo do-release-upgrade`を実行後に、上記コマンドでもとのバージョンに戻すことができました。

## 時間で自動的にスナップショットを取る

zfs-auto-snapshotというパッケージを導入すると、15分、1時間、1日、1月ごとに、適度な数のスナップショットが作られるようになる。

インストールするには、以下を実行する。

```
sudo apt install -y zfs-auto-snapshot
```

この実行と、設定自体は、cronで記述されている。ここの`--keep 4`を変更することで、何世代残すっかを設定できる。

- 15分ごと /etc/cron.d/zfs-auto-snapshot
- 1時間ごと /etc/cron.hourly/zfs-auto-snapshot
- 1日ごと /etc/cron.daily/zfs-auto-snapshot
- 1週ごと /etc/cron.weekly/zfs-auto-snapshot
- 1月ごと /etc/cron.monthly/zfs-auto-snapshot

```/etc/cron.d/zfs-auto-snapshot
*/15 * * * * root which zfs-auto-snapshot > /dev/null || exit 0 ; zfs-auto-snapshot --quiet --syslog --label=frequent --keep=4 //
```

初期設定では、全部を示す`//`となっていて、`/var/docker`のsnapshot残すのは危険な気がして、`rpool/USERDATA`のみとした。

上のcronのスクリプトの`//`を全て`rpool/USERDATA`に変更した。
varがなぜ非推奨なのか？　〜JavaScript〜

# 結論
スコープを無視して変数が適用され、思わぬ挙動を行いバグを引き起こす可能性が高いため。

# 前提知識
let, const, varの存在、それぞれの役割をある程度知っている。

# 詳しく
ここでは関数スコープとブロックスコープを取り上げてお話しします。

関数スコープは

```javascript
function a() {
  **********
}
```
「function」と関数宣言し、{ }で囲まれた部分(*********の部分)を関数スコープと呼びます。

ブロックスコープは

```javascript
{
***********
}
```
{ }で囲まれた部分がブロックスコープです。
関数スコープとの違いは「function」と最初に関数宣言しているか・していないかの違いです。

# 変数とスコープ
関数スコープ内でlet, const, varを使って変数を定義した場合、定義した変数はそのスコープ内でのみ使用できます。

```javascript

function fn() {
  let p = 0;
  console.log(p);
}

fn();
```
上記の場合、関数fnのスコープ内にlet p =0; と定義し、スコープ内でconsole.log(p);で出力しており、いずれも関数スコープ内に存在しているため、出力結果が「０」として表示されます。

一方で次の場合だと出力時にエラーが出ます。

```javascript
function fn() {
  let p = 0;
}
console.log(p);

fn();
```
上記の場合だと、関数スコープ内にlet p = 0; と変数を定義しているのに対し、スコープ外にconsole.log(p);を定義しています。
この場合、変数pは関数fnスコープ内でのみ取得できる値なため、スコープ外から取得しようとするとエラーが出るわけです。


# ブロックスコープで考える

結論からいうと、**ブロックスコープを使用するときは、letまたはconstで変数宣言を行う**ということです。

例を見てみます。

```javascript
{
  let p = 1;
  console.log(p);
}
```
この場合は1を出力します。
一方で

```javascript
{
  let p = 1;
}
console.log(p);
```
の場合はエラーが出ます。ちなみにconstで定義しても同様の結果となります。

対して、varで変数を定義した場合の例を見てみます。

```javascript
{
  var p = 1;
  console.log(p);
}
```
上記の場合は、let,constで変数定義した場合同様、「１」の値が出力されます。
一方で、

```javascript
{
  var p = 1;
}
console.log(p);
```
この場合はどうでしょうか？
この場合も、「１」の出力がなされます。
この理由は、

varに対して、ブロックスコープが適用されず、ブロックスコープ内で定義された変数（var p =1;)がスコープ外でも利用できるようになっているからです。

基本的に、スコープ内で定義した変数は、そのスコープ内でのみ適用可能であるという前提があります。

コードの記述量が多くなれば、変数の取り扱いもより厳密になってきますが、**varで変数定義してしまったがために、その部分で思わぬ挙動をしてしまい、バグを引き起こしてしまう可能性が高くなります**。

# 変数定義する時はletとconstだけを使って定義しよう！！
上記のことから、バグを生み出さないという観点から、JavaScriptで変数を定義する場合は、letとconstを使用して定義するようにしましょう！！

# 終わりに
まだまだ初学者のレベルのため、認識が間違っている可能性も高いです。「その認識は違うのでは？」などの意見があれば、遠慮なくご指摘いただけますと幸いです。

以上、見ていただきありがとうございました。
Ruby 2.3 で「'」や「"」が含まれるCSVファイルをMySQLに入れる

# 概要
- Ruby2.3で「`'`」や「`"`」が含まれるCSVファイルをCSVモジュールを使ってMySQLに入れる場合、以下の2点の注意が必要。
    - CSVファイルに「"」が入っていると、ファイル読み込み時に「`"`」が入っていると `Illegal Quoting` エラーになるので、`quote_char: "\x00"`を指定する
        - Ruby 2.4 からは、CSVモジュールに `liberal_parsing` オプションが使えるが、2.3以前では使えない
        - 普通はファイル内に存在しないはずの`"\x00"`を指定するのがミソ
    - 「`'`」はMySQLに入れる時に「`\\'`」にエスケープ処理をする必要があるので、gsubで置換する


# 環境
- ruby 2.3.8p459 (2018-10-18 revision 65136) [x86_64-linux]


# サンプルコード（TSVファイル用)
```ruby

require "csv"

summary = {}
CSV.foreach("myfile.tsv", col_sep: "\t", quote_char: "\x00", encoding: "UTF-8", headers: :first_row) do |row|
    summary = {
        :col1 => row[0].to_s,
        :col2 => row[1].to_s.gsub("'", "\\\\'"),
        :col3 => row[2].to_f,
    }
    puts summary
    # MyModel.replace(summary)
end
```


# テストデータ(TSV形式)
```
col1	col2	col3
homemade cookies	Aunt Stella's cookies	123
nickname	Louis "Satchmo" Armstrong	456
yard-pound system	4' 10"	147.32
yard-pound system 2	4′ 10″	147.32
```


# 実行して表示を確認
```
{:col1=>"homemade cookies", :col2=>"Aunt Stella\\'s cookies", :col3=>123.0}
{:col1=>"nickname", :col2=>"Louis \"Satchmo\" Armstrong", :col3=>456.0}
{:col1=>"yard-pound system", :col2=>"4\\' 10\"", :col3=>147.32}
{:col1=>"yard-pound system 2", :col2=>"4′ 10″", :col3=>147.32}
```

# 補足
- `\\\\`が`\\`に置換されて`\`に置換される所がややこしい。
JavaScript 超基礎 コンソールに文字を表示する

# 目的

- JavaScriptを用いてコンソールに文字列を表示する方法をまとめる

# 前提条件

- 下記の記事の内容を実装完了していること。
    - [JavaScript 超基礎 処理を外部ファイルに記載する](https://qiita.com/miriwo/items/36a2b719c8716c4b0d90)

# 前提情報

- コンソールに「こんにちは！！！！」と表示する処理を実装する。
- 筆者はMacでChromeを用いて確認を実施している。

# 概要

1. JavaScriptの記載
1. 確認

# 詳細

1. JavaScriptの記載
    1. index.htmlとdaialog_box.jsがあるディレクトリに移動する。
    1. 下記コマンドを実行してJavaScriptのファイルを開く。

        ```terminal
        $ vi daialog_box.js
        ```
    1. 記載されているコードを削除し下記を記載する。

        ```daialog_box.js
        console.log('こんにちは！！！！');
        ```
1. 確認
    1. フォルダからindex.htmlを探しダブルクリックで開く。

        ![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/eeaea532-b67f-eb7d-7073-a7c072964c7c.png)
    1. 下記ページが表示されることを確認する。

        ![このページの内容_と_Document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3a672d85-0b95-2f12-079b-9c118b670252.png)

    1. 「JavaScript」の文字が表示されているページで右クリックをして「検証」をクリックし下記のようなページが開くことを確認する。
    1. 検証画面の「Console」をクリックする。

        ![Document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8e245b27-dd67-0104-7763-b5746cde92d3.png)

    1. JavaScriptで指定した文字列がConsoleで確認できることを確認する。

        ![Document-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b7ed7930-eed7-7040-545b-553bc25320bf.png)
Visual Studio CodeのSuggestion(インテリセンス)が勝手に表示されるようになってうざかったので自動表示を無効化した手順をメモしておく

# まえがき

いつのまにかインテリセンス(入力補完候補が表示されるアレ)のウィンドウが文字入力時に表示されるようになっていた。（補完じゃなくてカーソルキーで下の行に移動したいんだよ！邪魔だよ！）
おそらく、自動更新されたときに設定が変わってしまった（？）

超絶ストレスだったので、<b>表示したい（ctrl+Spaceキーでトリガする）ときだけ表示させるようにした。</b>

# 手順

File→Preferences→Settingsを選ぶ（Ctrl+,でもいけるっぽい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/26d0ff6e-4958-3d70-1f40-9c1348014be8.png)

↓

１．検索窓に「suggestion」と入力する。
２．「Quick Suggestions」の設定箇所を探す。
３．「Edit in setting.json」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/ce851655-6922-d3e8-526c-fbc0972715ad.png)

↓

`quickSuggestions`のとこが`null`か`true`になってるはずなので、`false`にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/42dfffe0-7fc6-4864-8bed-ebfd2ad138b2.png)
以上です

# 参考サイト

https://wakky.tech/vs-code-suggestions-off/
間違えて実行したgit commit --amendを元に戻す方法

# はじめに

Gitで`git commit --amend`コマンドを使ってコミット内容を修正したものの、間違えて上書きしてしまった場合、元の状態に戻したいことがあります。本記事では、`git commit --amend`を取り消す方法について、具体的な手順を解説します。

# 手順

以下の手順で、`git commit --amend`の変更を取り消すことができます。

### 手順1: `git reflog`で過去のコミットを確認

まず、`git reflog`コマンドを実行して、過去のコミット履歴を確認します。`HEAD`の過去の状態を確認し、戻したい状態の番号を確認しましょう。

```bash
git reflog
```

#### `git reflog`の出力例

```
abc1234 HEAD@{0}: commit (amend): Update README
def5678 HEAD@{1}: commit: Initial commit
```

この例では、`HEAD@{1}`が`amend`前の状態です。

### 手順2: `git reset --soft`で特定のコミットに戻す

戻したいコミットを確認したら、`git reset --soft`コマンドを使ってその状態に戻します。例えば、上記の例で`HEAD@{1}`に戻すには、以下のコマンドを実行します。

```bash
git reset --soft HEAD@{1}
```

これで、`amend`を取り消した状態に戻すことができます。

### 手順3: 状態を確認

`git log`を実行して、元の状態に戻っているか確認しましょう。

```bash
git log
```

# 注意点

- **`git reset`は慎重に使用**  
  `--hard`オプションを使うとファイルも元の状態に戻ってしまうため、通常は`--soft`を使用することをおすすめします。

- **バックアップを取っておく**  
  取り消し操作はリスクが伴うため、事前に必要なファイルのバックアップを取っておくと安心です。

# エラーが発生した場合

もし`git reset`がうまくいかない場合、以下の手順を試してみてください。

1. `git status`で状態を確認
2. コマンドがうまくいかない場合は、再度`git reflog`でコミットの状況を確認

# まとめ

`git commit --amend`で行ったコミットの上書きを取り消す方法を紹介しました。この手順を覚えておくことで、誤ってコミットを上書きしてしまった場合でも簡単に元に戻すことができます。
AWSでTerraformを動かすための設定

# はじめに
HashiCorp社の[Terraform](https://www.terraform.io/)を動かすための事前準備として、tfenvを設定する事をオススメします。
※[tfenv](https://github.com/tfutils/tfenv)はTerraformのバージョンマネージャーです。

# 設定方法
  - Amazon Linux 2
    1. AdministratorAccessポリシー関連付けたIAMロールを作成し、EC2インスタンスにアタッチします。
    2. ~/.bashrcに```export AWS_DEFAULT_REGION=ap-northeast-1```を追記します。
    3. ```source ~/.bashrc```を実行してください。
    4. tfenvのインストール
    
        ```sh:ターミナル
        # パッケージを最新にする
        sudo yum update -y

        # Gitのインストール
        sudo yum install git -y

        git clone https://github.com/tfutils/tfenv.git ~/.tfenv

        # 環境変数の設定
        echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile

        # 環境変数の読み込み
        source ~/.bash_profile

        # 指定バージョンのTerraformをインストールする
        tfenv install {バージョン番号}

        # 指定バージョンに切り替える
        tfenv use {バージョン番号}

        # リポジトリにバージョンファイルを含めることで、 tfenv install を実行するだけで指定バージョンとなる
        echo {バージョン番号} > ~/.terraform-version
        ```



  - Mac
   1. ```brew install tfenv```を実行し、tfenvをインストールします。
   2. ```tfenv list-remote```を実行し、Terraformのバージョンの一覧を取得します。
   3. ```tfenv install {バージョン番号}```を実行し、指定バージョンのterraformをインストールします。

```sh:ターミナル
$ aws configure
AWS Access Key ID [None]: {アクセスキー}
AWS Secret Access Key [None]: {シークレットアクセスキー}
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# 便利にする

1.  エイリアスを設定する

    ```sh:.zshrc
    alias t='terraform'
    alias ta='terraform apply'
    alias td='terraform destroy'
    alias tf='terraform fmt -recursive'
    ```

1.  高速化する
　　　　　　　　※ `--parallelism` は並行実行のオプションで、デフォルト値は `10` です。
   　　※大きな値を指定すると、API制限に引っかかる可能性があります。

    ```sh:.zshrc
    export TF_CLI_ARGS_plan='-parallelism=30'
    export TF_CLI_ARGS_apply='-parallelism=30'
    export TF_CLI_ARGS_destroy='-parallelism=30'
    ```
githubでPR作成時のブランチ指定をURLで行う

# 概要
　githubでPR作成時のブランチ指定をURLで行う。
　重たいレポジトリはgithubの画面から「new pull request」のボタンを押してPR作成画面に遷移する時に、unicornのエラーが出てしまうことがあるがこの方法ならそれがない。

# URL
```
https://github.com/レポジトリ/compare/マージ先のブランチ名...マージするブランチ名
```
動画配信を録画するAppleScript(JXA)

QuickTimeの画面収録機能でYoutubeなどの動画配信を自動で保存するAppleScriptを書いてみました。
AppleScriptを書くのはは初めてで、しかもJXA（Javascript）なので間違っている所があったらご指摘いただければ嬉しいです。

※ちなみにこのスクリプトが有効なのは<b>macOS HighSierra</b>までです。
Mojaveからは画面収録の仕様が変わり、動きません。

※全画面表示のショートカットが「F」キーであることが多いので「F」としましたが、
サイトによって適宜変更してください。


##やりたかったこと
１．Cromeで動画配信サイトを表示
２．QTの画面収録で録画
３．自動で保存
４．自動でchromeとQTを終了
５．上記を日時を指定して実行

```Javascript
//chromeで配信動画を全画面再生、QuickTimeで画面収録する
var myLink = "https://www.youtube.com/watch?v=5qap5aO4i9A";//開きたいURL
var myPath = "/Users/ユーザー名/Desktop/movie.mov";//保存したいディレクトリ
var Rectime = 3 ;//録画時間を秒で指定1時間なら3600
var chrome = Application("Google Chrome");
var win = chrome.Window().make(); 
var window = chrome.windows[0];
var theTab = window.tabs[0];
theTab.url = myLink;
delay(5);//ちゃんと起動するまで5秒待つ
var se = Application("System Events"); //参照を取得
se.keystroke("f");//全画面にする
delay(3);

var QuickTime = Application("QuickTime Player");//QT起動
var doc = QuickTime.newScreenRecording();//画面収録
doc.start();
delay(3);//録画時間（秒）
doc.close({saving: 'yes', savingIn: Path(myPath)});//保存

QuickTime.quit();
chrome.quit();
```
日時を指定して実行するにはカレンダー.appを使います。
設定の方法はこちらのサイトを参考にしました。
http://gijutsubu.backstage.jp/?eid=87

その他、注意点としてはchromeの設定で「前回開いていたページを開く」がオンになっていると
次回chromeを起動時に裏でフルスクリーンで動画サイトが開いている状態になります。
その都度閉じればいいだけですが。

##やりたかったけどできなかったこと
・全画面ではなく範囲を指定して録画
・Catalinaでの実装

私の知識ではどうしてもできませんでした。だれか親切な方・・・
GitHub の markdown を Qiita に投稿する GiutHub Action

GitHub と Qiita とでは記法がほぼ同じなので、薄い変換処理を書くだけで済む。

ちなみに、Medium はだいぶ手間そうだったのでまともに試してない。あと、Zenn は画像やテーブル周りの記法違い吸収が手間そうだった。

## GitHub Action

### 1. Qiita API で投稿するスクリプト用意
シンプルな例として、GitHub の `README.md` を Qiita に投稿したいとする。

```post_qiita.sh
#!/bin/sh

# 行末の空白スペース(GitHub だとそれが改行を意味する)を削除
sed -e 's/[ \t]*$//' README.md > README-qiita.md
# 頭の h1 見出しは Qiita だと冗長なので削る
sed -i '.backup' -e '1d' README-qiita.md

rm README-qiita.md.backup

data=$(cat <<EOS
{
  "body": $(ruby -e 'p ARGF.read.sub(/\A---.*---/m, "")' README-qiita.md),
  "title": "タイトル aaa",
  "tags": [ { "name": "foo" }, { "name": "bar" } ]
}
EOS
)

# See: https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF
# NOTE: QIITA_ACCESS_TOKEN は環境変数でセットしてあるものとする
curl "https://qiita.com/api/v2/items/xxx" \
-v \
-X PATCH \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${QIITA_ACCESS_TOKEN}" \
-d "${data}"
```

### 2. アクセストークンの登録
[個人用アクセストークンを発行](https://qiita.com/settings/applications) して `https://github.com/{user_id}/{repository_name}/settings/secrets/actions` で登録する。

ここでは、例えば `QIITA_ACCESS_TOKEN` という名前で設定したとする。
 
### 3. workflow 定義
```..github/workflows/post_qiita.yaml
on:
  push:
    branches:
      - main
    paths:
      - 'README.md'

jobs:
  post_qiita:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v2
      - name: start to post Qiita
        uses: bobheadxi/deployments@master
        id: deployment
        with:
          step: start
          token: ${{ secrets.GITHUB_TOKEN }}
          env: Qiita
      - name: post
        env:
          QIITA_ACCESS_TOKEN: ${{ secrets.QIITA_ACCESS_TOKEN }}
        run: ./scripts/post_qiita.sh
      - name: update deployment status
        uses: bobheadxi/deployments@master
        if: always()
        with:
          step: finish
          token: ${{ secrets.GITHUB_TOKEN }}
          status: ${{ job.status }}
          deployment_id: ${{ steps.deployment.outputs.deployment_id }}
          env_url: https://qiita.com/foo/items/xxx
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/85ac6b9a-7ea3-18de-928c-36d1d0d64d7e.png)

---
[![original](https://img.shields.io/badge/original-black.svg?logo=github)](https://github.com/sensuikan1973/othello-complete-analysis/blob/main/.github/workflows/post_qiita.yaml)
aws iam policy で s3 の bucket 制限を書く時に便利かもしれない小技

# tl;dr

- この記事は[terraform Advent Calendar 2020](https://qiita.com/advent-calendar/2020/terraform)の3日目です
- formatlist と setsubtract でリストを元に s3 のリソース制限をする aws iam policy を作る小技
- `formatlist("%s/*", setsubtract(var.bucket_arns, var.bucket_arns_exclude_dev))`

# iam なんもわからん・・・

- aws iam 難しい＞＜
- チームメンバーにチームのリソースだけ触っていい権限をつけたい。ただし本番、オメーはダメだ
- [リソースタグで制限できる](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_tags.html)から簡単にできるんじゃないかな→簡単じゃなかった
- s3 はタグで制御できるのオブジェクト操作だけで[バケット操作はダメだった](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

# とはいえ

- 今まではちょっとゆるふわ管理で割とカジュアルに強権限つけて対処してたけど、そろそろ真面目に管理したいよね
- 触っていい悪いを管理できるようにポリシー組む必要があるんじゃね？
- とりあえず今よりマシにすることから始めるなら、チーム毎に readonly, developer, admin くらいのグループに分けるか
- チームを示すタグと環境を示すタグをつけて管理だね→s3はダメだった
- じゃあとりあえずs3は見ていいバケットを列挙しつつ、更新しちゃダメなやつは別でリストしよう

# つまり

| bucket | readonly | developer | admin | つまり |
|:-:|:-:|:-:|:-:|:-:|
| A  | -  | -  | -  | 参照不可 |
| B  | 参照  | 更新  | 更新  | 本番環境以外 |
| C  | 参照  | 参照  | 更新  | 本番環境 |

こんな感じのポリシーを作って、グループにアタッチして使おうというのと、今後も同様に管理するチームが増えるので、terraform で自作モジュールにしておこう。ということになった話。

# 全部は無理だし雑いけど

```hcl

data "aws_iam_policy_document" "ro" {
  statement {
    actions = [
      "s3:GetAccountPublicAccessBlock",
      "s3:GetBucket*",
      "s3:ListAllMyBuckets",
    ]
    resources = ["*"]
  }

  statement {
    actions = ["s3:ListBucket"]
    resources = var.bucket_arns
  }

  statement {
    actions = ["s3:GetObject"]
    resources = formatlist("%s/*", var.bucket_arns)
  }
}

data "aws_iam_policy_document" "dev" {
  statement {
    actions = ["s3:*Object"]
    resources = formatlist("%s/*", setsubtract(var.bucket_arns, var.bucket_arns_exclude_dev))
  }
}

data "aws_iam_policy_document" "admin" {
  statement {
    actions = ["s3:*Object"]
    resources = formatlist("%s/*", var.bucket_arns)
  }
}

# sid は空白になるし effect は default で allow なのでこのままコピペしても使えるはず。見やすいように削った。
```

こんな感じのコードで、それぞれ policy にアタッチするモジュールにしておいて、

```hcl

module "a_team" {
  source = "./modules/"

  name_prefix = "a_team"

  # 共通でアクセスしていいバケット
  bucket_arns = [
    "arn:aws:s3:::B",
    "arn:aws:s3:::C",
  ]

  # developer で更新させないバケット（bucket_arns から除外したいもの）
  bucket_arns_exclude_dev = [
    "arn:aws:s3:::C",
  ]
}
```

こんな感じで呼び出すと綺麗に収まる（a_team_ro, a_team_dev, a_team_admin というポリシーができる）
というお話でした。

もうちょっと気にせず実コードさらしていけるようになるといいけどね。。。
仕事でやってるやつを勝手にさらせないので `formatlist()` と `setsubtract()` で楽に書けるねって感じのとこまででひとつｗ
2020年の terraform-jp 振り返り

# tl;dr

- この記事は[terraform Advent Calendar 2020](https://qiita.com/advent-calendar/2020/terraform)の1日目です
- コロナな１年でしたがお疲れさまでした
- [terraform-jp](https://join.slack.com/t/terraform-jp/shared_invite/enQtNTM2NTYzNDY0OTkyLTcxOTYxNmZhZmU3ZGIzOWU3M2RiODkyZTRmZTc0MjEwNjQ1NjMyZDAwMTExODc3MzkxNjAwNmU5ZDY1MTg3YTA) は 2/5 のミートアップ以外オフラインの活動ができませんでした
- 来年、コロナがある程度落ち着いたら、[去年書いた記事](https://qiita.com/raki/items/96691d45922dd25e1365)のやりたいことをやっていきたいと思います

# 活動報告

- 2020年のオフライン活動は[2/5のミートアップ](https://terraform-jp.connpass.com/event/163197/)開催のみでした。直後にコロナによる外出自粛等でオフライン開催ができませんでした（仕方あるまい）
- オンラインでの開催も話はあったのですが、なんやかと立ち消えに。。。
- [HashiCorp Certified: Terraform Associate](https://www.hashicorp.com/certification/terraform-associate) が正式に（？）日本からも受験できるようになって、我らが chaspy が[即受験で合格していました](https://blog.chaspy.me/entry/2020/04/23/120000)。おめでとうございます。
- 他は本当に目立って活動できていませんね。。。

# terraform では

- v0.13.0 が8月にリリースされました
- v0.14.0 は beta2 が10月の終わりにリリースされました（この記事自体は11/07時点で書いています。たぶん12/01にはv0.14.0がリリースされているはず。。。）
- ちなみに [公式ブログ](https://www.hashicorp.com/blog/announcing-hashicorp-terraform-0-14-beta) によれば v0.14.0 の後は v1.0 に向けて準備って書いてあるので、いよいよ感でてきていますね

# その他の HashiCorp 製品では

- 10月の [HashiConf](https://hashiconf.com/) で新しいOSSとマネジメントサービスが発表されました
- terraform-jp って感じで slack 作っちゃってるのですが、ぶっちゃけ他の HashiCorp 製品のユーザーグループの slack はないようなので、個別に誰か作るまでは一緒くたにして話ができたらいいなぁと思ったり。

# 来年は

- ワールドカフェを再開させたい（コロナの状況次第？
- 実コード共有会やりたい
- 地方遠征したい（お声がけお待ちしていますｗ
- terraform associate 取得しないといけませんね。日本語で解説とか欲しいな

# 最後に

[terraform-jp](https://join.slack.com/t/terraform-jp/shared_invite/enQtNTM2NTYzNDY0OTkyLTcxOTYxNmZhZmU3ZGIzOWU3M2RiODkyZTRmZTc0MjEwNjQ1NjMyZDAwMTExODc3MzkxNjAwNmU5ZDY1MTg3YTA) を参加している人たちみんなでもっと盛り上げていけるようにしたいと思います。
LANケーブル作ってみた

#目次
１．使ったもの
２．作成手順
３．失敗したときの原因と対処
４．所感


#１．使ったもの
・ペンチ
・LANケーブル
自作用で１００ｍとか売っている
・皮むき器（カッター）
・コネクタ
・かしめ工具
・LANテスター

LANケーブルには、ストレートとクロスというものが存在するが、今の時代は機械側で自動で処理してくれるので、ほとんとストレート（今回）




#２．作成手順

###必要な長さ＋αでLANケーブルを切り出す
![messageImage_1604638445005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/c5e1acea-0cf4-d03c-2363-2f7a6e743670.jpeg)
失敗したり調整したりするので、長めに取っておく。
きっちり作りたいなら、10cmくらいは余裕をもって切り取る。

###皮むき器で外皮をむく
![92054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/19884871-0708-6ac3-9e1f-0452e52bc9c8.jpeg)
中の導線を傷つけないように。

###線を真っすぐに正しく並び替える
![92057.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/47d8b47b-e4e3-8103-31bb-4c597db87374.jpeg)
１つずつここでねじれている導線を直すと後が楽。
コネクタにはめてみて、長さを把握したうえで、導線を適度な長さに切り揃える。

###コネクタをはめる
![92064.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/86872aae-7273-e865-2ba6-96ff0e25b59e.jpeg)
上の画像の通りの順番で、奥まで差し込む。
順番はコネクタの爪の部分を上にしたとき、左から（茶、茶白、緑、青白、青、緑白、橙、橙白）



###かしめ工具で固定
![92062.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/92f4f11f-e9a4-97a6-06a7-f2fd3a39d764.jpeg)

###LANテスターや回線速度テストサイトでテストする
![92070.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/6a509ad8-6863-881e-13c1-5d162a422ea5.jpeg)
![92067.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/2be4d415-027e-2401-b98e-14b33ace27fd.jpeg)


###完成


#３．失敗したときの原因と対処


#４．所感
プログラミング言語の特徴【メモ】

# この記事を書いた動機
就活用のポートフォリオをひとまず作り終え、ここ数日間はエントリーする企業を探したり、面接対策の勉強に時間を使っているところです。
去年にRailsチュートリアルの自分用まとめを投稿し、先月CicleCIについてのメモを残した以外は、ほとんど投稿をしていない状態でしたが、やはりアウトプットは大事ということで、手書きのノートの内容をQiitaにも残しておこうと思った次第。
とりあえずWeb系の言語について書くことにします。

# Web系の言語
Web業界で使用される言語には様々な種類があり、それぞれに特徴や向き不向きがある。
その中には、現在エンジニア界隈で人気があって積極的に使用されているものもあれば、徐々にレガシー化して使用されなくなってきているものもある。
人気が高く、コミュニティも活発な言語を使用することはアプリケーションの性能や開発効率、使い勝手に貢献し、エンジニアとしての能力向上にも繋がるため、実際にその言語を使用しない場合であっても、その特徴について知っておくことは有用である。

なお、動的型付け、静的型付けについてはこちらの記事が参考になった。
[動的型付けと静的型付け](https://qiita.com/toryuneko/items/c023031b61886cae2a99)

#動的型付け言語

## Ruby
- 分野を問わず使用される言語で、特に**スタートアップ企業やメディア系企業に多い**。
なお、ソーシャルゲームやEC系では伝統的な理由からPHP、アドテク系ではJavaが使用されることが多い。
- **Ruby on RailsというWebフレームワークの存在**
- 多数の便利なライブラリ(gem)が使用可能
- 日本語情報が豊富で学習コストが低い(開発者が日本人)
- 以上の理由から人気が高く、コミュニティが活発で、将来的にも使い続けられる可能性が高い。  
とはいえ、ここ数年は下り坂傾向にあるもよう。

## PHP
- **Wordpressの存在が大きい**  
PHPを使って作られた、CMS(Content Management System, コンテンツ管理システム)用アプリケーション（ブログなどのWebサイトを作成するためのアプリ）
- **LaravelやCakePHPなどのWebフレームワークの存在**
- 日本語情報が豊富で学習コストが低い
- **ソーシャルゲーム開発のデファクトスタンダード**だった。
そのため、PHPを使用できるエンジニアが多く、開発者を集めやすいという利点がある（ソシャゲ自体の衰退を考えると、需要に対して供給が多いという欠点があるともいえる）。

## Python
- 日本よりも海外での人気が高い(**Google社内の標準言語**)
- **DjangoやFlaskなどのWebフレームワークの存在**
- **機械学習におけるデファクトスタンダード**  
サーバーサイド用の言語としてはRubyやPHPに対する優位点があるわけではないが、機械学習系のサービスを開発している企業が、機械学習用の言語とサーバーサイド用の言語を統一する目的で使用している
- バージョン2.7系と3系の混在問題がある

## JavaScript
- **サーバーサイドの実行環境であるNode.js**と合わせて、フロントエンド開発で必須
- AltJS（JavaScriptを静的型付け言語として扱う代替言語）の**Typescriptが人気**で、今後の主流に
- **SPA（Single Page Application）が流行**  
一つのページから遷移せずにデータ通信を行うアプリケーション。
**vue.jsやReactなどのSPAフレームワーク**の人気が高い
- **Electron**などのツールを使ったデスクトップアプリやスマホアプリの開発でも使用  

# 静的型付け言語

## Go（Golang）
- 近年かなり人気の言語で、**マイクロサービス**との組み合わせで使用されることが多い（メルカリなど）
- 主に**高速なAPIサーバーの開発**に使用される  
シンプルな機能のみを備えるAPIサーバーの開発においては、RailsやLaravelのような高機能のWebフレームワークが不要であり、リクエストを高速に捌ける言語としてGoの適性が高い
- DockerやTerraformでも使用  
**イメージを小さくできる**ことからDockerと好相性
- **GCPのサービスと相性が良い**  
PaaSであるGAEで使用されている
- 学習コストが低く、導入が容易

# JVM系言語
JVM系の言語はコンパイル型の言語であり、コンパイル後に生成されるバイトコードがJVM（Java Virtual Machine）と呼ばれる仮想マシン上で動作する。
元はJavaのみであったが、生成されるバイトコードが同様の形式であればJVM上で動作するため、Java以外にもScalaやKotlinといった言語が使用されており、これらはJVM系言語と呼ばれる。

## Java
- SIerでの使用率が高い  
Web系ではKotlinに主流の座を譲っている状況。Web系企業においてサービスの新規開発に使用されることはない。
- アドテク系企業での使用が多い
- レガシーな言語であるが、それゆえに**蓄積されたノウハウが多い**

## Kotlin
- **better Java**（Javaの上位互換となる言語）におけるファーストチョイス
- **Androidの公式開発言語**  
人気が高く、サーバーサイドでの使用も多い
- Scalaに比べると学習コストが低い
- 静的型付け言語としてはGoと競合関係にある  
JVM系言語として、Javaのノウハウや資産を活用できる点で差別化される
Mixinでanimationの関数化

#Animationの関数化Mixinについて

mixinを使ってanimationプロパティをまとめると、
使用するときに名前だけ設定すればmixin内のanimationプロパティがdefault値として適用されます。

###mixinの設定
　↓　のようにmixinにanimationプロパティをぶち込みます。
ちなみにanimation:{}はanimation-OOOを省略してます。
面倒な設定ですが、一つひとつ設定するよりかはマシになります。

```
@mixin.animationNoNamae(
$name, 
$duration: 1s, 
$timing-function: ease,
$iteratin-count: infinite,
$direction: normal
){
animation: {
name: $name;
duration: $duration;
timing-function: $timing-function;
iteration-count: $iteration-count;
direction: $direction;
}
```
これでmixinの設定が完了しました。
mixinの引数に入れた値がanimation使用時のdefault値として設定されています。
この設定を引き出す値はここでは　animationNoNamae　です。

###mixinの使い方
animationを適用したい要素内で ↓ のように
@include animationNoNamae を記載する。

```
nanikanoYouso {
@include animationNoNamae(
$name: OOO
);
}

```

$name: OOOはテキトーに設定します。
テキトーに名付けた値で、animationのための@keyframesを設定します。

```
@keyframes OOO{
0% {
~~
}
100% {
~~
}
```

これでnanikanoYousoにanimationが適用されます。

　↓　mixinで設定した値はdefault値になるので、上書きできます。

```
@include animationNoNamae (
$name: ~~~;
$duration: 20s;
);
```



####かなり雑な説明になりましたがこれで終わります。
MVCモデルとは


MVCモデルについてきちんと理解しようと思ったので記事にしてみました。

初心者なため認識違いがあった場合などは是非ご指摘下さい。

#MVCとは
<dl>
  <dt>・　Model</dt>
  <dd>DB関連の処理を担当</dd><br><br>

  <dt>・　View</dt>
  <dd>画面表示(HTML)を担当</dd><br><br>

  <dt>・　Controller</dt>
  <dd>リクエスト受付&レスポンス返却</dd>
</dl>

このようにプログラムの担当をMVCの3つに分割する考え方のことをMVCモデルと呼びます。


#処理の流れ
![dd3e967f498ce117d1cdd29953e92cdc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680978/b7e77096-8669-7ec5-ef68-3d5302bf32e5.png)


まずはユーザーが何かしらのURLをリクエストします。するとフレームワークではルーターというところがURLのリクエストを受け付けます。
ルーターというのは受け付けたURLをどのコントローラーのアクションに割り当てをする割り当て処理を行う部分です。
次にルーターによってアクションが呼び出されます。コントローラーではこのリクエストを受け取ってitem/1のアイテム情報をデータベースに問い合わせます。
データベースに問い合わせをするときはコントローラーはモデルに問い合わせをします。


![e8957306a62031f5d4512f4a0129667a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680978/01c848ee-0670-8782-a902-d1cffdb7a47a.png)

モデルはデータベースとやりとりを行ってその結果をコントローラーに返却します。このようにモデルというのはデータベースとやりとりを担当する部分になります。
次にモデルからデータを受け取ったコントローラーはデータをビューにわたします。
そしてビューではこの情報を使って動的に返却するためのHtmlを生成します。生成されたコントローラーはレスポンスとしてUserに返します。

このようにMVCモデルではController・Model・Viewの3つの役割があります。
さらにコントローラーを呼び出すためのrouterと言われるものも存在します。
【GCD】Swiftにおける並列プログラミングの基本

#この記事は何か？
GCDを利用した並列プログラミングについて調べました。

###環境
macOS 10.15.7
Xcode 12.1
Swift 5.3

#用語
###スレッド
すべての iOS アプリケーションにはメインスレッドがあります。メインスレッドはUIを表示したり、発生するイベントに備えて待機します。
メインスレッドで複雑な計算をすると、処理が遅くなってアプリがフリーズするかもしれません。そのような場合に役立つのがマルチスレッドです。負荷が高いタスクをバックグラウンドスレッドに移し、タスクが完了するとメインスレッドに戻ってくる仕組みです。

###キュー
並列または直列になって、スレッドで実行されるのを待機している一連のコードブロックです。
Swiftでは**キューを管理するだけ**でよく、スレッドを意識する必要は全くありません。キューのコードを実行するために必要な**スレッドの提供および割り当ては、システムが行います。**

#Grand Central Dispatch: GCD
キューの管理を担当するAPIです。

###GCDの役割
- キューを作成する
- コードブロックをキューに預ける

###メインキュー
全ての中で最も重要なキュー。**UIに影響を与えるコードブロックはすべて、メインキューで実行**されなければならない。

###バックグラウンドキュー
長く存続するUIタスク以外のタスクをキューに入れるために使用します。
多くの場合、メインのUIキューと同時に並行して実行されます。

#バックグラウンドキューの優先度レベル
###ユーザー・インタラクティブ
`.userInteractive`
ユーザー・インタラクティブ・タスクは、システム上で最も優先度の高いタスクです。このレベルは、ユーザーと対話したり、アプリのユーザーインターフェイスをアクティブに更新したりするタスクやキューに使用します。たとえば、アニメーションだったり、イベントをインタラクティブに追跡したりするクラスに使用します。

###ユーザー・イニシアティブ
`.userInitiated`
ユーザー・イニシアティブ・タスクは、システム上での優先順位では、ユーザー・インタラクティブ・タスクに次ぐものです。ユーザーが何かをしている間にすぐに結果が得られるタスクや、ユーザーがアプリを使用できなくなるようなタスクには、このクラスを割り当てます。たとえば、このQuality-of-Serviceレベルを使用して、ユーザーに表示する電子メールのコンテンツをロードすることができます。

###ユーティリティ
`.utility`
ユーティリティタスクの優先度は、ユーザーが起動したタスクやユーザーが対話するレベルよりは低いですが、バックグラウンドタスクよりは高い優先度です。このサービス品質クラスは、ユーザーがアプリを使い続けることを妨げないタスクに割り当てます。たとえば、ユーザーが積極的に進行状況をフォローしない長期的なタスクにこのクラスを割り当てることができます。

###バックグラウンド
`.background`
バックグラウンド タスクは、すべてのタスクの中で最も優先度が低いものです。このレベルを、アプリがバックグラウンドで実行されている間に作業を実行するために使用するタスクまたはディスパッチ キューに割り当てます。例えば、メンテナンス タスクまたはクリーンアップです。

###標準
`.default`
優先度は、ユーザー始動タスクとユーティリティの間になるレベル。

#コードをキューに追加する
###同期的に追加する
タスク項目が`sync`メソッドによって同期的に実行される場合、プログラムは実行が終了するまで待機してからメソッドが呼び出されます。

````swift:
DispatchQueue.main.sync {
	// Code to be executed
}
````

このコードは「メインスレッドに同期的なキューをディスパッチする」と理解できます。

###非同期的に追加する
タスク項目が`async`メソッドによって非同期的に実行されると、メソッドがすぐに呼び出されます。

````swift:
DispatchQueue.global().async {
	// Code to be executed
}
````

このコードは「バックグラウンドスレッドに非同期的なキューをディスパッチする」と理解できます。
「WEB」とは何なのか②（初学者向け）

WEB業界未経験の初学者です。
記事に間違いが見受けられましたらご指摘頂けると幸いです。
（随時更新）

続きになります。
前回の記事はこちら　→　<a href="https://qiita.com/contek/items/989009581bd4080c48b6">記事「WEB」とは何か①</a>


<h1>HTTPの仕組み</h1>
</br>

<h4>HTTPリクエスト</h4>
前回の記事ではWEBがどのような仕組みで動くのかを非常にざっくりと説明をしました。WEBブラウザが正常に機能するにはサーバー間での共通したルールを決めておく必要がありました。WEBブラウザ（クライアント）からリクエストを行い、リクエストされたコンテンツ（クリックや検索された内容）をWEBサーバーが見つけることでレスポンスとして返すことができます。リクエストとレスポンスにおいて共通したルールを設けることでスムーズなやり取りが実現できました。そのやり取りというのをもう少し具体的に説明していきます
</br>
</br>
</br>
WEBブラウザがWEBサーバーにコンテンツを要求した際、HTTPメッセージと呼ばれるデータ形式が利用されます。HTTPメッセージはHTTPリクエストとHTTTPレスポンスの2種類に分けられます。そしてHTTPリクエストは「リクエスト行」「メッセージヘッダー」「メッセージボディ」の三つに分けられます。
</br>
</br>
</br>
リクエスト行ではWEBサーバーに対して「どういった処理内容なのか」が記述されています。送信したい内容なのか、受信したい内容なのか等をここで判断（依頼）するわけです。メッセージヘッダーではWEBブラウザの種類や対応するデータ形式（圧縮方法）などの情報が記述されています。メッセージボディではWEBページに設けられているテキストデータなどをWEBサーバーに送る目的で使用されています。
</br>
</br>
</br>
___
<h4>HTTPレスポンス</h4>
HTTPリクエストとして受け取ったWEBサーバーはHTTPリクエストを処理した後、HTTPレスポンスとして結果を返します。HTTPレスポンスは「ステータス行」「メッセージヘッダー」「メッセージボディ」の三つに分けられます。
</br>
</br>
</br>
ステータス行ではHTTPリクエストに対してWEBサーバー内で処理の結果を伝えます。メッセージヘッダーではWEBブラウザの種類（ソフトウェア情報）や、返信するデータの種類、データの圧縮方法などの情報を伝えます。メッセージボディはWEBブラウザからリクエストされたHTMLなどのデータが格納されています
</br>
</br>
</br>
___
<h4>GETメソッドとPOSTメソッド</h4>
HTTPリクエストによってWEBサーバーが情報の要求を受け付けてくれますが、具体的な情報を要求できるのは「HTTPメソッド」と呼ばれる仕組みのおかげです。具体的にはHTTPメソッドの中にさらに様々なメソッドが用意されており、そのメソッドの要求に応じることでレスポンスを送ることができます。
</br>
</br>
</br>
例えばHTMLファイルや画像を取得したい場合は「GETメソッド」が使われ、データを送信する場合はPOSTメソッドが使われます。入力フォームにパスワードやコメントを書いて送信する場合はPOSTメソッドが使われています
</br>
</br>
</br>
仮にパスワード等のユーザー情報をGETメソッド形式でWEBサーバーに通してしまうと、WEBブラウザ履歴に個人情報が残ってしまうのでセキュリティ上非常に悪いことになります。そこで履歴に残らないPOSTメソッドを使用することで比較的安全にやり取りができるのです。その他にサーバーの保管するデータを削除したり書き換えたりできる役割のメソッドは「PUTメソッド」や「DELETEメソッド」です。
</br>
</br>
___
<h4>HTTPS</h4>
近年、インターネットの私生活への影響は益々大きなものになっています。スマートフォンの普及により、ショッピングアプリやゲーム業界の参入、チケットの予約システムの導入によって金銭のやり取りも活発になっています。それにより重要になるのはセキュリティの強化です。外部からポスワード情報が盗まれないようにするために導入されている仕組みが「HTTPS」です。HTTPでは三つの仕組みによって外部からの情報盗難を防ぐことができます
</br>
</br>
</br>
一つ目は「暗号化通信」です。これは盗聴を防ぐ役割があり、実際に情報が行き交う過程ではいくつものサーバーを経由することから外部から簡単に情報を奪うことが出来てしまいます。そういったことを防ぐためには、送受信されている情報を暗号化することが重要です。仮に情報が奪われてしまっても解読することを防ぐことができるのでセキュリティを万全なものにできます。
</br>
</br>
</br>
二つ目は「メッセージダイジェスト」です。これはネットバンキングで振込先情報が書き換えられることがないように防止する役割があります。あるデータから一意の短いデータを取り出す計算のことです。データの送受信時にハッシュ値を比較して改ざんを検知できるみたいです。メッセージダイジェストに関しては理解することが難しいと感じたので興味がある方はデジタル署名の仕組みからいろいろと調べてもらうと理解が進むかもしれません。
</br>
</br>
</br>
三つ目は「SSLサーバー証明書」です。これはWEBサーバーに「SSL証明書」と呼ばれる電子証明書を置き、接続時に検証することでWEBサイトを運営する会社の身元を確認できます。これを行うことで、なりすまし防止を防ぐことに役立ちます。もし信頼できない発行元のSSL証明書が利用されていればWEBブラウザ上に警告が表示されます。
___
執筆中。。
</br>
</br>

下記が参考文献です。

参考文献：この一冊で全部がわかるWeb技術の基本（小林恭平　坂本陽　著）
　　　　：キタミ式イラストIT塾 基本情報技術者（きたみりゅうじ　著）
</br>
</br>

個人的にはWeb技術の基本を先に読んでからキタミ式を読むと初学者の理解が早まる気がしました。本屋で読み比べて自身が取っ付きやすそうな参考書を選ぶのがよいと思います。

ネットでも非常に分かりやすく用語解説されている方が多いので有難いですね。
vue-clipboard2をVuetifyのv-dialogの中で動かす

システムから発行したIDやパスワードなどを、ユーザーが画面上で簡単にクリップボードにコピーできるようにしたいなと思って実現方法を調べていたところvue-clipboard2というモジュールが見つかったので使ってみることにしました。普通に使えばドキュメント通りに実装すれば動くと思うのですが、Vuetifyの`v-dialog`の中で使おうとするとかなり手こずったので、動かす方法をまとめます。

# 環境

- Vue.js 2.6.11
- Vuetify 2.2.11
- TypeScript 3.9.3
- vue/cli
- クラスベース記法

# vue-clipboard2とは

[Inndy/vue-clipboard2](https://github.com/Inndy/vue-clipboard2)

Vueでクリップボードへテキストをコピーできるモジュールです。ボタンをクリックするとテキストをクリップボードにコピーする、といったことが（通常は）簡単にできます。

セットアップは以下の通り。

```console
$ npm install vue-clipboard2
```

```ts:main.ts
import VueClipboard from 'vue-clipboard2';
Vue.use(VueClipboard);
```

# 問題

ドキュメントに[bootstrapのmodal内だと細工しないと動かないよ](https://github.com/Inndy/vue-clipboard2#it-doesnt-work-with-bootstrap-modals)と書いてありますが、Vuetifyの`v-dialog`でも当然のように動きませんでした。対処法は探すといくつか見つかりはしますが、TypeScriptを使っている事例がなかなかなく、かなり試行錯誤が必要でした。

# 解決方法

2つある使い方のうち`v-clipboard:copy`を使う方法だとどうやっても駄目でした。

`$copyText`を使う場合、以下のように実装することで動かすことができました。

```vue
<template>
  <v-dialog>
    <v-card>
      <v-card-text>
        <v-text-field :value="textToCopy" readonly/>
        <v-btn icon ref="copyBtn" @click="onCopy"><v-icon>mdi-content-copy</v-icon></v-btn>
      </v-card-text>
    </v-card>
  </v-dialog>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

@Component
export default class SampleDialog extends Vue {
  textToCopy = 'some text to copy';

  private onCopy(): void {
    const isVue = (x: unknown): x is Vue => x instanceof Vue;
    const { copyBtn } = this.$refs;
    if (!isVue(copyBtn)) {
      return;
    }
    this.$copyText(this.textToCopy, copyBtn.$el);
  }
}
</script>
```

ハマりどころは`$copyText`の第2引数でした。ドキュメントには`container`を渡せと雑に書いてはあるものの、実際何型の何を渡せばいいのやら、それらしい可能性を片っ端から試していって上記のコードに辿り着きました。

ボタンにコピー機能を仕込む場合はそのボタンをコンテナとして指定すればいいようです。型はVeturのコード補完では`object | HTMLElement`と出てきますが`Element`型のオブジェクトを渡すとうまくいきました。

ボタンを`Element`として取得する方法も（Vue慣れてる人だと簡単かもしれませんが）結構悩みました。

`v-btn`タグに`ref`属性を付けると`this.$refs`経由で参照できるようになりますが、その際の型は`Vue | Element | Vue[] | Element[]`です。上記のコードの場合`copyBtn`で実際に参照できるオブジェクトの型は`Vue`ですが（`v-btn`もコンポーネントである以上`Vue`を継承している形になっている）、TypeScript的には使う前にタイプガードで型を`Vue`に絞ってあげる必要がありました。`(x: unknown): x is Vue => x instanceof Vue`のところですね。このチェックを通すことで型が保証され、以降は`Vue`型として扱えるようになります。あとは`Vue`の`$el`プロパティが`Element`なので、それを`$copyText`の第2引数に渡せばTHE ENDにゃん。

ちなみに`VueClipboard.config.autoSetContainer = true;`という方法も紹介されていますが、こちらはうまくいきませんでした。

もうひとつちなみに、ドキュメントには非同期関数内で使わないでねと書いてありますが、上記コードの`onCopy`に`async`付けても動きました。`$copyText`は`Promise`を返すので、処理結果までちゃんと見たい場合は`const result = await this.$copyText(...);`のように書くことができます。もちろん`this.$copyText(...).then(...).catch(...);`で書いてもOKです。
README.md にスニペットを入れるスクリプトを作った

https://github.com/zakuro9715/md-embed-snippet

パブリックドメインにしてるので好きなように使ってください

## モチベーション

examples/ に置いたファイルを README にも書きたいが、GitHub Markdown には include のような機能がない（たぶん）。

## 使い方

単一ファイルなので、embed-snippet.py をコピーしてきて実行するだけ。プレースホルダーをスニペットで置換してくれる

`./embed-snippet.py README.template.md __examples__ examples.txt > README.md`
Efficient-GAN-Based Anomaly Detectionを動かしてみた（備忘録）

#目的
H.Zenati氏らのEfficient-GAN-Based Anomaly Detectionを実際に
動かしてみた
原著論文: https://arxiv.org/abs/1802.06222
Github: https://github.com/houssamzenati/Efficient-GAN-Anomaly-Detection

#作業内容
requirements.txt があるので、基本的にはcloneしてconda createしてpip installでよい

#Pythonライブラリのバージョン修正
requirements.txtにはライブラリのバージョン情報がないのでそのままインストールしても動かない。
そこで動いたライブラリ情報をメモしておく。

- TensorFlow は1.x系
- scikit-learnのバージョン情報で怒られる
- 書かれていないがmatplotlibやpillowも必要(当然といえば当然)

#コマンドとyaml

```bash:
conda env create -n "環境名" -f=egbad.yml
```

```yaml:egbad.yml
name: EffGAN
channels:
  - defaults
dependencies:
  - blas=1.0=mkl
  - ca-certificates=2020.10.14=0
  - certifi=2020.6.20=pyhd3eb1b0_3
  - freetype=2.10.4=hd328e21_0
  - icu=58.2=ha925a31_3
  - intel-openmp=2020.2=254
  - jpeg=9b=hb83a4c4_2
  - libpng=1.6.37=h2a8f88b_0
  - libtiff=4.1.0=h56a325e_1
  - lz4-c=1.9.2=hf4a77e7_3
  - matplotlib=3.3.2=0
  - matplotlib-base=3.3.2=py36hba9282a_0
  - mkl=2020.2=256
  - mkl-service=2.3.0=py36hb782905_0
  - mkl_fft=1.2.0=py36h45dec08_0
  - mkl_random=1.1.1=py36h47e9c7a_0
  - numpy-base=1.19.2=py36ha3acd2a_0
  - olefile=0.46=py36_0
  - openssl=1.1.1h=he774522_0
  - pillow=8.0.1=py36h4fa10fc_0
  - pip=20.2.4=py36_0
  - pyparsing=2.4.7=py_0
  - pyqt=5.9.2=py36h6538335_2
  - python=3.6.12=h5500b2f_2
  - python-dateutil=2.8.1=py_0
  - qt=5.9.7=vc14h73c81de_0
  - setuptools=50.3.0=py36h9490d1a_1
  - sip=4.19.8=py36h6538335_0
  - six=1.15.0=py_0
  - sqlite=3.33.0=h2a8f88b_0
  - tk=8.6.10=he774522_0
  - tornado=6.0.4=py36he774522_1
  - vc=14.1=h0510ff6_4
  - vs2015_runtime=14.16.27012=hf0eaf9b_3
  - wheel=0.35.1=py_0
  - wincertstore=0.2=py36h7fe50ca_0
  - xz=5.2.5=h62dcd97_0
  - zlib=1.2.11=h62dcd97_4
  - zstd=1.4.5=h04227a9_0
  - pip:
    - absl-py==0.11.0
    - astor==0.8.1
    - astunparse==1.6.3
    - cachetools==4.1.1
    - chardet==3.0.4
    - cycler==0.10.0
    - cython==0.29.14
    - gast==0.2.2
    - gensim==3.8.3
    - google-auth==1.23.0
    - google-auth-oauthlib==0.4.2
    - google-pasta==0.2.0
    - grpcio==1.33.2
    - h5py==2.10.0
    - idna==2.10
    - importlib-metadata==2.0.0
    - joblib==0.17.0
    - keras==2.4.3
    - keras-applications==1.0.8
    - keras-preprocessing==1.1.2
    - kiwisolver==1.2.0
    - markdown==3.3.3
    - numpy==1.19.4
    - oauthlib==3.1.0
    - opt-einsum==3.3.0
    - protobuf==3.13.0
    - pyasn1==0.4.8
    - pyasn1-modules==0.2.8
    - pyyaml==5.3.1
    - regex==2020.10.28
    - requests==2.24.0
    - requests-oauthlib==1.3.0
    - rsa==4.6
    - scikit-learn==0.23.2
    - scipy==1.5.4
    - smart-open==3.0.0
    - tensorboard==1.15.0
    - tensorboard-plugin-wit==1.7.0
    - tensorflow-estimator==1.15.1
    - tensorflow-gpu==1.15.0
    - tensorflow-gpu-estimator==2.3.0
    - termcolor==1.1.0
    - threadpoolctl==2.1.0
    - urllib3==1.25.11
    - werkzeug==1.0.1
    - wrapt==1.12.1
    - zipp==3.4.0
```
Javaの基本的な命名規則

|            | 規則                         | 例                      | 
| ---------- | ---------------------------- | ----------------------- | 
| パッケージ | すべて小文字                       | jp.co.hello.common.auth | 
| クラス     | Pascal記法                   | User                    | 
| 変数       | camelCase記法                | userName                | 
| 定数       | すべて大文字の<br>アンダースコア記法 | USER_NAME               |
Javaとは

# Javaとは
* 1995年、旧サン・マイクロシクテムズ社が発表したプログラミング言語
* 2010年、Oracle社が買収
* サーバーサイド開発、Androidアプリ、家電への組み込みなど、幅広い分野で使われる

# Javaの特徴
* オブジェクト志向
* Java仮想マシンで実行される
 * ソースコード→（コンパイル）→Javaバイトコード
 * プラットフォームに依存しない
 * Write Once, Run anywhere(一度書いたらどこでも動作する)
* ガーベッジコレクション（GC）
 * 利用されなくなったメモリを自動的に解放する機能

# Javaのエディション
* Java SE
 * Javaアプリを動作させるための基本の実行/開発環境を提供する
* Java EE
 * Java SE + サーバーアプリ開発のためのライブラリ郡（フレームワーク）
* Java ME
 * 組み込み系を想定したエディション