OmniAICreator/Qiita-1.07M huggingface dataset:
[Tips] ErgoDox EZ を Windows で利用する際に一部の記号が正しく入力出来ない問題の解決方法

**本記事に記載されている対処を行うことで、
手っ取り早く Windows でも ErgoDox EZ が正常に利用可能になりますが、
逆にノート PC 側でキーを入力する際に一部の記号が正しく入力出来なくなります。**

また、
デスクトップ PC を使っている or ノート PC がデフォで英字キーボード搭載している場合は、
本記事の対処を行わずとも Windows で正常に ErgoDox EZ が使用できると思われます。

# はじめに

普段 Mac で開発しているのですが、故あって、
しばらく Windows 機メインで開発を進めることになりました :hammer: 

キーボードは ErgoDox EZ を使っているので、
Windows に繋げて早速セットアップしようとしたところ、、
**￥** とか **：** とか **＠** 等の一部記号が入力出来ない事態に遭遇しました。。

少し調べると、
[キー割り当てを JIS キーボード向けにして設定する方法](https://sott0n.github.io/posts/ergodox/)を見つけたのですが、
若干手間だったのでもっと簡単に対処できる方法は無いか調査しました:writing_hand: 

調査の結果、簡単な対処法を発見したので、
記事として残しておくことにしました:+1:

# 対処法

キーボードのレイアウトを英字キーボードに変更することで対処可能でした :+1:

まず、検索ボックスを開き `言語の設定`と入力して設定画面に遷移します :arrow_down: 
![5ff64a3d83776556d3b89f50e37f9d32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86070/b9880cb2-4601-e5d7-49f6-19c46132bf3d.png)

表示される言語設定ウインドウの左に表示される `言語` をクリックして、
優先する言語の日本語の欄をクリックして `オプション` ボタンをクリックします :mouse_three_button: 
![fdbc2bb5144b0b65388208cb5399ed88.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86070/351f1e76-553f-fa6d-7e74-71ec7a9af3aa.png)

`レイアウトを変更する` ボタンをクリックして、
日本語/英字キーボード切り替えダイアログを表示します :keyboard: 
![19fafb9e2a78f435364662af36b353a0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86070/6fdf644f-3644-577e-38c8-24e2e21873f5.png)

表示されたダイアログのセレクトボックスから `英語キーボード(101/102キー)` を選択し、
`今すぐ再起動する` ボタンをクリックして設定内容を反映させます :white_check_mark: 

![a05f39b928b87725e1c20497db16ec28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86070/bd534f22-9467-d5b3-28cb-7a3e87e6a714.png)

再起動後、入力出来なかった **￥** や **＠** が入力可能になっていれば OK です :tada: 

# [補足] 日本語と英語入力切替のショトカを設定する

Windows だと **LANG1** や **LANG2** といったキーを検知してくれず、
日本語と英語入力切替が上手くいかない問題も発生しました。。

こちらの問題は、日本語と英語入力切替のショトカを設定することで解決しました :muscle: :arrow_down:
[Windows10を英語配列キーボードで使っている人向け日本語入力切り替えの変更方法](https://ko-log.net/tech-log/archives/2561460.html)


# おわりに

今回はとにかく早く ErgoDox EZ を利用したいときに使える Tips をご紹介しました :thumbsup: 

ちなみに、ノート PC 側の日本語キーボードを入力に使いたくなった場合は、
キーボードのレイアウトを `日本語キーボード` に戻すことで正常に使えるようになります:pencil: 

また、日本語/英語キーボードを共存させることが出来れば、
ErgoDox EZ でもノート PC 側のキーボードでも、
常に正しくキー入力出来る環境が整えられそうなことが分かったので調べていました :mag: 

しかし、現時点 (2020/05/07) では、
日本語/英語キーボードを共存させる仕組みは無さそうでした... :arrow_down:
[日本語キーボードと英語キーボードの共存](https://answers.microsoft.com/ja-jp/windows/forum/all/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC/59449442-3d32-40ae-92f6-1f4ff9022851)

より良い対処法がもしあれば、是非ご教授いただけますと幸いです。。:bow: :pray: :sweat_drops: 

# 参考リンク

- [ErgoDoxEZキーボードを導入する]()
- [日本語キーボードと英語キーボードの共存](https://answers.microsoft.com/ja-jp/windows/forum/all/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC/59449442-3d32-40ae-92f6-1f4ff9022851)
- [Windows10を英語配列キーボードで使っている人向け日本語入力切り替えの変更方法](https://ko-log.net/tech-log/archives/2561460.html)
千葉県市川市における新型コロナウイルス感染者をまとめてみた

# はじめに
私の住んでいる千葉県市川市における新型コロナウイルス感染者のデータをまとめてみました。

そもそも、[市川市のホームページ](https://www.city.ichikawa.lg.jp/pub01/hasseijokyo.html)では、オープンデータとして二次利用できる形式で情報を公開していません。
たいしたデータ量でもなければ、項目も少なく、これで何かしようとするには不十分なのですが、ちょっとしたことには使えそうなので、使いやすいようにしてみました。
また、サンプルのコード（Python）も載せておきました。

なお、随時更新していますが、個人的な事情で遅れることがあります。
<font color="FF0000">→更新を終了しました</font>

【2020/05/08】死亡日を追加
【2021/01/22】死者情報があいまいなため、死亡者を特定できない状態に
【2021/02/19】千葉県が死亡者の居住地情報を公表しないこととしたため、死亡日は追加されなくなりました
【2021/08/13】千葉県が職業と推定感染経路を公表しなくなりました
【2022/02/02】感染者数が多すぎ、処理が追い付かないため、更新終了

# URL
https://github.com/mine820/COVID-19

## データ
CSVフォーマットで、文字コードはUTF-8です。

### カラム
カラムの意味は以下の通りです。

- 分類
  - 患者（発症済み）か無症状病原体保有者（未発症）です
- 市内
  - 市川市在住者で感染が見つかった順番です
- 県内
  - 千葉県在住者で感染が見つかった順番です
  - 県外で見つかった場合は空欄になっています
- 年
  - 年齢（10歳単位）です
  - 「0」は0～9歳を表します
  - 「90」は90歳以上を表します
- 性別
  - 男性または女性です
- 職業
  - 感染者の職業です
  - 空欄があります
- 推定感染経路
  - 感染した場所です
  - 「県内○○」の「○○」は千葉県で感染が見つかった順番です
  - 空欄があります
- 発症日
  - 発症した日です
  - 「不明」「調査中」があります
  - 無症状病原体保有者は空欄です
- 検査確定日
  - PCR検査で陽性が確定した日です
- 死亡日
    - 死亡した日です
    - 亡くなっているのに情報が公開されていない人もいます
    - 空欄があります
- 行動歴
  - 市内68例目以前は発症後行動歴、市内69例目以降は発症2日前からの行動歴です
  - 空欄があります

## サンプル
データを使用した解析のサンプルコードです。
ファイルはJupyter Notebookになってます。

```python
import numpy as np
import pandas as pd
import datetime
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv('corona.csv')

df["発症日"] = df["発症日"].replace("不明", "")
df["発症日"] = df["発症日"].replace("調査中", "")
df["発症日"] = pd.to_datetime(df["発症日"], format="%Y-%m-%d")

df["検査確定日"] = df["検査確定日"].replace("不明", "")
df["検査確定日"] = df["検査確定日"].replace("調査中", "")
df["検査確定日"] = pd.to_datetime(df["検査確定日"], format="%Y-%m-%d")

df["死亡日"] = df["死亡日"].replace("不明", "")
df["死亡日"] = df["死亡日"].replace("調査中", "")
df["死亡日"] = pd.to_datetime(df["死亡日"], format="%Y-%m-%d")

# 要約統計量
df.describe().loc[:,"年"]

# ヒストグラム（年齢）
plt.title("Age")
plt.yticks([0,400,800,1200,1600,2000,2400,2800,3200,3600])
plt.hist(df["年"], range=(0, 100));

df = df.dropna(subset=['検査確定日'])

# 検査確定日＋移動平均（7日）
days = (df["検査確定日"].max()-df["検査確定日"].min()).days+1
hist = plt.hist(df["検査確定日"], bins=days)

left = np.arange(df["検査確定日"].min(), df["検査確定日"].max()+datetime.timedelta(days=1), np.timedelta64(1,'D'))

num = 7
b = np.ones(num) / num
y2 = np.convolve(hist[0], b, mode='same')

plt.figure(figsize=(17, 10))
plt.title("Inspection confirmation date")
plt.bar(left, hist[0], color='green', width=1.0, linewidth=0.0);
plt.plot(left, y2, color='red')
```

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/8afc44fa-e91d-08b0-7ab5-e3bb82c84f07.png)
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/156e701c-23a6-8d76-c639-ae8f3e158efb.png)
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/6783b0e4-1f7c-f0bb-58e9-7b450b6ca601.png)
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/b128cfc8-6b2b-192f-0b0f-9451a1404172.png)
ヨビノリの動画からt検定を実装してみる（一標本の母平均の検定）

最近Youtubeで**ヨビノリさんの「推定・検定入門」**の動画を見ました
今まで検定というものに対してなんとなくの理解しか持っていなかったのですが、この動画を見ることで、**実際にどのような原理で統計ソフトがp値や信頼区間を計算してくれていたのか、かなり詳細なレベルまで理解できた気がします**

そこで今回はヨビノリさんの動画で学んだことを実用すべく、**Rでｔ検定を実装**してみたいと思います．Rを選んだ理由としては、組み込み関数で推定・検定が実装されているので自作のコードの検証がしやすいからです

みなさんもぜひ[動画](https://youtu.be/4ZHcBtLdOQs)を見ながら追ってみてください

### 一標本の母平均の検定（ｔ検定）

この検定は平均に関する検定で一番ベーシックなものですが、私自身は実践でやったことがなくてヨビノリさんの動画で初めて知った検定です
具体的には、**あらかじめ決められた値とサンプルの平均を比較して、サンプルの母平均があらかじめ決められた値と異なるかどうかを検定します**

#### 問題設定
ヨビノリさんの動画で紹介されている例はこんな感じです

> 10年前の20台の平均身長は171.4cmだった．近年の栄養状態の改善を考えるとこの数値は増えているのではと思い9人を無作為に抽出した．抽出した結果から平均身長は増えたと言えるか．有意水準5%で検定せよ

ここで**母集団（身長の分布）は正規分布に従うと仮定**しています
また、ヨビノリさんの動画では問題文でサンプルの平均値と分散が与えられていますが，今回はせっかくRを使うので以下のようにサンプルを生成してみたいと思います

```R
set.seeds(42)
x = rnorm(9, mean = 173, sd = 2)
```
このようなサンプルが生成されました

```R
[1] 175.7419 171.8706 173.7263 174.2657 173.8085 172.7878 176.0230 172.8107 177.0368
```
さて、このサンプルから現代の20代の平均身長は171.4より大きいと言えるのでしょうか？

#### 帰無仮説・対立仮説の記述
まずは、帰無仮説・対立仮説を記述しましょう
問題設定によれば、それぞれ以下のようになるはずです

帰無仮説　$H_0:\mu=171.4$
対立仮説　$H_1:\mu>171.4$

対立仮説の記述から、今回の検定は**片側検定**をすればいいことが分かります

#### T値の計算
サンプルの値からT値を計算してみましょう
T値は以下のような式で定義されます

$T=\frac{\bar{X}-\mu}{\frac{U}{\sqrt{n}}}$

ここでUはサンプルの不偏分散の平方根です
Rで実装してみると以下のように表現できます

```R
mu = 171.4
# T値を計算
calcT = function(x, mu) {
  n = length(x)
  U = sqrt(var(x))
  (mean(x)-mu)/(U/sqrt(n))
}
T = calcT(x, mu)
T
[1] 4.956662
```

#### 分布から確率を計算する
突然ですが、このように定義した生成値Tは自由度n-1のt分布に従うことが知られています
なんでそうなるかは動画でも詳しくは説明されてないんですが、一連の動画を見ていけばイメージはつかめます
ざっくりとした説明ですが、こんな感じでどうでしょうか．先ほどの式で不偏分散$U^2$が真の分散$\sigma^2$だった場合は生成量は正規分布に従います．ここで不偏分散はサンプルが多くなれば真の分散に近づく性質があったことを思い出してください．t分布もnが∞で正規分布に漸近する性質がありますので，理にかなっているというわけです

さっそくRに用意されているt分布の確率密度関数からT>4.95の区間の確率を求めます
これがいわゆるp値というやつです

```
# P値を計算
df = length(x)-1
p = 1-pt(T, df)
p
[1] 0.0005557726
```

#### 仮説を棄却する
あらかじめ設定した有意水準をもとに帰無仮説か対立仮説のどちらかを棄却します
今回は**p値が0.05を下回っているので帰無仮説を棄却**します
どうやら10年前と比べて平均身長は増えていると結論して良さそうです

#### 自作コードの検証
ここまで一連の流れをRの組み込み関数でやってみるとこんな感じです

```R
> t.test(x, mu=171.4, alternative = "greater")

	One Sample t-test

data:  x
t = 4.9567, df = 8, p-value = 0.0005558
alternative hypothesis: true mean is greater than 171.4
```
T値、p値ともにほぼ同じ値が現れました
それにしても、自分で自作してみることでRの組み込み関数のスマートさがよくわかります

### ヨビノリさんの動画をみての感想
これまでいろいろな統計の本、動画を見てきましたが、**個人的な印象ではヨビノリさんの動画が圧倒的にわかりやすかった**です

統計はヨビノリさんご自身の専門ではないと思うので、最初はちょっと胡散臭いかななんて思ったりしたんですが、なんてことはない、統計の専門家よりも分かりやすく、そしてコンパクトな解説で驚きました

ヨビノリさんの動画を見るまでは自分で検定を実装してみようなんて考えたこともなかったので、やはり学習教材の力は偉大です

こんなに良質な教材を日本語で用意してくれたヨビノリさんに感謝です
初心者がスクレイピングについてまとめてみた

###まえがき
・自分は全くの初心者、または学習を始めたばかりの者になります
・自分なりに考察したものを記入していますが、間違えている事があれば指摘して頂けると幸いです
・ほとんどが自分の為の、メモ書きみたいなものになっています


#今回の目的
サイトの中の記事のタイトルとそのタイトルのリンク(url)を取得します


#WEBスクレイピング
・webスクレイピングとは、webサイトから任意の情報を取得する技術

##項目
###requestsについて
　requestsはサーバからHTML、XMLを取得するのに使用するライブラリ

###BeautifulSoupについて
　BeautifulSoupはスクレイピングを使用するライブラリ

##実践していきながら、解説します
###使用するモジュールやライブラリをimportします

まずは、requestsライブラリとBeautifulライブラリをimportします
コードについては、以下になります

```
import requests
from bs4 BeautifulSoup
```
*ちなみにrequestsとBeautifulSoupのインストールが済んでいない方は、インストールを済ませてからじゃないと動きません。インストール方法は記載しませんので、各自で確認して頂けると幸いです。

###スクレイピングするサイトからurlを取得します
＊この記事では、https://youtu.be/6F2Po-CCX9cを参考にさせて頂きます
・今回使用するサイトは、「ハムスター速報」になります。
以降はハム速と略していきます。

まずは、ハム速をGoogle Chromeで検索していきます。
ハム速をクリックして、サイト内に入り、urlをクリックからコピーします
すると、http://hamusoku.com/
こちらのurlがコピーできたと思います。

###HTMLからサーバを取得します
先ほど取得したurlで、サーバからHTMLを取得します

```
page_url = "http://hamusoku.com/"
r = requests.get(page_url)
```
page_urlにurlを代入します
次に、requestsのget関数でサーバから取得したHTMLをrに代入します

###BeautifulSoupを使用して、HTMLを解析（パーサー）します

```
soup = BeautifulSoup(r.text, features='html.parser')
```

BeautifulSoup（）の記述方法は、
BeautifulSoup(解析対象のHTML/XML, 利用するパーサー)になります。

今回は第二引数の属性として、featuresを指定してますが、なくても大丈夫だと思います。

```
soup = BeautifulSoup(r.text, 'html.parser')
```

###記事タイトルを取得する
記事タイトルを取得するためには、ハム速のHTMLの構造を知る必要があります。
その方法として、

一つ目
・chromeのデベロッパーツールを使用します。
・上のTabバーから表示を選択して、開発/管理を選択、デベロッパーツールを選択します。
・コードが書かれている上の方の、Elementsを選択すると、HTMLのソースが表示されます。
・Elementsの左にある四角と矢印のアイコンをクリックすると、サイト内でマウスを動かすとハイライトされた部分HTMLがなんなのか分かります。

二つ目
・知りたいHTMLに概要する場所を、右クリックして、検証を選択します。

・そして記事タイトルのHTMLを取得します。
取得方法ですが、検証してみるとaタグでurlが記述されているのが分かります。
そして、このaタグはh1タグの中にあります。h１タグのclass名を使えば、全ての記事タイトルの取得できる予想ができます。
aタグでも取得することが、出来ます。

```
h1_tags = soup.find_all('h1', class_="article-title")
```

find_allメソッドは、
Tagオブジェクトが持つ子孫要素のうち、引数に一致する全ての要素を取得します。

```
soup.Tagオブジェクト.find_all(name, attrs, recursive, text, limit, キーワード引数)
```

今回のfind_allでは、name引数の文字列とキーワード引数が使われています。
h1に該当する文字列とclass_="article-title"に概要するキーワードで取得します。
＊classの後ろに_を記述しないといけない

取得できたものを、h1_tagsに代入します。

###色々な出力方法
これを実行すると、指定された引数の記事タイトルの情報を全て取得する
かなりの量なので、ここには記載しないので、自身で確認してもらいたい。

```
print(h1_tags)
```

これを実行すると、一番目に指定したものが出力される
[1]の場合は、二番目のもの

```
print(h1_tags[0])
```

これは、指定されたh1タグの中にあるaタグだけを取得する

```
print(h1_tags[0].find_all('a'))
```

aタグが複数ある場合は、選択することも可能
find_all('a')[0]のように

```
print(h1_tags[0].find_all('a')[0])
```

または属性から選択することも可能
attrsはattributes(属性)

```
print(h1_tags[0].find_all('a', attrs={"rel": "bookmark"}))
# attrs={"key": "varue"}
```

textのみを取得、またはリンクのみ取得

```
# text
print(h1_tags[0].find_all('a')[0].text)
# link
print(h1_tags[0].find_all('a')[0].get("href"))
```
Laravel ディレクティブでswitch文を記載する

# 目的

- 若干詰まったためディレクティブでのswitch文の記載方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 記載例

- 下記にディレクティブのswitch文の例を記載する。

    ```index.blade.php
    @switch(判定したい変数)
        @case(0)
            <!-- 判定したい変数に0が格納されていた時の処理 -->
            @break
        @case(1)
            <!-- 判定したい変数に1が格納されていた時の処理 -->
            @break
        @case(2)
            <!-- 判定したい変数に2が格納されていた時の処理 -->
            @break
        @default
            <!-- 判定したい変数に0 1 2意外が格納されていた時の処理 -->
    @endswitch
    ```
PHP　剰余算を使い、行ごとの背景色を変更する

```php:sample.php
<table>
  <?PHP
    for($i=1;$i<=100;$i++){
      if($i%2){
        print('<tr style="background-color: #ccc">');
      }else{
        print('<tr>');
      }
        print('<td>'.$i.'行目</td>');
        print('</tr>');
    }
  ?>
</table>

```

```php:出力
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目

-奇数行目の背景の色が変更になる
```

```php:メモ
if($i%2)は,余りが出るところがtrueとなり,変更される

```
zoomプログラミング研修講師で気をつけること(ハンズオンの場合)



zoomでハンズオン講師を何回かしたので自分用のメモ

### 一人が顔を出さないと、「そういう空気」になって全員顔を出さない。必ず全員顔を出させたほうが良い


リアクションが無いと非常に確認がしづらい。
ユーザーによってはリアクションの:raised_hands: も :thumbsup: も表示されない場合があるのでゼロリアクションになる。
なので顔を全員出していることが非常に大事だが、他の人が出していないと、
受講者は「俺だしたら空気読めてないのかな、、」とビデオモードをオフにする。

一回強制的にでもカメラオンさせてアイスブレイクの時間を取るべき。
あるいは、表紙のスライドに「カメラオンにしてください」と明確に入れるとか。

カメラオンになっている時は、画面越しの頷きとかから反応が分かる。

###対象者の属性をきちんと把握する

初めてだから触ってみたいのか、
もう少し深い所を知りたいのか、
仕事でどんな技術をやっているのか、非エンジニアなのか、ITリテラシー含めて予め確認するのが大事


###受講者の画面は小さい

受講者はエディタ、確認用ブラウザ、講師のスライド、画面の４つを行ったり来たりするが、基本的にサブディスプレイ付きで受講する人は非常にまれなので難しい。
（講師はハンズオンの内容コードはすべて頭に入っているのでここを見落としがち）
講師も質問を受けるスレッドは別端末で確認できるという風にした方が良い

例えばpdfをスマホで見れるようにするとか、事前にiPadある人はそちらを使うとか、案内する必要がある


###できるだけ考えさせる時間を取る

受けてる時に考えている時に先の説明に進まれると、
元の説明もわからなくなるし進んだ先の説明も消化出来ない。

尺がそもそも合わないなら、受講者の前提認識不足か、コンテンツの選定の両方あるいはどちらかが甘かった場合が多い。

### なぜ別の実装ではなくこの実装を用いているのか、先回りして説明する

受講者は、違和感のある実装方法をすると、

これってまわりくどくないか？
という疑問を持たれかねない実装になっている時は、
それが時間的なものなのか説明的なものなのか説明する


### 質問された内容に自信を持って回答出来ないとき、無為な知識を補足してしまいがちになる

自信のある時は、結論だけコンパクトに教えられるが、
直接の回答とは関係ない説明を入れたくなりがち。



### 終了後のフォローができない

通常の研修であれば、終わった後に感想を聞いたり、質問に答えたり、追いついていない人のエラーを解消して完成まで持っていってあげたりできるがオンラインではそうはいかない。
「アンケートが終わった方から帰っていいよ」的なオペレーションができるが
オンラインではそうはいかない。

また、回答しない人は得てして期待値に対して不満を抱いていることが多いので、「期待より悪かった」というのはアンケートに回答しないという方法を通じて暗に伝えられる


### 録画が必要な場合は画面録画の方法を必ず確認する

録画ボタンの押し忘れが結構な確率で発生しがち。
録画ボタンを押すスライドなどを一枚用意すると忘れにくくて良い
押さえておきたいHTTPメソッドのPOSTとPUTの違い

# 押さえておきたいHTTPメソッドのPOSTとPUTの違い

### 結論から言うと

POSTはリソースの追加、POSTはリソースの更新に使用します。

### 詳しくはこちらにまとめました。
<a href="https://masa-enjoy.com/http-method-postput">押さえておきたいHTTPメソッドのPOSTとPUTの違い</a>
令和2年のGW中に参加したセミナーまとめ

# はじめに
令和2年のGWはコロナでどこにも出かけられず、逆にオンラインセミナーに参加する機会が多かったです。
個別にセミナーの感想をまとめようかとも思いましたが、記事が膨れるだけなのでまとめます。
GWと書きましたが、どこにも出かけられない分は仕事してたので５連休の部分がこの記事におけるGWです..
（つまり、5連休以外はカレンダー通りに仕事してました、4/29は休みました..）

# 参加したセミナーと感想
## [5/2 【オンライン】実践クリーンアーキテクチャ](https://nrs-seminar.connpass.com/event/174000/)

メモが箇条書き程度..

- クリティカルパスを避けて先行して開発する方法はないか、それが「クリーンアーキテクチャ」

```
Entities・・・ビジネスルールをカプセル化した物　ドメインオブジェクト　ドメインの概念を表現する
Use cases・・・
Interface Adapters・・・ Controllers Presenters Gateways
Frameworks & Drivers・・・ ビジネスロジックがこれに依存しないようにする
```

- ビジネスロジックを依存しないのがDI、依存の方向を逆にする
- SOLID原則を突き詰めれば、クリーンアーキテクチャになる
- ゲーム機のコントローラーはBボタンをマシンがわかる電気信号に変更している
- エンティティはドメインモデル、データモデルとは異なる
- 重要なことは整理整頓されていること、名前で制御は数が多くなると見えない
- クリーンアーキテクチャとMVC（WebFrameworkはMVC（HTTPRequest <--> HttpResponse）は相性が悪い（元々はiOS）、MVCの場合はPresenterを捨てた
- 先行開発クリーンアーキテクチャ
- アーキテクチャはルールを作り、ルールを守らせ、楽にルールを運用させて、楽しい旅をリードする
- 抽象は詳細に依存してははならない、詳細が抽象に依存すべきである、技術的な決定（詳細）ではなくビジネス（抽象）を中心にシステムを組み立てよう

完全に個人用メモ..です。
[Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656) を紹介されたので、GW＋＠で読んでみます。

## テスト駆動開発(TDD)オンライン勉強会 #1 「ライブコーディングで体感するTDD基礎」 https://ddd-community-jp.connpass.com/event/174617/

- TDDの目的はきちんと動く綺麗なコード
- レッド、グリーン、リファクタリングのコード
- tdd と テスト自動化の違い
- red と green はとりあえず通す、refactoringは設計
- ParameterizedTest便利、使ってみたい

## [5/6 チームリーディング　フロントエンドコンポーネントの指針【オンライン】](https://nrs-seminar.connpass.com/event/175302/)

- コンポーネントは使える部品の粒度
- 色々一気に導入するのは厳しい
- 山本五十六!!

# まとめ
GWだからと思って、色々登録してみましたが、在宅で聞くのは結構集中力的にも厳しいですね...
ひとまずメモを残した部分だけでも残しておけば、どんなイベントだったかとか記憶を辿れるので残しました。
（もう少し、らしい技術的Outputを書かねばと思います..）

一番刺激をもらったのがクリーンアーキテクチャで本も買ったので、読んで、まとめて、実践してみます。
railsで一部pathをサブドメインにする(メモ)

# 実装方法
`constraints subdomain: 'hoge'`でいける

```ruby
constraints subdomain: 'hoge' do
	# ...	
end
```


## ローカルで開発をする場合
`vi /etc/hosts`で設定ファイルを開き、`localhost:3000`にサブドメインを設定する必要がある

```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

127.0.0.1 hoge.localhost.local
```

hostファイルの127.0.0.1の行に自分で設定したいサブドメインを記述
(`hoge.localhost`だとなぜかうまくいかなかった🤔)

その後`hoge.localhost.local:3000`でアクセス可能

## request specでサブドメインをtestする方法
headerに`HOST`を追加すればいける

```ruby
describe 'GET #hoge' do
  it "responds with status :ok" do
    headers = { "Host" => "hoge.example.com" }
    get hoge_path, headers: headers
    expect(response).to have_http_status(:ok)
  end
end
```
ゼロからGKEにDjango+Reactをデプロイする: 目次

# ゼロからGKEにDjango+Reactをデプロイする: 目次

## やりたいこと

Djagno+Reactの構成でアプリケーションを開発してGoogle Kubernetes Engineにデプロイしたいけれども
まとまったチュートリアルが有りそうで無かったので書きました。

ただ**まだ完全ではない点があると思います**が、少し経験がある方ならすぐに利用できるんじゃないかと思っています。

## 注意

これは未経験の趣味エンジニアがポートフォリオを作成するためにデプロイと格闘した記録です。
不備があれば何卒御指摘をお願い致します。。

## 目指す姿

## 環境

``` sh
$ node --version
v12.14.1

$ npm --version
6.13.7

$ python --version
Python 3.7.4

$ docker --version
Docker version 19.03.8

OS windows10 pro
```

## 目次

* [(1)backendの開発: Nginx + Django](https://qiita.com/komedaoic/items/8626b52070163290d8f1)
* [(2)frontendの開発: Nginx + React](https://qiita.com/komedaoic/items/777cc8db007be748a828)
* [(3)GCPのプロジェクトを作成する](https://qiita.com/komedaoic/items/45a0082467c6b290622d)
* [(4)クラスタの作成とコンテナPUSH](https://qiita.com/komedaoic/items/99b5afb169bc5b37472a)
* [(5)Deployment](https://qiita.com/komedaoic/items/6f194cc59665f6af4749)
* [(6)ServiceとIngress](https://qiita.com/komedaoic/items/0f4c5366fc490aaf47dc)
* [(7)静的IPとドメイン取得](https://qiita.com/komedaoic/items/c998180c66c6919c9f40)
* [(8)HTTPS化とロールアウト](https://qiita.com/komedaoic/items/10199b1f65133936f728)
* [(9)掃除とまとめ](https://qiita.com/komedaoic/items/61750ac97059f19c3ea3)
Windows上のGitで特定のディレクトリのみ追跡させようとしたら全てのディレクトリが追跡できなくなった話

## 最初に結論

WindowsにおいてGitで特定のディレクトリのみ管理したい場合，`.gitignore`の最初は`*`ではなく`/*`とする必要がある．`*`だと，たとえ`.gitignore`内でディレクトリを`!`指定しても管理対象にならない．

## 起こった問題

問題が起こった環境は，

- OS: Windows 10
- Git: v2.19.2.windows.1

である．

ルートに`.vscode`ディレクトリと`scripts`ディレクトリとその他もろもろのディレクトリがあるGitリポジトリを作成した．`.vscode`ディレクトリと`scripts`ディレクトリのみをGitで管理したかったので，以下のような`.gitignore`を作成した．

```:.gitignore
# いったん全てのファイルを無視
*

!.gitignore
!/.vscode/
!/scripts/
```

そして以下のコマンドで一度キャッシュをリセットした．

```sh
git rm -r --cached .
```

すると`.gitignore`以外の全てのディレクトリが追跡できなくなり，`.vscode`ディレクトリと`scripts`ディレクトリも`git add`できなくなった．

## 解決方法

`.gitignore`の最初の`*`を`/*`に変更したら問題が解決した．`.gitignore`を以下のように変更すると，`.vscode`ディレクトリと`scripts`ディレクトリが`git add`でき，追跡できるようになった．

```:.gitignore
# いったん全てのファイルを無視
/*

!.gitignore
!/.vscode/
!/scripts/
```

## Linuxではどうなるのか

Linuxではどうなるのか検証してみた．OSはUbuntu 18.04，Gitのバージョンは2.17.1である．

結論から言うとLinuxではこのような問題は起こらなかった．

`.gitignore`において`*`で全ファイルを無視してキャッシュを削除した後，追跡したいディレクトリを`!/script/`のように指定してあげると問題なく`git add`できた．またLinuxで`.gitignore`の最初を`/*`としていても，特に問題は出なかった．WindowsとLinuxの両方で運用する予定のあるリポジトリは`/*`としておくべきである．

## 結論

WindowsにおいてGitで特定のディレクトリのみ管理したい場合，`.gitignore`の最初は`*`ではなく`/*`とする必要がある．
Rubyの繰り返し処理について

# はじめに
よく使われるRubyの繰り返し処理や、個人的に便利そうだなと思うものをまとめていきます。

# Rubyの繰り返し処理

### each文
繰り返しの基本のeach文です。
Rubyでは、**for文を使わずにこのeach文を使うことが多いです。**
do ~ end までが**ブロック**と呼ばれ、要素をどう扱うかが記述されます。

```ruby
numbers = [1,2,3,4]
sum = 0
numbers.each do |n|
  sum += n
end
sum #=>10
```


### do ... end の省略
**do ... endの代わりに { } で囲むことでもブロックを作ることが可能です。**
１行でコンパクトに書きたいときなどに使える方法です。

```ruby
numbers = [1,2,3,4]
sum = 0
numbers.each { |n| sum += n }
sum #=>10
```

###mapメソッド
各要素に対して、評価した結果を新しい配列にして返すことが出来ます。

```ruby
numbers = [1,2,3,4]
new_numbers = numbers.map { |n| n*10 }
new_numbers #=> [10, 20, 30, 40]
```

###each_with_indexメソッド
**each_with_index**を使うと、添字も取得可能です。
繰り返しもしつつ、添字も取得したいときに便利なメソッドです。

```ruby
members = ["ichiro", "jiro", "saburo"]
members.each_with_index { |member, i| puts "#{i}: #{member}"}
#=> 0: ichiro
#   1: jiro
#   2: saburo
```

###with_indexメソッド
mapメソッドと組み合わせて使うことで、mapメソッドを繰り返し処理をしつつ
添字も同時に取得することが出来ます。

```ruby
members = ["ichiro", "jiro", "saburo"]
new_members = members.map.with_index { |member, i| "#{i}: #{member}" }
new_members #=> ["0: ichiro", "1: jiro", "2: saburo"]
```

###添字を０以外から開始させる
each_with_indexやwith_indexで**以外の数値で開始したいとき**は
**メソッドに引数を渡す**ことで、指定することが可能です。

```ruby
members = ["ichiro", "jiro", "saburo"]
new_members = members.map.with_index(1) { |member, i| "#{i}: #{member}" }
new_members #=> ["1: ichiro", "2: jiro", "3: saburo"]
```

###ブロックにメソッドを追加出来る
ブロックの後ろに別のメソッドを書くことが出来ます。

```ruby
names = ["鈴木", "高橋"]
new_names = names.map { |name| "#{name}さん"}.join("と")
new_names #=> "鈴木さんと高橋さん"
```

#参考文献
プロを目指す人のためのRuby入門 伊藤 淳一 (著)

#さいごに
まだまだ知らない便利なメソッドがあるので
効率的なコードを書くためにこれからも学んでいきたいです。
Windows 10 に Vagrant VirtualBox CentOS7 インストール

# Windows 10 に Vagrant VirtualBox CentOS 7.8 をインストールしてみた。

## はじめに
ずっと**VirtualBox** を単独で使用していたが、みんな **Vagrant** を使ったほうが便利と言ってる。
本当にそうなのかインストールして試してみた。

## 環境
- Windows 10
- Vagrant 2.2.7
- VirtualBox 6.0.20 r137117 (Qt5.6.2)
- CentOS Linux release 7.8.2003 (Core)

## インストール
### Vagrant
Windowsにインストールするだけなので、詳細は省略。
[**Vagrant本家サイト**](https://www.vagrantup.com/downloads.html)から環境に合わせてインストール
### VirtualBox
以下同文。
[**VirtualBox本家サイト**](https://www.virtualbox.org/wiki/Downloads)から環境に合わせてインストール
### Vagrant Plugin
任意で以下の2つのプラグインを入れる。

 -  **共有ディレクトリがマウントできなくて、エラー吐く対応**

```:cmd
 vagrant plugin install vagrant-vbguest
```

 - **DISK拡張したい対応**

```:cmd
 vagrant plugin install vagrant-disksize  
``` 
---
**※注：**
・プロキシは使わないので、`vagrant-proxyconf` は使用しない。
・hostsを自動で書き換えるメリットは無いので、`vagrant-hostmanager` は使用しない。
・SnapShotはデフォルトで使用できる。（ ※`vagrant-vbox-snapshot` は入れたら逆に動かない）

---

### 仮想マシン作成

####　BOXのDLと追加
※BOXは（世界中の誰かが作った）VMテンプレートと同義と理解。

```:cmd
 vagrant box add centos/7 https://app.vagrantup.com/centos/boxes/7
```
※VMテンプレートのDLなので、終わるまで待つ。
※確認は、`vagrant box list` で確認。

####　仮想マシンの初期化。(フォルダにVagrantファイルを作成)
・作らなくても良いが、他のVMも管理したいならフォルダを作って、その配下にVagrantファイルを作成

```:cmd
 mkdir xxxx　　※ <- xxxx は任意
 cd xxxx
```

####　Vagrantfile 作成

```:cmd
 vagrant init centos/7
```

####　Vagrantfile 編集

```:Vagrantfile　で変えたところ

### box の自動更新確認を無効
if Vagrant.has_plugin?("vagrant-vbguest")
    config.vbguest.auto_update = false
  end
### 共有フォルダ指定
  config.vm.synced_folder "C:/Users/user/Documents/vm_shared", "/vagrant", type: "virtualbox"
### VirtualBoxのGUI名指定
  config.vm.define :test01 do |node|
    node.vm.box = "centos/7"
### disk拡張
    node.disksize.size = '50GB'
### VM内のホスト名指定、cpu,memory指定, vm.define と同時指定すると v.name が優先
    node.vm.hostname = "test01"
    node.vm.network "private_network", ip: "192.168.33.11"
    node.vm.provider "virtualbox" do |v|
       v.name = "test01"
       v.cpus = 2
       v.memory = 2048
    end
  end
```
### 仮想マシン起動
```:cmd
vagrant up
```
#### 仮想マシンlogin
```:cmd
vagrant ssh
```
※動確のため、一応上記コマンドでログインするが、後でsshの設定必須。

#### 仮想マシン停止
```:cmd
vagrant halt
```

#まとめ
私見ですが、現段階では「Vagrantが便利」という感覚は全くない。

- VMテンプレートなので、OSパーティションは自由に切れない。※要件で、/optだけ50GB欲しい時など、無力。
- cpu,memoryの増減、共有フォルダの使用、SnapShot、export/importって、VirtualBoxのGUIから全部できるし、そっちの方が早いしわかりやすい。

※「～やってみた」系で、目的なくただインストールしたというだけで、今のところ、メリットは感じられず。今後、使いこなしていくとメリットは実感できるのか、期待する。

## 参考にさせていただいたサイト
https://qiita.com/jonghyo/items/5bee0916d54a12862157
https://webbibouroku.com/Blog/Article/vagrant
https://qiita.com/oreo3@github/items/4054a4120ccc249676d9
https://qiita.com/esparrago_b/items/a919f985ca01de253820
https://pentan.info/server/vagrant/vagrant_vbguest_note.html
https://weblabo.oscasierra.net/vagrant-snapshot/
ゼロからGKEにDjango+Reactをデプロイする(9)掃除とまとめ

# ゼロからGKEにDjango+Reactをデプロイする(9)掃除とまとめ

[(8)HTTPS化とロールアウト](https://qiita.com/komedaoic/items/10199b1f65133936f728)の続きです。

これで最後です。

##まとめ

今回はServiceをfrontendとbackendに分けることでコンテナの中身のアプリケーションはDjangoだろうがGolangだろうが、なんでもOKというような形を実現することができました。管理者機能やテーブルのマイグレーションなどはDjangoにやらせて、API機能はGolangなどに任せることもできるんじゃないかとか思います。Kubernetesってすごいですね。。

残念ながら肝心のアプリケーションに関する実装はまったく進みませんでした。
これからやります。

## お掃除

プロジェクトを削除すれば全て消えます。
プロジェクトは残してクラスタだけ削除する場合、予約した静的IPアドレスは削除されません。
下記コマンドで削除してください。

``` sh
# 静的IPアドレスの削除
gcloud compute addresses delete [STATIC_IP_NAME] --global
```

## はまったところ

KubernetesのキャッチアップとGKEにデプロイしたときにどういう挙動をしているのかを把握していくのに時間がかかってしまいました。GAEの手軽さが恋しいです。

* ヘルスチェックの存在

    ヘルスチェックの存在を知らずローカルで `docker-compose up` すれば動作するのにGKEにデプロイすると起動せず困りました。
    当初はPodにリバースプロキシを設置しておらず、ヘルスチェック用にviewを追加していました。汎用性も考慮してPod内にリバースプロキシを追加して、ヘルスチェックに対応させました。

* frontendのエンドポイントはどこ？

    Pod内のコンテナ間はDjangoとcloud_sql_proxyのように `localhost:PORT` で通信できるので,frontendからbackendも同じように `web-back:80` のように名前解決して通信できるはずだと思い込んでいました。frontendはクライアントのブラウザで実行されるのに `localhost` で解決できるはずないですね。。Kubernetesの名前空間やネットワーク周りは未だにはっきりと理解できていません。。

* Kubernetesのリソースの種類

    DeploymentとServiceとIngressが何を意味しているのか、最初はまったくわかりませんでした。
    特にServiceでもタイプによっては外部公開できるのでIngressとServiceの何が違うのか理解するのに時間がかかりました。
    公式のGKEにDjangoをデプロイする[チュートリアル](https://cloud.google.com/python/django/kubernetes-engine)ではLoadBalancerタイプのServiceの使って公開していて、これをIngress化するように進めていきました。

## まだできないこと

* CI/CDの構築もするべきだった

    実際には `コード修正⇒イメージ作成⇒Push⇒更新` のサイクルを何度も行いました。
    このサイクルが本当に面倒なのでCI/CDは最初にやるべきでした。
    そのうち記事を書きたいと考えています。

* マネージドなSSLから複数TLS証明書の利用

    正直この辺の仕組みを浅くしか理解できておらず、チュートリアルに沿って「とりあえず対応した」という形なのです。
    複数ドメインをIngressで捌く、みたいな形には適用できていません。セキュリティ面へのキャッチアップがまだまだ薄いです。。

* IngressコントローラーをNginx化する

    HTTPS化できたタイミングで力尽きました。Nginxにすることで細かな設定ができるようなので対応したくて調べたりしましたが、GCEで間に合ってしまいました。

## 課金について

残念ながらKubernetesはお金がかかります。ノードの数だけVMインスタンスが起動してしまいます。
4日ほどで4000円近くかかってしまったので、この記事を作成したのちプロジェクトは削除してしまいました。
ここまでやっておいて申し訳ないですが、お金かけずにポートフォリオ作るなら無料枠のVMインスタンスで運用した方が良さそうですね。。

以上です。
お粗末様でした。

⇒[目次](https://qiita.com/komedaoic/items/9e2baa3c2fc80f959b09)
Ubuntu 20.04 (on Azure) でカーネル再構築

後述の Software Design の記事に手順があったので、久しぶりにお試し。
記事では Hyper-V 上の Ubuntu 18.04 でしたが、Azure VM の Ubuntu 20.04 でやってみました。Azure 上でのカーネルコンパイルは初めて。

# 環境

* Azure
* Ubuntu Server 20.04 (Canonical)
* Linux Kernel 5.5.5

## インストール前の状況

```shell
$ uname -r
5.4.0-1010-azure
```

## 必要なパッケージ

* git
* kernel-package
* flex
* bison
* libssl-dev

# 手順

## 1. カーネルソースのダウンロード

```shell
$ git clone -b v5.5.5 --depth 1 https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable
$ cd linux-stable
```

## 2. 現在のカーネルの状態を基に、ビルドに必要な設定をする

```shell
$ make localmodconfig
```

とりあえず全部デフォルトで試すだけなので、Enter キー連打。

## 3. ビルド

```shell
$ make -j$(grep -c processor /proc/cpuinfo) bindeb-pkg
```

別作業してたので正確ではありませんが、`Standard D2s v3` インスタンスで 30分くらい？

## 4. カーネルおよびモジュールのインストール

```shell
$ sudo dpkg -i ../linux-image-5.5.5_5.5.5-16_amd64.deb
```

## 5. Grub の設定

再起動して新しいカーネルを試すだけなら不要だが、戻したい時などはマニュアルを見る。

## 6. 再起動して確認

```shell
$ sudo /sbin/reboot
...

$ uname -r
5.5.5
```

# 参考文献

* Software Design May 2020 「低レイヤソフトウェア開発入門 (前編)」
  * 上記の特集では簡単なカーネルの改変もしているので、そういう部分も見たい方はオススメ
* [Kbuild](https://www.kernel.org/doc/html/latest/kbuild/kbuild.html)
再起動せずにMacのサウンドを直す方法（メモ）

# Macの音の調子が悪い
DAWや音声編集などをやっている場合、複数のオーディオIFや内部のサウンドドライバを使っている場合、サウンドがバグってしまうことが結構ある。
再起動すれば治るけど、面倒なので方法を調べた。

# coreaudioを再起動する方法
MacOS Catalinaで動作確認済み
以下のコマンドを実行すると、coreaudioを再起動してくれます。

```bash
sudo kill -9 `ps ax|grep 'coreaudio[a-z]' | awk '{print $1}'`
```

備忘録として。
PHPのクラス・メソッド

<h1>1.クラスとは？</h1>
そんなもんわかっとるわ！と思うかもしれませんが、
いざ説明しようとするといい回答が出てきません。
オブジェクトの塊です(雑)。
実際、一言では説明ができないので、実際に書いていきましょう。


<h1>2.public</h1>
下記では、基本的なクラスの定義を書いています。

```classTest.php
<?php

class classTest
{
    public function publicMethod(){
        return 'Publicメッセージ';
    }

    private function privateMethod(){
        return 'Privateメッセージ';
    }

    protected function protectedMethod(){
        return 'Protectedメッセージ';
    }

}

?>
```

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();
echo $app->publicMethod();

?>
```

public:どこからでもアクセス可能。
private:同じクラス内からのみアクセス可能。
protected:クラス自身・継承クラスからアクセス可能。


今回、test_sample.phpを実行した場合
『Publicメッセージ』が出力されるはずです。

<h1>3.private</h1>
では、privateではどうか？

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();
echo $app->privateMethod();

?>
```

下記のエラーが出ます。
```
Fatal error: Uncaught Error: Call to private method 〜
```

下記のメソッドを追加すればうまくいくはずです。

```classTest.php
public function method(){
        $message = $this->privateMethod();
        return $message;
}
```

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();
echo $app->method();

?>
```

これで『Privateメッセージ』が出力されるはずです。

<h1>4.protected</h1>
次がprotectedのお話。
上記のprivateと同じ挙動はします。
＋αのお話をしていきます。

継承クラスからアクセスしてみましょう。
継承とは、親クラスの処理を子クラスで使うことができることです。

では、子クラスを作成して親クラスを継承していきましょう。

下記を追加します。

```classTest.php
class childClass extends classTest
{
    public function publicMethod(){
        return '新Publicメッセージ';
    }

    public function method(){
        $message = $this->publicMethod();
        return $message;
    }
}
```

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new childClass();
echo $app->method();

?>
```

今回、childClassとclassTestでメソッドが重複している場合、
childClassのメソッドに上書きされます。
このことをオーバーライドと呼びます。
この場合は『新Publicメッセージ』が出力されます。

では、話に戻ります。
子クラスからprotectedのメソッドを呼びます。

```classTest.php
class childClass extends classTest
{

    public function method(){
        $message = $this->protectedMethod();
        return $message;
    }
}
```

これで、『Protectedメッセージ』が出力されるはずです。
Visual Studio Code のDiff(Compare)機能が便利(MacにWinMergeのような（無料）アプリがない)

# Visual Studio Codeを使ってMac版　テキストDiff（Windowsでも使えます）

Windowsでは、WinMergeという非常に便利なアプリがあるが、同様の機能をMacで探しても有料だったり、英語だったりとイマイチマッチしたアプリがなかった。  
しかし、Visual Studio Codeで簡単にできることがわかった！Windowsでも使えるじゃん、これ！

## 環境
* Macbook Air 2020
* OS
    * MacOS Catalina 10.15.3
* Visual Studio Code March 2020 (version 1.44)


## 使い方
比較したいファイルをアクティブにする。

<img width="1440" alt="Screenshot 2020-05-05 0.20.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/ab702153-476b-a3e6-8847-938c597e535a.png">

`shift+⌘+P`でコマンドパレットを表示させ、`Compare`と入力すると、下の画面のように選択できるので実行する。

<img width="600" alt="Screenshot 2020-05-05 0.21.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/b2e62f93-9b11-c89c-9337-fa3732238e83.png">

比較したいファイルを選択する。

<img width="601" alt="Screenshot 2020-05-05 0.21.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/7c654d98-725a-c155-3ce8-14b8e1203f84.png">

アクティブだったファイルと、コマンドパレットで選択したファイルを比較して、差分に色付けして下図のような表示になる。

<img width="1440" alt="Screenshot 2020-05-05 0.24.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/c3b36c6b-6396-e1b6-7150-3e15da3e7ca9.png">
【seed】rails db:seedで  db/seeds.rb以外を読み込む場合

#問題
db/seeds/product_suggest.rbに配置してあるデータ

```ruby
[
  'toothbrush',
  'tooth paste',
  'eye drops',
  'water',
  'tape',
  'eraser',
  'pencil',
  'shirt',
  't-shirt',
  'towel',
].each do |keyword|
  Product::Suggest.create!(keyword: keyword)
end
```
こちらを、テーブルに読み込ませたいが、今まではdb/seeds.rbに記述したテータのみしか読み込ませた事がなかった。
この場合どのように設定するか検索し、対処した。

#検証環境
```shell
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.3
BuildVersion:	19D76
```
```shell
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
```

```shell
$ rails -v
Rails 5.2.4.2
```

#テーブルの作成
まず、データを流し込むテーブルを作成する。

```shell
rails g  model suggest keyword:string
```
この時、db/seeds/product_suggest.rbで

```ruby
].each do |keyword|
  Product::Suggest.create!(keyword: keyword)
end
```
と各データを、keywordとしてcreateしているので、
keyword:stringとカラムを設定する。

もしモデル名を間違えてしまった場合等、rails g（generate） で作成したものを削除したい場合は、

```shell
rails destroy model suggest
```
等とする。

#クラス名変更
**rails g  model**するとその後、
app/models/に
suggest.rbが作成される。

この時、/product_suggest.rbの記述に合わせる為、
app/models/以下にproductファイルを作成し、
その中に、suggest.rbを移動させ、以下のような配置にした。

**app/models/product/suggest.rb**

更に、suggest.rbのクラス名が最初は、

```ruby
class Suggest < ApplicationRecord
end
```

という記述になっているので、
これも合わせる為に、

```ruby
class Product::Suggest < ApplicationRecord
end
```
に変更する。

#db/seeds.rbの編集
このまま、rails db:seedとしても、読み込まれるのは、`db/seeds.rb`だけなので、
db/seeds.rbに以下を追加する。

```ruby
Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')) do |file|
  load(file)
end
```
こちらを記述することで、db/seeds/ディレクトリ以下のファイルで'*.rb'となっているものをすべて読み込んでくれる。

その後、ターミナルで、

```shell
rails db:migrate
```
マイグレーションファイルからsuggestテーブル作成

```shell
rails db:seed
```
データを流し込む。
#データの確認
```shell
rails dbconsole
```
```
mysql> show tables;
```
テーブル一覧から新規作成できているか確認
```shell
mysql> select * from suggests;
```
テーブル内容の確認。
これでデータが入っている事が確認できる。

`rails console`でも可。

#今回の失敗
最初に、

```ruby
].each do |keyword|
  Product::Suggest.create!(keyword: keyword)
end
```
という部分をみて、


```shell
rails g  model product_suggest keyword:string
```
と間違ったモデル名で作成してしまった。
これだと、クラス名は、`product_suggest`のスネークケースから、Rubyのクラスにされる際に、`ProductSuggest`のキャメルケースに変換され。読み込むファイル（今回だとdb/seeds/product_suggest.rb）に記述されている内容と違ってくる。
このあたりのクラス名とモジュール名の関係を確認できて良かった。今後気をつけていきた


###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
社会人エンジニアがatcoderで茶色を目指す#2

##D問題の対策をしよう！
そもそもD問題ってどんな問題が出るのか。
D問題では何をしたらいいのか。
いくつか解いてみましょう。

##D - Floor Function
問題文はatcoderを参照してください。

- 10^12なのでlong long型
- とりあえず全探索

```C++

    long long A, B, N, max=0;
    std::cin >> A >> B >> N;
    
    for(long long i=1;i<=N;i++){
        long long temp=(A*i)/B-(A*(i/B));
        if(max<temp){
            max=temp;
        }
    }
    
    // insert code here...
    std::cout << max;
    
    return 0;
```

 一番最初のコード。
TELで通りません。

```C++

    int A, B, N;
    cin >> A >> B >> N;
    int x = N;
    
    if(N>B-1) x=B-1;
    int ans = (A*x)/B-A*(x/B);
    
    cout << ans << endl;
    
    return 0;
```

N＝１０、A＝５、B＝３を代入してトレースしていきましょう。
XがBを超えるタイミングで値が最小に戻ります。
Xが最大値かつ、XがBを超えている時はBー1がXの最大値になります。


##D - I hate Factorization
問題文はatcoderを参照してください。

まず最初に考えたのは、
- Xは10^9なのでint型
- Aは正の整数、Bは正と負の可能性
- とりあえず全探索

結局int型を使用しててACになりませんでした。
後日、long longへ変更して気付きました。

```c++
    long long X;
    int A=0, B=0;
    cin >> X;
    
    for(int i=0; i<200; i++){
        for(int j=0; j<200; j++){
            long long Apow5=0, Bpow5=0;
            Apow5 = pow(j, 5);
            Bpow5 = pow(i, 5);
            
            if(X == Apow5-Bpow5){
                A=j;
                B=i;
                goto END;
            }
            
            Bpow5 = pow(-i, 5);
            if(X == Apow5-Bpow5){
                A=j;
                B=-i;
                goto END;
            }
        }
    }
    
    END:
    cout << A << " " << B << endl;
    
    return 0;
```

多分簡単な部類のD問題。
これが解けなかったのは痛い。

##D - Multiple of 2019
問題文はatcoderを参照してください。

- とりあえず全探索

```c++
    int count=0, num=0;
    std::string s;
    std::cin >> s;

    for(int i=0;i<s.length()-4;i++){
       for(int j=i+4;j<s.length();j++){
           num=atoi(s.substr(i,j-i+1).c_str());
           if(num%2019==0){
               count++;
           }
       }
    }

    // insert code here...
    std::cout << count;
    return 0;
```

TELになるのは分かってました。
ここから何をしていいか分からずタイムアップ。

解説を見ても何をしているのか分からない。

##D問題の対策
ABCでは力技の全探索にて回答してきました。
D問題以降では全探索以外のアルゴリズムを学ぶこと。

明日は連続する区間と累積和について勉強を行う。
pythonでcsvデータを処理する(pandasを使ったカウント処理)

#１　対象データ
東京都庁がCOVID-19の感染者データを公開しています。
前回に引き続き、このCSVデータを処理したいと思います。

東京都が公表している感染者データ
[https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c](https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c)
(CSVファイル)
[https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv](https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv)

#２　プログラム
東京都が公開しているデータは新型コロナウイルスの陽性反応の方一人一人の年齢、性別、公表年月日などです。公表年月日ごとの件数を得たいのですが、そのためには、SQLでいうところのGROUP BY やCOUNTのような処理を行う必要があります。
下記のプログラムで日ごとの件数が得られました。

```python:python
import pandas as pd
data = pd.read_csv('130001_tokyo_covid19_patients.csv',header=0) #header=0 先頭行をヘッダとする
#        抽出する列            sqlでいうところの groupby、カウント関数
li = data[['No','公表_年月日']].groupby('公表_年月日').agg(['count'])        
print(li )
```
#３　参考にしたサイトなど
[Python]pandasを使ってcsvファイルの読み込み
[https://qiita.com/f_kazqi/items/0e8e948be44ef2003f71](https://qiita.com/f_kazqi/items/0e8e948be44ef2003f71)

read_csv でヘッダあり・なしCSVの読み込み
[https://qiita.com/yuba/items/d09e387a1ec191eb2738](https://qiita.com/yuba/items/d09e387a1ec191eb2738)

pandasのインデックス参照で行・列を選択し取得
[https://note.nkmk.me/python-pandas-index-row-column/
](https://note.nkmk.me/python-pandas-index-row-column/
)

Pandasでデータの個数を数え上げるcount関数の使い方
[https://deepage.net/features/pandas-count.html](https://deepage.net/features/pandas-count.html)
LinuxMintでタッチパッドの有効無効をショートカットで切り替える


#タッチパッドが煩わしい
　文字入力中にタッチパッドが反応して、誤タイプが発生して困ることがありませんか？私はあります。Windowsなら大体の場合はタッチパッドの有効無効を切り替えるショートカットがありますが、LinuxMintには無さそうです。
　文章やソースコードを書いていると煩わしいので、ショートカット用のシェルを書いて、それをショートカットとして登録してみました。不明点・改善点などあれば、お気軽にコメントくださると嬉しいです。

##環境
**OS**
LinuxMint　19.3　Cinamon
**PC**
ASUS　E203
##流れ
①シェルを用意する
②ショートカットへ登録する

##①シェルを用意する
　適当なファイル名で良いので、sh形式のファイルを用意してそこへ下記のコードをコピペします。ただし、デバイス名は後述の方法でタッチパッドのデバイス名を取得して、置き換えてください。

```toggleTotchpad.sh
#!/bin/bash

# タッチパッドのdevicenameをいれる。
TOUCHPAD="（デバイス名）"

# 下記の値が１ならタッチパッドが有効０なら無効。最初は１を入れておく
isTouchpadEnable=1

# タッチパッドの現在の状態を取得
touchpadStateStr=$(xinput list-props "$TOUCHPAD" | grep "Device Enabled")
touchpadStateStrLength=$((${#touchpadStateStr}-1))
touchpadState=${touchpadStateStr:$touchpadStateStrLength:1}

# タッチパッドの現在の状態が有効（=1）なら無効（=0）にするため0を代入
if [ "$touchpadState" = "1" ];then 
    isTouchpadEnable=0
fi

# タッチパッドの有効無効を切り替え
xinput set-prop "$TOUCHPAD" --type=int --format=8 "Device Enabled" $isTouchpadEnable
```

　色々調べてみたのですが、xinputを使ったものが一番分かりやすかったので、それを使いました。ぶっちゃけかなり力技なコードなので、修正点あったら教えてくださると嬉しいです。

###タッチパッドのデバイス名取得
　上記のシェル内にあるタッチパッドのデバイス名は以下のコマンドで取得できます。取得といっても、接続されている入力デバイスの一覧が出てくるだけなので、末尾がTouchpadとなっているやつを探してください。

```
xinput --list
```
下記のリンクが参考になります。
http://www7b.biglobe.ne.jp/~nishigo/linux/Disable_of_touchpad2.html

##②ショートカットへ登録する
メニューバーからキーボードショートカットの設定を開きます。
![Screenshot at 2020-05-06 17-28-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455591/0e42747e-308d-c6e0-2941-f50277c31bfa.png)

　追加をクリックして、名前とコマンドを入力します。名前は自分がわかれば何でも良いです。コマンドは下記のように入力してください。

```bash
bash (①で作ったshの絶対パス) 
```

![Screenshot at 2020-05-06 17-28-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455591/af110f60-0ec6-d99c-fc55-ff291921cc06.png)


　登録したショートカットが無効になっていると思うので、そこをクリックして好きなショートカットを登録すれば完了です。
![Screenshot at 2020-05-06 17-28-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455591/da417ab8-2a8b-a38a-69be-dd83be8526a3.png)
　私は、WindowsKey+Tにしました。
![Screenshot at 2020-05-06 17-29-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455591/d643890e-e0fc-75b1-5ef2-53697ef3d78e.png)
参考リンクです。
https://www.shangtian.tokyo/entry/2019/01/05/104136
WordPressのデータベースプリフィクスを変更するスクリプト

# はじめに
WordPressのテーブルプリフィクスを変更したかったです。CI/CDで自動デプロイを行う予定です。
プラグインや手動で行う方法は合ったのですが、コマンドで変更する方法が見つからなかったために作成しました。

gistにアップして下記のように実行する想定です。引数に変更後のプリフィクスを指定することができます。

DBに対する変更のため、バックアップは必須です。

```
$ curl -L https://gist.githubusercontent.com/yousan/10b44cea1f3d66ee711cc7161e2d5a8a/raw/d0cd33d0e2fbfad11066628b09af3f325b8255e1/change_db_prefix.sh | bash -s  newprefix_
```

# コード

```bash:change_db_prefix.sh
#!/usr/bin/env bash


PREFIX=`wp db prefix`
NEW_PREFIX=$1

if [[ -z "$1" ]] ; then
  echo 'No prefix is specified. Please specify new table prefix.'
  exit;
fi

# Get all WordPress tables
# @see https://developer.wordpress.org/cli/commands/db/tables/
TABLES=`wp db tables --all-tables-with-prefix`

# Change options and usermeta table value
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}options
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}usermeta

# Rename tables
# @see https://www.wpbeginner.com/wp-tutorials/how-to-change-the-wordpress-database-prefix-to-improve-security/
IFS=$'\n'
for TABLE in ${TABLES}
do
NEW_TABLE=`echo ${TABLE} | sed -e 's/^'${PREFIX}'/'${NEW_PREFIX}'/'`
echo 'DROP TABLE IF EXISTS ' ${NEW_TABLE} | wp db cli # Remove tables
echo 'RENAME TABLE `'${TABLE}'` TO `'${NEW_TABLE}'`;' | wp db cli # Do RENAME here
done

# Change table prefix at wp-config.php
wp config set table_prefix ${NEW_PREFIX}
```

https://gist.github.com/yousan/10b44cea1f3d66ee711cc7161e2d5a8a

# 変更前のプリフィクスの取得

```bash
$ wp db prefix
wp_
```


# テーブル一覧の取得
テーブル一覧を取得します。一部のプラグインでは`--all-tables-with-prefix`オプションが無いとうまく取得することができなかったためつけています。
ただこのオプションの場合、単にオプションだけで判断するため、偶然プリフィクスがかぶってしまった…、という場合にはテーブルが壊れます。

```bash
$ wp db tables --all-tables-with-prefix
```

# optionsとusermetaの変更

`wp_options`と`wp_usermeta`のデータの中身を書き換えます。
主に権限周りなどでテーブル内にデータが入っているため、そちらを書き換えます。

```bash
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}options
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}usermeta
```

こちらも強制的に変えているため、もしプリフィクスが短い文字列だったりした場合には予期せぬ動作（他のデータを壊す可能性）があります。

# テーブルの変更

テーブルのリストでループを回し、書き換えを行ないます。

```bash
IFS=$'\n'
for TABLE in ${TABLES}
do
NEW_TABLE=`echo ${TABLE} | sed -e 's/^'${PREFIX}'/'${NEW_PREFIX}'/'`
echo 'DROP TABLE IF EXISTS ' ${NEW_TABLE} | wp db cli # Remove tables
echo 'RENAME TABLE `'${TABLE}'` TO `'${NEW_TABLE}'`;' | wp db cli # Do RENAME here
done
```

まず変換先のテーブル名を作成します。例えば `wp_posts` から `new_posts` といったテーブル名にします。

```
$ echo ${TABLE} | sed -e 's/^'${PREFIX}'/'${NEW_PREFIX}'/'
```

次に`wp db cli`でテーブル名変更のSQLを実行します。

```bash
echo 'DROP TABLE IF EXISTS ' ${NEW_TABLE} | wp db cli # Remove tables
echo 'RENAME TABLE `'${TABLE}'` TO `'${NEW_TABLE}'`;' | wp db cli # Do RENAME here
```

# wp-config.php内のプリフィクスの変更
`wp-config.php`の`$prefix`の項目を書き換えます。
これ知らなかったんですがめちゃくちゃ便利ですね…！

```bash
$ wp config set table_prefix ${NEW_PREFIX}
```
OpenSSLをデフォルトのLibreSSLからOpenSSLに変更

[macOS High Sierra（OSX）のOpenSSLをデフォルトのLibreSSLからOpenSSLに変更する](https://qiita.com/moroi/items/53d60d1d6885795a0f6f)
[brew link openssl --forceができない問題](https://qiita.com/dasisyouyu/items/c9621c29b0fe79d2b7c4)
[gemのupdateがopensslのせいで通らない](https://www.takasay.com/entry/2014/11/22/080000)
axiosでPOSTした複数のファイルをFlaskでcatchする

# はじめに
はじめてQiitaに投稿します。
私もエンジニアの端くれとしてアウトプットはしておきたいなと思ったので投稿します。
個人的にWeb上で入力された複数のファイルをバックエンドで動いているFlask上にPOSTする際に
わからなかったところがあるので残しておこうと思います。
ちなみにフロントにはVue.jsを使用しています。

# 複数ファイルの入力をする
htmlで複数ファイルを入力するときはmultiple属性にmultipleを指定します。
このときに入力されたファイルをselectedFile関数でデータを保存しておきます。

```html
<input @change="selectedFile" type="file" name="uploadFiles" multiple="multiple" />
```

```javascript
selectedFile: function (e) {
    e.preventDefault()
    const files = e.target.files
    for (const file of files) {
        this.uploadFiles.push(file)
    }
}
```
# ファイルをPOSTする
ファイルを選択したあとに下記の関数を使用します。
方法はファイルをPOSTするためにformdataにFileオブジェクトを格納してPOSTします。

```javascript
submit: function () {
    const formData = new FormData()
    for (let i = 0; i < this.uploadFiles.length; i++) {
        // iの箇所の名前を使用して、ファイルを抽出する
        formData.append(i, this.uploadFiles[i])
    }
    const config = {
        headers: {
          'content-type': 'multipart/form-data'
        }
   }
   axios
    .post('/api/merge', formData, config)
    .then(function (response) {
        // response 処理
        // backendで編集したファイルを受け取る
        const blob = new Blob([response.data], { type: 'application/pdf' })
    })
}
```

# Flaskでファイルをcatchする

POSTされたformDataはFlask側ではrequest.filesで呼び出すことができます。
このfilesはdictなのでitems()を使って複数のファイルを呼び出せます。

```python:api.py
for key, file in request.files.items():
    # keyはformDataでappendした際につけた名前が取得される
    filepath = f"./tmp/{key}.pdf"
    # filepathにファイルを保存する
    file.save(filepath)
   
```

# おわりに
Flaskでfileをcatchするときにinputタグのnmae属性を使用して取得することは書かれていたのですが、axiosで複数ファイルをPOSTした際のファイルの取得方法が見つからなかったので記載しました。
もともと文書を書くことが苦手なのですこしずつ書くことに慣れて行こうと思います。
pythonメモ - 「if not A and B」は「if (not A) and B」だった件

# はじめに
if notの構文で静かにハマったのでメモ残す。

# not演算子とは？
参考：https://www.sejuku.net/blog/65070

if文におけるnot演算子は条件式が偽の場合、真を返す。
これだけだとちょっとわけわからないので例文。

```:例文
x = 10
if not x == 20:
    print(True)
else:
    print(False)
```

```:実行結果
True
```

```:実際の使用例
if not len(sys.argv[1:]):
    usage()
```
このスクリプトを見ると、
「引数が１以上では無い（＝引数が無い）場合は、usage()を呼び出す。」となる。
まぁ、これはわからないでもない。

# よくわからなかったケース
ハマったのが以下の文。andとnotの合わせ技。ちょっとよくわからない…
if (not listen) and len(target) and port > 0:
なのか、
if not (listen and len(target) and port > 0):
なのか分からなくなって悩んだ。
```:例文
if not listen and len(target) and port > 0:
    buffer = sys.stdin.read()
    client_sender(buffer)           
```

# and/or演算子を含む場合の読み方
 結論からいうとこのスクリプトと同意。notはlistenにしか掛かってない。
```:例文
if (not listen) and len(target) and port > 0:
    buffer = sys.stdin.read()
    client_sender(buffer)           
```

これだけだとわからないので、いくつか例文を書いて確認した。

```
x = 20
y = 20

# ケース１：結果は「No」
if not x == 10 and y == 20
    print("Yes")
else:
    print("No")

# ケース２：カッコを付けて条件式の評価順位を明確にしたところ、結果はケース１と同じく「No」
if (not x == 10) and y == 20
    print("Yes")
else:
    print("No")

# ケース３：not ==ではなく!=にしてみた。こちらも結果はケース１と同じく「No」
if x != 10 and y == 20
    print("Yes")
else:
    print("No")
```
# おわりに
こんな記事をQiitaに残すのはなかなか恥ずかしいけど
当時何にハマったのか、ということを思い出に残したくて投稿しました。
自分の場合こういう何でもないことでハマることは何度も繰り返すので。
UnityのUの字もわからないレベルから始めるVRChatのワールド作り(心意気、基礎知識編)

# 目標
形になるまで挫折しないやり方を理解する
何をすればいいのかを策定する
分からない項目の調べ方を理解する

# どの位の人向けなのか
なにも分からないけどワールド作りに興味が沸いた人
なにも分からない人
挫折しそうな人
初めてワールド作る人

# 肝に銘じること
分からないことがあったらgoogleに聞きましょう。
そのときには<b>「何をしたくて」「そのために何をしようとして」「何が原因で出来ないか」</b>を整理しましょう。
何をすればいいのか分からないのなら、教材や資料を参考にしましょう。<b>一番難しいのは「何をしたいか」を見つけることです。</b>
それでも分からなかったら、人に聞きましょう。的確に説明できていれば、「なぜ出来ないか」を理解してもらえるはずです。

# やっちゃいけない事
「はー分からん俺もうダメだぁ」とか「ウチ理解力ないから無理だわｗ」と言うのはやめましょう。
理解しようとしない内は何も分からないのは当然です。でも、出来ている人には出来ています。
時間はかかるかもしれませんが、<b>その人に出来て自分に出来ない理由はありません。</b>
理解しようとすれば出来ます。

誰でも最初はUnity分かんないです。ネット上にはそういった人のための資料が大量にあります。
「Unity 床 すり抜ける」「VRChat 鏡 出し方」などなど、調べればたくさん出てきます。活用しましょう。

#まずやる事
現実的なゴールを策定します。
一番最初のおすすめゴールはここです。椅子と鏡と床があるだけのワールドです。例えばこれですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/cf890038-da2a-640b-b5b6-0b0bf5030e6f.png)

<b>は？こんなワールド作りたくないんだが？</b>と思ったそこのアナタへ

料理に例えましょう。
「レシピ通りに作ったのに美味しく出来なかった」という人はいっぱいいると思います。
美味しく出来なかった原因の殆どは「分量ミス」「手順ミス」ですが、まれによくあるのが「最初から高難易度」「オリジナルアレンジ」です。
「美味しくなると思ってやった」とは言いますが、<b>大体失敗します。</b>

まずはシンプルなものをレシピ通りに作れるようになりましょう。<b>分からないなら猶更、説明通りに作りましょう。</b>

#で、ワールド作りってどうやるの？

[記事へジャンプ](https://qiita.com/tamsco274/items/fce42eced1de4532b907)

※2023/02/14更新 下記内容は古いです。
~~[基本編へ](https://qiita.com/tamsco274/items/f8fb52eafe012a40e76f)~~

# 基礎知識
大雑把に言うと、よく出る用語です。
## ウィンドウ
タブと呼ぶ人もいます。エディタ上に存在するウィンドウで、それぞれ役目があります。また、動かせます。
ウィンドウ上部のタブで切り替えが可能です。
よく使うものだけ残します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/3cdd2d61-7aa5-4fda-addb-1a1ccfaec397.png)

###ヒエラルキー
シーン上に配置されているオブジェクトです。階層構造になっており、Windows等のフォルダと同じ考え方でOKです。
余談ですが、キチンと整理しておくと後々助かることが多いです。最初のうちからやっておきましょう。

###シーン(ウィンドウ)
見ての通りです。実際にどう配置されているか等が見れます。
物を動かしたい時は、シーン上で直接動かすほかに、インスペクター上で数値を入力させることでも実現できます。

###インスペクター
選択しているオブジェクトの持つコンポーネント(≒機能)一覧です。ワールド製作をする際はこのコンポーネントを意識することが多いです。
よく使います。

###プロジェクト
ファイル一覧です。ヒエラルキーはシーン上に「配置されているオブジェクト」であるのに対し、こっちは「使用可能なファイル」です。
説明が難しいですが、それ自体の理解は簡単だと思います。

##インスペクター内
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/fbf8d3d8-e0ae-1449-8dd6-a7da83db3d6a.png)

###チェックボックス(左上)
チェックを入れると、アクティブになります。チェックを外すと非アクティブになります。
ここは実際に触ってみた方が理解しやすいです。また、コンポーネントのチェックボックスも同じです。

###Staticチェックボックス(右上)
例えば背景の壁や床、光源など、「動的に変化しないもの」はチェックを入れましょう。
Unityの内部処理の関係で、負荷の軽減につながります。
###Transform
「位置」「回転」「サイズ(スケール)」を調整できます。なるべく桁数の少ない少数ないし整数で管理したいですね。
###コライダー(Collidor)
当たり判定です。シーン上では緑の線が表示されます。~~大体緑色のアイコンです。~~
Is Triggerにチェックを入れると、「ぶつかったことは検知するけど、貫通させる」状態になります。
Is Triggerについては他で調べた方が早いかもです。
###レイヤー
最初は知らなくても大丈夫です。ウィンドウ右上にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/3e64d2c5-6a75-f51c-5499-a6cec8edc6ef.png)