OmniAICreator/Qiita-1.07M huggingface dataset:
日付（文字列型）をリストにして返す関数

for文で回したいときにどうぞ。

```Python
from datetime import timedelta
from datetime import datetime as dt

def datelist(start_str="2018-1-1", end_str="2018-12-31", input_format='%Y-%m-%d', output_format='%Y-%m-%d') -> list:
    """指定した日付から日付までの日付（文字列型）をリストにまとめて返す。
    日付型で返したいときは`.strftime(output_format)`を削除すればOK。
    end_strに指定した日付も含まれる。
    引数のinput_format, output_formatはdatetime.strftimeで利用する形式"""
    start_dt = dt.strptime(start_str, input_format)
    end_dt = dt.strptime(end_str, input_format)
    days_count = (end_dt - start_dt).days + 1 # 最終日も含めたいので、+1

    result = map(lambda x:
                 (start_date + timedelta(days=x)).strftime(output_format), range(days_count))
    return list(result) # ['2018-01-01', '2018-01-02',....]
```

```python
def datelist_year(year=2000, output_format='%Y-%m-%d'):
    """１年分をまるごと出力"""
    start_date = dt.strptime('{}-1-1'.format(year), '%Y-%m-%d')
    end_date = dt.strptime('{}-12-31'.format(year), '%Y-%m-%d')
    days_count = (end_date - start_date).days + 1 # 最終日も含めたいので、+1

    result = map(lambda x:
                 (start_date + timedelta(days=x)).strftime(output_format), range(days_count))
    return list(result) # ['2000-01-01', '2000-01-02',....]
```
```python
def datelist_month(year=2000, month=1, output_format='%Y-%m-%d'):
    """１か月分をまるごと出力"""
    start_date = dt.strptime('{}-{}-1'.format(year, month), '%Y-%m-%d')
    if int(month) < 12:
        next_month = int(month)+1
        end_date = dt.strptime('{}-{}-1'.format(year, next_month), '%Y-%m-%d')
    else:
        next_year = int(year) + 1
        end_date = dt.strptime('{}-{}-1'.format(next_year, '1'), '%Y-%m-%d')
    days_count = (end_date - start_date).days

    result = map(lambda x:
                 (start_date + timedelta(days=x)).strftime(output_format), range(days_count))
    return list(result) # ['200-01-01', '2000-01-02',....]
```

```python
# おまけ。年と月の組み合わせのリストを返す。上のやつと組み合わせて使うことを想定している。
def monthlist(start_year, start_month, end_year, end_month):
    result = []
    
    # 引数がおかしい時は空のリストを返す
    if start_year > end_year:
        return []
    # その年だけの場合
    elif start_year == end_year:
        # 引数がおかしい時は空のリストを返す
        if start_month > end_month:
            return []
        # 正常系
        for month in range(start_month, end_month+1):
            combination = [year, month]
            result.append(combination)
        return result
    # ２年以上の場合
    else:
        # 最初の年
        for month in range(start_month, 13):
            combination = [start_year, month]
            result.append(combination)
        # 中間の年(３年以上の場合だけ通る)
        if start_year + 2 <= end_year: 
            for year in range(start_year+1, end_year):
                for month in range(1,13):
                    combination = [year, month]
                    result.append(combination)
        # 最後の年
        for month in range(1, end_month):
            combination = [end_year, month]
            result.append(combination)
        return result

```
「.service: Failed to determine user credentials: No such process」の対処についてのメモ

.serviceファイルで「.service: Failed to determine user credentials: No such process」というエラーが発生したので、その時の解決法を記します。

#エラー内容
```
Failed to determine user credentials: No such process
Failed at step USER spawning xx: No such process
```



#解決法
ググると原因はユーザーが間違っているためということが分かりました。

####間違ったユーザー
```php:.service
User=username

```

####rootに変更
```php:.service
User=root
```

これでエラーがなくなりました。
Property 'hogehoge' does not exist on type 'DefaultRootState'を解決する【React/Redux】

## はじめに
React+ReduxをTypeScriptで実装する中で、useSelector構文内で発生したエラーを解決します。

## エラー内容

```
Property 'hogehoge' does not exist on type 'DefaultRootState'
```

hogehogeは、型DefaultRootStateに存在していないよというエラーです。

## 該当箇所

下記のcountの箇所でエラーが発生します。

```Count.tsx

//省略

const Count = () => {
  const count = useSelector((state) => state.count)
  
  //省略

}

```

## 解決方法

#### 結論：stateの型定義を行いましょう！

**1.RootStateという名前でstateの型を定義する**
ここではcountだけですが、他にstoreで管理する値がある場合は、それを列挙します。
※RootStateという命名は何でも良いです

```store.ts

// 省略

export type RootState = {
 count: number
}

// 省略
```

**2.useSelector関数の引数stateにRootState(型)を定義する**

```Count.tsx

//省略
//①RootStateをインポートする
import { RootState } from 'store'

const Count = () => {
  //②stateをRootStateで型定義する
  const count = useSelector((state: RootState) => state.count)
  
  //省略

}

```

これで解決！
初めてのRuby On Rails　その2(DB編)

##テーブル作成手順

### 1.データベースに変更を指示するファイルを作成

マイグレーションファイルと呼ばれるデータベースに変更を指示するファイルを作成する

今回はpostsテーブルを作成する例を見てみる
この場合、`Post`と単数形にする

```terminal:ターミナル
rails g model Post content:text
```
Post:モデル名
content:カラム名
text:データ型

以下の2ファイルが作成される

##### ツリー構造

　├  app/
　│　└ models/
　│　　　　└ post.rb
　├  db/
　　　└ migrate/
　　　　　　└ 20210226224717_create_posts.rb

```ruby:post.rb

class Post < ApplicationRecord
end
```

```ruby:20210226224717_create_posts.rb

class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.text :content

      t.timestamps
    end
  end
end
```


### 2.データベースに変更を反映

```terminal:ターミナル
rails db:migrate
```
自動で生成されるカラム
`id` , `created_at` , `updated_at`


## rails console
後述するテーブルへのデータ保存で使うので記載しておく

###### 開始する場合

```terminal:ターミナル
rails console
```
対話型でコマンドを実行できるようになる

###### 終了する場合

```terminal:ターミナル
quit
```

## テーブルに投稿データを保存しよう

### 手順
1. new メソッドで Post モデルのインスタンスを作成
1. posts テーブルに保存


#### 1. インスタンスを作成
```terminal:ターミナル
rails console
> post = Post.new(content:"Hello world")
> post2 = Post.new(content:"Hello world 2")
> post3 = Post.new(content:"Hello world 3")
```

#### 2. 保存
DBに3つのデータが挿入される

```terminal:ターミナル
> post.save
> post2.save
> post3.save
```

## データ取得 

### 最初のデータを取り出す
postsテーブルの最初のデータを取得

```terminal:ターミナル
> post = Post.first
> post.content
=> "Hello world"
```

### すべてのデータを取り出す
postsテーブルの全データを配列で取得
allメソッドを用いる

```terminal:ターミナル
> posts = Post.all
> posts[1].content
=> "Hello world 2"
```

### 特定のデータを取り出す
postsテーブルの条件を指定した特定のデータを取得
find_byメソッドを用いる

```terminal:ターミナル
> post = Post.find_by(id: 3)
> post.content
=> "Hello world 3"
```

### 並び替えた状態でデータを取り出す
orderメソッドを用いる
desc:降順、asc:昇順

```terminal:ターミナル
> posts = Post.all.order(created_at: :desc)
```

## データ更新
①編集したいデータを取得
②そのデータのcontentの値を上書き
③データベースに保存

```terminal:ターミナル
> post = Post.find_by(id: 3)
> post.content = "Rails"
> post.save
```
上記のタイミングで、updated_atカラムの値がデータを更新したときの時刻に更新される

## データ削除
```terminal:ターミナル
> post = Post.find_by(id: 3)
> post.destroy
```


## まとめ
DBの基礎知識があれば、特に難しいことはなかった。
SQLを書かないでデータ挿入、取得するのは少し違和感があった。
実行 メモ

## A問題
```
type a.txt | py a.py
```
```
py a_test.py
```
## B問題
```
type b.txt | py b.py
```
```
py b_test.py
```
## C問題
```
type c.txt | py c.py
```
```
py c_test.py
```
## D問題
```
type d.txt | py d.py
```
```
py d_test.py
```
## E問題
```
type e.txt | py e.py
```
```
py e_test.py
```
## F問題
```
type f.txt | py f.py
```
```
py f_test.py
```
EC2サーバーにRails + Nginx

# はじめに

