OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】simple_form使い方基礎

# simple_formとは？

入力フォームを簡単に作れるgemのこと。

Railsでフォームを作成するにはform_withやform_forを使えば実装できますが、simple_formというものを使えばより簡単にフォームを作成することができます。

# 使い方
お決まりのやり方ですが、Gemfileにgemを追記してbundle installし、generateコマンドを実行します。

```
gem 'simple_form'
```

```
$ bundle install
```

```
$ rails generate simple_form:install

※bootstrapを適用させたい場合はbootstrapオプションをつけてコマンド実行します。
$ rails generate simple_form:install --bootstrap
```
ビューの書き方の例は以下のようになります。

```sample.html.erb
<%= simple_form_for @user do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= f.button :submit %>
<% end %>
```
ちなみにslimを使った書き方だと次のようになります。

```sample.html.slim
= simple_form_for @user do |f|
  = f.input :username
  = f.input :password
  = f.button :submit
```
かなりシンプルになりましたね！
今回、表示の画面例は用意しておりませんが、普段formを作成した時のようにフォームのラベルと入力用のフォームが作成されます。
ラベルはactiverecord.ja.ymlファイルに日本語訳を書いていれば指定した文字を表示してくれるので、特に指定してあげる必要はありません。

## 色々なオプションをつけてアレンジする
オプションは属性名の後ろにカンマ区切りで指定していく。

```rb:例
<%= simple_form_for @user do |f| %>
  <%= f.input :username, label: "ラベルの名前" %>
<% end %>
```

■ラベル名の変更
`label: 'ラベル名'`
※activerecord/ja.ymlに指定した名前より、オプションの方が優先されるようです。
※ラベル名を非表示にしたい場合は`label: false`をつけましょう

■ヒントをつける
`hint: '入力する際のヒントや注意書き'`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404519/da4ec770-a31d-5b8c-58cf-344bdf426eaf.png)
このように入力フォームの下に入力した文字が表示されます。

■エラーメッセージ（投稿に失敗したときに表示される）
`error: '半角英数字で入力してください'`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404519/1bfa4f02-9b3e-a226-8ee4-b6a4ed9c74f8.png)
エラーが発生して入力が完了しなかった場合に指定したエラーメッセージを表示させることができます。
例えば入力した属性は半角英数字でしか入力を受け付けていない場合、再度入力してもらう時の手助けとしてhintオプションが役に立ちます。
※railsでは 標準で表示されるエラーメッセージがあるのでそちらを使う方がいいかもしれません。

■エラーメッセージを表示させたくない時
`error: false`

■フォームに説明書きをしておきたい時
`placeholder: '半角英数字で入力してください'`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404519/fd7cc93d-cbcb-8245-6eaf-f05d531701d0.png)

■ファイルの投稿フォームにしたい時
`as: :file`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404519/d4731a83-83c8-b40c-6a77-96f72e2c248b.png)


