OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 新しいソフトをインストールしたいけど、Cドライブが容量不足！じゃあDドライブにインストールしよう！

# 背景

Oculus Quest2とOculus Linkを試すために、Oculusソフトウェアのインストールが必要なのですが、Cドライブの空きが15GB足りませんと。

いつもならデータ削除で対応していましたが、Dドライブにインストールする方法がわかったので共有します。

# 手順
ここに書いてありました...! 以下抜粋です
https://support.oculus.com/1142129705828091/

こちら、DownloadフォルダにあるOculusSetup.exeを実行する場合です。

1. Windows key> + Rを押し、[ファイル名を指定して実行]を開きます。
2. 次のパスを入力します。[drive]:\Users\USERNAME\Downloads\OculusSetup.exe /drive=[new system drive]
3. 例: C:\Users\USERNAME\Downloads\OculusSetup.exe /drive=D

# 結果

無事インストールできました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/e37471ae-0935-b3d2-4b24-f39408a8f87c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/ca70b4ac-a266-bf4b-f3bc-06ed27df845d.png)
バックアップの種類

## 種類について

バックアップの種類は以下の4つがある

- フルバックアップ
- 差分バックアップ
- 増分バックアップ
- 永久増分バックアップ

## フルバックアップ

すべてのデータをバックアップすること

### メリット

- リストアする際に1つのデータでよいので簡潔で時間も短い

### デメリット

- フルバックアップとは「すべてバックアップ取る」ということなので、バックアップに時間がかかる
- 世代管理をする場合には、バックアップ容量が大きくなる

### 図解

![フルプレゼンテーション1 - PowerPoint 2020-11-05 23.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/cffa9cb1-2023-1445-156c-9dd062eec10f.png)


## 差分バックアップ

前回からのフルバックアップからの `更新分` をバックアップすること

### メリット

- リストアする際はフルバックアップ+最新の差分バックアップを入れるだけで良いので簡潔

### デメリット

- フルバックアップからの差分データが増えるとバックアップ時間や容量が増える

### 図解

![差分プレゼンテーション1 - PowerPoint 2020-11-05 23.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/bf4272f0-b5a4-ebc5-1110-8ca78c65ac73.png)


## 増分バックアップ

前回バックアップからの `差分` をバックアップすること

### メリット

- 前回バックアップからの差分なので、バックアップ時間やバックアップ容量が少ない

### デメリット

- リストア時は、フルバックアップ+増分*nのバックアップが必要になるので
	- リストアの時間がかかる
	- 増分のバックアップのどれかが失敗していたらリストアが出来ない

## 図解

![増分プレゼンテーション1 - PowerPoint 2020-11-05 23.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/91146d7c-e02e-7051-46b0-339275130cd1.png)


## 永久増分バックアップ

前回のフルバックアップ+増分*nでフルバックアップを合成させることでフルバックアップの世代を更新する

### メリット

- フルバックアップを取る必要がない
- 増分だけのバックアップだけでよいのでバックアップ時間も短縮でき、データ容量も少なくなる

### デメリット

- 合成処理を入れる必要があり、時間がかかる可能性が有る
- 出来る対象の製品が限定される可能性がある

### 図解

![永久増分プレゼンテーション1 - PowerPoint 2020-11-05 23.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/63ef1d9a-820e-281c-2321-b8420abbf277.png)


## 参考

- [バックアップの種類](https://www.networld.co.jp/sp/learn_first/backup/1st/p20_23.html)
- [バックアップの「基本」から「最新技術」早分かりガイド](https://jpn.nec.com/backup/bksw_guidebook.html)
[aws] terraform インスタンスの作成

## 概要

AWSの環境を作成する上で普段は`CloudFormation`を使用していましたが、`terraform`を使用したことがなかったので、本記事でインスタンスの作成まで行い動作確認をしようと思います。

## 環境

* MacOS

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.2
BuildVersion:	19C57
```

## terraformとは


`terraform`とは`CloudFormation`と同じ、インフラストラクチャを安全かつ効率的に管理するためのツールです。
コードは`HCL`という`HashiCorp`社が設計した言語で実装されています。

## 事前準備

awsアカウントを作成し、IAMユーザでアクセスキー、シークレットキーを予め作成します。
本手順はここでは割愛します。

`Homebrew`を使用し、`terraform`をインストールします。

```
$ brew install terraform
$ terraform version
Terraform v0.13.5
```

環境変数にアクセスキー、シークレットキーなどの設定を行います。
実際の値は各自の環境に合わせてください。
アクセスキー・シークレットキーは流出しないよう注意する必要があります。

```
$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx
$ export AWS_DEFAULT_REGION=ap-northeast-1
```

その後`aws-cli`コマンドを叩き、自分のawsアカウントが表示されるか確認を行います。

```
$ aws sts get-caller-identity --query Account --output text
```

## terraform インスタンスの作成

`tf`ファイルを作成し、インスタンスを一つ作成する定義を行います。

```main.tf
resource "aws_instance" "example"{
  ami = "ami-0c3fd0f5d33134a76"
  instance_type = "t3.micro"
}
```

上記コード作成後、`terraform init`コマンドを実行します。
`Terraform has been successfully initialized!`と出力されれば成功です。

```
$ terraform init
Initializing the backend...

Terraform has been successfully initialized!
```

次に、`terraform plan`コマンドを実行します。
本コマンドは後に変更となるリソース情報などを教えてくれます。

```
$ terraform plan
```

`terraform apply`コマンドで環境のデプロイを行います。
`terraform plan`で実行した内容が再度表示され、`Enter a value`と聞かれるので`yes`と入力するとリソース作成が実行されます。

```
$ terraform apply
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes
```

AWSコンソール画面でインスタンスが作成されていることが確認できます。

## インスタンスの編集

上記で作成したインスタンスにタグ付けを行います。
`tf`ファイルを以下の様に編集後、`terraform apply`を実行します。

```
resource "aws_instance" "example"{
  ami = "ami-0c3fd0f5d33134a76"
  instance_type = "t3.micro"

  tags = {
    Name = "example"
  }
}
```

```
$ terraform apply
  # aws_instance.example will be updated in-place
      ~ tags                         = {
          + "Name" = "example"
        }
```

AWSコンソール画面でインスタンスにタグが付与されていることを確認できます。

## インスタンスの削除

terraformで作成した環境は`terraform destoroy`コマンドで環境の削除を行うことが可能です。
`Do you really want to destroy all resources?`と聞かれるため、`yes`と入力します。

```
$ terraform destroy

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes
```

AWSコンソール画面で今回作成した環境が削除されていることを確認できます。
Go Quiz: 未使用変数

以下のコードはコンパイル可能でしょうか?

```go
package main

func main() {
    i := 0
    i++
}
```

1. コンパイルできる
2. コンパイルできない

<details><summary>回答と解説</summary>
正解は「1. コンパイルできる」です。普通未使用変数が存在するとコンパイルが出来ないのですが、 `++` 演算子が使われていると「使用された」と見なされるようです。ここらへんの挙動はスペックには明記されていません (見逃していたらごめんなさい)。余談ですが、変数名を `_` に置き換えたとして `_++` はコンパイルが通りません。他 `i += 1` も同様に `i` を使用したと見なされますが、 `_ += 1` はコンパイルが通りません。変数の使用判定は、おそらく `_` の使用可否と一緒なのではないかと思われます。
</details>

追記: [未使用変数の振る舞いについては仕様では定義されておらず](https://golang.org/ref/spec#Function_declarations)、これは現コンパイラの実装を問う問題になってしまっています。そういう意味ではあまり良くない問題でした。失礼いたしました。 @DQNEO さんありがとうございます。
Go Quiz: len と定数

以下のコードはコンパイル可能でしょうか?

```go
package main

func main() {
    foo := [2]int{1, 2}
    const foolen = len(foo)
    println(foolen)
}
```

1. コンパイルできる
2. コンパイルできない

<details><summary>回答と解説</summary>
正解は「1. コンパイルできる」です。定数値はコンパイル時に決まる値のみが使えます (コンパイル時に決まるにも関わらず使えない例もあります)。配列に対する `len` 関数の結果はコンパイル時に決まり、また定数値に使えるようです。もちろん、配列ではなくスライスに対する `len` 関数の結果は、コンパイル時には決まらないので使えません。ちなみにですが、今後定数に使える値が Go 1.x の間に増えるかと言うと微妙で、後方互換性の問題 (<a href="https://github.com/golang/go/issues/28591#issuecomment-602158902">例</a>) もあり、なかなか難しいと思われます。
</details>
Go Quiz: math.Pow と NaN

以下のコードを実行するとどうなるでしょうか?

```go
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pow(math.NaN(), 0))
}
```

1. `0` が出力される
2. `1` が出力される
3. `NaN` が出力される
4. panic になる

<details><summary>回答と解説</summary>
答えは「2. `1` が出力される」です。 <a href="https://golang.org/pkg/math/#Pow">math.Pow の定義</a> (`Pow(x, ±0) = 1 for any x`) に従ってそうなっています。大抵の数学関数は `NaN` を引数に与えると `NaN` が返ってくるのですが、これは特殊なケースのようです。ちなみにこれは <a href="https://en.wikipedia.org/wiki/NaN#Function_definition">IEEE754-2008 でも定義されている</a>もののようです。
</details>
Rails6(Cloud9+Ubuntu)+MySQLでherokuデプロイ

1 Heroku CLI Download and install

```
$ sudo curl https://cli-assets.heroku.com/install-ubuntu.sh | sh