すでにEC2へ`Rails`を導入し、アプリをデプロイした状態（アプリケーションサーバー構築済）から`Nginx`を導入します。
以下にその手順を記載してます。
[EC2にRails + MySQL環境構築](https://qiita.com/yamato1491038/items/ec343a1bce41d3252473)

# Nginx導入
Nginx1というバージョンを導入。
EC2サーバー上で以下のコマンド。

```
$ sudo amazon-linux-extras install nginx1
```

# Nginxの設定ファイルを編集


```
$ sudo vim /etc/nginx/conf.d/rails.conf
```

以下のように編集します。
`<アプリケーション名>`、`<Elastic IP>`は書き換えてください。

```:rails.conf
upstream app_server {
  # Unicornと連携させるための設定。アプリケーション名を自身のアプリ名に書き換えることに注意。
  server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
  # このプログラムが接続を受け付けるポート番号
  listen 80;
  # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない
  server_name <Elastic IP>;

  # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく
  client_max_body_size 2g;

# 接続が来た際のrootディレクトリ
  root /var/www/<アプリケーション名>/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}
```

# nginxの権限を変更
POSTメソッドでもエラーが出ないようにするために権限変更。

```
$ cd /var/lib
$ sudo chmod -R 775 nginx
```

# Nginxを起動して、設定ファイルを再読み込み

```
$ cd ~
$ sudo systemctl start nginx
$ sudo systemctl reload nginx
```

# unicorn.rbを修正

Nginxを介した処理を行うためにunicornの設定を修正します。

```rb:unicorn.rb
listen 3000

↓以下のように修正

listen "#{app_path}/tmp/sockets/unicorn.sock"
```
ローカルで編集したファイルをリモートへpushします。
次にサーバー側にクローンします。

```
$ cd /var/www/<アプリ名（任意)>
$ git pull origin master
```

# Unicornを再起動

Unicornのプロセスをkillして、再起動する作業を行います。

```
$ ps aux | grep unicorn
$ kill <確認したunicorn rails masterのPID>
```
Unicornを起動します。

```
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```

# ブラウザで確認

ブラウザからElastic IPでアクセスすると、アプリケーションにアクセスできます（:3000をつける必要なし）。なお、この時もunicornが起動している必要があります。

エラーが出る場合は、nginxのlogの確認が必要です。

```
$ less /var/log/nginx/error.log
```
または、

```
$ less /var/www/<レポジトリ名>/log/unicorn.stderr.log
```
で、ログを確認します。

これで、EC2インスタンスにWEBサーバーとアプリケーションサーバーを構築できました。
Shopify 備忘録

## テーマ内1ファイルの容量制限
テーマ内の1ファイルは256KBが上限

## cart基本形
inputのvalueは、見た目上にのみ使われる。
/cart  に対してpostすればおそらく決済画面へと遷移してくれる。

```liquid

<form action="/cart" method="post" novalidate class="cart">
 
   {% if cart.item_count > 0 %}
        {% for item in cart.items %}
        {% endfor %}
   {% endif %}

   <input type="submit">
</form>
```

## 数量の動的な更新

```javascript

  var q =0;
  var id = 12345; 
  $.ajax({
      type: 'POST',
      url: '/cart/change.js', 
      data: { quantity: q, id:id  }, 
              dataType: 'json',
              success: function() {  }
  });

```
item は　{% for item in cart.items %}
idの取得は、item.item.variant_id
qの取得は、item.quantity

## SizeやColorの取得

```liquid
   {% for option in item.product.options %}                        
        {% if option == 'Color' %}    
            <div>{{ item.variant.options[forloop.index0] }}</div>
        {% endif %}
         
        {% if option == 'Size' %}    
            <div>{{ item.variant.options[forloop.index0] }}</div>
        {% endif %}
   {% endfor %}

```
item は　{% for item in cart.items %}

## 価格の取得(数値)
```liquid
{{ item.final_price }}
```

## カート総額の取得(ローカライズする)
```liquid
{{ cart.total_price | money }}
```

##画像の取得
```liquid
<img  src="{{ item | img_url: 'medium' }}">
```
mediumは解像度
データベースのリネーム


現在、userテーブルとmessageテーブルの二つのテーブルがあるdatabase_oneというデータベースがあるとする。
このデータベースの名前を、database_newに変更したい。
#１．新しいデータベースを作る
```
create database database_new;
```
#２．テーブルごとに改名する
今回はuserとmessageテーブルのみなので二回行う。

```
rename table database_one.user to database_new.user;
rename table database_one.message to database_new.message;
```
OculusQuest2とiPhoneでMR撮影をする

こんな感じのVRゲーム内に人が入り込んだプレイ動画をOculusQuest2とiPhoneで作成する
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/9c6b724b-9f23-eaff-1ce2-38fcc0d41792.jpeg)

##0.用意するもの
* OculusQuest2
* iPhone

##1.iPhone側の準備
Reality Mixerというアプリをインストール
https://apps.apple.com/us/app/reality-mixer/id1539307552

##2.OculusQuest2側の準備
Mixed Reality Captureのインストール
https://www.oculus.com/experiences/quest/2532132800176262/

1. 上記リンクから自分のOculasアカウントにログイン、インストール
2. Quest2を起動してアプリ一覧の未インストールの項目からQuest2自体にインストール

という方法で自分はインストールした

##2.キャリブレーション方法
1. OculusQuest2でMixed Reality Captureを起動し,表示されているIPアドレスを確認
![スクリーンショット 2021-02-27 13.09.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/4cba0bdb-e485-1ebc-bde8-adbda01493e2.png)

2. iPhoneのReality Mixerを起動しStart Calibrationを押し、先ほど確認したIPアドレスを入力
Connectを押してQuest2に接続
![IMG_0253.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/1225b596-31df-6290-eb7d-683384385b75.png)
注意:
ConnectするタイミングでQuest2側でMixedRealityCaptureが起動してる必要がある
スリープモードに入ってたり、ガーディアン境界の外にいる状況だと繋がらない

3. コントローラーをiPhoneに近づけてAボタンをおす
![スクリーンショット 2021-02-27 13.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/d23402ad-97e2-ef59-c96f-940d667f132e.png)

4. 1.5m離れてAボタン押す
![スクリーンショット 2021-02-27 13.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/242615f7-0f85-683b-27d1-cae82d34e0a8.png)

5. iPhoneアプリ側でコントローラーの位置を登録(Adjust distanceでコントローラー間の距離を調整できる)
![スクリーンショット 2021-02-27 13.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/b3ca47c7-ceb7-f676-fcdc-46210350a391.png)

6. SaveToHeadsetを押してキャリブレーション完了
(キャリブレーション完了後はiPhoneの位置を動かさない)


##3.撮影方法
1. 撮影したいVRアプリを起動
2. iPhoneのRealityMixerアプリでStart Mixed Reality -> Connectを押す
3. iPhone側で画面録画をする


こんな感じの動画が撮影できる
https://www.youtube.com/watch?v=NhIYnDTo1bw*



###参考リンク

Reality Mixerのgithub

https://github.com/fabio914/RealityMixer

手順を丁寧に説明してくれるVtuberの動画

https://www.youtube.com/watch?v=t2xexHeEgHw&t=193s
Djangoの構造と理想のプロジェクト構造についての考察01

#【概要】
Djangoの構造についてメモ
色んな角度からDjangoの構造を捉え、理想的なプロジェクトを作るための備忘録を記述してみます。

#【アーキテクチャ】
URLConf == URLパターンとviewのマッチングを保持するモジュール
URLディスパッチャ == URLConfに従いリクエストしたURLに応じたビューを呼ぶ
View == バックエンド、ModelやTemplateと連携しレスポンスを作成する。
Model == モデルクラスとテーブルの紐づけを行う。
Template == フロントエンド、html/js/cssを用いてGUIを作成、表示する。
form == ユーザからの入力オブジェクトを扱う。
middleware == リクエストの前処理とレスポンスの後処理を行う。


#【MTVフレームワーク】
####Djangoを構成する要素
・Model(DB)
・View
・Template
一般的なWebAPPフレームワークとされるMVCと大きく変わらない構造。
MVCのViewはMTVにおけるviewとtemplateが、MCVのControllerはMTVにおけるURLディスパッチャが役割を担っている。

#【プロジェクトの構造】
Djangoのディレクトリ・ファイルの構造は、まずプロジェクトとアプリケーションという単位で分けられている。
プロジェクトはすべてのディレクトリを内包したディレクトリ。
アプリケーションはページ、機能ごとに分割されたパッケージを内包するディレクトリ。

実装の流れとしては、最初にプロジェクトを作成し、適宜アプリケーションが増えていく。
アプリケーションは入れ替えができるように、他アプリケーションに依存しないような構造で制作するほうが良い。
Modelの構造も、他アプリケーションの外部キーで雁字搦めになる恐れがあるため可能な限り"粗"なつくりにする。

