OmniAICreator/Qiita-1.07M huggingface dataset:
「Coq/SSReflect/MathCompによる定理証明」p.35まで

教育のためにテスト問題を作成していると、正解にしても誤答にしても選択肢が「間違いなく(正解|誤答)といえるか」というのが重要問題になる。ここはCoq+OCamlで作問支援して、楽しい作問ライフを過ごしたいところ。
[「Coq/SSReflect/MathCompによる定理証明」](https://www.morikita.co.jp/books/book/3287)が積読状態だったのだが、力を発揮してくれる予感がする。

# モーダスポーネンスとヒルベルトの公理S

```coq
From mathcomp
Require Import ssreflect.

Section ModusPonens.
Variables X Y : Prop.

Hypothesis XtoY_is_true : X -> Y.
Hypothesis X_is_true : X.

Theorem MP : Y.
Proof.
move : X_is_true.
by [].
Qed.

End ModusPonens.

Section HilbertSAxiom.
Variables A B C : Prop.

Theorem HS1 : (A -> (B -> C)) -> ((A -> B) -> (A -> C)).
Proof.
move=> AtoBtoC_is_true.
move=> AtoB_is_true.
move=> A_is_true.

apply: (MP B C).

apply: (MP A (B -> C)).
by [].
by [].

apply: (MP  A B).
by [].
by [].
Qed.

End HilbertSAxiom.
```

これ見ただけで「間違いないですね」と言えるようになるのだろうか。
CoqIDEで動きを確認しないと、何言ってるのか分からない。
とはいえ、いったん意味が分かるとあとは「パズルゲーム」になる。

OCaml,Coq,CoqIDE,MathCompは、opamでどかどかインストールした。
いちいちコンパイルしながらインストールしていくので、かなり時間がかかる。
【初心者必見】ブラウザショートカットを駆使して、効率よくWEB開発を行おう！（win&mac両方対応）

# どうも7noteです。WEB制作時によく使うブラウザのショートカットを紹介。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/technique/shortcutkey/
[vue.js] ストップウォッチのコンポーネントを自作

ストップウォッチをvue.jsコンポーネントで実装してみました。
自作のブラウザゲームでクリア時間を計るのに使ってます。

# 実行画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547333/dea32527-9d35-d79c-01b1-266532c038dc.png)
時間は小数2桁まで表示。
Start/Stop ボタンと Reset ボタンを表示、ラップの記録機能は無し。

# ソースコード


```vue:stopWatch.vue:{.line-numbe:.copy}
<template>
<div>
    <p>{{interval.toFixed(2)}}</p> <!-- 小数2桁まで表示 -->
    <button @click="startTimer()" v-show="!active">Start</button>
    <button @click="stopTimer()" v-show="active">Stop</button>
    <button @click="resetTimer()">Reset</button>
</div>
</template>

<script>
export default {
    name: 'stopWatch',
    data(){
        return {
            active : false, // 実行状態
            start : 0, // startを押した時刻
            timer : 0, // setInterval()の格納用
            interval : 0, // 計測時間
            accum : 0, // 累積時間(stopしたとき用)
        }
    },
    methods:{
        startTimer(){
            this.active = true;
            this.start = Date.now();
            this.timer = setInterval(()=>{ this.interval = this.accum + (Date.now() - this.start) * 0.001;}, 10); // 10msごとに現在時刻とstartを押した時刻の差を足す
         },
        stopTimer(){
            this.active = false;
            this.accum = this.interval;
            clearInterval(this.timer);
        },
        resetTimer(){
            this.interval = 0;
            this.accum = 0;
            this.start = Date.now();
        }
    }
}
</script>
```
parallelsでcentoOS8をセットアップしたけど


![linux-151619_640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362843/57db7732-e13e-eef6-8351-036ecfc0fe63.png)
<a href="https://pixabay.com/ja/users/openclipart-vectors-30363/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=151619">OpenClipart-Vectors</a>による<a href="https://pixabay.com/ja/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=151619">Pixabay</a>からの画像

#Linux学習しようとしています
Linuxの本「さわって学ぶLinuｘ入門テキスト」を購入して
学習をすすめていました。
以前は、VirtualBOXで仮想環境を構築していたのですが
VirtualBOXをアップデートしてから起動しなくなってしまい
とまっていました。
新しくMacBookProをこうにゅうしたので、せっかくだからと
ParallelsでLinuxをやってみようと思ってやってみました！
##セットアップはかんたん
セットアップまではかんたんにできました。
最初は「Parallels」がユーザーとして設定されていて
パスワードを設定するだけでした。
##キーボード設定でつまづく
で、gmailアカウントを紐付けしてねという感じの画面になったので
メールアドレスを入力しようとしたら
「＠」が入力できません。
以下、いろいろとやってみたことを書いておこうと思います。
###コマンドラインでkeymapsの設定
キーボードの種類確認

```
$ localectl status
```
どんなのが最初でたのか記録するの忘れてしまった・・・。

使えるkeymapsを確認

```
$ localectl list-keymaps
lv-tilde
ma-french
mac-be
mac-de-latin1
mac-de-latin1-nodeadkeys
mac-de_CH
mac-dk-latin1
mac-dvorak
mac-es
mac-euro
mac-euro2
mac-fi-latin1
mac-fr
mac-fr_CH-latin1
mac-it
mac-pl
mac-pt-latin1
mac-se
mac-template
mac-uk
mac-us
md
md-gag
```
mac-usはあるけど、mac-jnはない。
とりあえず、mac-usに設定をすることにしました。

##日本語環境のセット
ぐぐっているとこんなのも出てきて
環境がenだったので一応やっておきました。

```

$ sudo dnf -y install langpacks-ja

$ localectl set-locale LANG=ja\JP.UTF-8
$ source /etc/locale.conf
$ echo $LANG
jaJP.UTF-8
```
##継続課題です😂
なんとなく、「＠」も「｜」も打てるようになったし、
とりあえず、これで学習をすすめることにしました。

他の日本語キーボードに設定すればいいのかなあとも考えたのですが
情報がなくて、断念しました。
この記事を見て、だれかおしえていただけるとうれしいなあと思い投稿しました。

##参考URL（ありがとうございます）

[etuts：CentOS 7～8 Locale、及び Keymap 設定][link1]
[どたんば！：CentOS7 ( RHEL7 ) でサクッとキーボードレイアウトを変更するよ！][link2]
[server world：日本語環境にする][link3]


[link1]:https://server.etutsplus.com/centos-7-locale-and-keymap/
[link2]:https://www.server-world.info/query?os=CentOS_8&p=japanese
[link3]:https://www.server-world.info/query?os=CentOS_8&p=japanese
migrateでカラムに外部キーを追加する

プログラミング初心者でも理解できる内容を書いていければと思います。

railsでmigrateする際に、カラムにモデルの関連づけのために外部キーを追加する方法を整理します。

前提としては、ユーザーと、そのユーザーの複数の投稿（tweet）を紐付けたい、ということです。

◉外部キーをテーブルに追加する

そのためには、新しく作成するtweetsテーブルに user_id というカラムを追加して、投稿を所有しているユーザーの id を格納するようにします。

このような場合では、referenceというデータ型を使用して外部キーのカラムを追加します。

tweetsテーブルを作成するマイグレーションファイルを、こんな感じに記述します。

```rb

class CreateTweets < ActiveRecord::Migration[5.2]
 def change
   create_table :tweets do |t|
     t.string     :text,                     null: false
     t.references :user, foreign_key: true,  null: false

     t.timestamps
   end
 end
end
```
t.references :user, foreign_key: true ここですね。

t.referencees :user で、user_idというカラムを作成してくれます。そしてindexを自動で付与してくれます。indexにより検索が楽になります。

ただし、データの読み込みや取得が早くなるメリットがあるかわりに、書き込みの速度が遅くなるというデメリットがあるみたいです。

これだけだと、外部キー制約はつかないので、

foreign_key: true をつけます。

また、既存のテーブルに外部キーを追加したい場合は次のようになります。

```rb

class AddColumn < ActiveRecord::Migration[5.0]
 def change
   add_reference :tweets, :user, foreign_key: true
 end
end
```

ちなみに、、、

null: false と記述することで、NOT NULL制約をつけることができます。データベースカラムの値にNULLを格納したくない場合に、つまり、あるモデルの属性の値が必ず入らなければいけないと期待するときに、このような制約をつけます。
CSSのみで、文字列の省略を簡略化する方法

## ■ はじめに

CSSのみで、文字列の省略を簡略化する方法について記事にしました。
この記事で得る内容は以下の通りです。

・CSSの基礎知識が増える
・長文で文字が表示しきれない際の対応ができる様になる

## ■ 例

例えば、以下の様なブログの見出しで、これを1行にしたい場合

![スクリーンショット 2020-10-18 9.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/360a8324-3955-7d6c-005f-6891d253fc13.png)

``white-space: nowrap;``で改行させず、1行にし

![スクリーンショット 2020-10-18 9.53.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/2843c009-4865-9ed9-72cd-b1c51a75a0f9.png)

``overflow: hidden;``で要素からはみ出た文字を非表示にして

![スクリーンショット 2020-10-18 9.54.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/3cebdb5b-2f1c-a023-17cc-ec0e655095d2.png)

``text-overflow: ellipsis;``と指定すると、文字列を省略することができます。

![スクリーンショット 2020-10-18 9.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772631/e7610a16-de34-41e3-7259-86b620465a1f.png)


要素の幅が変わっても、要素の領域分まで文字を表示し、文字列の省略は消えません。
ただ、今回ご紹介した方法では、文字列が1行の場合のみにしか使えませんので注意が必要です。
【Rails】rails s が反応しない、止まらないときの対処法

たまにこの現象が起きるので、備忘としてメモ。
Rails始めたてで同じ状況に陥った方の助けになれば幸いです。

## 事象

ローカルサーバーを立ち上げてchromeで動作確認しながらアプリ制作中…
不安定だなあと思って健気に待っていたら、localhost:3000のタブだけ止まっていることに気づく。
ターミナルで `control + c` を試しても反応しない…なんだこれは…
強制終了するのも恐いしどうしたもんだろうか。


`/articlesを読み込んでる図`
![スクリーンショット 2020-10-07 15.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708469/fbe43808-daf1-b700-8e08-b6a2fc9968a9.png)



## 対処法

1. rubyのPIDを確認
2. rubyのPIDを止める



### 1. rubyのPIDを確認する
`lsof`コマンドで、ポート番号3000で動いている処理を確認する。
↓`lsof -i:3000`の結果（実際はUSER以降の列にも出力があります）

```
daikimorita@daikinoMacBook-Pro javascript_skillcheck % lsof -i:3000
COMMAND     PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Google     xxxx 
 localhost:55103->localhost:hbci (ESTABLISHED)
ruby      xxxxx 
localhost:hbci (LISTEN)
ruby      xxxxx 
localhost:hbci (LISTEN)
ruby      xxxxx 
localhost:hbci->localhost:54631 (CLOSE_WAIT)
ruby      xxxxx 
localhost:hbci->localhost:54636 (CLOSE_WAIT)
ruby      xxxxx 
localhost:hbci->localhost:54655 (CLOSE_WAIT)
ruby      xxxxx 
localhost:hbci->localhost:54656 (CLOSE_WAIT)
ruby      xxxxx 
localhost:hbci->localhost:54659 (CLOSE_WAIT)
ruby      xxxxx 
localhost:hbci->localhost:55103 (ESTABLISHED)
```

rubyのPIDは xxxxx(数字が入ります) と表示されている。これを止めたい。
何行も出てるのは、私が`control + c`を何度も押したせいです笑


### 2. rubyのPIDを止める
下記のコマンドを実行します。

```
kill -9 xxxxx
```


## 結果

「`rails s`を実行しているターミナルのタブ」を見ると、`killed` の表示が出ていて、スタンバイ状態になってます。

```
zsh: killed
```

もう一度`rails s`で立ち上げてみると、無事にchromeでページが表示されました。解決！


## 参考記事

[Rails serverのプロセスを素早く落とす
](https://qiita.com/kanuu/items/fd6e33fca6ad6a90d059#comments)
[PIDについて](https://wa3.i-3-i.info/word11040.html)
[localhost:3000について]([Rails serverのプロセスを素早く落とす
](https://qiita.com/kanuu/items/fd6e33fca6ad6a90d059#comments)
)
PostgreSQL アップデート11.2 -> 12.4

Ruby のバージョンアップのために　brew upgrade すると、PostgreSQL が自動的にアップデートしました。
すると、 Postgres に接続できなくなって、焦りました。アップデート時のメッセージを見過ごしており、修復に時間がかかったので、記録に残します。

# brew upgrade 時のメッセージ

ここに対処方法が乗っていたのに気づかずターミナルを閉じてしまったので、後で苦労しました。

```
# Ruby のバージョンをアップデートしようとした
$ brew upgrade rbenv ruby-build
...
# 自動的に PostgreSQL もアップデートしてしまう
==> Installing postgresql
==> Pouring postgresql-12.4.mojave.bottle.tar.gz
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database <- ここに対処法

This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /usr/local/var/postgres
For more details, read:
  https://www.postgresql.org/docs/12/app-initdb.html

To have launchd start postgresql now and restart at login:
  brew services start postgresql
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgres start
==> Summary
🍺  /usr/local/Cellar/postgresql/12.4: 3,223 files, 37.4MB
Removing: /usr/local/Cellar/postgresql/11.2... (3,186 files, 35.4MB)
==> Upgrading python@3.8 3.8.6 -> 3.8.6 
...
```

# PostgreSQL が起動しない

いつものように作業を始めようとすると、データベースが起動しないので焦りました...

```
$ pg_ctl -D /usr/local/var/postgres start
waiting for server to start....2020-10-17 13:26:58.628 JST [57774] FATAL:  database files are incompatible with server
2020-10-17 13:26:58.628 JST [57774] DETAIL:  The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 12.4.
 stopped waiting
pg_ctl: could not start server
Examine the log output.
```

# （対処法）POstgreSQL のアップデート後の作業

先ほどのメッセージに書かれているコードを実行します。

```
$ brew postgresql-upgrade-database
```

.bash_profile に書かれている設定を書き直す

```
$ vim ~/.bash_profile

# postgres
export PATH=/usr/local/Cellar/postgresql/12.4/bin/:$PATH
export PGDATA=/usr/local/var/postgres

$ source ./~bash_profile
```

もう一度接続を試みると、成功しました！

```
$ pg_ctl -D /usr/local/var/postgres start
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```
42Tokyoの入学試験Piscine（ピシン ）の感想

42 TokyoのPiscineを受けてきた（そして通過した！）ので、その感想をつらつら書いてみます。
残念ながら、具体的な内容については口外できません...
運営側から怒られてしまうので、あくまで感想日記です。

# 42 Tokyoってなに？

公式サイトhttps://42tokyo.jp/ に記載のとおり

・学費無料
・教師なし
・ピアラーニング（生徒同士で勝手に教えあって学ぶ）

のプログラミングスクール。C言語などが学べるらしい。
なぜ完全無料で成り立つのかというと...

<b>DMMがドン、と運営費を出してくれているから！
亀山さん、ありがとう！！</b>

# Piscine（ピシン）ってなに？

42 Tokyoの入学試験。
その前のwebテストを合格すると、Piscineに参加できる。
なんと４週間に渡って行われる。

# どうだった？

だいぶしんどかった。
「楽しい」と感じる余裕はなかったな（笑）
水泳というより、トライアスロン。

# どれくらい時間を使った？

前半は、仕事との両立を目指していたのと、あとピシンの進行上の都合もあって、結局ピシンには３割程度の時間を使っていた（これは別に、24時間のうちの３割っていう意味ではないよ）。
だが、「<b>このペースでは絶対ダメだ！！</b>」ということに気がつく。

そして後半。
もう、可能な限りピシンに時間を使いました。

結果的には合格したものの、前半にもっと時間を割くべきでした。
時間はいくらあっても足りない、そう感じました。

# そもそも、アナタはどれくらいのスキルがあるの？

プログラミングは、Python, JavaScript, Swiftなんかを使って２〜３年程度やってきました。
がっつり仕事で２〜３年というわけではありません。
C言語を使えるようになりたいと思って、ピシンに参加。

もともとC言語に関しては、入門書は一通り読んで、ポインタ操作は少しやったことがある程度でした。
なのでC言語だけでいうと、入門〜初級者レベルだった。

# ピシンで上達した？

これは「しました！！」と自信を持って言えます。
中級者の階段に足をかけた、と言ったら言い過ぎかな？（笑）

少なくとも、Cに対する苦手意識はだいぶ減りました。
たくさん書いたからね！

# 他の参加者はどんな感じ？

まず年齢層について、やはり時間のある大学生の割合が多い気はしましたが、思ったより社会人の方々が多かった印象を受けました！
これはちょっと意外でしたね。
日中は仕事をしながら、仕事が終わったらピシンという方々が結構いて（直接そう聞きました）、純粋に「すごい！」と感じました。

次にスキルについて、未経験の方もいれば経験者の方もいましたが、自分が想像していたよりは経験者の方が多かった。
そのおかげで、自分程度のスキルでは全然「王様気分」は味わえない（笑）
世の中、甘くなかった。

最後に女性率について。
やっぱり男性が多数ですが、女性もそこそこいました。
一般的な理系学部の女子率よりは多い気がした（笑）

# プログラミング未経験で合格できる？

未経験だった方が合格談をブログで書いていたりするので、合格者はいるみたいですね。
そもそもwebテストを通過しないとピシンには参加できないので、未経験者とはいえ適性のある方々だと言えるでしょう。

とはいえ基本的には経験者が有利と感じました。
特に未経験者は、４週間を丸々捧げる覚悟は必要でしょう。

# １ヶ月使うなら、他のスクールとどっちを薦める？

プログラミングを学習しようと思ったら、一般的に
・有料のスクールに通う
・webサービスや本など、各種教材を使って自習
の選択肢が思い浮かぶと思います。

私は有料のスクールに通ったことがないので想像でしか語れませんが、ピシンと有料スクールの良いところは「やらされる」ことだと思います。
自習だと、モチベーションの自己管理が求められますからね。

ピシンも結局は自己管理が大事なんですが、他の生徒と教えあったり、またピシンの仕組み的にも、ある程度モチベーションは維持しやすくなっています。
ただし、「わからないことがあったら聞いたり調べたりして頑張る」という姿勢は求められます。
親切に教えてくれる人がいるとも限りません。

私のように「プログラミングの基本はわかっていて、Cの基本をがっつりやりたい」という方はピシンが合っている気がします。
ある程度基本がわかっている方は、あんまり有料スクールに行きたがらないでしょうからね。

逆に「特にC言語にこだわりはないし、直近の仕事を見つけるのが優先」という方は、スクールが合っているのではないかな？
もっと現代的な言語の方が需要自体はありそうだし、いきなりC言語のお仕事を見つけるのも難しそう？ですし...

ピシン参加の注意点としては、１ヶ月丸々捧げないと消化不良で終わる可能性が高いことかな。

# この仕組みの学校は増えそう？

まだ入学していないので、入学後の制度はわかりません。
あくまで「ピシン的な」仕組みを想定して話します。

基本的に、良い仕組みだと思いました。
運営費を生徒に負担させるとしても、まあ運営費やその内訳がわかりませんが、一度仕組みが整えば使い回しができる設計ですし、それなりに安く済みそうです。
もちろん、生徒が多いほど安くなるでしょう。

ただしプログラミングに限った話であって、他の科目（数学など）で全く同じ仕組みを実現するのは無理でしょう。結局はUdemyやUdacityのような形になるのかと思います。

また、生徒が多くなるほど内部の情報が漏れやすくなるので、その対策をどうするかは課題でしょう。
その点、今後42がどう運営していくのか気になります。


# 亀山さんに会えた？

会えません。
その代わり東京タワーに会えました。

# コロナ対策はどうだった？

かなり徹底していました。
そのようなスタッフの方々の努力もあり、クラスター発生＆ピシン中止にはなりませんでした。
感謝。
Python【 関数 】

Pythonの基礎知識③です。
自分の勉強メモです。
過度な期待はしないでください。

過去投稿記事
-
[Python基礎](https://qiita.com/k-yasuhiro/items/c31b6370023e67e00aa9)
[Python基礎②](https://qiita.com/k-yasuhiro/items/d8ed3e4093dd47faf40e)
[Python基礎④](https://qiita.com/k-yasuhiro/items/3bd280ee0eea8d59d36b)
[Python基礎⑤](https://qiita.com/k-yasuhiro/items/0eff0469eb3a5e95980e)
<br>

関数
-
　-関数とは、ある処理をまとめたプログラムの塊

　-関数の作り方

```text:関数の定義
def 関数名(): # 行末にコロン
    実行する処理
# インデントを揃える（半角スペース４つ分）
```

```py:例
def hello(): # 行末にコロン
    print('Hello World')
# インデントを揃える（半角スペース４つ分）

hello() 
#出力結果 →　Hello World
```
<br>
　-引数
　関数を呼び出す際に、関数に値を渡すことができ、その値を引数と言う

```text:引数を受け取る関数の定義
def 関数名(仮引数): # 行末にコロン
    実行する処理
# インデントを揃える（半角スペース４つ分）
```

```py:例
def hello(name): # 行末にコロン
    print('Hello' + name)
# インデントを揃える（半角スペース４つ分）

hello('Aki') # Akiが、仮引数nameに代入される
#出力結果 →　Hello Aki
```
<br>
　-スコープ
　仮引数や関数の中で定義した変数は関数の中だけ使用できる

```py:例
def hello(name):
    print(name) # 変数nameのスコープ内、関数内なので使用出来る

print(name) # 変数nameのスコープ外、使えないのでエラー発生

```

<br>

　-複数の引数
　引数は左から順番に`「第1引数、第2引数・・・」`と呼ぶ

```py:例
def hello(name, message): # 行末にコロン, 引数の間はコンマで区切る
    print('Hello' + name + message)
# インデントを揃える（半角スペース４つ分）

hello('Aki', '元気？') # Akiが、仮引数nameに、元気？が、仮引数messageに代入される
#出力結果 →　Hello Aki 元気？
```
<br>
　-引数の初期値
　引数には初期値を設定することもできる

```py:例
def hello(name, message = 'おはよう！'): # 行末にコロン
    print(name + 'さん、' + message)
# インデントを揃える（半角スペース４つ分）

hello('Aki') # Akiが、仮引数nameに代入される
#出力結果 →　Akiさん、 おはよう！
```
<br>

　-戻り値
　処理結果のを呼び出し元に返す

```text:引数を受け取る関数の定義
def 関数名(): # 行末にコロン
    return 戻り値 
　　# 呼び出し元に返す
```

```py:例
def validate(hand):
    if hand < 0 or hand > 2:
        return False
    # 呼び出し元に返す
```
<br>

　-returnの性質
　returnは戻り値を呼び出し元に返すだけでなく、関数内の処理を終了させる性質も持つ。
　よって、return以降の関数の処理が実行される事はない。

```py:例
def hello(name):
    if name == 'ゲスト':
        return '名前を教えてください'
        print(name + 'さん、ようこそ！') # return以降なので実行されない
```
<br>
　-複数のreturn
　条件分岐と組み合わせると複数のreturnを用いることが出来る

```py:例
def hello(name):
    if name == 'ゲスト':
        return '名前を教えてください'
    print(name + 'さん、ようこそ！')
print(hello(Aki))
```

<br>

モジュール
-
　-モジュールとは、コードが書かれたファイルのこと

　-import
　importを使うことでモジュールを読み込むことが出来る
　`「import モジュール名」`と書く事で読み込める
　モジュール名はファイル名から拡張子（.py）を取り除いたもの

```text:例
# ファイル名　→　sample.py
import sample
```
<br>

　-モジュールの使い方
　上記では、只ファイルを読み込んだだけで、中に書かれている事は実行されない
　`「モジュール名.関数名()」と`書く事で、モジュール内に書かれている中見の実行をさせる事が出来る

```text:例
# ファイル名　→　sample.py
# 関数名　→　validate(hand)

import sample

if sample.validate(hand)

```

　-また,、Pythonには便利なモジュールが既にいくつか用意されています
　「random」 = ランダムな値を生成するモジュール
　「math」 = 複雑な演算の為のモジュール
　「datetime」 = 日付や時間データを操作するモジュール
<br>

　-追記 10月19日
　`「from モジュール名 import クラス名」`
　モジュール内の指定したクラスを直接読み込むことが出来る。

```py:例
from menu_item import MenuItem

menu_item1 = MenuItem('サンドイッチ', 500)

print(vehicle_type1.name)
# 出力結果 →　サンドイッチ
print(vehicle_type1.price)
# 出力結果 →　500
```

```menu_item.py
class MenuItem:
    def __init__(self, name, price):
        self.name = name
        self.price = price
```
AtCoder Beginner Contest 180

##[A - box](https://atcoder.jp/contests/abc180/tasks/abc180_a)

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
int main(int argc, const char * argv[]) {
    int n, a, b;
    cin >> n >> a >> b;
    
    cout << n - a + b << endl;
    return 0;
}
```

##[B - Various distances](https://atcoder.jp/contests/abc180/tasks/abc180_b)

```Python:Python
import math
N = int(input())
X = list(map(int, input().split()))
 
ans1 = 0
ans2 = 0
ans3 = 0
 
for i in range(0, N):
	X[i] = abs(X[i]);
	ans1 = ans1 + X[i];
	ans2 = ans2 + X[i] * X[i];
 
print(ans1);
print(math.sqrt(ans2));
print(max(X));
```

##[C - Cream puff](https://atcoder.jp/contests/abc180/tasks/abc180_c)

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;

vector<ll> divisor(ll n) {
    vector<ll> ret;
    for (ll i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            ret.push_back(i);
            if (i * i != n) ret.push_back(n / i);
        }
    }
    sort(ret.begin(), ret.end());
    return ret;
}
 
int main(int argc, const char * argv[]) {
    ll N;
    cin >> N;
    
    vector<long long> Ans = divisor(N);
    rep(i, Ans.size()){
        cout << Ans[i] << endl;
    }
    
    return 0;
}
```

##[D - Takahashi Unevolved](https://atcoder.jp/contests/abc180/tasks/abc180_d)

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>

#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
#define ll_limit 2e18

using namespace std;
using ll =long long;
using P = pair<int,int>;

int main(int argc, const char * argv[]) {
    ll X, Y, A, B;
    cin >> X >> Y >> A >> B;
    ll ans = 0;
    
    while((double)A*X<=2e18 && A*X<=A+B && A*X<Y){
        X*=A;
        ans++;
    }
    
    cout << ans+(Y-1-X)/B << endl;
    return 0;
}
```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)　が出た時の対処法


##事象

``mysqlを起動しようと思って以下のコマンドを打つ
``

```
$ mysql -u root
```

以下のエラーが表示
``ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
``



##解決方法

サーバーが起動してないのに動くはずがない！

ちゃんと以下のコマンドを入力して

````
$ mysql.server restart
````
その後に

````
$ mysql -u root
````
で成功しました。
なんとなく知ってるつもりではいたけどUMLってなに？

#プログラミング勉強日記
2020年10月18日
UMLという言葉を耳にするけど、いまいち理解していないのでまとめる。

#UMLとは
　Unified Modeling Languageの頭文字をとったもので、統一モデリング言語と言われている。言語の違いを統一するものがUMLではなく、人や言語の違いによる<b>表現の方法を統一する</b>ものがUMLである。
　簡単に言えば、「みんなが同じルールに従ってかけば、他の人が作ったものを見るときに簡単」という考えのもとに作られた機能や構造を表現する図の書き方のこと。

#UMLの概念モデル
　UMLの概念モデルを簡単にまとめる。

##ユースケース
　システムとその外部のアクターとの一連の流れを文章で記述したもの

##クラス図
　classは一般的にクラス名を入れる、クラスの属性(アトリビュート)、クラスの操作(オペレーション)の3つの区画からなる。

##シーケンス図
　ソフトウェアの設計に使われるUMLで規定された図の1つ。要素間の相互作用を時系列で表した図を指す。

##アクティビティ図
　シーケンス図と同様にソフトウェアの設計で使われるUMLで規定された図の1つ。業務や処理の実行手順を表した図を指す。

#UMLのメリット

- 表現の方法が統一されている
- 図(ダイアグラム)での表現
- ソフトの数が多く成熟している
- デザインパターンとの親和性が高い
- 自習学習に向いている

##表現の方法が統一されている
　UMLの読み方を理解しているエンジニアであれば、スムーズに設計書や仕様書などを正確に読むことができる。

##図での表現
　基本的に図での表現が主流のため、理解しやすい。設計の変更が発生した場合においても把握しやすい。
　UMLはシステム開発における上流工程から下流工程まで幅広く網羅している。

##ソフトの数が多く成熟している
　UMLは多くのソフトウェアベンダーが作図ツールを開発して提供している。

##デザインパターンとの親和性が高い
　開発システムの内部処理をどのように実現するかといった代表的なことをパターンにまとめたものが、デザインパターンである。UMLとデザインパターンはどちらもオブジェクト指向を対象としているので、親和性が高い。

##自習学習に向いている
　日本語の資料が多く、専門的なサイトも数多くあるのでとても勉強しやすい。

#UMLのデメリット

- 学習コストが高い
- UMLの日本語認定試験が2020年3月末で終了

##学習コストが高い
　この理由としては以下が挙げられる。

- エンジニアが使用する作図法なので難しい
- UMLは主なバージョンが3つありそれぞれ理解する必要がある
- 作図ソフトや特殊なツールを使う必要がある

　UMLはエンジニアが使うものなので簡単に理解できるものではない。そのため、UMLを正しく理解するためには学習が必要である。

##日本語認定試験が2020年3月末で終了
　UMLはOMGが使用を策定している。このOMGが認定するUMLの検定として「OCUP」がある。日本語ではOMG認定UMLプロフェッショナルと訳されているが、日本語による認定は終了する。

#参考文献
[UMLとは？｜ダイアグラムの種類や用途について解説](https://service.plan-b.co.jp/blog/tech/12404/)
[統一モデリング言語 (UML)](https://wa3.i-3-i.info/word17654.html)
[UMLとは何か？ メリット・デメリットを詳細に解説](https://www.pmi-sfbac.org/uml-merits-and-demerits/)
SSHの秘密鍵,公開鍵の作成【Mac】


##秘密鍵の作成

ターミナル を開いて以下のコマンドを実行します。

```
% ssh-keygen
```

このコマンドを実行すると


```
The key's randomart image is:
+---[RSA 3072]----+
|       .o.. o=@**|
|        ooo. @BBB|
|       .o+o.oEB*O|
|       ..o +..=*=|
|        S o .. +o|
|                .|
|                 |
|                 |
|                 |
+----[SHA256]-----+
```
鍵が作成されます。

##作成した鍵を登録する方法
右上のアイコンを押してプルダウンした項目の中から”Settings”を選択します。
1,SSH and GPG keys
2,New SSh key
の順で選択してください


![スクリーンショット 2020-10-18 1.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696651/a102b2bc-7330-5e8d-e943-724bcdd132ff.png)



```git:鍵が作成されたか確認
$ ls ~/.ssh
　id_rsa	id_rsa.pub	　known_hosts
```
`id_rsa.pub` ->公開鍵
`id_rsa` ->秘密鍵
なので作成されてますね。

今回は公開鍵を使うので、テキストエディタで確認します。

```vi:id_rsa.pubの中身の確認
% vi ~/.ssh/id_rsa.pub
```

長い文字列が表示されたら
ssh-rsa〜localまでをすべてコピーして"Key"のブランクボックスに貼り付けする
![スクリーンショット 2020-10-18 1.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696651/98a88880-09d1-a45a-fa34-89eada0801ab.png)
貼り付け後"Add SSH key"で発行する
![スクリーンショット 2020-10-18 1.29.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696651/55e089fd-ddc2-7dd3-479f-51c492a855bd.png)

公開鍵の登録完了！
npm init しないとどうなる？

# はじめに

package.json がないときに `npm init` せずに、いきなり `npm install` したらどうなるのか気になったので、以下の2通りで試してみました。

**1. `npm init` せずに `npm install` した場合**
**2. `npm init` せずに `npm install <package>` した場合**

# 結論

結論から先にいうと `npm init` しなくても `npm install` に失敗するわけでもないし、引数にパッケージを指定すれば node_modules が作成されてパッケージのインストールにも成功しました。

なので、**エラーになるということはありませんし、パッケージも普通にインストールされます。**

一見、問題ないように思いますが、package.json が作成されないため、どのパッケージをインストールしたかの記述がどこにも記されす、node_modules の内容を管理するのは難しくなります。

一方で、package-lock.json は作成されますが、package-lock.json にはインストールしたパッケージの結果のみが記されて、パッケージの依存関係まではわからないので、**やはり package.json はソースを管理する上で必要になります。**

**なので、package.json がなければ `npm install` する前に `npm init` で package.json を作成すべきでしょう。**

# 実際にやってみた

## 動作環境

```shell
# Node.js のバージョン確認
$ node -v
v14.13.1

# npm のバージョン確認
$ npm -v
6.14.8
```

## 1. `npm init` せずに `npm install` した場合

```shell
# 何もない空のディレクトリ
$ ls
（標準出力なし）

# npm install の実行
$ npm install

# package-lock.json のみが作成される（package.json は作成されない）
$ ls
package-lock.json

# 中身は lockfileVersion のみの記述でパッケージ情報はありませんでした（当たり前）
$ cat package-lock.json 
{
  "lockfileVersion": 1
}
```

## 2. `npm init` せずに `npm install <package>` した場合

```shell
# 何もない空のディレクトリ
$ ls
（標準出力なし）

# cowsay パッケージをインストール
$ npm install cowsay
+ cowsay@1.4.0

# package-lock.json と node_modules が作成されるが package.json がない
$ ls
node_modules
package-lock.json
```

# さいごに

**package.json がなければ `npm install` する前に `npm init` で package.json を作成すべきです。**
AVCaptureVideoPreviewLayerのプレビューサイズについて

AVFoundationのカメラ映像とプレビューのサイズが思ったように合わない時ってありますよね。
そんな時は、videoGravityで調整します。

#【準備】AVCaptureVideoPreviewLayerの設定

```swift
let previewLayer = AVCaptureVideoPreviewLayer(session: avCaptureSession) // avCaptureSessionは任意のAVCaptureSessionとします
previewLayer.frame = previewView.bounds // previewViewは任意のUIViewとします
previewLayer.connection.videoOrientation = .portrait // 向きの設定
previewView.addSubLayer(previewLayer)
```

#【本題】プレビューサイズの設定
カメラ映像全体が以下とします。
![pexels-fotografierende-2397448.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ec7db924-18c9-e983-2482-efd634ab88cb.jpeg)
わかりやすいようにプレビューレイヤーは横長にします。

###１、縦横比を保ったまま、レイヤーサイズ内に収める
![pexels-tuấn-kiệt-jr-3830482.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2a07a2bf-2f68-99fc-ac6b-07cf083021e5.jpeg)

```swift
previewLayer.videoGravity = .resizeAspect
```
###２、縦横比を変えて、レイヤーサイズを満たす
![pexels-fotografierende-2397448.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3bafe139-2d63-a00a-d3d1-e6b5eef72e63.jpeg)

```swift
previewLayer.videoGravity = .resize
```

###３、縦横比を保ったまま、レイヤーサイズを満たす
![pexels-tuấn-kiệt-jr-3830482.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/956dde42-632b-355f-ae3f-3d6156da7da6.jpeg)
映像の一部しか映りません。

```swift
previewLayer.videoGravity = .resizeAspectFill
```

###４、おまけ：映像の真ん中だけプレビューする
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/129a6e4b-9034-2d08-cae0-e1427b10a170.png)
カメラ映像のサイズが 1920 / 1080 で　上記画像のように真ん中の 810 / 1080　をプレビューしたいとします。

```swift
let previewViewSize = previewView.bounds.size // previewViewは任意のUIViewとします
let widthAspect = previewViewSize.width / 1080
let heightAspect = previewViewSize.height / 810
print(widthAspect,heightAspect)
previewLayer?.frame = CGRect(x: -(1080 / 2) * widthAspect, y: -(810/ 2) * heightAspect, width: 1080 * widthAspect, height: 1920 * heightAspect)
previewView.layer.addSublayer(previewLayer!)
previewLayer.videoGravity = .resizeAspect
```

プレビューレイヤーをビューより大きくして、はみ出させて真ん中だけビューから見えています。

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
SendGridの配信停止リンクを日本語化したい

# 背景
SendGridさんのブログに「配信停止のリンクを日本語化する」記事がいくつかあるのに、
解決しなくて迷ったので分かったことをまとめます。

ちなみに、Automationsを使いたいことから、
日本代理店の構造計画研究所さんとではなく、SendGridさんと直接契約しています。
なので、もしダッシュボードが皆さんと違っていたら参考にならないかもしれません。

# 参考にしたブログ
参考にはしましたが、解決しませんでした。
・[【マーケティングキャンペーン機能】配信停止のリンク・ページで日本語を利用する方法](https://sendgrid.kke.co.jp/blog/?p=9134)
・[キャンペーンに日本語の配信停止リンクを設置する方法](https://sendgrid.kke.co.jp/blog/?p=12252)

# やりたかったこと
メール末尾の「Unsubscribe」 なのを、「配信停止はこちら」に変えたい。
![スクリーンショット 2020-10-18 0.52.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152796/71211e0a-dbfb-5910-fa57-b78172ae3033.png)


# ダメだったこと
ブログを参考に、デザインエディタでTEXTを加え、「こちら」をドラッグしてEdit Linkします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152796/8abf5c1a-9ef6-5b8e-ac4d-8cb6705f805f.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152796/3707c2c0-09f5-04c0-7530-7ffc9f0fb136.png" width=50%>

このEdit LinkのURLをブログの通りに

```
[Unsubscribe]
```

にしたり

```
<%asm_group_unsubscribe_raw_url%>
```
にしてもダメでした。

# 解決方法
HTMLを見に行って確認したところ、下記タグを入れることでリンクが入り、タップできるようになりました。
カギ括弧３つとは...。

```
{{{unsubscribe}}}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152796/080cc67d-e95f-578a-b3da-c6bae5cad4d4.png" width=50%>

何処をいじっているか、詳しい手順はブログを読むとわかるので参照してください！
結局タグの書き方の問題ですね。コロコロ変わっているのでしょうか？？
以上です！
gibo や gitignore.io についてのメモ

`gibo` とは .gitignore を自動的に作るツールである。
同じようなツールとして [gitignore.io](https://www.toptal.com/developers/gitignore) というサービスがある。

メリット・デメリットそれぞれあるが、一度リポジトリを引っ張ってくればいろんな言語でもオフラインで完結できる `gibo` の方が優秀のように思える。

そう何度も .gitignore を編集しないし `gitignore.io` で検索かけてコピペするのが直感的でやりやすいと思う。

正直どちらでもよさそう。

.gitignore をネットの記事のコピペして作成するよりは、こういうツールをつかったほうが無難だと思う。

（参考）
[giboでgitignoreを自動生成する](https://qiita.com/taquaki-satwo/items/358d2d473fff9a25d5eb)
[.gitignoreを自動的に作る（gibo, gitignore.io を使う）](https://qiita.com/yumechi/items/b7932f5b31613a1f50f9)
Encapsulation（カプセル化）復習

# Encapsulation（カプセル化）とはなんだっけかな？

最近OOPの基本概念の１つであるカプセル化の理解が薄れていたので、めちゃくちゃ復習範囲狭めで自分の復習用で書きます。

カプセル化ってなんなの？とプログラミングしたことない彼女に聞かれた場合、
簡単に説明すると、**薬のカプセルみたいに、外部から中にあるあの細かい粒たちを守ることw。**と最初に言い、それからコードで説明するかも。

~~外部からオブジェクトに対するアクセスコントロールと自分は理解しています。（本当はもっとあるかもしれない。。）~~
コメントでアドバイスを頂き、自分の理解が間違っていたことに気付けました。

**アクセスコントロールはカプセル化をするための手段なので、カプセル化とは違いますね。**

**カプセル化の説明**

カプセル化は、ソフトウェアを分割する際に、関係するデータとそのデータを必要する処理を1つにまとめ、無関係なものや関係性の低いものをクラスから排除することで「何のためのクラスなのか？」というクラスの目的を明確化するために行い、ほかのクラスに重複するデータや処理がない状態を目指すものです。





## めちゃくちゃ簡単なコードで具体的に説明すると
```Person.java
public class Person {
    private int age;
    private String name;
    // クレジットカードの暗証番号
    private int creditCardPinNum;
    public double weight = 69;

    public Person(int age, String name, int creditCardPinNum) {
        this.age = age;
        this.name = name;
        this.creditCardPinNum = creditCardPinNum;
    }
    // getter
    public String getName() {
        return name;
    }
    // setter
    public void changeName(String name) {
        this.name = name;
    }

    // 外部から年齢を読むことはできる getter
    public int getAge() {
        return age;
    }
}

```
注意：概念を復讐するため、自分なりの解釈になってます。

まず人って年齢変えれませんよね？１０歳の人が”明日から２０歳する”とはできません、
なので、Personクラスのageは変更できないようアクセスコントロールされています（メンバー変数をprivateにし、setterメソッドをなくしている）。
他人に自分の年齢は伝えることはできるので、getterはあります（**嘘がつけるとかは今回無しで**）。


nameですが、人って名前は何回でも変更可能なので、Person クラスではsetterメソッド（changeName）が書かれています。


## まとめ

~~カプセル化とは外部からのアクセスコントロール（情報隠蔽）~~
カプセル化は、ソフトウェアを分割する際に、関係するデータとそのデータを必要する処理を1つにまとめ、無関係なものや関係性の低いものをクラスから排除することで「何のためのクラスなのか？」というクラスの目的を明確化するために行い、ほかのクラスに重複するデータや処理がない状態を目指すものです。
EditorConfig についてのメモ

どんな IDE・エディタ でもコーディンングスタイルを定義、維持するツール。
`.editorconfig` というファイルにルールを定義する。

正直、開発するときはチームで IDE・エディタを合わせるので、あんまり必要性は感じない（今のところ VSCode 一強）。

（参考）
どんなエディタでもEditorConfigを使ってコードの統一性を高める
Javaのバージョン違いによるオプション使用可否

先日普段と違うPCを使うシーンがありました。
入っているJavaのバージョンを確認しようとしたところ以下のようなエラーが。。

```Terminal:Terminal
$ java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
```

––versionのオプションは認識されていません？
Javaの仮想マシーンが作成できません？？
致命的エラー？？？

おかしいなぁと思い調べたところ、以下の記事を見つけました。

https://stackoverflow.com/questions/37186197/errorcould-not-create-the-java-virtual-machine-errora-fatal-exception-has-occu

どうやらJDK9以降は ––vesion を使えるらしいですが、
JDK8以前は –version じゃないとダメらしいです。
ハイフン一つの違いで。。
Javaのバージョン確認をする際は、どのバージョンでも動く以下がベターですね◎

```Terminal:Terminal
$ java -version
```
【Rails】画面からアップロードされたXMLファイルをHash型で読み込む方法

Rails(5系)を使ったアプリケーションで、画面からアップロードされたXMLファイルをHash型で読み込みたい場合の実装例です。

## アップロードするXMLファイル
今回は検証用に以下のXMLファイルを使用

```xml
<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item>AAA</item>
  <item>BBB</item>
  <item>CCC</item>
</items>
```


## html.erbの記述
適当にファイルとボタンタグを配置します。(デザイン・スタイルはお好みでどうぞ！)

```erb
<%= form_tag xxx_path, multipart: true do %>
  <label>XMLファイルの読み込み</label>
  <div class="row">
    <div class="col-sm-2">
      <%= file_field_tag :file, class: 'btn btn-primary' %>
    </div>
  </div>
  <div class="row">
    <div class="col-sm-4">
      <%= submit_tag '送信', class: 'btn btn-primary' %>
    </div>
  </div>
<% end %>
```
## Controller.rbの記述

```ruby
xml = REXML::Document.new(File.new(params[:file].path).read)
xml_h = Hash.from_xml(xml.to_s)
```
上記の結果以下のようなHash形式でファイルの中身を取得できます。

```
{"items"=>{"item"=>["AAA", "BBB", "CCC"]}}
```
Dockerでやっぱりmysqlの中身プレビュー的なのしたくなっちゃった、、、

#状況、、

Dockerで環境構築して、mysqlもコマンドで中入ればみれる、よしよし、、

って思っていたけど、いちいちコマンド叩くの嫌になちゃった、、

そうだ！いいのがあるじゃないか！の共有です！


https://hub.docker.com/_/mysql

#方法

- docker-compose.ymlに以下を追加
※8081は使っていないポートでお願いします、


```docker-compose.yml
  adminer:
    image: adminer
    restart: always
    ports:
      - 8081:8080
```

- サービスの再構築コマンド(build)、コンテナ作成してスタート(up)、-d(コンテナに後でコマンドで入れるモードにしたい時に使用)をうつ
`$ docker-compose up --build -d `

<font color=red>※上記行うとローカルで権限変えたもの元通りになったりするのでご注意ください。</font>

- 構築終わったら表示
※ipは、`$ docker-machine ip default`で調べられます。←マシーンを『default』で登録している場合
![スクリーンショット 2020-10-18 0.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/e601dfc5-8e16-003d-9d24-f0f87e259985.png)

- 必要なデータを入れてログイン
![スクリーンショット 2020-10-18 0.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/2ecfb482-3cf5-83e7-2a51-df3d26595ade.png)

- 後は見るのみ！です！
MacBookAirにpyenvをインストールし、pythonを切り替えて使うようにする

## 前書き
前記事に引き続き、まだmarkdown及びmacOS、CUI操作に慣れていないこともあり、
マナー違反もあるかもしれませんが、生暖かい優しさでコメントいただけると幸いです。
本当に初歩の初歩的な内容（メモ書き）となります。

## 環境
macOS Catalina バージョン 10.15.7

## ゴール
macにコマンドライン（ターミナル）でpyenvを入れ、
pyenv経由で複数pythonをインストールし、用途に応じて切り替えができるようにする。

## 結論
少し引っかかったものの、
ターミナルの再起動によって問題なく完了できた。

## いざ、着手
と言いつつ、作業自体はすでに完了したので、初心者あるあるな部分で戸惑ってしまったので、
備忘録としてメモだけ残しておきます。

基本的には[こちらのQiita記事](https://qiita.com/Ajyarimochi/items/ff40e57d082dd171e761)を参考にさせていただきました。
わかりやすくて大変助かりました、ありがとうございました。。。

本来は、ver3.xxのpythonが入ってしまえば個人的には問題なかったのですが、
pyenvは切り替えが自由にできるということが主な機能ということで、
試験的にデフォルトでmacに入っていたpython 2.7.16と、新規で使いたい3.9.0をpyenvでインストールしました。

コマンドは以下です。

```
pyenv install 2.7.16
pyenv install 3.9.0
```

以下のコマンドで、問題なく二つのバージョンのpythonがインストールされていることは確認でき、

```
pyenv versions
```
次のコマンドで、デフォルトで使用するpythonのバージョンを指定したはずなのですが、

```
pyenv global 3.9.0
```

```
python --version
```
上記でバージョン確認しても、現行の2.7.16のままでした。。。

googleで解決策を探すと、[このような記事](https://qiita.com/ta_ta_ta_miya/items/e24394c6b0022405a126)が見つかりました。
こちらで解決できる！

ワクワクしながら`/etc/paths`を確認しても、問題なさそう・・・

何故なんだ、と悩むこと数分。

もしや、と思い**ターミナルを再起動**。

問題なく切り替わっていました。

ぐぬぬ、、意外と見落としてしまいますね。

今後も気をつけます。
[day: 1] ScalaMatsuriに参加してきました

# ScalaMatsuriに参加してきました
## はじめに
エンジニア歴、scala歴半年です。
ほぼ日記みたいな内容です。
技術系の話は特にしません。(まだ、できません)

### 理解が足りていないなと感じたこと
#### for式
for式がmap、flatMapのシンタックスシュガーということはなんとなく頭で分かっているつもりですが、言語化してくださいと言われると難しいと感じています。

#### implicitについて
implicitで値を定義しておくことで、その値が定義されなくてもコンパイラが補ってくれるものですがこちらも言語化できるレベルで理解していきたいです。

#### Singlton
これもよく聞きますが理解できていません。

#### コレクションの型
Seqを使用していると値がVectorとListのように別のコレクション型？になっていることがあります。
これらの違いについても理解していきたいです。

### 使ってみたいと感じたこと
#### zugen
これはプラグインとして導入すると、メソッドの呼び出し関係などを図式で表してくれるというものです。
チームに入ったばかりのメンバーにアプリの構造可視化して伝えたり、仕様変更の際に影響範囲を特定する用途で使用することができます。
是非とも使ってみたいです。
[zugen](https://github.com/todokr/zugen)

#### scala steward
アプリケーションは様々な依存関係で成り立っていますが、そのどれか一つに脆弱性が見つかるとセキュリティホールになってしまいます。
しかし、脆弱性を毎回チェックし修正するのはコストがかかってしまいます。
このscala stewardはアプリケーションの脆弱性を自動でチェックして修正すべき箇所も教えてくれるというもの。チームに脆弱性担当のメンバーが一人増えるようなものとのことです。
セキュリティはプロダクトの重要な課題なので使ってみたいです。

[scala steward](https://github.com/scala-steward-org/scala-steward)
## 毎日投稿について
- 完全な自己満足
- アウトプットの習慣づけ
- インプットした内容の記憶の定着を促進
- 継続 > クオリティ
- 昨日の自分より成長している実感を得る
【windows】環境変数

__内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。__というエラーが出る時の__対処法__

#対処法
例として__pip__が内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。という__エラー__が出たとき、

__pip.exe__のファイルがあるディレクトリを__環境変数__に指定する。

手順1
pip.exeの場所を見つける。例として以下の場所にpip.exeがあるとする。

```
C:\Users\user\Anaconda3\Scripts\pip.exe
```

手順2
windowsの検索で__環境変数を編集__を開く。
そして、__userのユーザー環境変数(U)__の__path__をクリック。

![環境変数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676731/ebc5b930-6363-abcd-5246-5dfdbbecc60a.jpeg)

すると以上のようなのが表れる。

そして、以下のように編集を押し､pip.exeがあるディレクトリのpathを設定する。
![環境変数2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676731/84169361-e8cc-4ea3-8b80-0a4d061d324c.jpeg)

これで下の__OK__を押して設定完了!!

あとは__再起動__する。
すると__環境変数__に設定した__ディレクトリにあるexe__のファイルを自動的に読み込むことができ、エラーが出なくなる。
Active StrageをRSpecでテスト

##はじめに
Active Strageを使用し、画像投稿ができるアプリを制作中です。
その際のテストの書き方の例を紹介します。


##factories
```
FactoryBot.define do
  factory :post do
...
      trait :post_image do
        image {
          fixture_file_upload("app/assets/images/XXX.PNG")
        }
      end
...
```

##letを定義
```

let(定義名) { 定義の内容 }

let(:post_image) { FactoryBot.create(:post_image) }
```
##使用する（例）
```
post = FactoryBot.create(:post,:post_image)
```
##参考にさせて頂いたサイト
https://qiita.com/maca12vel/items/ee4d16827f24f69080ae
https://shuttodev.hatenablog.com/entry/2019/09/04/015756
[Rails] ActiveStorageを使ってpostsにアバターを表示

#やりたいこと
Posts#index（以下タイムライン）にアバターやユーザー名を表示したい

#前提
devise導入
ActiveStorage導入
アバターをusersモデルに追加

#やり方
postsモデルに`:avatar`の`has_one_attached`とuserインスタンスメソッドを追加

```Ruby:post.rb
class Post < ApplicationRecord
  validates :content, {presence: true, length: {maximum: 140}}
  validates :user_id, {presence: true}
    
  has_one_attached :avatar
  
  def user
    return User.find_by(id: self.user_id)
  end
end
```

viewに.userを追加

```erb:index.html.erb
    <% @posts.each do |post| %>
    <div class="posts-index-item mb-20">
      <div class="posts-index-user">
        <!--avatar-->
        <div class="posts-index-img d-inline">
          <% if post.user.avatar.attached? %>
            <%= image_tag post.user.avatar, class: "avatar-index rounded-circle mx-auto" %>
          <% else %>
            <img class="avatar-index rounded-circle mx-auto" src="<%= "/images/default_user.png" %>" alt="Userimage">
          <% end %>
        </div>
        <!--username-->
        <div class="posts-index-username d-inline">
          <%= link_to post.user.username, users_show_path %>
        </div>
      </div>
      <!--content-->
      <%= link_to(post.content, "/posts/#{post.id}") %>
    </div>
  <% end %>
```

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777631/d3721179-fce7-c2b9-4198-fcfe19cfe35f.png)

#まとめ
userメソッドによってparamsの使えないposts#indexでもUserモデルを扱える。
⇒`post.user.avatar`によりUserモデルに紐づいた`:avatar`を取り扱える
AtCoder 生活　98日目

[前回](https://qiita.com/flandrescarlet237/items/16a6943c990c9bbcd5e4)

#98日目
今回はABC177のA〜C問題をときました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC177|A|◯|5分18秒|
|ABC177|B|◯|23分10秒|
|ABC177|C|✕|68分1秒|

##[ABC177](https://atcoder.jp/contests/abc177)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int d,t,s;
    cin >> d >> t >> s;
    t *= s;
    if(d <= t)cout << "Yes" << endl;
    else cout << "No" << endl;
}

```

解くのにかかった時間：5分18秒

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    string s,t;
    cin >> s >> t;
    int ls = s.size();
    int lt = t.size();
    int ans = lt;
    rep(i,ls-lt+1){
        int cnt = 0;
        rep(j,lt){
            if(s[i+j] != t[j])cnt++;
        }
        ans = min(ans,cnt);
    }
    cout << ans << endl;
}

```

解くのにかかった時間：23分10秒

###C

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;
const int MOD = 1e9+7;

int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    ll sum = 0;
    rep(i,n){
        cin >> a[i];
        sum += a[i];
        sum %= MOD;
    }
    ll ans = 0;
    rep(i,n){
        sum -= a[i];
        if(sum < 0) sum += MOD;
        ans += a[i] * sum;
        ans %= MOD;
    }
    cout << ans << endl;
}

```

解くのにかかった時間：68分1秒
感想：なんか全探索の計算がうまくできない

###最後に
普通の計算トレーニングをしなければいけない気がする
【Python】都道府県プルダウンのタプル版

#タプル版です
DjangoでModelを作っていて、都道府県のchoicesで必要だったので定義しました。
もし使う機会があればお使いください(笑)

##Tuple
```python:prefectures.py
PREFECTURES = (
	(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, '鳥取県'),
	(32, '島根県'),
	(33, '岡山県'),
	(34, '広島県'),
	(35, '山口県'),
	(36, '徳島県'),
	(37, '香川県'),
	(38, '愛媛県'),
	(39, '高知県'),
	(40, '福岡県'),
	(41, '佐賀県'),
	(42, '長崎県'),
	(43, '熊本県'),
	(44, '大分県'),
	(45, '宮崎県'),
	(46, '鹿児島県'),
	(47, '沖縄県'),
)
```

##JSON版
JSON版はこちらが参考になりました。
[都道府県コード JSON版とJS版](https://qiita.com/isamusuzuki/items/d2f40b043ada0a106548 "都道府県コード JSON版とJS版")
データベースの操作(SQL編)

# データベースの操作 ~SQL編~
* SQLの使用方法を知る
* データベースの基本的な操作を理解
* テーブルの基本的な操作を理解

# ターミナルでの使用方法
```java:ターミナル
# ホームディレクトリに戻る
% cd

# MySQLに接続
% mysql -u root
```


# Sequel Proでの使用方法
## Sequel Proを使用してログインする際は、下記のように入力
![9f4a2951092ddd67c27a8afcdc73d3d3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/b6efe5f5-a17b-4106-ee03-5e577f138b2b.png)

#ターミナルで以下のSQLを実行

```java:ターミナル
mysql> CREATE DATABASE sqltest;
```
#MySQLで以下のSQL文を実行
```java:ターミナル
mysql> SHOW DATABASES;
```
# データベースを削除
```java:ターミナル
mysql> DROP DATABASE sqltest;
```
# データベースを指定
## データベースを作成して、選択
```java:ターミナル
mysql> CREATE DATABASE sqltest;
Query OK, 1 row affected (0.00 sec)
```
# コマンドでテーブルを作成
```java:ターミナル
mysql> CREATE TABLE goods (id INT, name VARCHAR(255));
```
# 作成したテーブルを表示
```java:ターミナル
mysql> SHOW TABLES;
```
## テーブルの構造を確認
```java:ターミナル
mysql> SHOW columns FROM goods;
```
## カラムを追加
```java:ターミナル
mysql> ALTER TABLE goods ADD (price int, zaiko int);
```
# カラムを変更
```java:ターミナル
mysql> ALTER TABLE goods CHANGE zaiko stock int;
```
# カラムを削除
```java:ターミナル
mysql> ALTER TABLE goods DROP stock;
```
# 現場からは以上です！
Netlifyで新しいサイト作って、netlify-cliでデプロイする

# 前提
Netlifyのアカウントは作ってある
静的サイトはすでにできている

# NetlifyのSiteを作成する。
NetlifyにLoginするとページの下部に以下のように表示されている。
![スクリーンショット 2020-10-17 23.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/febc335a-7fd8-c010-3c66-50ebde48f0a4.png)

ここに静的サイトのフォルダーをドラッグ & ドロップする。
![スクリーンショット 2020-10-17 23.26.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/65fa08d9-70f5-e291-3873-9df989cdb68b.jpeg)

するとこんな感じで新しいSiteができる。

次にドメインを変更する。

上のSiteをクリックすると以下のような画面にいける。

![スクリーンショット 2020-10-17 23.29.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/30b4a1db-69ae-c7de-9bae-c26a419fdc84.jpeg)

Domain settingsを押す

![スクリーンショット 2020-10-17 23.32.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/f4323ebe-4e51-48aa-ec89-12e5fc691879.jpeg)

Edit site name を押す
するとSite名を編集できるので適当な名前をつける。

すると、`サイト名.netlify.app`で公開されたサイトにアクセスできる。

# netlify-cliを用いてデプロイする。
更新するときはnetlify-cliを用いる
[ドキュメント](https://docs.netlify.com/cli/get-started/#installation)

```
npm install netlify-cli -g
```

`netlify deploy`でデプロイする
[リファレンス](https://cli.netlify.com/commands/deploy/#deploy)

```
netlify deploy --dir=docs --prod --auth ${NETLIFY_AUTH_TOKEN} --site ${NETLIFY_SITE_ID}
```

--prodを付けないと下書き扱いとなり、本番とは別の自動生成されたURLで公開される。

## NETLIFY_AUTH_TOKENの取得
(https://app.netlify.com/user/applications#personal-access-tokens)
ここから、`New access token`を押して作成する
![スクリーンショット 2020-10-17 23.50.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/e7d9d11a-b26f-c9d1-e453-86128563b95f.jpeg)


## NETLIFY_SITE_IDの取得

![スクリーンショット 2020-10-17 23.29.26-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/694804e5-88f9-3bd4-f149-cfbf45e9fb9d.jpeg)

![スクリーンショット 2020-10-17 23.55.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/f55260da-a20b-9c3b-7a61-39838b24b0f5.jpeg)

ここに書いてある文字列をコピーすればOK

# 参考

[Github ActionsでNetlifyに自動デプロイする](https://medium.com/@kosa3/github-actions%E3%81%A7netlify%E3%81%AB%E8%87%AA%E5%8B%95%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B-22ac30e02528)
回帰分析の近似曲線をExcelに選ばせてはいけない

#結論
- 回帰分析の近似曲線をExcelに選ばせてはいけない
- 「いろんな近似式を試してみて、決定係数（R^2）が一番大きいものを採用しよう」とすると、次数が高い近似式を採用することになる確率が高い

#検証方法
- RAND()関数を使い、説明変数Xと目的変数Yがともにランダムに決まる、n=20のデータをExcelで作成
- このデータの散布図を描き、Excelに近似曲線を描かせる
- 近似曲線の形は「1次関数」「2次関数」「指数関数」「対数関数」の4種類[^1]
- 近似式と決定係数（R^2）を表示
![20201017-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179111/ba5255dd-3d6b-8045-d765-9b5a66dcabec.png)

- 20回「再計算」（F9を押す）させ、それぞれの決定係数がどうなるかを記録

#結果
20回中13回で「2次関数」が最大の決定係数となった。
![20201017-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179111/839f9119-bada-b66d-b8f7-c8eecf2988da.png)

具体的な決定係数の推移は下図のとおり。
![20201017-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179111/138be3f2-dd38-6f4e-87a3-7cd8b669b4e1.png)

- 今回はランダムな散布図なので、全体的に決定係数が小さい
- 2次関数の決定係数は、相対的に常に高めになる
- 指数関数や対数関数の決定係数が、たまに2次関数のものを抜くときがある

#おまけ1
「説明変数も目的変数もランダムだから、分布が全体に広がった形になって、形状がダイナミックな2次関数が有利だったのでは？」と、脳内の自分から質問が出たので、目的変数の関数を「=RAND()/5+0.5」にして、比較的潰れた形の散布図を作り、同様の検証を行ってみた。

散布図
![20201017-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179111/730a7a9f-964a-3631-4cdb-7b4d10d1b3fc.png)

結果、やはり「2次関数」の決定係数が高くなる傾向になった。
![20201017-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179111/3e3fdea9-baca-ac7b-a0ce-938480a6e9b3.png)
![20201017-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179111/1fc891cc-5a59-ad9f-0b4e-b01dbb401895.png)

#おまけ2
なぜこのような結果になるのか、少し考えてみた。
##理由1：2次関数は自由度が高い
今回用いた4つの近似式は、一般化すると
- 1次関数：y=ax+b
- 2次関数：y=ax^2+bx+c
- 指数関数：y=ae^(bx)
- 対数関数：y=aln(x)+b
となり、2次関数の自由度が3である一方、他の3つの自由度は2である[^2]。

仮にデータ数がn=3であれば、2次関数は完ぺきにフィットする数式を作ることができるが、他の関数はそうなるとは限らない。

##理由2：2次関数は増減が切り替わる
2次関数は、最大値or最小値を持ち、その前後で増減が切り替わるが、他の3つは最大値or最小値を持たないので、単調増加か単調減少にしかならない。

もし、データの分布に増減が切り替わる傾向があった場合は、2次関数が当てはまりの良さで優位になる。

反対に、データの分布に増減の切り替わる傾向がなかった場合は、2次関数は不利になるかといえば、そうはならない。
なぜなら、2次関数の軸（最大値or最小値となるときのx）を、データのxの範囲の外側においてしまえば、2次関数であっても、データの範囲内では単調増加or単調減少にできるからである。。

[^1]: Excelでは、それぞれ「線形近似」「多項式近似（次数=2）」「指数近似」「対数近似」のこと。
[^2]: 指数関数の一般式をy=ae^(bx)+cと、対数関数の一般式をy=aln(x+b)+cとすれば、両者の自由度は3である。しかし、Excelの場合はそうなってはいない。
CDKを使ったときの問題と対応

## 概要
* CDKで環境作成時に発生したエラーと対処法についてまとめていきます。
* 他何か発生したら追加していくかも

## コード作成時のエラー
* 症状
    * npm で必要なモジュールを追加していったあとにコードを書いていくとなぜかコンパイルエラーが発生
* 原因
    * 各cdkのモジュールのパッケージのバージョンが異なっている。
* 対策
    1. `package.json` の各ライブラリのバージョンを合わせる
    * `package-lock.json`を削除する。
    * `node_modules` 以下のディレクトリをすべて削除する。
    * `npm install` でパッケージを取得しなおす。

## cdk diff などの時のエラー
* 症状
    * `Error: unable to determine cloud assembly output directory. Assets must be defined indirectly within a "Stage" or an "App" scope` と表示されている。
 
* 原因
    * 各cdkのモジュールのパッケージのバージョンが異なっている。
* 対策
    * コード作成時と同様モジュール入れ直し

## 作成時に設定されるIDが格納されているパラメータストアの値が古い
* 症状
    * 作成時にIDをパラメータストアに登録しておき他のstackで利用するつくりにしている場合、最初に作成したときのIDを参照してしまっている。(VPCなどを別のstackで作成し他のstackで参照する場合など)
* 原因
    * `cdk.context.json` にパラメータストアから取得した値が設定されているためこちらのファイルを再作成する必要がある。
* 対策
    * 一度破棄して作り直す場合は `cdk.context.json` を削除する。
[AWS認定SAP]デプロイメント（ブルーグリーンとローリング）

#ブルーグリーン・デプロイメント
1. 稼働中の環境（ブルー）とは別に新しい環境（グリーン）を構築する。このとき、新しい環境にはエンドユーザーからアクセスできないようにしておく。
2. 新バージョンのアプリケーションを新しい環境にデプロイする。
3. 新しい環境でテストを行う。
4. テスト結果に問題があった場合はアプリケーションを修正し、2に戻って再度デプロイ。問題がなければ新しい環境をエンドユーザーに開放し、古い環境にはアクセスできないようにする。（古い環境の削除はしない）
5. エンドユーザーの利用中にアプリケーションの問題が発見された場合は、再度古い環境を開放し、新しい環境にアクセスできないように切り戻す。

##メリット
・切り替え・切り戻しのダウンタイムが短い
・本番環境でテストが行える
・デプロイ時にサービスを提供するインスタンス数が減らない

##デメリット
・一時的に通常の2倍のリソースが必要となる

#ローリングデプロイ
前提条件：稼働中の環境がLBに複数台のインスタンスが接続されていること
1. 1台もしくは複数台のインスタンスをロードバランサーから切り離し、切り離したインスタンスに対して新しいアプリケーションをデプロイ。
2. 新バージョンのアプリケーションのテストを行う。
3. テスト結果に問題があればアプリケーションを修正し、再度デプロイ。問題がなければインスタンスをロードバランサーに接続。
4. デプロイを行っていないインスタンスに対しても、順次切り離しとデプロイを繰り返す。

##メリット
・切り替え・切り戻しのダウンタイムが短い
・本番環境でテストが行える
・デプロイ時にリソースを増やす必要がない
##デメリット
・デプロイ時にサービスを提供するインスタンス数が減る
・新しいアプリケーションと古いアプリケーションが混在するタイミングがある


#終わりに
備忘録として投稿します。
切替時に、本番環境がセッション情報持っていて、ELBの切り替えがうまく行かないとかありそうですが、、、どうなのでしょうか。
勉強を進める中で分かったら更新しようと思います。
【MySQL】テーブルを作成して、CSVファイルからデータをインポートする方法

CSVファイルのデータをDBに突っ込む方法を調べたので備忘録的まとめ。

ちなみに、突っ込みたいCSVファイルはこんな感じ。

|user_id  |install_datetime  |delete_flg  |
|---|---|---|
|10001  |2016-03-19 15:45:00  |0  |
|10002  |2016-03-21 12:30:00  |1  |
|10003  |2016-03-23 09:15:00  |0  |
|10004  |2016-03-25 06:00:00  |0  |
|10005  |2016-04-02 10:00:00  |1  |
|10006  |2016-04-02 12:50:00  |0  |
|10007  |2016-04-30 15:00:00  |0  |

※DBを作っていない方はこちらを参照
[【初心者向け】MySQLでローカルにDBを作成する方法](https://qiita.com/OhshimaRyo/items/5e898526a978ea6e5960)

## 1.テーブル作成
```
mysql> create table user_master(
    -> user_id int,
    -> install_datetime timestamp,
    -> delete_flg int,
    -> primary key(user_id)
    -> );
Query OK, 0 rows affected (0.01 sec)
```
今回自分が必要なテーブルを作成した。
テーブル作成方法についてはググればたくさん出てくるのでそちらを参照のこと。

## 2.テーブルの確認
```
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| user_master      | // テーブルができている
+------------------+
1 row in set (0.01 sec)
```

## 3.テーブルの中身を確認
```
mysql> select * from user_master;
Empty set (0.00 sec)
```
今はまだ何も入っていない

## 4.CSVファイルをテーブルにインポート
```
mysql> load data local infile "Downloads/user_master.csv" // インポートするファイルのパス
    -> into table user_master // 突っ込むテーブル名
    -> fields terminated by ','　// 何でデータを区切るか（CSVの場合は","）
    -> ;
Query OK, 8 rows affected, 10 warnings (0.02 sec)
Records: 8  Deleted: 0  Skipped: 0  Warnings: 10
```

## 5.テーブルを確認
```
mysql> select * from user_master;
+---------+---------------------+------------+
| user_id | install_datetime    | delete_flg |
+---------+---------------------+------------+
|   10001 | 2016-03-19 15:45:00 |          0 |
|   10002 | 2016-03-21 12:30:00 |          1 |
|   10003 | 2016-03-23 09:15:00 |          0 |
|   10004 | 2016-03-25 06:00:00 |          0 |
|   10005 | 2016-04-02 10:00:00 |          1 |
|   10006 | 2016-04-02 12:50:00 |          0 |
|   10007 | 2016-04-30 15:00:00 |          0 |
+---------+---------------------+------------+
8 rows in set (0.00 sec)
```
これでデータが入った。