OmniAICreator/Qiita-1.07M huggingface dataset:
大学3年初心者プログラマ的よく使うショートカット

初投稿です。最近ショートカットを使う場面が増えてきたので個人的にまとめてみようと思います。
使用環境はwindows10でPCはLet'snoteです。

##よく使うやつ
|            | 入力　　　　| 補足　|
|:-----------|------------:|:----------|
| コピー     |  [Ctrl]+C  |        　　|
| 貼り付け   |　[Ctrl]+V  |   　　　　　|
| 保存       |  [Ctrl]+S |　　　　　　　|
| 全選択      | [Ctrl]+A | [Shift]+矢印キーで部分選択できる|  
| 一つ戻る    |  [Ctrl]+Z | 　　　　　　| 
| 繰り返し    |  [Ctrl]+Y | [Ctrl]+Zで戻りすぎた時にも使える|　
| 検索　　　　|[Ctrl]+F|　　　　　　　　　|

##忘れがちなやつ
結構使うけど必要な時に思い出せないものをまとめておく。

| やりたいこと   　　　| 状況　　　             | 入力　                     |
|:----------------|:-----------------------|:----------------------------|
|貼り付け          | コマンドプロンプトなど |[Shift]+Ins(右上らへんのやつ)|
|入力補完          |コマンドプロンプトなど |ある程度入力した後[Tab]|
|文字の一斉置換    | Eclipse               | [Alt]+[Shift]+R             |
|新規タブ           |ブラウザ           　　|[Ctrl]+T                    | 
|任意のタブ選択　　　|ブラウザ　　　　　　　|[Ctrl]+数字 , [Ctrl]+[Tab]  |
|ウィンドウ移動     |いつでも                |[Ctrl]+[win]+矢印キー(→or←) |
|ウィンドウ確認     |いつでも                |[win]+[Tab]|
|スクリーンショット  |いつでも              |[Fn]+F12(PrtSc)              |
|画面キャプチャ     |いつでも               | [win]+[Shift]+S            |
|すべて最小化　　　　|デスクトップを表示したい時|[win]+D             |

###最後に
めぼしいショートカットが見つかれば随時更新していく。
[小ネタ]特定のcssを読み込みたい

たとえば、`app/assets/stylesheets/util/color.css.scss`というファイルがあったとして、それを(`application.css.scss`など)別のscssから読み込みたいときは、こうする。

```:app/assets/stylesheets/application.css.scss
// = require util/color

/* 
 * こちらも可
 * = require util/color
 * /
```
Datadogの課金体系について

datadogを利用しているのですが、課金体系がいまいち理解できていなかったので、機能の復習もこめて整理を。
※英語しかなかったので・・・
※2019/06/26 現在の情報です
⇒ https://www.datadoghq.com/pricing/ 
※分からない場合はサポートに問合せ・・・

# 課金対象

* Infrastracture<br>
⇒いわゆるインフラ監視
* APM(Application Performance Monitoring)<br>
⇒アプリケーションの可視化(スループットやレイテンシ等のパフォーマンストレース)
* Log Management<br>
⇒ログ管理・解析
* Synthetics(外形監視)<br>
⇒API Test / Brower Testをして応答コードや応答時間を監視

## Infrastructure

ライセンス種類によって提供機能が異なります。

### Free
* $0
* 基本的なデータ収集と可視化
* サポートはコミュニティフォーラムのみ
* メトリクス(モニタリングデータ)の保持は1日
* 最大5ホスト

### Pro

* 月額1ホスト：\$18 ※年間契約で$15/月
* システムとサービスの監視を集中管理
* 300以上のコミュニティ インテグレーションの利用<br>
⇒MWにあったデータ収集(プラグイン的な)
* カスタマイズ可能なダッシュボード
* メトリクス(モニタリングデータ)の保持は15ヶ月

### Enterprise

* 月額1ホスト：\$27 ※年間契約で$23/月<br>
※100ホスト以上から<br>
※500ホスト以上からボリュームディスカウント
* 高度な機能と統制管理
* 機械学習ベースのアラート発報
* ライブプロセス<br>
⇒プロセス状況のリアルタイム可視化
* プレミアムサポート

### 機能一覧

|#                    | Free | Pro | Enterprise |
|---------------------|:---:|:---:|:---:|
|イベントと基本的なメトリクス|最大5ホスト|○|○|
|すぐに使えるダッシュボード|○|○|○|
|300以上のインテグレーション|○|○|○|
|ホストとコンテナのマップ|○|○|○|
|エンタープライズレベルのセキュリティ|○|○|○|
|無制限のユーザアカウント数|○|○|○|
|モニタリングデータの保持期間|1日|15ヶ月|15ヶ月<br>(カスタマイズ可能)|
|アラート発報|×|無制限|無制限|
|コンテナ監視|×|10コンテナ/ホスト|20コンテナ/ホスト<br>(カスタマイズ可能)|
|カスタムメトリクス|×|100個/ホスト|200個/ホスト<br>(カスタマイズ可能)|
|SAMLでのSSO|×|○|○|
|外れ値の検知(異常値検出機能)|×|○|○|
|watchdog<br>※AIベースの課題自動検出|×|×|○|
|異常の検出|×|×|○|
|予測モニタリング|×|×|○|
|プロセスのリアルタイム監視|×|×|○|
|高度な管理ツール|×|×|○|
|※サービスとサポート|Free|Pro|Enterprise|
|コミュニティフォーラム<br>オンラインドキュメント|○|○|○|
|トレーニングビデオ|○|○|○|
|技術サポート|×|チャット、メール|チャット、メール、電話|
|技術研修？|×|×|○|


## APM(Application Performance Monitoring)

### APMと分散トレーシング(月額制)
* 1ホスト単位：\$36 ※年間契約で\$31/月
* 1ホストあたり100万APMイベント(トレース検索と解析)を含む

### トレース検索と解析(追加分、月額制)
* 1ホスト単位、100万APMイベント毎：\$1.52 ※年間契約で$1.27

### 基本機能
* マイクロサービス、ホスト、コンテナに渡る分散トレーシング
* 各サービスのエンドポイント、データベースクエリのスループット、待ち時間、エラーを可視化できるダッシュボード
* 対応言語：Java / Ruby / Python / Go / Node など
* アプリケーション、インフラ、およびカスタムメトリクスのカスタマイズ可能なダッシュボード、アラートを一元管理
* コンテナID、ホスト、ユーザID、トランザクション値、顧客ID、製品のメタデータでトレースし、自動的にタグ付け
* タグを使用した、特定のAPMイベント(リクエスト)検索
* カーディナリティ検索
* インフラ、ログとのシームレスな解析、検索
* 技術サポート(チャットとメール)

## Log Management

### 月額制(月 100万ログイベント)

* 7日間保持：\$1.52 ※年間契約で$1.27/月
* 15日間保持：\$2.04 ※年間契約で$1.70/月
* 30日間保持：\$3.00 ※年間契約で$2.50/月

### 基本機能
* 多面的な全文検索
* 50以上のインテグレーション
* カスタムされた処理とパーサ
* ログ分析とダッシュボード
* リアルタイムの警告・発報
* 制限無しでのログ記録(但し$+0.10/GB)
* AWS S3へのログアーカイブ
* 技術サポート(チャットとメール)

## Synthetics(外形監視)

### APIテスト
* 月額10,000テスト実行：\$6 ※年間契約で$5/月
* サイトの可用性を予防的に監視<br>
⇒MTTRの短縮
* SLA/SLOの監視
* ロケーションとhttp request methodの選択

### ブラウザテスト
* 月額1,000テスト実行：\$15 ※年間契約で$12/月
* ブラウザによるテストケース作成(Webレコーダー)
* スクリーンショット取得

### 基本機能
* サイトの稼働時間と、待ち時間をトレース
* グローバルなパフォーマンス監視
* DNS、SSL、TTFBなどの待ち時間の表示
* 技術サポート(チャットとメール)

# 概算

6 ホスト (LBx2 / Webx2 / DBx2)

* Infrastructure(Pro)：6 * \$18 = $108(￥11,500)/月
* APM：6 * \$36 = \$216(￥23,100)/月
* Log：6 * \$1.52 = \$9.12(￥975)/月<br>
⇒ 1 ホスト 1M / 月
* Synthetics(API)：(60 min * 24 hour * 30 day) / 10,000 * \$6 = \$25.92(￥2,770)<br>
⇒ 1分毎(ロケーション毎の課金か？)
* Synthetics(Browser)：(60 min * 24 hour * 30 day) / 1,000 * \$15 = \$648(￥69,300)

お値段だけみると監視にこの値段は・・・
と思いますが、この機能を実装に対するリソース(サーバやNW)、構築工数、時間を考えるとお値段以上ですかね。
トライアルを有効活用して本番導入をご検討ください。
商品投稿するときのファイル送信フォームをアイコンにする方法

##実行環境