$ heroku --version
```

2 Heroku ログイン
※クレジットカードを登録したアカウント

```
$ cd appname
$ heroku login --interactive
# メールアドレスとパスワードを求められるので、入力しエンターをクリック
Enter your Heroku credentials:
Email: test@test.com
Password: *********
```
3 次に鍵をHerokuに追加します。

```
heroku keys:add
```

4 Herokuにアップロードしますか？と聞かれるのでyを入力する

```
? Would you like to upload it to Heroku? (Y/n)

#すると以下のようなコードが出てきたら成功です。
Uploading /home/ec2-user/.ssh/id_rsa.pub SSH key... done
```

5 heroku アプリ作成

```
$ heroku create appname
```

6 ※heroku DB設定
igniteプラン(無料)で作成


```
$ heroku addons:create cleardb:ignite --app appname
```

7 ※環境変数設定

```
$ heroku config 
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true

##各項目を書き換えて変数を設定
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'

 ※ ##もう一度 heroku configをして、DATABAS_URL、CLEARDB_DATABASE_URLの始まりがmysql2で始まっているか確認

#謝り例
CLEARDB_DATABASE_URL:     mysql://b60b5336b9085d:754f140c@us-cdbr-iron-east-05.cleardb.net/heroku_f69d4fc63e3b43f?reconnect=true
DB_HOSTNAME:              us-cdbr-iron-east-05.cleardb.net
DB_NAME:                  heroku_f69d4fc63e3b43f
DB_PASSWORD:              754f140c
DB_PORT:                  3306
DB_USERNAME:              b60b5336b9085d
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          0d58d7c950379d4bfe741b3ae465b46aaa159ae398c2aaaea5010ae2d817b308a90a7d4702e6281ad609c94de1acf03cb50c1e39d21d9e66af636d812f2e823

※正常な例
CLEARDB_DATABASE_URL:     mysql2://b60b5336b9085d:754f140c@us-cdbr-iron-east-05.cleardb.net/heroku_f69d4fc63e3b43f?reconnect=true
DB_HOSTNAME:              us-cdbr-iron-east-05.cleardb.net
DB_NAME:                  heroku_f69d4fc63e3b43f
DB_PASSWORD:              754f140c
DB_PORT:                  3306
DB_USERNAME:              b60b5336b9085d
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          0d58d7c950379d4bfe741b3ae465b46aaa159ae398c2aaaea5010ae2d817b308a90a7d4702e6281ad609c94de1acf03cb50c1e39d21d9e66af636d812f2e823f
```

8  config/environments/production.rbを修正(追記)

```
config.assets.compile = true
config.assets.initialize_on_precompile=false
```


9 herokuへデプロイ

```
$ git init
$ git add -A
$ git commit -m "first"
$ git push heroku master

$ heroku run rake db:migrate
#seedも更新する場合は
$ heroku run rake db:seed
```
Go Quiz: map

以下のコードを実行すると何が出力されるでしょうか?

```go
package main

import (
	"fmt"
	"math"
)

func main() {
	a := map[float64]int{}
	a[math.Acos(8)] = 1
	a[math.Acos(8)] = 2
	a[math.Acos(8)] = 3
	i := 0
	for range a {
		i++
	}
	fmt.Println(i)
	fmt.Println(len(a))
}
```

1. `1` と `1`
2. `1` と `3`
3. `3` と `1`
4. `3` と `3`

<details><summary>回答と解説</summary>
「4. `3` と `3`」が正解です。`math.Acos(8)` の結果は NaN (Not a Number) です。 `NaN` は特殊な浮動小数点の値で、どの値と `==` で比較しても、たとえ NaN 同士での比較でも、 false になります。 map のキーに NaN を指定すると、その値は過去に指定されたどのキーとも違う扱いになるので、毎度新しい値として代入されます。よって 3 回 NaN をキーにして値を代入した map は for-range ループは 3 回回りますし、 `len` 関数に対しても 3 を返します。よってどちらも `3` が表示されます。ちなみに、キーを NaN にした値は取り出せなくなります。たとえば一通り代入が終わったあとで `v, ok := a[math.Acos(8)]` とやっても、 `v` と `ok` は `0` と `false` になります。しかしながら蓄えた値は確かに存在していて、 `len` 関数の結果や `fmt.Printf("%v\n", a)` の結果でわかります。それにも関わらず取り出せない、ブラックホールのような状態になっているわけです。
</details>
ローラン展開をして特異点の種類を見分ける方法

#方法を文章で
特異点を$z_0$とする。
まず$z_0$でローラン展開をする。
###①途中で分母からzが消えた
#####(1)極
第１項が1/z^nのとき
$z=z_0$で$n$位の**極**
↓↓そうではないとき(2)へ
#####(2)除去可能特異点
```math
\lim _{z\rightarrow z_{0}}f\left( z\right) =aを計算する
```

```math
f_{1}\left( z\right) =\begin{cases}f\left( z\right) \left( z\neq 0\right) \\ a\left( z=0\right) \end{cases}
```
とおける。
これは**除去可能特異点**であり特異点での値を$a$とすれば正則になる。

###②分母にずっとzがある
#####真性特異点

~~あいまいなので間違っていたら教えてください~~
【Route 53】DNSとは

## DNS とは
**Domain Name System** の略
FQDNをキーに、対応するIPアドレスなどの情報を取得する仕組み

- DNSから情報取得することを **名前解決** という
- 各ネームサーバが管理する名前空間を **ゾーン** という

**ホスト名**：サーバーや端末に付けられた名前
（例）www1 → 一意に識別されることを前提としていない

**FQDN （完全修飾ドメイン名）**：サブドメインからトップレベルドメインまで完全に指定されたホスト名
（例）www1.sub.example.com. → 特定のドメイン名空間に置いて、一意に識別可能

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/825ac352-6a39-bbff-db93-e40c598a450d.png">

## DNS サーバー
以下4つの機能を総称したもの
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/c2a87184-7b63-e90b-72a0-bd085276ba2c.png">

### 1. ネームサーバー / Name Server
- ルートを起点に全てのFQDNを探索できるように構成された分散データベース、及びそれを成す各ネームサーバー
- 権威DNSサーバーと表現される場合もある

### 2. フルサービスリゾルバー / Full Service Resolver
- ルートから順にネームサーバーに問い合わせ、得られた回答を問い合わせ元に返すリゾルバー
- 効率化のため、所定の期間キャッシュを保持する（期間は設定によって変わる）

### 3. スタブリゾルバー / Stub Resolver
- OSに組み込まれたDNSクライアント
- 反復問い合わせの機能を持たないため常に再帰的問い合わせを行う
- キャッシュ保持の有無は実装に依存
- 複数DNSサーバーに対し、ドメインごとに振り分けたり同時に利用したりする機能は有さない

### 4. フォワーダー / Forwarder
- 受け取ったリクエストをルールに基づいて中継・ドメインごとに転送する
- 反復問い合わせの機能を持たないため常に再帰的問い合わせを行う
- 効率化のため、所定の期間キャッシュを保持する（期間は設定によって変わる）

## 名前解決の問い合わせ
**再帰的問い合わせ**：問い合わせ先に反復問い合わせを依頼する問い合わせ
**反復問い合わせ**：自らがネームサーバーを辿る際に行う問い合わせ
【自分用】コマンドプロンプトの頻出コマンド(Windows版)

# はじめに

gitのとあるUdemy講座で、Mac版のターミナルでの頻出コマンドはまとめらているのにWindowsはなかったので自分用にコマンドプロンプトの頻出コマンドについてまとめました。
まだまだ情報不足なのでこの記事は適宜編集して改良していくと思います。
~~今後、この記事の存在自体を忘れる可能性あり~~

# cdコマンド

ディレクトリを移動します。

# pwdコマンド

現在の作業ディレクトリの絶対パスを表示します。

# dirコマンド

ディレクトリの内容を表示します。 ls -a コマンドで、隠しファイルを含めたディレクトリ全内容を表示します。

# mkdirコマンド

ディレクトリを新規作成します。

# rmコマンド

ファイルを削除します。

# cpコマンド

ファイルをコピーします。

# mvコマンド

ファイルの移動とファイル名の変更を行います。

# typeコマンド

ファイルの中身を表示します。

--あとで追記--
https://win.just4fun.biz/?%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA0%E3%81%AE%E7%A9%BA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95
[PHP] Basic認証

UdemyにてBasic認証のアウトプット投稿をしたいと思います。

#Basic認証とは

Web上で利用できる認証システムです。
基本的にはIDとpasswordを入力することで、ログインすることができます。
`セキュリティのレベルとしては非常に低いもの`になります。
あくまでも取り急ぎの認証であることを忘れないようにしましょう。

#記述の仕方

```php:test.php
<?php
//パスワードを記録したファイルの場所
echo __FILE__;
// /Applications/MAMP/htdocs/php_test/mainte/test.php

