OmniAICreator/Qiita-1.07M huggingface dataset:
Azure PlayFabでPlayStreamを使ってユーザーのBANを実装する

## まえがき
Azure PlayFab を使用すると、ユーザーの操作やステータスの変化が PlayStream イベントとして PlayFab に記録されます。

今回はこの PlayStream をフックしてユーザーの BAN を実装してみます。

## シナリオ
ゲーム内通貨の無限増殖バグなどが利用されたことを想定して、所持通貨が 10,000,000 を超えたユーザーをリアルタイムに BAN してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/6b75928f-a3df-05d7-c71c-d3b107528ad8.png)
※こんなものを実装するイメージです。

## 手順
### 1. 新しいルールを作成する
GameManager へログインし、 自動化 > ルール > 新しいルール を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/21e8780f-6cbe-fcdd-61cf-3ebba4e469c9.png)

### 2. 名前、イベントタイプ、条件、アクションを設定する
それぞれの項目を設定します。

名前:
任意のわかりやすい名前を設定します。

イベントタイプ:
`com.playfab.player_virtual_currency_balance_changed` を選択します。

条件:
`VirtualCurrencyName` を選択して、チェックしたい通貨の名称を指定します。今回は GO （ゴールドの略）という通貨をチェック対象にします。
さらに AND 条件で `VirtualCurrencyBalance` を選択して、 BAN 対象の閾値を指定します。今回は 10,000,000 を閾値にします。

アクション:
`種類` に `プレイヤーをプレイ禁止にする` を指定します。
禁止の理由にはわかりやすい任意のメッセージを入力します。

PlayFab 側の設定はこれで完了です。
簡単ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/00d00ea8-f268-865d-c1a2-4552cffc8182.png)

### 3. Unity 側で BAN されている場合のエラーメッセージを表示する
ユーザーが BAN されている状態で PlayFab の API を呼び出した場合、`AccountBanned` というエラーコードが返ってきます。

これを利用して例えば雑に IF 文を挟んでエラーメッセージを表示することができます。

```C#
        var request = new LoginWithCustomIDRequest { CustomId = ApplicationContext.PlayFab.PlayFabDebugUserId, CreateAccount = true };
        PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);

        void OnLoginSuccess(LoginResult result)
        {
            // ログイン成功したときの処理
        }

        void OnLoginFailure(PlayFabError error)
        {
            // ログイン失敗したときの処理

            if (error.Error == PlayFabErrorCode.AccountBanned)
            {
                // BAN されているときの処理
            }
        }
```

### 4. 動作確認
ユーザーに 10,000,000 ゴールドを付与したところ、その瞬間に自動的に BAN されたことが PlayStream モニターで確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/704699d1-db80-c72f-31b9-424503d7249c.png)

Unity 側でも意図したメッセージが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/bd8a6f04-ae99-a737-f6a9-c1efe603407e.png)

### あとがき
PlayFab の PlayStream は強力なので使いこなして行きたいですね。
実績解除やログイン報酬を配ったりもできますし、アウトゲームのロジックはこれにどんどん寄せて行きたいなと思います。
TypescriptのUnion型の和訳が全然統一されていない件について

TypescripにはUnion型と言うものがあります。
特定の値が複数の型のうち、いずれかであるというものです。

``` ts
type HOGE = PIYO | FUGA //HOGE型の値にはPIYO型またはFUGA型の値が入る
```