# 参考
ここで紹介したオプションは一部のみです。詳しくはGithubに載っているので、色々試して遊んでみると面白いと思います。
[simple_formのGithub](https://github.com/heartcombo/simple_form)
[用語解説]Payjpによる決済の流れ

あるアプリ開発でPay.jpを用いた商品購入機能実装を担当した際、なかなか概念が掴みづらかったので解説

#まずそもそもPay.jpとは
・結論
開発者向けのクレジット決済代行サービス
※こちら実装して利用申請すれば本当のクレジット決済できます。

####大きく分けて２つのモードがあります。
[ライブモード]本番運用
[テストモード]動作確認←チーム開発ではこちらやりました。

決済の流れ
１、クレジットカード情報を入力フォームから入力

２、入力フォームにpay.jpのシークレットキーを埋め込むのでここでpay.jp側でカード情報照会(そのカードは存在するのか？)はしてくれます。
※emailを適当なアドレス(test@testなど)で登録すると
| AuthenticationError | PayjpのAPIによる認証に失敗してエラーが出ます。

３、カード情報に間違いなければ一旦「トークン」と呼ばれるクレジットカードidのみ持ったお買い物券が発行される(現金を一旦nimocaに変える感じ。いくら入ってるかは確認出来るがnimoca単体での金銭的価値はない)

４、品物(product)を購入した場合、決済情報＋トークンが一緒にカード会社に送られ決済完了となります。(nimocaを改札口に通した時、決済とカード情報が送られ金額が引かれるイメージ)

#なぜpay.jp使うのか？
上記の流れだと直接クレジットカードで決済した方が早いように感じます
しかし、実際クレジットカード決済行うためにはそれぞれのクレジットカード会社と提携契約を結ぶ必要があります。
わざわざ契約めんどくさい、という開発者サイドの代行をしてくれるのがpay.jpとなります。
【Rails】ルーティング　resourcesメソッド

# resourcesを使って、indexアクションを設定に仕方。

**resources**を使って、indexアクションを設定し、tweetsコントローラーの
`indexアクションを呼ぶパスを指定します。`



```config/routes.rb

Rails.application.routes.draw do
  resources :tweets, only: :index #追記
end
```

これで、tweetsというパスを指定すると、tweetsコントローラーのindexアクションの処理
を実行することができるようになりました。

しかし、まだtweetsコントローラーを作成していないためこのままだとエラーが生じてしまいます。


# tweetsコントローラーを作成しよう

tweetsコントローラーをコマンドを使って作成します。

 ターミナルで下記のコマンドを実行しましょう
作成するコントローラーはtweets_controllerとします。

```rails:ターミナル
# コントローラーを作成
$ rails g controller tweets
```

コントローラーを作成が完了です。

正しく作成できれば下記の様な出力結果が表示されます。

```rails:ターミナル

create  app/controllers/tweets_controller.rb
invoke  erb
create    app/views/tweets
invoke  test_unit
create    test/controllers/tweets_controller_test.rb
invoke  helper
create    app/helpers/tweets_helper.rb
invoke    test_unit
create      test/helpers/tweets_helper_test.rb
invoke  assets
invoke    coffee
create      app/assets/javascripts/tweets.js.coffee
invoke    scss
create      app/assets/stylesheets/tweets.css.scss
```
5 月 LeetCode 挑戰, W2D1, Check If It Is a Straight Line (計算斜率), in Swift

資料結構與演算法： `Math`

- 挑戰頁面 - [Check If It Is a Straight Line](https://leetcode.com/explore/featured/card/may-leetcoding-challenge/535/week-2-may-8th-may-14th/3323/)
- 原題目頁面 - [993. Check If It Is a Straight Line](https://leetcode.com/problems/check-if-it-is-a-straight-line/)

## 思考方式

可以沿途看 `斜率` 有沒有改變，就可以知道題目給的一連串座標是不是直線。

- 於是就可以先求出頭兩點的斜率，接著逐兩點求斜率看和第一組數組的斜率有沒有不一樣。
- 有不同就回傳 false ，順利走訪完成就可以回傳 true 。

送出之後看別人的解法，發現這題有另外一個 shoelace formula 的有趣解法，雖然不是非常的直覺，但是可以避免算斜率時分母是零的情形。不過這篇還是先記錄自己寫出來的第一個寫法。

## 程式碼

``` swift
class Solution {
    func checkStraightLine(_ coordinates: [[Int]]) -> Bool {
        if coordinates.count < 2 { return true }

        // 求出第一段的斜率
        let first = slope(from: coordinates[0],to: coordinates[1])
        var current: Float = 0

        // 走訪每一個數值
        for index in 1..<(coordinates.count - 1) {
            current = slope(from: coordinates[index],to: coordinates[index + 1])
            // 有遇到不同的值就直接中斷回傳 false
            if current != first { return false }
        }

        // 如果都沒有被中斷就代表斜率都相同可以回傳 true
        return true
    }

    /// 求斜率的 helper method
    func slope(from a: [Int], to b: [Int]) -> Float {
        // 斜率公式: Δy/Δx, 分母為零就回傳無限
        return b[0] == a[0] ? .infinity : Float(b[1] - a[1]) / Float(b[0] - a[0])
    }
}
```

## 複雜度分析

n 為 coordinates 的元素個數。

- 時間複雜度： O(n)
  - 一層的 for 走訪
- 空間複雜度： O(1)
  - 常數個變數宣告

## 執行結果

``` swift
Runtime: 40 ms (beats 100%)
Memory Usage: 21.2 MB
```
yukicoder contest 247 参戦記

# yukicoder contest 247 参戦記

## [A 1046 Fruits Rush](https://yukicoder.me/problems/no/1046)

正の新鮮さの果物があるのであれば、正の新鮮さの果物だけ大きい方から順にK個採用する(K個無い場合は全部). 0以下の果物しか無いのであれb、一番0に近いやつを1つだけ採用する.

```python
N, K = map(int, input().split())
A = list(map(int, input().split()))

A.sort(reverse=True)
print(A[0] + sum([a for a in A[1:] if a > 0][:K - 1]))
```

## [B 1047 Zero (Novice) ](https://yukicoder.me/problems/no/1047)

分からないので、多めにループを回して0になるかどうか確認するだけのコードを書いたら AC した(酷い). A, B が大きいので、10<sup>5</sup> 回したら TLE します.

```python
A, B = map(int, input().split())

N = 0
for i in range(1, 10000):
    N = A * N + B
    if N == 0:
        print(i)
        exit()
print(-1)
```

## [C 1048 Zero (Advanced) ](https://yukicoder.me/problems/no/1048)

K回の操作後の N は L * K <= N <= R * K になる. R * K 以下の最大の M の倍数が A 以上であれば N = 0 となるような操作列が存在することになる. A が L * K、B が R * K のときの [ABC165A - We Love Golf](https://atcoder.jp/contests/abc165/tasks/abc165_a) を *O*(1) で解く問題です(笑).


```python
L, R, M, K = map(int, input().split())

if R * K // M * M >= L * K:
    print('Yes')
else:
    print('No')
```
JavaScript初心者がAPI実行してwebスクレイピング(要ログイン)してみた

# 前書き
とある事情でJavaScriptを使うことになり、ちょうどweb上で欲しいデータがあったので、勉強がてらJavaScriptでスクレイピングしてみました。
JavaScriptに関してどんなものなのかは知っており、文法等は知らないといった程度でしたが、そこら辺は調べながらスクリプトを書いていきました。
(とある音楽ゲームの要ログインサイトにある情報を取得しています)
色々調べたこととかメモ程度に記載していきます。

# 今回のコード
[ここ](https://github.com/ta-kayan/iidx-topranker)に置いてあります。
READMEをよくお読みの上、ご使用ください。

# 実行の仕方
今回はスクレイピングが目的であり、webページ作成はしないので、とりあえずスクリプトの実行ができれば良いです。
調べたところ、chromeのデベロッパーツールが一番使いやすそうだったのでそれを使いました。
ブラウザ上で右クリックして出てくる一覧の中の「検証」というやつです。
<img width="555" alt="スクリーンショット 2020-05-08 21.24.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256661/729b16c6-555b-f3e4-fcc7-e673d5e0df0b.png">
ここの**Console**でJavaScriptを実行できるらしいです。
その他ここで主に使う機能は、
**Elements**:ページ内の要素を表示
**Network**:主にwebページ内で打ったAPIを表示
の2つになります。

# webページの要素を調べて書いてみる
デベロッパーツールの**Elements**で対象のwebページの要素を調べました。
ページ内のsubmitを押下して同一URL内に情報を表示させるのですが、対象の要素をみて見たところ、
`method='POST'`
と記載してあったので、API(POST)を打っていますね。
ということで、打っているAPIのURL,header,bodyを調べつつ、スクリプトを書きましょう。

## API調査
ここで先ほどのデベロッパーツール内「Network」が役に立ちます。
Networkを開いた状態で、webページ内でAPIを打つ操作をすると以下のように色々表示されます。
<img width="551" alt="スクリーンショット 2020-05-08 22.01.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256661/e2405310-61d7-8127-96d1-770e87c85fed.png">
対象のAPI(html)を選択してみると、URL,header,body(Form Data)が表示されます。
URLとbodyはこれで良いのですが、headerは色々いらないものが混ざっています。
調べたところ、打ったAPIのheader表示してくれるchromeの拡張機能があるそう。
https://chrome.google.com/webstore/detail/http-headers/nioieekamcpjfleokdcdifpmclkohddp
これで見たところ、最低限のheaderのみ表示されました。これでAPIの情報が揃いました。

## APIを打つ方法
主に
**XMLHttpRequest**
**Ajax**
の2つがあることがわかりました。今回はXMLHttpRequestを選択。
**API実行**

```
var xhr = new XMLHttpRequest();
// 処理が更新&ステータスが200であれば返ってきたデータを分析する
xhr.onreadystatechange = function(){
	var READYSTATE_COMPLETED = 4;
	var HTTP_STATUS_OK = 200;
	if( this.readyState == READYSTATE_COMPLETED&& this.status == HTTP_STATUS_OK )
	{
            // jsonの解析処理
	}
}
// url,headerをセット
xhr.open('POST', url);
xhr.setRequestHeader('Accept', '*/*');
// API実行(POSTなのでbodyを一緒に渡す)
xhr.send(body);
```

## json解析
今回はjsonが返ってきたので、下記でjsonを解析しています。
JavaScriptでのjson解析はドットで繋げれるそう。

**jsonの解析処理関数**

```
function getscore(obj){
	let length = obj.list.length;
	var count = 0;
	for (let i=0; i<length; i++) {
		another_djname = obj.list[i].name_3; // jsonから情報取得(DJNAME)
		musicname = obj.list[i].music; // jsonから情報取得(曲名)
		if (another_djname == 'hoge'){　// 県内で自分のスコアが一番高かったらcountして曲名を表示
		  count += 1;
		  console.log("曲名:" + "%s", musicname);
	    }
	}
	all_count += count;
}
```
**jsonの解析処理関数呼び出し**
下記で呼び出しています。API実行の`//jsonの解析処理`の箇所です。

```
		var result = JSON.parse(this.responseText); // jsが読み込める形に変換
		getscore(result); // json解析
		if( cnt < version ) {
			postapi(cnt+1); // 再帰処理
		}
		else{
			console.log("県一数:" + "%d" + "曲", all_count);
		}
```
ページが複数あったので再帰処理をしています。
for文だとAPIリクエストが全て終わる前に最後の処理を行ってしまいました。
再帰処理が終われば集計した値を表示させるようにしています(elseのところ)。

## Console上でスクリプト実行
ここでデベロッパーツールの**Console**を利用。

```
javascript:(
function(){ 
  hogefuga
}
)();
```
のように、スクリプトを実行するために`javascript:()();`を付け加えれば実行できます。
要ログインサイトだった為、ログイン→対象ページに移動し実行しました。

めでたしめでたし
マニフェストファイルは何をどうしているのか？

#はじめに
マニフェストファイルについて学習したので、忘備録として残しておきます。

Q.マニフェストファイルは何をどうしているのか？

A.ブラウザ表示を効率的に行うために、個々のアセットを結合し、アセットパイプラインに伝えている

#アセットパイプラインのなかで役割を担う存在
アセットパイプラインとは、開発者の作成したJavaScript、CSS、画像などのアセットを効率的に扱う仕組みのことです。sprocket-railsというgemのなかのSprocketの機能で、デフォルトで有効になっています。

アセットパイプラインでは、それらのリソースをブラウザで表示するのに最適な状態へと処理します。
具体的には、高級言語のコンパイル、アセットの連結、アセットの最小化、ダイジェストの付与などが処理されます。（ダイジェストの付与が、どのような恩恵をもたらすのかはまだ経験していません、、、）

#アセットの連結されたファイルを`layouts/application.html.erb`が読み込む
アセットパイプラインの、アセットの連結、の部分を担うのがマニフェストファイルです。つまり、どのファイルとどのファイルを結合させるべきかを、アセットパイプラインに明示する（manifestする）ファイルが必要になるのです。

まず前提として、ブラウザが読み取れる言語は、ざっくり　HTML・CSS・JavaScriptの三種類ですので、、、

Railsは、CSSとJavaScriptを読み込むためのヘルパーメソッドを、`app/views/layouts/application.html.erb`にデフォルトで`<head>`タグ内に次のように記述しています。

```application.html.erb
    <%= stylesheet_link_tag    'application', media: 'all' %>  *CSSを読み込む
    <%= javascript_include_tag 'application' %>　*JavaScriptを読み込む
```

で、この２行はそれぞれ、最適化された`application.css`と`application.js`というファイルを読み込んでいます。この２つを読み込むことでHTMLを装飾したり動きをつけているのです。では、どうやってこれらの連結されたファイルは作成されたのかというと、、、

#マニフェストファイルの登場
`app/assets/application.css`と`app/assets/application.js`が個々のアセットの連結を明示（マニフェスト）して、作成するのです。（これはデフォルトのやり方で他にも方法はある）

例えば`app/assets/application.js`に、どこどこのディレクトリにあるJavaScriptを読み込むように！　と指定できます。

どのようにマニフェストファイルを書くかというと、`application.js`の場合、、、

```application.js
//= require rails-ujs
//= require activestorage
//= require_tree .
```
となります。`//=`ではじまる行を、アセットパイプラインに伝えるための行として扱います。
・`require <path>`は、指定したJavascriptを、記述した位置に取り込みます。拡張子は省略可能。
・`require_tree <path>`は、指定したディレクトリ内のすべてのファイルを読み込みます。この`.`の場合は、`application.js`が配置されているディレクトリが指定されていることになります。
（アセットの探索パスについてはここでは割愛させてもらいます、、、）

`application.css`の場合は、、、ではなく、Sassの場合を紹介します。その場合は、、、

```application.sass
 *= require_tree .
 *= require_self
 @import 'hoge'；
```
となります。
・`//=`が` *= `になっています。
・`require_self`は自分自身を読み込むという意味です。
・新たに`hoge.sass`を読み込みたいときは、`@import`を使います。`require_tree .`を使うと、すべてのCSSを読み込んでしまい、ファイルの読み込みの順番がわからなくなってしまうからです。

#もう一度
Q.マニフェストファイルは何をどうしているのか？

A.ブラウザ表示を効率的に行うために、個々のアセットを結合し、アセットパイプラインに伝えている

#最後に
解像度が低いかもしれませんが、今回は以上です。
最後まで読んでいただきありがとうございます。
誰かの学習を、前進につながれば、うれしいです。

#参考文献
・現場で使えるRuby on Rails5速修実践ガイド　pp266-271
・[https://sass-lang.com/documentation/at-rules/import#plain-css-imports](https://sass-lang.com/documentation/at-rules/import#plain-css-imports "
")
SELECT結果がない場合も必ずダミーレコードを返す

## 経緯
フィルタ条件によって1レコードも結果が取得されない場合でも、なにかしらダミーのレコードを返す必要があったので考えてみました。
本来ならアプリケーション側でなんとかするべきかもしれません。


## クエリ

対象データとダミーデータを完全外部結合しておいて、対象データの件数が0であればダミーデータ、そうでなければ対象データを取得します。
完全外部結合によって空行が出現してしまう場合があるので、最後に除外します。

```sql
with
  t as (
    -- テスト用対象データ
    select
      *
    from
      unnest(
        array<struct<col1 string, col2 string>>
        [
          -- レコードがない対象データをエミュレート
        ]
        -- [
        --   -- レコードがある場合をエミュレート
        --   ('real', 'data!')
        -- ]
      ) as col
  ),
  no_record_dummy as (
    -- tのレコードがなかった場合のダミーデータ
    select
      'some dummy' as col1,
      'data' as col2,
  ),
  at_least_one_row as (
    -- tのレコード件数
    select
      count(*) as row_count,
    from
      t
 )
select
  if(a.row_count = 0, d.col1, t.col1) as col1,
  if(a.row_count = 0, d.col2, t.col2) as col2,
from
  no_record_dummy d
  full outer join t using (
    col1,
    col2
  ),
  at_least_one_row a
where
  -- tのレコードがあった場合はfull outer joinによって空行が出現してしまうので除外
  if(a.row_count = 0, d.col1, t.col1) is not null
```

## 取得結果

対象レコードがない場合
<img width="163" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15117/e7e6debe-cdf7-7c74-cb20-a40e26ae671c.png">

対象レコードがある場合
<img width="117" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15117/c566bbd0-1f4c-241a-0873-67a396b22dcb.png">
Django Sprint Appendix Docker関連

## 概要
ここではDjango Sprintで使用するDockerについて取り上げます。Dockerについては

- [『【図解】Dockerの全体像を理解する -前編-』](https://qiita.com/etaroid/items/b1024c7d200a75b992fc)
- [『【図解】Dockerの全体像を理解する -中編-』](https://qiita.com/etaroid/items/88ec3a0e2d80d7cdf87a)
- [『【図解】Dockerの全体像を理解する -後編-』](https://qiita.com/etaroid/items/40106f13d47bfcbc2572)
- [『いまさらだけどDockerに入門したので分かりやすくまとめてみた』](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)

を通して、理解すると良いです。Dockerについて実践を通して理解したい人は

- [米国データサイエンティストのブログ ｜ Docker超入門（全7回）](https://datawokagaku.com/whatisdocker/)
- [ドットインストール ｜ Docker入門](https://dotinstall.com/lessons/basic_docker)

を参照してください。



## 主要コマンド
Djangoでの開発に用いることの多いDockerコマンド、docker-composeコマンドを下にまとめています。


#### コンテナの起動(サーバーの起動)

```terminal
# foregroundで起動
$ docker-compose up

# backgroundで起動
$ docker-compose up -d
```

#### コンテナの停止(サーバーの停止)
```terminal
# foregroundで起動していた場合
Ctrl + C （時間がたってもなかなか終わらな場合はもう一度Ctrl + C）

# backgroundで起動していた場合
$ docker-compose stop
```

#### コンテナの再起動(サーバーの再起動)
```terminal
# foregroundで起動していた場合
$ docker-compose up

# backgroundで起動していた場合
$ docker-compose restart
```

#### Djangoコマンドの実行
```terminal
$ docker-compose run --rm web <Djangoコマンド>
```
主要なDjangoコマンド一覧はこちらを参照

- [『Django 管理コマンド manage.py まとめ』](https://qiita.com/okoppe8/items/7e3de8a4dd40b48debea)

#### プロジェクトのログを見る
```terminal
$ docker-compose logs

# 各コンテナの最新の5行を表示する
$ docker-compose logs -f --tail="5"

# 各コンテナの最新の5行を表示する（タイムスタンプあり）
$ docker-compose logs -f --tail="5"
```

#### コンテナ一覧を表示
```terminal
$ docker ps -a
```

#### コンテナを停止
```terminal
$ docker stop <コンテナID>

# すべてのコンテナを停止
$ docker kill $(docker ps -a -q)
```

#### コンテナを削除
```terminal
$ docker rm <コンテナID>

# すべてのコンテナを削除
$ docker rm $(docker ps -a -q)
```

## 参照

- [Django Sprint #0 イントロダクション](https://qiita.com/tmgauss/private/a0dbc8b90fd5c95732af)
- [Django Sprint #1 環境構築](https://qiita.com/tmgauss/private/7e07b572dc6913475f86)
- [Django Sprint #2 新規プロジェクトのスタート](https://qiita.com/tmgauss/private/96c74381b52da4679d19)
- [Django Sprint #3 ユーザーモデルのカスタマイズ](https://qiita.com/tmgauss/private/b8edaf0da8cb8c22b1b5)
- [Django Sprint #4 トップページの作成](https://qiita.com/tmgauss/private/889793b2d7c6c89d6863)
- [Django Sprint #5 汎用ビューとCRUD 前編](https://qiita.com/tmgauss/private/0664cb98ca95e9737091)
- [Django Sprint #6 汎用ビューとCRUD 後編](https://qiita.com/tmgauss/private/96613b26dc0eea28d3c6)
- [Django Sprint Appendix Docker関連](https://qiita.com/tmgauss/private/bf3545d17c7271ed4fcb)
- [Django Sprint Appendix 各種実装まとめ](https://qiita.com/tmgauss/private/f92044b346825b812121)
- [Django Sprint Appendix モデルとデータベース](https://qiita.com/tmgauss/private/5e882e71100b798209d8)
- [Django+PostgreSQLのアプリケーションをAWSのElastic Beanstalkにデプロイする (UTokyo Project Sprint 用)](https://qiita.com/Chrg/private/d0c6fa829040613d1bb6)
- [Django+MySQLのアプリケーションをAWSのElastic Beanstalkにデプロイする (UTokyo Project Sprint 用)](https://qiita.com/yulingo-ringo/private/5c2be0a31636c33565f1)
推測統計　コロナ陽性率から全国の感染状態を推測する

統計の知識がない素人ですが、昨今の報道をみて「実際なにが起こっているのか」を知りたいと思い調べてみました。


PCR実施状況　厚生省HPより
https://www.mhlw.go.jp/content/10906000/000623123.pdf


これによると【1/15～4/19】の期間で
- 検査実施人数　  94,826人
- 陽性者数　　　  10,608人　
- 陽性率は　　　  10.9%

総務省は2019年4月12日、昨年10月時点の人口推計を発表した。 
総人口は、126,443,000人

ひとまずこちらの数字で推測してみる。

検査実施人数が全国の人数を表すのに有意な人数か？
標本誤差の数式

```math
\sqrt{\frac{N-n}{N-1}×\frac{p×(1-p)}{n}}
```
このうち抽出率（母集団の大きさに対する標本の大きさの割合）
は下記になります


```math
\sqrt{\frac{N-n}{N-1}}
```
この式にあてはめると

```math
\sqrt{\frac{126443000-94826}{126443000-1}}
```
0.9996　つまりはほとんど1のため
標準誤差は

```math
\sqrt{p×(1-p)/n}
```
で示されます。

感染率10.9%であるなら

```math
\sqrt{0.109×(1-0.109)/94826}
```
標本比率の標準偏差σは　0.0010　つまり0.1%

正規分布では、

データの68.26％が標準偏差1つ分（1σ）に含まれる
データの95.44％が標準偏差2つ分（2σ）に含まれる

2σをとれば　0.1%ｘ2=0.2%　つまり95.44%の確率で誤差0.2%の範囲に収まる。
感染率は10.7%から11.1%になる。となります。


# 顕在化する問題
- 出版バイアス（こうであってほしい。と思う公開者側の意図）がかかっている可能性
- 検査を受けた人が健康な人を含む国民の総体を表していない。
- 採取日、結果判定日のズレ
- 地域差（40%から0%の幅がある）
- PCR検査の偽陽性・偽陰性と集団の感染率。ドイツ・韓国のように感染率が低い段階で網羅的に検査をすると偽陽性が問題になる。ただ今の日本では検査を受けるべき患者が正しく受検できる環境なのかは（？）

結局、感染状態を知るためにどのくらいの検査数が有意な数なのか。を知りたかったが、政治的な不信感が高まっただけだった。
もう少し統計を勉強して出直します。。





# 参考にさせていただいたサイト
視聴率の計算
https://toukeigaku-jouhou.info/2015/08/25/audience-rate/
標本調査
https://www.stat.go.jp/teacher/c2hyohon.html
kmyacc を Fork しました（偉大な先人に敬意を込めて）

# kmyacc

Fork しました。

* https://github.com/Kray-G/kmyacc-forked
    * Fork 元はこの方のリポジトリです。  
      https://github.com/moriyoshi/kmyacc-forked
    * リポジトリを残しておいてくださってありがとうございます。

> 独立させました（[こちらの記事](https://qiita.com/Kray-G/items/fb1cbe8f3004db5de3b3) 参照）。
>
> * https://github.com/Kray-G/kmyacc

## 修正

Fork 元から以下の修正をしています。

* README.md ファイルの追加。
* Windows 用の Makefile を追加。
* Visual C 向け Warning 抑止用の修正。
* 64bit 対応。

## 適用

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。

晴れて Bison から kmyacc に移行。

## さいごに

間違いなく日本で最高のエンジニアの 1 人だった森公一郎氏の足跡が、少しでも残りますように。。。
ラズパイをディスプレイや有線LANなしで初期設定する

ラズパイを極力少ない周辺機器のみで初期セットアップしたい。（いわゆるヘッドレスインストール）
最近はMacBookのみで、外付けディスプレイやUSB接続マウス/キーボード、有線LANケーブルなどを持っていない人も多いと思います。
男は黙ってコマンドラインでラズパイ接続ですよね。

# 環境/使うもの
- Raspberry pi 4 (Model B/4GB)
- micro SDカード (64GB)
- micro SDカードリーダー
- Mac
- Wifi環境

# 使わないもの
- ディスプレイ
- USBキーボード/マウス
- 有線LANケーブル

# 手順
- Raspbianのインストール
- ssh設定
- Wifi設定
- sshコマンドでログイン
- おまけ（パーテーション拡張）

# Raspbianのインストール
最近はオフィシャルでSDカードに書き込むソフトが出てるんですね。
https://www.raspberrypi.org/downloads/
Raspberry Pi Imager for macOSをダウンロードし、手順に沿って進めます。
1. OSを選択（今回は標準のRaspbianを選択しました。）
2. 書き込み先SDカードを選択
3. 書き込み！
![スクリーンショット 2020-05-08 18.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/964c7e8d-2ce1-7630-489d-413e9b345735.png)

ちなみに私のmicro SDカードリーダーはこんな感じで3段構成。。
micro SD > SD > USB > USB type-c

# ssh設定
SDカードのルートディレクトリ直下にsshという名前のファイルを作成することで、ssh接続が可能になる仕組みです。

``` command:MacOS
$ touch /Volumes/boot/ssh
```

# Wifi設定
SDカードのルートディレクトリ直下に下記ファイルを作成します。
SSIDとパスワードは適宜自分のものに変更してください。

``` command:MacOS
$ vim /Volumes/boot/wpa_supplicant.conf
```

``` file:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="hoge"
    psk="foo"
}
```

ここまで完了したら、SDカードをラズパイに差して、電源を入れます。

# sshコマンドでログイン
``` command:MacOS
$ ssh pi@raspberrypi.local
```

デフォルトパスワードは "raspberry" です。

入れました！

```
pi@raspberrypi:~ $
```
セキュリティの警告が出てるので、パスワードは変更しておきましょう。

```
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
```

# おまけ
## Wifi設定変更
上記でSDカードに作成したWif設定ファイルは、ラズパイ側だと下記でアクセスできます。

``` command:raspberrypi
$ vi /etc/wpa_supplicant/wpa_supplicant.conf
```

## ディスク使用量を確認する

``` command:raspberrypi
$ df -lh
```
【swift5】xcode11 BGMの流し方

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/xcode?src=hash&amp;ref_src=twsrc%5Etfw">#xcode</a> <a href="https://twitter.com/hashtag/swift?src=hash&amp;ref_src=twsrc%5Etfw">#swift</a> <a href="https://t.co/iWVBG9EMP4">pic.twitter.com/iWVBG9EMP4</a></p>&mdash; aa2302 (@aa23021) <a href="https://twitter.com/aa23021/status/1258750297075154947?ref_src=twsrc%5Etfw">May 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><img width="1005" alt="スクリーンショット 2020-05-08 22.21.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627010/a0061445-8acd-f6d2-7881-e0e1e2907c2d.png">

<a href="https://qiita.com/aa2302/items/15c786ed8624a5f461e3">上記クイズアプリのコード

【学んだ点】
・bgmの入れ方

雑談
bgmを入れたくて色々コードを探したもののxcode11以前のバージョンのコードが多くエラーばかり出てて焦りました。
xcodeが提示してくれたコードに変えたら無事bgmを入れることができました。
感動。笑
Associate Cloud Engineer取得に向けて

## この記事の目的
・Associate Cloud Engineer(ACE)の取得の過程を記す
・取得の意思を継続させるため

## ACE取得前のスペック
・CS学士
研究では、DNNを用いた音楽の印象識別を取り扱う
・アプリケーションエンジニア４年目
アプリケーションエンジニアと思っているが、基本なんでも屋（ＧＣＰは触ったことない）
・AWS SAA取得

## ACE取得の決意のきっかけ 
・社内でAWSに知見のある人が増えてきて、何故かAWSへの興味が薄れた。社内でGCPに知見がある人がいなく、あわよくば社内エバンジェリスト的な立ち位置を狙えると考えたため
・AWSはインフラより、GCPはアプリよりのIF思想であり、自分が今後進みたいと考えているキャリアにfitしていると感じたため
・GCPの最先端の思考に触れられると感じたため

## これから
とりあえず、[こちら](https://cloud.google.com/certification/guides/cloud-engineer?hl=ja)の試験範囲の情報をまとめて頭の中の整理をしようと考えている
緊急事態宣言終了後、６月中の取得を目指します。
resourcesメソッドでrailsのルーティングを設定しよう

#resourcesメソッドでrailsのルーティングを設定しよう
railsで定義されている7つのアクションのルーティングを自動で作成するメソッドです。
resourcesメソッドは簡単にルーティングを設定できます。
#resourcesメソッドで定義される7つのメソッド

index：リソースの一覧を表示させる
show：リソースの詳細を表示させる
new：投稿フォームを表示させる
create：リソースを追加させる
edit：更新フォームを表示させる
update：リソースを更新させる
destroy：リソースを削除する

これらを設定することでアプリを作ることができます。
##resourcesメソッドの使い方
resourcesメソッドはルーティングを記述するroutes.rbの中で使用します。

```routes.rb
Rails.application.routes.draw do
  resources :コントローラー名
end
```
このように記述します。

##resourcesメソッドをアクションを指定して使用する方法
onlyとexceptを使用するとアクションを指定してルーティングすることができます。
例

```routes.rb
Rails.application.routes.draw do
  resources :tweets, only: [:index, :snow]
end
```

```routes.rb
Rails.application.routes.draw do
  resources :tweets, except: [:new, :create, :edit, :update, :destroy]
end
```

機能としては差は無いようですが、onlyを使ったほうが使用するアクションを明示的にできるので可読性が上がるそうです。


##おわりに
今回はresourcesメソッドを用いたルーティングの設定方法についてまとめました。
違いなどがありましたらご指摘いただければ幸いです。
最後までご覧いただきありがとうございました。
【Rails】パスワードを設定してるのにAction mailerが動かない際の対処法

Railsの機能であるAciton　mailerの機能について、設定する際にミスをしがちな部分を紹介します。

一応actionmailerを設定したけど動かない人向けです。



##config/environments/development.rbのパスワードには自身がGmailにログインする際に使用するパスワードを入力する。

セキュリティから発行する16桁の難しいパスワードではありません。あなたが日常で使用しているパスワードです。

##送信元のメールアドレスは架空のアドレスで良い。

私はexample@rails.comにしてます。

##Railsから送られてくるGmailアドレスのパスワードを変更した場合、本人だという認証確認をしなければ行けない場合がある。

上記を試して動かないという人は一度gmailをログアウトしてください。それからログインすると上記の認証確認をすることができます。
動的に追加された要素へのイベント登録 jQuery

#行ったこと

- 削除ボタンを動的に追加

　→動的に追加した削除ボタンに、「押したら一番近い親要素を削除」
　　イベントを登録したい

#実装
**HTML**

```
<div id="a">
  <div id="b">
    <!-- ここにボタンを追加する -->
  </div>
</div>         
```

**Javascript**

```
$("#b").append("<button class="delete" type="button">削除</button>");
```

ボタン要素が追加されました。ディベロッパーツールでは下記のようになります。

**HTML**

```
<div id="a">
  <div id="b">
    <button class="delete" type="button">削除</button>
  </div>
</div>   
```

次に、この動的に追加されたボタンをクリックすると親要素(id="b")が削除されるイベントを登録します。

**Javascript**

```
 $('.delete').on('click',(e) => {
   $(e.target).remove();
  });
```

とすると、あれ、何もおこらない、、、
動的に追加した要素へのイベント登録の場合は、書き方を変えなければいけない

```
 $(document).on('click', '.delete', (e) => {
   $(e.target).parent().remove();
  });
```

上記のように、書き直すことで、無事イベントを呼び出すことができた。
小数点以下を切り上げる場合の商を求める方法【競技プログラミング】

有名な内容だと思うが、自分用にメモ
# 整数型同士の割り算は切り捨てられる。
$a$, $b$を整数型($a$, $b>0$)とするとき, $a/b$を計算すると小数点以下は切り捨てられる。
例)
(i) $a=4, b=2$
$4/2=2$
整数型同士の計算の場合は小数点以下は切り捨てられ、2となる。

(ii) $a=5, b=2$
$5/2=2.5$
整数型同士の計算の場合は小数点以下は切り捨てられ、2となる。

通常、整数型同士の割り算は切り捨てられ、そのままだと切り上げることはできない。

# 切り上げるためにはどうするか？

```math
\frac{a+b-1}{b}
```
を計算し、小数点以下を切り下げると、$a/b$の小数点以下を切り上げた結果が得られる。
$a=4, b=2$
$(4+2-1)/2=5/2=2.5$
の小数点以下を切り捨てると、$2$となる。
確かに$4/2=2$で小数点以下を切り上げると$2$だから合ってる。

$a=5,b=2$
$(5+2-1)/2=6/2=3$
の小数点以下を切り捨てると、$3$となる。
両方とも$a/b$の小数点以下を切り上げた結果になっている。

# 証明
$[]$をガウス記号とする。(ここでは、小数点以下を切り捨てる程度の意味)
$a$が$b$で割り切れるか割り切れないかで場合分けする。

(i) $a$が$b$で割り切れる
$a=bk$とおける($k$は整数)。この時, 

```math
\left[\frac{a+b-1}{b}\right]=\left[\frac{bk+b-1}{b}\right]=\left[k+\left(1-\frac{1}{b}\right)\right]=k
```
$a/b=k$の小数点以下を切り上げても$k$であるから、確かに合っている。

(ii) $a$が$b$で割り切れない
$a$を$b$で割った時の余りを$l$と置くと, $a=bk+l$とおける($k,l$は整数, ただし, $1\le l<b$)。この時, 

```math
\left[\frac{a+b-1}{b}\right]=
\left[\frac{bk+l+b-1}{b}\right]=\left[k+1+\left(\frac{l-1}{b}\right)\right]=k+1
```
$a/b=k+l/b$において$k$は整数部分で、$l/b$は小数部分であるから、小数点以下を切り上げると、確かに$k+1$となり結果は合っている。

# 実装
C++でプログラムを組み、確認した。


```c++
#include <iostream>

using namespace std;

int main(){
  int a, b;
  cin >> a >> b;

  cout << "a/b=" << a/b << endl;
  cout << "(a+b-1)/b=" << (a+b-1)/b << endl;
  return 0;
}
```

(i)$a=4$, $b=2$

```shell-session
$ ./a.out
4 2
a/b=2
(a+b-1)/b=2
```

(ii)$a=5$, $b=2$

```
$ ./a.out
5 2
a/b=2
(a+b-1)/b=3
```

# 結論
(a+b-1)/bを計算し、小数点以下を切り捨てると, a/bの小数点以下を切り上げた結果が得られる。
Nuxt での"NavigationDuplicated" エラー

# NavigationDuplicated の発生条件と回避方法

## 環境
nuxt: 2.0.0

## 確認できた発生条件
他にもあるかもしれないが、リダイレクトを行ったとき、リダイレクト先のパスとリクエストされたページのパスが同じ時に発生した。

## 回避方法
単純にリクエストと同じパスにリダイレクトしない。筆者の場合はmiddlewareにstoreのデータ次第でどのページがリクエストされても、ある特定のページにリダイレクトする、という処理を入れた際に発生したので、以下のような処理を入れて回避した。


```nuxt:middleware/sample.js
if (route.path !== '/target') redirect('/target')
```

以上
Railsチュートリアル 12章 リスト11.29のテストでエラーが出る

##エラーメッセージ

```terminal
ERROR["test_password_resets", PasswordResetsTest, 0.9276049650002278]
 test_password_resets#PasswordResetsTest (0.93s)
NoMethodError:         NoMethodError: undefined method `reset_sent_at=' for #<User:0x000000000776da70>
        Did you mean?  reset_token=
            app/models/user.rb:63:in `create_reset_digest'
            app/controllers/password_resets_controller.rb:12:in `create'
            test/integration/password_resets_test.rb:18:in `block in <class:PasswordResetsTest>'
```
Userモデルにreset_sent_atカラムがないよ！ってエラーを吐きました。

##試したこと
調べてみたら同じようなエラーが出ている方がちらほら。```rails db:rollback```をした後マイグレーションファイルを以下のように編集して```rails db:migrate```を実行。

```ruby:_add_reset_to_users.rb
class AddResetToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :reset_digest, :string
    add_column :users, :reset_sent_at, :datetime
  end
end
```

これでもまたエラー…。```rails console```で```User.column_names```のコマンドでちゃんとreset_sent_atがあることを確認。いよいよわけが分からなくなる。

##解決策

どうやらtest環境でのdbを更新しないといけないらしい。

>既存のマイグレーションに変更が加えられていると、テストデータベースを再構築する必要があります。bin/rails db:test:prepareを実行することで再構築できます。

引用元：https://railsguides.jp/testing.html#%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B

そこで```bin/rails db:test:prepare```を実行。

無事にテストが通りました！！
【初心者向け】GitHubでローカルにあるファイルをリモートリポジトリにPushする

##【初心者向け】GitHubでリモートリポジトリを作ったけどその後どうするか

 - この記事の対象は、gitの導入は出来たが、ローカルにあるファイルをどうすればいいか分からない人
 
 - 記事の最後には、ローカルにあるファイルをリモートリポジトリにPush出来ることが目標。

##環境
 - git version 2.26.2.windows.1
 
##リモートリポジトリ、ローカルリポジトリとは

リモートリポジトリとは、所謂、親玉です。
リモートリポジトリをチームの完成形だとすると、ローカルリポジトリはチームメンバーそれぞれが実装しているファイルになります。

おそらく、説明が的確ではないが、リモートリポジトリとローカルリポジトリ、どちらを納品するかというとリモートリポジトリです。

この説明はgit全体の説明になるので、触り程度にしておきます。

gitの導入については下記の私の記事をぜひ読んでください。
https://qiita.com/zakio0227/items/fcbad988c53f578ca3b2


##今回の記事でやりたいこと

今回は、**GitHubにあるリモートリポジトリに手元のローカルリポジトリをPush**（アップロード）します。


まず、ローカルファイルでgitを使うので、ローカルリポジトリ（手元のファイル）にgitを導入します。

 - 勘違いポイントですが、gitをインストールすれば、すべてのファイルでgitを使用出来る訳ではないです。
 
 - **GitBash**でこれからのコマンドを入力していって下さい。
 
 - 私が【】で表記している部分はコマンドに含んでないのでご注意下さい。【】を使ったコマンドはここでは出てこないです。



###このファイルをGitHubのリモートリポジトリにPushしたい！！というディレクトリにアクセス。（$cd C:hogehogeみたいに）

`git init`

ここで、下記のコマンドでどうなっているか確認。
`git config -l`
User.nameやUser.email等は確認できたでしょうか？



###下記の図のように、ローカルリポジトリからGitHubのどのリモートリポジトリにPushするか指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/0910648d-bbd5-c7db-7dec-27870365ec10.png)

下記のコマンドで、リモートリポジトリを指定。
` git remote add origin 【GitHubのURL】`

URLはGitHubの"Clone or Downloadの"部分からコピペ出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/a70f13ff-ef44-7203-b215-4e23519b2413.png)



###リモートリポジトリのファイルをPullします

リモートリポジトリにあるファイルを自分のローカルリポジトリに落とします。

下記のコマンドでPull
`git pull origin master`

下記のコマンドで、ローカルリポジトリにあって、リモートリポジトリにないファイルを表示します。赤字で出るので、そのファイルを次のステップで追加します。
`git status`



###赤字で表示されたローカルリポジトリにあって、リモートリポジトリにないファイルのどれをリモートリポジトリに追加するか

下記のコマンドで追加したいファイルを指定する
`git add 【追加したいファイル名】`

追加したいファイル名は、`git status`で赤字で出てきたファイル名です。


###追加したファイルをPushしてしまいたいところだけど、gitはコミットしないとPushできない！
`git commit -m "【コミットメッセージ】"`

追加したファイルを上記のコマンドで一度コミットする。


###いよいよPush
最初のPushでは下記のコマンドを入力
以降は、`git push`でOK
`git push --set-upstream origin master`


以上で完了です。
それでは、GitHubでチェックしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/84580350-3a42-37f0-14d2-06502d83fdd0.png)

出来てました！！

GitHubにも遊びに来てください。
https://github.com/zakio0227
JavaScript  ~クリックした要素を取り出す方法~

# はじめに
同一のタグ（`li`など…）、をクリックした要素だけ取得したい時の方法を、意外とわかっていなかったので、備忘録として記載します。

# 実行例

実行例をみてみます。
イメージとしては、
<img width="617" alt="スクリーンショット 2020-05-08 21.45.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/60e6b5c3-c1b2-d7d1-906b-8ad1b5f3d52c.png">
ここで'要素3'の削除ボタンをクリックすると、
<img width="621" alt="スクリーンショット 2020-05-08 21.45.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/765af4e5-148b-6cc9-e3b1-3080a8301f5f.png">
'要素3'のみが削除されました。同一タグでもクリックされたところのみ削除されています。

ざっくりhtmlコードを記載します。

```html
<ul>
     <li>要素1</li>
     <li>要素2</li>
     <li>要素3</li>
     <li>要素4</li>
     <li>要素5</li>
</ul>
```

# JavaScriptでの処理
例えば、'要素3'の削除ボタンをクリックした時に要素3を消すという処理を行いたい場合、単純に考えるとこう書くこともできます。

```javascript
var li = document.getElementsByTagName('li');
li[2].addEventListener('click', function() {
      li[2].remove();
});
```

しかし、この場合だと、'要素3'を削除することしかできず、汎用性がありません。

なので、複数の要素数を取得するfor文を使います。

```javascript
var li = document.getElementsByTagName('li');
for (var i=0; i < li.length; i++) {
     li[i].addEventListener('click', function() {
            // thisはli[i]にあたる
            this.remove();
});
};

```

と書くことで、クリックした要素のみを削除することが可能です。
[Rails] application.scssのrequire_tree .に関して

# はじめに
"rails new"を実行して得られるファイルにapp/assets/stylesheets/application.scssってありますよね。

これまで学習したきた中で

```ruby
*= require_tree .
```

の存在は知っていて、この記述があることで、stylesheetsディレクトリ内にある、scssファイルを読み込んでくれている、という認識でした。

それは間違いではないのですが、ある問題がおこって、あれ？ってなった

# scssファイルが読み込まれて、、ない、、？？

問題が起きたのは、以下のようなコードを書いた時です。

```ruby
# application.scss

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */

 @import "reset";
 @import "config/colors";
 @import "font-awesome-sprockets";
 @import "font-awesome";
```

初心者の自分はこれで最初やってました。

"colors"っていうのは、よく使用する色を変数に変換してまとめているファイル(_colores.scss)です。
これで、アプリを立ち上げると、エラーになるはずです。

当時は、あれ？なんでだろ？って感じでわかっていませんでした。

上記のエラーを解消するには、以下のようにします。

```ruby

 @import "reset";
 @import "config/colors";
 @import "font-awesome-sprockets";
 @import "font-awesome";
```

つまり、**require_tree .を削除する**ということです。

require_treeには以下のような役割があります。

**require_treeには引数として与えられたディレクトリ以下のCSSファイルをアルファベット順に全て読み込むという意味があります。require_treeの引数には.(ドット)が渡されています。引数.(ドット)はカレントディレクトリを表します。つまり、この記述によってapp/assets/stylesheetsというディレクトリにあるCSSファイルやSCSSファイルは全て読み込まれることになります。**

要は、”require_tree .”によって、”@importで読み込んでいるファイル”より先にa~.scssのようなファイルを読み込み、結果として、変数を定義した_colors.scssが読み込まれた際にエラーが発生した、とういうことです。

# だから、やり方としては2通りかな

- require_treeを残す

　※この場合は@importを記載する必要はないです。（font-awesomeとかは記載する）

- require_treeを削除して、全てのscssファイルに対して@importの記述を行う

# でも

おそらくreset.scssを使用すると思うので（たぶん）、その場合は、後者の選択になるかなと思います。
【超初級編】Java Script変数と定数　その２

前回の補足です。
https://qiita.com/furukouji/items/3e2f7e877f873c8094c4
こちらを御覧ください。
##📗変数の補足
JavaScriptは　動的型付言語　と呼ばれる仕組みになっています。
いきなり動的なんちゃらかんちゃらって、なんやそれって感じですよね。
動的型付言語を一言でいうと
**変数の中身が文字なのか数値なのか自動的に判断してくれる仕組みです。**

```javascript
const test = 777;      //数字と勝手にJSが判断してくれる
const test = "ほげほげ"; //文字列とJSが判断してくれる 

ちなみに　変数の中身の型がなんだったかを調べるときは
console.log(typeof test);　
//typeofと記入する事によって、console上に numberやstringといったデータのタイプが表示されます。
//是非暇な時にでも試してみてください。

```

逆にJavaなどは静的型付言語と呼ばれ、
**数字なのか文字なのかを自分で指定してあげないといけません。**

```java

final int test = 777; //数字という意味のintegerの略intで数字ですよ。と教えてあげないといけない。
final String test = "ほげほげ"; //同上です。Stringで文字ですよと教えてあげないといけません。
 
```

###📗変数の命名規則
変数の頭文字は必ず

- 英語
- アンダーバー
- $

この３つのうちのどれかから始まらなければなりません。
また、変数は書いていくうちにたくさん増えてしまい、どれがなんの数値だったのか分からなくなってしまいます。
ですので、
**できるだけ意味のわかる名詞・英語で記入することが望ましいです。（なにげにコレが難しいですが・・・）**

また、**一般的に定数は大文字、変数は小文字で記入されることが多いので覚えておくと良いかもしれません。**

##📗まとめ
- JSは動的型付言語である。賢い！
- 変数の頭文字は英語かアンダーバーか$
- 定数は大文字、変数は小文字で書くと良い！
- 意味のわかる名詞・英語で命名する

##📗次回予告
次回はJSの配列について初歩的な内容を書いていこうと思います。
お楽しみに！！！
【新規登録】新規ユーザー登録の機能

```
// 新規登録
Auth.auth().createUser(withEmail: emailTextField.text!,
   password: passwordTextField.text!) { (user, error) in

// nilでない場合
   if error != nil{
                
       print(error)
                
   }else{

// userに値が入った場合
       
       print("ユーザーの作成がうまくいきました！")

   }
}

```
AWS SAA資格取得~データベースサービス編②~

それではデータベースサービスについて続きをまとめていきます。

##DynamoDBとは
マネージド型のNoSQLデータベースサービス
読み込み書き込みが早いが、API経由での操作になる。
SQLともデータの扱い方、構造が違ってきています。

読み込み書き込みが多いシステムや、テーブル結合が不要なシステムがおすすめ！
※RDSは更新が頻繁なシステム、テーブル結合が必要なテーブル設計のシステム

RDSとの違いがあるのでその点に関して注意。
[サーバーワークスさんのブログ記事](http://blog.serverworks.co.jp/tech/2017/04/12/what_is_different_dynamodb_and_rds/)でまとめられているので参照ください。

#####キーバリュー型データモデル
DynamoDBはキーバリュー型のデータベース。
データ書き込み時は１つのデータとしてキーとバリューがセットで保存される。
データを呼び出すときはキーを指定して、バリューを取り出す。

格納できるデータの種類は
RDB＝「数値」「文字列」や、JSONのような半構造データもバリューとして格納することができる。

#####マルチAZ
自動的に３箇所のAZにデータが保存される。(可用性を保つために！)

#####結果整合性モデル
書き込んだデータは時間が経てば正しく反映される（結果的には整合性が保証される）
※データ読み取りのタイミングによっては書き込んだデータが反映されてない場合がある。
＞マルチAZの３箇所にデータが分散・保存されることからデータの書き込み完了に時間差が生じてしまう
タイミングによっては反映されてないAZからデータを取得してしまう場合がある。
＞＞対策として[Consistent Read（読み取り一貫性）]というオプションが提供され、
書き込み反映されたデータを読み取ることができる。


##Redshiftとは
主にBIツールなどを利用した大量のデータを使用する分析・集計に向いてる、
ペタバイトクラスのデータもあ使うことができるマネージド型のデータウェアハウスサービス。

※データウェアハウスとは・・・企業活動の中で蓄積したデータをある特定の内容を分析するためのもの。

Redshiftは「ノード」と呼ばれているコンピューティングリソースの集まりで構成され、
Redshiftに対して処理を行う場合は「リーダーノード」
そこから「リーダーノード」は「コンピューターノード」に対してそれぞれ依頼をする。
ノードの集まりをクラスターという。

公式引用
>Amazon Redshift は、クラスターの状態のモニタリングやバックアップの取得、パッチの適用、アップグレードにいたるまで、データウェアハウスの管理、モニタリング、スケーリングに必要なすべての作業を制御します。パフォーマンスや容量に対するニーズの変化に合わせ、クラスターのサイズを簡単に変更できます。こうした多大な時間と労力を要する作業を自動化することで、お客様はデータの解析とビジネスに専念できます。

#####スナップショット
スナップショットを作成することでバックアップできる。
スナップショットはクラスターのポイントインタイムバックアップ。
自動と手動の２つがあり、自動の設定を有効にしている場合は８時間ごと、
もしくはノードあたり５GBのデータ変更があった場合に自動で取得する。
保存期間が過ぎるとRedshiftによって削除されるため、永続的にバックアップを保存したい場合は
手動でスナップショットを取得する必要がある。

スナップショットの格納先はRedshiftのクラスターが配置されているリージョンになるが
**クロスリージョンスナップショット**といい別のリージョンにもコピーするように設定できる。


以上個人的備忘録
RのlmerTestのsummaryからEstimate effectsを抽出して保存する

####lmerTestとは
lmerの拡張パッケージ
GLMMの結果をsummary()で取得でき，fixed effectのEstimate-effectなどを確認できる．

####やりたいこと
得られる結果から，特定のestimate-effectを抽出したい

####やったこと
summary_analy = summary(analy)の内容を見ると，Estimate-effectは，
summary_analy[["coefficients"]]
に格納されている．
これをデータフレームに変換して
df_coef = as.data.frame(summary_analy[["coefficients"]])
求めたいfixed effect(今回は'X1')の行のEstimateを取りたいので．
df_coef$Estimate[rownames(df_coef) == 'X1']
で完了．
データフレームで列名指定する場合は
df$colname[rownames(df) == 'rowname']
で取得
Terraformで作ったリソースを手動で変更するとどうなるか

IaCの原則として、”コードで作成したリソースはコードでのみ管理する”という鉄則がありますが、
それを無視するとどうなるかです。

#検証してみる
Terraformで適当なリソースを立てます。下記のサンプル通りにEC2を立ててます。
https://www.terraform.io/docs/providers/aws/r/instance.html

次に作成したEC2のTagを適当に編集してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257241/23cfaeeb-9041-e3ee-c4cd-3bf8f7a7416a.png)


次に先ほどterraformを実行した作業用端末からterraform applyしてみます。

```
$ terraform apply
data.aws_ami.ubuntu: Refreshing state...
aws_instance.web: Refreshing state... [id=i-0f4160053f3cf94fe]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # aws_instance.web will be updated in-place
  ~ resource "aws_instance" "web" {
        ami                          = "ami-0cf54a87bffe628d2"
        arn                          = "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxxxxxxxxxxx"
        associate_public_ip_address  = true
 【中略】

      ~ tags                         = {
            "Name"  = "HelloWorld"
          - "Name2" = "Testadded" -> null
        }
        tenancy                      = "default"
        volume_tags                  = {}
　【中略】

Plan: 0 to add, 1 to change, 0 to destroy.

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

  Enter a value:
```
上記の通りコードに記載されていないtagを外そうとして”1 to change”と表示されます。
これを実際に実行してみてからマネジメントコンソール上から確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257241/3b658735-f75d-d4d2-078c-d95a123a5bd8.png)

マネジメントコンソール上からも手作業で足したtagが消えてしまっていることがわかります。

今回の場合はtagが変更されてしまっただけですが、
もしこれが新規に作成したSGを手動でアタッチされていた場合などは、SGが外れてしまい意図しない通信断の原因となりますので
コードで作成したコードは原則すべてコードで管理する必要があります。
※terraformはtfstateの内容を読み取って、
作成・削除したリソースに対して、実環境とのマッピングやメタデータを管理しているのでtfstateに基づく動作をする。
https://www.terraform.io/docs/state/purpose.html

例外を運用上で認めるとオライリーのIaC本で口が酸っぱくなるくらい言われているくらい
構成ドリフトやスノーフレークサーバの巣窟になり脆いインフラになるので絶対にやめましょう！

#terraformの構成ドリフトでとても参考になるページ
https://www.hashicorp.com/blog/detecting-and-managing-drift-with-terraform/
【Ruby】yieldについて

##yieldとは

ブロックを引数として受け取り、受け取ったブロックを実行するメソッドとなります。

##yieldの使い方

以下の通りに使用します。

```
def test
    yield
end

test{puts "テストです"}
```

実行結果

```
テストです
```

testにブロック引数{puts "テストです"}を渡し、
そのブロックをyieldメソッドで実行してます。


##引数とブロック引数を同時に渡す方法

```
def foo(a,b,c)
 i = 0
 while(i < a)
    yield a + b + c + i
    i += 1
 end
end

foo(7,5,3){|x| puts x} 
```

実行結果

```
15
16
17
18
19
20
21
```

ブロック引数にブロックパラメーターと呼ばれる変数|x|を記載することで、
その変数に毎回値が渡されることになります。
while文でyieldを7回繰り返すことで、その都度出力される値が変更されます。
Active Record ってなんなん？

# 発生地
modelsファイルの1行目にだいたい生息している
# つまり
Active Recordとは、DBをいじれるようにRubyという言語をDB内で使える言語に変換してくれるシステム
# もうちょっと具体的に
CRUD（「Create：生成」、「Read：参照」、「Update：更新」、「Delete：削除」）を使えているのはこいつのおかげ

Rubyで直感的にDBを操作できる
[Ruby]%記法での文字列の作り方


シングルクオートやダブルクオート以外で、文字列を作成することができると、初めて知ったのでまとめてみました。

##**_シングルクオーテションで囲んだことと同義_**##
***



### %q! hello,そらじろう!

```
 'hello,そらじろう'
```




##**_ダブルクオーテーションと同義①_**##

***

### %Q! hello,そらじろう!

```
"hello,そらじろう"
```

##**_ダブルクオーテーションと同義②_**##

###　%!hello,そらじろう!###

```
"hello,そらじろう"
```

> プロを目指すためのRuby入門
自作モジュールをpip installできるように公開してみた

# 要約
自作モジュールを

```python
pip install my_awesome_module
```
できるように公開するには、`setup.py`と一緒にGitHubで公開すればOKという話

**GitHub page**:  https://github.com/kyohashi/model_selection

# そもそもpip installってなにしてるの？
PyPI(Python Package Index, パイピーアイ)へモジュールを探しに行っています。
例えば、[PyPI.org](https://pypi.org/)へアクセスしてnumpyを検索すると↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130706/b755566e-b327-5fee-984b-2f5bc252aa9e.png" width=80%>
*https://pypi.org/*

たしかにnumpyがありますね。↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130706/6e7da311-4c3d-8dd7-f26f-133bf23c2289.png" width=80%>
*https://pypi.org/search/?q=numpy*

PyPIにモジュールを登録する際には、モジュールのソースコードと一緒に、それらのメタ情報等を表す`setup.py`も必要となります。
以上をまとめると、

1. `pip install hogehoge`
2. PyPIへ行きname=hogehogeで検索
3. hogehogeに紐づく`setup.py`を読み込みモジュールとして認識＆インストール

という手順を踏んでいると理解できます。

# 自作モジュールの公開方法
PyPIに登録すれば`pip install`できると判明しましたが、実はGitHubでも公開することができます。
要はソースコードと`setup.py`の在り処を教えてあげれば良いのでGitHubに登録したのち

```python
pip install git+(URL)
```
で誰でもインストールが可能です。私は今回PyPIではなくGitHubでの公開を試しました。

GitHubへ登録したファイルおよび`setup.py`は下記の通りです。

```:ファイル構成
.
├── README.md
├── requirements.txt
├── setup.py
└── src
    └── model_selection
        ├── __init__.py
        ├── bayes_clustering.py
        └── utils
            ├── __init__.py
            └── check_datashape.py
    
```

```python:setup.py
from glob import glob
from os.path import basename
from os.path import splitext

from setuptools import setup
from setuptools import find_packages


def _requires_from_file(filename):
    return open(filename).read().splitlines()


setup(
    name="model_selection",
    version="0.1.0",
    description="statistical model selection with Bayesian IC like WAIC",
    author="kyohashi",
    url="https://github.com/kyohashi/model_selection.git",
    packages=find_packages("src"),
    package_dir={"": "src"},
    py_modules=[splitext(basename(path))[0] for path in glob('src/*.py')],
    include_package_data=True,
    zip_safe=False,
    install_requires=_requires_from_file('requirements.txt')
)

```
`setup.py`を見ると、srcフォルダ以下のpythonファイルをmoduleとして認識していることがわかります。
以上を登録すると晴れて

```python
pip install git+https://github.com/kyohashi/model_selection.git
```
が可能となります。

# 公開した自作モジュールの内容
今回作成したモジュールは、クラスター数の決定支援を目指したものになります。
具体的には下図のように、クラスター数候補すべてに対してGMMでモデリング＆WAICを計算することで、最適と思われるクラスター数を推定するものです。MCMCサンプリングには、PyMC3を使用しています。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130706/2e6e3373-f892-ad57-e9da-0b1576ff0143.png)

Toy Dataに対する実装例もありますので、併せてご覧ください。
**Usecase**: https://kyohashi.github.io/model_selection/gmm_usecase.html
AWSアイコンセットを挿入するPowerPointアドインの紹介

# AWSアイコンセットを挿入するPowerPointアドインの紹介

## はじめに

下記リンクにあるAmazonが提供しているAWSアイコンセットを挿入するPowerPointアドインを作成したので、紹介します。

https://aws.amazon.com/jp/architecture/icons/?nc1=h_ls
---

## 機能

以下の図にあるようにAWSアイコンセット上から挿入したいアイコンを検索し、フォーム上から挿入する機能を提供します。

![](https://github.com/11ohina017/OhinaWork/raw/master/img/DemoAws.png)

---

## インストール

* 以下のリンクから、ダウンロード

https://github.com/11ohina017/OhinaWork

* ダウンロードしたZIPファイルを解凍

* pptxフォルダ配下の以下のスクリプトをダブルクリック

`installPowerPointAddin.vbs`

インストール後にPowerPointを起動すると、リボンタブにOhinaWorkというタブが追加されます。

## おわりに

reveal.jsやmarpのようOSSを利用できず、PowerPointで資料を作成することを強いられるエンジニアの助けになれば幸いです。

## 関連

https://qiita.com/11ohina017/items/36786ae5f55dfded8566

https://ohina.work/post/about/
vscodeで爆速に開発


vscodeで開発をするに当たって、私的に便利だと思う、ショートカットやemmet記法、
その他tipsをまとめました。

###ショートカット (os:mac)

| キーボード       　    |機能    　　　　　　　　　|    
|:-------------------  |:---------------------|
| command + b          |サイドバーを開閉         |             
| command + //         | コメント　　　　　　　   |             
| option + command + s |全てのファイルを保存      |           
| command + ,          |   設定画面を開く     |
| shift + command + p  | コマンドパレットを開く |            
| option + ↑ or ↓    |     カーソルを置いた行を移動|
| shift + option + ↑ or ↓   |     カーソルを置いた行を複製|  
| command + o |フォルダを開く     |
| command + p |ファイルを開く     |  
| command + d   |ファイル内の同じ記述を選択     |  
| command + f  |検索（ファイル内）     | 
| option + command + f  |置換     | 
| shift + command + f  |全体検索（）     | 


###emmet記法

下記の文字を入力し、enterを押すと続くコードが自動入力される
例）aと入力した後、enterを押すとaタグ<a href=""></a>が自動入力される。
*コピペではなく「実際に入力+enter押下」しないと発火しません。

```sample.html

//a 
<a href=""></a>

//!
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

//link:css
<link rel="stylesheet" href="style.css">

//script:src
<script src=""></script>

// ul>li*3(任意の数)
<ul>
    <li></li>
    <li></li>
    <li></li>
 </ul>

//l
<label for=""></label>

//sel
<select name="" id=""></select>

//.sample
<div class="sample"></div>

//img
<img src="" alt="">

//lorem
Lorem ipsum dolor sit amet consectetur adipisicing elit. 
Corporis quam ea distinctio facere eveniet possimus expedita, odio exercitationem autem neque est temporibus sed ad id pariatur, ullam reprehenderit maxime quibusdam.

```
他にもいっぱいありますが、個人的によく使う物だけ抜粋。

チートシートはこちら。
(https://docs.emmet.io/cheat-sheet/)

###その他tips

・テキストを選択せず、カーソルだけおき、commnd + c押すと行毎コピーできる
（同じ方法でcommnd + xで切り取りもできる）

・設定画面でAuto saveを有効にする

・option + カーソルでマルチカーソルにできる

・command + enterで行の途中にカーソルがあっても下に行を挿入できる

・設定画面のRender whitespaceをallにする
（半角スペースが薄いドットで表示される。無駄な半角スペースが目視で発見できます）
（全角スペースを目視で発見したい場合は、拡張機能の[zenkaku]を入れるといいです）
bashでnpmのpathを通す

# はじめに
ターミナルで`ngコマンド`や`vueコマンド`などを実行する際に、`command not found`と表示された時の対処です。

# 動作環境
MacとUbuntu(WSL環境)でのbashで動作確認しています。
bashが動作する環境なら同じ設定で動作すると思います。

# 一時的にnpmのpathを通す
bashで下記のコマンドの実行します。

```
export PATH=$PATH:`npm bin -g`
```

# pathを通す
ホームディレクトリに移動し、`.profile`を編集します。

```
cd
sudo vim .profile
```

`.profile`にpathを追記します。

```bash:.profile
export PATH=$PATH:`npm bin -g`
```

再起動します。

```
sudo reboot
```

# 上記の実行でbashにエラーが表示される場合
bashの起動時に`(not in PATH env variable)`と表示される場合でも、`ngコマンド`や`vueコマンド`を実行することが可能になっていると思いますが、エラーの表示を無くしたい場合は下記の手順を実行します。

`/etc/environment`を編集します。

```
cd /etc
sudo vim environment
```

`environment`にpathを追記します。

```bash:environment
export PATH=$PATH:`npm bin -g`
```

再起動します。

```
sudo reboot
```
【超初級編】Java Script変数と定数　その１

## 📗 変数と定数
JSに限ったことではないですが、プログラミングには大体変数と定数という考えがあります。
では、変数と定数はJS上ではどのように記入するでしょうか。
主に３つの書き方があります。


変数　＝　let 
変数の昔の書き方　＝　var
定数　＝　const

このようになります。

###📗変数について

変数とは読んで字のごとく　変化する数字　という意味です。
英語で variable　と言います。
これを略して **var** で昔は変数を作っていました。

しかし、***ES６からはlet***という新しい記入方法が追加されました。
では、上記２つの違いは何でしょうか？

```javascript

昔の書き方
var test = 777;              //ここでtestの値を777にしました。
var test = "値を変更します！！！";  //しかし、その後再度同じ変数を使い値を入力すると上書きすることが可能でした。

console.log(test);　//変数の値が上書きされるのでここでの出力は　値を変更します　となります。

ES６以降に登場したletでは
let test = 777;       //これも変数を定義することが出来ます。ここまでは同じです。
let test = "変更する";  //今回のletでは上書きが出来なくなっています。よって構文エラーが出てしまいます。

console.log(test);

上書きは出来ませんが、letは変数の中身を変えることが出来ます。
let test = 777;
test += 233;       //これは値に対して足し算をするという意味です。
console.log(test); //すると、testの出力は1000という値が出ます。値を変化させられるのです。

```

###📗定数について
定数は英語で言うとconstantとなります。
値の変更が一切出来ません。書き方としては

```javascript
 const test = 777;    //このように記載します。
 const test ="変更";   //varのように上書きしようとして、このようなコードを書いてしまうと

console.log(test); //エラーが出力されてしまいます。同様に数値の計算なども出来ません。
```

###📗まとめ
使い所としては、ES6以降は
**変数の中身が変わる場合は let**
**完全に値を固定する場合は const**
を使うと良いと思います。
*varに関しては色々と問題があるので使わないようにしたほうが良さそうです。*

##📗次回予告
今回の内容を少し補足した内容を記載しようかと思います！
VS2019のテストプロジェクトが実行できないバグ

VS2019でテストプロジェクトを実行すると
もっとも単純なものでさえ、テスト実行中に以下のエラーが発生しました。
```System.ArgumentException: パスに無効な文字が含まれています。```

参考URLにも`FatalError`と書かれているように恐ろしい既存バグでした。
無駄にはまらされた。。。

最新版で解決されたようなのでVisualStudioをアップデートしましょう。

参考
---

https://developercommunity.visualstudio.com/content/problem/776700/live-unit-testing-fails-with-fatalerror-systemargu.html
CentOS7,Apache,PHP7,MySQLの構成でPDO接続するときにハマった話

#PDOを用いてMySQLに接続しようとして2時間ハマったので記録として残しておきます。

##PDOドライバ
こいつでハマりました。
初期のPDOドライバはpdo_sqliteのみしかありませんでした。
なのでネットで調べながらpdo_mysqlをインストールすればできる！と思って適当にコマンド見つけてyum installしました。しかし#php -m | grep pdoでドライバ確認してもpdo_sqliteのみ。

モジュール自体はダウンロードしたので探せばあるディレクトリに存在しているのが確認できました。ならばextensionのパスが通ってないんだなと思いパスを新しくモジュールが確認できたディレクトリまで通しました。すると**Unable to load dynamic library**のエラーが表示されました。
原因を調べていると[こちらのサイト](https://ameblo.jp/itugouh/entry-12415846246.html)が有力だと踏んで確認したところ、絶対パスでなくてはならないということでした。

しかし3つのphp.iniファイル全て個別にextensionを挿入して試してみると**Unable to load dynamic library**が表示されます。

##結局
原因がわからないのでyumからやり直すことにしました。ただ自分と同じような環境でインストールしている[こちら](https://www.suzu6.net/posts/198-could-not-find-driver/)のドライバーをインストールを参考にして同じコマンドを打ち込んだところすんなりpdo_mysqlが表示されました。