echo '<br>';
//パスワード(暗号化)
echo(password_hash('好きなパスワードを入力', PASSWORD_BCRYPT));

?>
```

#解説
`echo __FILE__;` パスワードを記録したファイルの場所を指定します。

`password_hash()`でパスワードを作成するメソッドになります。

`PASSWORD_BCRYPT` アルゴリズムを使ってハッシュを作ります。
これは標準の crypt() 互換のハッシュで、識別子 "$2y$" を使った場合の結果を作ります。
 その結果は、常に 60 文字の文字列になります。失敗した場合に FALSE を返します。
基本的にはこちらを使うみたいです
詳細は
https://www.php.net/manual/ja/function.password-hash


#隠しファイルを作成
ファイルを2種類作成します。
ドットを先頭に付けることにより隠しファイルとして認識されます。
`.htaccess`と`.htpasswd`を作成します

```php:.htaccess
AuthType Basic
AuthName "IDとパスワードを入力して下さい"
AuthUserFile /Applications/MAMP/htdocs/php_test/mainte/.htaccess
require valid-user
//こちらは改行は必須になります
```

```php:.htpasswd
admin:パスワードの暗号化したものをコピペ
//こちらも改行は必須になります
```

#解説 .htaccess

`AuthType Basic` これでBasic認証を宣言するという意味です。

`AuthName "IDとパスワードを入力して下さい" `ログイン画面に表示させます

`AuthUserFile /Applications/MAMP/htdocs/php_test/mainte/.htaccess`
隠しファイルの場所をディレクトリで指定します。

`require valid-user`　現在ログインしているユーザーに許可をします

`空白で良いので最後に改行を忘れずに!!`


#解説 .htpasswd
`admin:` こちらはIDを決めます。もちろん自分の好きなIDでOKです。`「：」コロンも忘れずに!`

`パスワードの暗号化したものをコピペ`  こちらはtest.phpで決めたパスワードになります。
英数字の羅列になりますがlocal8080等々で呼び出したら出てきます。それをコピペします。

`最後にこちらも空白で良いので最後に改行を忘れずに!!`

以上となります。
WEBアプリとネイティブアプリについて

##アプリの種類
`WEBアプリ`＝`Webサーバー上で動いている`アプリ。
　　　　　　（Gmail、YouTube、Skypeなど。）
`ネイティブアプリ`＝基本的に`端末上のシステムを使って動く`アプリ。
              　　　　　　　　　(Office、LINE、電卓やメモなど)
`ハイブリットアプリ`＝HTML、CSS、JavaScriptなどの`Web技術で開発していて`、
　　　　　　　　　且つカメラやGPSなどのデバイスの`ネイティブ機能を利用しているアプリ`。
　　　　　　　　　(Amazon、ZOOM、Twitterなど)

##各メリットとデメリット
`WEBアプリ`
メリット：コストを抑えられる、サーバーで一元管理出来てすぐ更新が可能、アプリ配布なしなど。
デメリット：スマホのカメラ機能、GPS機能、プッシュ通知機能などのネイティブ機能が使えないなど。
`ネイティブアプリ`
メリット：WEBアプリより動作が早く、操作しやすい、カメラや位置情報など、端末の機能と柔軟に連携できるなど。
デメリット：リリースまでにアプリストアの運営会社の審査が入る、コストがかかる、ユーザーのストレージ容量を圧迫するなど。
`ハイブリットアプリ`
メリット：Webで表示する仕組みとなっている為OSによる影響を受けにくい、アプリの内容を変えるときもサーバ側のみ変更すれば良い為、メンテナンスが容易。
デメリット：Web通信が求められる為ネイティブアプリよりも動作が重い、フレームワークを使用して開発する為細かい変更がしにくい。

参考元はこちら
WEBアプリ：(https://pantograph.co.jp/blog/production/web-app.html)
ネイティブアプリ：(https://emeao.jp/guide/appli/appli-knowlege/post-3337/)
ハイブリットアプリ：(https://yapp.li/magazine/3190/)
Ruby TGIFを解く

#rubyでTGIFを解く
#問題
TGIFとは、Thank God It's Friday の頭文字を取ったもので、

キリスト教の文化圏において、仕事や学校の長い一週間を終えて週末を迎えられることに感謝する言葉です。

入力として、平日の曜日が与えられるので、
・Monday, Tuesday, Wednesday, Thursday であれば、Still (曜日名)
・Friday であれば、TGIF
を出力してください。
#入力される値
入力は以下のフォーマットで与えられます

s
#期待する出力
入力として与えられた曜日が、
・Monday, Tuesday, Wednesday, Thursday のいずれかであれば、Still (曜日名)
・Friday であれば、TGIF
を出力してください。
#入力例1
Monday
#出力例1
Still Monday
#入力例2
Friday
#出力例2
TGIF
#私の答え
```java:
w = gets.to_s
if w == "Monday" || w == "Tuesday" || w == "Wednesday" || w== "Thursday"
    puts "Still" + w.sub("", " ")
elsif w == "Friday"
    puts "TGIF"
end
```
##解説
###1行目で文字列を取得。
###2行目でif文を用いて取得した文字列と「イコール」の関係になるならばというコードを作成。「| |」はor文なので「もしくは」という意味。
###3行目でputsで出力する訳ですが、今回は出力した結果に取得した結果をくっつけないといけないので「+」で連結。かつ、このままだとスペースがないまま「StillMonday」という感じでギチギチになってしまうのでsubメソッドを用いて「""」を「" "」にするとスペースが空きます。
###4行目でelsifを用いて「金曜日だった場合」を作成しないといけないので「イコール」で"Friday"にしています。
###5行目でputsで"Friday"がイコールだった場合"TGIF"が出力されます。
#今回のポイントはおそらく<font color="Red">subメソッド</font>だったかなと思います。他にもgsubというメソッドもあり、subメソッドはピンポイントで変更する事が可能ですが、gsubメソッドは全てを変更する事が可能なので応用としてかなり使えます！
#以上！
シェルスクリプトのイディオムいろいろ

# 目的

シェルスクリプトを書く際に、毎回調べていることを備忘録としてメモしていく。

## カレントディレクトリのパスを取得したい


```bash
CURRENT=$(cd $(dirname $0); pwd)
```
(コマンド例の引用元: [ajisaba.net](http://www.ajisaba.net/sh/get_dir.html))

#### [参考] $( )について

ドル丸括弧 \$( )はシェルスクリプトの構文で、コマンドのグルーピングと呼ばれる機能。
\$( )は内部的にForkシステムコールを発行することになり、括弧内のコマンド郡を子プロセスにて処理が実行される。
子プロセスなため、環境変数は呼び出し元スクリプト(親プロセス)のモノを引き継ぐが、
子プロセス側で書き換えた環境変数は親プロセス側には影響しない。

```
meruneru@MacBook-Pro:~$ printenv
...
PWD=/Users/meruneru
...
meruneru@MacBook-Pro:~$ $(cd ..)　#呼び出しに影響しないため、PWDは変更されない
meruneru@MacBook-Pro:~$ 
```


## ディレクトリを移動->特定のコマンド実行->元のパスへ戻りたい

ドル丸括弧 \$( )は呼び出し元スクリプトの環境変数に影響を与えないという性質を利用すればいい。


```bash
cd $HOME
$(cd ~/works/example_program/; make)
...  # カレントディレクトリは$HOME
```

## カレントディレクトリのフォルダを任意の場所へ移動する

```find``` のdepthオプションで階層指定ができる。
```grep``` のvオプションはマッチしたもの以外を表示でき、Eオプションで正規表現が指定できる。
```xargs -I{}``` でxargsで受け取った文字列を任意の場所に埋め込める。

```bash
$ find . -type d  -depth 1 | grep -v -E ".git|.vscode"  | xargs -I{} mv {} ./old
```
CircleCIでToo long with no output (exceeded 10m0s)というエラーが出たときの解決方法

CircleCIを実行したら以下のようなエラーがでました。
（当時のログを探すのに少し時間がかかるため、commandの部分は完全再現してません）

```
$ bundle exec rspec spec/

