OmniAICreator/Qiita-1.07M huggingface dataset:
AWS　EC2について



##EC2(Elastic Compute Cloud)
仮想サーバーとは、サーバー上に論理的なサーバーを作成した物で、サーバーに必要なこれら各種コンポーネントが論理的に作成されています。

OS 　　　　　　→ AMI
CPU、Memory → インスタンスタイプ
SSD 　　　　　 → EBS
NIC 　　　　　  → ENI


##AMIとは
・AMI(Amazon Machine Image)
・EC2インスタンスが起動する時に必要となる設定(テンプレート)ファイル
・ひとつのAMIでEC2を何台も複製できる
・OSやアプリケーションの情報が設定されている
・OSは選択可能AmazonLinuxが一般的
　-各種Linuxディストリビューション(Redhat,Ubuntu…)
　-windows Server



##インスタンスタイプとは
・EC2のCPU、メモリなどのスペックの構成パターン
・スペックの構成により、「インスタンスファミリー」と分類分け
・更にmicro,small.msdium,large,xlargeのように性能の選択肢が用意されている
￼
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712812/d094474b-2e12-c816-0096-eb4bcdc2ab90.png)
￼元SEママの情シスなりきりAWS奮闘記 より


ｔ系　　テスト向き、CPUバースト
ｍ系　　本番向き、バランスが良い
ｃ系　　CPU重視、多処理や科学技術
ｇ系　　GPU重視、3Dグラフィックや動画処理
ｒ系　　メモリ重視、データベース系
ｄ系　　ストレージ重視、データウェアハウス系
ｉ系　　ストレージ重視、NoSQL系


世代については数字が大きいものほど最新で料金が最適化されていたりするので、特に理由がなければ最新の世代を使う。




##EBSとは
・EBS(Elastic Block Store)
・EC2のインスタンスが使用するストレージのサービス

####ソリッドステートドライブ(SSD)
 -汎用SSD(gp2)
   デフォルト、基本的にこれ使用、容量課金

 -プロビジョンドIOPS SSD(io1)
   高性能DBへ接続する時など、容量・IOPS課金


####ハードディスクドライブ(HDD)
 -スループット最適化HDD(st1)
   データウェアハウス、ビックデータ、ログ処理に使用

 -Cold HDD(sc1)
   安い、アーカイブ保管


##EBSのスナップショット
・スナップショットとは
 -EBSをバックアップとして所得したファイル
 -保管場所はS3
 -スナップショット自体をEC2にアタッチ/デタッチできない
 -増分バックアップ方式
 -AZサービス


##キーペアとは
・EC2インスタンスへログインする為に使用する秘密鍵、公開鍵のペア

 -公開鍵_公開鍵で暗号化したデータは秘密鍵でしか開けることが出来ません。

秘密鍵は拡張子が.pem形式のファイルとなっています。ダウンロードして厳重に管理し、外部からアクセス出来ない場所に保管しましょう。


LinuxタイプのEC2にログインする場合
ssh -i 秘密鍵 ec2-user@IPアドレス

秘密鍵の所に設定した物を入力、設定されているIPアドレスも入力


##インスタンスメタデータ
・EC2インスタンスに埋め込まれている自分の情報

EC2が起動中にcurlコマンドで自身の情報が所得出来ます。

例えば、使用しているAMIのIDやローカルのIPアドレス、所属しているサブネットIDなどが所得出来ます。



##ユーザーデータ
・インスタンス起動時に一回だけ実行するスクリプト

再起動時に実行されるものではない

rootユーザーで実行されることに注意
作成されたファイルもroot権限

インタラクティブではない
× yum update
⚪︎ yum update -y


###Cloud -init
・クラウド系インスタンスの初期構築を手助けするオープンソースのアプリケーション

Amazon Linuxにはデフォルトで　/etc/cloud/　配下に設定ファイルが存在し、インスタンス作成時にどういった動きをするか指定できる。


##プレスメントグループとは
・複数のEC2を論理的にグルーピングすること

AZ、リージョンは跨げない

####・クラスター 
 -AZ内でグループ化してHPC(ハイパフォーマンスコンピューティング)などの高度な演算処理に向いています。
複数のコンピュータを結合して一つの高度な処理や計算を行う基本的な使い方。
この塊をクラスターと呼び、これに所属しているコンピュータ一つ一つをノードと呼ぶ。

このノード同士のネットワークは密接に結合している必要がある為拡張ネットワークサービスの使用を推移。
Amazon LinuxではデフォルトでENAモジュールが入っているので、AWS CLIコマンドで有効化されているか確認できます。

同じAMIで使用する事。


####・パーティション 
配置するラックを分けることで、ハード障害を防止する。


####・スプレット 
個々のEC2を独立したラックに配置。
1つのAZにつきEC2を7つまで
1つのリージョンにつきAZを3つまで



##Dedicatedホスト/インスタンス
・AWSの物理サーバーのリソースを占有できること

通常AWSの物理サーバーは他のアカウントと共有しています。これはコンプライアンス違反になる可能性がある。
（医療データを電子化する際のルール）
【Nuxt.js】Nuxt文法編：component②動的コンポーネント

🎈 この記事はWP専用です
https://wp.me/pc9NHC-FE

# 前置き
今回はcomponent①で解説した
自作コンポーネントを動的に変えられる
componentタグについての解説です✨🙋‍♀️

⬇️公式ガイドはこちら
https://jp.vuejs.org/v2/guide/components.html#動的なコンポーネント
https://jp.vuejs.org/v2/guide/components-dynamic-async.html


ボタンで表示させる
コンポーネントを切り替えています🌟👀
条件つきのキャッシュ保存もやりますよ🙋‍♀️

非同期コンポーネントは
NuxtならasyncDataが使えるので
そちらをご覧ください👀

