OmniAICreator/Qiita-1.07M huggingface dataset:
VirtualBoxにCentOS 8をインストールする


#はじめに
こんにちは、mittsukanと申します。
qiita初投稿になります。
自分のやっていることが誰かのお役に立てればと思い、始めました。

手順は2020年8月現在のものになります。

#0.動作環境
本投稿では、以下の環境を利用します。
・CPU：Intel Core i5-8265U
・メモリ：8.00 GB
・OS：Windows 10 Pro

#1.VirtualBoxのダウンロード
VirtualBoxは下記の公式サイトからダウンロードできます。
https://www.virtualbox.org/

上記サイトにアクセスし、「Downloads」をクリックします。
![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/ac0292fb-e879-67d0-5649-32d741f19390.jpeg)

ダウンロードページに移るので、「VirtualBox 6.1.12 platform packages」の中から、動作環境に合ったOSを選びます。
本投稿ではWindwos 10を使用しているので「Windows hosts」を選択し、インストーラのダウンロードを行います。
![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/5e55d4a4-04e2-5cf8-4a85-9fcb5e2aa90a.jpeg)

ダウンロードしたインストーラをクリックして実行します。
セットアップウィザードが起動され、インストール場所やショートカットの作成の有無などが聞かれますが、変更したいことが無ければ、ひたすら「Next」「Yes」で問題ありません。

インストールのウィザード画面まで遷移したら、「Install」をクリックしてインストールを開始します。
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/c9ee3604-bb1b-6707-c484-cc7864994b85.jpeg)

インストールが完了したら、「Start Oracle VM VirtualBox 6.1.12 after installation」にチェックを入れたまま、「Finish」をクリックします。
![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/88a6ca5e-8c4d-f859-04ed-432f59d118e2.jpeg)

Oracle VM VirtualBox マネージャーが起動すれば、インストールは成功です。
![WS000015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/00a2a8e2-320f-76e0-528f-12d40ef27775.jpeg)

#2.CentOSのインストール

CentOSは下記のCentOSプロジェクトの公式サイトからダウンロードダウンロードできます。
https://www.centos.org/

上記サイトにアクセスし、「CentOS Linux」をクリックします。
（すぐ右に「CentOS Stream」というものが存在するが、こちらはCentOS 8から新しく導入された、高頻度でアップデートが行われるディストリビューションのことらしい。詳細については下記サイトに詳しく記載されていたので、ここでは割愛させていただく。）
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/14f335ad-f242-30dc-cf5c-aaeca932a355.jpeg)

バージョン8の64ビット版ISOファイルを選択します。
![WS000016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/268bfb56-c93c-dd04-e4c0-c2946c1d7b73.jpeg)

ダウンロードできるミラーサイトの一覧が表示されます。
どのサイトからダウンロードしても良いのですが、今回は国内サイトの「mirrors.cat.net」よりダウンロードを行います。
![WS000017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/6c6e84b9-3977-c6da-344d-95014d1667b8.jpeg)

完全インストール用のイメージファイルであるバイナリーDVDを選択してダウンロード開始します。
![WS000020.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689573/c3c2e8f2-9415-cfcd-b9d9-5860ee836e16.jpeg)

無事完了したら、CentOS8のダウンロードは完了です。
Pythonで頂点を通る近似曲線の係数の求め方

##概要

2次元平面上の$n$個の点 $(x_1,y_1),\cdots,(x_n,y_n)$ を通る$m$次曲線 $y=a_mx^m+a_{m-1}x^{m-1}+\cdots+a_1x+a_0$ の係数 $a_0,\dots,a_m$ を求めたい。
$n\le m+1 $ かつ $x_1,\cdots,x_n$ の値がすべて異なる場合すべての点を通る曲線が存在するが、そうでない場合は点と曲線の誤差が最小となるような係数を取る必要がある。
その際にscipyのfminメソッドが使えそうだ。
ただしfmin関数は目的関数の局所最適解を求めるため、最適解となっていない場合があるため注意。

##3次曲線のプログラム例

```python
import numpy as np
from scipy.optimize import fmin

def f(a, x):
    # 3次曲線
    return a[0] + a[1]*x + a[2]*x**2 + a[3]*x**3

def obj_func(a,x,y):
    # 頂点と曲線との二乗誤差の和を目的関数とする
    return sum((f(a,x) - y)**2)

# 5点を与える
x = np.array([ -8.,  -3.,  2.,   6.,   9.])
y = np.array([ 30., -22., 15., -17., -25.])

# 係数の初期値
a= np.array([ 0., 0., 0., 0.])

# 最適な係数を求める
opt = fmin(obj_func, a, args=(x,y))

print(opt)
# [-8.20775435  3.2028276   0.2150416  -0.09395258]
```

![figout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259220/43a61e24-0a6b-6ea3-91e9-f661713151ae.png)
【GAS】定期的にいらないメールを消したいな

# はじめに
こんにちは。


先日ふと思ったのですが、Gmailめっちゃ溜まってて、いらないメールたくさんあるなと。
特にメールマガジンとか、マネーフォワードMEの出金のお知らせとか。。

フィルタでゴミ箱に勝手に移動してもいいけど、理想はGmailでアプリでプッシュ通知が来る受信箱に入れて、1度はメールに目を通したい。

そうだ、しばらくしたら勝手に消そう。

# 作戦
1. Gmailでしばらくしたら消したいメールに任意のラベルを付加するフィルタ作成。
1. GASで1で設定したラベルのメール検索して指定期間より前のメールを削除。
1. GASのトリガーで毎日実行。

# 実装
1. とりあえずマネーフォワードMEから来るメール(from:`feedback@moneyforward.com`)に対して、`過去30日で自動削除`というラベルを付加するフィルタ作成[^1]。
1. GASは以下で行けた。
1. GASの時間ベースのトリガーで0-1時に実行に設定。

## GAS
```js:code.gs
const deleteMail = () => {
  let offset = 0;
  const limit = 500;
  const now = new Date();
  const ymd = Utilities.formatDate(new Date(now.getFullYear(), now.getMonth(), now.getDate() - 30), 'Asia/Tokyo', 'yyyy/MM/dd');   

  while (true) {
    var threads = GmailApp.search(`label:過去30日で自動削除 before:${ymd}`, offset, limit);
    offset += limit;
    
    for (thread in threads) {
      for (key in threads[thread].getMessages()) {
        if (threads[thread].getMessages()[key].isInTrash()) {
          continue;
        }
        threads[thread].getMessages()[key].moveToTrash();
      } 
    }
    if (threads.length < limit) break;
  }
}
```

[^1]: https://office-hack.com/gmail/folder-division/

# おわりに
これでプッシュ通知でメールを即座に確認できるし、ほっといても勝手に消えるから、やりたいことは満たせた。けど、何かに会員登録するたびにフィルタ設定編集するのはめんどそう :thinking_face:
cakephp4 migrate,seedのtips

# migrate
## 基本操作