# Too long with no output (exceeded 10m0s)
```

デフォルトの無出力タイムアウト時間は10分に設定されており、これをこえてしまったためビルドが取り消されてしまったようです。

僕の場合は、なんらかが原因でRSpecの実行時間が10分超えてしまい、CIが停止してしまっていました。
（通常は1分半とかでおわります。）

```yml:.circleci/config.yml

 - run:
          name: run rspec
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
              circleci tests split --split-by=timings)"
            bundle exec rspec \
              --format progress \
              --format RspecJunitFormatter \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES
          no_output_timeout: 15m
```

このように、 no_output_timeoutパラメーターを記述することでデフォルトの設定を変更できます。
上の例では15分です。

例えばですが、サービスの規模が大きくなってきてRSpecのテスト実行時間が長くなったりしたら変えてあげる必要がありそうですね。（テストで10分かかるぐらい自分の作ったサービスがスケールできたらいいなぁ、、）

因みに余談ですが、現在CircleCIの無料ビルド時間枠は1000分らしいです。（前は1500分だったらしい）
一日約33分ビルドに使える計算なので、個人開発なら余裕だろと思ってました。しかし、先月、本番環境のエラーで詰まったりしてやたらにビルドしまくってたら無料枠使い切ってしまいました、、

ローカルでは通るのに、CIでは通らないテストをトライ&エラーしまくったのも原因だと思います。

1000分って意外と余裕ないですね、、

あまり無駄遣いしないようにしていこうと思いました。。

#参考
[circleci Support](https://support.circleci.com/hc/ja/articles/360007188574-%E3%83%93%E3%83%AB%E3%83%89%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%82%E3%82%8B%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%83%AA%E3%83%9F%E3%83%83%E3%83%88%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%A0%B4%E5%90%88)

# 最後まで読んでいただきありがとうございます！
なにかご指摘などあればコメントいただけますと嬉しいです！
大量のMIDIからGeneral MIDIデータを検出する

# TL;DR
* GM, GS, XGのMIDIのデータをチェックするスクリプト
* SysExを見て判別する
* jupyter labを使いつつも、関数は.pyで書きたい。

# General MIDIって？

> General MIDI（ジェネラル・ミディ）とは、基本的な音色マップとコントロールチェンジなどを規定したMIDIの統一規格である。略称はGM。   
(wikipediaより　https://ja.wikipedia.org/wiki/General_MIDI）

で、この規格をローランドが準拠して拡張したのがGS、ヤマハが拡張したのがXGです。当時はRolandのSCシリーズが一番この手の音源で売れていたので、かなり多くのGSのデータがニフティのフォーラムなどで配布されていました。懐かしい、、、

# そんなMIDIファイルが2020年に欲しい

と言うことになり、redditのこちらのページ（ https://www.reddit.com/r/WeAreTheMusicMakers/comments/3ajwe4/the_largest_midi_collection_on_the_internet/ )にある13万曲の中からGM, GS, XGのデータを探すスクリプトを作ってみました。

# どうやって探すか？

GM, GS, XGのデータの場合、SysExでそのデバイスの設定をする情報が含まれている、ことが多いので（ちゃんとそれらのデバイス用にデータを作っていれば、ですが）midiデータの中からSysExをみて判断すればいい、と言う方針で作ってみました。

# SysExとは？

System Exclusive(システム エクスクルーシブ）の略で、こちらのページ( https://www.g200kg.com/jp/docs/dic/systemexclusive.html )では以下のように説明されています。

> MIDI のメッセージの種類のひとつであり、MIDIに共通な機能ではなく、その音源の機種固有のエフェクト等の機能を制御するために使用するメッセージである。

で、GM, GS, XGの何らかの機能を使っているMIDIデータであれば必ずそれに該当するSysExが含まれているはず、と言うことで各社のSysExを調べたところ、、、

|MIDIデータ規格の種類|System Exclusive|
| --- | --- |
|GM (General MIDI)|F0 7E xx 09|
|GS (ローランドのGM拡張)|F0 41 xx 42|
|XG (YamahaのGM拡張|F0 43 xx 4C|

と言うのがSysExの先頭に含まれていればそれぞれのメーカーの企画だ、と言えそうです。上記の表は、F0がSysExの先頭を示しています。次がメーカーID、xxはデバイスID（機器固有のID)、最後がモデルIDになる（ローランドのGSの聞きならモデルID42のようなのでそれでGS音源を判別できる）ので、それを利用します。

# スクリプトについて

* 実際のスクリプトはこちらのレポジトリ＞https://github.com/dropcontrol/practice_mido

Pythonでmidiを扱うのにmido( https://mido.readthedocs.io/en/latest/# )と言うライブラリがあるので、それを使っています。それの習熟も兼ねてたのがレポジトリ名でバレバレですね。midoはちゃんとメンテナンスされている（大事）し、機能的にもいろいろできるので、midiのハンドリングにはもってこいだと思います。

`GMMidiCheck.ipynb`と言うファイルがその実行結果になっています。書いてる時に友人に「.py で書けばCIでテストも回せていいですよ」と言われて、それもそうだな、、、と思って関数は全部`midi_utill.py `に書いてあります（結局まだテストは書けてませんが、、、）。そのため.jpynbの各セルで

```
importlib.reload(midi_utill)
```

で、`midi_utill.py`をリロードしています。で、この処理のポイントはMIDIファイルのSysExを比較しないとならないので、以下の関数でmidiを全部hexに変換した上で比較しています。

```
def getMidiHexData(midifilename):
    import mido
    midi = mido.MidiFile(midifilename)
    MidiData = []
    for i in range(len(midi.tracks)):
        for msg in midi.tracks[i]:
#             print(msg.hex())
            MidiData.append(msg.hex())
    
    return MidiData
```

他にも、ファイルのハンドリングや、ディレクトリのハンドリングなどいろいろ勉強になったのですがそれはPython自体の話なので、割愛しますので興味のある人はスクリプトを読んでみてください。

ちなみに`GMMidiCheck.ipynb`の中で変数として下記の二つをよしなに指定してください。

* midiFileDir ... 判定したいMIDIファイルが入っているディレクトリ。ここに親ディレクトリを指定すれば、再帰的に全ての.midもしくは.MIDのファイルパスを取得します。
* GMMidiFileDir ... 判定してGM/GS/XGだと思われるSysEXが含まれているMIDIファイルをここに指定したディレクトリにコピーします。ディレクトリがなければ作成します。ファイル名が重複した場合は上書きされます。

一応redditのデータが`GMMidiCheck.ipynb`と同じディレクトリにあることを想定しています。同じく、GM準拠のデータだと判断されたデータも同じところにディレクトリを作って書き出すことを想定しています。

# 結果はどうなった？

13万曲の中で（あくまでこのスクリプトで）「GM, GS, XGのデータのようだ」と引っかかったのは33000曲でした。

これだけあれば機械学習の学習元データとしては充分ですよね。しかもGMだと音色情報が公開されているので、「ドラムやパーカッション」「単音楽器」「複音楽器」などをトラックから抜き出すことも可能です（しかもそれはGM準拠なのでコントロールチェンジの情報で確実に抜き出せる、はず。きっと）。

ちなみに13万曲調べるのに大体5時間位かかりますのでご利用は計画的に。
EC2をt2.microで立てたときにやることメモ

勉強用のEC2インスタンスを間違って停止ではなく終了してしまい、作り直すことがちょこちょこあるため、インスタンスを立ち上げたときにだいたいやることを備忘録として残しておく


# 各種最新化

```shell
sudo yum update -y 
```

# スワップメモリを増やす

t2microのようなメモリが少ないインスタンスの場合、Angularのprodビルドのようにメモリを多く使う処理で落ちてしまうため、スワップメモリを増やして回避します

```shell
# 4GBのスワップファイルを作成（メモリが少ないのでbsが多いと失敗する）
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
# スワップファイルに読み書き権限付与
sudo chmod 600 /swapfile
# スワップ領域のセットアップ
sudo mkswap /swapfile
# スワップ領域を有効化
sudo swapon /swapfile
# スワップ領域の確認
sudo swapon -s
```

参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/

swaponすると以下のように指定したサイズでファイルが作成されていることが確認できる

```shell
$ sudo swapon -s
Filename                                Type            Size    Used    Priority
/swapfile                               file            4194300 0       -2
```

freeコマンド実行すると、メモリとして認識されていることが確認できる

```shell
$ free
              total        used        free      shared  buff/cache   available