#【一般的なプロジェクト・アプリケーションの構造】
プロジェクト名と同じ名前の設定ディレクトリと、アプリケーションごとにMTVが存在し、Templateの中に画像やjsライブラリなどの静的ファイル(static)があるような構造。

####このディレクトリ構造を作成したときに感じた問題点
・templateやstaticが各アプリケーションごとにバラバラに管理されてしまい共通で使用する部分を逐一作る必要があった。

#【管理コストの低いディレクトリ構造の考察】
####・設定ディレクトリにtemplatesを作成し、base.htmlを作成してアプリケーションごとに継承する。
例えばqiitaのページを見てもわかる通り、どのページにも共通するデザインと機能をbase.htmlに実装し、他のアプリケーションからhtmlを継承すれば管理、実装コストが下がる。

####・設定ディレクトリにstaticを作成
上記のbase.htmlに必須となるライブラリとビジュアルファイルなどを格納し、継承元となるbase.htmlがロードする。管理工数は削減できるが不要な読み込みなどを行う可能性がある。

####・js/cssはhtmlとは別に作成し、staticへ格納
htmlのコードが長くなりすぎるため、jsとcssは別ファイルで実装、管理する。
jsとcssは設定ディレクトリ/static/アプリケーション名/js(css)のなかにファイルを格納する。
ファイルを分けた時、バックエンドとのデータのやり取りの書き方が、まとめてある時と少し違うため注意が必要。

####・メニューの構造のデータなどはコードに書かずに外部から読み込む
WebAPPに限らず、どのようなプロジェクトでも適用するべき考え方で、パラメータ関係は、外部ファイルで管理する。

#まとめ
Djangoの経験を1年ほど積んでプロジェクトの構造について思うことを記述した。
ネット上の記事、書籍を拝見しいるとプロジェクトの構造はある範囲のルールの中で、各々が自由に構築しているように見受けられた。

####総括
・リサイクルできるとこはリサイクル
・外部ファイル、ライブラリは設定ディレクトリで一括管理
・フロントエンドのパーツ(html/js/css)は分けて実装
・アプリケーションごとに分割管理するのはMVCのみ

####注意点
継承を多用したり、外部ファイルやライブラリの管理場所を一カ所に設定するとプロジェクトの全体の構造をわかりにくくする一因となる。他人が実装しづらかったり、ファイルを既定の場所に置かなかったりトラブルが起きると予想されるため、プロジェクトのアーキテクチャのルールは必ず明記・共有したほうが良い。
勉強メモ16_現場でパソコン渡されたらやること（つどつど更新記事）

#1 電源オプションの高速

#2 現場に着任して、パソコン重いと感じた時

①　ctl +　shift +　esc でタスクマネージャーを開いて、アプリを診断する
②　スタートアップを見る　有効って書いてある場合に不要な場合は無効化する

参考資料：https://www.youtube.com/watch?v=vh_56arTPlc

#3 バックグラウンドアプリはOFFにする

#4 透明効果をOFFにする

#5 ディスクのクリーンアップをする
ゴミ箱とダウンロードにチェックは入れない

#6
AWS Lambda matplotlibでグラフ作成、S3にアップロードする

# lambda

権限の問題によりtmpディレクトリ下に保存する。

```lambda_function.py
import matplotlib.pyplot as plt
import boto3


def upload():
    fig = plt.figure()
    plt.plot([1, 2, 3], [4, 5, 6])
    fig.savefig('/tmp/sample.png')
    client = boto3.client('s3')
    client.upload_file(
        '/tmp/sample.png',
        'lambda-upload-test-0227',
        'sample.png'
    )

def lambda_handler(event, context):
    upload()
    return 0
```

## matplotlibのインポート

こちらの記事を参考にmatplotlibのARNをレイヤーに追加する。

https://qiita.com/polarbear08/items/202752d5ffcb65595bd9

# 参考記事

https://qiita.com/polarbear08/items/202752d5ffcb65595bd9

https://qiita.com/namkim/items/3edb9abe3871963bf0f7

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html
【Laravel】LaravelではRequestを使えと怒られたお話

# LaravelではRequestを使おう！
## はじめに
先輩「何この\$\_POSTって、Requestを使わない理由は何？」
僕「え？りくえすと？？\$\_POSTと何が違うの？？」
先日Laravelを初めて使用してサービスを作った際に先輩からご指摘をいただきました。
\$\_POSTではなくRequestを？
調べてみるとなるほどな、納得納得。

とまあこんな初心者レベルですが、備忘録として、あわよくば同じ立場の初心者さんのためにも残しておこうかと思います。

## 開発環境
PHP 7.3.25
Laravel 8.16.1