[【Nuxt.js】Nuxt文法編：asyncData](https://nuxt.alizlab.com/%e3%80%90nuxt-js%e3%80%91nuxt%e6%96%87%e6%b3%95%e7%b7%a8%ef%bc%9aasyncdata/)

ただasyncDataは
pageコンポーネントでしか使えないので
通常のコンポーネントで使うなら
こちらを参考にすると良いかと思います🍎🙋‍♀️
https://qiita.com/hiroyukiwk/items/b83f52e6d899b06506cb

# 簡単な使い方
![clear.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/96a6f3df-0283-4b78-a5e1-67f2568ee830.gif)


component v-bind:is
動的に複数のコンポーネントを
切り替えることができます🌟

切り替える度に
新しいインスタンスが作成され
キャッシュはクリアされてしまいます🌪
クリアされないようにするには
componentタグを
keep-aliveタグで囲むのですが、
まずは簡単な使い方を理解しましょう💡

切り替えできることが分かれば良いので
コンポーネント名は安直に命名してます。

❓キャッシュ
保存する仕組みのことです💾
キャッシュのクリア
＝保存ができない状態です🌪
Input1に入力した文字が
別のコンポーネントを表示させると
なくなってしまっていますね🍃

## コード

```index.vue
<template>
 <div class="page">
   <button @click="changeComponent = 'Input1'">Input1</button>
   <button @click="changeComponent = 'Input2'">Input2</button>
   <button @click="changeComponent = 'Input3'">Input3</button>
   <component
     v-bind:is="changeComponent"
     class="box"
    >
     ここにコンポーネントが表示されます
    </component>
 </div>
</template>

<script>
import Input1 from '~/components/Input1.vue'
import Input2 from '~/components/Input2.vue'
import Input3 from '~/components/Input3.vue'

export default {
 data () {
   return {
     changeComponent: 'Input1',
   }
 },
 components: {
   Input1,
   Input2,
   Input3,
 },
}
</script>

<style lang="scss" scoped>
 .page {
   .box  {
     border: 1px solid orange;
   }
 }
</style>
```

【Input1.vue】
数字だけ変えたinputのコンポーネントを
3つ作成しています。

```Input.vue
<template>
 <div class="input1">
   <p>Input1</p>
   <input type="text">
 </div>
</template>
```

# 値の受け渡し
![スクリーンショット 2020-09-08 14.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/78c97b25-2dcf-4708-3ff0-4ce61abbed40.png)


propsなども使用できます⭕🙆‍♀️
inputでやるとややこしいので
ただのテキストをpropsで渡してみます。
画像Input1の
「親からテキストを渡す」の部分です。

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-FE
【Nuxt.js】Nuxt文法編：v-model②

🎈 この記事はWP専用です
https://wp.me/pc9NHC-kO

# 前置き
前回はinputやtextareaなどで
基本的な使い方を解説しました！
今回は親子間での使い方がメインです🌟

【Nuxt.js】Nuxt文法編：v-model①

# 基本的な使い方
親子間でv-modelをやるには工夫が必要です！

v-modelはこれと同じです💡
v-bind:value, v-on:input

値は親から受け取るprops
イベントは子自体のイベントなので
親に通知するための$emitを使用します💡

![picture_pc_c46c90ce95ad7e5d800c2a7ea9aa5be8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/8caaf76b-30b7-f176-54f3-c2d5a3e63ad8.gif)


親で入力した値を
子のinputにも反映させています👀

```directory
components/
--| atom/
----| inputs/
-----| InputDefault.vue

pages/
--| index.vue
```

## 解説

【InputDefault.vue】

・v-bind:value="value"
　value属性をvalueプロパティにバインド
　valueはpropsで値を親からもらう

・@input="$emit('input', $event.target.value)"
　└@input：inputした時(イベントハンドラ )
　└$emit('input')：子のイベント名inputを親に伝える
　　https://note.com/aliz/n/nd6e771724cd7
　└\$event.target.value：
　　イベントが起きる(入力イベント)要素(input)の値を取得
　　入力した値を取得できるってことです🌟
　　$emitの第二引数で使えます！

## コード

```InputDefault.vue
<template>
<input
  :value="value"
  @input="$emit('input', $event.target.value)"
>
</template>

<script lang="ts">
export default {
props: {
  value: {
    type: String,
    // ここは影響しない
    default: 'ハロー'
  }
},
}
</script>
```

または
v-modelのような属性自体を親に渡す
v-bind="$attrs"でもOK⭕️

```InputDefault.vue
<template>
<input
  v-bind="$attrs"
  @input="$emit('input', $event.target.value)"
>
</template>

<script lang="ts">
export default {
props: {
  value: {
    type: String,
    // ここは影響しない
    default: 'ハロー'
  }
},
}
</script>
```

```input.vue
<template>
<div class="page">
  <form @submit.prevent>
    <InputDefault
      v-model="message"
    />
    <button
      @click="submit(message)"
    >
      送信
    </button>
  </form>
</div>
</template>

<script>
import InputDefault from '~/components/atom/inputs/InputDefault.vue'

export default {
components: {
  InputDefault,
},
data () {
  return {
    message: 'メッセージ',
  }
},
methods: {
  submit (message) {
    console.log(message)
  },
},
}
</script>

```

# コンポーネントにネイティブイベントをバインディング
子にあるinputのイベントを
親で使いたい時にどうするのか、
という話です！

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-kO
localhostにスマホから繋げてみた!!(Windows編)

どうも、三町哲平です。

前回は、[localhostにスマホから繋げてみた!!(Mac編)](https://qiita.com/TeppeiMimachi/items/8f19e111cd1766a7d084)で、MacBookで起動したlocalhostにAndroidスマホとiPad、WindowsPCの３点からアクセスする方法を紹介しましたが、Macをやったからには、双璧をなすWindowsに触れない訳にはいきません。

では、Windows編をどうぞ！！

## 1. Wi-Fi環境を同じにする
まず最初にWindowsPC、Androidスマホ、iPad、MacBookを同じWi-Fi環境に接続してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/daf582aa-6145-1910-3c16-a418cf732255.png" width=40%>
今回は、__Air-WiFi_0OXPYN__に接続しています。

ここはMac編と違いはありませんね。

## 2. WindowsPCのIPアドレスを確認する。
#### ① デスクトップから「cmd」と検索する。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/f0089625-ba51-bb15-8a94-d0bd3d39caef.png)

#### ② コマンドプロンプトを開き、「ipconfig」と入力して、Enterを押します。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/e9445a5c-a00d-841a-6a0a-4cd8d6f02301.png)

#### ③ なんか沢山出てきます。
![3PNG.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/2a787002-5a60-4c70-922d-c7536b0f1e43.png)



色々書いていますが、__デフォルトゲートウェイ__が開いている箇所を探します。

今回の場合は、

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

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: ----::---:----:----:----%--
   IPv4 アドレス . . . . . . . . . . . .: 192.168.43.187
   サブネット マスク . . . . . . . . . .: ---.---.---.-
   デフォルト ゲートウェイ . . . . . . .: 192.168.43.1
```

今回は、この __aaaaaaaaaaaaa1__ が該当します。

__IPv4 アドレス 192.168.43.187__ をコピーやメモして下さい。



## 3. localhostを起動する
ターミナルで、

```:
$ docker-compose up
```
を使用して、docker-composeで、localhostを起動します。
ポート番号は、__8000番__です。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/0f558b5f-4080-e29e-a832-944c58d56e7b.png)

## 4. WindowsPCでlocalhost:8000にアクセス
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/4c26248e-b0ed-f6e3-daf1-c1782ab3ab93.png)


無事、ページが表示されました。

## 5. その他の機器で試す
※WindowsPCからは今回の場合、__localhost:3000__とブラウザのURLに入力することで、表示されますが、その他機器では、__192.168.43.187:8000__と入力します。

### Androidスマホ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/6a751d2c-5b7a-7ea7-d14d-ea7919bd2d31.png" width=40%>

### iPad
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/b55d02c7-0fcc-d305-7753-f7f5fa4f4124.png" width=60%>

### MacBook
![スクリーンショット 2020-09-11 0.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/06ae7bed-7a25-958c-ba73-41d913672add.png)

このように、同じWi-Fiに接続することにより、WindowsPCで起動したloclhostにAndroidスマホとiPad、MacBookからもアクセスすることが出来ました。

参考記事:[パソコンのIPアドレスを確認する方法（Standard TCP/IP）](https://faq.ricoh.jp/app/answers/detail/a_id/55/~/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%AEip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%88standard-tcp%2Fip%EF%BC%89/session/L2F2LzEvdGltZS8xNTk5NzQ0MzA1L2dlbi8xNTk5NzQ0MzA1L3NpZC9mVWQ5TWhQZ3BCWmpvVEJoeFJvWHhyU3JYRW9IdThabnJzMEFCQkNlcjVjaVRVNFhfYkNWSllwWE5tOGpIRWpLeCU3RV94RURSZFhOQk9oajFvcXg2RzZZdGtyJTdFMzAxTDNSbDEwS1YxVTRVUiU3RV9lSXA2NSU3RXlfaWpGQSUyMSUyMQ==)
覚えておきたいCargoコマンドまとめ

# TL;DR
- cargoコマンドの個人的備忘録です。

# 実行環境
**ハードウェア**

|項目|情報|
|:---------|:------------------|
|OS|macOS Catalina(10.15.4)|
|ハードウェア|MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)|
|プロセッサ|1.4 GHz クアッドコアIntel Core i5|
|メモリ|16 GB 2133 MHz LPDDR3|

**ソフトウェア**

|項目|情報|
|:---------|:------------------|
|言語|Rust(1.46.0)|

# コマンド
## プロジェクト新規作成
```
$ cargo new PROJECT_NAME
```

`cargo new`コマンドは、オプションを何も設定しないとデフォルトで`--bin`として実行されます。その結果、下記のものが生成されます。

```
PROJECT_NAME
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target/（省略）
```

### ライブラリを作成する場合
ライブラリを作成する場合には、`--lib`をオプションとして指定します。

```
$ cargo new PROJECT_NAME --lib
```

### gitを初期化したくない場合
```
$ cargo new PROJECT_NAME --vcs none
```

## ビルド
```
$ cargo build
```
> このコマンドは、現在のディレクトリではなく、`target/debug/PROJECT_NAME`に実行可能ファイルを作成します。

### 本番用のビルド
```
$ cargo build --release
```
> このコマンドは、target / debugではなくtarget / releaseに実行可能ファイルを作成します。最適化によりRustコードの実行が高速になりますが、最適化を有効にすると、プログラムのコンパイルにかかる時間が長くなります。これが2つの異なるプロファイルがある理由です。1つは開発用で、迅速かつ頻繁に再構築する場合と、もう1つは、繰り返し再構築されず、できるだけ高速に実行される最終的なプログラムを構築するためのものです。

### ビルドしたものを実行
```
$ ./target/debug/PROJECT_NAME
```

### ビルド&実行
```
$ cargo run
```

### コンパイル可能か確認
```
$ cargo check
```

## テスト
```terminal
$ cargo test
```

# ライブラリ
## **`cargo-edit`**
下記でインストールする。

```terminal
$ cargo install cargo-edit
```

### ライブラリの追加
```terminal
$ cargo add LIB_NAME
```

### ライブラリ削除
 ```terminal
$ cargo rm LIB_NAME
```

# 参考情報
認証付きプロキシ下でpython2.7用のSpyder3を入れるまでの手順メモ (Win10)

- レガシーなマシン用にpython2.7を使う
- 要認証の社内プロキシでコケる<br>
…という会社あるあるな状況で毎回ド忘れして時間使うのでメモです

## 執筆時の環境
- Windows 10 Home 1903
- Anaconda 4.7.12

# 手順
以下、コマンドラインへの入力は全てAnaconda Prompt上で行います。
(コマンド プロンプトやPowershellでもOKです）
**Spyder4は上手くいかなかったので、Spyder3をインストールします**

## Anacondaのプロキシ設定を行う
1. `conda config`で`.condarc`を作成します

    ```
    conda config
    ```
    - Windowsの場合、デフォルトではユーザディレクトリ直下に作成されます。（多分）<br>
`C:\Users\ユーザー名\.condarc `

2. `.condarc`を開き、以下を追記します<br>

    ```
    proxy_servers:
      http: http://<user>:<passwd>@<proxy address>:<port>
      https: http://<user>:<passwd>@<proxy address>:<port>
    ```
  - `<user>`はプロキシの認証に使うユーザー名を入れます
  - `<passwd>`はプロキシの認証に使うパスワードを入れます
  - `<proxy address>`にはプロキシサーバのアドレスを入れます
  - `<port>`はプロキシサーバのポート番号を入れます
  - 書き方例: `http: http://TAROU:0123@intra.hogehoge.co.jp:8080` 
  - **パスワード平文で書くので、LDAPなどで認証する場合は必要なインストールが終わったら消した方がいいと思います**

## 仮想環境を作ってSpyder3をインストール
python2を使うのは限定的な状況だと思うので、普段使いのpython3~と混ざらないように環境を分けます（失敗後の感想）
 
1. 仮想環境を作成します
 
    ```
conda create -n <envname> python=2.7
    ```
    - `<envname>`は環境の名前なので自由に決めます
    - `<モジュール名>=<タグ名>`でインストールするバージョンを指定できます

2. 仮想環境に入ります（`<envname>`は上で作ったものです）
   
    ```
activate <envname>
    ``` 
3. condaコマンドでspyder **3** をインストールします（明示的に

    ```
    conda install spyder=3
    ```
チャネル設定がおかしくなっていてパッケージが見つからない場合、`-c`でチャネルを指定します。

    ```
    conda install -c anaconda spyder=3
    ```
以降、環境に入ってから`spyder`を入力するか、(おそらく)スタートメニューに新規環境用のSpyderが追加されてるのでそこから起動できます。
（おわり）

## 備考

- 私の環境ではspyder4はpython2.7環境で起動すると数秒でクラッシュしたので諦めました…python3系なら平気でした
    - デバッグを見るとhttpリクエストがタイムアウトした後に落ちてるぽい

- 起動時に以下のようなエンコード系のエラーが出る場合、環境変数に`PYTHONIOENCODING=utf-8`をセットします
参考: [WindowsでPythonがLookupError: unknown encoding: cp65001](https://qiita.com/fetaro/items/448407a6964d307e8840)

    ```
    LookupError: unknown encoding: cp65001
    ```
VScodeのアンインストールから再インストール（mac）

#"command 'endwise.enter' not found vscode" のエラーメッセージ
* ファイルを編集しようとenterを押すとenterが反応せず、上記のメッセージが表示される。
* ターミナルに表示されるブランチ名も?[branch名]と"?"マークがついた。
* ニッチもサッチもなのでアンインストールからの再設定。

#参照したサイト
[Visual Studio Code の Mac からのアンインストール](https://daeudaeu.com/visual-studio-code-%E3%81%AE-mac-%E3%81%8B%E3%82%89%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

#やったこと
1. 現在開いているVScodeを終了
2. VScodeのAPPをアンインストール（ゴミ箱へ移動）
3. ターミナルで以下を実行  
　`$ rm -rf ~/.vscode`  
　`$ rm -rf ~/Library/Application\ Support/Code`
4. VScodeをインストール
5. VScodeで拡張機能の"Settings Sync"をインストール
6. "Settings Sync"と自分のGitHubアカウントを連携する。
7. 連携が成功したらVScodeで"shift + option + d"でGitHubに保存していた設定（拡張機能）をダウンロードする。
こんなAPI仕様書はやめてくれ

# 結論
使う人のことを考えてAPI仕様書作成しましょう。あなたが使う側になった時そのAPI仕様書で理解できますか？


## 困ったAPI仕様書達
API仕様書読んで困ったことを思いついたら挙げていきます。ポエムだと思って読んでいただければ


### PUT(POST)APIのpayload 例が空のjsonだった時
APIのrequest sample 書いてくれるのありがたいです。助かります。ただPUT APIで空のjsonがsampleに書かれていた時は絶望しました。何を設定しろと？
パラメータにもpayload : set update valuesとしか書いていないので頭が痛くなりましたｗ
↓絶望したサンプル。何を伝えたかったのだろうか……。

```json
{}
```

### response で返却される項目が必須なのか任意なのかわからない
これは要望なんですが、responseで返却される項目がAPIで必ず設定して返してくれるのか、それとも項目自体が返ってこないのか明記して欲しいです。

### 同じシステムのAPIなのに、APIによって、項目がキャメルケースだったりスネークケースだったりする。  
実際にあった話。AというAPIではキャメルケースなのに、BというAPIではスネークケースで項目が書かれていて？？？となりました。
同じシステム内のAPIでは統一して欲しいものです。

### どこまでがojcectか分からない・・・
エクセルAPI仕様書であった話。返却される項目の型にobjectと書かれていたのですが、どこまでがobjectか分からない・・・object内の項目はインデント付けて分かるようにして欲しかった（文・・・改善要望あげて改善してもらいましたが）

### 項目の説明がまともに書かれていないAPI仕様書  
Open APIで書かれているものでよく見かけるやつ。
id : integerのように型の説明しかないやつ。idくらいならまだしもすべての項目の説明が型だけだった時は、ソウルジェムが濁るどころの話じゃないし、
書いた人に小一時間問い詰めたくなるやつ。読み手にちゃんと情報を与えるようにドキュメントを書いてくれまじで。
CentOS(NetworkManager)でMACアドレスで接続制限をしているWIFIに接続するには。

# 遭遇した問題

試験用に(閉じた)無線LANを用意しようとして、一般的な無線LANアクセスポイントを用意し、WiFiのSSIDは非公開とした。 LinuxのDHCPサーバを用意して、あらかじめ登録したhardware address (MAC address)のみにIPアドレスを割り振るようにした。

そこにLinux(CentOS)のマシンでWiFi経由でDHCPで接続しようとした。
  1. まず、接続させたいLinuxマシンで、`ifconfig`とか`ip addr`等でDHCPクライアントのMACアドレスを調べる。
  2. クライアントのMACアドレスに対して、IPアドレス等を割り振るようにDHCPサーバを設定する。(ステルスSSIDに対する接続設定は、[この記事](https://qiita.com/n7aka/items/64e8fdd11e3f7ceaa49c)を参考にした)
  3. クライアントマシンで、無線LANの設定(SSID,WPA2パスフレーズ等)を設定して接続する
 
という手順を取ったが、3でDHCPサーバーからIPアドレス等が割り振られず、接続に失敗した。

# 原因

原因は、`NetworkManager`のデフォルトで**MACアドレスのランダム化**が有効になっていたからであった。DHCPクライアントから適当なMACアドレスを使ってDHCPサーバに問い合わせるので、DHCPサーバは無効なリクエストとみなして完全無視していた。

# 解決策

この環境はテストのためのネットワークで外界に全く出ないので、MACアドレスを収集されるリスクは少ないので、MACアドレスのランダム化を無効にした。

# 実行例

[参考にした記事](https://qiita.com/n7aka/items/64e8fdd11e3f7ceaa49c)にあるステルスSSIDへの接続方法も含めた実行例は下記.　[[コネクション名]], [[インターフェース名]], [[接続先SSID]], [[WPA2パスフレーズ]]は実際に合わせる必要がある。

```bash:実行例
# nmcli c add type wifi con-name [[wlan0a]] ifname [[wlan0]] ssid [[ACTUAL-SSID-NAME]]
# nmcli con modify [[wlan0a]] wifi-sec.key-mgmt wpa-psk
# nmcli con modify [[wlan0a]] wifi-sec.psk [[ACTUAL-WPA2-PASSPHASE]]
# nmcli con modify [[wlan0a]] wifi.mac-address-randomization never
# nmcli con up [[wlan0a]]
# nmcli con show [[wlan0a]]
```
よく使うjqueryのメソッド

#よく使うメソッド
##オブジェクトを取得
var.slice();    **→集合からサブ集合を取得**
##オブジェクトに関する動作
$("#id").remove();　**DOMからオブジェクトとその上のハンドラーやデータを徹底的に削除**
$("#id").show();**→表示された**
var.val();    **→Form要素から値を取得**
var.appendTo();    **→内容を要素の末尾に追加**
var.delegate();    **→マッチしたエレメントに任意のイベントを設定**
var.data();    **→データを指定する要素に保存**



#よく使う方式
・パラメータ
・配列
・key-value
・eventProgram(function(e,args){
});
・object.attribute.attribute..
・定義⇒コール
PHPUnitでテストデータを使用する際の準備

## はじめに
日々学習していて、最近はアプリケーション開発を行っています。しかし、恥ずかしながら今までテストコードを書いたことがありませんでした。

~~学習用の小さなアプリケーションのため、後回しにしてしまい今に至ります。~~
実務で基本的に使われると思うので、この小さなアプリケーションの開発だからこそなれるために書いていこうと思います！

とはいっても、この記事では具体的に書いたコードを説明するわけではなくテストコードを書く前段階の準備等についてまとめていきます。

対象者：テストコード書いたことがない初心者

## バージョン
・PHP：7.3.19
・Laravel：7.20.0

## PHPUnitについて
PHPUnitとは、PHPのテスト用ツールである。
今回使用するLaravel7.20.0には標準でPHPUnitが使えるためこちらを使用していく！

### テストコードを書くメリットは？
テストコードを書くことでいろいろなメリットがあると思います。いくつか挙げてみると

- 仕様変更等を行ったときに、その変更によって想定外のエラーが発生した際などに早く気付くことが出来る
- 挙動が仕様と合致しているか確認できる
- 繰り返しテストを行うことが出来る
- テストである程度の品質は確認できるため安心して開発に取り組める

などなど。

## やってみよう
まずは、Artisanコマンドでスケルトンの作成

```php
php artisan make:test PracticeTest
```
なにも指定しないとtests/Feature配下に作成される。
Unitテスト用のファイル（tests/Unit配下）を作成したい場合は

```php
php artisan make:test PracticeTest --unit
```
と記載することでできる。

FeatureとUnitの違いとしては、
Unit：関数やメソッド単位でテストを行う
Feature：コントローラやルーティングでのテストを行う
というイメージ？（間違っていたらご指摘ください）

※テストファイルの命名規則は、**アッパーキャメルケース（単語の最初の文字が大文字）**であること。あとは、テストしたいクラス名+Testが基本。

## テスト用のデータベースを準備しよう！
テストする際、本番環境のデータベースを使用するのは非常に危険！！！
そのため、テスト用のデータベースを準備する必要があります。

１． まずはテスト用のDBを作成
２．phpunit.xmlでテスト用DBについて記載する

```phpunit.xml
<server name="DB_CONNECTION" value="mysql"/> //今回はMySQLを使用するため追加
<server name="DB_DATABASE" value="テスト用DB名"/> 
```

３．テスト実行時に、テスト用のDBを使用するようにテスト用の.envファイル（.env.testing）を作成する
.env.exampleの内容をコピー

変更点

```.env.testing
APP_ENV=testing　#localからtestingに変更
APP_KEY= 空で　#のちに新しく作成する

DB_DATABASE=テスト用DB
```

APP_KEYを新規で作成しないと、.envファイルのAPP_KEYを参照してしまうらしい。

```php
php artisan key:generate --env=testing
```

[参考](https://qiita.com/akkino_D-En/items/024661836b7570d78704)

アプリケーションキーを作った後は、下記コマンドを実行しておこう。

```php
php artisan config:clear
```

あとは、テストコードを書いていけばいける！と思いテストを行ってみましたがいくつか躓いたので記載します。

### 〇テストデータの削除
テスト用のデータベースを扱う場合、***テスト実行後にそのテストデータを削除する必要があります***。というのも、テストデータが残っていると、これが原因でエラーが起こる可能性があるためである。

[Laravel7系公式ドキュメント](https://readouble.com/laravel/7.x/ja/database-testing.html)

Laravel7系では、RefreshDatabaseを使用することでDBをリセットできる。
RefreshDatabaseとは、各テストの後にDBをリセットしてくれるトレイト。
使用方法は、下記の通りに記載する。

```php
[PracticeTest]
use Illuminate\Foundation\Testing\RefreshDatabase;

class PracticeTest extends TestCase
{
    use RefreshDatabase;
}
```

### 〇Error: Call to a member function connection() on null
調べてみると、Unitテストクラスのひな形のTestCaseが別のクラスを指していることが原因とのこと。Featureテストの場合は、下記のように修正する必要がある。

```php
[PracticeTest]
use Tests\TestCase; // PHPUnit\Framework\TestCaseでは×
```

[参考サイト](https://architect.slowcat.net/php/phpunit-dbtest-connection-null/)

### まとめ
ざっくりにはなりますが、PHPUnit使用にあたって必要なことをまとめました。
引き続きテストコードも書いていきたいと思います！
ElectronをバージョンアップしたらMacアプリのCode Signができなくなった話

[前回](https://qiita.com/aikumi/items/0b118c4737b33f0347af)に引き続きElectron9のにバージョンアップした際に困ったことメモです

# MacアプリのCode Sign

* Macアプリは10.14.5以降、署名と公証されていないといけなくなっています[参考](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution)
* なのでアプリの配布には署名作業が必須
* 使っているライブラリ
  * 署名用ライブラリ: electron-osx-sign
  * アプリのビルド: electron-builder

# Electron9へバージョンアップした後.appへの署名に失敗
* [ERROR] app is not signed [xxxxxx.app]
* と言われた

# 対策
* electron-osx-signを最新化 v0.4.11  --> v0.4.17
* electron-builderを最新化 v22.1.0  --> v22.7.0

これで署名できた！

# 参考
* https://github.com/electron/electron/issues/23534
QiitaのAPIを呼ぶときに末尾にスラッシュをつけるとhttp://~にリダイレクトされるので気をつけましょう

# TL;DR

タイトル通り。curlの結果は[こちら](#もう一度curlで叩いてみた)。

# iOS懐かしのエラー

昔よく見たエラーにふとした拍子に出くわししました:yum:  [^1]

[^1]: リリース前の開発ではいまでもよく見るかもしれませんね。

```
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

これはメッセージの通り、HTTP通信をしようとしたときにiOSがブロックしてくる奴です。

# QiitaのAPIを呼ぼうとしていた

`URLSession`に渡しているurlは間違いなくhttpsのはず……:thinking:

```swift
let url = URL(string: "https://qiita.com/api/v2/items/?per_page=3")!
let task = urlSession.dataTask(with: url) { data, response, error in
    ...
```

# エラーメッセージを確認してみる

```
- Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x6000007b4b40 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=http://qiita.com/api/v2/items, NSErrorFailingURLKey=http://qiita.com/api/v2/items, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}
```

:astonished:？！:astonished: 

```
NSErrorFailingURLKey=http://qiita.com/api/v2/items?per_page=3
```

なぜだかわかりませんが、URLスキームがhttpに変わっています？？？

そして、ローカルホストに繋いだりするときと同じように、App Transport Security Settings の Allow Arbitrary Loads を YES に設定すると問題なく結果が返ってきました。

# 犯人は……？

小一時間ハマったのち、ようやく犯人が見つかりました。[^2]

[^2]: 当初はmacOSのプロジェクトで試していたため、普段触ることのないサンドボックスの設定などを疑っていたため、どハマりしてしまいました。

```swift
let url = URL(string: "https://qiita.com/api/v2/items/?per_page=3")!
```

:rolling_eyes: よく見ると、URLの末尾にスラッシュがついている……？ :rolling_eyes:

え？でも、このURLをcurlで叩いても普通にレスポンスが返ってきてたような？

# もう一度curlで叩いてみた

```shell
$ curl -D - https://qiita.com/api/v2/items/ 
HTTP/2 301 
date: Tue, 15 Sep 2020 12:45:32 GMT
content-type: text/html
content-length: 178
location: http://qiita.com/api/v2/items
server: nginx

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
```

:astonished:？！:astonished:

:innocent:なぜかhttpにリダイレクトされています:innocent:[^3]

[^3]: そういえば調査の途中でcurl使ったときには、無意識に-Lオプションをつけていたような……:thinking:


# QiitaのAPIを使うときは、末尾のスラッシュに気をつけましょう

という結論でした:see_no_evil:

```swift
let url = URL(string: "https://qiita.com/api/v2/items?per_page=3")!
```

万が一同じ現象に遭遇した人がいれば、ここに辿り着けますように。
【rails】エラーメッセージ とはなんだったのか


#エラーメッセージの生成と表示方法

###生成

```console:
>> user = User.new

>> user.save    #エラーメッセージ生成
=> false

>> user.error.full_messages  
=> [Failed"", "invalid"]
```

オブジェクトを保存する際、falseが返ってきた瞬間に配列の要素としてエラーメッセージが生成される。

###表示

```ruby:erb
<% @user.errors.full_messages.each do |msg| %>
  <%= msg %>
<% end %>
```
配列の要素をeach文で、それぞれ取り出し、表示させることができる


#エラー時にのみ出現するClass属性

`class="field_with_errors"`
自動でエラー箇所の入力部品を囲んでくれる。



###実装
パーシャルを使いつつ、どんなオブジェクトでも対応できるように実装させている。

```ruby:shared/_error_messages.html.erb
<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger alert-form-extend" role="alert">
      <%= object.errors.count %>個のエラーがある
    </div>
    <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

```ruby:users/new.html.erb
<%= form_with(model: @user, url: users_path, local: true) do |form| %>
  <%= render 'shared/error_messages', object: form.object %>
```

```ruby:users_controller.rb
def create
  @user = User.new(user_params)
  if @user.save
    ~~
  else
    render 'new'
  end
end
```

```application.scss
#error_explanation {
  color: red;
  ul {
    color: red;
    padding-bottom: 0;
  }
}

.field_with_errors .form-control { 
  border-color: red;
}
```
slickgrid を使って、一覧と詳細を作る

画面のレイアに以下のように実装する
①gridのコラムの属性を定義する
・コラムの配列を定義する
・各列の属性を上記の配列に入れる
②gridの動作を定義する
・gridの全体の動作を定義する
③パラメータのデータをgridの各列の変数に設置する
④上記で準備した結果をgridの共通関数を使って、設置する
*******************************************************

共通部品の実装方法
gridの生成
①グリッドコンテナ表示
②メニュー情報設定と生成
③イベント生成
④データを設置する

********************************************************

slick grid libraryのメソッド
new Slick.Data.DataView();
view.setItem();
new Slick.Grid();
columns.slice();
new Slick.Controls.GridMenu();
grid.onSort.subscribe();
dataView.onRowsChanged.subscribe();
grid.resizeCanvas();
grid.onCellChange.subscribe();
setGridEvent();
new Slick.Controls.ColumnPicker();

*****************************************************
slickgrid libraryの以下のファイルを使う
slick.core.js
slick.dataview.js
slick.grid.js
…

*****************************************************

データを取得
ajaxの方法を使って、もらったデータをパラメータとして、
画面レイアのメソッドを使って、データを渡した。
勉強日誌10日目

今日も仕事で残業をし、割とくたくたで帰ってきて家事をして勉強！
ポポロクロイスを聴きながら今日もやります。

正答率　79％

xhost +
export DISPLAY=
xeyes &
許可リストへ追加し、環境変数によるXサーバの指定をする

xhost -
Xサーバに対して、アクセスを拒否する

xhost -
許可リストにあるホストのみ接続を許可（許可リストを有効化）


/etc/X11/xorg.conf
Xサーバ(X.org)の設定ファイル

正答率　62％　（前回と同じ）

startx
xinit
~/.xinitrc
/etc/X11/xinit/xinitrc
ランレベル3からX Window Systemを起動する際に実行するスクリプト
XDMCP
ネットワークにあるリモートホストにグラフィカルログインする時に使われるプロトコル

/etc/X11/xdm/xdm-config
XDMの設定ファイル

/etc/inittab
Linux起動時デフォルトのランレベル

RDP
リモートデスクトッププロトコル

正答率　100%
Unity ML-Agents Release6 の環境構築方法とエラー対応

Unity ML-agentsも正式リリースされたことで、とりあえず触ってみようということでまずは環境構築した。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e1b846c3-dfdd-1725-21cc-4021f197190e.png" width=512 />
起動するまでにエラーがいくつか出たので、メモをのこしておきました。
誰かのためになればいいのですが・・・。

# 最終的に正常に動作した環境
種類       | バージョン   | 備考
-----------|-------------|------------------------------------------------
Windows10  | -           | 
ML-Agents  | release 6   |
Python     | 3.7(3.7.9)  | 3.8 にするとtensorflow が対応してないので注意
TensorFlow | 2.3.0       | vc_redist.x64.exe インストールしていないとエラーになるので注意

# 環境構築手順
GitHub に[ドキュメント](https://github.com/Unity-Technologies/ml-agents/blob/release_6_docs/docs/Installation.md)がまとめられているのでこれを見るのが吉。
身も蓋もないですが、本家で、現状これより良いものはない気がします。

# エラー対応メモ
## Python と TensolFlow のバージョンの問題
```
ImportError: DLL load failed while importing _pywrap_tensorflow_internal
```

うーんと思って調べると、[TensolFlow のバージョンでエラーって言っている人](https://qiita.com/grinpeaceman/items/c55ab14d843828fa05ab)が多かった。
そこで TensorFlow のサイト行ってみてみたら、そもそもPython のバージョンが 3.5-3.7 になっていて、
自分が最新版ならいいでしょって 3.8 でやっていたのがダメだったというオチ。
（Unity ML-Agent は Python が 3.6以上となっていたので、3.8 で始めたのだが）
以下で対応。

```
conda create -n ml-agents python=3.7
```

## TensorFlow の環境構築が足りなかった
```
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

が出てうまくいかない。
[こちら](https://github.com/tensorflow/tensorflow/issues/35749)を確認すると、おそらくだが TensorFlow のバックグラウンドで動作するための C++ の環境が足りていなかったのだと思う。

以下で対応。
[こちら](https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads)から vc_redist.x64.exe をダウンロードしてインストールすることでエラーが出なくなった。

### 補足
TensorFlowのバージョンを2.0にまで下げてさらに実行するこどでも対応可能とのこと。
試してみたが、たしかにエラーはなくなる。
以下で対応。

```
pip isntall tensorflow==2.0.0
```

## yaml での typo

```
ValueError: 'pro' is not a valid TrainerType
```

ググっても全然情報が出てこないと思ったら、yaml ファイルの設定を typo していた。
この後もエラーがいくつが出たが、すべてyaml の typo だった。
設定ファイルは丁寧に書きましょう。
IBM Cloud IAM ICLBの操作権限

#目的
IAMによるアクセス権限の付与について、細かい部分が公開されていないので検証してみました。
今回は、Classic Infrastructure内のロードバランサー(ICLB)デバイスの操作権限です。
**<font color=red>参照権限まで含めた最低限のアクセス権を記載します。</font>**

(1)ICLBデバイスのオーダ
(2)ICLBデバイスの削除
(3)変更操作
(4)分散対象インスタンスの追加/削除
(５)SSL証明書のアサイン

##ICLBデバイスのオーダ
クラシックインフラストラクチャー -> 許可 -> アカウント
・サービスの追加/アップグレード

クラシックインフラストラクチャー -> 許可 -> デバイス
・ロードバランサーの管理

##ICLBデバイスの削除
クラシックインフラストラクチャー -> 許可 -> デバイス
・ロードバランサーの管理

##ICLB変更操作

**基本的にICLB内の操作はこの権限があれば操作可能**

クラシックインフラストラクチャー -> 許可 -> デバイス
・ロードバランサーの管理

###ICLBサーバインスタンスの追加/削除
<font color=red>この操作はロードバランサーの管理以外にも追加で権限が必要でした</font>
クラシックインフラストラクチャー -> 許可 -> デバイス 
・仮想サーバー詳細の表示

クラシックインフラストラクチャー -> デバイス
・操作対象デバイスのアクセス権があること

###SSL証明書のアサイン
<font color=red>この操作はロードバランサーの管理以外にも追加で権限が必要でした</font>
クラシックインフラストラクチャー -> 許可 -> サービス
・証明書の表示(SSL)

##その他
アクセス権の設定方法は、下記ページを参照してください。
[IBM Cloud IAM 仮想サーバの操作権限](https://qiita.com/khoshina/items/f0b439fc88709376fa7e)
ExposedでDatetime型のカラムが定義できない

ExposedでDatetime型のカラムが見つからなくて定義できずハマったのでメモ。

## 結論

以下のいずれかを追加すればOK

```gradle:build.gradle
compile "org.jetbrains.exposed:exposed-jodatime:$exposed_version"
// or
compile "org.jetbrains.exposed:exposed-java-time:$exposed_version"
```
ASP.NET Core で QR コードの生成

# はじめに

ここでは、Visual Studio 2019 での ASP.NET Core 3.1 プロジェクトにおいて、クライアント サイド、 JavaScript による QR コードの生成方法を説明します。
今回は、以下のライブラリを使用します。

- [qrcode.js](https://davidshimjs.github.io/qrcodejs/)

# QR コード生成ライブラリの追加

[qrcode.js](https://davidshimjs.github.io/qrcodejs/) からダウンロードして、プロジェクトに追加しても良いですが、今回は、Visual Studio のクライアント ライブラリ マネジャー使って、プロジェクトにライブラリを追加します。

[ソリューション エクスプローラー] - [対象プロジェクト] - [wwwroot] - [lib] で、右クリック メニューから、[追加] - [クライアント側のライブラリ] を選択します。
![クライアント側のライブラリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/6900b7cc-6f70-4378-94bb-9bcea25449ec.png)

[ライブラリ] に "qrcode.js" と入力して、[Enter] とすると、CDNJS から、最新のライブラリが検索されます。[インストール] を選択します。
![qrcode.js ライブラリの追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/3dd2760c-65bf-b375-1619-82fab5244b68.png)

"wwww\lib" 以下に "qrcode" というフォルダーが作成され、同フォルダー以下にライブラリが追加されます。
![wwww\lib\qrcode](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/1ade384d-dce6-4431-bf80-a4fb30eb6262.png)

ここで、プロジェクト直下の "libman.json" を開いてみてやると、"qrcodejs" のエントリが追加されていることが分かります。
![libman.json](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/710900f8-2c90-2a50-8bfd-b55c198d3c81.png)
もちろん手動でプロジェクトに qrcode.js を追加してもよいのですが、パッケージ マネジャーを使ってインストールすると、削除や更新が容易になります。

# QR コード生成コードの実装

QR コード生成のスクリプトを実装していきます。ここでは、Visual Studio から生成した ASP.NET Core プロジェクト テンプレート内の index.cshtml への実装例を説明します。

まず、QR コードを表示したい箇所に div 要素を定義します。この時、div 要素に任意の id を付与しておきます。
次に、Scripts セクションに、先にインストールしたライブラリへの参照と、QR コード生成のコードを記述します。
コード記述では、QRCode クラスのインスタンス生成時のコンストラクタの第一引数で、QR コードを表示したい箇所に定義した div 要素の id を指定します。

```html:Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    @*QR コード表示箇所*@
    <div class="qrCodeImg" id="qrCode"></div>
</div>


@section Scripts{
    @*qr.code.js への参照*@
    <script type="text/javascript" src="~/lib/qrcodejs/qrcode.js"></script>
    <script type="text/javascript">

        $(function () {
            //id=qrCode の要素に、QR コードを表示
            new QRCode('qrCode',
                {
                    text: 'https://qiita.com/hiromasa-masuda',
                    width: 150,
                    height: 150,
                    colorDark: '#8b0000',
                    colorLight: '#ffffff',
                    correctLevel: QRCode.CorrectLevel.H
                });
        });
        
    </script>
}

```

実行結果は、以下となります。
![Index.cshtml](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/2869980a-0dca-5f58-98e0-2d641cd8773a.png)

Tips としては、QR コードをセンタリングしたい場合、動的に生成される img 要素が block 要素として定義されるので、スタイル設定で、".qrCodeImg > img { margin: 0 auto; }" といったように、子要素の img を block 要素として扱ってセンタリングすればうまくいきます。

qrcode.js を使えば容易にクライアント サイドで QR コードを生成できます。
Visual Studio のライブラリ マネージャを使うことで、Java Script ライブラリの管理も容易になります。

# 参考サイト

- [qrcode.js](https://davidshimjs.github.io/qrcodejs/)
- [ASP.NET Core での TOTP authenticator アプリの QR コード生成を有効にする](https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/identity-enable-qrcodes)
Dockerとは

# 概要
Dockerについて独学で学んだ内容をまとめます。

# Dcokerとは何か？
Linux上で動作するツールです。
- インフラ部分（サーバ設定）
- Webサービス（アプリケーション）
をひとまとめにしてコンテナとして保存、配布を行うことができます。

### 特徴
`メンバー誰もが同じ環境を手軽に再現できる`ため、ローカル環境の構築手段として開発フローに用いられます。
サーバ構成、インストールするライブラリやツールを`Dockdrfile`等にコードベースで定義します。

### デプロイ
インフラ部分と一体化している為、コンテナごとデプロイして運用することも可能であり、環境差異を最小限にしてデプロイすることが可能です。

### 備考
本来であればMacやWindowsではDockeｒを使用することはできないが、Docker for Macを導入することで使用可能になります。
winget (Windows Package Manager) 本体をコマンドラインからインストール

Microsoft 謹製のパッケージマネージャ `winget` が気になっていたのでインストールしてみました。
**インストール時に（心情的に）引っかかったのでメモします。**

> 2021/09/23 自動で最新版をインストールする方法に更新しました。

## winget 公式のインストール方法

[GitHub - microsoft/winget-cli: Windows Package Manager CLI (aka winget)](https://github.com/microsoft/winget-cli)
公式ページより、インストール方法は以下のいずれかです。

1. Microsoft Store からダウンロード：Windows 10 Insider build が必要
2. 自分でファイルをダウンロード：アップデートはマニュアル
3. 自分でビルドする：アップデートは当然マニュアル

『1.』は Windows 10 自体がプレビュー版になってしまうので簡単にはおすすめできません。
『3.』は普通の人にはハードルが高すぎます。
簡単に試せるものが『2.』くらいしかありません。ブラウザでファイルをダウンロードしてインストールするだけなので、まだ敷居は低いかと思います。

はい。。。**そもそもコマンドラインからのインストール方法がありません。**
`winget` コマンドは CLI で使うもの、でも `winget` をインストールする方法は GUI で行ってくださないなんて、ちょっとした禅問答のよう。。。


## コマンドラインでインストール

『2. 自分でファイルをダウンロード』、こちらの方法をコマンドラインでインストールできるようにしました。
こちらは上記で書いてある通り、手動アップデートになります。

自動で最新版（latest release）の実行ファイルを取得しますので、新規インストールもアップデートも下記コマンドで実行できるかと思います。
※ 2021/09/23 時点のインストール方法です。

```powershell:PowerShell
Invoke-WebRequest -Uri https://github.com/microsoft/winget-cli/releases/latest/download/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -OutFile winget.msixbundle -UseBasicParsing
Add-AppxPackage -Path winget.msixbundle
rm winget.msixbundle
```

もし winget のインストール時にエラーが発生したら、必要なランタイムが足りていないので追加でインストールしてください。
下記は x86 64bit 用のコマンドです。

```
Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx -OutFile vclibs.appx -UseBasicParsing
Add-AppxPackage -Path vclibs.appx
rm vclibs.appx
```

https://docs.microsoft.com/en-us/troubleshoot/cpp/c-runtime-packages-desktop-bridge#how-to-install-and-update-desktop-framework-packages

> ### 旧方法

>バージョン指定したい場合は、こちらの対応どうぞ。
kkdd さんよりコメントで頂いているとおり、最新版はインストーラーの拡張子が変わっていますのでご注意ください。
※ 2020/09/15 時点のインストール方法です。

> ```powershell:PowerShell
Invoke-WebRequest -Uri https://github.com/microsoft/winget-cli/releases/download/v.0.2.2521-preview/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle -OutFile winget.appxbundle -UseBasicParsing
Add-AppxPackage -Path winget.appxbundle
rm winget.appxbundle
```

> #### 最新版のダウンロードへ変更方法

> 1. https://github.com/microsoft/winget-cli/releases/latest にアクセスします。
2. リストの中で拡張子が ~~`.appxbundle`~~ `.msixbundle` のリンクをコピーします。
3. コマンドライン1行目の `-Uri` の引数をコピーしたリンクに書き換えます。

### インストール確認方法

バージョン情報が表示されればOKです。

```powershell:PowerShell
winget -v
v1.0.11692
```

## 自分の感想

winget はコマンドラインベースのパッケージマネージャです。
アプリケーションをインストールするのに、GUI を使いたくない人が使うツールがコマンドラインベースのパッケージマネージャかと思います。
ところが、winget はコマンドラインでインストールする方法が公式ではサポートされていません。

~~winget はまだプレビュー版のため、コマンドラインからのインストールがサポートされていないものと思っています。
正式版の発表時には、コマンドラインから簡単にインストールできるようになっていてほしいです。~~
Microsoft に未だ思い届かず。。。

パッケージマネージャは Scoop をメイン、Chocolatey をサブに運用していますが、winget も少しずつ試してみようかと思います。
sudoコマンドがいきなり使えなくなった！

### 問題
```
$ sudo
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
```

### 原因
`/etc/sudoers` の権限がroot権限から(wakkihayaに)いつの間にか変わっていたみたい

```
$ ls -la /etc/sudoers
-r--r----- 1 wakkihaya root 820 Aug 26 15:00 /etc/sudoers
```

### やったこと
**その1(失敗)**

```
$ chown -R root:root /etc/sudoers
chown: changing ownership of '/etc/sudoers.d': Operation not permitted
```
普通にroot権限を付与しようとしたけど、root権限でしか `/etc/sudoers` は変更できないので、permittedになるのは当たり前…

**その2(失敗)**

```
$ su - root 
Password: 
su: Authentication failure
```

suでrootに変更しようと思ったけど、
なぜか、Passwordをいれても認証されない…

**その3(失敗)**

```
$ pkexec visudo
Error getting authority: Error initializing authority: Could not connect: No such file or directory
$ pkexec chown root:root /etc/sudoers /etc/sudoers.d -R
Error getting authority: Error initializing authority: Could not connect: No such file or directory
```
`pkexec` で実行しようと思ったけど、これも認証落ちる…

**その4(成功)**
WSLから権限を付与することが無理なら、Win上から権限を付与しちゃおう！


Windowsのコマンドプロントを開いて、

```
$ wsl -u root
$ chown root:root /etc/sudoers
```
ルーティングルートパラメータの正規表現

#ルーティングでハマったこと

アカウント編集で「名前」、「パスワード」、「メールアドレス」を編集する機能をつけたときの話。
##ルーティング↓
```php:routes/web.php
//名前、パスワードを編集する
Route::get('user/{page}', 'UserController@showEditForm')->name('user.edit');
//メールアドレスは、確認メールを送ったりトークンを発行したりと性質が違うと思ったので別にコントローラを用意。
Route::get('user/email', 'EmailResetController@showEditForm')->name('email.edit');

```
##コントローラー↓

```php:UserController.php
public function showEditForm(Request $request)
{
    $login_user = Auth::user();
    return view('user.email', compact('login_user'));
}
```

```php:EmailResetController.php
public function showEditForm(Request $request)
{
    $login_user = Auth::user();
    return view('user.email', compact('login_user'));
}
```


あれ、
user/emailにアクセスしたのに、EmailResetControllerが呼ばれない。


#原因

優先度が関係。
上に書かれた記述の方が優先度が高い。そのため、上に書くか、whereメソッドで、ルートパラメータを制約する。

```php:routes/web.php
//名前、パスワードを編集する
Route::get('user/{page}', 'UserController@showEditForm')->name('user.edit')->where('page', 'name|password');
//メールアドレスは、確認メールを送ったりトークンを発行したりと性質が違うと思ったので別にコントローラを用意。
Route::get('user/email', 'EmailResetController@showEditForm')->name('email.edit');

```

>https://readouble.com/laravel/5.5/ja/routing.html
【Office2019】所有権が失う共有フォルダ

今回判明した悲しい事実

共有フォルダにある、ExcelやWordファイルは30分ほど操作をしないと一時的に所有権を失うらしい。

そのため、30分以上放置して別ユーザが対象のファイルを開き編集をすると初めに開いていた人は、読み取り専用の扱いにされ、保存する際には別名で保存しないといけなくなる。。。

以前みたいな隠しフォルダはもう存在しないのかな？それとも、設定によって変更できるのかな。。。
Python から Julia を呼び出す Pyjulia のメモ 

## 背景

* Python では数値計算が遅い状態になっている.
* Julia で早くなりそうな気がするので Julia 使ってみたい
* とはいえ Python 資産がそれなりにあり完全に移行できるわけではないので, 計算の一部だけ julia で処理してみたい.
* Windows, Linux 両方で動くのが必要 -> Julia はネイティブバイナリがあるので要求をみたす
* Python から呼べる pyjulia を使ってみます.

## インストール

https://github.com/JuliaPy/pyjulia

ドキュメントにあるとおりです.

ただ, `julia.install()` では julia がパスに通っている必要があります.

ソースコードを見ると, julia のパスを指定できるのがわかりました.

```
julia.install(julia="/path/to/julia")
```

で, julia コマンドのパスを設定できます. Windows 環境で julia コマンドのパスを `PATH` に登録するのが面倒なときに利用するといいかもです.

Julia 自体は Linux の場合は musl(glibc などよりもポータブルな libc)版が用意されていたりと, それなりにクロスプラットホームであるのが想定できます.

Windows の場合も特に不都合なく動いてくれているようです.
(コンパイルも LLVM 使っているので Visual Studio とか入れなくても動く... はず)

あとはドキュメントを参考にいろいろ Julia を呼び出すだけです!
TrelloのAPI経由でデータ取得ができなくなった時の対処法(HTTP/1.1 426 Upgrade Required編)

## 問題
**TrelloのAPI経由でタスクなどを取得してDiscordなどに表示していたが、2020年8月後半からタスクなどが表示されなくなった。**


## 原因
Discordにエラーなどは表示されず。(そういう設定もしていないけど)

「APIが原因か?」と考え、APIを含めたURLで叩いてみたら問題なく取得できている。

それなら、実行ファイル(`PHP`)の問題かな?
ターミナルで以下のコマンドを叩いてみる。

```
$ php (実行ファイル名).php
```

すると、以下のエラーが確認できた。

```
PHP Warning:  file_get_contents(trelloのAPIが含まれたURL): failed to open stream: HTTP request failed! HTTP/1.1 426 Upgrade Required in (実行ファイル).php on line 15
```

`HTTP`リクエストのエラーなのはわかったけど、`426`って何? 見たことないんですけど。

調べてみた所、**今のプロトコルじゃリクエストを拒否する**との事らしい。
[426 Upgrade Required - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/426)

**`HTTP/1.1 426 Upgrade Required in (実行ファイル).php on line 15`**って言われてるし、`file_get_contents()`を`HTTP/1.1`で実行できるようにすれば良いのかな?

## 解決策

**`stream_context_create()`で作成したHTTPヘッダ情報を`file_get_contents()`に渡す。**

自分の予想で合っていたみたい。

**`stream_context_create()`**でどんな形式で`HTTP`リクエストを実行するかを指定できるので、この関数を利用して`HTTP/1.1`で実行できるよう宣言する。
**`file_get_contents`**の第三引数で`stream_context_create()`で作成したのを入れられるので、宣言したのを記述する。

以上をまとめると、実行ファイルは以下のような形になる。

```(実行ファイル).php
//HTTPヘッダ情報
$options = [  
    'http' => [  
        'method'           => 'GET',  
        'protocol_version' => 1.1,  
        'header'           => "Connection: close\r\n"  
    ]  
];  
$context = stream_context_create($options);  

$trello_url = "trelloのAPIが含まれたURL";
$trello_data = file_get_contents($trello_url,FALSE,$context);
```

`Connection: close`はリクエストが完了した後に、接続を切断してくれるよう宣言している。

修正後、挙動を確認してみた所、無事解決した。

## 参考資料
- [426 Upgrade Required - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/426)
- [HTTP 1.1 426 Upgrade Required](https://community.atlassian.com/t5/Trello-discussions/HTTP-1-1-426-Upgrade-Required/td-p/1461934)
- [2020年8月末頃から Trello API 経由のデータ取得が失敗する | Qrunch（クランチ）](https://qrunch.net/@armband/entries/opOrB1EoTmxEayqj?ref=qrunch)
- [PHP: file_get_contents - Manual](https://www.php.net/manual/ja/function.file-get-contents.php)
- [PHP: stream_context_create - Manual](https://www.php.net/manual/ja/function.stream-context-create.php)
- [Connection - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Connection)
- [HTTPリクエストのカスタマイズ | PHP プログラミング解説](https://so-zou.jp/web-app/tech/programming/php/network/http/request/)
DockerComposeでWordpressをローカルに再現する

すでに走ってるWordpress、ローカルに再現したくない？？

※dockerインストールについては割愛させていただきます。

##ディレクトリ構造
コンテナ作成前

```
├── db-data
│   └── wordpress.sql.zip
├── docker-compose.yml
└── .env
```

##データの準備
###wp-contentの取得
テーマファイルなどが入ったwp-contentフォルダをftpサーバなどを介して取得しておく。

###sqlダンプファイルの取得
サーバーから直接エクスポートもしくは、BackWPupとういプラグインで簡単にデータをバックアップし取得することができる。
zip形式で取得し、そのままdb-dataディレクトリ下に設置する。

BackWPupの使い方について参考サイト：
[BackWPUpで確実にWordPressのバックアップを取る方法](https://bazubu.com/how-to-use-backwpup-23804.html)

##docker-compose.ymlを作成

```yml:docker-compose.yml
version: '3.3'
services:
  mysql:
    build:
      context: ./docker/mysql/
    restart: always
    environment:
      - MYSQL_DATABASE
      - MYSQL_USER
      - MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD
    ports:
      - 3306:3306
    volumes:
      - mysql_data:/var/lib/mysql
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
  
  wordpress:
    build:
      context: .
      dockerfile: ./docker/wordpress/Dockerfile
    depends_on:
      - mysql
    ports:
      - 8080:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST
      - WORDPRESS_DB_USER
      - WORDPRESS_DB_PASSWORD
      - WORDPRESS_DB_NAME
    volumes:
      - ./:/var/www/html
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    environment:
      - PMA_ARBITRARY
      - PMA_HOSTS
      - PMA_USER
      - PMA_PASSWORD
    depends_on:
      - mysql
    ports:
      - 8888:80
volumes:
  mysql_data:

```

###補足
OS起動時に自動的にこのコンテナを起動させたくない場合は

```yml
restart: always
```

の記述を

```yml
restart: no
```

に変更すると良いと思います。

##envファイルを作成
ルートディレクトリ直下に.envファイルを設置します

```:.env
MYSQL_DATABASE=wordpress
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_ROOT_PASSWORD=root
WORDPRESS_DB_HOST=mysql:3306
WORDPRESS_DB_USER=root
WORDPRESS_DB_PASSWORD=root
WORDPRESS_DB_NAME=wordpress
PMA_ARBITRARY=1
PMA_HOSTS=mysql
PMA_USER=root
PMA_PASSWORD=root
```

#dockerコンテナ起動
現在起動中のコンテナを確認

```console
docker-compose ps
```

ymlで設定したポートと同じものがあればバッティングしてしまうので
起動中のコンテナは一度停止してください。

そしていよいよコンテナ起動。

```console
docker-compose up -d
```

##wp-contentの入れ替え
起動するとwordpress関連のファイルが自動的に作成されるので、
ルートディレクトリ直下のwp-content/の中身を手元に準備しておいたバックアップファイルでまるごと置換する。

##データベースのドメイン置換
localhost:8888にアクセスし、phpmyadminでドメインを置換していく。
現在使用しているWordpressサイトのURLを http://localhost:8080/ で置換することで、
ローカル環境でWPを使用することができるようになる。

詳しい手順については、先人のありがたいサイトを参考にしていただくと大変わかりやすいかと思います。
（人のふんどしでなんとやら...）

[phpMyAdminを使ってWordPressを別のドメインで使えるようにする方法](https://sole-color-blog.com/blog/991/)

##Wordpress起動
http://localhost:8080/ にアクセス。

##補足
コンテナ停止

```console
docker-compose stop
```

##まとめ
以上で、現在走っているWordpressサイトをローカルに再現することができました。
Dockerfileよりdocker-compose.ymlだと記述が完結でわかりやすくていいですね。
選ばれたのはdocker-composeでした。おわり。
Maxのバージョン確認方法

#場所
Maxコンソールの **Maxについて** をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8d24e3ff-ce83-8a96-5260-c926aa0deeb2.png)
出た！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e2d55a05-6720-ea4b-2464-5735a696c30f.png)
Qiita初投稿（始めたきっかけ）


![50005_eyecatch3-thumb-1000x600-8844.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719075/b44ec0fe-fd8c-9be0-25b8-3225d2d7758b.jpeg)

はじめまして。
独学でPythonを学んでいます。
これから少しずつ投稿していきます。

---
**【プログラミングを始めたきっかけ】**

一般社団法人 日本ディープラーニング協会（以下、JDLAとする）が主催しているG（ジェネラリスト）検定という資格試験をきっかけにプログラミングに興味を持ちました。人工知能や機械学習などにはPythonがよく使われており、初心者にもシンプルで学びやすいと調べたら書いてあったのでまずは学んでみようと思ったのがきっかけです。
![d28865-21-242855-0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719075/0ea05fa3-c0d5-a50a-902e-6675cdb92bfd.jpeg)
結果は、合格だったのですが試験問題の内容が難しすぎて、夏のエアコンが効いた部屋で受験したのですが、冷や汗を書きながら問題を解いていたのが懐かしいです。笑

---

**【コード】**

簡単なfor文です。

```csharp

for i in range(5):
   print(i)
```

**【結　果】**

```
0
1
2
3
4
```
今回は、初めての投稿ということで簡単なfor文とさせていただきました。
徐々に投稿のクオリティを上げていきたいと思っています。

---
では、**また！！**
![arrow_next_41479-300x300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719075/687fb6e9-772c-c7d1-89d7-0854a37168ac.jpeg)
【言語処理100本ノック 2020】第9章: RNN, CNN

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では、以下の第1章から第10章のうち、「第9章: RNN, CNN」を解いてみた結果をまとめています。

本編は以下のリンク先に移転しました。
https://amaru-ai.com/entry/2022/10/16/193620

[全100問の解答へ](https://amaru-ai.com/entry/2022/10/15/204035)
docker-compose作成方法

# docker-composeの書き方
```docker-compose.yml
version: '3'

services: 
    web:
        ## dockerimageファイルを指定するか、自分で作成したDockerfileを指定する。
        ## Dockerfileが同一ディレクトリに存在する場合は image: {imageName}
        build: {imageFileName}
        ports: 
            - '3000:3000'
        volumes:
            - '.:/product-file'
        tty: true
        stdin_open: true

```
tty:true →　-t
stdin_open: true → -i
両方指定することで -itと同じ状態になる
volumes
コンテナに共有するディレクトリを指定する。
コンテナ内に/product-fileを作成し、docker-compose.ymlより下の階層のファイルをそのままコンテナに反映する。
ファイル内容を変更しても、リアルタイムで反映される
実行するコマンド

```
docker-compose build
docker-compose up
docker-compose ps
docker-compose exec {docker-compose.ymlで指定したservice名（今回はweb）}
## volumeするディレクトリを間違えたなど、一度作ったコンテナを全削除したい場合
docker-compose down (stopしてrmする)
```

ここまでくれば対象のコンテナに指定したファイルがマウントされている状態になる。
docker-compose exec {アプリ名} bash で中身を確認すると、そのファイルが存在している.

ファイルはvolumeされているので同期されるが、一度サーバーを立ち上げるなどをすると、htmlなどが動的に生成されるようには行かないので、改めて立ち上げ直す必要がある。

CICD環境を構築することで、gitにpushした時に改めて更新してくれるようにできるハズ。
【JS】returnについて説明してみた

#returnとは？

>・関数内で処理をした結果を「戻り値」として返す。
・関数の実行を終了して、呼び出し元に返す値を指定する

>戻り値には、
数値、文字列、真偽値、配列、オブジェクト
などが指定できます。
[JavaScriptでreturnを使って関数から値を返す方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/24011)

>JavaScriptでの『return文』の98%くらいは『関数の処理を停止するため』に書かれている

#returnを使う意味って？

####【returnなしの場合】

```sample.js
function sample() {
 
    // ①処理のみを記述

}
```

```
undefined
```

・```処理```のみ

関数内で処理を行って終了になる。

関数の呼び出した後→戻り値が見つからないので```undefined```を返す

####【return使うの場合】

```sample.js
function sample() {
 
    // ①処理を記述
    //　↓
    // ②return 戻り値; (結果を返す)

}

const samp = sample();
```

・```処理```→```結果返す```

処理の結果を返すことが出来る。
そのため、処理結果を別の処理で使い回すことが出来る。

・```sample()```で、関数の呼び出しを。
・```定数samp```には、呼び出した後に、returnで返した値を格納しています。

#console.log()との違い

・```console.log()```

console.log()は、そもそもどういったときに使うのか？

**デバックや、情報の出力を行う時**に使います。

・```return```

対して、returnは、**処理結果を返します。**

###似たような意味だが、違いは？

データを提示すると言った意味では、同じです。

簡単にすると、

・```console.log()```は、データの情報を表示して確認するためのモノ。

・```return```：プログラムを結果として返す処理。

ですかね？（間違っていたらすみません）

#訂正
コメント（@felisさん）より

・returnが返すものは、**『値』そのものではなく、関数の呼び出した場所に戻すという『動作』**
・```return 返り値;```：returnの後ろに記述されているのが、その結果として返ってきた返り値。

#参考
[【JavaScript入門】returnの使い方と戻り値・falseのまとめ！](https://www.sejuku.net/blog/28728#:~:text=%E3%80%8Creturn%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%80%81,%E3%81%93%E3%81%A8%E3%81%8C%E5%87%BA%E6%9D%A5%E3%82%8B%E3%82%8F%E3%81%91%E3%81%A7%E3%81%99%E3%80%82)

[関数から呼び出し元へ値を返す](https://www.javadrive.jp/javascript/function/index4.html)