Mem:        1006940       82724       63424         404      860792      771392
Swap:       4194300           0     4194300
```

## スワップを起動時に有効にする

viで/etc/fstabを編集します

```shell
sudo vi /etc/fstab
```

末尾に以下の1行を追加して保存します

```
/swapfile swap swap defaults 0 0
```

# Gitのインストール

```shell
sudo yum install git-all -y
```

参考：https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB


## Gitのユーザー設定

```shell
git config --global user.name "username"
git config --global user.email xxxx@example.com
```

参考：https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90


# Dockerおよびdocker-composeのインストール


```shell
# dockerインストール
sudo yum install docker -y
# dockerサービス開始
sudo service docker start
# sudoなしでdockerコマンド使えるようにする設定
sudo usermod -a -G docker ec2-user
# dockerサービスが自動で起動するように設定
sudo systemctl enable docker
```

参考：https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html
 　　　http://docs.docker.jp/v1.11/engine/admin/systemd.html


## docker-composeのインストール

```shell
# バイナリのダウンロード
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose
```

参考：https://docs.docker.com/compose/install/


このままだと`PermissionError: [Errno 13] Permission denied`となるため、一旦EC2からexitして再接続する



# Node.jsのインストール

```shell
# インストーラのダウンロード&実行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
# nvm.sh実行
. ~/.nvm/nvm.sh
# Node.jsのインストール
nvm install node
```

参考：https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html
RHEL 8にRuby 2.7をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRHEL8にRuby 2.7をインストール
参考：[RHEL8のパッケージ構成 - BaseOSとApplication Stream - 赤帽エンジニアブログ]( https://rheb.hatenablog.com/entry/rhel8_baseos_and_appstream)
　　　[第4章 新機能 Red Hat Enterprise Linux 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/8.3_release_notes/new-features#enhancement_dynamic-programming-languages-web-and-database-servers)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portal](https://access.redhat.com/node/4079021)より、2023-05がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.3 (Ootpa)

# yum module install ruby:2.7
... 略
```

### 各種確認

```shell-session
# which ruby
/usr/bin/ruby

# ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
```
ルーティングのネストを使って、任意のURLにしてみた



##ルーティングのネストとは
　ルーティングを入れ子にすること。そうすることで、URLに親のコントローラー名を入れることができる。また、アソシエーションしている、別のモデルのid情報を取得することもできる。
個別のページに遷移させたい場合にネストするとよい。
##ネストのルーティング方法

```ruby：routes.rb
resources :親となるコントローラー do
    resources :子となるコントローラー
end
```
子となるコントローラーを`do〜end`で囲む。
```
ex)

```ruby

<%= link_to 'チャットルーム', class_room_messages_path(current_user.class_room.id) %>
```
RHEL 8にPHP 7.4, PHP-FPM 7.4をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRHEL8にPHP7.4をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[RHEL8のパッケージ構成 - BaseOSとApplication Stream - 赤帽エンジニアブログ]( https://rheb.hatenablog.com/entry/rhel8_baseos_and_appstream)
　　　[第4章 新機能 Red Hat Enterprise Linux 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/8.3_release_notes/new-features#enhancement_dynamic-programming-languages-web-and-database-servers)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portal](https://access.redhat.com/node/4079021)より、2029-05がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.3 (Ootpa)

# yum module install php:7.4
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.4.6 (cli) (built: May 12 2020 08:09:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# which php-fpm
/usr/sbin/php-fpm

# /usr/sbin/php-fpm -v
PHP 7.4.6 (fpm-fcgi) (built: May 12 2020 08:09:15)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```
RHEL 8にPerl 5.30をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRHEL8にPerl 5.30をインストール
参考：[RHEL8のパッケージ構成 - BaseOSとApplication Stream - 赤帽エンジニアブログ]( https://rheb.hatenablog.com/entry/rhel8_baseos_and_appstream)
　　　[第4章 新機能 Red Hat Enterprise Linux 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/8.3_release_notes/new-features#enhancement_dynamic-programming-languages-web-and-database-servers)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portal](https://access.redhat.com/node/4079021)より、2023-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

なんかエラーが出るのでうまくいってないかもしれない
よほどの事情がなければOS標準バージョンを使うのがいいか

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.3 (Ootpa)

# yum module install perl:5.30
... 略
```

### 各種確認

```shell-session
# which perl
/usr/bin/perl

# perl -V:version
version='5.30.1';
```
プログラミングスクールに通う前にすべきことについて

<h1>プログラミングスクールに通う前にすべきこと

<b>①Progateやドットインストールでプログラミングに触れてみる

プログラミング初学者がやるべきことはプログラミングがどんなものかをProgateやドットインストールのような初学者向けのサービスで体験することです。

個人的には環境構築という初学者がつまづきやすい部分をなくしている<b>Progate</b>が圧倒的にオススメです。

プログラミングのイメージもわかないうちにいきなりスクールで勉強するのではなく、プログラミングのイメージを掴んでもらう必要があります。

実際に、エンジニアに転職する前にどんな仕事をすることになるのかや、自分に向いてそうな仕事かなど、適性を事前にする判断する上でも重要なアクションだと思います。

※プログラミング以外にもお金を稼ぐ方法はいくらでもあるので、これは自分には無理そうと思った段階で方向転換すべきだと思います。<br><br>


<b>②progateやドットインストール、udemy等の初学者向けの教材でインプットをする。

①である程度プログラミングに触れて、勉強を頑張ろうと思えた方は初学者向けの教材を使って、インプットをしましょう。

学習する内容はどういうエンジニアになりたいかによって変わってくると思いますが、Web制作で稼ぎたい人やフロントエンドエンジニアになりたい人はHTML, CSS, JavaScript, jQuery, Sass を勉強しましょう。

私自身、プログラミングスクールに通う前にHTML, CSS, JavaScript, jQuery, Sassを独学していた時期があったのですが、ここでの学びのおかげでスクールの教材も割とスムーズに進めることができました。


スクールの教材に関して、本当に最初の部分は基本的なインプットが多いですが、ある程度しっかりしたポートフォリオを作成できるようになることを多くのスクールは目指しているため、途中からアウトプットの機会が多くなって、難易度がだいぶ上がります。

<b>前提知識なしでいきなりスクールでの勉強を始めるのではなく、安価な教材でのインプットを行ってからスクールでの学習を始めるようにしましょう！</b>

※ここでのインプットに関しては時間をかけすぎず、１ヶ月程度集中してやっった後にすぐにスクールで学ぶを意識してください。
<b>インプットをやっていてもプログラミングでWebサイトやアプリを作れるように永遠にならないです(私自身、このことに気づかず、インプットばかりやっていました)</b><br><br>


<b>③自分に合うスクールをリサーチする

プログラミングスクールは安くても10万程度は出費として発生するのでとりあえずスクールを適当に選んで通うというのは避けましょう。

ここ最近のエンジニア転職ブームでスクール業界の中では圧倒的な知名度を誇るテックアカデミーやテックキャンプ意外にも多くのスクールが乱立しています。

例えばスクールを通う際には以下の要素が判断基準になると思います。

①オフライン環境またはオンライン環境か

②金額

③転職サポートがついているか

④学べる言語があるか

⑤受講期間
※多くのスクールはメンターがつく期間に期限が設けられています。

他にも基準は色々あるとは思いますが、私が学習し始めた頃はこの辺を基準に選んでいました。

例えばですが、人によっては転職サポートが欲しいという意見やオフラインでの環境が必須という人もいると思うので、一概には言えないですが、それなりに高い金額を投資するのであれば、この辺は慎重になるべきです。

以上がプログラミングに通う前にすべきこととなります。<br>
今回の記事がこれからプログラミングスクールに通うか迷っている皆様の参考になれば幸いです。
MySQLのテーブルのカラム構造を変更する

### はじめに
SQL学習を始めるにあたって、備忘録として記しています

### テーブルのカラム構造を確認
`DESC テーブル名;`

### テーブルのカラム構造を変更
カラム構造を変更するときは、`ALTER TABLE`を使う
変更の種類によって以下のように使い分ける

- カラムのデータ型を変更するとき: `ALTER TABLE テーブル名 MODIFY カラム名 データ型;`
- カラムを追加するとき: `ALTER TABLE テーブル名 ADD カラム名 データ型;`
- カラムの名前と定義を変更するとき: `ALTER TABLE テーブル名 CHANGE 変更前カラム名 変更後カラム名 変更後データ型;`
- カラムを削除するとき: `ALTER TABLE テーブル名 DROP カラム名;`

**※注意**
「先頭が0になっていない、数値だけで構成されるデータ」では、多くの場合、「INT型」→「VARCHAR型」→「INT型」のような変更は可能。ただし、カラムにデータが存在する場合、基本的にデータ型変更は行うべきではない

### 主キーの設定

#### 一意(ユニーク)
データベースでは大量のレコードの中から、「条件にあった1つのレコードを特定する」ことが必要となる場面がある。こういった場面を想定して「必ず1つだけが特定できる」という唯一無二の状態を、**一意(ユニーク)**であるという

#### 主キー
ユニークなレコードを作る場合に用いるのが、**主キー(PRIMARY KEY)**である
主キーは厳密にレコードを特定できる次のようなカラムである

- 値の重複がない
- NULL値は許さない

`CREATE TABLE テーブル名 (カラム名 データ型 PRIMARY KEY...,);`
#### 一意キー

「重複はしない」かつ「NULLを入力できる」という制限を**一意キー(UNIQUEキー)**で設定できる

### 自動的に連続番号が入力されるカラムにする

#### 連続番号機能付きカラムの定義

次のような手順で設定する

1. データ型は「INT」などの整数型
2. 「AUTO_INCREMENT」をつける
3. 「PRIMARY KEY」などを設定して一意にする

#### 連続番号の初期化

`ALTER TABLE テーブル名 AUTO_INCREMENT=0;`
自分がコメント、メッセージした記事や取引のみ取得する方法【includes】

# はじめに
よくメルカリや、ジモティーなどと言ったフリマ要素のあるのサイトでは
マイページに自分が出品した取引一覧とは別に、
`やりとり中の取引一覧`がよく表示されていますよね

取引の度にブックマークするとなかなか面倒くさいので、
何気に重宝する機能なのではないでしょうか

今日はそれを実現するよう実装をしていきたいと思います

# モデル間の関係
![スクリーンショット 2020-11-06 20.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728987/30215029-7345-4923-0962-72005b1ef89e.png)

例のように記事(取引)をarticle、コメント(やりとり)をcomment、とし
各モデルは上記のようなアソシエーションにします。


``` user.rb
  has_many :articles
  has_many :comments
```

``` article.rb
  belongs_to :user
  has_many :comments
```


``` comment.rb
  belongs_to :user
  belongs_to :article
```

# 記事(取引)の取得

```application_controller.rb
  helper_method :current_user

  private
  
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id])
    end
  end