* migrateファイルを作成する([参考](https://book.cakephp.org/migrations/3/ja/index.html#id3))

```
bin/cake bake migration CreateProducts name:string description:text created modified
```

* migrateファイルを編集する([参考](https://book.cakephp.org/migrations/3/ja/index.html#id9))


```
$table->addColumn('name', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
```

* migrateを実行する([参考](https://book.cakephp.org/migrations/3/ja/index.html#migrate))


```
bin/cake migrations migrate
```

* migrateをロールバックする([参考](https://book.cakephp.org/migrations/3/ja/index.html#rollback))


```
bin/cake migrations rollback
```

## Tips

* 全てのテーブルに機械的に入れる登録日、更新日はマニュアルに合わせてcreatedとmodified、または`xxx_at`形式を利用する([参考](https://book.cakephp.org/migrations/3/ja/index.html#id8))
自動で`datetime`と判断してもらえるぐらいの恩恵しかないかもしれないけれども。

* 機械的に入れる登録日、更新日には`default`,`update`に`CURRENT_TIMESTAMP`を設定すると、ソースコードから設定しないで済むので便利。

```
$table->addColumn('created', 'datetime', [
    'default' => 'CURRENT_TIMESTAMP',
    'null' => false,
]);
$table->addColumn('modified', 'datetime', [
    'default' => 'CURRENT_TIMESTAMP',
    'null' => false,
    'update' => 'CURRENT_TIMESTAMP',
]);
```

* 初期開発時点ではあまりMigrationファイルを増やしたくないので、rollbackして再度migrateしている。（最初から複数人開発する場合はできないけど）


# seeds
## 基本操作

* seedファイルを作成する([参考]
(https://book.cakephp.org/migrations/3/ja/index.html#seed))

```
bin/cake bake seed Local
```

* seedデータを投入する([参考]
(https://book.cakephp.org/migrations/3/ja/index.html#seed))

```
bin/cake migrations seed
```


## Tips

* seedはテーブルごとに作っても良いが、ローカル向けで簡単に作りたいなら１ファイルで行ってしまって良い
ファイル数増えて実行順番とか考えると大変なので１ファイルで作ってしまうことが多い。以下のようなイメージ。
テーブル数が多いならprivate functionではなく別ファイルにしても良いかも。

```
    public function run()
    {

        $this->insertAaas();
        $this->insertBbbs();

    }

    private function insertAaas(){
        $data = [xxx];
        $table = $this->table('Aaas');
        $table->insert($data)->save();
    }
```

* 再実行可能なようにtruncateを含ませる
seedデータ変更の都度、データをtruncateするのは面倒くさいので、seedに記載してしまう。
truncateは外部キー制約のあるテーブルに対してはエラーになるので`SET FOREIGN_KEY_CHECKS = 0`するのがポイント

```
use Cake\Datasource\ConnectionManager;
(略)
    public function run()
    {

        $connection = ConnectionManager::get('default');
        $connection->execute('SET FOREIGN_KEY_CHECKS = 0');

        $this->table('aaas')->truncate();
        $this->table('bbbs')->truncate();

        $connection->execute('SET FOREIGN_KEY_CHECKS = 1');

        $this->insertAaas();
        $this->insertBbbs();
    }
```

# 参考
https://book.cakephp.org/migrations/3/ja/index.html#
NervesJP #10 NervesでGPIO触ってみた

# 参考にした記事
https://qiita.com/kikuyuta/items/5779da9f14f4639ebdbe
https://qiita.com/kikuyuta/items/904acd2ce4117168d22a

# やったこと

赤色LED①：赤ボタンが押されている時、消灯
赤色LED②：赤ボタンが押されている時、点灯
緑色LED①：黒ボタンを押す→離すのあと1秒後に消灯
緑色LED②：黒ボタンを押す→離すのあと5秒後に消灯

![IMG_0263.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326104/02440965-d76d-7ff3-bb8f-7d5ff1047e23.jpeg)

# 詳細・学んだこと
・NervesでGPIOを使う（Circuits.GPIO ライブラリを使う）
・GPIO制御用モジュール、参考URLそのまま
・workerから呼び出す関数に処理を記述する（今回はButtonLedモジュールの中に記載）
・起動時に実行するためにapplication.exにworkerの記述を追加

※備忘録：`export MIX_TARGET=...`の実行は忘れないように…。

``` elixir:buttonled.ex
defmodule ButtonLed do
    require Logger
    require GpioInOut

    def button_oneshot(button0_name, button0_no, button1_name, button1_no, led0_name, led0_no, led1_name, led1_no, led2_name, led2_no, led3_name, led3_no, delay2, delay3, interval \\ 50) do
        GpioInOut.start_link(button0_name, button0_no, :input)
        GpioInOut.start_link(button1_name, button1_no, :input)
        GpioInOut.start_link(led0_name, led0_no, :output)
        GpioInOut.start_link(led1_name, led1_no, :output)
        GpioInOut.start_link(led2_name, led2_no, :output)
        GpioInOut.start_link(led3_name, led3_no, :output)
        oneshot_loop(button0_name, button1_name, led0_name, led1_name, led2_name, led3_name, div(delay2, interval), div(delay3, interval), interval)
    end

    defp oneshot_loop(button0_name, button1_name, led0_name, led1_name, led2_name, led3_name, count2, count3, interval, prev \\ 1, timer2 \\ 0, timer3 \\ 0) do
        Logger.debug("#{0..timer2 |> Enum.map(fn _n -> "*" end)}")
        Logger.debug("#{0..timer3 |> Enum.map(fn _n -> "*" end)}")
        
        {:ok, val} = GpioInOut.read(button0_name)
        GpioInOut.write(led0_name, val)
        GpioInOut.write(led1_name, 1-val)

        {:ok, now} = GpioInOut.read(button1_name)
        timer2 = if (now == 0) and (prev == 1), do: count2, else: timer2
        timer2 = if (timer2 > 0), do: timer2 - 1, else: 0
        timer3 = if (now == 0) and (prev == 1), do: count3, else: timer3
        timer3 = if (timer3 > 0), do: timer3 - 1, else: 0
        GpioInOut.write(led2_name, (if (timer2 > 0), do: 1, else: 0))
        GpioInOut.write(led2_name, (if (timer2 > 0), do: 1, else: 0))
        GpioInOut.write(led3_name, (if (timer3 > 0), do: 1, else: 0))
        GpioInOut.write(led3_name, (if (timer3 > 0), do: 1, else: 0))

        Process.sleep(interval)

        oneshot_loop(button0_name, button1_name, led0_name, led1_name, led2_name, led3_name, count2, count3, interval, now, timer2, timer3)
    end
end 
```

# 課題・次のステップ
・タイマーの処理のあたりをもう少しきちんと理解したい。
・SPI、イベントドリブン
・Webのインタフェース（Phoenixとか）
[Go]自作モジュールを認識してくれない

自作のモジュールをVSCodeが認識してくれなかったのでメモ。

##目的
自作モジュールをVSCodeで認識させる。

##問題点
自作のモジュールをVSCodeが認識してくれないし、importのところに追加しても保存時に消えてしまってた。

##結論
exportしたい自作モジュールのメソッド名の最初は大文字で始めること

##補足
こんなことで数時間溶かしてしまった。。。
Swift Library MonthlyCalendar

# MonthlyCalendar

指定した日付の月カレンダーを配列で返すライブラリ。

<img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/08/MonthlyCalendar.jpeg" alt="" width="311" height="448" class="alignnone size-full wp-image-4217" />

UI含めたライブラリはいくつかあります。
UIは自分で開発するため、UI以外をライブラリ化。
画像は開発している手帳アプリ内で開発したものをライブラリ化。

## GitHub

Swift Packageです。
<a href="https://github.com/cloudsquare22/MonthlyCalendar">https://github.com/cloudsquare22/MonthlyCalendar</a>

## 使い方

```swift
import MonthlyCalendar

let mc = MonthlyCalendar(day: Date())
print(mc.days)
```

```tex
[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30], [31, 0, 0, 0, 0, 0, 0]]
```

詳細は<a href="https://github.com/cloudsquare22/MonthlyCalendar/blob/master/README.md">README</a>を参照して下さい。
最短距離でGCPでLAMPサーバ建ててHelloWorldする

## はじめに
さくっとLAMPサーバ建てたいときの手順メモ。
できるだけ初心者向けに書いたつもり。
GCPのアカウントを既に持ってる前提です。
bitnamiの仮想マシンを構築します。

## 手順

1. [GCPのコンソール](https://console.cloud.google.com/) にアクセスして、ログイン。

2. 必要に応じてプロジェクトを新規に作成（既に適当なプロジェクトを作成しているのなら、やらなくてもいい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/eae196d3-f975-32e8-2f35-2f5ac977b56e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/d88df7d7-f9a5-e13a-94c0-b69e2ffbbaa3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/d5ac9d76-f082-7bfe-06ef-ad2573e9d8ec.png)
↑ プロジェクト名を設定して[作成]ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/984d7c48-7d63-428b-4342-70533823db52.png)
↑ プロジェクトを作成できたので、このプロジェクト上で環境を構築する。

3. Conpute EngineでVMインスタンスの画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/094f0186-894a-4202-1020-9ece0e7e8a6f.png)

4. インスタンスの[作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/19bcacf7-0cde-44d2-9044-38f1262d0299.png)

5. 画面左側の「Marketplace」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/b48b5850-36f2-d550-99d3-465eeb7cabac.png)

6. bitnamiのLAMPの仮想マシンを探して選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/51e0c059-b01b-1a6f-8b4e-b21bfcebea2d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/ef48fe87-b1e2-e0ac-a4a4-79301cc8e16a.png)

7. 仮想マシンのスペックを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/2393c21e-fc9b-8e8a-9f3c-73bf6d2d926f.png)
↑ HelloWorldするだけだからMichineTypeは「micro」で、Diskは「Standard Persistent Disk」でサイズも10GBもあれば余裕でいける。あと、詳細は書きませんが「Zone」は「AlwaysFree」が適用される所を選択しています、適用の条件は今後変わることもあるだろうし各自で調べてみてください。

8. デプロイできた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/1631bb48-413e-adce-1669-da3ac7e158fc.png)

9. 当該仮想マシンの外部IPのアドレスへ、ウェブブラウザ(ここではChromeを使用)を使ってhttpでアクセスしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/e80368c6-6908-2153-5376-08e98413b2dc.png)
↑ 「Bitnami LAMP」ののページが表示される。

10. GCPのコンソールで 「Compute Engine > VMインスタンス」 から対象仮想マシンの「SSH」をクリックすると、ターミナルの画面が起動してsshでマシンにログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/727ab9b9-8bed-a52b-e060-5614d8bc01a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/ecf4c996-2d24-c183-4868-b4df6bb280b9.png)

11. Hello Worldのソースコードを書く

    ```
    $ cd /opt/bitnami/apache2/htdocs/
    $ sudo vi hello.php
    ```
    ↑ apacheのパスの場所がちょっと個性的です。
 
    ```php:hello.php
    <?php
    echo "Hello World!";
    echo phpinfo();
    ```
    ↑ ついでに「phpinfo()」も書いておきます。


12. ウェブブラウザで「http://[仮想マシンのIPアドレス]/hello.php」にアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689761/ca02c8b1-1497-efe9-daad-2dc3b8995123.png)
↑ 「Hello World」と表示できた。

## 最後に

本記事はあくまでHello Worldをするだけの手順です。
ウェブページを本格的にサービスとして提供しようとするなら。
ドメインを取得したりSSL証明書を適用したりサーバのファイアーウォールの設定をしたりとか、
様々な事をきちんとやってセキュリティを担保しないと駄目です。


### 以上
Joint2D系の共通パラメータまとめ

今回はこれからの記事を書きやすくするために共通するパラメータのまとめを書いていこうと思います。
一部のジョイントではここに書かれたパラメータはありませんが、今回はそれを気にしないで書いていきます。
#パラメータ
###・Enable　Collision 
下のConnected Rigid Bodyにアタッチされたリジッドボディとの`当たり判定をするかどうか`を決めます。
チェックボックスにチェックが入っていると当たり判定が可能になります。
###・Connected Rigid Body
ここに他のオブジェクトをドラッグ＆ドロップすると`そのオブジェクトとつながった状態`になります。
つながった状態と言っても一心同体ということではなく、手をつないだくらいの感覚です。
ここが**None**だとワールド座標とつながった状態になります。
###・Auto Configure Connected Anchor
ここのチェックボックスにチェックを入れると２つ下の**Connected Anchor**に自動的に値が入ります。
**Auto Configure**と書いてあるものにチェックを入れると`その後ろに書かれているパラメータに自動的に値が入ります`。
###・Anchor
このオブジェクト側のアンカーポイントを決めるパラメータです。
ここで決められた値はジョイントの機能における`このオブジェクト側の基準点`になります。
###・Connected Anchor 
Connected Rigid Bodyにアタッチしたオブジェクト側のアンカーポイントを決めるパラメータです。
ここで決められた値はジョイントの機能における`もう一方のオブジェクト側の基準点`になります。
###・Max Force
両方のオブジェクトに加えられる力の最大値を決めるパラメータです。
`「加えられる力」`というのはプレイヤー側だけではなく`ジョイント側にも影響されます`。
つまりジョイント側もオブジェクトをアンカーポイントに戻そうとするとき、ここで決められた以上の力でオブジェクトを動かすことができなくなりる、ということです。
###・Max Torque
両方のオブジェクトに加えられる回転力の最大値を決めるパラメータです。
回転力というのは`オブジェクトを回転させる力`ということです。
その説明であまりピンとこない場合、`オブジェクトの方向を変える力`と考えたら分かりやすいかもしれません。
このパラメータは基本的にMax Forceの回転力バージョンです。
###・Break Force
このジョイントをオブジェクトから削除するのに必要な力を決めるパラメータです。
infinityだとジョイントが削除されることはありません。infinityに戻したい場合は「inf」と入力してください。
Max Forceより大きい値を入れるとジョイントが削除されなくなるので注意してください。
###・Break Torque
基本的にBreak Forceの回転力バージョンです。

#おわりに
今回はJoint2D系の共通パラメータについてまとめました。
これからJoint2Dの記事はこの記事を活用して書いていこうと思います。
【初心者】xamppを使ってmySQLの勉強 - その1：データベースって？ -

## はじめに
最近、勉強のためにxamppを使ってmySQLをちょっとだけ触ったので、何回かに分けてメモ。
今回は用語を中心にまとめてみようかと思います。

## データベース
はい、いつも通りとりあえずググってみました。

>「データベース」とは、ある特定の条件に当てはまる「データ」を複数集めて、後で使いやすい形に整理した情報のかたまりのことを表します。

※引用元：https://proengineer.internous.co.jp/content/columnfeature/6411

確かにそうですね。紙でもExcelでもなんでもいいのですが、とにかく色々な情報＝データを集めてあるだけではなく、それらが<b>使いやすいようになっていること</b>がポイントなんじゃないかと思います。

## リレーショナルデータベース（RDB）
リレーショナル＝関連、データベース＝使いやすくなっている情報のかたまり
つまり、訳すと「<b>関係データベース</b>」って言われます（え、そのまま‥笑）
これはデータベースの管理方法の1つで、全てのデータベースがRDBということではないんです。
じゃあ他にはどんなものがあるのかって思いますよね。わたしも知りません:joy:笑
調べてみたら、ややこしかったのでとりあえず忘れることにしました‥。

## データベースマネジメントシステム（DBMS）
今回勉強に使ってみたmySQLはデータベースマネジメントシステムの1つ。
別にExcelにデータが入力されている状態でもいいのですが、世の中にあるありとあらゆるシステムを想像してみてください。（SNS、ECサイト、ATM、コンビニ、役所、病院・・・）Excelでは事足りないことが容易に想像できますよね。
世の中にあるサービスやシステムが扱う情報はDBMSでデータ管理がされているからこそ、スッとパッとデータを必要な時に必要なものを取り出せるわけです。

DBMSはmySQL以外にもメジャーなところとして「<b>PostgreSQL</b>」「<b>Oracle Database</b>」といろいろあります。種類は違えど、DBMSとしての役割には変わりありません。

ちなみに、色々調べているときにRDBMSと書いてある記事もありましたが、先頭のRはRelationalの略。つまり、リレーショナルデータベース（＝データベースの管理方法でしたね）のマネジメントシステムという意味になるため、きちんと限定して提示したい場合はRも付けて書いておいた方がより分かりやすいですね。

## SQL（Structured Query Language）
スッとパッと取り出したりするには、やっぱりおまじないが必要！それがSQL！！
RDBMSごとに書き方と使える機能は若干異なりますが、どれもSQLを書いて実行することで欲しいデータを取り出したり、時には加工したり書き換えたり…なんてことが出来るのです。
※書き方については、その3くらいで！

SQLはコンピュータ言語の1つではありますが、プログラミング言語ではありません。RDBのデータを操作するための言語です。

## ここで一気に用語のまとめ！
良く出てくる基本的な用語を一番馴染みがあるExcelに置き換えながら考えてみました。

Excel的用語 | DBMS的用語 | 補足
--- | --- | ---
ファイル | データベース | データが入っている全体の箱
シート | テーブル | 整理整頓されて分類されたデータ群
行 | レコード | テーブル内の1行1行のデータ
列 | カラム | 1行のデータに存在する各項目のこと

データベースっていうとなんかとっつきにくいですが、Excelに例えるとそんなに難しいことじゃないように見えてくる‥。でもここで1つ疑問が‥。
最初の方から出てきた「リレーショナル」「関係」とか「整理された」ってどういうこと？って話ですよ。何が関係？見やすい表＝整理されたって意味ではないの？ってこと。そこで登場するのが<b>ER図</b>です。

## ER図
RDBMSを使用してデータベースを構築する場合、もちろん設計が必要になります。
その際、

 - <b>どんなデータを保存するのか</b>
 - <b>どういう風にデータを保存しておけば扱いやすくなるのか</b>
 - <b>そのためには、それぞれのテーブルの関係性をどうしておくべきか</b>

などなど、これ以外にもいろいろな検討が必要になります。
これらを検討して設計した結果、出来上がるのがRDBMSの全体像としてまとめられたER図ということになるわけです。また、この全体像の中で、どのテーブルとどのテーブルを使えば、今自分が欲しいデータが取り出せるのか、ということも分かるようになります。

このER図は、開発者やデータを調査するような保守担当者など、いろいろな人にどんな構成でデータが管理されているかを共有できるものになります。

## DB定義書
ER図は全体像と各テーブルの関係性を示したものですが、各テーブルにどんなデータをどのように管理しているのかまでは分かりません。
そこで必要になるのがDB定義書です。これがあることで、どのテーブルに何のデータが保存されているのかが分かるようになります。また、データの種類（数字、文字、日付など）も確認することが出来ます。

## 次回の予告
今回はデータベースってなんぞや？ってところから、用語を中心にまとめてみました。
これだけでは何の役にも立たないので、次回のその2では、実際にmySQLでデータベースを作成してみたいと思います！
PostgresQLのDate型、Time型をGoのTime型にパースする

少しハマったのでメモ
## 目的
PostgresQLに保存されているDate型とTime型のレコードをGoのTime型として扱うのに、値をパースしたい。

## 問題点
普通にPostgresQLのTime型の'10:00'というデータをロードすると、
`0000-01-01T10:00:00Z`
という文字列になってしまうので、これをGoのtimeパッケージのTime型として認識させたい。

## 結論
`createdAt, _ := time.Parse(time.RFC3339, value.CreatedAt)`
これで`createdAt`という変数にtime.Time型の値が入ったので、あとは好きなようにフォーマットを選ぶだけ（valueにはPostgresQLからロードしたデータが入っている）。
今回は時間だけ欲しかったので、`createdAt.Format("15:04")`とすればHH:mmのフォーマットの値が取得できる（今回のデータでは10:00）。

※time.Time型のフォーマットの方法は他の記事を参考のこと

## 補足
日付の形式には色々あって、PostgresQLの場合はRFC3339になっていたのかな。
[PostgresQLのドキュメント](https://www.postgresql.jp/document/9.3/html/datatype-datetime.html)によれば、標準でISO8601に準拠していると記載があったが、RFC3339とISO8601の違いはあまり分かっていない。

他の形式の場合にも使えるフォーマットがtimeパッケージには定数で色々あるので[Goのドキュメント](https://golang.org/pkg/time/#pkg-constants)を参照のこと。
【Laravel】コントローラ基礎（その１）

Laravelでは、ルート定義ファイル`routes/web.php`にて、リクエストの処理をクロージャで定義できます。しかし、そのクロージャで定義するよりも、コントローラクラスを使用することで、HTTPリクエストの処理ロジックを一つのクラスへまとめることができます。

コントローラは`app/Http/Controllers`に設置しておいてください。

## コントローラの定義
```php
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\User;

class UserController extends Controller
{
    public function show($id)
    {
        return view('user.profile',['user'=>User::findOrFail($id)]);
    }
}
```

もし上記の例コードがあり、コントローラアクションへのルートは次のようにすると

```php
Route::get('user/{id}','UserController@show');
```

これで、指定したルート（上記の例では`user/{id}`の部分）のURIが一致したリクエストがきたら、`UserController`の`Show`メソッドが実行されるという感じになります。`user/{id}`の`{id}`部分のパラメータはメソッドに渡されます。
Spacemacsのlispステートについて

# はじめに
この記事はspacemacsのlispステートについて(割と自分向けに)書いた記事です。
lispを日常的に書くのにlisp-stateに慣れなければ、ということで調べました。~~(あと元vimmerにはpareditのキーバインドが厳しい)~~


# キーバインド

## トグル
| キー | 動作 |
|:-:|:-:|
| . | lisp-stateとnormal-stateをトグルする |

normal-stateでSPC-k-[]でlisp-stateに入ることができます。

## 繰り返し

| キー | 動作 |
|:-:|:-:|
| n [] | n回 []を繰り返す |

例えば10 sであれば10回後方のS式をslurpします。

## 移動
| キー | 動作 |
|:-:|:-:|
| h | 前方のシンボルに移動 |
| l | 後方のシンボルに移動 |
| k | 前の"("に移動 |
| j | 後ろの")"に移動 |
| 0 | カーソル位置のS式の"("に移動(外側に移動しない) |
| $ | カーソル位置のS式の")"に移動(外側に移動しない) |
| % | 0と$を繰り返す |


## slurp/barf
| キー | 動作 | from | to |
|:-:|:-:|:-:|:-:|
| s | 飲み込む | カーソルのあるS式の外側1つ後ろ | カーソルのあるS式の最後尾 |
| S | 飲み込む |カーソルのあるS式の外側1つ前 | カーソルのあるS式の先頭 |
| b | 吐き出す |カーソルのあるS式の外側1つ後ろ | カーソルのあるS式の最後尾 |
| B | 吐き出す |カーソルのあるS式の外側1つ前 | カーソルのあるS式の先頭 |
| a | 飲み込む | カーソルのあるS式の外側1つ前 | カーソル前方 |

lispを書くときに必要な2つ道具です。
slurpは飲み込み、barfは吐き出しと言われます。
前方後方のシンボルやカッコをカーソルのあるカッコに飲み込み/吐き出しします。
queueやstackのpushやpopというとわかるかもしれません。
動かしてみるのが一番わかりやすいと思います(雑)。

## insert-state

| キー | 動作 |
|:-:|:-:|
| i | カーソル位置でinsert-stateに移行 |
| I | カーソルのあるS式前方でinsert-stateに移行 |
| ( | カーソルのあるS式の前に()を挿入後insert-stateに移行 |
| ) | カーソルのあるS式の後に()を挿入後insert-stateに移行 |

なおinsert-stateを抜けると必ずnormal-stateになります。

## visual-state
| キー | 動作 |
|:-:|:-:|
| v | カーソル位置でvisual-stateに移行 |
| V | カーソル位置でvisual-line-stateに移行 |
| C-v | カーソル位置でvisual-block-stateに移行 |

## 囲う

| キー | 動作 |
|:-:|:-:|
| w | カーソルのS式(そうでない場合は1つ前)を()で囲う |
| W | カーソルのS式(そうでない場合は1つ前)の()を外す |

## yank/paste

| キー | 動作 |
|:-:|:-:|
| y | カーソル位置にある文字をyank |
| p | カーソル位置にpaste |
| P | カーソル位置の後方にpaste |

**pasteはシンボルを感知しません。**
つまりカーソル位置がシンボルにあった場合カーソル位置に挿入されシンボルはカーソル位置から真っ二つにされます。

## delete

| キー | 動作 |
|:-:|:-:|
| ds | 後方にあるシンボルを消去する |
| Ds | 前方にあるシンボルを消去する |
| dw | カーソル位置からシンボルの終端までを消去する |
| Dw | カーソル位置からシンボルの前方までを消去する |
| dx | カーソル位置の式を消去する |
| Dx | カーソル前方の式を消去する |
deleteは消すだけでyankはされません。

## その他

| キー | 動作 |
|:-:|:-:|
| t | カーソル位置と前方のカッコやシンボルを入れ替える |
| : | コマンドの入力 |
| c | ? |

convoluteは説明を読んでも理解ができませんでした...

# 終わりに

使って理解するしかないと思います。意識せずかけるようになりたいですね...
各stateについてできることが色々あるので便利に使っていきたいです。
参考:
https://github.com/syl20bnr/evil-lisp-state
PythonでGmailを送信する


# 事前準備
Googleアカウントのセキュリティを変更して、pythonからメールを送信できるようにする必要があります。

Googleアカウントのセキュリティから
Googleへのログイン-２段階認証プロセスをオンに変更、
アプリ パスワードを設定します。

![セキュリティ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/4417fe7c-4ca1-ab61-0264-2f4a8ee85fde.jpeg)



# SMTPサーバに接続する
Gmailのサーバアドレス（smtp.gmail.com）、ポート587に自分のGoogleアカウントとパスワードでログインする必要があります。

```
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.starttls()
smtpobj.login(sendAddress, password)
```

# 送信するメールを作成する
MIMETextに送信するメールの内容を追加します。
['Subject']に件名、['From']に送信元のメールアドレス、['To']に送信先のメールアドレスを追加することができます。

```
msg = MIMEText(bodyText)
msg['Subject'] = subject
msg['From'] = fromAddress
msg['To'] = toAddress
msg['Date'] = formatdate()
```

# メールの送信
send_messageで作成したメールを送ることができます。

```
smtpobj.send_message(msg)
smtpobj.close()
```


# まとめ

```
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

sendAddress = '自分のメールアドレス'
password = 'パスワード'

subject = '件名'
bodyText = '本文'
fromAddress = '送信元のメールアドレス'
toAddress = '送信先のメールアドレス'

# SMTPサーバに接続
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.starttls()
smtpobj.login(sendAddress, password)

# メール作成
msg = MIMEText(bodyText)
msg['Subject'] = subject
msg['From'] = fromAddress
msg['To'] = toAddress
msg['Date'] = formatdate()

# 作成したメールを送信
smtpobj.send_message(msg)
smtpobj.close()
```
Docker DesktopでKubernetesがずっとstartingで固まる場合の対処法

Kubernetes の名前をよく聞くので Docker Desktop で試そうとしたら、そもそも起動しなかったというお話。

# 環境
- macOS 10.15.5
- Docker Desktop 2.3.0.4
  - Kubernetes v1.16.5

# 事象

**Preferences** の **Kubernetes** を開き、 **Enable Kubernetes** にチェックを入れ、 **Apply & Restart** ボタンをクリックする。

左下にステータスが表示されるが、Kubernetes がずっと **starting** のまま、 **running** にならない。

![ずっとstartingのまま.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141299/5eca1d16-0881-5889-d7de-1915ab4aa4c5.png)

# 対処法

GitHub の Issue に [対処法](https://github.com/docker/for-mac/issues/2990#issuecomment-544754304) が載っていた。ファイルの削除を伴うので、 **自己責任で** お願いします（念の為）。

以下のコマンドを実行する。

```
$ rm -rf ~/Library/Group\ Containers/group.com.docker/pki/
$ rm -rf ~/.kube
```

**Preferences** の **Troubleshoot** を開き、 **Restart** ボタンをクリックする。

![Restartボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141299/e2d567bb-7a81-24cb-00fe-0416447417d1.png)


うまくいけば、左下の Kubernetes が **running** になるはず。

![runningになった.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141299/9daece90-cb7d-07bd-8ca7-ce81d9493e42.png)


# 後日譚

数日おいてもう一度起動してみたけど、やっぱりうまく起動しない（もう一度上の手順をやったら起動したが...）

非力な PC スペックのせいもあって辛いので、結局、GKE に移った。
Tips: MVPキャンバスをMarkdownで書く

# 背景
現在チームでの仮説検証を行なっていくフォーマットとして、MVPキャンバスを用いています。
MVPキャンバスをGithubのissueで管理したかったので、MVPキャンバスをMarkdownで書くためのテンプレートを用意しました。
大体のMarkdownで記述できるサービスで利用できると思います。
https://qiita.com/hashito/items/66b1d67e5f5df7409866 を参考に作成しました。
MVPキャンバスについては https://qiita.com/hellokenta/items/a211af60d7a2d92706b0

# テンプレート
```md
<table  border="1">
  <tr>
    <td colspan="3">
      <b>仮説</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="3">
      <b>何を何学ぶのか</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="1">
      <b>どう検証するのか</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>仮説検証に必要なデータや条件</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>何を作るのか</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="1">
      <b>構築に必要なコスト</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>実証に必要なコスト</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>回避できる/発生するリスク</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="3">
      <b>結果</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="3">
      <b>得た学び</b><br>
      ここに記入
    </td>
  </tr>
</table>

```

# 見た目
<table  border="1">
  <tr>
    <td colspan="3">
      <b>仮説</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="3">
      <b>何を何学ぶのか</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="1">
      <b>どう検証するのか</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>仮説検証に必要なデータや条件</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>何を作るのか</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="1">
      <b>構築に必要なコスト</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>実証に必要なコスト</b><br>
      ここに記入
    </td>
    <td colspan="1">
      <b>回避できる/発生するリスク</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="3">
      <b>結果</b><br>
      ここに記入
    </td>
  </tr>
  <tr>
    <td colspan="3">
      <b>得た学び</b><br>
      ここに記入
    </td>
  </tr>
</table>
asdfasdfマンから卒業！FakeFillerで開発中のテキストフィールドへの入力を楽にしよう！

##asdfasdfマンとは

![スクリーンショット 2020-08-16 16.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266846/2a7a50cd-2bf1-20c5-7d74-5c6897150fb0.png)


やあみんな。開発中の画面の入力にasdfasdfしてないかい？
テスト中にテキストフィールドを埋めるとき、毎回asdfasdfと入力するのもだんだん面倒になってくるよね

##Chrome拡張のFakeFillerを使うと一発で適当なデータを埋めてくれる！

https://chrome.google.com/webstore/detail/fake-filler/bnjjngeaknajbdcgpfkgnonkmififhfo

Chrome拡張なのでインストールも簡単です。

###これが・・・

![スクリーンショット 2020-08-16 16.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266846/e3ed1e7e-e045-7eec-d175-9fb0bcdc3254.png)

###一発でこうじゃ

![スクリーンショット 2020-08-16 16.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266846/d4006b6a-9454-77f2-434b-457dd41c574f.png)

##大量のフィールドがあるときは特に便利

上記のような２，３点のフィールドだけなら、毎回手入力でもいいかもしれませんが、
これが10,20となってくると面倒ですよね。

##フィールドのカスタマイズも可能やで

もちろん、どんな名前のフィールドにどんなデータを埋めるか（メールアドレスや電話番号など）というテンプレートも用意されてるよ。ただ、名前や住所などの定型フォーマットは日本語には未対応。

だれか日本語に対応したフォーム自動入力拡張を作ってください。。。
Windows10 Eclipse環境構築＆何してるのか深堀 2020年8月

JavaのEclipseでの開発環境構築について、備忘録を兼ねて記事にまとめました。

2020年8月時点です。

##環境
OS: Windows10

#1. JavaのJDK入手
Eclipseインストーラ実行に必要な、Javaの実行環境を準備する(JDKの入手)。
###手順
https://openjdk.java.net
・install→jdk.java.net→Ready for use: JDK 14→Windows64bit
　から<font color=red>JDK</font>をダウンロード。
・解凍して、「<font color=orange>jdk-14.0.2</font>」ができることを確認する。
・C:\ドライブ直下に「<font color=orange>jdk-14.0.2</font>」を移動する(他の場所でも可だが、パスが長すぎたり日本語が入ってるとエラーの原因になる)。
・パスは「<font color=orange>C:\jdk-14.0.2</font>」になる。
(14.0.2は記事作成時のバージョン)
###解説
#####<font color=red>JDK</font>とは
Java SE Development kit
Javaでプログラミング開発を行う際に必要なキット
<font color=blue>JRE</font>、Java SE等が入っている。
#####<font color=blue>JRE</font>とは
Java Runtime Environment
Javaの実行環境
開発をせず、Javaの実行だけをしたい場合はこれだけでも動く。
JRE内にはJavaVMというJavaを動かす仮想環境が入っている(JavaVMのおかげであらゆるOSでJavaが動作する)
<font color=red>Eclipse本体はJavaで動く。これがないとEclipseのインストーラーすら動かない(正確にはjava1.8.0(java.exe)どこ？って聞かれる)。</font>
#####Java SEとは
Java Standart Edition
Javaのプログラミングで必要な最低限の機能をまとめたもの
System.out.printlnもここに含まれる

#2. 環境変数の設定
###手順
Windowsキー→「環境変数」と入力
→「システム環境変数の編集」→「環境変数」

下側「システム環境変数」内に「新規」
→変数名「JAVA_HOME」、変数値「<font color=orange>C:\jdk-14.0.2</font>」

下側「システム環境変数」内「Path」を探してWクリック→「環境変数名の編集」画面が開く
「新規」→「<font color=orange>C:\jdk-14.0.2\bin</font>」を入力

consoleを開いて、「java -version」でバージョン確認できれば完了

###解説
#####何してるのか→consoleコマンドの簡略化
consoleからjavaを実行するときに、コマンドを簡略化するため。
パスを設定していると「java -version」コマンドで済むものが
パスを設定していないと「C:\jdk-14.0.2\bin\java.exe -version」まで
コマンドを打たなくてはいけなくなる。

#####Eclipseインストーラー実行時に簡略化できる。
Pathを設定しないとEclipseインストーラ実行時に「java1.8.0(java.exe)どこ？」って聞かれる。
Pathを設定してるとEclipseインストーラが一発で実行される。

#3.Eclipseのインストール
※古いEclipseが入っている場合は削除しておく。
###手順
http://www.eclipse.org/
「Download」→「Download 64bit」
にてEclipseインストーラをダウンロード

・インストーラを右クリック→管理者として実行

####インストール中の選択項目等について
・「Eclipse IDE for Java Developers」を選択
　「Eclipse IDE for Enterprise Java Developers」は企業向け
・インストールするフォルダは、「<font color=orange>C:\eclipse\jee-2020-06</font>」のようにわかりやすいほうがいい。
・workspaceの設定は、作成するJavaのプロジェクトの保存場所を指定する。
　「<font color=orange>C:\work</font>」等わかりやすい場所を作るとよい。
　注意点として、パスが長すぎたり、日本語が含まれるとエラーの原因になる。

その他項目について特筆する点は無し。
そのまま実行していけばインストールが完了する。
Dockerよく使うコマンド


よく使うものだけ備忘のために置いておく

* docker-compose.ymlを使ってコンテナを起動する

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

* 立ち上げたコンテナにbashで入る

```
docker container exec -it コンテナ名 bash
```

*　起動時のログを見る

```
docker-compose logs -f
```

* docker-compose.ymlを使ってコンテナを止める場合はこちら（止めるだけなら`down`だけ。全部形したい場合は以下のパラメータつける）

```
docker-compose down --rmi all --volumes
```

* 存在するコンテナを確認する(立ち上がっていないコンテナも見る場合は`-a`をつける)

```
docker ps
docker ps -a
```

* コンテナを停止する

```
docker stop xxx
```
Git&GitHub学習まとめ

# Git用語
## 場所
|用語|意味|
|:--|:--|
|ワークツリー|編集を行う場所|
|ステージングエリア|コミットするファイルを登録する場所|
|Gitディレクトリ|コミットを格納する場所|
|ローカルリポジトリ|自分専用のリポジトリ|
|リモートリポジトリ|共同で使うリモートリポジトリ|

## 状態
|用語|意味|
|:--|:--|
|untracked|Gitの管理外（新規作成されたばかりのファイル等）|
|unmodified|変更されていない|
|modified|変更済み|
|staged|ステージングエリアに登録済み|
|コンフリクト(競合)|変更の衝突が起こっている|

# コマンド関連
## パス
|表すもの|記号|
|:--|:--|
|カレントディレクトリ|.|
|ホームディレクトリ|~|
|ルートディレクトリ|/|

## 通常コマンド
|コマンド|動き|
|:--|:--|
|pwd|カレントディレクトリの絶対パスが表示される|
|mkdir ディレクトリパス|指定したディレクトリを作成|
|ls|現在のディレクトリの内容を表示|
|ls -a|現在のディレクトリの全ての内容を表示|
|cd ディレクトリパス|指定したディレクトリに移動する|
|mv [元のファイル、ディレクトリパス] [移動先のファイル・ディレクトリパス]|ファイル・ディレクトリの移動|

## バージョン確認、設定
|コマンド|動き|
|:--|:--|
|git --version|Gitのバージョンを確認|
|git config --list|設定値の一覧を確認|

## リポジトリ
|コマンド|動き|
|:--|:--|
|git init|ローカルリポジトリを作成する|
|git remote add origin リモートリポジトリのURL|指定した名前で指定したURLのリモートリポジトリを設定に追加|
|git remote remove リモートリポジトリ名|リモートリポジトリの設定を削除|

## コミットの作成
|コマンド|動き|
|:--|:--|
|git add ファイル名|ステージングエリアに指定したファイルの変更を登録する|
|git commit|コミットを作成する|
|git commit -m "commitコメント"|エディタを開かずにコミット|
|git commit -am "commitコメント"|ステージングエリアに登録し、エディタも開かずにコミット|
|git rm|Git管理下のファイル削除|
|git rm -r|Git管理下のディレクトリ削除|
|git cherry-pick コミット番号|他ブランチの特定コミットのみを反映する|

## 状態の確認
|コマンド|動き|
|:--|:--|
|git status|ローカルリポジトリの状態を確認する|
|git diff|ワークツリーとステージングエリアの差分を確認する|
|git diff --cached|ステージングエリアとGitディレクトリの差分を確認する|
|git log|コミットの履歴を確認する|
|git log -p|コミットの履歴を確認する(差分付き)|

## 状態の復元
|コマンド|動き|
|:--|:--|
|git checkout|ワークツリーの変更を取り消す(ステージングエリアの状態に戻す|
|git reset|ステージングエリアに追加した変更をワークツリーへ戻す|

## ブランチ
|コマンド|動き|
|:--|:--|
|git branch|使用中のブランチを確認する|
|git branch ブランチ名|指定した名前のブランチを作成する|
|git branch -m 変更前のブランチ名 変更後のブランチ名|ブランチの名前を変更|
|git checkout ブランチ名|指定した名前のブランチに切り替える|
|git checkout -b ブランチ名|ブランチを作成し、ブランチを切り替える|
|git diff ブランチ名|現在のブランチとの比較|
|git merge ブランチ名|現在使用中のブランチにマージ|


## プル＆フェッチ
プル = フェッチ + マージ

|用語|意味|
|:--|:--|
|プル|ワークツリーまで取得内容が反映される|
|フェッチ|ローカルリポジトリまでの取得しかしない|

|コマンド|動き|
|:--|:--|
|git pull リモートリポジトリ名 プルするブランチ名|プルする|
|git fetch リモートリポジトリ名|フェッチする|

ローカルリポジトリに存在しないブランチを取得する際には、フェッチを行い、チェックアウトする必要がある

# GitHubを使ってソース管理を始める方法

## GitHub上から始める
1. GitHubでリポジトリ作成
2. ローカルにクローン

## 既存のリポジトリをフォークして始める
オリジナルのリポジトリに影響を与えることなくファイルに変更を加えることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678952/56d1f38f-177f-f0a6-78cf-7347b345a162.png)

## ローカルリポジトリとリモートリポジトリを紐づける
https://qiita.com/terack/items/be1d7f606a89be5cab85

# Gitブランチモデル
無秩序にブランチを切るのではなく、ルールを決めてブランチを切ることでコードを管理する。
その際に参考にするのがGitブランチモデル。

- [git-flowモデル](https://qiita.com/terack/items/9215c8615e5d86ce93fb)
- GitHub Flowモデル
- GitLab Flowモデル

# 参考
いちばんやさしいGit&GitHubの教本
https://book.impress.co.jp/books/1118101036
波ダッシュと全角チルダの闇

#正規表現で思うように処理してくれない事件勃発
私が業務で保守運用しているサービスにて特定のデータ反映がうまく行かないとの問い合わせが発生。
該当箇所のソースは以下。

```
if(preg_match('/^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2} [0-9]{1,2}:[0-9]{2}/', $d[$val])) : 
// 2020/12/24 17:00:00

elseif(preg_match('/^[0-9]{2}\-[0-9]{2}\-[0-9]{2}$/', $d[$val])) : 
// 20-24-16
          
elseif(preg_match('/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/', $d[$val])) : 
// 2020-12-24
 
elseif(preg_match('/^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2}$/', $d[$val])) : 
// 2020/12/24
       
elseif(preg_match('/^[0-9]{2}\/[0-9]{2}\/[0-9]{2}  [0-9]{2}:[0-9]{2}/', $d[$val])) : 
// 12-24-20 17:00:00

elseif(preg_match('/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2} [0-9]{1,2}:[0-9]{2}/', $d[$val])) : 
// 12/24/20 17:00:00
    
elseif(preg_match('/^([0-9]{1,2})月([0-9]{1,2})日（(.+)）([0-9]{1,2}:[0-9]{2})(.+)([0-9]{1,2}:[0-9]{2})$/', $d[$val], $matches)) : 
// 12月24日（日）17:00〜19:0
endif;
```
入力された日程データの形式で処理を行うという記述ですね。
おおよそ考えられうるすべての日程形式に対応できるよう記述しているつもりなのですがどれにも当てはまらず処理が行われていませんでした。
入力されていたデータを確認したところ最下段の判定に引っかかるような記述でした。
長時間頭を抱えたのですが結論から言うと「全角チルダとではなく波ダッシュを記載していた」というものでした。

#ちょっと詳しく全角チルダと波ダッシュ
「～」と「〜」は実は全く違う文字らしいですね。
見た目がほとんど同じではあるんですが、内部的に持っている文字コード番号が違うようです。
波ダッシュ：U+301C 
全角チルダ：U+FF5E
なので一見正規表現でヒットするはずであろう記述でも全角チルダと波ダッシュの違いでfalseと判定されてしまっていたようです。
Windowsで「から」と検索：～(←全角チルダ)
Macで「から」と検索：〜(←波ダッシュ)
まじで統一してくれ。。

#終わりに
今回は波ダッシュを全角チルダに書き換えることにしましたが本来であれば両方に対応できるのが良いと思います。
疲れたマン
Quandl APIで株価データを取得する[Python] 

# はじめに
世界の様々な金融関連のデータをAPIで提供しているQuandl APIを使って、株価データを取得してみました。
Quandl APIサービスの使い方と個人的なサービスの感想をお伝えできればと思ってます。
（私はケチなので、無料で使える範囲での特徴のご紹介となります。）



# Quandl API
Quandlの公式サイト：https://www.quandl.com/

### ライブラリインストール
```
$ pip install Quandl
```

### サンプルコード
トークンはQuandlにアカウント登録すれば、取得できます。
サンプルコードでは、コカ・コーラ社の株価を取得してます。
勿論、日本株のデータも取得できます。
例えば、トヨタ社の株価を取得したい場合は、```'WIKI/KO'```を```'TSE/7203'```に変更すると取得できます。

```sample_quandl.py
import quandl

quandl.ApiConfig.api_key="MY_TOKEN"
data=quandl.get('WIKI/KO')
print(data)
```
### 実行結果
1962年から2018年までの株価を取得できました。
しかし、2020年時に実行した結果、2018年までのデータしか取得できなかったので、最新の株価は取得できないようです。（日本株も無料版だと最新のデータは取れないようです。）

```
              Open      High      Low   Close      Volume  ...  Adj. Open  Adj. High   Adj. Low  Adj. Close  Adj. Volume
Date                                                       ...
1962-01-02  101.00  103.7500  101.000  101.00     16800.0  ...   0.262323   0.269465   0.262323    0.262323    1612800.0
1962-01-03   99.50   99.5000   97.250   98.75     32800.0  ...   0.258427   0.258427   0.252583    0.256479    3148800.0
1962-01-04   99.00  100.2500   99.000   99.50     17600.0  ...   0.257128   0.260375   0.257128    0.258427    1689600.0
1962-01-05   99.50  100.7500   97.000   97.25     29600.0  ...   0.258427   0.261673   0.251934    0.252583    2841600.0
1962-01-08   96.50   96.5000   94.380   96.25     42400.0  ...   0.250635   0.250635   0.245129    0.249986    4070400.0
...            ...       ...      ...     ...         ...  ...        ...        ...        ...         ...          ...
2018-03-21   43.13   43.4500   42.790   43.00  13029766.0  ...  43.130000  43.450000  42.790000   43.000000   13029766.0
2018-03-22   42.88   43.3650   42.700   42.76  12134714.0  ...  42.880000  43.365000  42.700000   42.760000   12134714.0
2018-03-23   42.82   43.1556   42.290   42.33  13190877.0  ...  42.820000  43.155600  42.290000   42.330000   13190877.0
2018-03-26   42.61   42.8099   42.250   42.69  10939927.0  ...  42.610000  42.809900  42.250000   42.690000   10939927.0
2018-03-27   42.70   43.3100   42.525   42.89  11595357.0  ...  42.700000  43.310000  42.525000   42.890000   11595357.0

[14155 rows x 12 columns]
```

### 個人的な感想
Quandl APIは無料版だと最新の株価データは取得できないようです。
私は最新の株価データを使ったサービスを作りたかったので、最新版の株価を取得できるような別のAPIサービスを探そうと思います。
メモ　AWS Lambda

参考にした講演はこちらです。
https://www.youtube.com/watch?v=QvPgjEwgiew&t=1314s


#AWS Lambdaの基本(part1)
##Lambda関数
- Lambda関数とは、AWS Lambdaで実行するアプリケーションのこと
- それぞれが隔離されたコンテナ内で実行される
- 実行の際に呼び出す
- コードは依存関係も含めてアップロード

###サポートされている言語
サポートされていない言語はカスタムランタイムを実装することで利用可能

###Lambdaファンクション基本設定
- メモリ
    - 64MBごとに128MB～3008MB
    - 容量に応じてCPU能力も比例
    - メモリ容量が一定を超えると使用するコア数も増える
- タイムアウト
    - 最大15分
- 実行ロール
    - AWSリソースアクセス用のIAMロールを準備


###Lambdaファンクションの制限
- インバウンドネットワーク接続はブロックされる
- アウトバウンドはTCP/IPとUDP/IPソケットのみ
- ptraceシステムコールはブロックされる
- TCP 25番ポートのトラフィックはブロックされる

###Lambda の実行環境
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

###イベントソース
- イベントソースとは・・・イベントの発生元となるAWSのサービスまたはユーザが開発したアプリケーション
- イベントソースには3タイプ
    - ポーリングベース・・・Lambdaがポーリングをして処理するデータが有る場合にLambda関数を実行
        - ストリームベース
        - ストリームベース以外
    - ポーリングベース以外
        - Lambda関数はイベントソースから呼び出される

####呼び出しタイプ

###Lambda関数のライフサイクル
1. ENIの作成
2. コンテナの作成
3. デプロイパッケージのロード
4. デプロイパッケージの展開
5. ランタイム起動・初期化
6. 関数/メソッドの実行
7. コンテナの破棄

- 1～6を新規に実行するのがコールドスタート
    - コールドスタートが起こる条件 = 利用可能なコンテナがない場合
        - 1つもコンテナがない
        - 利用可能な数以上に同時に処理すべきリクエストがきた
        - コード、設定を変更した
- 1～6を再利用するのがウォームスタート
    - 安定的にリクエスト数が発生している場合はウォームスタート？

ユースケース

- サーバーレスサムネイル作成

- サーバーレス CRON Job
    - CloudWatch 1時間ごとにラムダのタスクを実行するようにする。
    - ※一時的なタスク実行をCRON Jobというらしい。
        - https://ja.wikipedia.org/wiki/Crontab

#ラムダの制限
- RAM 128mBから3G
- CPU　
    - RAMに依存する
    - 2 vCPU
- 時間制限
    - 15分間
- /tmp ストレージ 512MB　大きなファイルを処理不可。
- パッケージ容量制限　250MB
- 同時実行数
    - ある時点における実行中のLambada関数の数
    - 実績に応じて制限緩和申請が可能
- Function burst concurrency　1000?（増やすこと可能） 500-3000
    - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html

#ラムダ　レイテンシー
★ここわからん

#セキュリティ
- IAMロール
    - ラムダが他のAWSサービスにアクセスできるようにIAMロールを割り当てる。
- リソースベースポリシー for Lambda
    - 他のアカウントがLambdaをアクセスできるように許可
    - 他のAWSサービスがLambdaをアクセスできるように許可
- VPCとの併用
    - ラムダをVPC内にデプロイすることが可能。
    - VPC内にデプロイしたラムダからインターネットに接続するには設定が必要。
        - プライベートサブネット内のEC2→インターネットと同様の設定をする
        - 参考　VPC に接続した関数のインターネットアクセスとサービスアクセス
        - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html
- ラムダの監視
    - CloudWatch
        - 実行ログは CloudWatch Logsに格納
        - メトリックスはCloudWatch Metricsに表示
        - 重要　ラムダ関数がCloudWatch logsへの書き込み(IAMロール）権限を持っているか確認
    - X-Ray
        - （X-Ray勉強しないとわからん）
        - トレースできる
        - 重要　ラムダ関数が実行ロールあるか確認


# 同期呼び出し(Invocation)
- CLI, SDK, API GWが対応
- すぐに結果が帰ってくる
- エラーハンドリングはクライアント側で行う
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-sync.html

# 非同期呼び出し(Invocation)
- S3, SNS, CloudWatch Events・・・
- ラムダはリトライを試みる（3回）
- ユースケース例. S3にファイルが作成されたとき
- プロセスが冪等（idempotent）かを確かめる
    - 冪等性について勉強が必要
- dead letter queueの送信
    - プロセスが失敗したときにSNS or SQSへ送信する
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async.html

#イベントソースマッピング
- Kinesis, DynamoDB, SQS, SQS FIFOが対応
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-eventsourcemapping.html
- （これわからない）

#疑問点
冪等性とは？？
- 1回だけ処理したいものが1回だけ処理される？
- Lambdaは1回だけ処理したいものが複数回処理が行われることがあるから、DynamoDB等で冪等性を保証しないといけない。
https://dev.classmethod.jp/articles/lambda-dynamodb/
オープン・クローズドの原則 - Open/Closed principle -

お久しぶりです。せしまるです。

今回はSOLOD原則の一つ、「オープン・クローズドの原則」について書いていきます。
いつも通り備忘録的な・・

#オープン・クローズドの原則 is 何

クラスやモジュールなどは、拡張の為に開いていて、修正の為に閉じていなければならない、ということ

「拡張しやすいけど、修正箇所は少ない」という感じにクラス設計するのかな、と考えてます

ソースコードを交えて説明。

ケーキを作るメソッドとケーキクラスがあるとします。

```C#:Cake.cs
public class Cake
{
    public void CreateCheeseCake()
    {
    }

    public void CreateChocolateCake()
    {
    }
}
```

```C#:使用箇所
public void Order(string orderName)
{
    var cake = new Cake();
    if( orderName == "チーズケーキ" )
    {
        cake.CreateCheeseCake();
    }
    else
    {
        cake.CreateChocolateCake();
    }
}
```

今はチーズケーキとチョコレートケーキが作れますが、作りたいケーキの種類が増えた場合を考えてみましょう。
使用箇所側ではロールケーキ用の分岐が必要になりますね、else ifを増やすか、switch文に変更するか…
どちらの場合でも、クラス側・使用箇所のどちらにも変更が入ってしまいます（修正に対して閉じられてない）

では、修正に対して閉じるために、インターフェースを使用してみます。

```C#:Interface.cs
public interface CakeInterface
{
    public void Create();
}
```

```C#:インターフェースを実装したケーキクラスたち
public class CheeseCake : CakeInterface
{
    public void Create()
    {
        // チーズケーキ
    }
}

public class ChocolateCake : CakeInterface
{
    public void Create()
    {
        // チョコレートケーキ
    }
}

public class RollCake : CakeInterface
{
    public void Create()
    {
        // ロールケーキ
    }
}
```

```C#:使用箇所
public void Order(CakeInterface cake)
{
    cake.Create();
}
```

このようにすれば、ケーキの種類が増えても、CakeInterfaceを実装したクラスを増やすだけで良くなります。
各ケーキに修正があったとしても、各クラスの修正をすればよいので、修正に閉じられてると言えますね！

以上！
新規感染者数の対数plot

対数plotで推移を見たいんだが何故かあまり見かけないのでちょっと暇があったので、自分で書いてみた。

### 1
元データは（とりあえず東京でいいやということで）、 https://stopcovid19.metro.tokyo.lg.jp ここにあるのは分かって、「テーブルを表示」を選択すると日毎の新規感染者数がちゃんと見れるので、これをplotするだけ。
どうせなら、URL指定して R から直接読みたいなと思ったら、「オープンデータを入手」から「探索」タブでダウンロードを選んだらなんと一人づつの情報が取れてしまう。

そうじゃなくて…、と思ったが、まあ R は統計解析向けの処理系だからヒストグラム書くぐらい簡単にできるだろと思ったのでなんとか手でこねくり回してみた。

とりあえず、`table()`とかやるとヒストグラム化できるっぽい（返ってきたデータをどう加工できるのかは不明）。
標準的な`plot()`命令で対数プロットは普通にかける。
`str(dat)`で列名などが確認でき、`$列名`で参照すればいい。

```R
# CSV読み込み。普通にURLで指定できる
dat <- read.csv('https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv')
# データの確認
str(dat)
# "公表_年月日"列でカウントできる（返ってくるのはなんかのテーブル構造）
dat2 <- table(dat$公表_年月日)
# log plotする。0を含んでいたので範囲指定必要
plot(dat2, log="y", ylim=c(1,1e4))
```

こんな、欲しかった絵が得られた。

![plot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170148/884d7ab2-d3be-7949-5cee-048bedef6060.png)

やっぱりサチってるよなぁ

### 2

曜日の効果を消してみたくて、まずはこんなことをしてみた

```R
# 年月日と曜日2D hist
dat3 <- table(dat$公表_年月日, dat$曜日)
# hist3Dはplot3Dに含まれているのでパッケージ読み込み
library(plot3D)
# 描画
hist3D(z=dat3, border = "black", phi=10, theta=-30)
```

こんな図が得られる。

![hist1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170148/d41c99fd-4e9a-7e13-6ce3-d14d59155244.png)


plot3Dは最初`install.packages("plot3D")`でインストールしてやる必要があった（どこにインストールされるのかは不明）。
残念ながらhist3Dの対数プロットはできなさそう。
ついでに、日付と曜日でグリッドが切られているのでbinがちょー薄い。
そして一番の問題は、曜日が（年月日もだが）文字列に過ぎないので、文字コード順か何かになって意図した曜日順に並んでくれない。

```R
> head(dat3)
            
             火 金 月 水 土 日 木
  2020-01-24  0  1  0  0  0  0  0
  2020-01-25  0  0  0  0  1  0  0
  2020-01-30  0  0  0  0  0  0  1
  2020-02-13  0  0  0  0  0  0  1
  2020-02-14  0  2  0  0  0  0  0
  2020-02-15  0  0  0  0  8  0  0
```

### 3

要するに、週番号と曜日番号を年月日文字列から一旦Dateクラスを経由して生成してやる必要があって、

```R
dat$n1 <- as.Date(dat$公表_年月日)
dat$n2 <- format(dat$n1, "%U")
dat$n3 <- format(dat$n1, "%w")
dat4 <- table(dat$n2, dat$n3)
hist3D(z=dat4, border = "black", phi=45, theta=25)
```

とか作ってやれば

```R
> tail(dat4)
    
       0   1   2   3   4   5   6
  27 111 102 106  75 224 243 206
  28 206 119 143 165 286 293 290
  29 188 168 237 238 366 260 295
  30 239 131 266 250 367 463 472
  31 292 258 309 263 360 462 429
  32 331 197 188 222 206 389   0
```

![hist2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170148/732b8267-c3ac-de60-cd56-a7108157147d.png)

欲しかったデータは作れているっぽい。

しかしhist3Dで対数プロットできないのはつらいなぁ。あと、角度を急にしてみると描画が結構バグる。
【Kotlin+Exposed】OracleDBに接続する

#### 前置き
DB操作の方は、他の方が綺麗にまとめてくれていたり公式ドキュメントに書いてあるので割愛します。
ここではあくまでOracleDBに接続する手順だけ

#### 接続記述
oracleのドライバを使えるようにする

```build.gradle
// バージョンはよしなに
compile "com.oracle.ojdbc:ojdbc8:19.3.0.0"
```

サービスコードに組み込む

```kotlin
// サービス名で接続する
Database.connect(
  "jdbc:oracle:thin:@(IP):(PORT)/(サービス名)",
  "oracle.jdbc.OracleDriver",
  "(OracleDBユーザ名)",
  "(OracleDBパスワード)"
)

// SIDで接続する
Database.connect(
  "jdbc:oracle:thin:@(IP):(PORT):(SID)",
  "oracle.jdbc.OracleDriver",
  "(OracleDBユーザ名)",
  "(OracleDBパスワード)"
)

transaction {
  // 処理
}
```

これで接続自体はできるのですが、これだけだと以下のエラーがでてきてしまいます

```
// 日本語
WARN  Exposed - Transaction attempt #0 failed: READ_COMMITTEDおよびSERIALIZABLEのみが有効なトランザクション・レベルです。.
// 英語
WARN  Exposed - Transaction attempt #0 failed: READ_COMMITTED and SERIALIZABLE are the only valid transaction levels
```

トランザクションレベルが合っていないとのエラー。
そもそもOracleDBのトランザクションレベルはMySQLなどと違って `READ_COMMITTED` と `SERIALIZABLE` の2つしか存在しないです。

> https://www.shift-the-oracle.com/acid/isolation-level.html

じゃあなんで出てるんだ？というところですが、Exposed側で指定する必要があります。
記述場所は `Database.connect` の直下でOKです。

```kotlin
// TRANSACTION_SERIALIZABLE を使う場合
TransactionManager.manager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE

// TRANSACTION_READ_COMMITTED を使う場合
TransactionManager.manager.defaultIsolationLevel = Connection.READ_COMMITTED
```

基本的にデフォルトで設定されている `READ_COMMITTED` でいいと思います。（理解した上で選択しましょう）

これで接続ができればOKです。

公式のヘルプにちゃんと書いてありましたね。

> (参考) https://github.com/JetBrains/Exposed/wiki/FAQ
git-flowモデル

# git-flowモデルとは
Gitのブランチモデルのひとつ。
（無秩序にブランチを切るのではなく、ルールを決めてブランチを切ることでコードを管理する。その際に参考にするのがGitブランチモデル。）
ブランチモデルの中では比較的歴史が長く、git-flowをサポートしているツールも数多くある。

# 使用する5つのブランチ
**1. developブランチ**
　開発を行うためのブランチ。<br>　主にこのブランチ上で作業を行う。
**2. featureブランチ**
　主な機能を実装するためのブランチ。
**3. releaseブランチ**
　リリースの準備を行うためのブランチ。
**4. masterブランチ**
　リリースしたソースコードを管理するためのブランチ。<br>　このブランチへのコミットは行わない。
**5. hotfixブランチ**
　リリースされたソフトウェアに緊急の修正を行うためのブランチ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678952/9cbb0efd-1a89-eee4-6578-89681ba42499.png)
夏季課題のレポート

# 参考になったもの

## CSS編

### display:flex
```style.css
.container {
  display: flex;
}
```
こちらのサイトが凄く参考になりました。
https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet

親要素に`display: flex;`を適用すると子要素が横並びになります。

### em もしくは rem
大きさを指定するときにpxなどの絶対単位ではなくem(親要素のフォントサイズを1emとする)や、rem(親要素の大きさを1remとする)などを使用すると、拡大した場合などにレイアウトが崩れたり
しなくなる。

## JavaScript編

### forEach

```javascript
const arr = ["apple","orange"];
arr.foreach(element => {
  console.log(element);
  /*
    console

    apple
    orange
  */
});
```

配列内の要素に対して、一つづつ処理を行うことができる。
indexがいらない場合や、配列内の要素すべてに処理を行う場合に有効である。


###  document.querySelectorAll()

```index.html
<!DOCTYPE html>
<html>
<head>
  <title>qiita</title>
</head>
<body>
  <div class="container">1</div>
  <div class="container">2</div>
  <div class="container">3</div>
  <script src="src/main.js"></script>
</body>
</html>
```

```src/main.js
const domList = document.querySelectorAll('.container');
domList.forEach(element => {
  console.log(element.textContent);
  /* 
    console

    1    
    2
    3
  */
});
```

指定されたクラス名、IDなどの条件に合致した要素をNodeListで返す。
forEachと合わせて使用することで、html側のcontainerが増えても不具合が起きないようにできる。
systemdを更新してnetctlのエラーが発生した場合の解決方法

# 概要
先日パッケージを更新したところvagrantで下記のようなエラーが出るようになりました。
どうもnetctl周りでエラーが起きているようです。

```
Failed to restart netctl@eth1.service: Unit netctl@eth1.service has a bad unit file setting.
See system logs and 'systemctl status netctl@eth1.service' for details.
```

# 原因
systemdの246からnetctlの設定ファイルの書式が変わったようです。
.includeディレクティブが廃止された模様。

# 解決方法

unitファイルを再生成してあげれば良いようです。

eth1がエラーになっている場合なら下記のコマンドを実行します。

```
sudo netctl reenable eth1
```

# 参考
https://bbs.archlinux.org/viewtopic.php?pid=1920480
https://wiki.archlinux.jp/index.php/Netctl
MySQL②

#3　外部ファイルを読み込む
##外部ファイル作成
```:create_myapp.sql
コメントアウト
# コメント
-- コメント
/*
コメント
comment
コメント
*/

データベース作成　create database データベース名;
create database myapp;

作業用ユーザーを作理、権限を通す（MySQL 5.6）　grant all on 権限を通すテーブル on 権限を通すデータベース名.* to 作成するユーザー名@サーバー名 identified by 'パスワード';
myapp の全てのテーブルに対して全ての権限をこちらのユーザーに与える
grant all on myapp.* to myapp_user@localhost identified by '2VNAh1go';
```
## コンソールで実行
root ユーザーで実行したいので mysql -u root < としてあげて、 create_myapp.sql の中身を流し込んであげましょう。
[vagrant@localhost mysql_lessons]$ mysql -u root < create_myapp.sql


mysql サーバーにログインした状態で実行する方法です。
では一旦 root で接続してあげて、外部ファイルのコマンドを読み込むには source 、もしくは \. を使ってあげてください。
mysql> \. ./create_myapp.sql
ららべる勉強

ザンプのインストール
https://reffect.co.jp/laravel/windows-xampp-laravel-install

コンポーザのインストール　ララベルをンストールするもの
コンポーザがインストールされたらphp artisan -Vで確認、ララベルがインストールされたフォルダに
あるのでCDするのを忘れずに。

コンポーザでフォームフレームワークも入れておくと便利
composer require "laravelcollective/html"

参考ページ
https://ponsuke-tarou.hatenablog.com/entry/2019/02/19/234611#Composer-Create-Project%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%99



Mysql
https://www.sejuku.net/blog/30282

Apache
https://www.adminweb.jp/apache/docroot/index1.html



ららべるデバック（Xdebug TSのバージョン）
zend_extension = C:\xampp\php\ext\php_xdebug-2.6.1-7.2-vc15.dll

#デバック環境
```
zend_extension = C:\xampp\php\ext\php_xdebug-2.9.6-7.4-vc15-x86_64.dll

[xdebug]
xdebug.default_enable = 1
xdebug.idekey = "vscode"
xdebug.remote_enable = 1
xdebug.remote_port=9000
xdebug.remote_autostart=1
```
Linux PCスペック確認コマンド

# 目的

- Linuxのターミナル上だけでスペックを確認するコマンドをを最低限まとめたので投稿します。
- ※本記事は自分のはてなブログにも記載した内容ですがより多くの方の目に触れるといいなと思いQiitaにも投稿します。

# 実施環境

- 下記環境で実行確認済み。

| 項目 | 備考 |
| --- | --- |
| Ubuntu20.04 LTS |  |
| CentOS7 | こちらの方法で導入→[Cent0S7をPCにインストールする](https://miriwo.hatenablog.com/entry/2020/08/09/144030) |

# CPU情報の表示

```terminal
$ cat /proc/cpuinfo
```

# メモリ情報

```terminal
$ cat /proc/meminfo
```

# PCの機種名

```terminal
$ sudo dmidecode --type system | grep -i product
```

# PCの製造番号

```terminal
$ sudo dmidecode --type system | grep -i serial
```