しかし、このUnion型、和訳が全然統一されていません。
対となるIntersection型の和訳は交差型で統一されているにも関わらず、
jsStudioによる公式ドキュメントの和訳だと[共用体型](http://js.studio-kingdom.com/typescript/handbook/advanced_types)、Qiitaの記事でも[合併型](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a#union型合併型)、[直和型](https://qiita.com/vvakame/items/69efc1c6a3b91876330d#直和型union-types)など色々使われていますし、[TypeScriptDeepDiveの日本語版](https://typescript-jp.gitbook.io/deep-dive/type-system#yunionunion-type)だとintersection型は交差型と訳しているのにUnion型はユニオン型とカタカナです。

何でこういうことになるのでしょうか？

# 共用体派と集合派
基本的に、「共用体」を使う派と集合における「和集合」として訳す派に分かれます。

## 共用体
プログラミングのContextにおいて、Union型という名前で最も有名なものはC,C++におけるUnion型です。
これの訳語は共用体で固まっているので、これを当てたものと思われます。

>共用体（きょうようたい、英: union）は、プログラミング言語におけるデータ型の一つで、同じメモリ領域を複数の型が共有する構造である。
>例として、ある入力が数字の場合は数値として、そうでない場合は文字列のまま保持したいという場合を考える。この場合、数値用と文字列用の領域をそれぞれ用意するのが一つの解法だが、入力は数値か文字列のどちらか一方なので、片方しか使われず無駄が出る。そこで代わりに、格納用の領域を一つだけ用意して、これを数値である、文字列であると場合により解釈し分けることで領域の無駄が抑えられる。この「格納用の領域」こそが共用体である。[^1]

Wikipediaから持ってきましたが、確かに似たような機能ではあります。
複数のデータ型を格納しうる値という点ではTypescriptのUnion型と同じです。
しかし、上記の説明を見ても分かるように、この「共用型」という訳語は「メモリ領域の共有」という点に着目されてつけられたものです。
javascriptにコンパイルされると飛んでしまうTypescriptの型情報にメモリ領域は関係ありませんし、そもそもjavascriptでエンジニアがわざわざメモリ領域を指定することもありません。
ちょっと違和感があります。

一方で、F#では、[公式の和訳](https://docs.microsoft.com/ja-jp/dotnet/fsharp/language-reference/discriminated-unions)でTypescriptと似たようなデータ構造(discriminated union)に対し「判別共用体」の訳語を当てているという例もあります。

[^1]: https://ja.wikipedia.org/wiki/共用体

## 集合の文脈で考える
Intersection型とUnion型は密接な関係があるとされていますが、
intersection,unionの対比関係と言うと集合における[共通部分](https://ja.wikipedia.org/wiki/共通部分_(数学))と[和集合](https://ja.wikipedia.org/wiki/和集合)がまず出てきます。
実際、Intersection型にあてられている「交差」も共通部分を示す用語の一つです。

また、Typescriptの型を取りうるあらゆる値の全体に対する部分集合だと考えると、
Intersection,Union型のそれぞれの挙動はまさに集合におけるそれらの用語の意義と一致します。

基本的にはこちらの意味で考えた方が正しいと個人的には思います。

ただ、こちらの方の訳し方も(合併派、直和派、直和と言えるケースは厳密には限られる派など)今一つ統一できていない感があります。

# 結論として
F#の前例はありますが、共用体と訳すのは誤解を招くだけだと個人的には思います。
ただ、和集合の方もデファクトスタンダードな訳語がありませんし、共用体という訳語もそれなりに広まっているので、
union型とかユニオン型でお茶を濁しておくのが無難な気がします。
身もふたもない結論ですが。
Jetpack4.2のインストール

#Jetpack4.2のインストール中にハマったこと

###sdkmanagerを使ってTX2にjetpack4.2.2をインストールした時にハマったことNVIDIA developerサイトを調べていたら
bzip2のバージョンが古いだめだとかいう情報があったので
早速
    $ sudo apt remove bzip2 
　
<font color=red>ターミナルを見ているとなぜか、ros-melodic関連のパッケージがremoveされていく（汗、汗
apt removeが終わって</font>

    $ roscore

ジャーン「そんなペッケージねーよ」ってubuntuに怒られる（涙
あんのじょうROS関連のパッケージが全てremoveされた。
 
NVIDIA developerサイトを読み進めていくと、
どうやら俺と同じことをやった人がいるらしく
ROSもremoveされるからあとでインストールしてね！って書いてある。
先に書いとけよ（怒

っでもてROSの再インストールを実行
なんとここでエラー
opencv-dev3.2をインストールするところで、
すでにopencv-dev3.3が入ってるからインストールできねーよっていわれてaptが終了
で、これしろって言われたので実行

    $ sudo apt --fix-broken install

      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      Correcting dependencies... Done 

      The following packages were automatically installed and are no longer required:
      〜中略〜

      The following additional packages will be installed:
         libopencv-dev
      Suggested packages:
         opencv-doc
      The following NEW packages will be installed:
         libopencv-dev
    0 upgraded, 1 newly installed, 0 to remove and 208 not upgraded.
    4 not fully installed or removed.
    Need to get 0 B/223 kB of archives.
    After this operation, 734 kB of additional disk space will be used.
    Do you want to continue? [Y/n] y
    (Reading database ... 272781 files and directories currently installed.)
    Preparing to unpack .../libopencv-dev_3.2.0+dfsg-4ubuntu0.1_amd64.deb ...
    Unpacking libopencv-dev (3.2.0+dfsg-4ubuntu0.1) ...
    dpkg: error processing archive /var/cache/apt/archives/libopencv-dev_3.2.0+dfsg-4ubuntu0.1_amd64.deb (--unpack):
     trying to overwrite '/usr/bin/opencv_version', which is also in package libopencv 3.3.1-2-gb3f86dcd5
     Errors were encountered while processing:
     /var/cache/apt/archives/libopencv-dev_3.2.0+dfsg-4ubuntu0.1_amd64.deb
     E: Sub-process /usr/bin/dpkg returned an error code (1)

これもエラー

もうだめかと思い、新しいubuntu18.04を別のUSB　HDDにインストールしながら
色々しらべていたら

    sudo dpkg --force-all -i /var/cache/apt/archives/libopencv-dev_3.2.0+dfsg-4ubuntu0.1_amd64.deb
    (Reading database ... 272781 files and directories currently installed.) 
    Preparing to unpack .../libopencv-dev_3.2.0+dfsg-4ubuntu0.1_amd64.deb ...
    Unpacking libopencv-dev (3.2.0+dfsg-4ubuntu0.1) ...
    dpkg: warning: overriding problem because --force enabled:
    dpkg: warning: trying to overwrite '/usr/bin/opencv_version', which is also in package libopencv 3.3.1-2-gb3f86dcd5
    Setting up libopencv-dev (3.2.0+dfsg-4ubuntu0.1) ...
    Processing triggers for man-db (2.8.3-2ubuntu0.1) ...


これでとりあえずできた！！
画面の右上にあった進入禁止マークみたいなエラーもなくなった
Jenkins Slave Windwosノードでjenkins_slaveサービスのトラブル

#問題
Jenkinsサーバを更新または再起動すると、WindowsのSlaveから接続が不安定になりSlaveのCPUが100％になる
ノードサーバでJavaアップデートするとjenkins_salveサービスが起動しない（起動・停止を繰り返す -> CPU100%）

#対応
jenkins_slaveサービスの再設置

### jenkins_slaveサービス停止・削除

```
sc delete jenkinsslave-C__jenkins
```

### Jenkinsサーバからslave-agentダウンロード

http://jenkins.domain.com:8080/computer/Windows/slave-agent.jnlp

### jenkins_salveサービス登録

cmdを管理者として実行
{Jenkins場所}\jenkins-slave.exe install

#動作確認
java_homeパスが正しいか確認
"C:\Program Files (x86)\Java\jre1.x.x_xxx\bin"\java.exe -Xrs  -jar "c:\jenkins\slave.jar" -jnlpUrl http://jenkins.domain.com:8080/computer/Windows/slave-agent.jnlp -secret xxxxxxxxxxxxxxxxxxxxx825d626f8
カレンダーを使用して日付を指定する flutter

#カレンダーのUIで日付pickerを作ってみた。

今回はユーザーの誕生日を聞くためにshowDatePickerというのを使ってみました。

#完成型
![Screenshot_1567994864.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373270/4c2b9924-c959-c160-0bd8-1904663f61cc.png)

##準備
なし！



##コードを書いてみる
```main.dart

...
static Widget buildTextField() {
    return TextField(
//DisableFocusNodeでキーボードを表示しない
//前の記事を参照
//https://qiita.com/Renkon117/items/1e6f972b4a60c25718d4
      focusNode: AlwaysDisabledFocusNode(),
      controller: selectDateController,
      style: TextStyle(
        fontSize: 20.0,
        height: 1.0,
        color: Colors.black,
      ),
      onTap: () => _selectDate(context),
    );
  }
...
                              
```

```selectDate.dart
DateTime selectedDate = DateTime.now();

  Future<Null> _selectDate(BuildContext context) async {
    final DateTime picked = await showDatePicker(
      context: context,
      initialDate: DateTime(2000, 1),
      firstDate: DateTime(1900, 1),
      lastDate: DateTime.now(),
    );

    if (picked != null && picked != selectedDate) {
      setState(() {
        selectedDate = picked;
        //ここで選択された値を変数なり、コントローラーに代入する
        selectDayController.text = selectedDate.day.toString();
        selectMonthController.text = selectedDate.month.toString();
        selectYearController.text = selectedDate.year.toString();
      });
    }
  }
```

##まとめ
今回はTextFieldのInputが押されたときにカレンダーが表示されるという設定でしたので少々ややこしいかもしれません。

#Flutter関連記事
[flutterでQRコードリーダーを作ってみた
](https://qiita.com/Renkon117/items/39c031c7123ecc193294)
[Flutter 入門　-textFieldを開いたときにkeyboardを表示しない-
](https://qiita.com/Renkon117/items/1e6f972b4a60c25718d4)
[Flutterでtodo Listを作ってみた　－初心者必見－](https://qiita.com/Renkon117/items/30175c2a4e6ebd835ca1)
Ruby on Rails コマンドコンソールの使い分け

# 目的

- Ruby on Railsで使用するコマンドの実行場所をまとめる
- WindowsでのRuby on Railsの環境でのコマンド実行環境の使い分けをまとめる  
※ほぼ自分用のメモです。もし間違えてる箇所ありましたら教えていただきたいです。

# 押さえるポイント

- コマンドの実行環境はコマンドプロンプトとrailsコンソールの二種類がある。
- Railsコンソールの起動はコマンドプロンプトにてコマンド`rails console`を実行すると起動する。
- Webアプリ作成時のコマンドやファイル作成のコマンドはコマンドプロンプトで実行する。
- Webアプリ内のデータのやり取りはrailsコンソールを使用する。
deviseのヘルパーメソッドについて

##はじめに
deviseを導入した際に使えるようになる、便利なヘルパーメソッドについて、備忘録として投稿します。

##deviseとは
ユーザーの新規登録、ログイン、ログアウトなど、認証に必要な機能を追加することができるgemです。

##deviseの導入方法について
【参照】
https://qiita.com/cocoa-engineer/items/625da569fcac1ad2db1f

##deviseのヘルパーメソッド
deviseを導入すると、以下の機能が使えるようになります。

|メソッド |機能  |
|---|---|
|before_action :authenticate_user! |ログイン済ユーザーのみにアクセスを許可する  |
|current_user  |現在ログインしているユーザーを取得する  |
|user_signed_in? |ユーザーがサインインしているかどうかを判定する |
|user_session |ユーザーのセッション情報にアクセスする |

※「user」の部分はモデル名になるので、モデル名に応じて「user」部分を書き換えてください。

各ヘルパーメソッドの使い方については、以下のとおりです。

##before_action :authenticate_user!

特定のアクションを、ログイン済みユーザーでないとアクセスできないようにするため、以下のようにコントローラ内に設定します。
※ログインしていない場合は、ログインページにリダイレクトされます。

```ruby
class SampleController < ApplicationController
  before_action :authenticate_user!, only: [:show]

  def index
  end

  def show
  end
end
```
このようにonlyを使うと、showアクションはログイン済みユーザーのみアクセス可能とし、indexアクションはログインしていなくてもアクセスできるようになります。

また、以下のように、exceptを使っても同じことが書けます。

```ruby
class SampleController < ApplicationController
  before_action :authenticate_user!, except: [:index]

  def index
  end

  def show
  end
end
```

##current_user

現在ログインしているユーザーを取得できます。

idを取得する際は、「current_user.id」で取得できます。

```ruby
	
<%= link_to "プロフィール", user_path(current_user.id) %>
```

##user_signed_in?

ビュー等でcurrrent_userを使うと、ログインしていない場合エラーになってしまうので、このメソッドを使って条件分岐します。

```ruby
<% if user_signed_in? %>
    <%= render 'layouts/login_user_header' %>
<% else %>
    <%= render 'layouts/no_login_user_header' %>
<% end %>
```

##user_session

ユーザーのセッション情報にアクセスできます。

##参考サイト
https://qiita.com/tobita0000/items/866de191635e6d74e392
https://qiita.com/k4ssyi/items/3edcd0e5373a41677dee
awscliで資格情報を使い分ける



## プロファイルを指定して資格情報を埋め込む

```
aws configure --profile sample
```

## プロファイルを指定してawscliを実行

```
aws ec2 describe-instances --profile sample
```

## 設定情報のありか
```
cat ~/.aws/credentials
cat ~/.aws/config
```

## 感想
環境ごとに上書きしなくて良いので便利
EC2上で動作させるGrafanaで、CloudWatchをデータソースとして追加する（IAMロール利用）

# TL;DR

* EC2上で動かしているGrafanaで、CloudWatch経由でメトリクスを取得したい
* Credentialsを直接指定するのではなく、IAMロールでの指定としたい
* IAMロールを使用する場合、Auth Providerは`Credentials`または`Access & secret key`を選び、`profile`や`Access key ID`、`Secret access key`は指定しない


# Amazon CloudWatchをGrafanaのデータソースとする

Grafanaのドキュメントとしては、以下に記載があります。

CloudWatchにアクセスするための情報取得の優先順位としては、以下のようになります。

[Grafana / AWS CloudWatch](https://grafana.com/docs/features/datasources/cloudwatch/)

> If Auth Provider is Credentials file, Grafana try to get credentials by following order.  
>     ・Environment variables. (AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)
>     ・Hard-code credentials.
>     ・Shared credentials file.
>     ・IAM role for Amazon EC2.

[AWS credentials](https://grafana.com/docs/features/datasources/cloudwatch/#aws-credentials)

ここは、Credentialの情報を直接入力したりファイルに書いたりするのではなく、IAMロールを使ってやりたいところですね。


# 環境

利用するGrafana。

```shell
$ bin/grafana-server -v
Version 6.3.5 (commit: 67bad72, branch: HEAD)
```

OSの情報。

```shell
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

$ uname -a
Linux ip-xx-xx-xx-xx.ap-northeast-1.compute.internal 4.14.133-113.112.amzn2.x86_64 #1 SMP Tue Jul 30 18:29:50 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```


# IAMロールを作成してEC2にアタッチする

GrafanaからAmazon CloudWatchを利用する際に、作成が必要なIAMロール（ロールに付与すべきポリシー）は、ドキュメントに記載があります。

[IAM Policies](https://grafana.com/docs/features/datasources/cloudwatch/#iam-policies)

まずは、こちらをEC2にアタッチしておきます。


# Amazon CloudWatchをGrafanaのデータソースとして追加する

ここで、ついついAuth Providerに`ARN`を選んで、`Assume Role ARN`に作成したIAMロールのARNを入力したくなるのですが、これはうまくいきません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/212921ac-3aa0-9290-f266-7c90e8cc9773.png)

`Credentials file`または`Access & secret key`を選択します。

`Credentials file`を選んだ場合は、`Credentials profile name`を指定しない、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/dfbb58d4-43df-2230-2ad1-4fe905c47416.png)

`Access & secret key`を選んだ場合は、`Access key ID`および`Scret access key`を指定しないようにすれば、データソースに追加することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/5388c56d-2d7e-4e86-4bfe-a202df19cc98.png)

ちょっとしたハマりどころ（？）なので、メモとして。
MacにSQL Developerをインストールする方法

- 環境
    - macOS Mojave バージョン10.14.6
    - java version "1.8.0_45"


# ダウンロードして起動する
1. [Oeacleのダウンロードページ](https://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html)を表示する
1. ![スクリーンショット 2019-09-09 9.58.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/192e31d9-d57f-3777-0610-939dfe60ddd8.png)からログインする
2. ライセンスに同意するのラジオボタンをON
3. ![スクリーンショット 2019-09-09 10.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/11bc57bd-5e15-9705-9865-0b88bb0fb5e1.png)からダウンロードする
    4. 今回ダウンロードしたのは[sqldeveloper-19.1.0.094.2042-macosx.app.zip]
1. zipを解凍して出てきた[SQLDeveloper.app]をアプリケーションディレクトリに格納する
2. Launchpadから起動する![スクリーンショット 2019-09-09 10.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/55a60dce-7d1c-f6c5-d3dd-4eddc0ea3e47.png)

# Oracleデータベースに接続してみる
1. ![スクリーンショット 2019-09-09 10.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/d8896ffd-0241-d73a-dd93-9bdfe5a89b7f.png)
1. ![スクリーンショット 2019-09-09 10.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/126d9898-62b7-0af9-8dbb-f98d221979fa.png)[+]マークから接続設定のダイアログを開く
2. 接続内容を入力して[テスト]ボタンを押下
1. 左下の[ステータス]に「成功」と表示されれば接続できているので[保存]ボタンで接続内容を保存する
    1. ![スクリーンショット 2019-09-09 10.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1b035097-63df-19be-20cc-678f33e63b2f.png)
Ubuntu18.04でMacbookのiSightカメラを利用可能にする

YOLOv3とか使ってみてリアルタイムのobject detectionをしようと思ったら，
Macの内蔵のiSightカメラがなんか使えなかったので自分用メモとして残しておく．
## 環境
- MacBook Pro (Retina, 15-inch, Mid 2015)
- Ubuntu 18.04.3 LTS

## やったこと
基本的には以下のコマンドをコンソールに打ち込んだだけ
とりあえず管理者権限へ切り替える

```
$ sudo su
```

gitのclone

```
$ git clone https://github.com/patjak/bcwc_pcie.git
```

cdする

```
$ cd bcwc_pcie/firmware
```

makeしてインストール

```
$ sudo make
$ sudo make install
```

上の階層でもう１回makeしてインストール

```
$ cd ..
$ sudo make
$ sudo make install
```

あとはカーネルモジュールのロードとか

```
$ sudo depmod
$ sudo modprobe -r bdc_pci
$ sudo modprobe facetimehd
```

これでLinuxからでもiSightカメラが利用可能になった。
v4l-utilsから使用できることを確認して終了！
Vue.jsでnth系擬似クラスのジェネレータを作成しました。

#リンク
[nth-of-type generator](https://h40831.github.io/nth-of-type-generator/)
#目的
CSSの疑似クラス nth-child / nth-last-child / nth-of-type / nty-last-of-type について、 
感覚的に理解するためのジェネレータです。 CSSの学習にご活用ください。
#使い方
1. 縦方向に表示する要素の数を入力する。
1. 横方向に表示する要素の数を入力する。
1. テストしたい擬似クラスを選択する。
1. 擬似クラスのカッコ内の指定方法を入力する。(odd、even、3n+1など)
1. 生成された要素をクリックすると、擬似クラスの対象外に指定することができる。

#背景
Vue.jsの練習用に、かんたんなジェネレータを作成しようと思いました。
nth-of-typeのジェネレータだったら、自分の仕事でも使えるし、うまくいけば広告収入も得られるんじゃ？と考えて作成してみました。
（後々ググったら、すでに作ってる人いましたけどね。）

#感想
おもってたよりは時間かかったけど、
リアクティブなJavaScriptフレームワークや、flexboxや、Github Pagesのおかげで、
こういうジェネレータを作って公開するのがすごく楽になったのだと思います。
自分のしごとのスタイルにあわせた形の、自分用のジェネレータが気軽につくれるのはいいことだと思いました。

#お願い
収益化の知識が一切なく、経験がほしいので、よかったら広告クリックしてください。
ていうか収益化の知識とかコメントください。
あと、ジェネレータについても、ここをこうしたらもっとわかりやすいとかのアドバイスもぜひ！

（スマホ用に調整してないので、スマホからだとUI微妙ですね。時間あるときに改善します。）
config.hosts Rails 6

この記事ではRails6でのconfig.hostsの追加方法を記載します。

######バージョン情報
rails 6.0.0
Ruby 2.6.3

######config.hostsの追加
"hostname"の箇所はドメイン名に読み替えてください。
config/application.rbに追加しました。
config/environments/development.rbに追加する方法も他の記事で紹介してありましたが、私の環境では上手く動作しませんでした。

```Ruby:example-app/config/application.rb
module ExampleApp
 class Application < Rails::Application
 config.load_defaults 6.0
 config.hosts << "hostname"
end
```

下記の記事を参考にしました。
https://www.fngtps.com/2019/rails6-blocked-host/
https://qiita.com/taiteam/items/a37c60fc15c1aa5bb606
https://github.com/rails/rails/pull/33145
Vim日本語チートシートを、リッチ風デザインにリメイクしてみた。


全ては元記事のおかげで成り立っています。
元記事:[Vim日本語チートシート作った](https://qiita.com/zipper/items/8fbed306e203b17be0c3)
![VimCheetSheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365927/0b62dd70-2e13-2b87-6a88-efbf84037c8c.png)

# あらすじ
Vimを常用エディタにしてみたいと思い、`vimtutor`を試してみたりしましたが、
ひたすらこれを繰り返して身につけるのは、辛抱強さに欠ける自分にとってはキツかったので、
Vimのチートシートを探していたところ、上記の神記事に遭遇しました。
そのまま印刷してそばにおいておくのもよかったのですが、どうせなら自分でリメイクしてみたら、より一層身につくかなぁと考え、Illustratorでリメイクしてみました。
今後はVimの練習をしつつ、適宜説明文を書き換えたりして、Vimスキルを我が物にしたいです。

# 元ファイル
ai形式、pdf形式、png形式のファイルを[Googleドライブ](https://drive.google.com/drive/folders/1sTjyazNlxmXrB94uFmrejcTxfkZH_jPJ?usp=sharing)にアップロードしました。
ご自由にお使いください！

# あっ
自分用に、`Control` `Shift` `Command`キーの印字も作成していた影響で、右Shiftだけ表示消し忘れてました…
時間あるときに修正します(ごめんね)
php-master-changes 2019-08-25

この日は鬼車の更新、テストの修正、arginfo の PHP スタブへの移行、chunk_split() の実装修正、不要コードを削除する修正があった！

# 2019-08-25
## smalyshev: Update Oniguruma to 6.9.1
- https://github.com/php/php-src/commit/d3f2cfe20a5e9faf967c404a872ec9b4e14efe81
- [7.3~]
- ext/mbstring で、鬼車を 6.9.1 へ更新

## nikic: Skip memory_limit test without ZMM
- https://github.com/php/php-src/commit/3602fea659be3777a04f316023b0001646ab42bf
- ZMM 無効時に memory_limit のテストをスキップするよう修正

## cmb69: Add stubs for ext/ftp
- https://github.com/php/php-src/commit/4742b2e1de47164eb33f318148509bb738129177
- ext/ftp で、arginfo を PHP スタブへ移行

## noobshow: Add some header and html function stub
- https://github.com/php/php-src/commit/b9c961e1601efc7abef9586f5145e00a2d8ed0cd
- [header()](https://www.php.net/manual/ja/function.header.php) や [setcookie()](https://www.php.net/manual/ja/function.setcookie.php)、[htmlspecialchars()](https://www.php.net/manual/ja/function.htmlspecialchars.php) 等いくつかの組み込み関数の arginfo を PHP スタブへ移行

## nikic: Make string size calculation in chunk_split more precise
- https://github.com/php/php-src/commit/d955ee9f6b7e60895cac412969f9ddec91fbd2bb
- [chunk_split()](https://www.php.net/manual/ja/function.chunk-split.php) の実装で、文字列長の計算を正確化
- 無駄なアロケーションがあった

## nikic: Remove unnecessary NULL check
- https://github.com/php/php-src/commit/4346d1b0e66e99809ba7ad9592198f79f673e744
- [stripos()](https://www.php.net/manual/ja/function.stripos.php) の実装で、不要な NULL チェックの削除

## nikic: Remove unnecessary haystack length check in stripos()
- https://github.com/php/php-src/commit/6e3135070c13293c2f5f4d8a22ec282fd00f3f21
- [stripos()](https://www.php.net/manual/ja/function.stripos.php) の実装で、不要な haystack の長さチェックの削除
『crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません』の解決方法

ネット上の情報で解決できなかったので、同じ境遇の人のためにここに残しておきます。

```
$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
```

## 遭遇したエラー

`crond start`や`crond status`すると、`crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません`と表示されてめちゃくちゃムカつく。



## ネット上の情報

このエラーは珍しくもない様で、検索するとたくさん出てくる。しかし、検索して出てくる解決方法はほぼ全て以下の方法。

1. `rm /var/run/crond.pid`で削除。
2. `ps ax | grep crond`を実行して出てくるcrondのプロセスを全て`kill`する。

3. `crond start`で起動。

実際、これでほとんどの人は解決している様なので試してない人は是非試してみてほしい。けど、僕の場合はどんな順番でPIDを削除しcrondを起動しようがずっと

```
crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません

crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません

crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません
```

と表示され続けた。３時間もそれは続いた。



## 解決方法

1. とりあえずすでにあるプロセスとPIDファイルは消す。
2. `systemctl start crond`する。

ポイントは`crond start`や`crond status`をしないこと。`crond start`や`crond status`をすると`リソースが一時的に利用できません`になるという単純な話だった。



## これでも解決しなかったら

プロセスのリミットが原因の場合、`/etc/security/limits.conf`に

```
root	-	nproc	unlimited
```

を追加したら解決した、みたいな記事を見かけた。
僕はこの方法で解決しなかったがもしかしたらこれで解決するかも。
R Studioでのパッケージインストールの失敗


Win10上でR Studioでパッケージをインストールしようとして嵌まったので備忘．

# パッケージインストールの失敗
普通に`install.packages()`を実行したら，まず最初にこんなWindowが出てきた．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/7065d7bf-676c-57e9-7299-682546af5b47.png)

?????に当たるのは，おそらく現在使用している作業フォルダ（データやらなんやらが入っている，日本語名のフォルダ）なんだろうけど，日本語部分が文字化けしている．

ここでYesをクリックしても，同じWindowが出てくるだけで先に進まない．

そこでNoをクリックすると，今度はこんなWindowが出てきて，とにかくインストールに失敗する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/7e0aa433-fc60-a5ef-f813-4d736df7265f.png)


# 管理者としてRStduioを実行．

ネットで調べてると，こういう情報があった．
https://teratail.com/questions/65283

Rstudioを管理者として実行するとうまくいくらしい．
ということで，RStudioのショートカットを右クリックするとメニューに「管理者として実行」とあるので，それをクリックして実行．

toolメニューから`install.packages`を実行すると，素直に次の画面に進んだ．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/9c7ba20d-284e-4573-0450-a642a1e39fd8.png)

#常に「管理者・・・」で実行するための方法

いちいち毎回右クリックで起動させるのは面倒．
ということで，ショートカット上で右クリック，メニューからプロパティを選び，互換性タブのなかの「管理者として・・・」にチェックをつける．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/4fb9a9d6-905c-021f-ea12-bc699171a945.png)

これで，普通にダブルクリックで起動しても，管理者として実行され，パッケージインストールも素直に進むようになる．
Swaggerで作成したWebAPIをDreddを使ってテストする

<img width="739" alt="スクリーンショット 2019-09-06 10.43.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/ffd44a7b-dfd1-c989-f15e-1c8fbbb1d7fe.png">
https://dredd.org/en/latest/

#はじめに
以前、[Swaggerを使ったAPIの自動生成](https://qiita.com/se_fy/items/ad05a3c6825bb9612170)を紹介しました。
今回は、WebAPIのテストツールDreddを使って、Swagger仕様書で作成したWebAPIのテストを実行してみたので紹介します。

#Dreddのインストール
まずNode.jsとnpmがインストールされていることを確認します。

```
$ node -v
v12.1.0
$ npm -v
6.9.0
```
Dreddは以下コマンドでインストールできます。

```
$ npm install -g dredd
```

#Dreddの実行
```
dredd swagger.yaml https://test.com
```
##オプション
`--reporter=apiary`
このオプションをつけて実行することで、テストを実行した最後にURLが表示され、WEB上でテスト結果を確認することができます。

`--user username:password`
Basic認証がかかっている場合は、このオプションをつけて実行することでテストできます。


#ハマったところ
業務で作成したswagger仕様書でDreddを使ったテストを試しましたが、以下でハマりました。
###GETパラメータの例が無いと怒られる
・表示されたエラー
Required URI parameter 'parameterName' has no example or default value.

・解決方法
`x-example`で例を記載する

###POSTのbodyが空になる
`produces`でcontent-typeの指定を行っていたのですが、これではPOSTのbodyが空になってしまい、テストできないようです。
・解決方法
`produces`→`consumes`



#参考
[HTTP APIのテストツールDreddがSwaggerに対応していたので試してみた](https://blog.leko.jp/post/dredd-supports-swagger/)
[DreddによるローカルAPIテスト](https://docs.oracle.com/cd/E91812_01/tools/automated-testing/testing-local/index.html)
[API Blueprintで書いたAPI仕様書をDreddを使ってCircleCIでテストしてみた](https://blog.mmmcorp.co.jp/blog/2018/01/18/api_blueprint_dredd/)
[swaggerを読み込み自動でAPIのテストを実行するツール：dredd](https://www.setouchino.cloud/blogs/68)
追伸。そろそろおまえもpsqlコマンドを学ぶように。　母より

## psqlとは

まず簡単にpsqlとは何かということを説明します。

手始めに[公式ドキュメント](https://www.postgresql.jp/document/11/html/app-psql.html
)から引用してみると、

> psqlとはPostgreSQLのターミナル型フロントエンドです。 対話的に問い合わせを入力し、それをPostgreSQLに対して発行して、結果を確認することができます。 また、ファイルから入力を読み込むことも可能です。 さらに、スクリプトの記述を簡便化したり、様々なタスクを自動化したりする、いくつものメタコマンドとシェルに似た各種の機能を備えています。 

と説明されています。

自分なりに誤解を恐れずに噛み砕いた表現をすると、psqlは
**「DB(PostgreSQL)に対して操作や設定を行うためのCUIツール」**
です。

以下に初心者の方および自分のために主要なコマンドをいくつか記載しておきます。

## バージョン確認
`psql --version`

## 接続と切断
接続
`psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名`

切断
`\q`

## データベース関連
一覧表示
`\l`

選択
`\c データベース名`

## テーブル関連
一覧表示
`\dt`

構造表示
`\d テーブル名`

## 終わりに
短めですが、psqlの主要なコマンドをまとめてみました。
新たに学んだコマンドは随時追加していきますので、よろしくお願いします。

最後までお読みいただきありがとうございました。

## 参考文献

公式ドキュメント
https://www.postgresql.jp/document/11/html/app-psql.html

PostgreSQLの基本的なコマンド
https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb
超カンタン！CSSで画像を自在に切り抜く方法

どうも！Hiroyukiです！

今日は、
###「CSSで画像を自在に切り抜く方法」
をご紹介しますっ！

つまり、
###好きな位置で画像を切り抜いて表示できるっ！
という、素ん晴らしぃ〜ものです（＾o＾）
###僕もやってみたら、超カンタンで驚きでした（笑）

実際の利用例は、下記の通りです。

#元となる画像のアップロード機能
<img width="642" alt="スクリーンショット 2019-09-09 6.14.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489124/fb0bdd7e-5e79-b207-b342-fb89b06f6f48.png">


#切り抜き後の画像表示　※切り抜き高さを「任意」で指定できますっ！
<img width="638" alt="スクリーンショット 2019-09-09 6.14.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489124/0d44a179-152a-5409-0692-d8ad34efbf31.png">

#元となる画像アップロード機能を実装

HTML

```php
<h2>トップ画像をアップ</h2>

<figure>

        <img class="rounded" src="{{ Storage::disk('s3')->url(Auth::user()->top_image_url) }}">
        <figcaption>現在のチャンネルトップ画像（編集前）</figcaption>

</figure>

<form method="POST" action="/storeTop" enctype="multipart/form-data">

         {{ csrf_field() }}

         <input type="file" name="photo" class="btn">

　　　　　<input type="submit" value="更新する？" class="button btn btn-primary">
             　
</form>
```

コードだとこんな感じです。

###アップした画像を表示させる　imgタグ の  src = "〜〜"  の中身は、当然自由なパスを入れて下さい！

ここでは、PHP/Laravelを使って、S3というAWSのストレージ機能のパスを示しているんですが、
ご自身が画像を保存する先のパスを入れて貰えれば、OK!!


#CSSを使って画像を切り抜く！

はい、ここから本題ですね！

HTML

```php
<h2>トップ画像を編集</h2>

<figure>

        <img class="rounded" src="{{ Storage::disk('s3')->url(Auth::user()->top_image_url) }}" style="width:1200px; height:200px; object-fit:cover; object-position:0% {{ $user->top_trim }}%;">
        <figcaption>現在のチャンネルトップ画像（編集済）</figcaption>

</figure>

<form method="POST" action="/topTrim">
   <div class="form-group">
     <label>切り取る位置（高さ）を 0 ~ 100 の数値で入力</label>
     <div>
          <input type="number" name="top_trim" required>
          <div>例）画像の一番上を切り取る : 0 を入力</div>
          <div>   画像の一番下を切り取る : 100 を入力</div>

     </div>
   </div>

   <input type="submit" value="更新する？" class="btn btn-primary">

</form>
```


imgタグ の  src = "〜〜"  で、上のアップした画像を表示させるものと「同じパス」を持ってきて、
それを切り抜きます！

###ボクのページの場合、Twitterのマイページのトップ画像みたいに、横に細長〜く切り抜きたいので、
（上記コードも横に細長〜いため、右にスクロールしないと分かりづらいかも知れませんが（笑））

imgタグに

```php
style="width:1200px; height:200px; object-fit:cover; object-position:0% {{ $user->top_trim }}%;
```

"width:1200px; height:200px" と、任意で「表示させたい画像幅・高さ」を書いています！

で、ここからがポイント！

###"object-fit:cover;"と記載することで、

###「画像のタテヨコ比を保持したまま、トリミングが可能となりますっ！！」
######初めてできたとき、「スッゲぇ〜〜」ってなりました(笑)

更に、
###"object-position: 横の位置% 縦の位置%;"と追記すれば、

###「横の位置＝一番左から○%の位置で切り取る」
###「縦の位置＝一番上から○%の位置で切り取る」

***なんていう、すごく融通が効く、、、ステキすぎることが出来ちゃいま〜す！！（感涙）***

このCSSの設定方法も、なかなか奥が深いので、ボクが書いたものじゃございませんが
下記のサイトも参考にしてみて下さい〜

###1行追加でOK！CSSだけで画像をトリミングできる「object-fit」プロパティー
###https://www.webcreatorbox.com/tech/object-fit

で、ボクのページでは、上記機能を更に少し発展させて、
###画像を切り取る高さ（縦の位置○%）をユーザーが好きな高さに設定できるようにしてます＾＾

つまり、コードをみて頂ければ分かりますが、

```php
object-position:0% {{ $user->top_trim }}%;
```

という風に、
###「%」の前の数値を変数として、任意の値（高さのパーセンテージ）を
###持ってこれるようにしています！！

ここでは、Laravelの変数で表現していますが、当然JavaScriptの変数など、他の変数でもOKですよ〜！


###実際のサービス上で、上記機能を試して確認して頂くのが一番分かりやすい
と思いますんで、下記にボクのサービスのリンクを載せておきまーす

###ボクが作ったオリジナルWebサービス（下記リンク）
###http://youtubematome.herokuapp.com

***新規ユーザ登録　→　チャンネル設定　→　ページ真ん中らへんの「トップ画像を編集」***

で実際に使ってみることが出来まっす！！

宜しければどうぞ〜〜
【SQL】SELECT文あれこれ

SQLの条件検索のあれこれです。
※今回もメモ
※修正あれば都度修正します。
※2019/9/14修正


①名前に「hoge」とつく人だけを取得する（取得カラム：全て）

```
SELECT * FROM `テーブル名` WHERE name LIKE '%2号%'
```

②誕生日が「2019-01-01 00:00:00より後」の人だけを取得する（取得カラム：全て）

```
SELECT * FROM `テーブル名` WHERE birthday > '2019-01-01 00:00:00'
```

③誕生日が「現在時刻から100日前より後」の人だけを取得する（取得カラム：全て）

```
SELECT * FROM `テーブル名` WHERE birthday > ( NOW( ) - INTERVAL 100 DAY )
```

④それぞれの人の誕生月を取得する。誕生月の名称は「as」を使って「birth_month」する
（取得カラム：name、birth_month）

```
SELECT name, MONTH(birthday) as birth_month FROM `テーブル名`
```

⑤④の派生。それぞれの誕生月に該当する人が何人いるかを「group by」を使って取得する（取得カラム：birth_month、何人いるか(カラム名は任意)）

```
SELECT MONTH(birthday) as birth_month, COUNT(birthday) FROM `テーブル名` GROUP BY birth_month
```
今回も勉強なったわー。
nginx で日本語を含むURLをリダイレクト

* サーバー上の設定ファイルに日本語を書くとしたら文字コードをどうすればいいのか迷う
* そもそも日本語のURLでの扱いって、どうなっていたっけ？ブラウザによって日本語で表示されていたりエンコードされていたり・・



リダイレクトの規則性があまりなく、さらに元URLが日本語を含むパスからアルファベットのパスになるなどカオスな状態。

nginxのリダイレクトは日本語URLは上手く処理できるのだけど、mapという仕組みを使うと上手くいかない感じでした。

rewriteの部分がinclude出来たので、そうすることで上手く分離出来たきがする


## nginx 設定ファイル

```
...

map $request_uri $new{
   ~^/blog.* https://new-domain.jp/blog-new-dir/;
#  include /etc/nginx/conf.d/redirect_list.map;
}


server {
  listen 80;
  server_name 127.0.0.1;

  rewrite ^/tag(.*)/page* https://new-domain.jp/blog-new-dir/tag$1 permanent;
  rewrite ^/tag https://new-domain.jp/blog-new-dir$request_uri permanent;  

  include /etc/nginx/conf.d/rewrite_map.txt;

  if ($new) {
    rewrite ^ $new permanent;
  }
...
}

```

```(rewrite_map.txt)
...
 rewrite ^/イギリス首相　法的性別変更について言及.* https://new-domain.jp/blog-new-dir/england-trans;
 rewrite ^/workrjr.* https://new-domain.jp/blog-new-dir/workrjr;
...

```
カジュアル面談時に聞くこと・調べること

こんにちは。元経理エンジニアのよしにゃんです。
転職活動でのカジュアル面談時に聞くこと・調べることについて自分なりのポイントをまとめました

元経理なのでエンジニア一本でキャリアを築いてきた方とは少し違う視点かもしれないです。

#### チェックするポイント


- 仕事の進め方（受注〜納品までの細やかな流れ）
- 福利厚生
- 自社サービスか受託かSESか
- 利益はどのビジネスが軸であるか
- 財務状況
- 売上・利益
- 技術スタック
- 開発環境
- 入ってからのポジション
- 必要な技術レベル
- 給与レンジ
- 選考の流れ
- 納期に間に合わないときどうするか

補助的に説明したいところだけピックアップ。

#### 福利厚生を調べる
エンジニアとして、自分のプライベートの時間で勉強し、自分のお金で技術書を購入したりカンファレンスに参加するのは当然かもしれないのですが、もし、それを補助する仕組みがあるとうれしいですね。

例えば、業務時間の何パーセントを自分の技術学習に当ててよかったり、技術書・カンファレンス費用を負担してくれると費用を気にせず、行動できるのでとてもよいと思う。

福利厚生ではないかもしれないが、私服でよいかどうかも聞いておこう。

勤務時間のスタート時間とエンド時間。
フレックスか否か。
フレックスであれば、だいたいエンジニアは何時に来ているかも聞きたい。


#### 会社の業績を調べる
ネットでわかる範囲で調べておく。
儲かっていないと技術負債を返済したり、新しい技術を取り入れていくことは不可能なはず。

資金調達いくらしたなどはネットでわかる。
資金調達できるということは、将来性があるということだと思う。

#### 利益はどのビジネスが軸を見極める
将来性のあるビジネスモデルか。
利益の源泉はどこにあるのかを把握しておく。

#### 技術スタック・開発環境
フロント・バック・インフラなど。
技術スタック・開発環境ももちろんそうだが、
テストを書く文化であるか。
ソースレビューがあるかどうかも重要。

技術的負債についてどういう方法で返済していくか。
技術を選定する基準も聞こう。

#### 入ってからのポジション
リーダーをやるのかリードなのか。
メンバーポジションなのか。
入社することで今後のキャリアに幅が出たり、自分のやりたい方向なのかをチェックすることが必要。

#### 選考の流れ・採用にあたっての攻略法を聞く
カジュアル面談で入社したい意思が出てきたら、攻略法を聞いてみよう。
もしかするとカジュアル面談してくれたひとはあなたの味方になってくれるかもしれない。

選考の流れやスキルチェックがあるかどうか、方法はどんなものかも合わせて聞いておこう。

#### 納期に間に合わないときどうするか
仕様を調整するのか。スケジュールを調整するのか。
一時的に残業しまくって間に合わせるのか。

#### 最後に
この記事を書いていいか迷いましたが、未来の自分用のメモとしての役割もあり、投稿しました。
いろいろな条件を書いてしまいましたが、やっぱいカジュアル面談してくれた方と一緒に働いてみたいかも重要だと思うので直感も大事です。

僕は、現在、転職活動中ですが、いろいろカジュアル面談をするなかで特に気にしていることを羅列してみました。

もし、ここも気にしたほうがよいなどありましたが、コメント欄で教えてくれるとうれしいです。
DiskMaker XでmacOS MojaveのインストールUSBを簡単に作成

`DiskMaker X`でQiita内を検索したら1記事、しかも途中にちょこっと載っているだけだったので書いた。

* [DiskMaker X](https://diskmakerx.com)

## 手順

1. AppStoreから macOS Mojave をダウンロード
1. DiskMaker Xを起動。
    2. 基本、次へ次へと押すだけ。
1. USBメモリを差し込み、選択
2. 待つ

## catalina

```sh
hdiutil convert -format UDRW \
 -o ~/catalina.img \
 /Volumes/Catalina/Install macOS Catalina.app/Contents/SharedSupport/InstallESD.dmg

sudo dd if=~/catalina.img.dmg  of=/dev/disk3 bs=1m
```
システムまぎちゃんへの道～ラズパイ3B+にCentOSを入れてみる～。

巷ではラズパイといえば Ubuntu が標準のようになっている模様ですが、
そんなことはありません、CentOS があります。
私はずーっと CentOS を使ってきたのでどうしてもこれを使いたいと思ったため
読めない英語を読みながら、ラズパイ 3 Model B+ に CentOS を入れてみました。

1. CentOS を用意する。
    2. まず CentOS のイメージを http://isoredirect.centos.org/altarch/7/isos/armhfp のミラーリストからダウンロードします。
        3. 今回は、http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.6.1810/isos/armhfp/ から [CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz](http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.6.1810/isos/armhfp/CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz)をダウンロードします。
4. MicroSD カードを用意する。
    5. 私は CentOS をインストールする際に、ノート PC を使いました。MicroSD カードを使用するので好都合です。マウントも自動的におこなってくれました。
    6. まず、フォーマットします。しなくていいかも。

```
$ sudo fdisk /dev/mmcblk1
p
d
n
a
w
$ sudo umount /dev/mmcblk1
$ sudo mkfs.ext4 /dev/mmcblk1 
```
とりあえずこれでフォーマットは終わりました。次に CentOS のイメージを MicroSD カードに書き込みます。

```
$ xzcat CentOS-Userland-7-armv7hl-$MODEL-RaspberryPI-Minimal-1810-sda.raw.xz | sudo dd of=/dev/mmcblk1 status=progress bs=4M
$ sudo sync
```
これで、ラズパイの MicroSD カードスロットに MicroSD カードを挿入して起動します。起動後忘れてはいけないのは、

```
# /usr/bin/rootfs-expand
```
です。これを忘れると、容量不足に陥る可能性があります。

以上!!


参考URL：
https://wiki.centos.org/SpecialInterestGroup/AltArch/armhfp
Rails6 のAction Textで保存したリッチテキストを文字列で読み出す



試しに下記の形で`User`モデルにフィールドを追加した`profile`で参照するリッチテキストを文字列で読み出してみる。

```ruby:models/user.rb
class User < ApplicationRecord
  has_rich_text :profile
end
```

<img width="643" alt="スクリーンショット 2019-09-09 5.53.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455793/6ee72b97-a8a5-edeb-310d-7c8899ce7bde.png">

## 読み出す
``` terminal
$ rails c
pry(main)> User.last.profile.body.to_plain_text
=> "hogeほげ\n[8664c643-550521.png]fugaふが"
```
太字や斜体などの装飾情報は別に保存されているみたいだが、それ以外の情報については読み出せた。
WSLでWindowsからLinuxファイルシステムへのアクセス

## Windows 10 19H1からできるようになった

```
\\wsl$\Ubuntu-18.04
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/6ad868f3-226b-b6b4-92fa-a52d54f529f5.png)
warning: already initialized constant FileUtils::VERSION

bundle updateしたせいかrails sするとなぜか、次のようなエラーを吐くようになってしまった。
気になるので調べてみた。

```ruby
.rbenv/versions/2.6.3/lib/ruby/2.6.0/fileutils/version.rb:4: warning: already initialized constant FileUtils::VERSION
```

```bash
$ gem uninstall fileutils
Successfully uninstalled fileutils-1.2.0

$ gem update --default
Updating installed gems
Updating fileutils
Fetching fileutils-1.2.0.gem
Successfully installed fileutils-1.2.0
Done installing documentation for fileutils after 0 seconds
Done installing documentation for fileutils after 0 seconds
Gems updated: fileutils

$ rails s

# うまく行きました。

```

参考サイト
[「rails s」でwarning: already initialized constantが出る : 新人SEの気まぐれ日記](http://blog.livedoor.jp/tessai99/archives/34420514.html)

[Rails 5\.2\.0 with Ruby 2\.5\.1 console \- \`warning:\` \`already\` initialized constant FileUtils::VERSION \- Stack Overflow](https://stackoverflow.com/questions/51334732/rails-5-2-0-with-ruby-2-5-1-console-warning-already-initialized-constant)
awscliでStatusCheckFailedアラートを上げる設定を入れる

## awscliで実行

- `GreaterThanThreshold`で閾値が`0`より大きい場合、アラートが上がるように

```
aws cloudwatch put-metric-alarm --alarm-name "StatusCheckFailed" --namespace AWS/EC2 \
--metric-name StatusCheckFailed --dimensions Name=InstanceId,Value=i-0219028c30d71bee2 --period 300 \
--statistic Average --threshold 0 --comparison-operator GreaterThanThreshold \
--evaluation-periods 1 --alarm-actions arn:aws:sns:ap-northeast-1:697333814928:Default_CloudWatch_Alarms_Topic  \
--ok-actions arn:aws:sns:ap-northeast-1:697333814928:Default_CloudWatch_Alarms_Topic 
```
rails-ujs.self  500 (Internal 

Slimでフォームを作っていて追加処理したらJS側でエラーが吐かれた。

```ruby:エラー文

rails-ujs.self  500 (Internal 
```

どうやらjsで重複してリクエストされているようだ。

```ruby:app/assets/javascripts/application.js
//= require rails-ujs  # この行を削除する

//= require activestorage
//= require turbolinks
//= require jquery
//= require popper
//= require bootstrap
//= require_tree .
```

参考サイト
[rails\-ujsとjquery\-ujsで2回リクエストが送られる \- Qiita](https://qiita.com/hisas/items/8399aec3a5377bf75017)
bootstrap.self- Uncaught TypeError: Cannot read property 'fn' of undefined

```ruby:エラー文
bootstrap.self-
Uncaught TypeError: Cannot read property 'fn' of undefined
```



```ruby:app/assets/javascripts/application.js
//= require jquery
//= require popper
//= require bootstrap

# 順番を入れ替えて、これを一番したに書くようにする
# 読み込む順番があるらしい
//= require_tree .
```

参考サイト
[RailsのbootstrapでUncaught TypeError: Cannot read property 'fn' of undefined at setTransitionEndSupport エラーが発生する 他。 \- 技術系備忘録](https://lilac-xi.hatenablog.com/entry/2018/11/24/165448)
awscliでディスク使用率80%以上になったらアラートを上げる設定を入れる


## 準備
[EC2からディスク使用率を送る設定を入れておく](https://qiita.com/yuta_vamdemic/items/495e5e6d461c2e3f1182)

## awscliで実行
カスタムメトリクスなので、`--namespace System/Linux`になります。
`--dimensions`オプションに複数パラメータを付ける必要がある。この場合、スペース区切りでパラメータを追加する。（`"`で囲わない）

```
aws cloudwatch put-metric-alarm --alarm-name "DiskSpaceUtilization80%" --namespace System/Linux \
--metric-name DiskSpaceUtilization --dimensions Name=InstanceId,Value=i-0219028c30d71bee2 Name=MountPath,Value=/ Name=Filesystem,Value=/dev/xvda1 --period 300 \
--statistic Average --threshold 80 --comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1 --alarm-actions arn:aws:sns:ap-northeast-1:697333814928:Default_CloudWatch_Alarms_Topic  \
--ok-actions arn:aws:sns:ap-northeast-1:697333814928:Default_CloudWatch_Alarms_Topic
```

## 動作確認用メモ
6GBのファイルを作成

```
dd if=/dev/zero of=6G.dummy bs=6M count=1000
```
バッチファイルが途中で終了する場合

# はじめに
バッチファイルを実行した時、処理が途中で終了してしまい最後まで実行されないってことありませんか？というお話。

# バッチファイル内でバッチファイルを呼び出していませんか？
バッチファイルが途中で終了してしまうそこのあなた！バッチファイル内でバッチファイルを呼び出したりしていませんか？つまり、実行しているバッチファイルがa.batで、呼び出しているバッチファイルがb.batの場合、

```bat:a.bat
@echo off
echo Hello
b.bat
echo !
pause
```
```bat:b.bat
echo World
```
このようなコードになっていれば要注意です。この場合、a.batの4行目echo "!"は実行されません。これは、3行目でb.batが呼び出された際にa.batに処理が戻らず、終了してしまうためです。そのため、本来期待している振る舞いを実現するためには、バッチファイルやサブルーチンを呼び出すときに用いるcallを利用します。

# 正しいコード
最初に実行したバッチファイルに処理を戻すためには、callコマンドを用いて以下のように記述します。

```bat:a.bat
@echo off
echo Hello
call b.bat
echo !
pause
```
```bat:b.bat
echo World
```
これで、Hello World !と全ての文字列が表示されるようになりました。

# 最後に

バッチファイル内でバッチファイルを使用する際はcallコマンドを用いると、呼び出したバッチファイルを実行後、もとのバッチファイルの残りの部分が実行されます。また、startコマンドをcallコマンドの代わりに用いると、呼び出したバッチファイルの終了を待たずに呼び出し元の残りの部分が実行されます。これらの使い分けでより柔軟な処理が実現できそうです。
stressコマンドでメモリへの負荷をかける


## stressコマンドインストール

```
curl -OL  http://ftp.riken.jp/Linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm
rpm -ivh stress-1.0.2-1.el7.rf.x86_64.rpm
```

## メモリへ負荷をかける
`--vm-keep`はメモリを解放せずにkeep。
オプションなしだと、いちいち解放するっぽい？

```
stress --vm 3 --vm-bytes 256M --vm-keep
```

## AWSEC2の1GBインスタンス
上記コマンドだと、3つのプロセスが256MBを確保する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/36976575-d2fd-fa4b-6c7e-1b8d678d1ff9.png)

## 4つ(物理メモリ以上)起動しようとしたら怒られた

```
stress: info: [8065] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd
stress: FAIL: [8065] (420) <-- worker 8068 got signal 9
stress: WARN: [8065] (422) now reaping child worker processes
stress: FAIL: [8065] (456) failed run completed in 2s
```
[Rails]credential.yml.encの編集方法

#はじめに
Rails5.2以降でsecret.ymlファイルがない為、その記述の仕方などに苦戦したのでその記述方法について説明したいと思います。
#credential.yml.encの編集方法
`EDITOR=vim bin/rails credentials:edit`でcredential.yml.encを開く

```
EDITOR=vim bin/rails credentials:edit
```

```
# aws:
#   access_key_id: 123
#   secret_access_key: 345
以下略
```
#記述方法
今回はgoogle apiの`google_client_id`と`google_client_secret`を例に説明します。

```
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: *******************************************************************************************************************************
development:
 google_client_id: ***************************.apps.googleusercontent.com
 google_client_secret: *********************
```

developmentと付けているのはローカルでのみ実装予定でしたので記述してあります。注意点としてはスペースの開け方に注意しないとエラーが出ますので気をつけましょう。最後に`:wq`で保存して終了です。

#出来ない場合
もしcredential.yml.encがコマンドを入力しても編集出来ない場合、master.keyが違う場合があります。その場合はcredential.yml.encを削除しても問題無ければ削除し、新しくmaster.keyを生成し直します。
コマンドは先程と同じ`EDITOR=vim bin/rails credentials:edit`で生成出来ます。
そうする事で、master.keyが無ければ新しく生成する事が出来、編集も可能になります。
初期段階ならこの方法が早いかと思います。

#まとめ
secrets.ymlで環境変数の定義など覚えていた為最初は苦戦しました。Versionが違うだけで仕様が変わる事のいい勉強になりました。
以下、参考にさせて頂いた資料です。
https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39
https://qiita.com/scivola/items/cc06ddbfd94d3118f693#masterkey-%E3%82%92%E7%B4%9B%E5%A4%B1%E3%81%97%E3%81%9F%E3%82%89%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B2018-08-01-%E8%BF%BD%E8%A8%98
URLの短縮に使える整数からURL文字列にするアルゴリズム

License under NYSL

```php
function shorty($number){
    $str="0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    $len=strlen($str);
    $res ="";
    $tn=$number;
    do{
        $div = intdiv($tn,$len);
        $odd = $tn % $len;
        $res .= $str[$odd];
        
        $tn = $div;

    }while($div != 0);
    
    return $res;
}

```
awscliでメモリ使用率80%以上になったらアラートを上げる設定を入れる


## 準備
[EC2からメモリを送る設定を入れておく](https://qiita.com/yuta_vamdemic/items/495e5e6d461c2e3f1182)

## awscliで実行
カスタムメトリクスなので、`--namespace System/Linux`になります。注意

```
aws cloudwatch put-metric-alarm --alarm-name "MemoryUtilization80%" --namespace System/Linux \
--metric-name MemoryUtilization --dimensions "Name=InstanceId,Value=i-0219028c30d71bee2" --period 300 \
--statistic Average --threshold 80 --comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1 --alarm-actions arn:aws:sns:ap-northeast-1:697333814928:Default_CloudWatch_Alarms_Topic  \
--ok-actions arn:aws:sns:ap-northeast-1:697333814928:Default_CloudWatch_Alarms_Topic 
```
EC2からメモリ情報をCloudwatchへ送る

# メモリ情報はデフォルトの監視メトリクスにない
なんでー
自分でセットしてあげる必要があります。

## 以下ポリシーを持つユーザーを作成
CloudwatchとEC2へのFullAccessが付いていればいいけれど、EC2インスタンス内のフラットファイルに書き込むのでなるべく絞ったほうが良いと思う

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "ec2:DescribeTags",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/cd0f4c9c-8a6c-d77d-0b2e-44bb248d46eb.png)


## ツールのインストール

```
sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
unzip CloudWatchMonitoringScripts-1.2.2.zip
cd aws-scripts-mon/
cp -p awscreds.template awscreds.conf
```

## 上記ポリシーを持っているユーザーのアクセスキーを設定

```awscreds.conf
AWSAccessKeyId=xxxxxxxxxxxxxxxxxxxxx
AWSSecretKey=xxxxxxxxxxxxxxxxxxxxx
```

## 送信テスト（実際にはデータは送られない）
`echo $?`で`0`ならOK

```
./mon-put-instance-data.pl --mem-util --swap-util --disk-space-util --disk-path=/ --verify
```

## cronに仕込む
`crontab -e`で編集

```
*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron
```

## 実行確認

```
tail -f /var/log/cron | grep mon-put-instance-data.pl
```

## 動作確認
`Linuxシステム`項目が、Cloudwatch上の監視メトリクスに出現
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/789214fa-c1e2-5bd3-41b1-55df0e4cc173.png)


# 参考

https://qiita.com/zaburo/items/98388ef35aa2e7a477e0
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html
WebComponentsのHTMLImportsのグローバル汚染の悩みをすべて解決してみた


```html:index.html
<html>

<head>
  <link rel="import" href="/components/hello-world.html?as=hoge-piyo">
</head>

<body>
  <hello-world>動かない</hello-world>
  <hoge-piyo>動く</hoge-piyo>
</body>

</html>

```

```components/hello-world.html
<template>
  <div id="border-div">
    <p>Hello World!!!</p>
    <slot></slot>
  </div>
</template>

<script>
  /*
  # このコードの素晴らしい点
  ## A. グローバル汚染をしていないこと
  正確にはcustomElementの名前を一つ取っているが、それは利用側でコントロール可能(後述)なので、汚染とは言わない。esmoduleと同じ。
  本当に何一つ汚染していない。クラス定義ですらも！

  ## B. 利用側のimportの仕方に依存していない
  ownerDocumentを用いているので、利用側で、どのDomにHTMLImportされているのか、Component側は意識していない

  ## C. コンポーネント名を強制させない
  デフォルトのコンポーネント名としてhello-worldを提供しているがそれだけである。
  利用側が自由に名前をつけることができる。
  他にも同盟のコンポーネントがあっても全く問題がない
  */

  {
    const ownerDocument = document.currentScript.ownerDocument;
    const moduleName = new URL(document.currentScript.ownerDocument.URL).searchParams.get('as') || "hellow-world"

    window.customElements.define(moduleName, class extends HTMLElement {
      constructor() {
        super()
        const shadowRoot = this.attachShadow({ mode: 'open' })
        const t = ownerDocument.getElementsByTagName('template')[0];
        const instance = t.content.cloneNode(true);
        shadowRoot.appendChild(instance);
      }
    });
  }
</script>

```

## HTMLImportsを使ったときの悩み

- customElement名が被ったら(同名のコンポーネントがあったら)死ぬ
    - → importじのURLパラメータでcomponent名を渡すことで解決
- scriptからtemplateを参照するのに、documentから探索するのでは、コンポーネントに利用側の都合が発生して辛い
    - → ownderDocumentを用いることで解決
- ownerDocumentはコールバック(constructorのこと)では使えないので、定数に格納する必要があるが、また一つグローバル汚染が増える
    - esnextのスコープ構文でくるむことで解決
- ownerDocument等をスコープに隔離するとクラスで読めないし、クラスもスコープに入れると外部から参照できないジレンマ
    - → クラスを外部公開せず、直接customElement.defineにわたすことで解決
- クラス定義自体が一つグローバル汚染になる
    - → クラスを外部公開せず、直接customElement.defineにわたすことで解決

## 感想
HTMLImportsの辛い部分をほぼ払拭できたのではないだろうか。
私が見た記事の中で、この自分のコードが一番筋が良いと思う。
全世界に広まり、HtmlImports自体も復権することを願う。[^1]

[^1]: 本当に残念なことに、HTMLImportsはWebComponentsの中で非推奨になってしまい、今はesModuleで読み込むのが主流になっているみたいだ。最悪である。なぜなら、jsの中でhtmlをベタ書きしなくてはならないから。WebComponentsがただの改悪版Reactに成り下がったのである。(Mozillaが実装しなかったかららしい？）ともかくいくら残念とはいえHTMLImportsはスタンダードではない。
Python学ぶなら、テキスト？Progate？いや、解説動画から！

#テキストか？オンライン講座か？あれ、YouTube最強じゃね？

Progateはもうやったんだけどね。
そうじゃなくて、どうやってステップアップしていくか、具体的に解説してある動画があったのでシェア。(英語)
https://youtu.be/_uQrJ0TkZlc

これの通りにすれば、開発環境を整えるとこから解説してくれてる。
VS Code で 環境整えるの頑張ったけど、もうPyCharmに乗り移て、この動画の内容を空き時間に見てみるぞー！おー！

英語とPython、両方の勉強にもなって、一石二鳥かもしれん。
いつか こんな風に解説してる動画を、日本語で作れるようになったらいいなぁ。
とりあえず、この動画に日本語字幕つけてみようかな。

## 最後に、参考になりそうなサイトを載せとく。
* 学生のためのPython
http://python4study.9isnine.com

* 初めてのPython
Python 体系化
https://www.google.co.jp/amp/s/shinyorke.hatenablog.com/entry/python2018%3famp=1
- pyq
https://pyq.jp/
５秒で出来るtinder自動右スワイプ

#手順１

PCでGoogle Chromeを開く

#手順２

パソコン版ティンダーにログイン
https://tinder.com/

#手順３

スワイプする画面で
右クリックで検証を開く

#手順４

console画面に行く
<img width="605" alt="スクリーンショット 2019-09-09 2.33.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/175200df-67ac-2f14-a138-7db443ab0a09.png">



#手順５

```js
auto = setInterval(
function(){
var elem=
document.querySelector('[aria-label="いいね！"]');
elem.click()
},500)
```
上記のコードをコピペし、

<img width="606" alt="スクリーンショット 2019-09-09 2.31.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/d465ec68-5a8a-89af-c01f-23815d2b6775.png">

Enterキーを押す。

#超簡単５stepで
プログラマーじゃなくても自動右スワイプが可能に！！
DockerでNode.jsとかDBとかCentOSとか、色々なコンテナの一覧を見たいときに便利なリンク

# Node.jsコンテナへのリンク

非常に便利なページなのですが、ブックマークが見られない環境のためにここに書いておきます。

[node - Docker Hub](https://hub.docker.com/_/node/)

このページは簡単に言うと、

**nodejsがもともと入ってる、Docker公式のDockerfileリンク一覧**

ってことになります(ちなみにリンク先はGithubで管理されてるDockerfile)。

あとは、このページに書かれているリンクをDockerfileのFROM文として追加すればOKです。

```Dockerfile
FROM 12.10.0-alpine
```

これであとはDokcer本やDockerサイトを参考に環境を整えられればと思います。


# DBコンテナへのリンク

中にはDBが欲しいという方もいらっしゃいますので、その時のためのリンク集も載せておきます。

[mysql - Docker Hub](https://hub.docker.com/_/mysql)

[postgres - Docker Hub](https://hub.docker.com/_/postgres)

[redis - Docker Hub](https://hub.docker.com/_/redis/)

[mongo(MongoDB) - Docker Hub](https://hub.docker.com/_/mongo)

[couchdb - Docker Hub](https://hub.docker.com/_/couchdb)

[couchbase - Docker Hub](https://hub.docker.com/_/couchbase)

# 他、よく使いそうなコンテナへのリンク

よく使いそうなDockerコンテナの一覧です。

[python - Docker Hub](https://hub.docker.com/_/python)

[centos - Docker Hub](https://hub.docker.com/_/centos)

[ubuntu - Docker Hub](https://hub.docker.com/_/ubuntu)

[php - Docker Hub](https://hub.docker.com/_/php)
[phpのタグリスト](https://github.com/docker-library/docs/blob/master/php/README.md#supported-tags-and-respective-dockerfile-links)
[PHPの公式Dockerfileを読み解く](https://qiita.com/hareku/items/d44c5c08ef586e0efa43)

# おまけ・docker-composeで便利そうなリンク

docker-composeで役に立ちそうなリンク集を載せておきます

* [docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f)
* [塩焼きブログ - docker-composeで起動したコンテナにbashで入ったりコマンドを渡す](https://sioyaki.com/entry/2016/07/19/194315)

dockerの「イメージ」と「コンテナ」の違いで混乱したときのためのリンク

* [CodeCampus - Dockerのイメージとコンテナの違い](https://blog.codecamp.jp/programming-docker-image-container)

# おまけ2・ruby/railsで便利そうなリンク

直接関係ないけど、ruby/rails関連で役に立ちそうなリンクを書いておきます。

* [gem install --no-ri --no-rdoc は gem install -N にした方が良い](https://qiita.com/noanoa07/items/dd88845aa5d43e5d1e4a)
 * "--no-ri --no-rdoc" が deplicated と知らずに Dockerfile に書き込んで「あれー？　動かないー！」と時間を食ってしまったのでメモしときます
* [Tech Racho - Ruby on Railsで使ってうれしい19のgem（翻訳）](https://techracho.bpsinc.jp/hachi8833/2017_07_12/42497)
 * Railsで使えそうなgemリスト。Qiita外のリンクなので忘れずにメモ