```

上記のようなログイン中のユーザーを返り値とするヘルパーメソッド`current_user`があるとしたうえで、
以下の`@article_commented_on`に自分がコメントした記事を取得していきます。

```home_controller.rb
  def mypage
    @article_commented_on = current_user.messages.includes(:article).map(&:article).uniq
  end
```

`current_user.messages`でユーザーが投稿したコメント全てを取得し、
`includes(:article)`でarticleとテーブル結合を行います。

そして`map(&:article)`にてarticleのみを抜き出した新たな配列に返し、
`uniq`（クエリー用のメソッドではない配列のメソッド）を実行し重複を消します。

こうすることで`@article_commented_on`には自分がコメントしたことのある記事のみを取得することができました。

`includes(:article)`でテーブル結合を行うことによって、
各messageに対応したarticleを取得する度に発生するDBへのアクセスを最低限に減らすことができます。

以上です、お疲れ様でした！
lsコマンドの実行結果のr:読取権限、w:書込権限、x:実行権限の具体的な事象について

lsコマンドの実行結果でファイルのパーミッションを確認できる。

ただ、r(4):読取権限、w(2):書込権限、x(1):実行権限と言われても、初心者のうちは具体的なイメージが持てなかった。

そこでメモ書き

```Mac:ターミナル
????????MacBook-ea:qwert hogehoge$ ls -l
total 4
drwxrwxrwx   4 ????????  staff  128 11  2 12:51 css
drwxrwxrwx  13 ????????  staff  416 11  2 12:51 images
-rwxrwxrwx@  1 ????????  staff  866 11  2 12:51 index.html
drwxrwxrwx   3 ????????  staff   96 11  2 12:51 js
```
 
■ r(4):読取権限   
catコマンドで中身を表示可能。
権限ないとcatで中身見れないし、viで開いても白紙で見ることできない
 
■ w(2):書込権限
viで編集可能。
権限ないとviで開いてもviで開いても白紙で見ることできない
 
■ x(1):実行権限
Mvでリネームや移動、またWinSCPなどのFTPソフトからダウンロードが可能になる


【参考】http://ilovelovemoney.blog.fc2.com/blog-entry-112.html
開発中のDockerコンテナアプリケーションをPC以外(スマホ)から接続して確認する

# はじめに
開発中に、Dockerで立ち上げたアプリケーションをローカルPC以外(スマホ)から確認する必要があったので、個人的メモも含めて記載
**※Windows環境での設定となります。**

# 接続準備
前提として、端末同士は同一ネットワークに繋がっている必要あり。
また、環境によっては、アンチウィルスソフトのファイアウォールなどを一時的に無効にする、特定のポートを許可するなどの設定を行う必要があります。
あらかじめ設定を行ったうえで、以下の手順を実行。

## 1.該当PCのIPを確認
ipconfigでIPアドレスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/439ea0d5-63a5-8e8d-3266-73fd778751ac.png)
Wi-Fi接続の場合

## 2.DockerアプリケーションのIPを確認
DockerアプリケーションのIPは環境によって様々[^1]ですが、今回はRailsアプリケーションに接続するため、起動コマンド`rails s -b 0.0.0.0`より、ポートフォワーディングする先も`0.0.0.0`となります。
(この場合、後述する4.ポートフォワーディング設定は不要です)
[^1]: docker-machineの場合は192.168.99.100がデフォルト

## 3.ファイアウォールの許可設定
先述した、アンチウィルスソフトのファイアウォール設定のほかに、Windows Defenderによるポートの許可を行います。
1.Windows Defender ファイアウォール設定画面を開き、新しい規則を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/6f8788ac-52ba-583c-baf6-81614a9cb2a2.png)

2.ポートを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/4042c8c4-562e-6f08-e8e8-5143f7c95d09.png)

3.TCPを選択して、特定のローカルポートここでは複数のアプリケーションを許可しているので3つのポートを指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/f98ede8e-3421-93f7-07f6-1adf7a9d262f.png)


4.接続を許可する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/839b8741-70ca-77dd-5103-1490129619b1.png)

5.ここでは、規則は全てを許可（状況によって変更してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/511fbf39-6483-a346-0075-d8602d2803a7.png)

6.名前を付けて保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/e61c0576-98db-ad68-2ac7-4a9fcb79d71f.png)

## 4.ポートフォワーディング設定
DockerのIPが特定のIPアドレスであった場合、スマホ=>PC=>Dockerコンテナへとポートフォワーディングする必要があるため、netshによる以下の設定を行います。
コマンドプロンプト管理者権限で開き、`netsh`コマンドを実行。
その後以下のコマンドを実行して、ポートフォワーディングを行います。
`interface portproxy add v4tov4 listenport=3000 listenaddress=192.168.11.6 connectport=3000 connectaddress=192.168.99.100`
上記は
`interface portproxy add v4tov4 listenport={ローカルPCのリッスンポート} listenaddress={ローカルPCのIPアドレス} connectport={Dockerのポート} connectaddress={DockerのIPアドレス}`
となります。
複数ある場合は、複数回実行。範囲指定の場合は`3000-3100`のように指定します。

設定内容を確認するには以下
`interface portproxy show v4tov4`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457889/093d14f1-eb81-f1ee-c828-ffd58f82baef.png)

消す場合は以下
`interface portproxy reset`

## 5.確認
Dockerコンテナを立ち上げた後、
`http://192.168.11.6:3000/`
をローカルPC以外で接続するとアプリケーションが見れると思います。

# まとめ

スマホ特有の挙動などをSTG環境に上げる手間なく、その場で確認できるのはメリットだと思うので、何かの参考になれば幸いです。

# 参考
https://gakuya.work/docker-for-windows-smartphone-access/
Swiftでソート条件を複数指定する 

並び替えの条件を2つ指定したい場合、どう書いたらいいのか小一時間ほど悩んでしまいました。
Qiitaには同じような記事がないし、何より「こんな感じで書けばいいのか！！」と感動してしまったので共有させてください。

