OmniAICreator/Qiita-1.07M huggingface dataset:
[Docker] docker-compose up でエラーが出た話


```docker-compose up```をすると、以下エラーが出ました。

```
web_1     | => Booting Puma
web_1     | => Rails 6.0.3.1 application starting in development 
web_1     | => Run `rails server --help` for more startup options
web_1     | Usage: yarn [options]
web_1     | 
web_1     | yarn: error: no such option: --integrity
web_1     | 
web_1     | 
web_1     | ========================================
web_1     |   Your Yarn packages are out of date!
web_1     |   Please run `yarn install --check-files` to update.
web_1     | ========================================
web_1     | 
web_1     | 
web_1     | To disable this check, please change `check_yarn_integrity`
web_1     | to `false` in your webpacker config file (config/webpacker.yml).
web_1     | 
web_1     | 
web_1     | 
web_1     | 
web_1     | 
web_1     | Exiting
shitsumonwa_web_1 exited with code 1
```

上記の画面から、変化せず。。。
***Please run yarn install --check-files to update.***
とあるので、

```
yarn install --check-files
```
をして、再度```docker-compose up```をしても同様のエラーが表示されます。

```
web_1     | To disable this check, please change `check_yarn_integrity`
web_1     | to `false` in your webpacker config file (config/webpacker.yml).
```
上記の記述があったので、```config/webpacker.yml```の中身を変更しました。

```ruby:config/webpacker.yml
development:
  <<: *default
  compile: true

  # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
  check_yarn_integrity: true
```

上記となっていましたが、変更しました。

```ruby:config/webpacker.yml
development:
  <<: *default
  compile: true

  # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules

# 下記をtrue→falseに変更
  check_yarn_integrity: false
```


ちゃんと動きました！！！

```
web_1     | => Booting Puma
web_1     | => Rails 6.0.3.1 application starting in development 
web_1     | => Run `rails server --help` for more startup options
web_1     | Puma starting in single mode...
web_1     | * Version 4.3.5 (ruby 2.6.3-p62), codename: Mysterious Traveller
web_1     | * Min threads: 5, max threads: 5
web_1     | * Environment: development
web_1     | * Listening on tcp://0.0.0.0:3000
web_1     | Use Ctrl-C to stop
```

以下記事参照

[yarnが原因でdocker-compose up ができない ( Your Yarn packages are out of date!)](https://qiita.com/busitora2/items/9ce2877d2ead84a44fda)
【AWS】よく使われる横文字用語をまとめてみた

#用語の解説
AWSは横文字の用語をよく使われる。今回はそうしたものをまとめてみる。

#リージョン
「AWSにはリージョンという概念が存在します。これは、データセンターが集積されている世界中の物理的ロケーションのことです。（中略）各AWSリージョンは、1 つの地理的エリアにある、複数の、それぞれが隔離され物理的にも分離されたAZによって構成されています。」
AZを地域ごとにグループ分けしたもののこと。AWS は世界中にサーバーを持っており、リージョンという大きな単位でまとまっている。

#アベイラビリティゾーン(AZ)
「アベイラビリティゾーン(AZ)とは、1つのAWSリージョン内でそれぞれ切り離され、冗長的な電力源、ネットワーク、そして接続機能を備えている 1 つ以上のデータセンターのことです。」
つまり互いに近くに立地しているデータセンターの集まりのこと。リージョンよりも小さな区分け。

イメージ図
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/6cf5f678-fecf-70b1-b350-a94151666161.png)


#インスタンス
「インスタンスとは、クラウドの仮想サーバーです。起動時の設定は、インスタンスを起動した際に指定した AMI のコピーです。」
要は仮想サーバーのこと。

#クラスター
「Amazon ECS クラスターは、タスクまたはサービスの論理グループです。 EC2 を使用してタスクまたはサービスを実行している場合、クラスターはコンテナインスタンスのグループ化でもあります。」
ECSの場合タスクまたはサービスの集合、EC2の場合複数のインスタンスの集合のこと。

#スケーラブル
〔コンピューターが〕拡張可能な、拡張性のあるの意味。オンプレミスだと拡張したい場合、新たに機材を調達したりなど必要だが、AWSの場合必要に応じて自動で拡張してくれる。

#スナップショット
「スナップショットは増分バックアップです。つまり、最後にスナップショットを作成した時点から、ボリューム上で変更のあるブロックだけが保存されます。これにより、スナップショットを作成するのに要する時間が最小限に抑えられ、データを複製しないことで、ストレージコストが節約されます。」
EBSのバックアップ機能のこと。

#デプロイ
「デプロイとは、配備する、配置する、展開する、配置につく、などの意味を持つ英単語。ITの分野では開発したソフトウェアを実際の運用環境に配置・展開して実用に供することを指す場合が多い。」
利用できるように準備すること。

#プロビジョニング
「プロビジョニングとは、ユーザの需要を予想し、設備やサービスなどのリソースを計画的に調達し、ユーザの必要に応じたサービスを提供できるように備える行為の総称。」
要は需要を予想して、必要に応じてリソースを提供できるようにすること。

#マネージド
顧客ではなくAWSが管理するということ。

#レイテンシ
「レイテンシとは、データの転送要求などのリクエストを発してから、リクエストの結果が返ってくるまでにかかる遅延時間のことである。」
遅延時間のこと。