- html(今回、slimで書いています）
- scss

##行いたいこと
このUIから...
<img width="260" alt="スクリーンショット 2019-07-04 00.23.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438198/888a66b2-11b2-1a03-6837-8f7ebf6e356c.png">

こっちのUIみたいに装飾をして使いやすくしたい。
(グレーのところどこ押しても反応する）
<img width="830" alt="スクリーンショット 2019-07-04 00.22.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438198/78032e0c-0e65-639e-66e3-af67b824ffb8.png">

##実際にしたこと

```ruby:example.html.slim
.service_page_r_form_image
  = f.label :image
     i.far.fa-file-image
  = f.file_field :image
  small 写真を１枚アップロードしてください。
```

html（slim)ではlabelとinput(file_field)を記述しています。

```ruby:example.scss
&_image{
	height: 300px;
	label{
		 position: relative;
		 display: flex;
		 justify-content: center;
		 align-items: center;
		 height: 300px;
		 width: 100%;
		 background-color: #D3D3D3;
		 cursor: pointer;
		
		input{
		    display: none;
		}
      }
    }
```
すごく長々と書いていますが、やるべきことはinput(file_field)を**display: none;**して隠すことです。
隠しても、labelと紐づいているので、labelの部分を押せばinputの挙動が発動します。
あとはlabelの部分を自分の好みのように記述していけば、完成します。


##まとめ
今回は、ファイル送信フォームの見た目の部分を装飾して改善をしました。
まだまだプレニュー表示など改善点はございますが、一旦はこれで以上になります。では。
Lorem Picsum　〜とりあえず画像が欲しいあなたへ〜

#Lorem Picsum とは？
Lorem Picsum はもともと[Unsplash](https://unsplash.com/)のサービスであったUnsplash it の名前が変わったサービスです。

簡単にいうと「**とりあえず**画像を入れる」ツールです。
僕はポートフォリオを作る際に「画像を入れたいがまだ決まってない」状態の時、空白のスペースではイメージがつかないのでこれを使っています。

これを使うことでみなさん大好きUnsplashの画像をサイズを指定するだけで引っ張ってこれます！！
##使い方
https://picsum.photos/

こちらがサイトのURLです。
__Easy to use, stylish placeholders__ 　の下に青地のURLがあるのコピー && ペースト

```
https://picsum.photos/200/300
```
```
https://picsum.photos/ 【横幅(px)】 / 【縦幅(px)】
```


実際のURLはこんな感じ（毎回、違う画像が出ます）

- https://picsum.photos/1000/1500
- https://picsum.photos/1300/500
- https://picsum.photos/600/600



これをHTMLのimgタグに入れることでダミー画像を挿入できます

```html
<img src="https://picsum.photos/1300/500" alt="">
```

## その他の機能
#####idを入れることで写真をUnsplashから直接選ぶ
https://picsum.photos/id/1032/2880/1800
これは１枚を選択するため毎回、同じ画像になります。
ちなみにこれはNASAが撮影した画像です。
詳しくは[**Specific Image**](https://picsum.photos/images)から
#####モノクロの写真
`?grayscale`
URLの一番後ろに繋げることでモノクロのみの指定ができます

- https://picsum.photos/1000/1500?grayscale
- https://picsum.photos/1300/500?grayscale
- https://picsum.photos/600/600?grayscale

クールな感じが良き

#####ぼやけた写真
`?blur` 
こちらはぼやけた写真に限定することができます。
ぼやけの強度を１〜１０まで指定できます。`?blur= ○`

- https://picsum.photos/1000/1500?blur
- https://picsum.photos/1300/500?blur=3
- https://picsum.photos/600/600?blur=10

ぼやけてるだけでオシャレ

#終わりに
今回はポートフォリオ作成に役立ちそうなツールを紹介しました。他にも何個か機能があったので興味があれば実際に使ってみてください。
また、ダミー文章を作る兄貴分的なサービスの[Lorem Ipsum](https://www.lipsum.com/)もあるので使ってみても面白いです。

これを読んだ皆さんも使ってみてください。
AWSについて調べてみた

##はじめに

こんにちは、かちゃあと申します。
Qiita2回目の投稿です。
まだまだ不慣れな事が多いですが、投稿をする事によって慣れていければと思っています。

今回調べたことは、AWSについてです。
就職活動をしている際に、AWSの技術を採用されている企業が多かったこともあり
より詳しく調べようと思ったきっかけになりました。
備忘録になりますがお付き合いください。

##AWSとは何か

AWSとはAmazon Web Servicesの略称で、`Amazonが提供するクラウドコンピューティングサービス。`
（AWSの他にはAzure（Microsoft）、CloudPlatform（Google）、Bluemix（IBM）などもある）
クラウドコンピューティングサービスとは、`ネットワーク経由でサーバーやデータベース、ソフトウェア、アプリケーションなどを利用者に提供しているもの`。


クラウドコンピューティングサービスは、主に３つに分類されています。

#クラウドサービス３つの分類

1: <b>SaaS（サース：Software as a Service）</b>
 インターネット上での、ソフトウェア機能の提供を行うサービス。

2: <b>PaaS（パース：Platform as a Service）</b>
 インターネット上での、アプリ実行のためのプラットフォーム機能の提供を行うサービス。

3: <b>IaaS（イアース：Infrastructure as a Service）</b>
　インターネット上での、インフラなどサーバー、ネットワークを提供してくれるサービス。 




##AWSを使うメリットとは？

AWSを使用するメリットは５つ挙げられています。以下1~5は公式サイトからの引用になります。



1:  <b>セキュリティと法規制の対応</b>

"AWSクラウドは、お客様がセキュリティに関する政府、業界、および企業の標準や規制を満たすことができる認証を取得、運用しています。
例えば、ISO 27001、SOC、PCI DSS などを含む、世界中のさまざまなセキュリティ標準の要件を満たしています。"

クラウドサーバーのセキュリティ面は様々な要件を満たしていて安心なのですね。


2: <b>お客様の声による新サービス提供と機能改善</b>

"３０００以上の新サービスの提供と機能改善に伴ってきたうちの９５パーセントはお客様のフィードバックをもとに開発されている。"

常に最新のクラウドを提供されているからこそ機能改善のサイクルも早く、より多くの人に満足に使っていただけるという事ですね。


3: <b>お客様への継続的な利益還元</b>

"2017年7月時点で 60 回以上サービスの値下げを行っており、ストレージサービスなど当初より 90%以上値下げされたサービスもあります。"

お客様を大切にしていて今後もお客様との関係を大切にしていきたいという気持ちの現れですね。


4: <b>グローバルビジネスを支える耐障害性と高可用性</b>

"AWSクラウドのグローバルインフラストラクチャは、耐障害性と高可用性を実現するために特殊な構成が組まれています。
一方の障害が他方へ影響することはなく、そのため耐障害性と高可用性を実現することができます。"

こちらは１と少し似ていますね。障害が起きたとしても、影響が少なく安心という事ですかね。

5: <b>ユーザー基盤とエコシステム</b>

"AWS クラウドは、全世界で数百万を超えるお客様（アクティブユーザー）にご利用いただいており、日本でもスタートアップから大手企業、政府・教育機関まで、10 万以上のお客様にご利用いただいています。
AWS のエコシステムを支える APN （Amazon Partner Network）パートナーには、日本全国で AWS を使ったシステム構築、ソフトウェア利用を支援する企業やシステムインテグレーターが参加しており、AWS クラウドを使ったサービスの提供やソフトウェア運用、システム構築についてご相談いただけます。"

これだけ世界、日本で多くの企業が導入していることから、AWSの規模の大きさが伺えます。
巨大なユーザー基盤を持っているからこそ得られる情報もそれだけ多いのでしょうし。ちなみにAPNは初めて知りました。


#AWSの代表的なサービス(一部)

1: <b>EC2</b>

EC2はサーバーを構築・運用できるサービス。
クラウド環境上で必要な時に必要なだけサーバーを柔軟に利用できます。


2: <b>RDS</b>

RDSは、データベース機能を利用できるサービス。
負荷を軽減できたり、自動バックアップや大規模なデータ構築や運用も可能のようです。


3: <b>S3</b>

システムの様々なデータを保存できるサービス。データを別のシステムやデータを分析処理に移すこともできるみたいです。
こちらのサービスが2006年3月14日にリリースされたのがAWSの始まりだったみたいですね。
今では通常時、１秒間に約１００万リクエストもの処理をしているそうです。凄い。。



#逆にデメリットは？

1:　機能の数が多く、使いこなすにはサービスに対する多様な知識が必要不可欠



2:　費用が一定ではない





#まとめ

AWSを利用することによって、ある企業の無駄を減らせたり、リスクを減らせたりするわけですね。
便利ではあるものの、サービスが多様な為、使いこなすのは決して簡単ではなさそう。
AWSについては今後確実に必要になる知識なので、サービスごとにしっかりとした勉強の時間が必要ですね。


#参考&引用元

参考、引用させていただきました。

https://capsulecloud.io/about/aws
https://udemy.benesse.co.jp/development/web/what-is-aws.html
http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/service/13.html
https://aws.amazon.com/jp/about-aws/
GCP(GCE)でハマる「無料」の罠

## 三行で概要紹介
無料で使えるf1-microのGCEインスタンスでWebアプリ（コンテナ）のデプロイに失敗
ハマったポイントはgradleのdeamonの起動（が、終わらない）
原因はおそらくインスタンスのパワー不足

## 用語の超ざっくり解説
-　**GCP: Google Cloud Platform**
　　　Googleが提供するクラウドサービス。競合はAWSとかAzureとか。
-　**GCE: Google Compute Engine**
　　　GCPのIaaS。VMインスタンス。AWSでいうEC2。
-　**GCS: Google Cloud Storage**
　　　GCPのオブジェクトストレージ。AWSでいうS3。
-　**Google Container Registry**
　　　GCPのDockerイメージのストレージ。AWSでいうAmazon Elastic Container Registry。

## 背景
SpringBootで作った簡単なWebアプリを公開して、色んな端末で使いたい
→　でも、できれば金はかけずに手軽にやりたいな・・・
→　お、GCPの一番安いVMインスタンスは実質ずっと無料で使えるやん。これや！
![gce_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147767/5268d737-f9a5-51ec-9b44-982bbf3825bb.png)
GCPの無料枠（抜粋）：https://cloud.google.com/free/docs/gcp-free-tier?hl=ja


## やったこと
せっかくGCPを使うのだから、アプリをコンテナ化してやってみた。
おおまかな手順は以下の通り。
1．アプリケーション開発。
2．アプリケーションのDockerイメージ作成。ローカルで動作確認。
3．GCPにアカウント登録。
4．ローカルのDockerイメージをGoogle Container Registryに登録。
5．登録したDockerイメージを紐付けてVMインスタンスを作成。
6．VMインスタンスを起動し、ブラウザでアプリが立ち上がっていることを確認。

※　4~6については、下記の参考で紹介している記事を参照。


## 参考：GCEにSpringBootアプリケーションをデプロイする方法
Google Container Engine (GKE) 使えやってツッコミも飛んできそうですが、
手軽にパパッとやるなら大きく2つの方法があるみたい。他にもあれば教えてください。

**１．GCSのバケットにjarを配置する方法**
　　　公式ドキュメントを参照。英語やけど。
　　　[Run a Spring Boot application on Google Compute Engine](https://cloud.google.com/community/tutorials/kotlin-springboot-compute-engine)

**２．VMインスタンス作成時にDockerイメージを紐づける方法**
　　　DockerイメージはGoogle Container RegistryやDockerHubなどから指定する。
　　　Google Container Registryは有料だけど、数円レベルなので許容した。
　　　公式ドキュメントも大変分かりやすかったが、こちらがまとまっていて一番参考になった。
　　　[dockerイメージを GCE で起動する方法](https://qiita.com/na59ri/items/c540d9d16a1fc1c5a9c4)
　　　↑　ローカルからGoogle Container Registryへアップするところから説明してくれています。


## そして、ハマる
前置きが長くなりました。
私は当初の思惑通り、一番安い（というか無料の）f1-micro（vCPU x 1、メモリ 0.6 GB）インスタンスを作成していたのですが、アプリが立ち上がらなくてハマりました。
※ GCPの初期登録時に一年間使える3万円くらいのクレジットをもらえましたが、一年後以降のことも考えて無料のインスタンスを選択しました。

ログをみてる感じは正常そうなんですが、一向にGradleのデーモンが立ち上がってくれません。

![log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147767/ccedb2d6-88e0-d2b4-ade7-b93f284f8eb0.png)
何度か再起動させてみたり、インスタンス作り直したり、２日待ってみたりしたが、結局ここから進むことはなく・・・


## ・・・で、どうしたか
すみません、結局、根本的な原因は分かりませんでした。

ただ、以下の2点から、単純にf1-microインスタンスのパワー不足としか思えませんでした。
　-　f1-microインスタンスのCPU利用率が常に100％近く(下記のグラフ参照）
　-　比較用にn1-standard-2（vCPU x 2、メモリ 7.5 GB）を作成したが、同様の問題は発生せず。
　（※ブラウザでもアプリケーションが動いていることを確認できました。）

![cpu_log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147767/f317b1de-d5cd-ce57-1181-defdfdcc4fa1.png)
※ instance-3はn1-standard-2インスタンスです。見やすさのためグラフを非表示にしてます。


## 所感
SpringBootの簡単なアプリケーションですら、起動できないのは予想外でした。
「インスタンス「f1micro1cpu-614mb」は過剰に使われています。次のマシンタイプへの切り替えを検討してください: g1-small（vCPU x 1、メモリ 1.7 GB）。」なんてメッセージすら届きました。
無料にこだわったばかりにかなり多くの時間を費やしてしまいました。素直にJarでやれば良かったです。
とはいえ、初めてGCPだけでなくDockerも初めて触ったのでいい経験にはなりました。
かなりレアなケースかと思いますが、同じようにハマった方の参考になれば幸いです。
【Rails】 新規アプリケーション作成時の手順と設定

## 目的

忘れがちなのでまとめる。内容は学習の都度随時更新する。

## 1.アプリケーションの作成

ターミナルで`rails new`コマンドを実行することで、アプリケーションのディレクトリとファイルを新規作成できる。

例：rails バージョン5.0.7.2で開発、MySQLでデータベース管理を行うアプリケーションを作成する場合

```
$  rails _5.0.7.2_ new アプリケーション名 -d mysql   
```

## 2.データベースの作成
ターミナルで`rake db:create`コマンドを実行すると、config/database.ymlファイル内の記述内容に従って、データベースが作成される。

``` 
$  cd アプリケーション名               #作成するアプリケーションのディレクトリに移動
$  bundle exec rake db:create  　 #データベースを作成
```

rake db:createコマンドの前に`bundle exec`コマンドをつけているのは、複数のアプリケーションにバージョンが異なる同名のgemがある場合、rakeコマンドを実行するとコンフリクトエラーが生じるため。


##3.不要なファイルが作成されないように設定
rails gコマンドでコントローラを作成すると、同時にコントローラファイルに対応する各種ファイルが生成される。生成されないようにするには`config/apprication.rb`を編集する。

```config/apprication.rb

module PracticeSpace
  class Application < Rails::Application
    config.generators do |g|
      g.stylesheets false       #cssファイルの生成を行わない
      g.javascripts false	    #JavaScriptファイルの生成を行わない
      g.helper false		    #helperファイルの生成を行わない
      g.test_framework false    #テストファイルの生成を行わない
    end
  end
end
```

## 4.Gitのトラッキングの対象外とするファイルやディレクトリの指定
`.gitignore`でGitのトラッキングから外すファイルとディレクトリを指定する。

```sample/.gitignore

test/controllers/*  #test/controllersディレクトリ内のすべてのファイルとディレクトリを無視する
```

## 参考にした記事

[Railsドキュメント](http://railsdoc.com/)
[[Git] .gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)
イラストレーターがプログラミングを勉強しようとした話。【1話】

#はじめに
この記事は前回の
 [ノンプログラマーがプログラミングを勉強しようとした話。【前節】](https://qiita.com/NUKO_D/items/848f9084fffdc3468750)
続きです。
###タイトル変更しました
ノンプログラマーからイラストレーターが～にタイトルを変更しました。
理由としては、Qitaでノンプログラマーと検索すると。

- コードは書かないけれど上流で設計やっています
- 趣味でプログラムしています
- 基本的にエンジニアとやり取りするポジション（webアプリのディレクションとか）

と、結構知識がある前提で書かれている記事が多くて、僕としてはやっぱり調べ始めた時に引っかかった部分が払拭できないな～という理由。
あとはやはり、需要としては狭くなりますが、デザイナーとかイラストレーターが興味はあるけど取っ掛かりがない状態からの足がかりになればなと。

###最終的にこの記事を通して読んでもバリバリコードを書けるようにはならない。
これは [前回の記事](https://qiita.com/NUKO_D/items/848f9084fffdc3468750)で書いておけばよかったんですが、そもそも僕自身が、今バリバリコード書いて実装してますとかじゃないので、1週間でプログラマーになれるとかそういうハックではないです。
あと、セクションによってはデザイナーもシェーダー書いたりpythonでツールゴリゴリ作る人もいるのでそういう人向けではないです。
あくまでも、<font color="MediumVioletRed">興味はあるけど取っ掛かりがない。</font>とか<font color="MediumVioletRed">プラグラムと聞くとパソコン壊しそう</font>とかそういう人向けになってます。
あとは、エンジニアさんがデザイナーの思考というか、どこから説明すればいいかのヒントとか共通言語化ができればなと。

ではやっと次から本題に入って行きたいとと思います。また内容薄めになってらごめんなさい、多分今回はUnityとC＃少し……
#わからないことがわからない！
正直最初は本当にこれですね、わからないことがわからない。
まぁそもそも、目に見える物を直感的に作ってる人が多いので、やっぱり数字や英単語が書いてあるだけの画面に向かって唸ってるエンジニアさんは怖いし、黒魔術でも使ってんじゃないかとおもうんですよ。
じゃぁ具体的に何わからないの？って話なんですが。
###横文字多すぎ
横文字おおいですよね。

- オブジェクト
- パラダイム
- パース
- メソッド

やっていけば、まぁそのままの意味なんですけど。
パースとか透視図法の事かと思っちゃいますね。
プログラムというかUnityとかでも、初心者向けと書いてあったり入門と書いてあっても、結構無慈悲に
####<font color="MediumVioletRed">オブジェクトをインスタンスします</font>
とか書かれているわけですね。
オブジェクト？？？？
インスタンス？？？
で、更にオブジェクトで調べに行くと概念設計とかの話がバンバン出てくるわけです。

例えば、絵の描き方教えてって言われた時に。
####<font color="MediumVioletRed">回り込みと立体感を意識して、線を引くといいですね。色は環境光と色の恒常性を意識するといいです。</font>

っていわれてもなぁってなります。
俺は斜め４５度の女の子が描きたいんだ。
まぁこんな回答は稀で、だいたい、いい感じに描くとかの返答が帰ってくるかと思います。

ただお互い説明しろと言われても、そういうもんだしなーとしか言えませんしね。

じゃぁどう説明するか。

###具体的な事象で説明する

オブジェクト指向プログラミングとはというと、コードを再利用するために*クラス*という部品に分ける。
だいたいこんな感じの説明が出てきます。
いやほんと、そのとおりなんですが。
プログラムが部品？どういうことってなります。
イラストって基本フルスクラッチなので、再利用って概念があんまりないです。
漫画だとコマの使い回しとか、よく使う構図とか概念的には有る気がしますが。
####イラストで例えると。
イラストレータという**枠**これを**クラス**とします、絵柄はイラストレーターが具体的に出力する関数とします。
関数の説明が抜けてましたが、関数はプログラムの具体的な部分です　a + b = c なんですが、よくわからないとおもいますので、イラストレーターが絵を書く**工程**が書かれていると思っていただければOKです。

- NUKO-D（クラス）
    - NUKO-D描く女の子関数 

- 〇〇イラストレーター（クラス）
    -  〇〇イラストレーターが描く可愛い服関数

- △△イラストレーター（クラス）
 - △△イラストレーターが描くいい感じの背景関数

この３つのクラスとそれぞれに入っている関数を使うことで、**処理**、ここでいうと一枚のイラストが作れるという感じです。
プログラムのソースコードをのぞくと、英語が+とか=で結ばれていて一見よくわかりませんが。工程や計算などが単語として定義されて、それを組み合わせて有るのでそう見える感じです。
インターネットにこういう便利な関数がまとめられた物がフリー素材や有償素材としておいてあって、用途に合わせて組み合わせて行きます。
webデザインなんかではよくあると思いますが、イラストは基本書き起こすので具体性はないですが、アウトプットする時に脳内で行っている作業に近いとは思います。
もちろん、そのイラストに会わなければ、新たにクラスや処理を作ってあわせて行きます。

#今回はここまで
今回はここまでにしようかなと思います。次回は実際どういう環境で具体的に勉強していくかというところ。
Unityに触れていければと思います。
なにか間違いとかあればご指摘お願いします。
鳥貴族 注文ガチャ （nuxt.js + rails + heroku + python + selenium）

# 背景
モダンな技術を勉強したかったので、それらを使ってwebアプリを何か作ろうというところから始まりました。作っていく中で勉強するのが一番手っ取り早いという考えもありました。

下記の「サイゼ1000円ガチャ」を見てメニューの注文ガチャいいなあと思ったので、居酒屋でも同じようなものがあったら面白そうと思い、今回の鳥貴族ガチャを作ることにしました。
>
[サイゼリヤ1000円ガチャをつくってみた(Heroku + Flask + LINEbot) - Qiita
](https://ceron.jp/url/qiita.com/marusho_summers/items/a2d3681fac863734ec8a)

そんな感じで、興味のある技術を使って開発をしてみることが一番の目的でした。

# 成果物：鳥貴族 注文ガチャ
![D4CE3051-88F9-48A1-BC98-28432D13BD51.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/d30dc59a-129a-2fc7-06cf-5392b1dda2ce.jpeg)

**概要**
- 食べ物と飲み物の数を入力する
- [ガチャを回すボタン]を押下
- 入力した個数分のメニューがそれぞれランダムで出力される

**実物**
鳥貴族 注文ガチャ - Heroku
https://ak-toriki-nuxt-frontend.herokuapp.com/

フロントエンドプロジェクト（Nuxt.js） - GitHub
https://github.com/lelouch99v/toriki-nuxt-frontend

バックエンドプロジェクト（Ruby on Rails） - GitHub
https://github.com/lelouch99v/toriki-backend


# 制作のポイント
## 使った技術
以下の技術を使いました。

- Python
- selenium webdriver
- vue.js
- nuxt.js
- Ruby on Rails
- postgreSQL
- heroku

## DBに入れるメニューをスクレイピングで取得
Pythonでのスクレイピングにハマっていたのでやってみました。

焼鳥、逸品料理、スピードメニュー、ドリンクの4つのカテゴリからそれぞれメニューを取得していきます。結果はcsvで出力します。

このcsvを使ってrailsのmigrateデータとしてメニューデータをDBに入れました。

**トリキ スクレイピング - GitHub**
https://github.com/lelouch99v/toriki-scraping/tree/master

（今回の開発で一番楽しかったのがここです）

## React → Vue.js に変更
前提としてSPA + API の構成としたかったです。

業務でAngularは使っているので、ReactかVueを学びたいと思っていました。
当初Reactを選択したのですが、学習に時間がかかり出来上がるのが先になってしまいそうなのと、Nuxt.jsが気になっていたのであっさりとVueに変えました。
すごく入りやすくて学習していて楽しいです。

猫本も買いました。
![302BA844-B09E-457D-BAEB-45FF2BA0A677.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/189ca741-89bd-8877-90a5-17c1ad764d1a.jpeg)


# 今後の課題
**ボタン押下時のインタラクション**
ガチャ回すボタン押すとメニューがランダム表示されますが、とても味気ないです。派手なものにする必要はないですが、最低限以下は実現したいと思っています。
- ボタンを押した感出す
- メニューが表示されるまでにワンクッション置く（ワクワク感が足りないため）

**各メニューのイメージ画像を見れるようにする**
メニューの名称だけの表示ではなく、イメージ画像も見れるようにするといいと思いました。
そのまま画像を表示するのはスペースの問題などありそうなので、リンククリックでモーダル表示など一工夫は必要かもしれません。

あとはメニュー表示の見た目が質素なので、もう少し改善が必要ですね。

**スマホで数字入力をドロップダウンリストで可能にする**
スマホではキーボード入力よりも、以下のような選択式のリストで入力のほうがやりやすいと思います。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/d28804d0-d476-df65-675e-217f6aab07e6.png)

最大値は99まであれば十分かなと。。。（もっと少なくてもいいですね）

#てかすでにあった
鳥貴族ガチャでぐぐったらすでに作っていた人がいました。しかもクオリティ高い。
完全なリサーチ不足です。

今回の目的は技術の勉強なので、もももんだいないんですけどね！
cloud9 初回 ssh接続の設定方法

###Cloud9でのssh接続でつまづいたので備忘録としてまとめました。

###1
```bash
$ ssh-keygen
```
###2
```bash
$ vi ~/.ssh/id_rsa.pub
```
![スクリーンショット 2019-07-01 11.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/c2ae289f-1aa6-a039-2a97-3999f3c1a4e8.png)


###3.全てコピー(ssh含める)
![スクリーンショット 2019-07-01 11.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/3790aecd-21de-635f-932e-da7bcb70e13d.png)

###4.トップページからiamに移動
![スクリーンショット 2019-07-01 11.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/99029bc8-8deb-346d-78c7-4be3c1660e83.png)


```bash
1.ユーザー（画像1）
2.認証情報
3.sshパブリックのアップロード選択（画像2）→貼り付け
4.sshキーid自動生成される
5.SSH キーの表示の左をコピー（画像3）
```

###5
![スクリーンショット 2019-07-01 11.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/1dde7b8c-b981-f538-2ef1-353a55ac8a55.png)


```bash
$ vi ~/.ssh/config

(↓コード貼り付け)
Host git-codecommit.*.amazonaws.com
User （SSH キー ID貼り付け）
IdentityFile ~/.ssh/id_rsa

#:wq(vimに保存して抜ける)
```

###6
```bash
$ chmod 600 config
$ ssh git-codecommit.(自分のregion 例えば us-east-2).amazonaws.com
$ yes
```
###終了

調べると色々参考記事は出てくるのですが、自分は結構手間取ったので
画像を多めにまとめてみました。
VSCodeのRemote-SSHを使っている時、gitで同期ができない問題

# VSCodeのRemote-SSHを使っている時、gitで同期ができない問題

## 問題

VSCode上のターミナルではgitでPullやPushはできるが、VSCode上からPushなどをおこおうとすると、
#### **Git: Permission denied(publickey).**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161276/0a184910-e0a6-5490-8fc3-c8b7266a1c34.png)

と表示されてしまう。


## 環境

ちなみに私の環境はgitlabにRaspberryPiに接続したWindowsマシンのVSCode上でgitを行おうとしていた。

## 原因

2019/07/03 現在、VSCode公式が近い問題を既存の問題としてあげていた

![コメント 2019-07-03 234849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161276/9958d526-8952-0936-aff8-541f478e7655.jpeg)

私の場合、SSHキーにパスフレーズは登録していないが、何をやってもVSCode上からはPullもPushもできなかったため、バグであると納得することにした。

###***追記：2019/07/04***
と、思ったが、ターミナル上でssh-agentが起動しないことを不審に思い、

```
eval 'ssh-agent'
```

とやったが、裏で実行されるが、その後の

```
ssh-add -l
```

をするとssh-agentが起動されてない旨のメッセージがでてしまっていた。

## 解決策

そのssh-agentを起動する方法を

```
eval $(ssh-agent)
```

とすると、しっかり起動できるようになり、

```
ssh-add [秘密鍵のパス]
```

とすれば鍵が登録され、VSCodeからもgitが使えるようになる

ただ、実行する度にプロセスが増えてしまうため、
1つのプロセスを複数のBashから利用するために

http://kurokawh.blogspot.com/2012/07/linuxcygwin-ssh-agent.html

ここのサイトに書かれているコードを.bashrcに追記すると良いと思う。
ちなみに、.bashrcのコードは、ダブルクォーテーションが「“ ”」これになっているため、「" "」に直さないとエラーがでるので気を付けて欲しい。

また、.bashrcに追記するコードの11行目と23行目の

```
ssh-add
```

だが、これだけだと、
https://euske.github.io/openssh-jman/ssh-add.html
ここに書いてある通り、引数が無しのため、.ssh内の「id_rsa」,「id_dsa」,,,などなどの決まった名前のファイルしか読み込まないため、
秘密鍵のファイル名を変更している場合には、この11行目と23行目に引数としてファイルのパスを追記してあげると良いと思う。

## 参考
.bashrc, .bash_logoutソースコード
http://kurokawh.blogspot.com/2012/07/linuxcygwin-ssh-agent.html
ssh-add
https://euske.github.io/openssh-jman/ssh-add.html
AWS EBSのボリュームタイプの違いを理解する

## AWS Elastic Block Store(EBS) とは
EC2インスタンスにアタッチして使用するブロックストレージのこと。OS、アプリ、データの置き場所などの用途に利用される。

## ブロックストレージの種類
大きく分けると SSD-Backed と HDD-Backed のボリュームがある。ざっくり用途を分けると、小さいサイズの不規則なデータの読み書きがある RDS(Relational Database Service)のような用途には高い IOPS が求められるため、ランダムアクセスにも性能を発揮する SSD-Backed を選択する。ビッグデータ処理で、ファイルサイズの大きいデータを保存するなど、I/O のサイズが大きく、シーケンシャルアクセスの場合は HDD-Backed を利用。

### SSD-Backed
- 汎用SSD(gp2)
   - ブートボリューム
   - 負荷が読めないシステム
   - 小規模なDB向け
   - 開発・テスト環境向け
   - 仮想デスクトップ

- プロビジョンドIOPS(io1)
   - リレーショナルデータベースに利用される
   - 汎用では処理しきれないIO性能を要求
   - 大規模なDB向け
   - **持続的なIOPSパフォーマンスが必要なアプリケーション向け**
   - EBSのディスク性能を高めるが、ネットワークがボトルネックになるため、EBS最適化インスタンスを使うことが推奨

### HDD-Backed
- スループット最適化HDD(st1)
   - シーケンシャルアクセス時に高い性能を発揮するタイプ
   - 高いスループットを要求するビッグデータ処理に最適
   - DWH、大規模なETL処理などに利用
   - 起動ボリュームには利用できない
   - サイズは500GiB〜

- コールドHDD(sc1)
   - ログデータ保管、アーカイブ利用
   - サイズは500GiB〜

## 用語解説
- **IOPSとは、Input Outpu Per Secondのことで ストレージが1秒あたりに処理できるI/Oアクセスの数** を指す。
- **EBS最適化とは、EC2-EBS間の通信を専用のものでつなぐこと。**そうすることで、他の通信に邪魔されずにディスク IO性能の安定化につながる。旧世代インスタンスを除いてデフォルトでオンになっている。

- **シーケンシャルアクセスとは、連続したデータアクセスのこと。** たとえば、ファイルコピーの速さはシーケンシャルアクセスの性能による。

## 参考
- [SSDの基礎知識、ググらないで答えられる?](https://pc.watch.impress.co.jp/docs/news/1140107.html)
- [AWS Black Belt Online Seminar Amazon Elastic Block Store](https://d1.awsstatic.com/webinars/jp/pdf/services/20190320_AWS-BlackBelt-EBS.pdf)
PHPのstrpos()は扱いに気をつけろ

Rubyistを自称しておきながら社ではPHPを使うダブルスタンダードを起こしている八雲です。  
転生したら小学生Rubyﾌﾟﾖｸﾞﾔﾏとしておかねゴリゴリ稼ぎたいです。  

# 本題の前に、strposの簡単な説明

PHPの標準ライブラリの中に存在する`strpos()`は文字列の検索に用いるメソッドで、第一引数の文字列の中から第二引数の文字列を検索し、見つかった場合は見つかった場所の番号を0から始まる`int`型の数値として返します。
見つからなかった場合は`false`が返ります。

```PHP
var_dump(strpos("ruby is great.", "ruby"));
// -> int(0)
```

上記の場合`ruby is great.`の中に`ruby`という文字列が含んでいるか検索し、最初で見つかったので`int`型の0を返しています。  

```PHP
var_dump(strpos("ruby is great.", "PHP"));
// -> bool(false)
```

今度は`PHP`という文字列が入っているか検索し、存在しなかった為`false`が返っている、という感じのメソッドです。簡単ですね。  

ここまで踏まえた上で本題に入ります。

# 本題:比較に使うとき

文字列の検索のメソッドなので、用法的には「文字列を検索させて、見つかった場合に何かしらのアクションをさせる」ということをしたい人が多いでしょう。
その場合、想定するコードは大体こんな感じになります。

```PHP
if(strpos("ruby is great.", "ruby")){
  echo "見つかったよ〜";
}
else {
  echo "見つからなかった……";
}
```

一見特に何も問題ないように思えるコードですが、いざ実行すると`見つからなかった……`と返されます。
さてどういうことでしょうか

# 解説
これには「比較にまつわるPHPの言語仕様」が大きく関わっています。

### `strpos()`の仕様について
先程説明した通り、strpos()は見つからなければ`false`を返し、見つかった場合は0から始まる数値を返します。
問題なのは"0から"という所にあり、これがどのように解釈されるかで大きく変わります。
他の言語から入ってきた方は「**そんなん`true`に決まってんじゃん**」って思うじゃん？
**違うんだなこれが**
ちなみに同じことが公式ドキュメント上で警告されています。

>警告
>この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される値を返す可能性もあります。 詳細については 論理値の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。
> [strpos公式ドキュメント](https://www.php.net/manual/ja/function.strpos.php)より引用


### PHPの比較について
根本的にPHPにおいて比較演算子を省略したり、`==`を比較演算子として使用した場合**超がつくユッルユル**の結果を返してきます。
[PHPの公式ドキュメント](https://www.php.net/manual/ja/types.comparisons.php)上で確認することができますが、
`int(0)`と`string "1"`を突き合わせて**`true`**が帰ってくるくらい奇妙なことが起こります。

そして先程の見つからなかったと解される問題ですが、この緩い比較が悪さを働いています。
int型の**`0`**という数値は真理値的には**`false`**として扱われます。

では単純に`===`による厳格な比較をすればよいのか、というも違います。

```PHP
if(1 === true){
    echo 'true扱い';
}
else {
    echo 'false扱い';
}
```
これの吐いてくる出力は`false扱い`になります。
厳格な比較の場合、中身はもちろんこと型の情報まで全部同じでないと`false`として扱います。

# 解決策
`strpos()`の仕様として

+ 検索する値を見つけてきた場合は`int`型の値である
+ 見つからなかった場合`bool`型の`false`を返してくる

この2つは保証されているので、型の情報で区別させましょう。
そのためには`gettype()`を使うのが一番手っ取り早いです。

`gettype()`は入力された値の型の種類を文字列で返してきます。
なので、これを利用してコードに書き起こす場合はこのようになります。

```PHP
// 比較の際は可能な限り`===`の厳格な比較をするといいです
if(gettype(strpos("ruby is great.", "ruby")) === 'integer'){
  echo "見つかったよ〜";
}
else {
  echo "見つからなかった……";
}
```
これを実行するときちんと`見つかったよ〜`と返してきます。
文字列の加工は個人的にも頻繁に扱うので、ノウハウとして覚えておくと安全かつ簡単に実装できるかと思います。

-----------------
### 追記(2019/07/08)
コメントにてご指摘を受けてから普通にアホだったことに気が付きました。なんということだ

+ strposの条件判定

```PHP
if(strpos("ruby is great.", "ruby") !== false){
  echo "見つかったよ〜";
}
else {
  echo "見つからなかった……";
}
```
単純に`false`かどうかを判定させればいいだけでした

+ `gettype()`の使い方

> 型を判定するためのものではないので、型で比較する場合は`is_int()`を使ってくれ

とのことでした。これは知らなかったので知見。いずれにしてもミリしらで実装するの気をつけようと思います。ありがとうございました😂

# 余談
2年前くらい、プログラミング初心者だった私はPHPでTwitterのbotを開発していた時期がありました。その時ちょうどこの`strpos()`の罠に引っかかってやめちゃったんですよね。

それから時は経ち、ここ最近になって業務でちょうど`strpos()`に触るきっかけがあり、比較の解決としてこれにたどり着いたため「これで書こうかな」となった次第です。
この記事が同じ境遇に当たってしまった方々の助けに少しでもなれば幸いです。
Macでsshを少しラクにする

#概要
Macを使っているユーザ限定ですが、sshを少しラクにする方法を書こうと思います

#手順
ssh接続をする時、普通
`ssh -i ~/.ssh/[認証用の秘密鍵] ログインユーザ@ホスト名`
になると思います。
これを少しラクにするために~/.ssh/configを作成します。
`vi ~/.ssh/config`
内容は下記のようにします。

```text:config
host test
HostName     ***.***.***.**
Port         22
User         ログインユーザ
IdentityFile ~/.ssh/[認証用の秘密鍵]
```
こんな感じでファイルを作成したらあとは下記コマンドを入力します。
`ssh test`
そうすると短いコマンドで接続できるようになります。

#まとめ
今回は簡単な内容ですが、備忘録として投稿しました。
少しでも役にたったら幸いです。

以上
SQLアンチパターン-3章 とりあえずID-まとめ

## とりあえずID
すっかり暗黙の了解として認識してしまっていたのですが
DBでテーブルを作る際、id列は必ずできるものだと勘違いをしていました。

[そのテーブルに、idは必要ですか？〜idの必要性とデータの一意性についてもう一度考えてみる](http://karoten512.hatenablog.com/entry/2017/11/22/232120)

私はRailsを主に使って開発をしています。
こちらの記事に書いてある通り、Railsでマイグレーションファイルを扱うと、何も考えなくてもid列は存在しています。
しかし、id列というものは必須ではないです。
id列は行の一意性を保つために存在していることが多いです。
つまり、行の一意性が保たれているのならばid列は存在しなくても良いのです。

行の一意性が保たれているケースってどのようなものがあるでしょうか。
例えば全国民に発行されているマイナンバーは各個人に一意に存在しています。
仮にマイナンバーと個人情報を扱うようなテーブルがあった際には
普段使うようなid列は必要ないということになります。

## id列は必要か？
下記のようなテーブルを扱う際、mynumber列を利用してテーブルを結合することもできます。
外部キーとして参照することもできます。よく使われるid列は存在していなくても成り立ちます。

個人情報テーブル

|mynumber|名前|年齢|
|:-----------------|------------------:|:------------------:|
| 123456             |              太郎 |        21        |
| 123457           |            花子 |       22       |
| 123458             |              二郎 |       23       |

所属保険団体テーブル

|mynumber|所属保険団体|登録番号|
|:-----------------|------------------:|:------------------:|
| 123456             |              東京都保険会社 |        123        |
| 123457           |            大阪府保険会社 |       124       |
| 123458             |              愛知県保険会社 |       125       |



このテーブルの場合、id列はそもそもそれ自体に意味は持ちません。あくまで行を一意に保つためだけに存在しています。
そういったキーを擬似キー(pseudo key)、または代理キー（surrogate key）と表します。


## クエリを交えて確かめてみる
Userモデル
Carモデル
というようなモデルがあったとします。
ユーザーは何らかの車を所有しているという前提があるものとします。

Userモデル

|id|name|year|car_id|
|:--:|:--:|:--:|:--:|
| 1|太郎|21|1|
| 2|花子|22|2|
| 3|二郎|23|3|


Carモデル

|id|car_id|name|year|
|:--:|:--:|:--:|:--:|
| 1|1|トヨタ|2000|
| 2|2|ホンダ|2010|
| 3|3|スバル|2015|

上記の例で、新たにCarモデルを追加する場合、

```insert.sql
INSERT TO Cars (car_id, name, year) VALUES ('4','スズキ','2019');
```
というように、id列を使わなくても挿入しても、Carモデルの行の一意性は保たれます。

これらがもし、id列のみで表されていたらどうなるか、確認してみましょう。

Userモデル

|id|name|year|car_id|
|:--:|:--:|:--:|:--:|
| 1|太郎|21|1|
| 2|花子|22|2|
| 3|二郎|23|3|


Carモデル

|id|name|year|
|:--:|:--:|:--:|
|1|トヨタ|2000|
|2|ホンダ|2010|
|3|スバル|2015|

```select.sql
SELECT u.id.c.id from Users as u INNER JOIN Cars as c ON u.car_id = c.id;
```

この時に帰ってくるテーブルはこうなります。

|id(u.id)|id(c.id)|
|:--:|:--:|
|1|1|
|2|2|
|3|3|

列の名前で値を参照する場合、本来u.idとc.idはどちらも「id」という列名なので
どちらがどちらのモデルのidを表しているのかわからなくなります。
これらを、idではなく、「user_id」「car_id」を扱うことで、主キー・外部キーの性質を保ち、かつテーブル結合をした時などでもその列名が判別しやすくなります。


## 結論
主キーには分かりやすい列名をつけよう！
擬似キーは必須ではないよ！
Leetcode #841: Keys and Rooms

```swift
func canVisitAllRooms(_ rooms: [[Int]]) -> Bool {
    var visited = Array(repeating: false, count: rooms.count)
    helper(&visited, rooms, 0)
    for i in stride(from: 0, to: rooms.count, by: 1) {
        if visited[i] == false {
            return false
        }
    }
    return true
}

private func helper(_ visited: inout [Bool], _ rooms: [[Int]], _ index: Int) {
    visited[index] = true
    for num in rooms[index] {
        if visited[num] == false {
            helper(&visited, rooms, num)
        }
    }
}
```
separatorを含めたsplit

# separatorを引数にsplitすると...
通常下記のようにsplitに引数を渡し、分割した結果を取得します。引数に指定した値で分割しますが指定した文字は含まない値を返します。
業務でどうしてもseparatorの文字も含めて配列を取得したい場合があったので備忘メモ

```javascript
'abcd1efg2hijk'.split(/[0-9]/);
// 結果 => [ 'abcd', 'efg', 'hijk' ]
```

1と2も値の中に含めたい場合は肯定先読みを利用します。

```javascript
'abcd1efg2hijk'.split(/(?=[0-9])/)
// 結果 => [ 'abcd', '1efg', '2hijk' ]
```

これでseparator文字を含めた文字列の分割が可能です。
mintty で動く最新の Vim を build する

# 経緯
## 1. 環境の変化
お仕事で使う環境が Git Bash (mintty) -> SSH -> Linux からがっつり Windows になった。Windows でも最新の Vim を、かつ使い慣れた mintty で使いたかった。
## 2. mintty で動く Vim の build 手順がなかった
Vim の [INSTALLpc.txt](https://github.com/vim/vim/blob/9ee3d161f715de9e68ba60c17e3893107bb7c42a/src/INSTALLpc.txt) には、Windows native で動く Vim の build 手順はあるが、mintty で動作する Vim の build 手順がなかった。

# 手順
## 単に最新(特定)のバージョンを使いたいだけの場合
MSYS2-packages を利用すると簡単でした。@yumetodo さんコメントありがとうございました。
1. 任意の場所で `git clone https://github.com/msys2/MSYS2-packages`
2. `cd MSYS2-packages/vim`
3. PKGBUILD の _topver と _patchlevel を修正
4. `makepkg --skipinteg`
5. `pacman -U vim-x.x.xxxx-1-x86_64.pkg.tar.xz`
Vim の作業をいろいろとやりたいので、本当はリポジトリとして用意したいのだけどうまくいかず。。頑張ればできそうではある。
## 通常のリポジトリとして用意する
vim-jp の方々に相談。蓋を開けてみれば、Linux で普通に build する手順とあんまり変わらなかった。知っている人にとっては当たり前のことだったのかも。。とりあえず一番シンプルな状態での build。
1. [MSYS2](https://www.msys2.org/) をインストール
2. `pacman -Syuu`
3. 強制終了して再度アップデートするようにリクエストされると思うので、ウィンドウを閉じて再起動。
4. もう一度 `pacman -Suu`
5. `pacman -S gcc git base-devel ncurses-devel libiconv-devel`
6. `git clone https://github.com/vim/vim`
7. `cd vim/src`
8. `./configure --with-features=huge --enable-fail-if-missing --prefix=${HOME}`
9. `make -j`
10. `make install`

# 参考
MSYS2 ちゃんと使ったことなかったので参考になりました。
https://qiita.com/k-takata/items/373ec7f23d5d7541f982

# Special Thanks
いつもどうもありがとうございます。
@k-takata, @mattn
JavaScriptで小数点以下の桁数を指定する方法

## JavaScriptで小数点以下の桁数を指定する方法
`Number.prototype.toFixed()`を使います。
以下が例です。
<img width="143" alt="Screen Shot 2019-07-03 at 23.39.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/db414ddd-0a4a-f50b-f5b6-ea5b25008cb1.png">

指定桁数になるように、0の右埋めをしてくれるので便利です。
この記事が参考になれば幸いです。
公式: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
初めてのQiita記事 (Pythonで正方行列を転置しよう)

# Quiitaに初投稿します。
はじめまして。こんにちは。
理系大学で数学を学んでいる 学部4年生の者です。
前からquiitaのアカウントは持っていたのですが投稿することも特になくROMアカとして使ってました。

しかし、最近 output の大事さと、Markdownの有用性に気づいたので、
練習がてら、お試し気分で正方行列を Pythonを用いて転置するプログラムを載せてみようかと思います。

## TL;DR
Python を用いて 正方行列の転置を行うプログラムです。
このページは、私の練習用に作られたもので、専門性や、速さ、手軽さを求める方は別のページか既存のメソッドを使ってください。

## 当プログラムを書いた背景
私の研究室の K教授からこのようなお達しがありました。
「AI (Neural Network) でまるばつゲームのリーグ戦をやるから。ネットワークの設計と対戦をするプログラムはもう書いたからパラメータだけ設計して。」

そのような話を受け、僕は適当に手書きでパラメータを書いたテーブルを提出したのですが、研究仲間の J君は(めんどうだったらしく)ネットにあった誤差逆伝播法のプログラムをまんま引っ張ってきて、計算させたそうです。

そして実行して一言。
「あれ?」

コンソールを見せてもらうと次のような感じのエラーが.. \ デン /
>TypeError: list indices must be integers or slices, not tuple

これは単に list を区切るための " ," が抜けているという凡ミスであることが判明。

そして  " ," を追加して再度実行し.. \ デン /
(全く同じではありません。忘れましたごめんなさい。)
>ValueError: shapes (10,8) and (10,) not aligned: 8 (dim 1) != 10 (dim 0)

む? 次元が違うというエラーか..
と思い、パラメータを計算したプログラムを確認すると、
重みが格納されている行列 W と 入力 x が `np.dot(x, W)`と書かれている。
ふむ。

一方、K教授が書かれたプログラムを見てみると、
`y = np.dot(w,np.append(x,[1]))`

あー。 行列とベクトルのドット積の順序が逆なのか..
と思い、転置すればいけるのではないかと J君が言い始めた。
NumPyにありそうだね。と言いながらもいまいち上手くいっていないご様子。

なので、簡単に2次元配列を転置するプログラムを書いて見た。
(提出期限が迫っていて、焦っていたし、暇だったので。)

### CSVを読み込み、2次元配列に格納し、転置して上書きするプログラムを作成
```transepose.py

# CSVの行と列を入れ替える Python  プログラム

import csv 

print('対象のfileをフルパスで指定 : ')
fpass = input()

# CSVファイルをlistで取得する。
with open(fpass, 'r') as f:
    # 一行ずつ表示
    reader = csv.reader(f)
    l = [row for row in reader]
    
print(l)

outer = []
for i in range(len(l)):
	out = []
	for j in range(len(l[i])):
		#print("l[i][j] = ", l[i][j])
		#print("l[j][i] = ", l[j][i])
		out.append(l[j][i])
	outer.append(out) 

	print(outer)

# 更新後のdata = out をCSV出力
with open(fpass, 'w') as f:  # 元のファイルに上書き
	writer = csv.writer(f)
	for i in range(len(outer)):
		writer.writerow(outer[i])
```

### 結果
これをドヤ顔で J君に渡したところ、以下のようなフィードバックをもらった。

* ごめん、NumPyのメソッドでできたわ。
* すげえ本当に １ から書いたんだ。メソッドあるのに。
* あと、CSVファイルじゃなくて .py なんだよね。

以上です。

そして後から気が付いたことに、
正方行列出ないと転置できないことに気が付いた。
(IndexError: list index out of range となる)

だめだめでした。

### 今後の予定
最近は ゼロ作を読んでいるので (払拭できない今更感)
今後は Python とそのライブラリ(TensorFlow とか, xgboost とか, sklearn とか..?)について書いていけたらいいなと思います。

正直いうと
文章書くのと、outputと、 Markdownの練習を兼ねた
ぼくのプログラム日記みたいなもんです。

ガチガチにすると、義務感と息苦しさで
こういうの続かないタイプなので、ゆるくいきます。ゆるく。 

もし、続編あれば、今後ともお願いします。
Python 日付，時間

##Pythonを勉強したので，メモしていく
```Python3:date2.py
import datetime

today = datetime.datetime.today()

#今日の日付
print(today)

#明日の日付
print(today + datetime.timedelta(days=7))

#2010年1月1日の一週間後
newyear = datetime.timedelta(2010, 1, 1)
print(newyear + datetime.timedelta(days=1))

#2010年1月1日から今日までの日数
calc = today - newyear

#計算結果の戻り値は「timedelta」
print(calc.days)
```
###なぜかエラーが出てしまう…
```
2019-07-03 23:27:21.686472
2019-07-10 23:27:21.686472
2016 days, 0:00:01.000001
Traceback (most recent call last):
  File "date2.py", line 19, in <module>
    print(calc.days)
AttributeError: 'datetime.datetime' object has no attribute 'days'
```
解決法をご存知の方はぜひ教えてください！

###参考にさせていただいたもの
Python-izm：日付・時間
https://www.python-izm.com/basic/date_time/
Heroku×Rails デプロイエラー　(Could not find 'bundler' (2.0.1)...LanguagePack::Helpers::RakeRunner::CannotLoadRakefileError)

##herokuでデプロイしようとしたらエラー
`エラースクショ１`
<img width="713" alt="スクリーンショット 2019-07-03 23.08.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239663/51e9dcae-2e74-d8bf-42f1-a9c0af06249d.png">
`エラースクショ2`
<img width="713" alt="スクリーンショット 2019-07-03 23.18.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239663/c38dc1a6-e39d-6d86-6945-b6c4dcf5dc07.png">

##公式herokuからの注意
https://devcenter.heroku.com/articles/bundler-version#known-upgrade-issues
##同じ症例
https://stackoverflow.com/questions/56680065/heroku-installs-bundler-then-throws-error-bundler-2-0-1

#結論
bundlerのバージョンによるエラー
だったので
bundlerのバージョンは2.0.2にする

```terminal:ターミナル
$ gem install bundler -v 2.0.2
Successfully installed bundler-2.0.2
Parsing documentation for bundler-2.0.2
Installing ri documentation for bundler-2.0.2
Done installing documentation for bundler after 3 seconds
1 gem installed
$ bundle update --bundler
```
そのあと`Gemfile.lock`のbundlerのバージョンを2.0.2に変更
なっていたらOK

```ruby:Gemfile.lock
...
      bundler (>= 1.3.0)
....
BUNDLED WITH
   2.0.2
```

を確認ちゃんと2.0.2になってるか確認、なってなかったら手動で書き換える(ほんとはいいのかわからないが)

```terminal:ターミナル
$git add .
$git commit -m"modified gemfile.lock"
$git push heroku master
```

で自分は解決した。
Leetcode #929: Unique Email Addresses

```swift
func numUniqueEmails(_ emails: [String]) -> Int {
    var set = Set<String>()
    for email in emails {
        var simplifiedEmail = ""
        var encounterPlus = false
        let emailChars = Array(email)
        for i in stride(from: 0, to: emailChars.count, by: 1) {
            if emailChars[i] == "@" {
                simplifiedEmail += String(emailChars[i...])
                set.insert(simplifiedEmail)
                break
            } else if emailChars[i] == "+" {
                encounterPlus = true
            } else if encounterPlus == true || emailChars[i] == "." {
                continue
            } else {
                simplifiedEmail += String(emailChars[i])
            }
        }

    }
    return set.count
}
```
pythonで出力ログに色を付ける

外部ライブラリのcoloramaを使用。

```
pip install colorama
```

Foreは文字列、Backは背景、Styleは文字のカタチを指定できる。

```
from colorama import Fore, Back, Style

print(Fore.GREEN + "文字列が緑色")
print(Style.DIM + "dim:文字のカタチ")
print(Style.BRIGHT + "BRIGHT:文字のカタチ")
print(Style.NORMAL + "NORMAL:文字のカタチ")
print(Style.RESET_ALL + "RESET_ALL:これまでの変更をリセットする")
print(Back.GREEN + '背景が緑色')
print(Style.RESET_ALL)
```
<img width="346" alt="スクリーンショット 2019-07-03 22.59.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257206/c82ec817-9787-48ab-6c9b-f2e896c07766.png">
Gitでstashを適用する方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - git version 1.8.3.1
    - xfc4-terminal 0.8.7.4

# `stash`する
[Gitでstashする方法 - Qiita](https://qiita.com/ponsuke0531/items/79642c9a41f5c1eeb0b8)
# `stash`のファイル全部を適用する場合
書き方 : `git stash apply {スタッシュ}`
## 1. 適用対象stashを確認する
```bash
# 対象のstashを確認する
$ git stash list
stash@{0}: On branch-c: stash-a
stash@{1}: WIP on branch-d: 32833a9
```

## 2.適用する
```bash
$ git stash apply stash@{1}
# On branch branch-d
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   project-name/.classpath
#   modified:   project-name/.project
#   modified:   project-name/.settings/org.eclipse.jdt.core.prefs
#   modified:   project-name/.settings/org.eclipse.wst.common.component
#   modified:   project-name/pom.xml
#
no changes added to commit (use "git add" and/or "git commit -a")
```

# ファイルを指定して適用する場合
書き方 : `git checkout {スタッシュ} {ファイルパス}`
[作業中のファイルをgit stashして、一部のファイルだけ戻す - kentana20 技忘録](http://kentana20.hatenablog.com/entry/2014/07/05/172717)

## 1. 適用対象ファイルを確認する
```bash
# 対象のstashを確認する
$ git stash list
stash@{0}: On branch-c: stash-a
stash@{1}: WIP on branch-d: 32833a9

# 対象のファイルを確認する
$ git stash show stash@{0} | grep pom.xml
 project-name/pom.xml                                             | 26 ++++++++++++++++++++++-
```

## 2.適用する
```bash
$ git checkout stash@{0} project-name/pom.xml
```

# 適用して`stash`を消す場合
書き方 : `git stash pop {スタッシュ}`

```bash
# 適用するstashを確認する
$ git stash list
stash@{0}: On branch-name: stash-name

# 適用してstashを消す
$ git stash pop stash@{0}
# On branch branch-name
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   my-project/.classpath
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   build/
#   my-project/src/resources/jdbc.properties
#   my-project/target/
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (a63b5722ab1349ff027df8449e6962d247dcab23)

# stashが消えたことを確認する
$ git stash list
$
```
[CloudFormation]インフラのコード化の苦手意識克服のためにやったこと

インフラのコード化には興味がありつつも、CloudFormationのテンプレートを書くのが億劫で、AWSの管理コンソールから手動で作ってしまいがちでした。
ただ、キャリアパスとしてクラウドインフラエンジニアを目指しているので、今回は苦手意識克服のためにやったことを共有します。

## 対象読者

- AWSの管理コンソールから各種サービスを利用したことがある
- [サンプルテンプレート](https://s3-ap-northeast-1.amazonaws.com/cloudformation-templates-ap-northeast-1/WordPress_Single_Instance.template)
のようなCloudFormationのテンプレートを見るとテンプレートを書くのが億劫になって、ついついAWS管理コンソールのGUIでサービスを構築してしまう
  
## 苦手意識克服プロセス

ポイント: 上述のサンプルテンプレートのような壮大なテンプレートをいきなり作ろうとせず、まずは作りたいAWSのサービスを1つだけ決めてそこから作ること

1. 作りたいAWSのサービスを1つ決める
2. 一旦AWSの管理コンソールから上記のサービスを構築し、完成後のイメージを理解しておく
3. 完成後のイメージが理解でしたら、作ったサービスを削除
4. [AWS CloudFormation リソース・プロパティリファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)から作りたいサービスのドキュメントを見る
5. CloudFormationのテンプレートファイルを作成する。（※ここで理解できなくてもとりあえず書いてみる）
6. AWSの管理コンソールからCloudFormationにいき、作成したテンプレートファイルをアップロードする
7. ここでエラーが出た場合は、エラーの内容を見てテンプレートを修正し、管理コンソールのCloudFormationから該当のスタックを削除
8. 6〜7を繰り返して、CloudFormationのテンプレートファイルをブラッシュアップしていく

## このプロセスから得られたもの

- CloudFormationに対する苦手意識の軽減
- コードからAWSのインフラが構築できた成功体験

## 引用元

- [AWS CloudFormation リソース・プロパティリファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
Elasticsearch + Kibana を docker-compose でさくっと動かす

手元のログファイルをさくっと解析したくて docker-compose を使ってローカルで起動してみました。

<img width="1403" alt="kibana_ml.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100298/b788ba16-a420-3936-32fe-ec95b2b4e7d8.png">
（Machine Learning のトップ画面。ここでログファイルをインポートして Visualize で可視化しました）

## 環境
MacOS Mojave 10.14.4 
Docker 18.09.2

## 手順
1. docker-compose.yaml を作成
2. `docker-compose up`
3. ブラウザでアクセス！

### docker-compose.yaml
```yaml:docker-compose.yaml
version: "3"

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - es-data:/usr/share/elasticsearch/data
  kibana:
    image: docker.elastic.co/kibana/kibana:7.2.0
    ports:
      - 5601:5601

volumes:
  es-data:
```

なお、ホストにデータを保存したい場合は `services.elasticsearch.volumes` を以下のように修正し、`volumes` は削除します。

```yaml
# 省略
    volumes:
      - ./es-data:/usr/share/elasticsearch/data
# 以下は削除
#volumes:
#  es-data:
```

### 起動

```
docker-compose up
```

### ブラウザでアクセス！

http://localhost:5601/

<img width="1383" alt="kibana.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100298/97ded147-232e-bee4-978e-6b4b3d7a9c39.png">

## 少し解説
* discovery.type=single-node
    * ローカルで検証するだけなので Development mode にすることで簡易な設定にしました。
Production mode と比較してクラスタの構築など複雑な設定をしなくてすみます。
* bootstrap.memory_lock=true
    * スワップを使わない設定。
* "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    * メモリ固定。

## 参考
* [Kibana User Guide [7.2] » Set Up Kibana » Running Kibana on Docker](https://www.elastic.co/guide/en/kibana/current/docker.html)
* [Elasticsearch Reference [7.2] » Set up Elasticsearch » Installing Elasticsearch » Install Elasticsearch with Docker](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)
Laravel (Lumen) の APIリソースの基本的な使い方まとめ

## はじめに
過去にやっていた案件でLaravelでAPIを作成する時に、このAPIリソースを活用してきました。
というわけで、過去の経験を基にAPIリソースの基本的な使い方を個人的にまとめたので紹介します。
もしかしたらもっと良い方法があるかもしれませんので、何かありましたらコメントで教えていただけますと幸いです。

Lumenでも扱うことができるのは確認済みなのですが、生成コマンドが存在しないので少し苦労するかもしれません。

## バージョン
- Laravel 5.5 ~ 5.6
- Lumen 5.8

## ドキュメント
- [Eloquent: APIリソース 5.5 Laravel](https://readouble.com/laravel/5.5/ja/eloquent-resources.html)

※ Lumenの方には、ドキュメントはありませんでした。おそらくほぼ一緒と思われます。

## 使用方法
### 一つのモデルを返す場合
以下のコマンドでリソースファイルを生成

```
php artisan make:resource UserResource
```

コントローラなどで返したいモデルを取得し、`UserResource`クラスの引数に取得したモデルを設定

```
$user = User::find(1);
return new UserResource($user);
```

`UserResource`クラスの`toArray()`関数で設計しているAPIの通りに、レスポンスパラメータを設定する。

```
public function toArray($request)
{
    return [
        'id'    => $this->id,
        'name'  => $this->name,
        'email' => $this->email,
    ];
}
```

#### レスポンス

```
{
    "data": {
        "id": 1,
        "name": "hoge",
        "email": "hoge@example.com"
    }
}
```

### 複数のモデルを返す場合
`UserResource`クラスの`collection()`メソッドに取得した複数のモデルコレクションを設定

```
$users = User::all();
return UserResource::collection($users);
```

#### レスポンス

```
{
    "data": [
        {
            "id": 1,
            "name": "hoge",
            "email": "hoge@example.com"
        },
        {
            "id": 2,
            "name": "fuga",
            "email": "fuga@example.com"
        },
        {
            "id": 3,
            "name": "piyo",
            "email": "piyo@example.com"
        }
    ]
}
```

### 複数のモデルを返す場合に、レスポンスパラメータをカスタマイズしたい場合
以下のコマンドでコレクションリソースファイルを生成

```
php artisan make:resource UserCollection
```

コントローラで返したい複数のモデルを取得し、`UserCollection`クラスの引数に取得したモデルを設定

```
$users = User::all();
return new UserCollection($users);
```

`UserCollection`クラスの`toArray()`関数で設計しているAPIの通りに、レスポンスパラメータを設定

```
public function toArray($request)
{
    return [
        'code'  => 200,
        'users' => UserResource::collection($this->collection),
    ];
}
```

#### レスポンス

```
{
    "code": 200,
    "data": [
        {
            "id": 1,
            "name": "hoge",
            "email": "hoge@example.com"
        },
        {
            "id": 2,
            "name": "fuga",
            "email": "fuga@example.com"
        },
        {
            "id": 3,
            "name": "piyo",
            "email": "piyo@example.com"
        }
    ]
}
```

### リソースファイル、コレクションリソースファイルにモデル以外の情報を引数に含めたい場合
`UserResource`または`UserCollection`の中で`__construct()`を設定することで、モデル以外の情報を引数に含めることができる。
※ `collection()`メソッドを使う場合は、このやり方は使えない。

```
return new UserResource($users, $post);

// or

return new UserCollection($users, $post);
```


```
public function toArray($request)
{
    return [
        'id'      => $this->id,
        'name'    => $this->name,
        'email'   => $this->email,
        'post_id' => $this->post->id,
    ];
}

/**
 * Create a new resource instance.
 *
 * @param  mixed  $resource
 * @return void
 */
public function __construct($resource, $post)
{
    $this->resource = $resource;
    $this->post = $post;
}
```

#### レスポンス

```
{
    "data": {
        "id": 1,
        "name": "hoge",
        "email": "hoge@example.com",
        "post_id": 1
    }
}
```
Leetcode #819: Most Common Word

```swift
func mostCommonWord(_ paragraph: String, _ banned: [String]) -> String {
    var str = ""
    var dict = [String: Int]()
    for char in paragraph {
        if char.isLetter {
            str += String(char).lowercased()
        } else if !str.isEmpty {
            if banned.firstIndex(of: str) == nil {
                if let value = dict[str] {
                    dict[str] = value + 1
                } else {
                    dict[str] = 1
                }
            }
            str = ""
        }
    }

    var count = 0
    for key in dict.keys {
        if dict[key]! > count {
            str = key
            count = dict[key]!
        }
    }
    return str
}
```
git checkoutしたらerror: Your local changes to the following files would be overwritten by checkout:となったときの対応方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - git version 1.8.3.1
    - xfc4-terminal 0.8.7.4

# 事象 : チェックアウトしたら怒られた
```bash
$ git checkout branch-c
error: Your local changes to the following files would be overwritten by checkout:
    project-name/pom.xml
    project-name/.project
    project-name/.settings/org.eclipse.wst.common.component
Please, commit your changes or stash them before you can switch branches.
Aborting
```

# 原因 : ローカルを変更したままだったから

## 対応 : `stash`しておく
[Gitでstashする方法 - Qiita](https://qiita.com/ponsuke0531/items/79642c9a41f5c1eeb0b8)
### もう一回チェックアウトする
```bash
$ git checkout branch-a
Branch branch-a set up to track remote branch branch-a from origin.
Switched to a new branch 'branch-a'

# 現在のブランチを確認する
$ git branch --contains=HEAD
* branch-a
```
Leetcode #621: Task Scheduler

```swift
func leastInterval(_ tasks: [Character], _ n: Int) -> Int {
    var dict = [Character: Int]()
    for task in tasks {
        if let value = dict[task] {
            dict[task] = value + 1
        } else {
            dict[task] = 1
        }
    }
    print(dict)
    var maxCount = 0
    var taskCount = 0
    for key in dict.keys {
        if dict[key]! > maxCount {
            maxCount = dict[key]!
            taskCount = 1
        } else if dict[key]! == maxCount {
            taskCount += 1
        }
    }
    return max((maxCount - 1) * (n + 1) + taskCount, tasks.count)
}
```