~~~2つの条件でソートする.swift
import Foundation

// 体重と身長を保持する構造体
struct Person {
    let seq: Int
    let weight: Int
    let height: Int
    init(seq: Int, weight w: Int, height h: Int) {
        self.seq = seq
        self.weight = w
        self.height = h
    }
}

func sortTest() {
    // テストデータの作成
    // 人数
    let N = 10
    let w = [50, 42, 69, 80, 79, 81, 70, 53, 59, 50]
    let h = [184, 170, 170, 169, 193, 154, 147, 180 ,170, 171]
    let personDate = (0..<N).map {
        Person(seq: $0, weight: w[$0], height: h[$0])
    }
    
    print("＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿ソート前")
    _ = personDate.map {
        print("識別番号\($0.seq), 身長: \($0.height), 体重:\($0.weight)")
    }
    
    // 第一条件: 身長の低い順
    // 第二条件: 身長が同じであれば体重が軽い順に並び替える
    let sortedPersonDate = personDate.sorted {
        if $0.height == $1.height { return $0.weight < $1.weight }
        else {
            return $0.height < $1.height
        }
    }
    
    print("＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿ソート後")
    _ = sortedPersonDate.map {
        print("識別番号\($0.seq), 身長: \($0.height), 体重:\($0.weight)")
    }
}

~~~
~~~出力
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿ソート前
識別番号0, 身長: 184, 体重:50
識別番号1, 身長: 170, 体重:42
識別番号2, 身長: 170, 体重:69
識別番号3, 身長: 169, 体重:80
識別番号4, 身長: 193, 体重:79
識別番号5, 身長: 154, 体重:81
識別番号6, 身長: 147, 体重:70
識別番号7, 身長: 180, 体重:53
識別番号8, 身長: 170, 体重:59
識別番号9, 身長: 171, 体重:50
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿ソート後
識別番号6, 身長: 147, 体重:70
識別番号5, 身長: 154, 体重:81
識別番号3, 身長: 169, 体重:80
識別番号1, 身長: 170, 体重:42
識別番号8, 身長: 170, 体重:59
識別番号2, 身長: 170, 体重:69
識別番号9, 身長: 171, 体重:50
識別番号7, 身長: 180, 体重:53
識別番号0, 身長: 184, 体重:50
識別番号4, 身長: 193, 体重:79
~~~
node.jsのExpressを導入するときの手順メモAzure前提

# 概要

自分用の( ..)φメモメモ。
node.jsのexpressを新規に導入するときの手順。
AzureのWebAppで動かす前提で、TDD想定でsrcとtestフォルダに分けるものとする。
必要最小限。test側のモジュール導入は省略。


# 手順のメモ

`express-generator` はグローバルで導入済みとする。

※未導入の場合は以下で導入する。
```
npm install -g  express-generator 
```
※利用を終えて、気になるようなら本記事に記載の手順をすべて実行後に以下のコマンドでアンインストールする。
```
npm uninstall -g  express-generator 
```

Expressのスケルトン作成してAzure向け且つTDD向けにファイル移動する

```
express myapp --no-view
mkdir src
mkdir test
copy myapp\bin\www .\server.js
xcopy myapp\public .\src\public\
xcopy myapp\routes .\src\routes\
copy myapp\app.js  .\src\
npm init
```


server.jsのファイル書き換える

```
var app = require('../app');
// ↓
var app = require('./src/app');
```


package.jsonに、myapp配下のそれから以下をコピペする

```
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "morgan": "~1.9.1"
  },
```


不要な作業フォルダを削除して、必要なモジュールを追加インストールする

```
rmdir /s /q myapp
npm install
npm i   node-dev cross-env --save-dev
```

package.jsonのscript欄に、debug実行用にコマンドを追加する

```
"dev": "cross-env DEBUG=myapp:* node-dev server.js",
```


以上ー。


# 補足

testコマンドまで含めた導入済み版はこちらを参照。

* 付録B：ExpressフレームワークのAzure向け導⼊⽅法
* https://github.com/hoshimado/tdd-vuejs-book/tree/master/appendix/b-azure-express-mocha
minify時に特定の関数名やクラス名を保持する設定の書き方 (Vue CLI・terser)

## はじめに

Vue CLIを使って開発をしていて、プロダクション用にコードをビルドする時、デフォルトでコードがminifyされると思うのですが、特定の関数名やクラス名だけminifyされないようにしたい時に役に立つtipsを紹介します。

## 確認環境

以下の環境で動作確認済み

```
vue: "^2.6.12"
@vue/cli-service: "^4.1.0"
webpack: "^4.0.0"
```

```
node (v13.13.0)
yarn (v1.22.4)
```

## 特定のクラス名を保持したい

```js:vue.config.js
chainWebpack: config => {
	config.optimization.minimizer('terser').tap(args => {
		const { terserOptions } = args[0]
		terserOptions.mangle.keep_classnames = true
		terserOptions.mangle.reserved =['HogeClass', 'FugaClass']
		return args
	}
}
```

注意点としては、`mangle.keep_classnames = true` だけでは正しく保持されないです。`reserved` もちゃんと書きましょう。

## 特定の関数名を保持したい

```js:vue.config.js
chainWebpack: config => {
	config.optimization.minimizer('terser').tap(args => {
		const { terserOptions } = args[0]
		terserOptions.mangle.keep_fnames = true
		terserOptions.mangle.reserved =['hoge', 'fuga']
		return args
	}
}
```

注意点としては、

- `mangle.keep_fnames = true` だけでは正しく保持されないです。`reserved` もちゃんと書きましょう。
- `reserved` には `as` で名前を変更する前の名前しか保持できません。

## 全てのクラス名を保持したい

```js:vue.config.js
chainWebpack: config => {
	config.optimization.minimizer('terser').tap(args => {
		const { terserOptions } = args[0]
		terserOptions.keep_classnames = true
		return args
	}
}
```

## 全ての関数名を保持したい

```js:vue.config.js
chainWebpack: config => {
	config.optimization.minimizer('terser').tap(args => {
		const { terserOptions } = args[0]
		terserOptions.keep_fnames = true
		return args
	}
}
```

## 参考

- https://github.com/vuejs/vue-cli/issues/1118#issuecomment-592743751
- https://github.com/terser/terser#mangle-properties-options
【ラビットチャレンジ（E資格）】応用数学_情報理論

#はじめに
本記事は、E資格の受験資格の取得を目的としたラビットチャレンジを
受講した際の勉強記録およびレポート記事である。

###参考図書
はじめての情報理論 (稲井寛著 森北出版)

###自己情報量
$P(x)$を事象$x$の生起確率とする。次式のように表される確率変数$I(x)$を事象$x$の
自己情報量という。
$$ I(x) = -\log{P(x)} $$
上式ではあえて対数の底を書いていない。情報量には底の値に応じて下記の3つの単位が定められている。
対数の底が2：単位はbit。
対数の底がe：単位はnat。
対数の底が10：単位はハートレイ。

###シャノンエントロピー（平均情報量）
自己情報量の期待値。
$$ H(x) = E\bigl(I(x)\bigl) = -E\Bigl(\log\bigl(P(x)\bigl)\Bigl) = -\sum_x P(x)\log\bigl(P(x)\bigl) $$

###カルバックライブラーダイバージェンス（Kullback-Leibler divergence）
同じ事象・確率変数における異なる確率分布$P,Q$の違いを表す。
$P$からみた$Q$のカルバックライブラーダイバージェンスを$ D_{KL}(P||Q)$とすると 
$$ D_{KL}(P||Q) = E_x \Bigl[log\frac{P(x)}{Q(x)}\Bigl] = \sum_x P(x)\bigl(\log{P(x)}-\log{Q(x)}\bigl)$$
と表される。

###交差エントロピー（cross entropy）
Qについての自己情報量をPの分布で平均している。
$$ H(P,Q) = -E_{X \sim P} \log{Q(x)} = -\sum_xP(x)\log{Q(x)} $$
[Vue]WYSIWYGリッチテキストエディタのプラグイン比較

VueでWYSIWYGリッチテキストエディタを実装することになり、プラグイン選定までの調査記録。

↓こういうブログとかによくある機能のやつ。
![スクリーンショット 2020-11-05 12.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/8b9a7cf9-8d11-fd7a-70ca-a2c8722f37e9.png)



## 調査開始
まずは「Vue リッチテキストエディタ」などで検索してヒットしたものをリストアップ。