#参考
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集]
(https://www.amazon.co.jp/%E3%81%93%E3%81%AE%EF%BC%91%E5%86%8A%E3%81%A7%E5%90%88%E6%A0%BC%EF%BC%81-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%B3%E3%83%81%E3%83%A5%E3%82%A2%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-ebook/dp/B07VFFX6V1/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=aws&qid=1591603022&s=digital-text&sr=1-8)

アベイラビリティゾーン(AZ)、リージョン
https://aws.amazon.com/jp/about-aws/global-infrastructure/regions_az/
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=629

インスタンス
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html

クラスター
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/clusters.html

スケーラブル
https://eow.alc.co.jp/search?q=scalable

デプロイ
http://e-words.jp/w/%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4.html

プロビジョニング
http://itlib1.sakura.ne.jp/test380/pdfichuran/0453/029-AWS-Provisioning.pdf#search='%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3+aws'
https://www.skyarch.net/blog/?p=7773

マネージド
https://aws.amazon.com/jp/managed-services/

レイテンシ
https://www.weblio.jp/content/latency
https://kotobank.jp/word/deploy-1689419
C# 抽象クラスとシールクラス

##抽象クラスとシールクラス
・abstractキーワードを使用すると、派生クラスで実装する必要のある不完全なクラスメンバーを作成できる。
・sealedキーワードを使用すると、すでにvirtualとマークされているクラスや特定のクラスメンバーを継承しないようにできる。

virtualキーワード：オーバーライドを行う為のキーワード

##オーバーライド
**継承関係にあるクラス**で**派生クラスがベースクラスのメソッドを上書き**することをいう。

###オーバーライドのメリット
・継承した部分を目的に応じた形に書き換えることで柔軟な開発が出来る。
・修正が必要になった時の修正範囲が少なくなる。

###オーバーロードとの違い
オーバーロードは引数の数や型、返り血が異なるメソッドを同じ名前で複数定義すること。
　継承を使わず、同じクラス内で同じ名前のメソッドを作る事をいう。
オーバーライドはサブクラスでスーパークラスのメソッドを上書きすること。

⇒同じクラスで、違う動きのする同じ目名前のメソッドを作る**（オーバーロード）**
⇒別のクラスでメソッドを上書きするのが**（オーバーライド）**

オーバーライドを使うために2つのキーワード
・**virtual**（これを付けたメソッドは**仮想メソッド**ともいう）
⇒これを付けたメソッドはオーバーライドしていいという目印。
　スーパークラスのメソッドにつける。サブクラスでオーバーライドせずそのまま使うこともできる。

・**override**
⇒**オーバーライドするための宣言**。サブクラスのメソッドにつける。
**（これを付けないとオーバーライドできない）**

・**抽象メソッド**
⇒メソッドの名前と引数の型、数、戻り値の型だけを定義したメソッド。
⇒メソッドの中に具体的な処理を記述してはいけない。
**※必ずオーバーライドしなければならない**

・**抽象クラス**
⇒抽象メソッドが一つ以上含まれているクラス。
⇒何も処理が記載されていないメソッドがある為そのままの使用が出来ない。
**※必ず継承しなければならない**


派生クラスでオーバーライドを禁止したい時
**sealed修飾子を使ってシールメソッドを作る**。
sealedはサブクラスのサブクラスでオーバーライドを禁止するときに使用。
DockerでSwagger Specからモックサーバーを生成しホスティングする（マルチステージビルド）

# 概要

- Swagger Specからモックサーバーを自動生成し、ホスティングする
- Swagger SpecはYAMLとJSONの両方に対応。v2とv3の両方に対応

Swaggerって何？という方には [Swaggerの概要をまとめてみた。](https://qiita.com/gcyata/items/342073fa7607fd4082bd)がオススメです。

# やったこと

DockerHubの[swagger-codegen-cli](https://hub.docker.com/r/swaggerapi/swagger-codegen-cli)というイメージを使ってモックサーバーのファイルを生成し、それを[node](https://hub.docker.com/_/node/)イメージでホスティングするDockerFileを作りました。

[swagger-codegen-cli](https://hub.docker.com/r/swaggerapi/swagger-codegen-cli)はモックサーバーのファイルを生成してくれますが、ホスティングまではしてくれません。
**「Dockerイメージをビルド・起動したらモックサーバーが動く！」**というのを実現するため、Dockerのマルチステージビルドでやってみました。

# dockerfile

[GitHubはこちら](https://github.com/tippy3/swagger-codegen)。**JSONへの対応やバージョン3系への対応についても書きました。**

```dockerfile:dockerfile
FROM swaggerapi/swagger-codegen-cli:2.4.14 as builder
WORKDIR /mock-seed
# ホストマシンのswagger.ymlをコピー
COPY ./swagger.yml ./
WORKDIR /mock-server
# モックサーバーのファイルを作成
RUN java -jar /opt/swagger-codegen-cli/swagger-codegen-cli.jar \
    generate -i /mock-seed/swagger.yml -l nodejs-server -o ./

FROM node:14.2.0-alpine3.10 as executor
WORKDIR /mock-server
# 上記で作ったモックサーバーのファイル群をコピー
COPY --from=builder /mock-server ./
# パッケージ類のインストール
RUN npm install
# 8080ポートを受ける
EXPOSE 8080
# コンテナ起動でサーバーが起動するようにする
CMD ["npm", "start"]
```

# docker-compose.yml

合わせて作りましたが、なくても大丈夫です。（[GitHub](https://github.com/tippy3/swagger-codegen)）

```yml:docker-compose.yml
version: '3.3'
services:
  mock_server:
    container_name: mock_server
    build: .
    ports:
      - "8080:8080"
```

# ビルド・起動

swagger.ymlはdockerfileと同じディレクトリに置いてください。

### docker-composeを使う場合

```bash
docker-compose up --bulid
```

### docker-composeを使わない場合

```bash
docker build . -t mock-server

docker run --rm -p 8080:8080 mock-server
```

ブラウザで`localhost:8080/docs`にアクセスするとSwaggerUIが表示されます。
`localhost:8080/v2/pet/1`等、Swagger Specで定義したURLにアクセスするとサンプルデータが表示されます。

# おわりに

筆者は初学者です。間違いなどがあればコメントでご教授ください！
ネイティブアプリ実装の選択肢考察（執筆中）

# ❶ はじめに

## 1. 要約
実務経験2年半のWebエンジニアが、はじめてネイティブブアプリを実装するにあたって、どの言語を使用するかの考察をおこないます。

## 2. 前提
今までに経験したプログラミング言語は、Ruby・Python・JavaScript、フレームワークは、Rails・Djnago等です。元々、非理系からエンジニアに転職したので、基礎は結構あまあまです。気合いでいくつもの現場を乗り越えて来ました。今回は知識をしっかりと深めるためにも記事を投稿することにしました。

# ❷ Webアプリとネィティブアプリの違い

## 1. Webアプリ
- Webブラウザー（Chrome・Safari・Firefoxなど）上で動作するアプリケーション。
- OSに依存せずに動作する。そのため、プラットフォームごとの開発が不要。
- オンライン環境で動作する。
- ダウンロードなどの手間がからない。
- 検索・SNS・ダイレクト（URL直打ち）の流入が見込め、チャネルが広い。

※ PWA（プログレッシブ・ウェブ・アプリケーション）を実装すれば、オフライン動作・ローカル通知・プッシュ通知が一部対応可能

## 2. ネイティブアプリ 
- スメートフォンやタブレットなど各端末（ネイティブ環境）上で動作するアプリケーション。
- OSに依存する。各プラットフォームごとに開発や調整が必要。
- 動作が高速。
- プッシュ通知・ローカル通知が可能。
- 課金システムを使うと、手数料が30%とられる。
- オフライン環境でも動作する。（通信が必要なところ以外）
- 端末にダウンロードする必要がある。
- チャネルがアプリマーケット（App Store・Google Play）のみ。
- リリースやアップデートに審査があり、時間がかかる。（24-48h）

# ❸ 実装する候補 （--- 執筆中 ---）

## Webアプリの場合
 
### 1. JavaScript（React/Next） + Ruby(Rails）
- フロントエンドはJavaScript（React/Next）、バックエンドはRuby（Rails）。
- ネイティブアプリへの展開も考えると、JavaScriptのライブラリは、VueでなくReactが吉（？）
- RubyはWebアプリケーションに特化させる場合、ライブラリ（gem）や情報が多く吉。

### 2. JavaScript（React/Next） + Python(Django)
- フロントエンドはJavaScript（React/Next）、バックエンドはPython（Django）。
- ネイティブアプリへの展開も考えると、JavaScriptのライブラリは、VueでなくReactが吉（？）
- Pythonは数値計算などの必要性が見込まれる場合に特に吉。

## ネイティブアプリの場合

### 3. iOSはSwift、AndroidはJava（Kotlin）
- OSに適した開発が可能。
- 開発や管理が各OSごとに必要なので大変。

### 4. JavaScript(React Native) + Python(Django)
- ネイティブ側とJavaScript側でブリッジが必要な場所は面倒くさい。
- OSに依存せず（大方は）作れるので、開発や管理が楽になる。
- Hot Relodによって、スタイルの修正が早い。
- Hot Code Pushによって、軽微な修正が申請なしで行える。
- バックエンドは、PythonでAPIを作っておくことで、Webの展開も楽になりそう。

## Webアプリ + ネイティブアプリの場合

### 5. Flutter
- Webアプリからネイティブアプリまで対応したクロスプラットフォームフレームワーク。
- Webアプリ・ネイティブアプリの垣根が無いため、開発や管理はシンプルに素早く行えることができそう。
- Hot Relodによって、スタイルの修正が早い。
TechAcademyが無料公開している「HTML・CSS入門講座」を受講する～HTML第3回～

# アジェンダ
* HTMLのタグ
    * リスト
        * ol
        * ul
        * li
    * 定義リスト
        * dl
        * dt
        * dd
* 実践

# HTMLのタグ
## リスト
同類の項目を列挙するのに。リストを使用する。

### ol
順序の関係するリストを示すタグ。
ordered list のol。

### ul
順序の関係しないリストを示すタグ。
unordered list のul。

### li
リストの項目を示すタグ。
上記のolタグ、ulタグと合わせて使用する。
list のli。

## 定義リスト
定義リストとは、「項目名とその内容」を合わせて一つの項目、となっているリストである。

### dl
定義リストを示すタグ。
definition list のdl。

### dt
定義リストの項目のうち、項目名を示すタグ。
definition term のdt。

### dd
定義リストの項目のうち、内容を示すタグ。
definition description のdd。

# 実践
上記のタグを使用して、以下のindex.htmlを作成した。

```html:index.html
<!DOCTYPE html>

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>ki-ta</title>
  </head>
  <body>
    <h1>アジェンダ</h1>
    <hr>
    <ol>
      <li>
        HTMLのタグ
        <ul>
          <li>
            リスト
            <ul>
              <li>ol</li>
              <li>ul</li>
              <li>li</li>
            </ul>
          </li>
          <li>
            定義リスト
            <ul>
              <li>dl</li>
              <li>dt</li>
              <li>dd</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>実践</li>
      <li>
        用語説明
        <dl>
          <dt>リスト</dt>
          <dd>同類の項目を列挙する。</dd>
          <dt>定義リスト</dt>
          <dd>「項目名とその内容」一つの項目として、項目を列挙する。</dd>
        </dl>
      </li>
    </ol>
  </body>
</html>
```
これをWebブラウザに表示させるとこんな感じ。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/2f4f1258-cf06-4929-4ed0-b3982a4fdc19.png)

リストを入れ子にすると、インデントを深くして表示してくれる。

# おわりに
今回は、リストに関する内容だった。
実践では、イメージ通りのものを作成できたので満足。

次回 >> [ここ](https://qiita.com/MakoMakoMakotsu/items/2d94ea76dfa03b81058a)

## 参考
[3-1 リスト項目（HTMLのリスト表記）](https://www.youtube.com/watch?v=x6EFgJrc7A8&list=PLjw-30bsJNVU87F5iCPAW9kB4QDUGQxUG&index=10)
[3-2 定義リスト（HTMLのリスト表記）](https://www.youtube.com/watch?v=244qUv8opsw&list=PLjw-30bsJNVU87F5iCPAW9kB4QDUGQxUG&index=11)
【データベース】正規化について知る


# はじめに

この記事では
リレーショナルデータベース（以下、DB）技術のあんなことや
こんなことについてまとめた記事です。

ベストプラクティスや間違いがあれば
書き直していく予定です。

今回は「正規化」についてまとめてみました。

--------------------------------

# キッカケ
かれこれ３年近くお客様のDBを触っていますが
扱っているDBについて

どのような考えで設計されているのか
たまに疑問に思うことがあるので

DBのあるべき姿について学びたいと思うようになりました。

--------------------------------
# 正規化って何ぞや

要するに
・あるべき姿を追い求めること
・扱う上で効率良いデータに仕立て上げること（異状な形ではないこと）

※「異常」ではなく「異状」であることに注目
データを更新する際に発生する異常を「更新異状」という

--------------------------------
# 正規化の基本
英語でカッコよく言うと
「1 fact 1 place」

１か所１事実
データを正常に扱う上では正規化は欠かせないが
正規化というのはテーブルの分解を行うということ

分解するということは
参照するときには結合しなければならない為
処理が遅くなる可能性もある。

そういったことも踏まえて
あえて正規化を行わないこともある。

--------------------------------
# 正規化が必要ないモノ(データの更新を行わないモノ)

アクセスログといったデータを追記するだけのモノ
データウェアハウス
蓄積させていくものに関しては更新を行わない為
正規化は必要ありません。

--------------------------------


# 正規化が必要ないモノ(データの履歴を残すモノ)

社員の異動履歴や変更履歴など
履歴として残すモノは更新する必要がない為
正規化は必要ありません。

--------------------------------

# 正規化が必要ないモノ(高速化が必要なモノ)

更新異状は２の次で
スピードが優先される場合は
更新スピードに影響が出るため
正規化の必要はありません。
※ スピード優先でもデータに整合性を取りたい場合は
別の方法で正規化を検討する必要があります。

--------------------------------
# 正規形の種類 (全6種類)

非正規形
第1正規形
第2正規形
第3正規形
第4正規形
第5正規形

第4正規形や第5正規形は「ボイスコット正規形」というそうです。
※復習で初めて知りました。

基本的には第3正規形までできれば
かなりきれいなDBになると思う。
（第3までしか正規化したことないのでそう思うだけ）

--------------------------------
# まとめ
更新異状を起こさない為には正規化が大事であり
正規化というのは必ずしも必要なモノではない。

更新時異状が起こりやすいと考えられるテーブルに関しては
正規化を検討すべきである。

正規化は全部で6種類存在するが
基本的に第3正規形までを扱えれば良い。

正規化が必要ないデータもあることに注意すること

--------------------------------
# おわり
写真ACのダウンロード数をグラフ化したい【APIサーバー構築編】 ~1日10行コーディング~

## 5日目

### 【技術テーマ】
PHPでAPI構築

### 言語
* PHP
* JavaScript

### 目標成果物
今日は前回までにためたデータJSONで返却するAPIを作りたいと思います。

### コードと資料

#### 1. PHP,composerの環境構築

PHPのインストール

```sh
brew install php@7.2
```

composertのインストール

```sh
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```

これでだけで完結しました。


#### 2. Lavavelでプロジェクト作成

下記のコマンドでLaravelでAPIのもととなるプロジェクトを構築します。

```sh

composer create-project --prefer-dist laravel/laravel photo_ac_graf
```

これだけでLaravelのプロジェクトができるので非常に簡単です。

この状態でプロジェクト内のフォルダに入って

```sh
cd photo_ac_graf
```

PHPを起動すると

```sh
php -S 127.0.0.1:8080 -t ./public
```

![](https://i.imgur.com/ZI7yHXT.png)

このようにLaraveｌの初期画面が表示されます。これでLaravelの構築は完了です。ここからは実際にコードを書いていきます。


#### 3. データベースからデータを取得

プロジェクト直下にある「.env」ファイルのMySQLの部分を書き換えます。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

無心でコントローラーなどのファイルを手作業で作成していたのですが、よく考えたらコマンドで作成できたのでコマンドの方で作成していきます。

##### ルーティング

今回はAPIとしてレスポンスしたいので、routes配下のapi.phpに

```api.php
Route::get('/logs', 'LogsController@index');
```
上記の１行を追加します。

##### モデルの作成
```
php artisan make:model Log
```
今回はとりあえずデーターすべて返せばいいかなって思ってるので、モデルファイルには特に何も書きません。


##### コントローラーの作成
```
php artisan make:controller LogsController
```
コントローラーにはデータを取得してJSONで返す記述をしたいので下記のように記述します。

```LogsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Log;

class LogsController extends Controller
{
    public function index(Request $request){
        $logs = Log::all();
        return response(array('result' => $logs));  
    }
}
```

##### 動作確認

この状態で[http://localhost:8080/api/logs](http://localhost:8080/api/logs)にアクセスすると

```json
{
	"result": [
		{
			"id": 1,
			"image_id": 2875969,
			"download": 0,
			"date": "2020-06-06"
		},
		{
			"id": 2,
			"image_id": 2875964,
			"download": 0,
			"date": "2020-06-06"
		},
		{
			"id": 3,
			"image_id": 2875028,
			"download": 0,
			"date": "2020-06-06"
		},
		{
			"id": 4,
			"image_id": 2875022,
			"download": 0,
			"date": "2020-06-06"
		},
		{
			"id": 5,
			"image_id": 2874964,
			"download": 0,
			"date": "2020-06-06"
		},
.
.
.
略
```
こんな感じでデータを取得できます。
加工して返したほうがいいかなって思ったりもしたんですけど、一旦どの形式でデータが必要かはグラフを描画するライブラリ次第な気がしたのでこの状態での返却にします。


いやぁ...このLaravelの爆速感タマランですね....
Javaとかと比べて動作確認もリロードするだけですからね...やめられないですね...
PHP 正規表現メモ

#共通する考え方

- 表現したい文字列・数値を書く
- 複数のパターンになる箇所を正規表現に置き換える
- パターンが繰り返される箇所を括弧でくくる
- 繰り返す、もしくは有無を表現する(?+*等)
- 特殊文字があればエスケープする(\.等)

# 正規表現を可視化するサービス
https://regexper.com/

# どこを検索したいかを整理
- 部分一致　xxx
- 前方一致　^xxx
- 後方一致　xxx$
- 完全一致　^xxx$

^は[]内で使用されると**否定**を表す

#数字

- [0-9]:1桁の数字
- [0-9]+:1桁以上の数字

[...] 各括弧に含まれるいずれかの1文字にマッチ
+     直前の文字が1回以上繰り返す場合にマッチする
[...]+ 各括弧に含まれるいずれかの1文字に全てに適用される 

#URL

- https?:\/\/　:httpかhttps(sが0か1個)
- ([a-zA-Z0-9]+\\.)*dummy\.co\.jp : サブドメイン0個以上許容
- ([a-zA-Z0-9]+\\.)?dummy\.co\.jp : サブドメイン0個か1個許容
- ([a-zA-Z0-9]+\\.){0,2}dummy\.co\.jp : サブドメイン0-2個まで

[a-zA-Z0-9]+\\. : 「英語数字」と「.」のセット
([a-zA-Z0-9]+\\.)* :「英語数字が1回以上」と「.」のセットを0個以上 
([a-zA-Z0-9]+\\.)? :「英語数字が1回以上」と「.」のセットを0か1個
([a-zA-Z0-9]+\\.){0,2} :「英語数字が1回以上」と「.」のセットが0～2個まで 

# URLパラメータ
```
/^\?([^=&?#\/]+(=[^=&?#\/]*)?)(&[^=&?#\/]+(=[^=&?#\/]*)?)*$/
```

- パラメータのvalueは無くても大丈夫
- [^=&?#\/]によりURLの予約文字（=&?#/）を除外している
    - []内の?はエスケープ不要

# brタグ

- brタグ内の、半角スペースとスラッシュを全て削除
- **※class名がある際に必要な半角スペースは許可する**
    - 第一引数に設定したパターンにマッチするのは`<br >,<br />`等なため、class名で必要なスペースなどは守られる

```php:replace
$before = 'xxx<br  //>xxx';
$before = '<br class="hidden">';

$after = preg_replace('/<br[ \/]*>/','<br>',$before);
var_dump($after);exit;
```

#マルチバイト文字

マルチバイト文字は全角文字とだいたい同じ意味。
日本語は全部マルチバイト文字なので、対象の文字列が日本語かつ正規表現を使用する関数(preg_match等)を使うときはパターン修飾子が必要

```php
preg_match('/正規表現/u',$haystack)
```

# 複雑なバリデーションをシンプルに機能させるやり方

**許可パターンにマッチ、拒否パターンにマッチしない、のAND条件で評価する**

## 「A」が含まれる値を許可

- ^.*7.*$
- ^[^7]*7[^7]*$
- /7/

## 「プログラミング」が含まれない値を許可

- /^(?!.*プログラミング).*$/u
- /^((?!プログラミング).)*$/u

## 電話番号で携帯電話を除外する

許可:^0\d+-\d+-\d+$
拒否:^(070|080|090)

## メールアドレスで携帯電話を除外する

許可:^[^@]+@[\w\-]+(\.[\w\-]+)+$
拒否:^(ezweb\.ne\.jp|docomo\.ne\.jp|softbank\.ne\.jp)$


# 正規表現チェッカー
http://okumocchi.jp/php/re.php

# 参考リンク
https://murashun.jp/blog/20190215-01.html
Azure Storage サービス調べてみた

# はじめに
[Azureデータストレージサービスの種類・用途](https://qiita.com/Shin/items/4a06e712231b2afc07a8)に引き続き調べました。BLOB StorageとData Lake Storage Gen2を使うので主に書きました。

# ストレージ種類
| サービス名 | 説明 | 用途 | 公式ドキュメント |
|:---:|:---:|:---:|:---:|
| BLOB | テキスト データやバイナリ データなどの大量の非構造化データを格納するために最適化 | ・画像、ドキュメントをブラウザに配信　・バックアップデータを格納　・ログデータの格納 | [Azure Blob Storage のドキュメント](https://docs.microsoft.com/ja-jp/azure/storage/blobs/) |
| Files | サーバー メッセージ ブロック (SMB) プロトコル経由でどこからでもアクセスできるフル マネージドのクラウド ファイル共有。 | オンプレミスのファイルサーバの代わり | [Azure Files のドキュメント](https://docs.microsoft.com/ja-jp/azure/storage/files/) |
| キュー | 多数のメッセージを格納するためのサービス | メッセージキュー | [Azure Queue storage のドキュメント](https://docs.microsoft.com/ja-jp/azure/storage/queues/) |
| テーブル | 構造化データのスキーマレスストレージ | 構造化データ | [Azure の Table Storage の概要](https://docs.microsoft.com/ja-jp/azure/storage/tables/table-storage-overview) |
| ディスク | Azure VMのためのブロックレベルのストレージボリューム | VMのストレージ | [Azure マネージド ディスクの概要](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/managed-disks-overview) |



# 各サービスの説明

## Azure BLOB
Blob Storage と Data Lake Storage Gen2 の2種類がある。
### Blob Storage
##### 構成
* ストレージ アカウント
* ストレージ アカウント内のコンテナー
* コンテナー内の BLOB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/6caf1342-179d-3162-7dbd-5af2d460c962.png)
引用：[Blob Storage のリソース](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-introduction#blob-storage-resources)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/2c853b9a-cfa3-a5ea-65c7-8e47c36d4869.png)
参考：[Planning for Accounts, Containers, and File Systems for Your Data Lake in Azure Storage](https://www.sqlchick.com/entries/2019/3/10/planning-for-accounts-containers-and-file-systems-for-your-data-lake-in-azure-storage)


##### BLOB種類
* ブロック BLOB
* 追加 BLOB
* ページ BLOB

引用：[BLOB種類](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-introduction#blobs)

### Data Lake Storage Gen2
##### ビッグデータ処理の概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/8634635c-1cbf-05d4-bfbb-247229596afe.png)
引用：[データをダウンロードする](https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-data-scenarios#download-the-data)

引用：[Azure Data Lake Storage Gen2 の概要](https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-introduction)



# ストレージアカウント作成方法
[Azure Storage アカウントの作成](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-account-create?tabs=azure-portal)
「3点を通る円を求める」を参考にWolframAlphaとSymPyとVBAソルバーでやってみた。(1/2)

オリジナルポスト

https://qiita.com/tydesign/items/2fd456f40f5aeeb461ff

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1113723141




## WolframAlphaで

https://ja.wolframalpha.com/input/?i=3%E7%82%B9%E3%82%92%E9%80%9A%E3%82%8B%E5%86%86&assumption=%7B%22F%22%2C+%22CircleCalculator%22%2C+%22point%22%7D+-%3E%22%280%2C+3%29%22&assumption=%7B%22F%22%2C+%22CircleCalculator%22%2C+%22point2%22%7D+-%3E%22%28-1%2C+0%29%22&assumption=%7B%22F%22%2C+%22CircleCalculator%22%2C+%22point3%22%7D+-%3E%22%28-3%2C+4%29%22


https://ja.wolframalpha.com/input/?i=%E5%86%86+%280%2C+3%29+%E3%82%92%E9%80%9A%E3%82%8B+%28-1%2C+0%29+%E3%82%92%E9%80%9A%E3%82%8B+%28-3%2C+4%29+%E3%82%92%E9%80%9A%E3%82%8B

https://ja.wolframalpha.com/input?i=%E5%86%86+%280%2C+3%29%28-1%2C+0%29+%28-3%2C+4%29+


## SymPyで
後から、値を代入。
Tuple
```python
from sympy import
var('x0,y0,x1,y1,x2,y2,x3,y3,r')
eq1=Eq((x1-x0)**2+(y1-y0)**2, r**2)
eq2=Eq((x2-x0)**2+(y2-y0)**2, r**2)
eq3=Eq((x3-x0)**2+(y3-y0)**2, r**2)
s=solve ([eq1, eq2, eq3], [x0, y0, r])
# print(s)
print(Tuple(*s[0]).subs({x1:0,y1:3,x2:-1,y2:0,x3:-3,y3:4}))
# (-2, 2, sqrt(5))
```

# SymPy参考
https://vigne-cla.com/5-5/#toc3


以下、2021-9-23追加
# (次頁)

https://qiita.com/mrrclb48z/items/52efe33c951381f71b1a
Ruby 電話帳作成問題 解いてみた(解答例あり)

# はじめに
『プロを目指す人のためのRuby入門』通称チェリー本を学習後のプログラミング初心者です。
インプットしたものを手を動かして実践してみたいなと思ったら、作者の記事を見つけました。
[「アウトプットのネタに困ったらこれ！？Ruby初心者向けのプログラミング問題を集めてみた（全10問）」](https://blog.jnito.com/entry/2019/05/03/121235)

この5つ目の問題を解いてみました。

他の問題はこちら
[一問目](https://qiita.com/u_nayama/items/389b229bd569fdfc1874)：カレンダー作成問題（たのしいRuby　練習問題）
[二問目](https://qiita.com/u_nayama/items/6009dcfe148e15ad9e1b)：カラオケマシン作成問題
[三問目](https://qiita.com/u_nayama/items/7be7e6c5661d93272de8)：ビンゴカード作成問題
[四問目](https://qiita.com/u_nayama/items/82edf9500c0cdfc263f7)：ボーナスドリンク問題

# 問題

```
カタカナ文字列の配列を渡すと、ア段の音別にグループ分けした配列を返すプログラムを作成せよ。
各要素は50音順にソートもすること。

例
# INPUT
['キシモト', 'イトウ', 'ババ', 'カネダ', 'ワダ', 'ハマダ']

# OUTPUT 
[ ['ア', ['イトウ']], ['カ', ['カネダ', 'キシモト']], ['ハ', ['ハマダ', 'ババ']], ['ワ', ['ワダ']] ]
```

# 解答例
意外と簡単そうかな？と思ったのですが、結構ドツボにハマってしまい想像の倍くらい時間かかってしまいました。

```ruby
class NameIndex
  KANA = ('ア'..'ン').to_a
  KANA_SENTOU = ['ア','カ','サ','タ','ナ','ハ','マ','ヤ','ラ','ワ']
  NUM = [0..8, 9..18, 19..28, 29..39, 40..44, 45..59, 60..64, 65..70, 71..75, 76..81]

  def self.create_index(names)
    group = []
      for i in 0..9 do
        content = names.sort.select{|name| NUM[i] === KANA.find_index(name[0])}
        key = KANA_SENTOU[i]
        group << [key,content] unless content[0].nil?
      end
    return group
  end
end
```
このようになりました。
改善の余地はまだまだありそうです。

```ruby
KANA = ('ア'..'ン').to_a
=> ["ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ヮ", "ワ", "ヰ", "ヱ", "ヲ", "ン"]
```
という平仮名の一覧、各行のアの段の配列、ア行、カ行・・・に対応する配列のインデックス番号の配列、をそれぞれ作成する。
与えられた名前の配列から、ア行、カ行・・・とそれぞれに該当する名前と、アカサタナなどの一文字をセットにして配列として追加する。
該当する名前のない行は何も追加せずスキップする。
という形で配列にして返しました。

[他の方の解答例](https://qiita.com/mi0/items/738b78fe5e7d10df34ae)を見るに、やや遠回りな解き方をしてしまったのかと思います。
とてもきれいに解いていてとても参考になりました。

# さいごに
なにかご指摘ありましたら、教えてください。
よろしくお願いいたします。

# 参考
[「Ruby初心者向けのプログラミング問題を集めてみた」の電話帳問題解いてみた。](https://qiita.com/mi0/items/738b78fe5e7d10df34ae)
Mac OSX 10.15.5にpyenvでPython2.7.xを入れる

Mac OSX 10.14.x以降は同じかもしれませんが、
OSを**10.15.5**にUpgradeしたらpyenvで2.7.x系のインストールができなくなってしまったので
メモとして残します。

#Python 2.7.13のインストール

pyenvでPython 2.7.13のインストールを行うと、以下のエラーが表示される。

```terminal
% pyenv install 2.7.13
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-2.7.13.tar.xz...
-> https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tar.xz
Installing Python-2.7.13...
patching file ./Lib/site.py
python-build: use readline from homebrew
ERROR: The Python zlib extension was not compiled. Missing the zlib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 10.15.5 using python-build 1.2.8)

Last 10 log lines:
rm -f /Users/nier/.pyenv/versions/2.7.13/share/man/man1/python.1
(cd /Users/nier/.pyenv/versions/2.7.13/share/man/man1; ln -s python2.1 python.1)
if test "xno" != "xno"  ; then \
		case no in \
			upgrade) ensurepip="--upgrade" ;; \
			install|*) ensurepip="" ;; \
		esac; \
		 ./python.exe -E -m ensurepip \
			$ensurepip --root=/ ; \
	fi
%  
```

#解決策

私の場合は、Xcode, CommandLine Toolはインストール済みでしたので、以下のコマンドで上手く入りました。

```
CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install -v 2.7.13
```

ちなみに、Xcodeをインストールしていない方は、Xcodeをインストール後にCommandLine Toolをインストールします。

```
xcode-select —install
```

なお、エラーにも記載されていますが、上記でも解決しない場合は公式ドキュメントをみるのがいいです。。
https://github.com/pyenv/pyenv/wiki/Common-build-problems
CyberAgentの2daysインターンでパフォーマンスチューニング大会してきました！！

こんにちは！
大学３年生のコータです！！🔥

先日CyberAgentの2daysエンジニアインターン（サーバーサイド）に参加しました！


今回は面白かったことと、学びをアウトプットしていきます！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/1c1416e0-997e-7873-2fdf-d61fbdf16cb0.png)

# 面白かったこと＆よかったこと
1. 事前面談による目的設定
2. メンターの人たちが優しい
3. LTや事業説明と、開発の進行具合が作り込まれていた

詳しくいきます！！
## 1. 事前MTGによる目的設定
インターンの１週間前に事前面談をしました。

そこでメンターの方と**「インターンに参加する目的」**決定、、

結果、**めちゃめちゃ目的意識を持てていた**のですごくよかったです！

## 2.メンターの方々が優しい
**とにかくメンターの方々が優しい！！！**

「つまってるところはないですか？」
「メンターのことこきつかっちゃってください」

冗談ぽく聞こえるけど、体現してくれていてほんとに助かりました、ありがとうございます><



## 3.LTや事業説明と、開発の進行具合が作り込まれていた
**タイムスケジュールがめっちゃよかった**です。
事業グループや構成もだいぶわかりました！

また、競技中では１日の終わりに開発の解説などを入れてくれてすごくありがたかったです。

終盤のパネルディスカッションでは学生が聞きたそうな質問を、人事の方が予め準備してくれていて、それを学生が聞いているという感じでした！

最後の社員交流会で聞けなかった内容を聞けたのですごく満足です♪

# 学び
1. sshすればvscodeでコーディングできる
2. Indexを貼ればqueryが著しくよくなる
3. peekやmapの中でsqlを一回ずつ叩く処理があるなら、外でごっそり持ってくる(sqlとのやりとりの回数を少なくする)
4. Alpを使ってログ解析ができる
5. Nginxの設定を変えると早くなる
6. MySQLのスロークエリログを使用することで、重たいクエリがわかる、秒数の設定もできる


詳しくいきます！

## 1. sshすればvscodeでコーディングできる
今回は、sshのホストとuserIDとpasswordを渡されたので、とりあえずsshしてみたのですが、いきなり大変。
何がどこに入ってるかわからないし、そもそもvimでコーディングしたことないし、、、

そんな時に、教えていただいたのが、vscodeの拡張機能**「Remote -ssh」**です。
これで一気にいつものエディター画面に行けました。
鍵生成とか、scpとか、chmodで編集権限を与えないとダメですが、それでもvimよりかは慣れているエディタでコーディングできるのは強いです。

僕は２日目の昼過ぎに気づいたのでもっと早くやっていればよかったです、、、🚶‍♂️

## 2. Indexを貼ればqueryが著しくよくなる
クエリが遅くなったりしている時はクエリ取得のロジックがよくないか、Indexが貼れてない時が多いです。
今回の競技では適切な箇所にindexを貼るだけで、時間がかかったリファクタよりも点数がゴリっと上がりました。

**indexの大事さを改めて痛感。。。**

## 3. 繰り返しの中で何度もSQLにアクセスしてたら、外でごっそり持ってきちゃう
これはありがちなN+1問題ですね、Joinとか外でゴリっと持ってくるのが良いです。
**Railsでもeager_loadとかちゃんと意識しようと思いました。**

## 4. Alpを使ってログ解析ができる
ベンチマークっていうテスト？的な実行コマンドが用意されてて、そのコマンドとかボタンを押すことで、自分のチューニングしたアプリの点数が表示されるのですが、実行したNginxのログが出力されないと何もできません。そこで登場するのがログ解析ツールのAlpです。

[こちら](https://nishinatoshiharu.com/install-alp-to-nginx/)に詳しく記載されているので、nginxのログの解析や、ISUCON出場するなら事前準備しておいた方が良いと思います。
以下の場合だったら、tag/120の時のAVGが高いので、ここに関係しているクエリやロジックをみていく流れになります。
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/8cff9bde-9b88-e4e9-2d89-0438ca3c9fab.png)



## 5. Nginxの設定を変えると早くなる
ぶっちゃけ自分のインプット足りなくて、そもそもnginxってなんなのかあんまりわかってなかったのですが、nginxの設定を変えると早くなりました。
時間もなかったので[こちら](https://gist.github.com/koudaiii/386eb55a29b1adc19c5e)のGithubから参考にしたのですが、インターン先のプロダクトの設定とかをみてインプットを深めようと思います。

## 6. MySQLのスロークエリログを使用することで、重たいクエリがわかる、秒数の設定もできる
この日までMySQLの「スロークエリログ」の存在すら知らなかったのですが、どうやらMySQLチューニングでは基本らしいです。。。><

時間を設定して、その時間をオーバーしたクエリを作成したファイルに出力してくれます。
これで、重たいクエリを潰せるというわけですね！！
いやー便利なこった😎
プルリク出す前に確認することにします！！！！

## 終わりに
ここまで読んでくださりありがとうございます！！

僕の目標は**「チューニングの目的と効果が理解でき、自分のバイト先に適応できるようになってる 」**ということが目標だったので、かなり達成できたと思います。

これからも楽しく精進していくぞおおおおお

最後に、僕自身競技をしたことがなくて、右も左もわからなかったのですがメンターの方々が支えてくださってすごく楽しかったです！！ありがとうございました😁
【Jenkins】特定のジョブを優先実行する【Priority Sorter Plugin】

# 初めに

Jenkinsでは`[Jenkinsの管理]->[システムの設定]`より同時ビルド数の設定ができますが、その数を超えた分はビルド待ちとしてビルドキューに溜まっていきます。大抵の場合はスケジュールされた順で問題ないのですが、中には早く完了してほしいビルドや、連続して扱いたいジョブがあったりします。そこで、ビルドキューに優先度付けをする**Priority Sorter**というPluginを紹介します。

# 導入手順と使い方

`[Jenkinsの管理]->[Pluginの管理]->[利用可能]`より`Priority Sorter`を検索してインストールします。

https://plugins.jenkins.io/PrioritySorter/

完了すると、メニューに「Job Priorities」が追加されるので選択して設定していきます。

![afasdfasd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/011ac00e-ee3a-a486-8849-780a1177feb8.png)

いくつか設定方法あるのですが、ここではView単位で設定します。「Jobs to include」で「Job included in a View」を選択してください。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/14bd08c2-7a18-5186-56f3-32d356898a55.png)

優先度の設定が紛らわしいのですが、**数字が小さいものが優先的に実行**されます。早く実行したいものは小さい数字に設定しましょう。

![aキャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/d4313892-c077-0a01-924e-4753b7521491.png)

ちなみにデフォルトの優先度（初期値は`3`）や優先度の刻み具合は`[Jenkinsの管理]->[システムの設定]`より設定可能でした。

# 参考

[ブログズミ: [Jenkins] 手動実行したビルドを優先実行する](https://srz-zumix.blogspot.com/2015/09/jenkins.html)
Macbook Pro 13インチでディスプレイを3台以上繋げてみたら色々苦労した

どうもこんばんは。ファンチップの白濱です。
今回はMacbook Pro 13インチ（2014Mid、2015Early）でディスプレイを3台以上つけようとしたら色々苦労したっていう話です。Mac OSはMojaveです。
結果的に、3台以上のディスプレイを繋げる事ができました。

# そもそもの話
Macbook Pro 13インチ（2014Mid、2015Early）は、そもそも外部ディスプレイ2台までしか出力できない仕様です。
Lightning2端子が2ポート、HDMI1ポートあるって普通に3台いけると思ったのに…3台目を接続するとディスプレイが黒い画面のままで反応しません。
多分これは最新のMacbook pro 13インチでも同じなのかな？

# 【未承諾広告】 求人の宣伝
弊社HPにて求人中です。PHPエンジニア、Webデザイナー、フロントエンドエンジニアの募集です。
自社サービスを開発して収益を出すお仕事です。
https://funtip.co.jp/recruit

# 一部の組み合わせだと3台できる？
どこかの情報で、DisplayPortを混ぜると3台表示できたとかいうので、ダメ元でHDMI、Thunderbolt2&HDMI、Thunderbolt2&DisplayPortの組み合わせでやってみたりしたけど、ダメ。

# しょうがないので課金した
しょうがないからUSB3.0からディスプレイを拡張できる商品があるみたいなので色々物色。
IO-DATAのものが最初見つかったんだけど、何やら公式ではMac OSに非対応らしい。
海外の製品ページからドライバ入れると使えるらしいけど、販売元が使えるって表示してないものを使うのもなー…と他に候補を探すことに。
結果的に、公式でMac OS Mojave、Catalinaに対応しているStarTech.comのUSB32DP24K60を買って成功しました。

# 買ってからも色々と苦労をした…
USB32DP24K60は、USB3.0接続でDisplayPortを2つ増設できます。
つまり、Macbook Pro 13インチでThunderbolt1,HDMI1,DP2の計4台のディスプレイを接続可能です。
クインティプルディスプレイ環境ですね。クラムシェルで使うならクアドラプルディスプレイ環境です。なんだそれ。
えー、まぁ自分的にはクラムシェルでトリプルディスプレイ環境にできればそれでいい。

USB32DP24K60をUSB3.0で接続して、StarTech.comからMac OS Mojave用のドライバを入れて、Macのシステム環境からセキュリティでドライバを許可して、再起動したら無事に3台のディスプレイを接続することができました。

しかし、ここで問題発生。
DellのU2720Qという27インチ4K対応ディスプレイをDisplayPort→Thunderbolt2で接続していたのだが、動きが遅い！なんか画面がカクカクする！
調べてみると、どうやらディスプレイのリフレッシュレートが30Hzで動作しているせい。
60Hzで動作可能なケーブルを買い直して接続すると、60ヘルツになった!

# まだだ・・・まだ笑うな・・・
しかし、本当の課金はここからだった。
まだ、重い！デルのディスプレイ内だけ動作が重い！
Finderとかはまぁ問題ないんだけど、phpstormとかマルチウィンドウで横に移動したりしているときとか、やたら遅い！！
使用している解像度をフルHDに下げても、4Kディスプレイ以外を外しても変わらず。
他のフルHDまでしか使えないディスプレイでphpstormを動かすと早い。サクサク動く。

なにやら、Macbook Pro 13インチが古すぎてGPUが4Kディスプレイへの出力ができずに限界突破している模様。
解像度を下げても4Kディスプレイ使うだけで負荷が高いのか…無知でした。
えー、結果的に、DellのP2421DCという24インチディスプレイ（解像度WQHD 2560x1440）に差し替えたら快適になりました。

# 最終的な構成
Macbook Pro 13インチ（2014Mid）
Dell P2421DC 24インチディスプレイ 解像度2560x1440 60hz ※Thunderbolt2接続
iiyama 24インチフルHDディスプレイ 解像度1920x1080 60hz × 2（with StarTech.com　USB32DP24K60） ※ディスプレイHDMI→DisplayPort変換アダプタを2つ買いました

上記の構成でクラムシェルモードでトリプルディスプレイ環境、Macbook開くとクアドラプル環境で落ち着きました。
動作は3画面ともキビキビしていて快適です。USB3.0で大丈夫か？と思ってたけど、全然問題なかった。
ゲームとか画面描画すごいものは試していないのであしからず。

なお、ディスプレイは三台とも横置きで横並びです。
このときの横幅のサイズは150cmくらいです。机が110cmなので横にはみ出てます。
なにはともあれ、できてよかった…。
Macbook Pro 13インチでトリプルディスプレイ以上の環境にする場合には、みなさんも追加課金が必要にならないように気をつけてください。

# まとめ
+ 3画面以上使うならMacbook Pro 16インチモデルのほうがいいぞ
+ リフレッシュレート60hzは必須だ！お兄さんとの約束だぞ！
+ 27インチで4Kは使えたもんじゃないとかいうレビューあったけど、使えたもんじゃねーな！ベストは27インチ2560。24インチ2560も普通に快適に使えるぞ！
+ Dellさん、この価格でケーブルと上下可能なディスプレイスタンドつくとかマジですか？コスパ良すぎ！課金したからサービスして！
なんでバリデーションかかってないの！？(unique:true編)

いやーね。
私本当にびっくらこきましたよ。
今ねrails5.2でフリマアプリ実装中なんですよ。:frowning2:
バリデーションみんなかけるよね？
うんわかってるよ。
みんなアタイとおんなじ気持ちだよね。:girl_tone2:
アタイわかってる。
まずね。
バリデーションはモデルとマイグレーションファイルどっちにも書いた方が良いみたいなんだけど、
今回はマイグレーションファイルの方に関してだから、モデルの方のバリデーションに関しては他の方の記事を参考にすると良いわ。


#1.最初に見て欲しいのはコレっ！
:writing_hand_tone1:

```ruby:db/migrate/create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :first_name,         null:false ,unique: true
      t.string :last_name,          null:false ,unique: true
}
```

こんな感じでね。
さーいくわよ！
#2.レッツ 
:point_down_tone1:

```ターミナル:コンソール
 rails db:migrate
```

そしたらさ。
:raised_hand:

```ruby:db/migrate/schema.rb
 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "first_name", null: false
    t.string "last_name", null: false
}
```

##ズゴーーーーーーーー！！
:man_tone1:
null:falseはバリデーションかかってるのに、unique:trueかかってないっての！！！
なんでよ。。。アタイこんなエラーカリキュラムで習ってないわよ。
あーもうしんどいジャパン。

そんな時はこれ！！

mysqlの方を見に行っちゃおうってわけ。

※今日はちょっとめんどくさがっちゃうから省略するわ。

要するにDBの方にもバリデーションかかってないのよ。

もうしんどいアメリカ！！！
もう調べてやるわ。。。



#3・・・・・数分後・・・・・・・

アタイこんなの見つけたわ。

[Railsドキュメント](https://railsdoc.com/migration)

それによると。。。

```
 add_index :users, [:name], unique: true
```

本当かよ！！！初耳なんですけど！
え！？初耳なんですけど！！

信じてないよ？え？信じてないよ？
そんな簡単に上手くいくわけないじゃない


```ruby:db/migrate/schema.rb
 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.string "first_name", null: false
  t.string "last_name", null: false
  t.index ["first_name"], name: "index_users_on_first_name", unique: true
  t.index ["last_name"], name: "index_users_on_last_name", unique: true
}
```


##いやホンマやないかい！！！
:clap_tone1:
そんなことありえるんですね。
皆さんに僕と同じ状況になる人がいるのかわかりませんが、参考になりますyou:frowning2:に！！！

ではまた。
各種 OS で入る make バージョンをまとめた

## GNU Make 各種環境のバージョン一覧表

様々な環境で GNU Make をインストールすると、どのバージョンが入るのか？ 一覧にまとめました。

古い OS を考慮しないといけない場合は、3.81 で動作確認したほうがよさそうです。

| OS | インストール元 | バージョン | 調査日 [^1] |
|---|---|---|---|
| CentOS 6 | yum [^2] | 3.81 | 2020/06/08 |
| CentOS 7 | yum [^2] | 3.82 | 2020/06/08 |
| CentOS 8 | yum [^2] | 4.2.1 | 2020/06/08 |
| Ubuntu 14.04 | apt [^3] | 3.81 | 2020/06/08 |
| Ubuntu 16.04 | apt [^3] | 4.1 | 2020/06/08 |
| Ubuntu 18.04 | apt [^3] | 4.1 | 2020/06/08 |
| Ubuntu 20.04 | apt [^3] | 4.2.1 | 2020/06/08 |
| Apline 3.9 | apk [^4] | 4.2.1 | 2020/06/08 |
| Apline 3.10 | apk [^4] | 4.2.1 | 2020/06/08 |
| Apline 3.11 | apk [^4] | 4.2.1 | 2020/06/08 |
| Apline 3.12 | apk [^4] | 4.3 | 2020/06/08 |
| Windows | [GnuWin32](http://gnuwin32.sourceforge.net/packages/make.htm) [^5] | 3.81 | 2020/06/08 |
| Windows | [MinGW](http://www.mingw.org/) [^6] | 3.82.90 | 2020/06/08 |
| Windows | [MSYS2](https://www.msys2.org/) [^7] | 4.3 | 2020/06/08 |
| Windows | [Chocolatey](https://chocolatey.org/) [^8] | 4.3 | 2020/06/08 |
| macOS | [Homebrew](https://brew.sh/index_ja) [^9] | 4.3 | 2020/06/08 |
| macOS | Xcode [^10] | 3.81 | - |




[^1]: 調査日の時点での最新版です。より新しいバージョンに更新されているときはコメントか編集リクエストで教えてください。
[^2]: `yum update; yum install make` でインストール
[^3]: `apt update; apt install make` でインストール
[^4]: `apk update; apk add make` でインストール
[^5]: [URL](http://gnuwin32.sourceforge.net/downlinks/make.php) から make-3.81.exe をダウンロードしてインストール
[^6]: [URL](http://www.mingw.org/) から mingw-get-setup.exe をダウンロードしてインストール。その後 `mingw-get update; mingw-get install mingw32-make` でインストール
[^7]: [URL](https://www.msys2.org/) から msys2-x86_64-20200602.exe をダウンロードしてインストール。その後 `pacman -Syy; pacman -S make` でインストール
[^8]: [URL](https://chocolatey.org/install) に書かれた手順でインストール。その後 `choco install make` でインストール
[^9]: macOS 持ってないので [Homebrew Formulae: make](https://formulae.brew.sh/formula/make#default) から確認
[^10]: macOS 持ってないので https://qiita.com/rkunihiro/items/a882e8d4df66413c2cc9 等の web 上の記述から確認
Ruby技術者認定試験silver　合格

Ruby技術者認定試験silverを受けて、無事に合格したので
どんなことをして合格に至ったかの経緯をつらつら書いていこうと思う。

**受験日：2020/6/8**
**点数：88点（合格点　75点以上）**
**勉強時間：約120時間（土日含めて）**
**勉強期間：３週間**
**受験費：￥16,500**

#前提
・Ruby　開発経験２ヶ月、Paiza：Bランク
・Rails　スクールで個人アプリ作成
・Java　業務経験半年くらい


#使用した教材
####Webサイト
>基礎問題やRuby技術者認定試験（Silver）対策問題がある　基礎合わすと１００問以上（意外と解説がしっかり書いてある）
[ミニツク - Rubyのe-ラーニング研修システム](http://www.minituku.net/)
　
>160問くらいがランダムで５０問出てくる（Gold用の問題もある）
[REx - Ruby Examination](https://rex.libertyfish.co.jp/)
　
>簡単な解説付き模擬問題　５０問
[github模擬問題(Silver試験用)](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)



####書籍
[Ruby技術者認定試験合格教本改訂2版　Silver／Gold対応　（Ruby公式資格教科書）](https://books.rakuten.co.jp/rb/15068165/)
Silverだと演習問題３０問、模擬問題５０問がある
![9784774191942.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349277/6e757acc-53a1-9229-71b5-b4e2b02da9cd.jpeg)


####実行環境
>スキルチェックでRubyを選択　実行結果確認用※Rubyのバージョン違うからちょい注意！
[ITエンジニア・プログラマ専門の総合求職・学習サイト【paiza（パイザ）】](https://paiza.io/ja/projects/new)

####ツール
>コードの実行結果の保存、大事なことメモ用
[最高のメモアプリ - Evernote で大切なノートを整理](https://evernote.com/intl/jp)


#やったこと
###合格記や体験記をひたすら調べる
大体の勉強時間や期間、教材、勉強法など
できるだけ多くの情報を調べる（なるべく新しめの方がいい）
勉強時間に関してはかなりバラバラなので参考にはならないかも、、、
合格記だけでなく落ちた人の記事も見るべき
どんな問題だったか時々書いてあったりする
　
###自分の現状レベルの把握
github模擬問題とRExの問題を１回ずつ実施、何点取れるかを確認する
点数によってこの２つを何回実施してどれくらいまでに９６〜１００％とれるかある程度目標を立てる
因みに自分は２つとも３、４回ずつ実施したらそれくらいになった。
時間にして５０問解くのに大体１時間かかる
　
###目標設定、実施
以下が自分が設定した目標と実施内容です。


```terminal:
１、x月x日までにgithub模擬問題とRExの問題 => 正解率９6〜１００％
２、x月x日までにミニツク問題 => 正解率９6〜１００％
３、x月x日に書籍模擬問題、演習問題に実施
4、x月x日までに書籍１回目全読
５、x月x日に書籍模擬問題、演習問題に実施
６、５が正解率９6〜１００％になるまで４と５繰り返し
７、今までやった問題を全部やってみて何故正解なのか説明できるようになる
８、あとはひたすら本を読む
```


#勉強方法
ここからはかなり個人的なので、すっ飛ばしたい方はすっ飛ばして
準備中
　
#感想
正直、受ける前まで心臓バクバクで前日はソワソワで眠れませんでした、、
この感覚は他の人にも聞きたいんですが最後、試験で終了ボタンを押す時めちゃめちゃ怖くないっすか？w
試験を受けるなんて久々だったのでホントに受かっていて良かったです。

試験は３６問正解していれば合格なんですが、自分が数えた時、確実に合っている問題が３７問で
あとの１３問がちょい自信ないけど多分合ってるかなという状況でした。
試験は９０分ありましたが自分は３回見直し、それでも１０分くらい余りました。
ただ見直しは絶対やった方がいいと思いました。実際、見直しのおかげで
絶対合ってるだろうと思っていた問題から１問、選択ミスを見つけ修正することができました。

演習問題や模擬問題をやってわかりましたが引っかかりやすい問題はちょいちょいあります。
特に破壊的なメソッド、非破壊的なメソッドは明確にしておくべきだと思いました。

#良かった点
**書籍購入**
一番はやはり書籍を購入したことです。
Webだけで勉強した人の記事も多くありましたが、Webだけだと部分的に覚えがちなのと
覚えることに対して確実性が乏しいということです。
時間があればいいと思うんですけど、検索する時間が多くなると覚える時間がなくなって
かえって非効率です。書籍は３９６０円でしたが受験費が鬼高いので
個人的には書籍購入が無難な気がします。
それにうる覚えですが自分の回の試験ではこの書籍から同じような問題が１６、７問は出ていました。


**Paiza**
もう１つはPaizaを実行環境に選んだことです。
いちいちファイルを作成しなくていいし実行もボタンを押すだけなので
かなり時間短縮に繋がったと思います。そのスピード感のおかげでメソッドの特性や
できないこと（エラーになる）が明確になり、より理解度が高まったと思います。
勉強終盤、結構自分が間違えて理解してることがあったりして、それに気づけるのが
かなり収穫でした。実行環境を整える必要がないのでオススメです。



#改善点と締め
**勉強法の改善**
付箋を使った勉強法を実施したが、単色ではなく３色くらいの付箋を使用した方が
もっと記憶しやすかった気がする。自分にとってSilverの範囲だけでも
かなり覚えることがあってメソッドの種類や処理などを覚えるのに苦戦した。
でも何回もノートを見直してると、だんだん画で記憶できるようになり
終盤はかなりスムーズに暗記をすることができた。
なので今度Goldの勉強をする際はクラス等で色分けをして、効率UPを測っていきたい。

**首が、、、**
勉強の終盤は書籍が活躍してくるが、自分は本を読む時の姿勢が悪いせいで後半、
首が尋常じゃないくらい痛くなった。そのせいで上手く寝付けなかったり
業務中も痛みで集中できなかったりして、かなり効率が下がったと思う。
また体調が悪いと休日の勉強し始める時間がかなり遅くなる。（←当たり前w）
今までしっかり勉強してこなかったからだけど体調管理はホント大切にしましょうw
次に勉強する時はお湯にしっかり浸かって寝る時はサロンパスを貼って寝ます！！

　
最後どうでもいい情報でしたけど
時間できたら間違えやすい問題だったり、自分がハマった問題をまとめようと思います。
Gold受かったらまた報告します。
それでは！
skipとpendingは何が違うのか?【RSpec】

どちらもテストを保留にするためのメソッドですが、挙動が違うようです。

##### skipの特徴
* exampleが実行されない。

##### pendingの特徴
* exampleが実行される。
* exampleが失敗しても、pending(保留中)と表示される。
* 反対にexampleが成功すると、failになる。

問題を調査してるときは、問題が解決してテストが通ると失敗して知らせてくれるので、pendingの方がよさそうです。

#### その他のテストを保留にするメソッドについて

```ruby
xit "足し算" do
  expect(1 + 1).to eq 2
end

xdescribe "#nil?" do
  xexample "nilであること" do
    expect(nil).to be_nil
  end
end
```

xitやxdescribe、xexampleなどはskipと同じ挙動です。


## さいごに

筆者はプログラミングを学習し始めたばかりの初心者です。間違いがあれば指摘してくださると幸いです。
いまさらREST

# REST とは
**RE**presentational **S**tate **T**ransfer の略です。
システムのアーキテクチャを構成するための設計原則です。

# リソース
リソースはRESTを理解するうえでの大切な概念です。

リソースとは、

* ウェブ上に存在する情報
* URIによって一意に決まる
* 複数のURIを持つことがある

一例ですが、ウェブ上に存在する天気情報などがそれにあたります。
架空ので天気に関する情報を、教えてくれるAPIがあるとします。今日が2020/06/08だとします。

```
https://kakutenki/today
https://kakutenki/20200608
```

上記の二つのURIに対してGETメソッドでアクセスします。どちらのURIで2020/06/08のお天気情報にアクセスしたとしても、2020/06/08のお天気が帰ってきます。つまり、それぞれのURIがウェブ上に存在する情報に一意にアクセスしています。

# ROA
**R**esource **O**riented **A**rchitecture の略です。
ROAに関しては[こちら](https://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c)の記事が非常に参考になりました。詳細は記事を確認して欲しいのですが、すごく簡単に説明すると、リソースを中心に考えるアーキテクチャです。以下の特徴を持っています。

* アドレス可能性
URIによってリソースを一意に特定できる性質のこと

* ステートレス性
サーバー側では状態の管理を行わない。Cookie 等によるセッション管理なども行わない。

* 接続性
リソースがリンクによって繋がっていること。

* 統一インタフェース
リソースに対する操作を限定したインタフェース。RESTにおいてはHTTPメソッドがそれに当たる。

# REST の定義
REST は2000年に、Roy T. Fielding さんの[博士論文](https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)の中で定義されたました。６つの原則を掲げています。

* クライアント・サーバー
* ステートレス
* キャッシュ
* 統一インタフェース
* 階層化インタフェース
* コード・オン・デマンド

# REST vs RESTful
REST と RESTful は、しばしば同じものとして扱われている記事を目にしますが、筆者は別物だと考えています。

REST はあくまで設計原則です。名詞です。

RESTful は形容詞です。つまり何かの名詞と組み合わせて使います。よくある組み合わせとして RESTful API を見かけます（これしか知らない...）。つまり、RESTで定義されている設計原則にしたがって構築されたAPIという意味になります。たまに、REST API も見かけますが、これは複合名詞にしているので、相違意味では、REST と RESTful は同義だと言えるかもしれません。

ただ、筆者が留意したいのは、RESTは設計原則であり、RESTfulは設計原則にしたがって作った何かというものです。細かいですが、RESTfulという表現は大切だと思います。よなぜなら世の中のほとんどのRESTっぽいアーキテクチャであり、それぞれが必要に応じて柔軟にアーキテクチャを修正しているからです。

# 参考
https://qiita.com/aosho235/items/125af74e2eab66c7a816
https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2
https://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c
[Webを支える技術](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%EF%BC%8CURI%EF%BC%8CHTML%EF%BC%8C%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus-ebook/dp/B07JK7FZH2/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=30ZT3I2UDRY5P&dchild=1&keywords=web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93&qid=1591617270&s=computers&sprefix=web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%2Ccomputers%2C122&sr=8-1)
docker環境で遊ぶ！

linuxコマンドを復習、学習したい！と言うところでdockerでubuntu環境を構築したのですが、
何度も使っているとコンテナがいっぱい溜まっていくのは鬱陶しいですよね。

## docker環境での遊び方
```
$ docker run -it --rm [イメージ名]
$ docker run -it --rm ubuntu:18.04
```
`-rm`オプションを使うことでコンテナ終了時にコンテナを自動に削除してくれます。
RasberryPiに固定IPを割り当ててnginxでWebサーバーを立てるまで

## はじめに
何番煎じかわかりませんが、RasberryPiに固定IPを割り当ててみたのでメモ。
せっかくなのでついでにnginxインストールしてサーバー立ててみました。
LAN内からのアクセスのみを想定しています。

##環境
Windows10
RasberryPi 3b+(raspbian 8.0)

##省略部分
RasberryPiのセットアップ(OSインストール,日本語化,SSHの設定,セキュリティなど)

##実装してみる

###RasberryPiに固定IPアドレスを割り当てる

一般的な家庭環境を考えると、おそらくRasberryPiはルーターのDHCP機能により自動的にIPアドレスが割り当たっているかと思います。
ただそれではラズパイ上にサーバーを立てたときに毎回アクセスするIPアドレスが変わってしまうので、固定IPを設定します。

まずラズパイの現在のネットワークの設定を確認します。

ターミナル上で`ifconfig`のコマンドを叩くと、以下のような情報が表示されます。

```
eth0      Link encap:Ethernet  HWaddr **:**:**:**:**:**  
          /****(略)****/
lo        Link encap:Local Loopback  
          /****(略)****/
wlan0     Link encap:Ethernet  HWaddr **:**:**:**:**:**  
          /****(略)****/
```
内容省略していますがIPアドレスはNIC(NetworkInterfaceCard)ごとに登録されるため
有線(**eth0**)、無線(**wlan0**)ともにIPアドレスが割り当てられます。

loの項目に関してはLoopbackAddress(127.0.0.1)です。
自分自身を表すIPアドレスとなっています。

今回のWebサーバーは無線接続した状態で実装したいと思うので`wlan0`のIPアドレスを固定化します。

次にターミナル上で`vim /etc/dhcpcd.conf`と叩き、設定ファイルを編集します。
ファイルの一番下までいき、以下の内容を追記します。

```
interface wlan0
static ip_address=192.168.11.**/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
```

となみにこの`ip_address`はルーターがDHCPで割り当てられるIPアドレス範囲から外す必要があります。
DHCPで割り当てられる範囲の確認方法に関しては、ルーターのメーカーごとに異なるのですが

**※Buffaloの場合**
ブラウザで`192.168.11.1`と入力し、アクセスするとルーターの設定画面のログインページに飛びます。
パスワードは機種ごとによって異なるので、[Buffaloのホームページ](https://www.buffalo.jp/support/faq/detail/15793.html)などを参照してください。

設定画面へ遷移すると、LANの設定画面に以下のようなものがあります。
![ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/ad2ce612-895e-d3bb-4cf3-7a10614b2a44.png)

ここから割り当てIPアドレスの範囲が分かるので、その範囲を外したIPアドレスに設定してあげます。
ルーターによっては手動割り当て機能があるので、それを使うのが一番早いかもしれませんね。

`/etc/dhcpcd.conf`の設定が完了したら一度rebootします。
reboot完了後に`ifconfig`を叩くと、**wlan0**のIPアドレスの値が先ほど登録したものになっているかと思います。

###nginxインストール

せっかく固定IPを割り当てたのでサーバーでも立ててみたいと思います。
まずはnginxをインストールしていきます。
以下のコマンドを叩きnginxをインストールしましょう。

```apt-get install nginx```

完了したら以下のコマンドでnginxをスタートさせます。
`sudo service nginx start`

nginxが立ち上がっているか確認するため、ブラウザを立ち上げ前回RasberryPiに設定したIPアドレスを上部のアドレスバーに入力しましょう。
以下のようなnginxのサンプル画面が表示されればサーバーが正しく立ち上がっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/a64157ed-1f5a-3ece-6482-8de32951c487.png)


## まとめ
RasberryPiに固定IPを割り当てる方法について記載しました。
ルーターのDHCPの範囲などはあまり記載してる記事がなかったようにも感じるので参考になれば幸いです。
ひとりGit　仕組みと導入編

#プロローグ
テキスト単位で色々資料を作成していると思ったより散らかってきたので、もしやこれはついに「バージョン管理」というやつの出番なのではと閃きました。
自分はSubversionぐらいしか使ったことがないのですが、勉強を兼ねてGitを一人で使ってみたいと思います。

#Gitの仕組み
まず、Gitについて仕組みを理解しておきます。
PCとサーバで構築する場合の構成です。
<img width="1050" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/fbafd517-ba39-0e32-dc0b-3bb7b08edddf.png">

ちなみに今回は、サーバはなしにして、PC内にremoteリポジトリを構築して、PC一台でGitを構成したいと思います。

#導入
Gitを導入していきます。
なお、OSはWindows10 homeです。

[ここ](https://git-scm.com/downloads)からGitのインストーラをダウンロードします。
<img width="752" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/31ed71ac-d1f5-c3a9-9929-91ba7f0ff4dc.png">

ダウンロードしたexeを実行します
<img width="400" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/aa78377a-3462-8cc9-73b2-8afdd694f110.png">

よくわかってませんが、後からでも変更できそうなので、すべてデフォルトにしました。
<img width="250" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/e993301b-f294-446e-cfb6-6174ad59d59c.png">

<img width="250" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/b68bb63e-b8d3-5806-58cd-1d25b60be17d.png">

<img width="250" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/6167a44f-96e3-67ed-b8e5-fca5c7fbdef4.png">

<img width="250" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/24d5112a-d9f4-a3e4-89f8-c77982489491.png">

<img width="250" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/1a9c858a-9a47-5509-1b7f-6d07b5d0236b.png">

<img width="250" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/68190753-490f-f085-0d86-5e1d07a141f6.png">

<img width="250" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/6ba31a3c-32eb-499d-7bf6-6b2199ad5085.png">

これでGitがインストールできました。
<img width="754" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/e5fe8bab-b4db-0f27-a930-ee4f9c796afc.png">

確認しておきます

```
C:\Users\aaa>git --version
git version 2.27.0.windows.1
```

次回、実際にリポジトリなどを作成していきたいと思います。
Github Actionsを使ってansible-playbookを実行する

## 概要

Github Actionsを使ってbranchへのpush/PRでansible-playbookによるデプロイをフックする。SSH周りで結構ハマった。

## コード

```.github/workflows/main.yml
name: CI
on:
  push:
    branches: [ staging ]
  pull_request:
    branches: [ staging ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Run ansible playbook
      env:
        PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
      run: |
        mkdir -p ~/.ssh
        echo "$PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
        chmod 700 ~/.ssh/id_rsa
        eval $(ssh-agent -s)
        ssh-add ~/.ssh/id_rsa
        ssh-keyscan -p 22 -H "your.domain.com" >> ~/.ssh/known_hosts # 22の場合は明記しなくても良い
        cd ansible
        ansible-playbook -i hosts/staging site.yml --private-key ~/.ssh/id_rsa

```

## 手順

ansibleファイルはリポジトリ中に以下のように定義されているとする。このリポジトリのstagingブランチへのpush/PRでフックする。

```
├──ansible
│   ├── ansible.cfg
│   ├── hosts
│   │   └── staging
│   ├── roles
│   │   └── deploy
│   │       └── tasks
│   │           └── main.yml
│   └── site.yml
├──... 
...
```

### `ssh-keygen`でキーペアを作成し配置

以下でキーペアを作成し、公開鍵をscpなりでデプロイ先のサーバーに配置する。

```bash
ssh-keygen -t rsa -b 4096 -m PEM
```

PEMで作成されてないと以下のエラーが出る。

```
Error loading key "/home/runner/.ssh/id_rsa": invalid format
```

既に作成してしまった場合は変換する。秘密鍵だけ変換すれば良い。

```bash
ssh-keygen -p -m PEM -f id_rsa
```


### リポジトリに秘密鍵を登録する。

リポジトリのsettingsからいける。権限がないと見れないので注意。詳しくは[ドキュメント](https://help.github.com/ja/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets)参照。
`.github/workflows/main.yml` から参照する環境変数名と合わせる。上のコードの場合は `PRIVATE_KEY` という名前で登録する。

### ブランチに`.github`以下をpush

`.github`以下のディレクトリ/ファイルを作成してpushする。上のコードの場合は以下を改変する必要がある。

- `your.domain.or.ip`を自分のサーバー or IPに変更する
- (SSHのポートを変更している場合は)`ssh-keyscan`のポートを変更する

Actionsの新しく作成から作っても良い。今回は手元で作成して`staging`ブランチにpushした。するとActionsから結果が見れる。

### 備考

- ansibleはもともとubuntu-latest(現時点で20.04)に入っているので動く。でもバージョン固定はした方がいいかもしれない。( [インストール済みパッケージ一覧](https://github.com/actions/virtual-environments/blob/master/images/linux/Ubuntu2004-README.md) )
- SSH周りでハマったときは一回自分でログインしてみると良い。環境変数名のタイポで結構ハマってたことが発覚した。
- [この記事](https://qiita.com/couzie/items/33d837d6f0dc049155cd)には鍵の改行を"\n"で置換していたが自分は必要なかった
- 手元で鍵を使ってログインできるが、CIではダメなときは`known_hosts`周りと考えられるのでansible-playbookのオプションで`--ssh-common-args="-o StrictHostKeyChecking=no"`とかを足すと良いかも([参考1](https://qiita.com/sonatard/items/6e0d9a1fe0f5f18486fc), [参考2](https://qiita.com/toshiro3/items/e380ac6c4e31e7588e19))
- [これ](https://kawasin73.hatenablog.com/entry/2019/09/28/145334)も参考になる