## Requestってなーに？
>Laravelで、リクエスト(Request)というのは、ブラウザを通してユーザーから送られる情報をすべて含んでいるオブジェクトのことです。例えば、会員登録のフォームなら、画面でユーザーが入力したＥメール、パスワード、名前、住所だけでなく、何のブラウザを使用したか（User Agent）、どのIPから送られたか、どのURLからアクセスしたかなど、また、会員ログイン後の画面なら、会員認証において保存されたクッキーもブラウザを介して、リクエストに含まれます。
[引用:ララジャパン](https://www.larajapan.com/2018/06/02/%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%EF%BC%88request%EF%BC%89%E3%81%AE%E3%81%82%E3%82%8C%E3%81%93%E3%82%8C/)

ざっくりいうと、\$\_POSTとか\$\_GETとか、その他ユーザーが通信を行った情報を全てまるっとゴリっとまとめてくれたものか！

ちなみにこの\$\_POSTとか\$\_GETとかいうのは、PHPのスーパーグローバル変数の１つで、
これもブラウザからの情報を取得する際に使用できます。
[詳細はこちらの記事を参考にするといいかも。](https://techacademy.jp/magazine/4955#sec1)

ふむふむ、めちゃくちゃ便利じゃん！

## でもなぜRequestを使った方がいいの？

例えばあなたの前に一般電卓と関数電卓があったとします。
四則演算の範疇に収まらない複雑な計算をするときに一般電卓でも出来ないわけではないですが、関数電卓があれば楽ちんに計算出来ますよね？

そうです。
Requestの方が楽ちんなんです！
上記でも記載した通り、Requestには色々な情報がギュッと詰まっています。
ユーザーがブラウザからフォームで送信したデータはもちろん、
よく使うところの送信が行われたURLからユーザーのIPアドレスまでほんと色々。

これは使わない手はないです。

他にも「型」にも違いがあります。

\$\_POSTなどのハイパーグローバル変数は基本的に連想配列と文字列で構成されます。
それに比べてRequestはオブジェクト型で構成されます。

さほど影響ないのでは？
果たしてそうでしょうか。。。

## 取得データの扱いが変わります

まずは下記条件で実験してみましょう。

```
formデータ：
// user_name→anomeme
// test_data→空欄

<input name="user_name" class="form-control" type="text-input" value="anomeme">
<input name="test_data" class="form-control" type="text-input" value="">

$_POST
array:2 [▼
  "user_name" => "anomeme"
  "test_data" => ""
]

request()->all()
array:2 [▼
  "user_name" => "anomeme"
  "test_data" => null
]
```

お分かりいただけますでしょうか。
そう、test_dataのvalueが別物に変わってますよね？

空白もnullも一緒じゃないか！と思う人がいるかもしれませんが、これは別物です。
・空白は文字列が０のデータ！
・nullは存在しないよ！
です。

例えば isset() 関数でこれを見てみましょうか。

```
isset($_POST["test_data"])
→ bool: true

isset(request()->all()["test_data"])
→ bool: false
```

一緒のデータを使用しているのに結果が変わってしまいましたね？
（is_null() でも判定が変わりますね）

長くなりましたが、requestは便利だけどこういった違いがありますよというお話でした。


## 終わりに

取れる値については他の人がさらに研究をしたりリファレンスを読み解いているので、[こちらを参考](https://qiita.com/kuzira_vimmer/items/54d9bfd88f66208c1709)にしてみるといいと思います。

PHPを勉強してきた人ならフォームデータを\$\_XXXを取得したくなる気持ちは分かりますが、
一度に様々なデータが取得できるRequestを是非使ってみてください。
これは私からのリクエストです。
【flutter】 エラー対応　

よくイシューに上がっていますが、自分自身が忘れなように投稿しておきます。

#エラー内容
プラグインにFlutterおよびDartgaが存在しているのに下記エラーが発生するときの対処方法。


flutter doctor

```
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 1.22.2, on Mac OS X 10.15.7 19H2, locale en-LK)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 12.0.1)
[!] Android Studio (version 4.1)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.50.1)
 
[✓] Connected device (1 available)            

! Doctor found issues in 1 category.

```

#対応方法
flutter のターミナルで下記コードを入力する。


```php:Flutter/Terminal
ln -s ~/Library/Application\ Support/Google/AndroidStudio4.1/plugins ~/Library/Application\ Support/AndroidStudio4.1
```
【SeverlessFramework 公式サンプル】Lambda + DynamoDB + SeverlessFrameworkでTODOリストAPIをデプロイしてみる

みなさん、アウトプットしてますか？

**「アウトプットされない知識は脆弱性」**、や **「インプットしてアウトプットしないのは知的な便秘」** というパワーワードもあるので、アウトプットします。


SeverlessFramework 公式サンプルを試してみたので、その手順について書いておきます。


## 目的

- DynamoDBが必要になってきそうだから、触って慣れておきたい。
- CURDはやってみたことのある経験が欲しい。

##ステップ

### 1. テンプレートを探す。

https://www.serverless.com/examples/ という公式の、examples をあさり、Lambda + DynamoDBのテンプレ見つけて立ち上げます。

今回は、最終更新が6ヶ月前だった、[AWS | Typescript REST API With DynamoDB
](https://www.serverless.com/examples/aws-node-typescript-rest-api-with-dynamodb)を使います

```
$ npm install serverless -g
$ serverless install -u https://github.com/serverless/examples/tree/master/aws-node-typescript-rest-api-with-dynamodb -n  aws-node-typescript-rest-api-with-dynamodb
```

### 2. AWSクレデンシャルを設定
[Serverless FrameworkでAWSクレデンシャルの管理](https://qiita.com/naogify/items/1de66bc8384f84e5dac4)　を参照。

### 3. デプロイ
```
$ serverless deploy -v
```
詳細は[【Serverless Framework】コマンドまとめ
](https://qiita.com/naogify/items/5dbd83048d21bdb36872)を参考に。

そのまま実行すると

```
 Serverless Error ---------------------------------------
 
  The Serverless version (2.18.0) does not satisfy the "frameworkVersion" (>=1.1.0 <2.2.0) in serverless.yml
```
と、使っているSeverlessFrameworkのバージョンが新しすぎるというエラーが出たので、

frameworkVersion を `frameworkVersion: ">=1.1.0 <2.20.0"` に変更。

再度実行すると、

```
Serverless Error ---------------------------------------
 
  An error occurred: IamRoleLambdaExecution - 1 validation error detected: Value 'aws-node-typescript-rest-api-with-dynamodb-dev-ap-northeast-1-lambdaRole' at 'roleName' failed to satisfy constraint: Member must have length less than or equal to 64.
```

IAMRole名が64文字を超えているというエラーが出たので、

serviceを、 `service: aws-rest-api-with-dynamodb` に変更。

無事デプロイ成功しました。

### 4. APIを叩いてみる

TODOを作成

```
curl -X POST https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/todos --data '{ "text": "Learn Serverless" }'
```

TODOの一覧を取得

```
curl https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/todos
```

指定したTODOを取得

```
curl https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/todos/<id>
```

TODOを更新

```
curl -X PUT https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/todos/<id> --data '{ "text": "Learn Serverless", "checked": true }'
```

### リソースの削除
一通り試したあとは

```
$ serverless remove
```
でリソースを削除しておきましょう。（めっちゃ便利！）

## まとめ

いやー、めっちゃお手軽ですね。
こんな簡単にDBを扱えるようになるなんてワクワクしてきました笑

今回試したコードは、https://github.com/naogify/aws-node-typescript-rest-api-with-dynamodb に置いてあります。
AWS認定クラウドプラクティショナー 合格するまでにやったこと

久々の投稿です。タイトルに記載の資格を取ったので、何したら受かったかを書きます。

## 資格概要
AWS認定クラウドプラクティショナーとはどんな資格か、出題範囲、試験形式、試験時間、料金等概要は以下をご覧ください。
https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

## 私についてと受検に至る背景
- 分析・ITコンサル見習い。
- AWSサービスの構築は未経験。AWS
- Azureでの分析基盤構築ならちょこっと経験あるけど、主にSQL ServerでやらETLツールでデータ前処理したり分析事例調査したりしてました。
- EC2, S3とか単語はなんとなく知ってる程度。
- ベンダー資格(VMware Certified Professional)は約7年前に取ったことあるので、ベンダー資格特有の日本語文章のおかしさは体験済み。
- 何故受検したかというと、仕事で必要になったから。プロダクト企画支援案件（お客さんが新しくプロダクト作りたいけどどこから手をつけていいかわからないので、うちらは話聞きながら何から始めるか、ゴールは何かをまとめていきましょう案件）で、お客さんの環境がAWSで会話するとき必須の知識なので急いで基礎部分だけでも習得の必要がありました。


## 勉強期間とかけた時間
以下状況で、思い立ってから約1ヶ月、1日0〜4時間、約30時間かけました。

- 妊娠8ヶ月、妊娠してないときと比べ体力がもたず休憩を挟まなければならない、動きにくい、集中力低下ぎみらしいので作業時間減少、効率も低下していたと思われます。
- 仕事はたまに定時では終わらない程度の忙しさ。

## 使った教材と所感
### テキスト
(1) AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー

https://www.amazon.co.jp/dp/4797397403/ref=cm_sw_r_sms_awdb_imm_V0H2GA3NKGZ3DXBGA986

### 動画
(2) AWS Cloud Practitioner Essentials (Japanese)
https://www.aws.training/Details/eLearning?id=66479

(3)  Udemy「この問題だけで合格可能！AWS認定クラウドプラクティショナー模擬試験問題集」
https://www.udemy.com/share/101SaAAEMaeFlRQn8J/

上記に加え、AWS公式YouTubeの Black Belt シリーズやAWS公式ドキュメントを必要に応じて確認しました。

1〜3の順番でやりました。
テキストについては要点はまとまってるけど、内容はこれだけでは不充分かなと思います。普段からAWS触ってる人にはわかりやすいのかもしれないかけど、私には頭に入ってきづらいと感じました。

動画はコーヒーショップを例にわかりやすく解説してくれていて、簡単なテストを挟んで理解度を確かめながら進むので内容も頭に入ってきやすい、とても良かった。
ただまともに観ると6時間かかるので、ほぼ倍速で聴いてた。
動画から始めれば良かったのかも。

他のブログにもあるようにUdemyも良かった教材。有料ですが、たまたまセールで1500円になっててラッキー！
最後の1週間はひたすら過去問やって、間違えたところはAWSのドキュメントやBlack Belt、テキストで復讐、を繰り返してました。
ただ、実際の試験に比べて全体的に難易度高めです。基礎と応用(とそれ以上)がありますが、応用レベルの問題はほぼ出てなかったと思います。
試験前日に応用レベルの問題を解いて正答率44%で絶望的な気持ちになりましが、1000点満点中917点取れたので、それくらいの正答率でも気を抜かずに諦めなければ大丈夫だと思います(笑)

ホワイトペーパーやマネジメントコンソール、AWSの全サービスの確認もやらなきゃと思いつつできませんでした。。

## 試験当日の流れ
試験実施業者はピアソン VUEを選択し自宅で受検することにしました。初めて自宅で資格試験を受けたのですが、後述の通りちょっとしたトラブルがありました。
試験官とのコミュニケーション言語は英語と日本語が選べたので日本語にしました。

メールの案内に従い、試験に使うピアソンVUEアプリをインストール、システムチェックを事前に完了する必要があり、忘れそうだったので1週間前にテストも無事完了。
しかし当日、試験30分前にチェックインしようとしたらアプリが古いらしく再インストール。
その後、部屋の写真、身分証明書、自分の顔写真をアップロードしチェックイン完了。
- チャットにて挨拶、部屋とデスクの様子をカメラに映す
- 腕を見せる、時計してないか確認するため
などしました。
このへんでチャット画面がめちゃめちゃ重くなり、最初の挨拶以外に、ウェルカム画面は見えてますか？とか聞かれたけど返答できず。最初の秘密保持的な同意画面も上手く操作できず時間切れで閉じてしまいました。。
試験をまともに受けられるか不安だったけど、試験中は普通に動作して回答できました。むちゃくちゃ焦った。。。
あとで気づきましたが、古いバージョンのアプリも立ち上がってて固まってたことも要因だったかも。。
次回以降の教訓として、システムテストは前日くらいにやっておこうと思いました。。

かなりじっくり考えて解いても50分ほど時間が余ったので、30分ほどまたじっくり見直すことができました。

## 終わりに
初めてのAWSの資格、初めての自宅受検で色々不安でしたが、受検申し込み時に比べてかなり知識がついたと感じていて、受検して良かったです。これからIT業界行きたいと思ってる方、IT業界にいるけど開発してない、けどエンジニアとコミュニケーションする必要がある方（マネージャ、営業あたり？）にはおすすめの資格だと感じました。
今後はちょっと考え中です。1つ上の資格に[ソリューションアーキテクト（アソシエイト）](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/) があるけど、話を聞く限りかなりハードルが上がるので。。
引き続きゆるゆる頑張ります。
laravel6 メールのファイル添付機能で日本語のファイル名が文字化けした

# 目的

- laravel6のメールにファイル添付をする機能を作成したら日本語のファイル名が文字化けしたのて解決策をメモ的に紹介する。

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 方法

- ファイル名指定部分にて`mb_encode_mimeheader()`を用いてファイル名を指定しエンコードを行うと正常に表示された。
- `mb_encode_mimeheader(添付ファイル名)`とすることでエンコードすることができる。
変な空白が正しく半角スペースとして認識されない

### どう見ても正しいのにxmlが認識されない

以下ふたつのxmlですが、ひとつめがうまく認識されません。
削除して半角スペースをいれたら直ったのですがなぜなのか気になったので調べました。

```xml
<values>
  <field>EXAMPLE__c</field>
  <value xsi:type="xsd:string">example</value>
</values>
```

```xml
<values>
  <field>EXAMPLE__c</field>
  <value xsi:type="xsd:string">example</value>
</values>
```

### 正体はc2a0

UTF-8のノーブレークスペース(NBSP)みたいでした。
UTF-8の文字コード変換をかけてみると、以下のようになりました。

#### 変換前

```xml
  <value xsi:type="xsd:string">example</value>
  <value xsi:type="xsd:string">example</value>
```

#### 変換後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/98894f78-4c05-30f2-560e-19c88051d2cc.png)

通常のスペースは`20`ですが、なぜか`c2 a0`になっていますね。原因はこれだったみたいです。
アプリ開発実践入門7 Modelとデータベース モデルの基本

今日の教科書

#モデルを作る
`rails generate model モデル名 設定項目`：モデル作成のコマンド
基本モデル名とクラス名とファイル名は大文字小文字の差はあれど一緒である。

##コマンドで作成されるファイルについて
`モデル名.rb`：モデルのソースコード
`生成日時_create_モデル名の複数形.rb`：マイグレーションというデータベースの更新に関する処理のためのファイル
`モデル名_test.rb`：テストのためのソースコード
`モデル名の複数形.yml`：テストに関する情報を記述したファイル

##モデルのソースコード

```
class モデル名 < ApplicationRecord
end 
```

最初の記述内容。ApplicationRecordというクラスが継承されている。モデルは全てこれを継承している。ApplicationRecordは最初から組み込まれているものではない。application_record.rbファイルが作成されていて、ここに書かれている。
このクラスはActiveRecord:Baseというクラスを継承している。これはモデルの元になっている機能で含み、これの機能のクラスを使っている。

##マイグレーションの実行
データベースを使うためにモデルに必要なテーブルをデータベースに用意する作業が必要。
マイグレーションはデータベースのアップデート作業であり、情報を用意しておきこれを元に
最新の状態に更新する。

`rails db:migrate`：マイグレーションのコマンド。これでなくブラウザのエラーメッセージと一緒に出るボタンを押してもできる。

###マイグレーションファイルについて

```
class クラス名 < ActiveRecode::Migration[6.0]
  def change
    create_table :テーブル名 do |変数|
    処理
    end
  end
end
```

自動生成。

##シードを作る
ダミーのデータを用意してデータベースの動きを把握する。そのためシードに記述する。

`rails db:seed`：`seeds.rb`をシードとして実行するコマンド。データベースにデータが追加される。

##コントローラーを作成

`rails generate controller モデル名複数形 アクション`：モデルのコントローラーとアクションとテンプレートが作成される。モデルは単数系、コントローラーは複数系という命名規則に則る。

###アクションでデータを表示する

```
class PeopleController < ApplicationController

  def index
    @msg = `モデル名 data.`
    @data = モデル名.all
  end

end
```

`変数 = モデル名.all`：allはモデルのデータを全て、配列のようなものにして取り出すメソッド。
得られるものの正確な名称はActiveRecord::Relationというオブジェクト。
Enumerableという機能を使って配列のように値を順番に取り出せるようにしてくれる。

##テンプレートの作成
繰り返し処理を使って順にデータを取り出していく。

```
<% @data.each do |obj| %>
  objを処理
<% end %>
```

@dataから順にデータを取り出して変数objに入れて処理を実行している。

モデルを利用してデータベースから取り出されるデータは全てモデルのインスタンス。
テーブルに用意されている項目で保管されていて、全て取り出せる。

```
<td><%= obj.id %></td>
・・・
```

モデル作成時に自動的に生成される項目がある。
id:データにつけられる番号
created_at:データの作成日時
updated_at:データの最終更新日時

##ルーティグの設定
ジェネレータコマンドで作ると自動で生成される。
【Shopify】liquidのオブジェクトについてまとめてみた (shop_locale~tablerowまで)

#はじめに
今回は、Liquidのオブジェクトについて一つ一つまとめていきます。

`shop_locale`から`tablerow`までをまとめていきます。

それでは、頑張っていきましょう。

#The shop_locale object
`shop_local`は、shop.published_locales配列の要素です。 shop_localeオブジェクトには次の属性があります。

##shop_locale.endonym_name
ストアロケールの、現地の名称を返します。

例えば、`français canadien`のように。

##shop_locale.iso_code
ロケールコードを返します。

例えば、`fr-CA`のように。

##shop_locale.name
ロケール名を返します。

例えば、`Canadian French`のように。

##shop_locale.primary
ロケールがショップのプライマリロケールである場合、trueを返します。それ以外の場合はfalseを返します。

##shop_locale.root_url
ロケールのルート相対URLを返します。


#The store_availability object
`store_availability`オブジェクトは、現在の在庫レベルに関係なく、実際の店舗の場所に在庫されているバリアントを表示するために使用されます。場所にバリアントがない場合、その場所は返されません。

##store_availability.available
バリアントに在庫がある場合はtrueを返します。

##store_availability.location
バリアントがストックされているロケーションオブジェクトを返します。

##store_availability.pick_up_enabled
ピックアップが有効になっている場所にバリアントが在庫されている場合はtrueを返します。

##store_availability.pick_up_time
集荷の準備が整うまでにかかる時間を返します（例：通常24時間で準備完了）。この値は、ローカルピックアップオプションの設定時に管理者で設定されます。

#The tablerow object
tablerowオブジェクトは、tablerowタグ内で使用されます。親のforループの属性が含まれています。

##tablerow.length
tablerowループの反復回数を返します。

##tablerow.index
1から始まるtablerowループの現在のインデックスを返します。

##tablerow.index0
0から始まるテーブル行ループの現在のインデックスを返します。

##tablerow.rindex
tablerow.indexを逆の順序で返します。

##tablerow.rindex0
tablerow.index0を逆の順序で返します。

##tablerow.first
テーブル行ループの最初の反復である場合はtrueを返します。最初の反復でない場合はfalseを返します。

##tablerow.last
テーブル行ループの最後の反復である場合はtrueを返します。最後の反復でない場合はfalseを返します。

##tablerow.col
1から始まる現在の行のインデックスを返します。

##tablerow.col0
0から始まる現在の行のインデックスを返します。

##tablerow.col_first
現在の列が行の最初の列である場合はtrueを返し、そうでない場合はfalseを返します。

##tablerow.col_last
現在の列が行の最後の列である場合はtrueを返し、そうでない場合はfalseを返します。

# Shopify アプリのご紹介

Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。

https://coming-soon.reterior.jp/

https://apps.shopify.com/shopify-application-314?locale=ja&surface_detail=%E3%83%AA%E3%83%86%E3%83%AA%E3%82%A2&surface_inter_position=1&surface_intra_position=1&surface_type=search
相関係数

簡略してデータ点$(x_i,y_i)$に対して、

・相関係数は次のように表せる。

```math
\begin{align}
r_{xy}=\frac{S_{xy}}{S_xS_y}&=\frac{\frac{1}{n}\sum{(x_i-\bar{x})(y_i-\bar{y})}}{\sqrt{\frac{1}{n}\sum{(x_i-\bar{x})^2}} \sqrt{\frac{1}{n}\sum{(y_i-\bar{y})^2}}}\\
&=\frac{\sum{(x_i-\bar{x})(y_i-\bar{y})}}{\sqrt{\sum{(x_i-\bar{x})^2}} \sqrt{\sum{(y_i-\bar{y})^2}}}\\

\end{align}
```
ここで大事なのがこの式を眺める視点です。
$(x_i,y_i)$はそれぞれのデータ点なので、$(x_i-\bar{x},y_i-\bar{y})$は平均に対して平行移動した点と考えます。

```math
(x_1-\bar{x},y_1-\bar{y}),
(x_2-\bar{x},y_2-\bar{y}),
\dots,(x_n-\bar{x},y_n-\bar{y})
```
この内積を取ると上式と一致します。

```math
\cos{\theta}=\frac{\sum{(x_i-\bar{x})(y_i-\bar{y})}}{\sqrt{\sum{(x_i-\bar{x})^2}} \sqrt{\sum{(y_i-\bar{y})^2}}}\\


```
Pythonでread_excel（）を記述するとエラーになる件

Widnws10 Pro 
Python 3.9

Pythonでエクセルを操作してするコードを書いた。
以下のエラーが発生した
```

```
 raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+'; not supported')
xlrd.biffh.XLRDError: Excel xlsx file; not supported

````
[pandas+xlrdでxlsxを開こうとするとxlrd.biffh.XLRDError: Excel xlsx file; not supportedのエラーが出る ](https://heppoco-cto.com/pandasxlrd%E3%81%A7xlsx%E3%82%92%E9%96%8B%E3%81%93%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8xlrd-biffh-xlrderror-excel-xlsx-file-not-supported%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C/468/)
を参考に以下のコマンドを実行してインストールした。

````

pip install xlrd==1.2.0

````

すると、今度はエラーが変わった。


````
AttributeError: 'ElementTree' object has no attribute 'getiterator'
````
[Pyhon 3.9 で pandasでread_excel()すると、AttributeError: 'ElementTree' object has no attribute 'getiterator'](https://osamuk.hatenablog.jp/entry/2020/10/20/215654)
を参考にして

````

df_order = pd.read_excel(filepath)から
pd.read_excel(filepath,engine="openpyxl")に修正
````

無事コードが通った。
【C#】文字列、整数の型切り替え

一括でまとめいているサイトがなかったのでメモ。

# 単なる変換
###文字列 → 整数
```
string s = "1";
int i = int.Parse(s);
```

###整数 → 文字列
```
int i = 2;
string s = i.ToString();
```

#リストの変換
###文字列 → 整数

参考サイト：[stackoverflow - How to convert List<string> to List<int>?](https://stackoverflow.com/questions/6201306/how-to-convert-liststring-to-listint)

```
List<string> ls = new List<string>() {"1", "2", "3"};
List<int> li = ls.Select(int.Parse).ToList();
```


###整数 → 文字列

参考サイト：[stackoverflow - Cast List<int> to List<string> in .NET 2.0](https://stackoverflow.com/questions/44942/cast-listint-to-liststring-in-net-2-0)

```
List<int> li = new List<int>(new int[] { 1,2,3 } );
List<string> ls = li.ConvertAll<string>(x => x.ToString());
```
【AWS】EC2インスタンスで作成したLaravelとRDS（MySQL）を連携させる方法

今回はAWSのRDS（MySQL）についてい書いていきます。

AWSにもDockerにも段々慣れてきたのですが、まだまだ知らない機能の方が多いですね。

さて、早速説明していきましょう。

#はじめに#

まず初めに前提条件として以下の条件を満たしている前提で話を進めめていきます。

・ECSで既にLaravelに関するコンテナの環境が構築済み
・EC2インスタンスへのSSH接続が可能

上記2つの条件を満たしていな場合は下記の記事にすべてやり方が書いてあるので是非ご覧ください！

[【AWS】AWS超初心者が、頑張ってDockerで作ったLaravelプロジェクトをECR、ECS、EC2を使ってAWS上で動かしてみた](https://qiita.com/akki-memo/items/c743fca8088ccdcce300)

#RDSでMySQLのデータベースを作成#

サービス検索欄から「RDS」と検索してください。

そして、「データベースの作成」をクリック。

するとこのような画面になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/dc35e972-c2ba-5e96-da50-7b1b16049d34.png)

そしたら以下の条件を元にデータベースを作成してください。

|データベースの作成方法|標準作成|
|---|---|
|エンジンのオプション|MySQL|
|バージョン|任意（大体8.*か5.7）|
|テンプレート|本番稼働用|
|DBクラスター識別子|database-1|
|マスターユーザー名・マスターパスワード|任意|
|Virtual Private Cloud (VPC)|利用するEC2インスタンスと同じVPCを選択|
|パブリックアクセス可能|あり|
|VPCセキュリティグループ|既存の選択|
|追加設定|最初のデータベース名（ローカル環境で使っていたデータベース名を入れるところ）|

注意すべきポイントを2つ解説します。

１つ目は「Virtual Private Cloud (VPC)」です。
これは、書いてる通り**EC2インスタンスと同じVPC**を必ず選択してください。選択しないとEC2インスタンスへSSH接続したときにMySQLへアクセスできないのでくれぐれもご注意を。

２つ目は追加設定の「最初のデータベース名」です。
「DBクラスター識別子」では``database-1``と設定しましたが、これとは全く別物です。
例えばローカル環境で``example_database``という名前のデータベースを利用していた場合は、``example_database``を「DBクラスター識別子」ではなく、「最初のデータベース名」に書いて下さい。

また、ローカルでのデータベース名と本番環境用のデータベース名を分けたい場合でも「最初のデータベース名」に入力してください。

「データベースの作成」をクリックし、しばらくするとデータベースが作成されます。

#SSH接続でMySQLのアクセス確認#

次に、EC2インスタンスにSSH接続を行いMySQLへアクセスしてみます。

その前に先ほど作成したデータベースの画面へ行ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/6c6bde3c-71b6-2868-9884-9e018d61c4d2.png)

「セキュリティ」の「VPCセキュリティグループ」をクリックしてください（sg-から始まるもの）

<font color="red">※注意</font> 「ネットワーク」のVPCではございませんのでご注意を。

そしたらインバウンドルールの編集を行います。

SSH接続でMySQLにアクセスするために、利用するEC2インスタンスの「プライベート IPv4 アドレス」をコピーして、「すべてのトラフィック」で「IPv4アドレス/32」として追加してください。

例：10.0.0.0/32

また、LaravelからもMySQLのデータベースにアクセスできるようにタイプで「MYSQL/Aurora」を選んで「0.0.0.0/0」もしくはALBのセキュリティグループを選んでください。

そしてルールを保存してください。

これでSSH接続でMySQLにアクセスが可能になり、Laravelからもデータベースにアクセスすることができます。

試しにSSH接続でMySQLにアクセスしてみましょう！

```
ssh -i "C:~\zaemonia-ec2-key.pem" ec2-user@ec2-xxx.ap-northeast-1.compute.amazonaws.com
```

```
mysql -u{マスターユーザー名} -p -h{MySQLのエンドポイント}
Enter password:{マスターパスワード}
#パスワード入力は文字が出力されないのでコピペするのが良いかと
```

無事MySQLにアクセス出来たら成功です！

これでアクセスできない場合は以下の事項を再確認してください。

・マスターユーザー名、マスターパスワード
・セキュリティグループのインバウンドルール

これら２つがしっかりと合っていれば必ずアクセスできます。

諦めずに頑張りましょう！！

以上、「【AWS】EC2インスタンスで作成したLaravelとRDS（MySQL）を連携させる方法」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

あと、最近「ココナラ」で環境構築のお手伝いをするサービスを始めました。

気になる方はぜひ一度ご相談ください！

Thank you for reading
@im_miolabさんの「GitHooksをElixir開発環境へ導入して、コミットやプッシュの際にコード検査やテストが走るようにする」にすこ〜し補足をします。git commit時にmix formatを自動的に行ってくれるですよ！！！

# はじめに
- [Elixir](https://elixir-lang.org/)楽しんでいますか :bangbang::bangbang::bangbang:
- @piacerex さんの小粒でピリリと辛いユーティリティ群[piacerex/smallex](https://github.com/piacerex/smallex)の更新をお手伝いしています
- そのなかで`mix format`していきましょうとみんなへ呼びかけたところ、自動化できるよという話を @koyo-miyamura さんから聞きました
- そして[qgadrian/elixir_git_hooks](https://github.com/qgadrian/elixir_git_hooks)という[Hex](https://hex.pm/)が便利だよということを @zacky1972 先生に教わりました
    - [zeam-vm/pelemay_fp](https://github.com/zeam-vm/pelemay_fp/)に導入されています
- [Qiita](https://qiita.com/)に導入記事がなければ書くつもりでおりました
- <font color="purple">$\huge{すでにありました}$</font>
- じゃあ書かなくても良いわけですが、まあちょっと調べたことがあるのでそれをそのまま書いておきます
- この記事は、2021/3/15に開催予定の[autoracex #N](https://autoracex.connpass.com/event/206023/)の成果といたします

# [qgadrian/elixir_git_hooks](https://github.com/qgadrian/elixir_git_hooks)を紹介した先輩記事
- [kokura.ex](https://fukuokaex.connpass.com/)の@im_miolabさん作
- 「[GitHooksをElixir開発環境へ導入して、コミットやプッシュの際にコード検査やテストが走るようにする](https://qiita.com/im_miolab/items/7ffb1e1aeebd78477079)」
- [qgadrian/elixir_git_hooks](https://github.com/qgadrian/elixir_git_hooks)のREADMEと@im_miolabさんの[記事](https://qiita.com/im_miolab/items/7ffb1e1aeebd78477079)を見ていればほぼほぼ事足ります
- ここから先は:point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5:をご覧になっている前提で書きます

# 私の補足
- そもそも[Git のカスタマイズ - Git フック](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)というものがあります
    - 私は今日知りました
    - `.git/hooks`配下にあるスクリプトがアレしてナニしてくれるわけです
    - 最初は`.sample`というファイルが置いてあります
    - 詳細はリンク先をご参照ください
- `config/config.exs`に`:git_hooks`の設定を書いておいて、`mix git_hooks.install`をすると以下のファイルができます
    - `.git/hooks/pre-commit`
    - `.git/hooks/pre-push`
- 中身は以下のようになっています

```:.git/hooks/pre-commit
#!/bin/sh

mix git_hooks.run pre_commit "$@"
[ $? -ne 0 ] && exit 1
exit 0
fi
```

```:.git/hooks/pre-push
#!/bin/sh

mix git_hooks.run pre_push "$@"
[ $? -ne 0 ] && exit 1
exit 0
fi
```

- これらが`git commit`や`git push`コマンドの際にフックされてmixタスクが実行されるという仕組みです

# Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm: 
- `mix format`とかちょっとしたことではあるけれども必ずやることにするならこういう仕組みを導入して自動化するのはいいですね
- Enjoy [Elixir](https://elixir-lang.org/) :rocket::rocket::rocket:

# (最後の最後に)[Elixir](https://elixir-lang.org/)ってなによ？ という方へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/601aeb87-9d1d-6a9d-b30b-338507dc593e.png)

- :point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5: 2020/12/26時点くらいのスクリーンショット
- [Elixir](https://elixir-lang.org/)についてもっと知りたい方は下記の本:books:をオススメします
    - [プログラミングElixir（第2版）](https://www.ohmsha.co.jp/book/9784274226373/)
    - [Elixir実践ガイド](https://book.impress.co.jp/books/1120101021)
- [elixir.jp Slack](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w)の`#autoracex`というところに私は入り浸っておりますのでお気軽にお声がけください
Amazonの商品ページから、「人気のインディーズマンガ」を消したい（chrome）

# モチベーション
Amazonでマンガのページを見ていると、人気のインディーズマンガというカルーセルが出てくる。
![スクリーンショット 2021-02-27 1.34.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/981928/ccdc0fbc-0416-d97c-d463-bfc1cb27306a.jpeg)
↑こういうやつ。
作品を読んでいないので、内容をどうこう言うつもりはないんですが、一度も買ったことないし、無闇に肌色が多かったりして邪魔だなと思ったのだが・・・非表示にする方法が公式の設定から見つけられなかった。
と言うわけで、放置し続けるストレスより作業するストレスの方が少ないと思って、DOMから強制的に排除することにしました。

# 拡張機能の導入
今回はscriptAutoRunnerを使いました。
[scriptAutoRunner](https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm)
サイトにアクセスするたびに、自動でjavascriptを走らせてくれるお方です。

# javascriptを準備する
「人気のインディーズマンガ」をタイトルにもつdivを取得し、その上の階層を削除するjavascriptを書きます。
<details><summary>追記</summary>他にも判定すべきエレメントがあるようなのでコードを書き直しました。いたちごっこは嫌だなぁ。</details>

```javascript

const deleteIndiesMangaCarousel = () => {
  const targetTitleList = [
    "人気のインディーズマンガ",
    "高評価のインディーズマンガ",
    "無料マンガ ランキング インディーズ",
    "この商品に関連するスポンサー",
    "Kindle Unlimited読み放題対象のマンガ",
    "無料マンガ ランキング インディーズ"
  ];
 const widgetHeadElementList = document.querySelectorAll(".dbs-widget-head,.a-carousel-heading,.dbs-widget-head-title,.unified_ad_labeling_title_margin,.sp_book_carousel_header");
 const targetTitleElements = Array.from(widgetHeadElementList).filter((element) => {
    const textContent = element.textContent;
    return targetTitleList.find((title) => {
      return textContent.includes(title);
    });
  });

if (!targetTitleElements) {
    return;
}
for(const element of targetTitleElements){
    const targetNode = element.parentNode;
     targetNode.remove();
    }
};

deleteIndiesMangaCarousel();
```

# 拡張機能を設定する
chromeのアドレスバーに
[chrome://extensions/](chrome://extensions/)
と入力
scriptAutoRunnerが表示されるので、詳細をクリック。

![スクリーンショット 2021-02-27 11.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/981928/f1500666-aa00-5724-db87-c0d7b40a0bf5.png)

拡張機能のオプションをクリック
![スクリーンショット 2021-02-27 11.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/981928/a367cafd-22f1-b5b6-676c-4d91e205189c.png)

GUIが表示されるので、先程のjavascriptをコピペ

![スクリーンショット 2021-02-27 11.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/981928/ffbc4a30-6d61-680b-068b-048aad003649.png)

プラグを繋ぐ

![スクリーンショット 2021-02-27 11.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/981928/66c12aa6-dd23-1ea5-1f95-f7ffbc52f6f8.png)

これで表示されなくなりました。カルーセルがあった位置でリロードすると一瞬チラッと見えたりしますが、まぁいいでしょう。
ここまで書いた時点で、「人気のインディーズマンガ」以外にも「高評価のインディーズマンガ」というタイトルが出てきてコード書き直しとSS撮り直しになったのが、ちょっとイラッとしました。

めでたしめでたし
Dockerfileとimageに封入したいディレクトリが違っているときのbuildコマンドの書き方

AWS ECRにpushするdocker imageを作成するときにいつも忘れてしまうので備忘録に。

### 以下のようなディレクトリ構成を仮定して、app以下(実際のアプリのコードを想定）のディレクトリもdockerのimageに封入したい場合
```
Project/
　├ docker /
　│　└ php/
　│　   └ Dockerfile
　├ app/
　│　└ service/
　│　└ repository/
　│　└ routes/
　└ .dockerignore
```
この場合のDocker buildコマンドは以下(Projectディレクトリでたたくとして)

```
docker build -f docker/php/Dockerfile . -t hello
```

となる。

ちなみに、カレントディレクトリにDockerfileがある場合のデフォルトのケースは以下

```
docker build --tag hello .
```
"STOP: TOTAL NO. of ITERATIONS REACHED LIMIT."の解決法

#はじめに
Pythonでロジスティック回帰（LogisticRegression）を用いた時，一応実行はできるが以下のような警告文が発生することがあった．

```python:Python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train,y_train)
print("Test score: {:.2f}".format(logreg.score(X_test,y_test)))
```
**警告内容**

```python
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
```
#解決法
原因は，LogisticRegressionの最大反復回数に達しなかったことにあるようです．つまり，途中で処理が打ち切られているという事です．この最大反復回数は**max_iter**で設定できます．この値を設定しない場合は，デフォルト値である1000が適用されるようです．そのため，**max_iter**の値を1000より大きくすることで，警告文が消えると考えられます．

**max_iter適用例**

```python:Python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
logreg = LogisticRegression(max_iter=1500)
logreg.fit(X_train,y_train)
print("Test score: {:.2f}".format(logreg.score(X_test,y_test)))
```
今回の場合，最大反復回数を1500に設定したところ，警告文が消えましたが，処理内容によってこの値が異なると考えられます．
GitHubで使ってる用語まとめ

初学者です。
GitHubを使って1ヶ月くらいになりますが、理解しきれてないとこがあるので纏めがてら記述します。
※アカウントの登録法、操作方法などを記述したものではありませんので悪しからず。

追記：随時追加していきます。

# GitとGitHubとは？

### Git
ソースコードなどのファイルやフォルダの変更履歴を記録・追跡するためのバージョン管理システム。
Gitでアプリを管理すると、それぞれの開発段階でセーブポイントを作れる！
時系列に沿って管理してくれるため、ポイントごとに遡ることもできる。

初期(ベース)・セーブ!　▶︎　フロント実装・セーブ！　▶︎最新版・セーブ！▶︎...みたいな

これだけでも便利なのはわかったけれど、チーム開発することを想定するとさらに力を発揮できる！

**< 複数人で開発するときの問題 >**
資料を受け渡す時にメールでやりとりするのは大変...
また、同じファイルを複数人で編集したい場合に、誰かがそのファイルを編集し終わるまで手が出せなくなる...と、問題がいくつか出てくる。

以上のことから、**「同じプログラムのファイルを複数人で編集する」**を実現・解決してくれるのが**GitHub**！

### GitHub
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/d6e2c25b-ee90-7c61-452e-746f0b5d249e.png)


Gitの仕組みを利用して、簡単に複数人での開発ができるWebサービスのこと。

[GitHubの公式サイト(登録ページ)](https://github.co.jp/)

実装中のコードを共有し、コメントをもらうこともでき、実際の現場でも活用されている。
また、SlackやCircleCIなどと連携することもできてかなりの強者。

# リポジトリ
Gitの管理下にあるファイルやディレクトリの変更履歴を残しておく箱のようなもの。
Gitの中に、自分がこれから作るアプリをディレクトリごとぶっ込んで、変更履歴を記録・追跡するためのバージョン管理を指定するみたいなイメージ。

リポジトリには、ローカルリポジトリとリモートリポジトリがある！

## ローカルリポジトリ
自分が今使ってるパソコン上(ローカル環境)においているリポジトリのこと。
リポジトリを作っても、自分のパソコンの中にあるため、ファイルやディレクトリを変更、修正した際は好きなタイミングで記録できる。

## リモートリポジトリ
リモートリポジトリはローカルの真逆。外部サーバー上に置くリポジトリのこと。
作成した箱がインターネットを通して別の場所に作られているイメージ！

外部サーバーにある=他の人に自分のコードを共有できる！
つまり、**複数人(チーム)で開発する時に使うのがリモートリポジトリ！**

ローカルと違うのは、直接の変更修正ができない。一旦ローカルでいじった後、同期して修正するという流れになる。

*ローカルリポジトリを作ったら、そのアプリの現状を保存させる。
その保存作業で必要になるのが**commit**。*

# commit(コミット)
 ファイルやディレクトリの変更修正を、リポジトリに記録すること。
commitをすることで、変更修正の時系列の管理が行いやすくなり、変更修正を遡る事が可能に！

**< コミットの粒度 >**
commitをするにあたって、どの程度の頻度で記録していくかは悩みどころ。

|粗いコミット      |
|--------------|
|ユーザー管理機能 |
|投稿機能        |
|編集機能        |

|細かいコミット  |
|---|
|ユーザー管理機能　ルート|
|ユーザー管理機能　コントローラー|
|ユーザー管理機能　ビュー|

比較すると、やはり細かい方がわかりやすい。
極力、作業の節目ごとにするといいのかと。


## コミットメッセージ
commitには、それぞれ「なんの変更修正なのか？何をしたのか？」をわかるように題名をつける。中身をいちいち確認せずともわかりやすくするため。(目次みたいなイメージ)
※企業によっては英語表記で、というとこもあるそうな。。

ちなみに、commitは初期段階の、アプリを立ち上げた時点で最初のコミット(first commit)をしておく。
※初期状態の把握のため。

![名称未設定21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/5a5a370d-5d39-153d-4013-8794dad77237.png)

## commit log
今まで行ったcommitの履歴が確認できる。
commit logによってアプリケーションの実装の過程を振り返り、実装を戻す際も、どこのcommitの段階まで戻るべきかがわかる。

## インデックス
変更修正が一時的に保存される場所。インデックスに保存されている内容がcommitの対象になる。

## add (アド)
インデックスに登録して、コミットの対象にすること。(チェックマークをつける、外すで決められる)
直訳でaddは「追加」。
![名称未設定2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/457dd18e-f3cb-540d-aef8-8951c754fdba.png)


# push (プッシュ)
ローカルリポジトリでのコミットをリモートリポジトリに反映する。

このpushから先(リモートに反映していく作業)は、個人的にかなり
慎重になった方がいいかなと。
GitHubDesktopを使っていると、とりあえず上のボタンポチポチしてたけど、必ず表記と意味を調べてからポチること。
docker command まとめ

いつも忘れるからメモ、特に新しいことはありません。

#### 使用していない Docker オブジェクトの削除（prune）
https://docs.docker.jp/config/pruning.html

```bash
# イメージの prune
$ docker image prune
# 既存のコンテナ～使われていないイメージすべてを削除する
$ docker image prune -a
# 既存のコンテナ～使われていないイメージすべてを削除する、確認もしない
$ docker image prune -a -f
$ docker image prune -a --filter "until=24h"

# コンテナの prune
$ docker container prune
$ docker container prune --filter "until=24h"

# ボリュームの prune
$ docker volume prune
$ docker volume prune --filter "label!=keep"

# ネットワークの prune
$ docker network prune
$ docker network prune --filter "until=24h"

# 全てを prune
$ docker system prune
$ docker system prune -a
# Docker 17.06.1 以上でボリュームも削除したい場合は、 --volumes フラグを使います
$ docker system prune --volumes 
```

#### DockerのBuild Cacheの削除
https://qiita.com/hyt-sasaki/items/e2cbc4cfb5ae698de498

```bash
$ docker builder prune
```

#### Docker 版 df
```bash
$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   2                   2.884GB             343.2MB (11%)
Containers          2                   2                   301kB               0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B
```

#### コンテナの中身を覗く

```bash
$ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                       NAMES
5ed47462ec5b        wnameless/oracle-xe-11g-r2   "/bin/sh -c '/usr/sb乧"   9 months ago        Up 2 months         22/tcp, 8080/tcp, 0.0.0.0:49161->1521/tcp   oracle11g
7ff96800acc6        mysql:5.7.28                 "docker-entrypoint.s乧"   14 months ago       Up 2 months         0.0.0.0:3306->3306/tcp, 33060/tcp           mysql_host

$ docker inspect mysql_host
...........
```

以上
ローカル環境開発　Ruby on Railsの環境構築方法

#はじめに
ローカル環境で、Railsの環境構築ができるようになり、http\://localhost:3000/のurlから以下の表示がされるとゴールです。
初めて、ローカル環境で構築しましたので、その方法を記載します。
<img width="200" alt="スクリーンショット 2021-02-27 11.08.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ee5bbe1e-d764-ffe6-0bd7-c106a1ee7cb0.png">

#到達点
以下の1点を達成する
・http\://localhost:3000/　で上記の図を表示する

#仕様
初期仕様
・mac
・Ruby(2.6.3)

今回インストールするバージョン
・Ruby on Rails (6.1.1)
・MySQL (8.0.23)
・Homebrew (2.7.6)



##流れ
① Homebrewインストール
② bundlerインストール
③ MySQLインストール
④ railsインストール
⑤ アプリケーションの新規作成
⑥ サーバー立ち上げ


#① Homebrewインストール

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
ターミナルで上記のコマンドでHomebrewインストールをします.
<br>

```
$ brew -v
```
インストールされたか確認します
<br>
# ② bundlerインストール
```
$ gem install bundler
```
ターミナルで上記のコマンドでbundlerをインストールします
<br>
# ③ MySQLインストール
```
$ brew install mysql
```
ターミナルで上記のコマンドでMySQLをインストールします

```
$ brew info mysql
```
インストールされたか、バージョンも含め確認します
<br>
### MySQLの自動起動設定
```
$ brew services start mysql
```
このコマンドでmacが再起動すると、自動的にSQLが再起動されます
<br>

### MySQLパスワード設定
MySQLはHomebrewでインストールすると、パスワードなしでしようできるため、
パスワードありにしたい場合、下記のコマンドをします

```
$ mysql_secure_installation
```
<br>
# ④ railsインストール
```
$ gem install rails
```
ターミナルで上記のコマンドでRailsをインストールします

```
$ rails -v
```
インストールされたか、バージョンも含め確認します
<br>
# ⑤ アプリケーションの新規作成
```
$ rails new app -d mysql

$ rails new app  *これでもできるかも
```
railsはmysqlがデフォルトでないため、`-d mysql`を使いましたが必要ないかもしれません。
このコマンドで、アプリケーションの新規フォルダを作成します。
数分かかります。
<br>
# ⑥ サーバー立ち上げ
```
$ cd app

$ rails db:create　　＊データベースがないとエラーになりました

$ rails s
```
appフォルダに移動し,サーバーを立ち上げます。
http\://localhost:3000/に以下の画面が表示されれば、成功です!!
<img width="200" alt="スクリーンショット 2021-02-27 11.08.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ee5bbe1e-d764-ffe6-0bd7-c106a1ee7cb0.png">

#参考記事

[VS codeの初期設定とRuby on Railsの環境設定 環境構築](https://qiita.com/gyu_outputs/items/8e0d91f625e1daa8720b#bundler%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
[ActiveRecord::NoDatabaseError: Unknown database 'アプリ名_development'　解決策](https://qiita.com/gusya_33/items/11bd725c5b1362cef44b)