- [TinyMCE](https://www.tiny.cloud/)
- [CKEditor](https://ckeditor.com/)
- [Quill](https://quilljs.com/)
- [tiptap](https://tiptap.dev/)

## Google Trendsで比較
プラグインの比較でよくお世話になってる[Google Trends](https://trends.google.co.jp/trends/?geo=JP)。
検索結果を統計的にグラフ表示してくれる。

![スクリーンショット 2020-11-05 13.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/b549a920-a713-2cdd-aed2-ca5de6d60ebb.png)

TinyMCEとCKEditorの二強っぽい。
日本だとTinyMCEの方がやや優勢。

## GitHubスター数の比較 
### TinyMCE
https://github.com/tinymce/tinymce ： 8.7k
https://github.com/tinymce/tinymce-vue ： 1.1k

### CKEditor
https://github.com/ckeditor/ckeditor5 : 4k
https://github.com/ckeditor/ckeditor5-vue : 195
https://github.com/ckeditor/ckeditor4 : 5.2k
https://github.com/ckeditor/ckeditor4-vue : 26

記事執筆時点のスター数。
VueでみるとTinyMCEの方が実績多そう。

## 機能面
### 比較記事
「TinyMCE vs CKEditor」とかで検索してヒットした比較記事で確認。
見た感じあんまり差はなさそうな印象。

### デモ
[TinyMCE demo](https://www.tiny.cloud/docs/demo/basic-example/)
[CKEditor demo](https://ckeditor.com/ckeditor-5/demo/)

強いて言えばCKEditorの方のアイコンの方がお洒落で好み。笑

## 費用

[TinyMCE Pricing](https://www.tiny.cloud/pricing/)
[CKEditor Pricing](https://ckeditor.com/pricing/)

どっちもコアな機能はフリーで使える。

## 周りの人の意見
やっぱ口コミも大事だと思う。
Twitterや社内で聞いてみると以下のような意見が。

「FCKeditor(CKEditorの前身)で実装した事があります」
「WordPressで使われている、TinyMCEとかが有名です」
「tinyMCEは太古の昔からあります！古いから枯れてる」
「CKEditor使ってるので情報はあります〜それ要因のバグと格闘してます」
「うちはIE対応の観点でCKEditorを選定しました」

情報いただけるの大変ありがたき。
意見くださった方ありがとうございます（土下座）

## その他気にした点
・安定性 -> TinyMCEに軍配があがる印象。
・メンテナスされてるか -> どっちも最近コミットしてる。
・Vueでの日本語の記事の多さ -> どっちも少ない。笑

## 結論
最終的な結論は直感に頼ろう( )
今回は**TinyMCE**に決定。
なんか後から見たけどQuillも結構良さげだった。(検索ワードをquilljsとかにすればよかったかも？)

おしまい
Ways to Improve eCommerce Conversion Rates

The massive success of eCommerce giants Amazon and Flipkart is why the eCommerce industry has experienced tremendous growth in recent years and is predicted to hit a global revenue count of $4.88 trillion by 2021!  

In this competitive online buying world, some do’s and don’ts are motivating customers to buy items from your eCommerce shop. This article will discuss eCommerce conversion rates and share the best ways to <a href="https://www.sphinx-solution.com/blog/15-ecommerce-conversion-rates-hacks/">improve eCommerce conversion rate optimization</a>.

What is Conversion in eCommerce?
In Simple words, the eCommerce conversion rate is the percent of total site visitors that actually buy something from you.

How to Calculate Conversion Rate?
To calculate the conversion rate, all you have to do is divide the number of conversions you get during a specific time frame by the total number of people who visited your site or landing page and multiply it by 100.

Conversion Rate = (Conversions / Total Visitors) X 100 

Ways to Boost Your Ecommerce Conversion Rates:
1) Offer free shipping.
According to the NRF study, 75% of US consumers expect free shipping, even on orders under $50. Nowadays, Online shoppers expect more than free shipping. They want a certain standard that they have experience with Amazon.

2) Use High-Quality Product Images
Think about what customers want to see while shopping on your site. It’s images. When people shop online, they can’t touch the product or put it on. In this scenario, the best thing you can do is show high-quality product images so that the customer knows exactly what they are getting. 

3) Optimize Website Speed
According to Google, over 53% of mobile users will lose interest in your site if it takes more than three seconds to load. Even a one-second delay can cost you 7% reduction in conversions. 

4) Reduce Number of Step in Checkout
If you want to increase your conversion rate, the most important tip is to lower the number of checkout processes. In the study, Facebook found that “87% of consumers experience complex checkout steps will stop them from shopping online”

5) Offer Limited Period Coupon Codes
It’s a basic human tendency to fear for loss more than gain. Consumers hate missing out on a good deal on their favorite items. This opportunity will drive urgency among shoppers, and they will more likely go through with the purchase without getting distracted.

This Blog is originally published on <a href="https://www.sphinx-solution.com/blog/">Sphinx Website</a>.
Google Cloud Platform(GCP)とGoogle Domainsでドメイン設定

元記事：[genkitech.net](https://genkitech.net/gcp-vm-domains)

前回、GCP上にWordPressを構築するところまで出来ました。
https://qiita.com/genki140/items/a67b2697d434f29ef0ae

今回は、IPを固定化してドメインを結び付けるところと、SSL化するところまで行います。

https://genkitech.net/gcp-vm-domains

##IPとドメインを関連付ける

###IPアドレスを固定化する

GCPでインスタンス作成直後は、再起動するたびにIPアドレスが変わってしまうため、ドメイン名とIPアドレスの関連付けができません。GCPのコンソール（https://console.cloud.google.com/）を開き、メニューから「VPCネットワーク」にある「外部IPアドレス」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/2ab6e707-d419-fd31-ae1a-224d6484d5a2.png)

外部IPアドレスのリストにある対象インスタンスの「種類」の所を、「エフェメラル」から「静的」に変更し、表示されるダイアログで適当な名前を設定します。

「外部アドレス」に表示されているIPアドレスは後で使用するためメモしておきます。

###ドメインを取得する

Google Domains からドメインを取得します。サイト（https://domains.google/）にアクセスし、取得したいドメイン名を検索します。

https://genkitech.net/wp-content/uploads/2020/11/image-2.png

###ドメインを設定しIPアドレスに紐づける

購入できるドメインのリストが表示されるため、希望のものを選んでカートに追加し購入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/426fa8e4-07b4-8451-6de1-9d0fcbd1a13a.png)

購入したドメインを管理画面から選択し、「DNS」を開き、カスタムレコードを追加します。

1. 「@」を入力して「A」を選択し、先ほど固定化したIPアドレスを入力して追加します。
2. 先頭に「www」があってもリダイレクトされるように、「www」を入力して「CNAME」を選択し、ドメインを入力して追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/5a9ad2c0-1aa9-303d-4aa4-00cd1b7b90e1.png)

ドメイン名でWordPressの画面にアクセスできるようになるまでしばらく待ちます。早ければ数秒、遅いと数日かかるようです。最初間違えて「登録済みのホスト」の方に似たような設定をしていて3日たっても反映されなかったのが、正しく設定したら一瞬でした。。。

##SSLを設定し、https:// で接続できるようにする

セキュリティー的にもそうですが、色々なサービス連携のためにはもはや必須の様です。

###証明書の導入

SSL化するために今回は、簡単にSSL証明書が導入できる「Let’s Encrypt」を使用します。WordPressがインストールされている仮想マシンにSSH接続し、機能をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/6e05119f-113c-7f48-6b84-e14fa0cb84ba.png)

ブラウザ上でコンソールに接続されるため、以下のコマンドを実行していきます。

1. 証明書に関する部分を自動化するため、Certbotをインストールします。
`sudo apt-get install certbot python-certbot-apache`

2. Certbotを実行します。
`sudo certbot --apache`

3. メールアドレスを聞かれるため入力します。

4. 「A」を入力して規約に同意します。

5. 登録メールに広告を配信していいか確認されます。広告が必要なければ「N」で進みます。

6. 登録したいドメイン名を入力します。（本サイトの場合は「genkitech.net」）

7. httpからhttpsにリダイレクトしたいので、「2」を入力します。

以上でサーバーへの証明書導入が完了です。

###WordPressの設定

最後に、WordPressの「設定」>「一般」にあるアドレスを「http://」から「https://」に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/953718e6-296a-46d0-fda7-dc56363d1ca8.png)

ブラウザで変更したアドレスにアクセスし、正しく表示され、アドレスの左端に鍵マークが表示されていれば成功です。

ちなみにURL設定を変更すると、その前に書いた記事の画像がおかしくなったりして修正する羽目になったので、最初にここまでは設定を終わらせておく必要がありそうです。

これで本格的に記事を書き始められます！