OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCI で設定した環境変数を Dockerfile で読み込んでイメージに反映する

以前、[GIRLS.PRODUCT](http://product.girly.jp/)に参加した時、CircleCI、ECS、ECR環境でDockerコンテナを継続的デプロイする環境を作ったのですが、CircleCIの管理画面で設定した環境変数をDockerイメージに反映するのに少し苦労したのでメモです。

上記環境を設定するときは以下を参照しました。
[CircleCI+ECS+ECR環境でDockerコンテナのCD(継続的デプロイ)環境を構築する -前編-](http://dev.classmethod.jp/cloud/circleci-ecr-ecs-1/)
[CircleCI+ECS+ECR環境でDockerコンテナのCD(継続的デプロイ)環境を構築する -後編-](http://dev.classmethod.jp/cloud/httpdev-classmethod-jpcloudcircleci-ecr-ecs-2/)

# CircleCIで環境変数を設定する
Project Settingsより、環境変数を設定します。
<img width="1160" alt="スクリーンショット 2016-09-08 17.09.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/20557/95fb58b5-a23e-2af9-725f-8b1296d95d8d.png">

# circle.ymlを編集する

## CircleCIのDockerのバージョンが低いので、上げる
イメージビルド時に使う予定の`--build-arg`がDockerのバージョン1.9から使えますが、CircleCIでそのまま使うと昔のバージョンで実行してしまうので、変える必要があります。

```circle.yml
machine:
  pre:
    - curl -sSL https://s3.amazonaws.com/circle-downloads/install-circleci-docker.sh | bash -s -- 1.10.0
  services:
    - docker
```

## circle.ymlのイメージビルドするところで`--build-arg`を使う
circle.yml内ではCircleCIで設定した環境変数が使えるため、`--build-arg`でひとつひとつ丁寧にDockerfileに受け渡します。

```bash
docker build --build-arg DOCKER_FILE_PATH_NAME=$CIRCLE_CI_PATH_NAME .
```

### 上記二つを反映して実際に動かしたファイルは以下です。

```circle.yml
machine:
  php:
    version: 7.0.4
  pre:
    - curl -sSL https://s3.amazonaws.com/circle-downloads/install-circleci-docker.sh | bash -s -- 1.10.0
  services:
    - docker

dependencies:
  post:
    - docker build --build-arg WOMANSHIFT_DEFAULT_MYSQL_URL=$WOMANSHIFT_DEFAULT_MYSQL_URL --build-arg WOMANSHIFT_DEFAULT_MYSQL_PASSWORD=$WOMANSHIFT_DEFAULT_MYSQL_PASSWORD --build-arg AWS_SECRET_KEY=$AWS_SECRET_KEY --build-arg AWS_KEY=$AWS_KEY -t $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/womanshift-web:$CIRCLE_SHA1 .

test:
  post:
    - docker run -d -p 80:80 --name womanshift-web $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/womanshift-web:$CIRCLE_SHA1; sleep 10

deployment:
  prod:
    branch: master
    commands:
      - ./deploy.sh
```

# Dockerfileで`ARG`と`ENV`を使う

`ARG`で`--build-arg`で設定した変数をDockerfile内で使用すると宣言します。
`ENV`でイメージに環境変数を設定します。

### 実際に動かしたファイルは以下です。

```Dockerfile
FROM richarvey/nginx-php-fpm:php7

ARG WOMANSHIFT_DEFAULT_MYSQL_URL
ARG WOMANSHIFT_DEFAULT_MYSQL_PASSWORD
ARG AWS_SECRET_KEY
ARG AWS_KEY

ENV FUEL_ENV production
ENV WOMANSHIFT_DEFAULT_MYSQL_URL $WOMANSHIFT_DEFAULT_MYSQL_URL
ENV WOMANSHIFT_DEFAULT_MYSQL_PASSWORD $WOMANSHIFT_DEFAULT_MYSQL_PASSWORD
ENV AWS_SECRET_KEY $AWS_SECRET_KEY
ENV AWS_KEY $AWS_KEY

COPY . /opt/womanshift

COPY conf/default.conf /etc/nginx/sites-available/default.conf

RUN chmod 777 /opt/womanshift/fuel/app/logs
RUN chmod 777 /opt/womanshift/fuel/app/tmp

EXPOSE 80

WORKDIR /opt/womanshift

```

以上で、本番反映したコンテナからAWS各種サービス、MySQLに接続することが出来ました。
Sublime Textのshow_at_centerをAtomに導入する


# 前提
- mac
- apm 1.12.5
- sublimeを愛していた

# 前置き

Sublime Textで

`ctrl+l`

にデフォルトで割り振られていた
カーソルを真ん中に持ってくる奴

あれがかなりよくてAtomもSublime Textと
ほとんど変わらないなんてことを聞いていたから
試しに打ってみたが、全然できなかった

ということでパッケージ導入

# 導入方法

```
$ apm install center-line
```

# おまけ

`⌘,`でセッティング開いて
`Editor -> Scroll Past End`
を有効にするとさらにきもてぃー
ユニットテストについて

##ユニットテストとは
- クラスやメソッドを対象としたプログラムを検証するためのテスト
- ソフトウェアテストの中では最も小さい粒度のテスト
- デベロッパーテストとも呼ばれる

##ユニットテストを行う理由
自分の書いたコードに責任を持ち、不安なくソフトウェア開発を行うため

##ユニットテストの特徴
1. 万能ではない。クラスやメソッドの相互作業や機能の確認、品質の保証については、機能テストや受け入れテストなどで行うべき
2. 不具合が減り、変更に強くなる面でいうと品質は高くなる
3. プログラムとして実行できる仕様書となれる
4. 自然言語で記述したテストのあいまいさを排除できる
5. ユニットテストを書くと、自身が作成したクラスやメソッドの最初のユーザーになるため、使いにくいと感じたならば、設計や仕様に問題があると気づくことができる
6. テストコードを書くのは、最初コストがかかるが、後でほぼコスト無しで何度でも繰り返し実行が可能なので、トータル的にコストの節約に繋がる

##主流のテスティングフレームワーク(JAVA基準)
- JUnit：一番有名
- TestNG：JUnitとほぼ同等の機能を提供しているため好んで使う人もいる

##テストケースとテストスイート
- 1つのテスト項目をテストケースと呼ぶ
- テストケースには「前提条件、実行する操作、期待される値や状態」が含まれる→どのような条件でどのような操作をしたならばこうなることが期待される
- ソフトウェアテストは複数のテストケースで構成されるが、何らかの形で似たテストケースをまとめる必要がある。このように、いくつかのテストケースをまとめたものをテストスイートと呼ぶ

##テスト技法
1. ホワイトボックステストとブラックボックステスト
 - ホワイトボックステスト
     - 内部のロジックを知っていて分岐などを考慮し可能な限りすべてのロジックを実行できるようにテストケースを設計する
     - コードを理解しているプログラマがテストを行う
 - ブラックボックステスト
     - 外部仕様のみからテストケースを設計する
     - ユーザ受け入れテストや機能テストなど、比較的に大きな粒度のテストで採用される
     - プログラミングの知識よりも業務知識などが重要
2. 同値クラスに対するテスト
 - ブラックボックステストに分類される
 - 同様の結果をもたらす値を同値クラスとしてグループ化し、テストデータを選択する技法
 - 例えば、
     - 飲み物購入ボタンが「点灯」「点灯しない」「点滅」の3つのパターンを持つ自動販売機があるとする
     - 投入金額が120円以上の場合はボタンが点灯する、未満の場合は点灯しない。ただし、120円以上であってもお釣りが足りない場合は点滅する
     - 3つの結果について条件を満たすお金の組み合わせが同値グループを形成する
     - しかし、この組み合わせは膨大な量となるため、適宜代表的な値を選ぶ必要がある
3. 境界値に対するテスト
 - 「年齢が20歳以下の場合～～になる」という仕様がある場合、20と21でテストをするが、20と21という境界値を選ぶ技法 
 - 一般的にはブラックボックステストに分類されるが、プログラムとテストコードを同時に実装する場合はホワイトボックステスト的に扱われる

##ユニットテストで重要な3つのポイント
1. テストを行う前提条件
2. テストに用いる入力値や条件
3. テストを行ったときに期待する値や動作

##テストが行いやすいメソッドの特徴
1. メソッドが戻り値を持つ
2. メソッドの呼び出しの結果、副作用(オブジェクトの内部状態が変更されること)がない
3. 同じ状態、同じパラメータで実行すれば、必ず同じ結果を返す

##心がけること
- 自動化されたテスト―繰り返しいつでも実行できること
 - 開発プロセスで実行自体を自動化すると尚更
- 不安なテスト―結果が一定でないテストを避けること
 - 常にすべてのテストが成功している状態を維持することが望ましい
 - ある条件下で失敗するテストを放置すると、テストが失敗しても気にしなくなってしまう。できる限り早めに解決すること
- ドキュメントとしてのテスト―仕様書として読めること
- 問題の局所化―テスト失敗時に問題を特定しやすいこと
 - テストケースは、十分に小さな単位で可能な限り多く作るべき
 - 小さくしないとテストが失敗になった時、原因分析にコストがかかってしまうため
- 不明瞭なテスト―可読性の低いテストコードは避けること
 - テストコードは可能な限り、シンプルでわかりやすく記述するべき。テストコードもメンテナンスをするため
- 独立したテスト―実行手順に依存しないこと
mindmup / my-mind > ウェブリンクを書ける

最近色々な用途で使っているマインドマップ。
http://www.mindmup.com

`「Qiitaトップページ http://qiita.com/」`という文字列をノードに記載するとwebリンクがつくようになっていた。

例として[こちらのマップ](https://atlas.mindmup.com/yasokada/mindmup_160908/index.html)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/16fd78ad-1029-20ae-2489-6bbea86513f6.png)


### この機能の用途

mindmupをTODOリストとしても使っている。
作業中の関連webをノードに書いておくことで、作業再開時にすぐに関連webに戻れる。

### my-mindの場合

@uzeroさんに[教えていただいた](http://qiita.com/7of9/items/a31c395864dd9f875c57#comment-07444811e0a043a0265e)My Mindの場合。
上記のmindmupのファイルをMy Mindで開いてみた。

http://my-mind.github.io/?b=gdrive&id=0B-b9m8ugUmdlaV9uNFNzNGxieEE

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1114ee9b-eed8-a1a9-03ed-12105e8bd7f3.png)

webの記載がノードに表示され横長になるが、リンク機能は使える。
Thymeleafでjava.util.Map<String,Object>の内容を繰り返し表示する

大した内容ではないですが、ちょっとひっかかったのでメモ。

Thymeleafで繰り返し表示するには th:each を使います。これはjava.util.Mapの実装クラス (HashMapなど) でも使えますが、格納した値を繰り返し表示するには、次のようになります。

```html
<tr th:each="element : ${result}">
  <td>[[${element.key}]]</td>
  <td>[[${element.value}]]</td>
</tr>
```

もしThymeleafテンプレート内でフィールドの直アクセスができない場合は、アクセサも呼び出せますのでこちらを利用します。

```html
<tr th:each="element : ${result}">
  <td>[[${element.getKey()}]]</td>
  <td>[[${element.getValue()}]]</td>
</tr>
```
logrusのJSONFormatterの出力をシェル芸だけでbunyan形式に直す方法

```
app=myapp; $myapp | jq -c $". | {name: \"$app\", level: .level, msg: .msg, time: .time, v: 0, hostname: \"$(hostname)\", pid: $pid}" | bunyan -o short -L
```

P.S. https://github.com/mumoshu/logrus-bunyan-formatter を使えばシェル芸なしでできます。
[Ansible][PostgreSQL]AnsibleでPostgreSQLのCreate DBエラー

##**概要**
以前のフロジェクトで上手く動いたPostgresqlのCreate DBの部分を 
新たな案件にも使うことになりました。

以前のプロジェクトよりOSもPostgreSQLもバージョンが上がりましたので、
ググッて見て設定内容が変わったか確認してみた結果、
同じOSとPostgreSQLのバージョンを利用している方の設定内容は自分の統一しました。
しかし、以下のエラーたちが発生しました。
ので、エラーメッセージ(2つ)を見て来たはずの皆様に案内差し上げます。
***`"systemd could not find the requested service \"'avahi-daemon'\"`***
***`"unable to connect to database: FATAL:  Peer authentication failed for user \"postgres\"\n"`***

で、以下の対応で上手く解決できましたので、記事を投稿します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/465d3a4b-0fd4-4b33-5a6e-0c84524733d3.png)

##**サーバスペック**

**・CentOS 7.2**

**・PostgreSQL 9.4**

and etc

##**解決方法**
🌟まず ***`"the python psycopg2 module is required"`***のエラーです。
エラーメッセージの内容通り、python psycopg2モジュールが必須うなので、
モジュールをインストールする処理をpostgresqlを設置するとき一緒にしましょう。

```yaml:main.yml
# postgresql94のインストール
- name: install postgresql94
  yum: name={{ item }} enablerepo=pgdg94 state=present
  with_items:
  - postgresql94-server
  - postgresql94-contrib
  - python-psycopg2
```

🌟次はこちら、***`"unable to connect to database: FATAL:  Peer authentication failed for user \"postgres\"\n"`***のエラーです。
こちらは、Ansibleの書き方が変わったらしいです。
以下のように対応しましょう。

```yaml:main.yml
# データベース追加
- name: Create the RLetters PostgreSQL database
  become: yes
  become_user: postgres
  postgresql_db: db={{ dbname }}
  tags: postgresql
```

🌟多分原因は、OSがアップされ、提供しているパッケージが変わったからかなーと思っています。
（🔺もし原因が間違ったら、コメントお願いします！！！👏）

##**まとめ**
とにかく、上端の対応で上手く動きます。
しかし、**疑問**が一つあります。

以下の内容は🔗[Ansibleドキュメント](http://docs.ansible.com/)の
🔗[「postgresql_db - Add or remove PostgreSQL databases from a remote host.」](http://docs.ansible.com/ansible/postgresql_db_module.html#id4)の内容一部です。

>Examples

>```yaml:examples.yml
# Create a new database with name "acme"
- postgresql_db: name=acme
# Create a new database with name "acme" and specific encoding and locale
# settings. If a template different from "template0" is specified, encoding
# and locale settings must match those of the template.
- postgresql_db: name=acme
                 encoding='UTF-8'
                 lc_collate='de_DE.UTF-8'
                 lc_ctype='de_DE.UTF-8'
                 template='template0'
```

と
>Note

>`
This module uses psycopg2, a Python PostgreSQL database adapter. You must ensure that psycopg2 is installed on the host before using this module. If the remote host is the PostgreSQL server (which is the default case), then PostgreSQL must also be installed on the remote host. For Ubuntu-based systems, install the postgresql, libpq-dev, and python-psycopg2 packages on the remote host before using this module.
`

まず、Ubuntuベースではないけど、必要になったことなので、以下の内容は更新する必要があると・・・
>Ubuntu-based systems, install the postgresql, libpq-dev, and python-psycopg2 packages on the remote host before using this module

そして、上の例の内容ではできない！


とにかく、2つの内容全部間違っていました。
CentOSやPostgreSQLのバージョンが上がったのでそうだかな・・・

以上です！👏
素人の私でもわかる「Webブラウザだけでgithubのプルリクをする方法」

Webブラウザだけでいろんなことできると便利だと勝手に思っている私です。

最近github上で多くの方と様々なファイルの編集を行うことが多くなっているので、
表題のようなものを備忘録としてまとめておきます。
コマンドラインでやる方法はいろんなところに書かれているんですが、
意外とWebブラウザだけでやるぞって方法をちゃんと書いてあるところが見当たらないので。

そもそも論として、プルリクって何ですかという記事は腐るほどありますが
例えば[この辺](http://www.backlog.jp/git-guide/pull-request/pull-request1_1.html)にお任せします。

私の記事はほとんどの人にとって役に立たない記事かもｗ

## まずはFork
* 変更をしたいファイルがあるレポジトリを適当なアカウントにFork
 * 右上にある「Fork」ボタン押下→「Where should we fork this repository?」と聞かれるので、任意のアカウントを選択してFork)

![fork1.jpg](https://qiita-image-store.s3.amazonaws.com/0/19362/b9c30789-54e6-835d-f2d6-7bd43a666b4d.jpeg)


## そして編集（追加・削除）
* ファイルを変更したければ、変更したいファイルまで移動して当該ファイルを選択し、右上にある編集アイコン（ペンの絵）押下→編集
 * 編集はオンラインエディタでやるもよし、別途テキストエディタで作っておいてコピペするもよし、あなたの自由です。

![editdelete1.jpg](https://qiita-image-store.s3.amazonaws.com/0/19362/8564f096-39fa-2523-3939-5a9b839ad5f3.jpeg)

* ファイルを追加したいのであれば、ファイルを追加したいフォルダまで移動後、以下のどちらかの方法で：
 * 上の方にある「create new file」ボタン押下→Web上のエディタで編集
 * 上の方にある「Upload files」ボタン押下→別途作っておいたファイルをアップロード

![createup.jpg](https://qiita-image-store.s3.amazonaws.com/0/19362/731b9775-b300-6a2b-d0ba-0d12b4115a10.jpeg)

* ファイルを削除したいのであれば、当該ファイルを選択して右上の「ゴミ箱アイコン」押下(上図参照)

## いよいよプルリク
* 編集後、下の方にある「Commit changes」(or 「Commit new file(s)」)に変更内容を記載（reviewerに理解してもらえるように書くのが重要です）

![commitchanges.jpg](https://qiita-image-store.s3.amazonaws.com/0/19362/0d91e516-cf4e-800d-955f-3bf2923eb7ea.jpeg)

* 「Create a new branch for this commit...」を選択するとブランチ名を記載するためのフォームが現れるので、適当な名前をつけて「Propose file change」ボタンを押下＝これでプルリクがスタートします。ブランチ名は自分にとってもreviewerにとってもわかりやすい名前がいいでしょう。

![proposedfc.jpg](https://qiita-image-store.s3.amazonaws.com/0/19362/071757ad-02ad-4cdf-545d-a8537e294ecc.jpeg)

## プルリク後の対応
* プルリク後、reviewerからあなたの編集内容の修正を提案されたら、
 * 上記ブランチの当該ファイルまで移動
 * 編集アイコン（上記参照）を押下して編集
 * それで問題なければ「commit directly」の方を選択して「commit changes」ボタン押下。

![botton.jpg](https://qiita-image-store.s3.amazonaws.com/0/19362/360bbf84-bd37-cae5-922e-5f0755253856.jpeg)

* そんな感じで何度かの議論を踏まえ、不備や他の議論との矛盾などの齟齬がなければメインブランチにマージしてもらえるでしょうｗ


以上です。補足、ダメ出し歓迎。
netCDF > gfortran > ( netcdf.incをインクルード時の指定 > gfortran tmp.f90 -I/usr/include -lnetcdf -lnetcdff ) / ( -lnetcdfと-lnetcdffの違い )

```txt:動作環境
CentOS6.8 64bit
```

以下のディレクトリにnetcdf.incがあるとする。

```
/usr/include/netcdf.inc
```

Fortran90のソフトにて以下の宣言（と関連処理）があるとする。

```
include 'netcdf.inc'
```

以上の状況でFortan90プログラムをコンパイルするには

```
gfortran tmp.f90 -I/usr/include -lnetcdf -lnetcdff
```

`-lnetcdf`と`-lnetcdff`の違いは以下にあった。
http://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg11396.html

> The extra 'f' in the -netcdff refers to the fortran library, whereas -lnetcdf is the c library.
JMeterを利用した簡単な負荷テスト


※JMeterをインストールされていない場合は、下記リンクよりインストールをお願いします。
>http://qiita.com/tomoki-n/items/1eeb104266d53d23df75

##負荷テストの目的
とあるサイトに対して、同時に100リクエストが捌くことができるのか確認したい
##JMeterの設定
1. JMeterを起動
ここで、テスト計画の名前をつけます。わかりやすい名前に変更し保存します。
今回は”request_test”としました。
![スクリーンショット 2016-09-08 15.22.54.png](https://qiita-image-store.s3.amazonaws.com/0/60055/a5d27524-02d8-ae1f-3a8a-0de123e0ab12.png "スクリーンショット 2016-09-08 15.22.54.png")

2. 負荷シナリオを設定
左のメニューの上でrequest_testの上で右クリックし、「追加 > Threads (Users) > スレッドグループ」を選択します。
![スクリーンショット 2016-09-08 15.23.35.png](https://qiita-image-store.s3.amazonaws.com/0/60055/6d6a19cb-04b9-c383-a235-0657d2c681d9.png "スクリーンショット 2016-09-08 15.23.35.png")
スレッドグループの画面が表示されますので、名前を入力します。今回は”test”としました。
![スクリーンショット 2016-09-08 15.25.45.png](https://qiita-image-store.s3.amazonaws.com/0/60055/6fb2b51c-9888-70f9-1690-1be70b5f4a41.png "スクリーンショット 2016-09-08 15.25.45.png")
名前の入力が終わり次第、その下にあるスレッドプロパティの箇所に、「スレッド数、Ramp-Up期間、ループ回数」を設定します。
スレッド数、Ramp-Up期間、ループ回数について簡単に説明します。
- スレッド数：一度に実行するアクセス数
- Ramp-up期間：アクセス実行期間の指定（秒指定）
- ループ回数：シナリオ全体を何回繰り返すの指定
今回の条件だと、

```
- スレッド数：100
- Ramp-up：1
- ループ回数：1
```
となります。

3. テストシナリオを設定
左メニューのスレッドグループ名から、右クリックで「追加 > サンプラー > HTTP リクエスト」を選択します。
![スクリーンショット 2016-09-08 15.26.11.png](https://qiita-image-store.s3.amazonaws.com/0/60055/7e991e36-0a08-64cb-4a54-cb32d73aacdb.png "スクリーンショット 2016-09-08 15.26.11.png")

4.アクセスする対象のサーバ名（IP）、ポート、プロトコル、メソッド、パスを入力
サーバ名（IP）は、対象サイトのドメインかIPアドレスを入力します。
ポートは指定がなければ80を入れてください。
メソッドは、指定がなければGETを選択してください。
パスは、アクセスするページを指定します。
![スクリーンショット 2016-09-08 16.09.05.png](https://qiita-image-store.s3.amazonaws.com/0/60055/e2984409-4762-80b7-b563-b86798c73773.png "スクリーンショット 2016-09-08 16.09.05.png")

5.テスト結果の表示
左メニューから、スレッドグループで右クリックをして「追加 >  リスナー > 結果を表で表示」をクリックします。
![スクリーンショット 2016-09-08 16.11.08.png](https://qiita-image-store.s3.amazonaws.com/0/60055/d6a51d57-644d-99f4-a925-319874666bf0.png "スクリーンショット 2016-09-08 16.11.08.png")

これで設定完了です。

##JMeterの実行
実行するには、画面上にある、緑の三角をクリックしてください
先ほど設定した、「結果を表で表示」を見ると、以下の画面のように表示されていると思います。

![スクリーンショット 2016-09-08 15.50.21.png](https://qiita-image-store.s3.amazonaws.com/0/60055/bf8a6c4a-668b-bf90-4d0f-f7d8e95986d1.png "スクリーンショット 2016-09-08 15.50.21.png")
データがそろったら結果を分析しましょう。

※データを消すときには、画面上にある、ほうきが2個のアイコンをクリックすればOK
input要素がiPhoneで指定してないのに角丸になってしまて困った(テキストフィールドとサブミット画像が)



丸み0のサイトだったのでアカンのだ


```css:style.css
input[type="button"],input[type="text"],input[type="submit"],input[type="image"],textarea{
   -webkit-appearance: none;
   border-radius: 0;
}
```

これで解決ゾロリ！
knitr で lazy load error が出たら cache.lazy=FALSE #rstatsj

**knitr** で巨大なサイズのオブジェクトをキャッシュしようとしたら、こういうエラーが出た。

> Error in lazyLoadDBinsertVariable(vars[i], from, datafile, ascii, compress,  : 
  long vectors not supported yet: connections.c:5540
Calls: <Anonymous> ... <Anonymous> -> <Anonymous> -> lazyLoadDBinsertVariable
Execution halted

これは R 本体のバグに起因するものらしく、**knitr** には回避策として `cache.lazy` オプションが用意されているのでこれを `FALSE` にすれば良い。

```r:R
```{r cache=TRUE, cache.lazy=FALSE}
big_data <- read.table("..........")
```　
```

### 参考

- https://github.com/yihui/knitr/issues/572
RailsにRiot.js導入

riotjs-railsなどのgemがうまいこと動作しなかったり不具合があったりしたので、外部ライブラリとしての導入手順備忘録.

###環境
ruby -v => ruby 2.3.1p112
rails -v => Rails 5.0.0.1

rails new 直後のrailsルートディレクトリで作業.

```
$ sudo npm install riot -g
$ wget https://raw.githubusercontent.com/riot/riot/master/riot+compiler.js -P vendor/assets/javascript/riot.js
$ mkdir app/assets/riot app/assets/javascripts/riot
```

app/assets/javascripts/application.jsを編集して下記を追加.

```app/assets/javascripts/application.js
//= require riot
```

以上で導入終了です.

###試しにhello worldまで.

```app/assets/riot/hello.tag
<hello>
  <p>hello world!</p>
</hello>
```
  

```app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require riot
//= require_tree .


$(function() {
  riot.mount('hello');
});
```

適当なコントローラーの作成

```
$ rails g controller top index
```

```app/views/top/index.html.erb
Riot.jsテスト
<hello></hello>
```

Riot.jsでディレクトリの監視

```
riot -w app/assets/riot app/assets/javascripts/riot
```


あとはrails sしてlocalhost:3000にアクセスするとhello worldが表示されます.
Vagrantで作った2台のVMでAnsibleの練習しようとしたときのメモ（接続エラー編）

＝＝＝＝＝注意＝＝＝＝＝
この記事は、私がやってて詰まった内容をただ淡々と書いてるだけです。
同じような原因の人もいるかもしれないと思って記載しましたが、
「え、それやってて当然やん（笑）」
という意見が圧倒的に多いかもしれませんので、優しく見守ってやってください（？）
＝＝＝＝＝＝＝＝＝＝＝＝

こんなことしようとした。

１）上司から「ちょっと今のplaybook汚いから今度整理しよう。よろしゅう。」
２）what?!
３）playbook書いたことないし、そもそもansible自体触ったことない
４）んじゃ、Vagrantでhostとtarget作って、hostからtargetに対していろいろやろう

ということで、

５）コマンドプロンプトopen
６）vagrant init centos/7
７）適当にVagrantfile書いて・・・
８）vagrant up host
９）vagrant up target

で準備して、poderosaでhost側に接続。
んでいろいろ調べつつ、yum install epel-release, yum install ansibleでansibleを入れる。
ansible --version でバージョン出た。インストールおｋ！

で、早速pingを送ってみた

１０）ansible [targetのIP] -m ping

出てきたのが
　　[targetのIP] | UNREACHABLE! => {
　　    "changed": false, 
　　    "msg": "Failed to connect to the host via ssh.", 
　　    "unreachable": true
　　}

なんじゃこれ！？
よくよく調べると、~/.ssh/config がないから、接続に使うsshキーがうまく設定できてないらしい。
んじゃ設定しよう。

１１）vi ~/.ssh/config
　　　Host [targetのIP]
　　　  User vagrant
　　　  IdentityFile ~/.ssh/ansible-target-key
　　　  IdentitiesOnly yes
　　　※ansible-target-keyの中身は、vagrant up targetしたときに生成されたprivate_key

これ使って再び ansible [targetのIP] -m ping を実行

・・・結果同じやん！

え、鍵間違ってる？そもそも普通に接続できる？てことで

１２）ssh [targetのIP]

・・・・あーあーあー・・・権限が644になってたからね・・・。

１３）chmod 600 ~/.ssh/ansible-target-key

これで再び

１４）ansible [targetのIP] -m ping

[targetのIP] | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}



キマシタワー。



結果として、普段やってるはずの鍵の権限をそのままにしてたせいでした。
が、普通にansibleだと権限のことはエラーに出てこないので、別サーバに接続するときはまずsshコマンドで普通につなげるかどうかの確認が必須ですね。
axlsxで作ったExcelファイルをそのままpaperclip経由でs3に保存する

# Axlsxでレポート作成してs3に保存したい

Railsやっていたら管理画面とか作っているとレポートをExcelで出力してほしいと言われることがたくさんありますね。世の中Excelで動いてるんですよね。Excelはいろんな業務の糊のようなものですね。

バイナリデータをDBに突っ込むと、DBの容量を食うのと、DBのバックアップ時間が長くなるという問題があるので、やっぱり安定のAmazon s3に保存したいなと思ったのですが、一時ファイルを作らずにpaperclip経由でそのままアップロードしたいなと思ったのです。

# ここに書かないこと

- Railsでのpaperclipの設定方法など

# やってみた。

## モデル

モデルはReportモデルで、レポートの期間を指定するくらいです。

```rb:Reportモデル
# == Schema Information
#
# Table name: reports
#
#  id                   :integer          not null, primary key
#  start_date           :date             not null
#  end_date             :date             not null
#  content_file_name    :string
#  content_content_type :string
#  content_file_size    :integer
#  content_updated_at   :datetime
#  created_at           :datetime         not null
#  updated_at           :datetime         not null
#

class Report < ActiveRecord::Base
  has_attached_file :content
  validates_attached_content_type :content,
                                  content_type: %w(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
end
```

## レポート生成するRake Task

```rb:report.rake
namespace :report do
  desc 'Create Report'
  task :create, "start_date", "end_date"
  task create: :environment do |x, args|
    unless args.start_date.present? && args.end_date.present?
      puts "Please input start_date and end_date."
      next
    end
    start_date = Date.parse(args.start_date)
    end_date = Date.parse(args.end_date)
    range = start_date.to_time..end_date.to_time.end_of_day
    Axlsx::Package.new do |p|
      wb = p.workbook
      default_style = wb.styles.add_style(font_name: 'ＭＳ Ｐゴシック', sz: 10)
      wb.add_worksheet(name: 'Sheet1') do |sheet|
        # レポートを作成する。サンプルなので適当
        Foo.in_range(range).find_each do |foo|
          row = [foo.name, foo.price]
          sheet.add_row row, style: default_style
        end
      end

      # ここからが本番
      file = Paperclip::StringioAdapter.new(StringIO.new(p.to_stream.read))
      file.original_filename = "report_#{start_date.strftime('%Y%m')}.xlsx"
      file.content_type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
      Report.create!(start_date: start_date,
                     end_date: end_date,
                     content: file)
    end
  end
end
```

すると、s3にExcelファイルが保存されました。やったね！

# 参考URL

- [How do I set content_type using StringIO to upload to S3 using PaperClip](http://stackoverflow.com/questions/24628212/how-do-i-set-content-type-using-stringio-to-upload-to-s3-using-paperclip)
npmのコマンドを同時実行する

# ビルドしつつサーバーを立ち上げたい

`npm`のコマンドを書いている時、複数のコマンドを同時に実行したくなることがあるかと思います。例えば`build --watch`しつつ`server up`したくなる時。何も考えず`&&`で繋いでしまうと、`build --watch && server up`ではwatchが終了しないかぎりローカルサーバーが立ち上がらない事になってしまい、やりたいこととは違ってしまうかと思います。

そんな時、便利なのが`concurrently` https://www.npmjs.com/package/concurrently というパッケージです。

```bash
$ npm install concurrently -D
```
でインストール、使い方は、

```bash
$ concurrently "command1 arg" "command2 arg"
```
といった感じに同時に実行したいコマンドをダブルクオーテーションでくくってやればいいだけ。なので`npm start`でビルドしつつ監視、サーバーも立ち上げるには、

```json:package.json
{
  "scripts": {
    "start": "build && concurrently \"build --watch\" \"server up\""
  }
}
```
と言った具合にできてしまいます。とても簡単ですね。
受託の流れ

# 受託の流れ

## はじめに
受託の製作会社でwebディレクターをやっちょります。
案件の流れを整理したのでメモです。

## 案件の流れ

1.案件が舞い込んでくる
⇛営業さんありがとう（死ね）

2.クライアントが何したいのかヒアリング
⇛そこで、全体の戦略や、連動ポイントを確認

- ゴール設定
- 納期
- 次回更新タイミング

などを確認

3.要件定義
⇛webなのでかなり簡易的なものになる。
- 対応ブラウザ
- 作業範囲
- 優先順位
- 提出資料の確認

4.スケジュール
⇛いつまでに何をするのか、何をして欲しいのかをA3に収まるように作成

- 構成（WF）
- デザイン
- 実装
- 納品
- 公開

※必要に応じて素材支給日などを入れる

※クライアントのチェック期間も必ず入れる

5.デザイン
⇛確認するのは、

- 要素の抜け漏れ
- エンドユーザー視点のデザイン
- クライアントの好み

6.実装
⇛確認するのは、

- meta情報
- デザインの再現性
- alt
- ディレクトリ構造
- 表示までの時間
- 対応ブラウザチェック
- 解析タグの有無

一旦これで納品まで行きます。

とりあえず運用はマタ今度書きます～
rubyでjavascriptみたいな関数渡しをする小技

## はじめに

railsで作業してて、以下のように配列をmapして別のメソッドに通した値を使いたいケースがありました

```rb
localized_column_names = Product.column_names.map { |column_name|
  Product.human_attribute_name(column_name)
}
```

こんな場合javascriptなら関数を渡せて簡潔なのにな、と思ったのです。
以下のように

```js
const localizedColumnNames = Product.columnNames.map(Product.humanAttributeName);
```

## rubyでやる場合はMethodオブジェクトで代用

メソッドをMethodオブジェクトで渡せば可能なようです

```rb
localized_column_names = Product.column_names.map(&Product.method(:human_attribute_name))
```

オブジェクトを `do...end` のブロックのように解釈させるには頭に `&` を付けて引数として与えればOKです。
こうすると内部的に `#to_proc` が呼ばれるのかな？

まぁまぁ簡潔になりましたね
"emergency mode" で USBメモリにファイルをコピー

# 状況

先日停電があり、復旧後、Raspberry Pi が正常に起動しなくなってしまった。
起動中、以下の画面が表示され、

![IMG_1388.jpg](https://qiita-image-store.s3.amazonaws.com/0/79874/87cce713-0395-ab50-73f6-f077e558c970.jpeg)

このまま 1 分 30 秒経過後、コマンドプロンプトが表示された。

![IMG_1390.jpg](https://qiita-image-store.s3.amazonaws.com/0/79874/f6483c1c-3111-480e-3b0d-89d47f68c087.jpeg)

"emergency mode" というモードらしい。

startx コマンドを入力しても、

```shell-session
root@raspberrypi:~# startx

(略)

xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: server error
xauth:  error in locking authority file /root/.Xauthority
root@raspberrypi:~#
```

とエラーとなってしまう。
再インストールするしかなさそうだ。

幸い、/home/pi のデータは残っていたので、以下の手順でUSBメモリにバックアップした。

# ユーザファイルのバックアップ

## USBメモリの認識

USBメモリ（SONY USM16GT）をUSBポートに接続すると、画面に、USBメモリを認識したメッセージが表示された。

![IMG_1391.jpg](https://qiita-image-store.s3.amazonaws.com/0/79874/b0aced55-dade-04f8-146e-8266b1cd8a98.jpeg)

sda: sda1 として認識されたようだ。

## USBメモリのパーティションの設定

fdisk コマンドで、パーティションを設定する。

```shell-session
root@raspberrypi:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help):
```

'p'を入力するとパーティションの情報を参照できる。
まず、現在のパーティションは削除するので、'd'を入力する。
次に、新しくパーティションを作成するので、'n'を入力する。
作成するパーティションの設定はすべてデフォルトで設定した。
（すべての項目でEnterを入力）
最後に、設定したパーティション情報を書き込むので、'w'を入力する。

参考
[Raspberry Piにusbメモリをマウントする](http://sisogohanchang.blog.fc2.com/blog-entry-2.html)


## USBメモリのフォーマット

以下のコマンドで、USBメモリをフォーマットする。

```shell-session
root@raspberrypi:~# mkfs -t ext4 /dev/sda1
```

参考
[Linux パーティションにmkfsでファイルシステムを作る](http://kazmax.zpp.jp/linux_beginner/mkfs.html)

## USBメモリのマウント

以下のコマンドで、USBメモリをマウントする。

```shell-session
root@raspberrypi:~# mount /dev/sda1 /mnt
[ 秒数 ] EXT4-fs (sda1): mounted filesystem with ordereddata mode. Opts: (null)
root@raspberrypi:~#     
```

参考
[Raspberry PiでUSBに繋いだストレージ(USBメモリ・HDD・SSDなど)をマウントするちょっと素敵な方法](http://lil68060.hatenablog.com/entry/2015/07/01/034254)

## ユーザファイルのバックアップ

以下のコマンドで、USBメモリにバックアップ

```shell-session
root@raspberrypi:~# cp -r /home/pi /mnt
```

# 再インストール

Raspberry Pi の電源を落とし、

```shell-session
root@raspberrypi:~# shutdown -h
```

USBメモリを抜いておく。

[Raspberry Pi で再インストール](http://qiita.com/suppy193/items/8ad4990fcd2eb987df90)の記事にしたがって、インストールを行う。
今回のサイズは 3138 MB となっており、以前より小さくなっていた。

が、途中でエラーが発生し、インストールできなかった。
停電により、必要なファイルが破損したのかもしれない。

再度、一からインストールをやり直すことにする。

これについては、別記事にて記述予定。
Swift2.3でビルドエラーになったCarthageライブラリのビルドを通す方法

Xcode8では`Use Legacy Swift Language Version`というBuild Setting ができようになり、`Yes`を指定するとSwift2.3でビルドされるようになります。
Swift2.3にして後からSwift3に対応していくという場合に有効です。

![無題の画像.png](https://qiita-image-store.s3.amazonaws.com/0/40702/50243918-e21b-fc55-68a7-ff4c17dac4cc.png)

## Carthageで入れているライブラリがビルドエラー
ただこのままだとプロジェクト内のコードはSwift2.3でビルドされるようになりますが、Carthageを使ってライブラリを入れている場合に
`Module file was created by an older version of the compiler; rebuild 'Library' and try again: `というエラーが起きてしまいます。

Carthageで使ったライブラリをビルドした時のSwiftバージョンが、今使っているXcodeのSwiftバージョンより古いので起きているようです。

## Carthageで入れたライブラリをSwiftバージョンを指定してビルドする
`carthage bootstrap`もしくは`carthage update`の前に`TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3`とSwiftバージョンを指定する方法を使って
`TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage bootstrap`とすることで、
Swift2.3でCarthageで入れたライブラリのビルドが可能になります

## さいごに
使用ライブラリによってはソース自体がSwift2.3に対応できてなかったりするので、他の理由でビルドできないライブラリは個別にリポジトリのIssueやPRを確認してみましょう。
`2.3`でリポジトリ内を検索してみると、だいたい知りたい情報が出てきます。
<img width="990" alt="スクリーンショット 2016-09-08 14.26.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/40702/1660796b-e3d0-46bb-b3c6-14477c0f2ded.png">

「Swift2.3対応するのにもっといいやり方知っているよ！」という方がいれば、ぜひ教えてください！
案 > Qiita > 記事作成時 > タイトルのキーワードを元にtagを提案する

論文というタイトルを持つ記事がpapersやarticleなど別のタグで記載されているのを見て。

Qiita記事作成時、タイトルを入力したら関連するタグを提案する機能があれば、同じタグの投稿が増えていくかと、ふと思った。
タグの表示の時にカッコ書きで実際のタグ使用数が見えるといいかも。

```
おすすめタグ
papers(150) article(30)
```

ただし、そういう機能があることによって投稿の処理が重くなるのであれば、機能は不要と思う。

googleの「他のキーワード」のような提案機能を実装することになるだろうか。

タイトルにキーワードを含めない投稿の場合は、この機能は有効ではない。
Windowsでテスト用の巨大ファイルを作成する

#はじめに
負荷テストや性能測定のために、ギガバイト級の巨大なファイルを作成する方法です


#作り方
fsutil.exe を使います。Windows XP以降には標準で用意されているコマンドです。

```bat:Syntax
fsutil file createnew <ファイル名> <サイズ(Bytes)>
```

testfile.datという名前で、サイズ10GB(10,737,418,240bytes)のファイルを作成する例

```bat:sample
fsutil file createnew testfile.dat 10737418240
```

#注意点
- NTFSではブロックの予約のみになるので作成はすぐに終わりますが、FAT32の場合はファイルへ書き込みを行うため、それなりの時間が必要です。
- ファイルの中身はすべてゼロになります。
機械学習論文読みメモ_3

[IMPORTANCE WEIGHTED AUTOENCODERS](https://arxiv.org/pdf/1509.00519.pdf), ICLR2016
variational autoencoder(VAE)はデータの事後確率分布に関して、因子化可能である事を要求するため、近似精度に限界がある。
そのため得られる事後分布サンプリングの分布も簡単なものに制限され、モデルの表現力を出しきれない。
実際はサンプル全体の20％程度を高い確率の領域にサンプルしておけば精度の良い推論は十分可能であり、他のサンプルをもっと別の確率の低い領域にサンプルさせても問題ない。
この考え方に基づき、本論で提案する手法は重点サンプリングを用いる事で、VAEよりもより柔軟な推論モデルを獲得可能にした。実際これにより、よりタイトな変分下界を用いた最適化が可能である。
この手法は複数回事後分布よりサンプリングを行い重み付け和を用いる事で予測を行い、これはサンプル数が多ければ真の変分下界へ近づく。

[Stacked Approximated Regression Machine: A Simple Deep Learning Approach](https://arxiv.org/pdf/1608.04062v1.pdf), NIPS2016
非負スパースコーディングと畳込みスパースコーディングに基づく、多層な正則化回帰モデルを提案する。
このモデルは自然な形で一般的なDL構造と一致する。
提案モデルはスパース制約を取り入れる事で各層における非線形変換を実現している。
パラメータ最適化はPCAまたはKSVDを用いて簡単に推定可能で、少ない計算コストでstate-of-the-artのDLモデルと同等性能を実現出来る。

[Beyond LDA: A Unified Framework for Learning Latent Normalized Infinitely Divisible TopicModels through Spectral Methods](http://arxiv.org/pdf/1605.09080v4.pdf), ArXiv
LDAを一般化した、トピック間の相関を扱えるモデルを提案する。
これは正規化された任意数のi.i.d.な確率変数の和を表すnormalized infinitely divisible(NID)分布モデルを用いる事で実現される。
学習は効率的かつ理論的に扱いやすいspectral methodを用い、3次モーメントまでの情報のみで十分学習可能である事を示した。

[Generalized Multi-view Embedding for Visual Recognition and Cross-modal Retrieval](https://arxiv.org/pdf/1605.09696v1.pdf), ArXiv
rayleigh商に基づく、より一般化されたmultiview embeding手法を提案する。
従来手法は、１．two-viewかmulti-viewか２．教師なしか教師ありか３．線形か非線形かで別れた。
本論ではそれらを包括できるより一般的な手法を、一般化固有値問題で解ける形で提案する。
この手法はカーネル法、DNNの双方で非線形拡張する。

[Density estimation using Real NVP](https://arxiv.org/pdf/1605.08803.pdf), ArXiv
全単射写像のクラスを用いる事で、複雑な非線形分布をtractableでかつexactな評価や推論が可能な分布への変換を可能にした。
このモデルを用いる事で複雑なデータ分布に対する高精度な教師なし学習が可能になる。
また、モデルは従来のL2誤差コストに強く依存した学習が起こりにくく、加えて最近の手法であるbatch normalizationやresidual netも適用可能である。
WRF / MSM > Link > データの概要 / 地上物理量 / 気圧面物理量

WRF(Weather Research and Forecasting Model)関連。
メソ数値予報モデルGPV(MSM)関連。

データの概要などの情報。
http://www.jmbsc.or.jp/hp/online/f-online0c.html

> - 平成18年３月から、計算の格子間隔を５kmメッシュに細分化するとともに、運用回数を１日４回から８回としました。
- 平成19年５月から、１日８回の運用のうち４回の予報時間が、15時間から33時間に延長されました。
- 平成25(2013)年５月29日から、予報時間が33時間(最長)から39時間に延長されました。
WRF > Link > MSM > 気象庁メソスケールモデル > 水平格子間隔5km

WRF(Weather Research and Forecasting Model)関連。

気象庁のメソスケールモデル
http://www.jma.go.jp/jma/kishou/know/whitep/1-3-6.html

さらに細かいモデルとして同じページにLFM(局地モデル)がある。
Jenkinsのpipelineジョブのビルドがゾンビ化したときにやったこと

# Jenkinsのpipelineのビルドがゾンビ化した #

解決はしたので備忘録的に書いておきます。

起こったこと

Jenkinsのpipelineジョブが終わらなくなった！

スクリプトはすべて終わっているのに…
All青なのにジョブだけが終わらない…

×ボタンを押して強制終了だ！　⇒　終わらない…
こんな感じでゾンビ化したジョブがあるときの対処法（仮）

## Jenkinsを再起動してみる ##

これでOKなこともあるかも？
⇒ダメだった

## マシンを再起動してみる ##

なんか変なキャッシュ残ってそう・・・
⇒解決せず…

## 該当ジョブのビルドファイルを消しまくる ##

${JENKINS_HOME}/jobs/workspace/ゾンビ化したジョブ
以下の
buildsとworkspace*(pipelineジョブだとworkspaceが二つ以上作れる)以下を消しました。
そのあと再起動でゾンビは無事駆逐できました。

## その他

僕はやったことないのですが, jenkinsホーム以下のqueue.xmlを消すとうまくいくかもしれません
linux > gnome-terminal -e vim namelist.input > vimの起動画面になる gnome-terminal -e "vim namelist.input" にする

```txt:動作環境
CentOS6.8 64bit
```

http://qiita.com/ueokande/items/6f8fbe1285ac87b8e691
を試した。

```
$gnome-terminal -e vim namelist.input
```

vimの起動画面が表示されてしまう。

```txt:結果
                                                                               
~                              VIM - Vi IMproved                                
~                                                                               
~                               version 7.4.629                                 
~                           by Bram Moolenaar et al.                            
~                      Modified by <bugzilla@redhat.com>                        
~                 Vim is open source and freely distributable                   
~                                                                               
~                        Help poor children in Uganda!                          
~                type  :help iccf<Enter>       for information                  
~                                                                               
~                type  :q<Enter>               to exit                          
~                type  :help<Enter>  or  <F1>  for on-line help                 
~                type  :help version7<Enter>   for version info        
```

以下だとnamelist.inputの中身が見えた。

```
$gnome-terminal -e "vim namelist.input"
```

参考 http://oshiete.goo.ne.jp/qa/7859379.html
psql検索結果をファイル書き出ししたい

# バージョン
```
$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
```

```
$ psql --version
psql (PostgreSQL) 9.3.5
```

# <Font color="red">"-c"を使うやつ</Font>
```
psql DB名 -U ユーザ名 -A -F, -c "select * from hoge" > hoge.csv
```

## 良いところ
* 1コマンドでできる！

## 困ったこと：未解決
### 区切り文字をタブにする方法がわからなかった
```
psql DB名 -U ユーザ名 -A -F\t -c "select * from hoge" > hoge.csv
```
→区切り文字がない。

### 正規表現のNOT検索(!~)を使ったら、「!」で上手く動作しなかった
```
psql DB名 -U ユーザ名 -A -F, -c "select * from hoge where column !~ '[0-9]'"
```
→コンソールに「-bash: !~: event not found」って出る。

# <Font color="red">"-c"使わないやつ</Font>
```
$ psql DB名 -U ユーザ名

DB名-> \o hoge.csv
DB名-> \a
DB名-> \pset fieldsep '\t'
DB名-> select * from hoge where column !~ '[0-9]';
DB名-> \o
DB名-> \q
```

## 良いところ
* 区切り文字をタブにできた！
* 正規表現のNOT検索(!~)使えた！
最小構成のES6モジュールを用いたフロントエンド開発環境

# はじめがき
フロントエンドの開発環境複雑スギィ！
ES6モジュールが使える最小構成を目標とした覚書です。
間違ってることあったら教えてください。

# 環境
MacbookPro
node.js v6.5.0

# インストール

```bash

# プロジェクトフォルダの作成
mkdir myProject && $_

# package.jsonの生成 (エンター連打)
npm init

# webpackのグローバルインストール
npm i -g webpack

# webpackのローカルインストール
npm i --save-dev webpack

# babelの一連パッケージをインストール
npm i --save-dev babel-core
npm i --save-dev babel-loader
npm i --save-dev babel-preset-es2015

```

# サンプルファイル

```bash
mkdir src/ && $_
touch animal.js  dog.js app.js cats.js
```

```js:animal.js

class Animal {
  constructor(name) {
    this.name = name;
  }
}
export default Animal;

```
```js:dog.js
import Animal from './animal';

class Dog extends Animal {
  callName() {
    alert(this.name);
  }
}

const dog = new Dog('Natsu');
dog.callName();
```

```js:app.js
import cats from './cats';

console.log(cats);
```

```js:cats.js
const cats = ['tama', 'kuro', 'tora'];

export default cats;
```

ファイル構成はこうなります

```bash:tree 
myProject
|-- node_modules/
|-- src
|    |-- animal.js
|    |-- app.js
|    |-- cats.js
|    +-- dog.js
|
|-- .babelrc
|-- package.json
+-- webpack.config.js 
  
```

# babelの設定

```json:.babelrc
{
  "presets": [
    "es2015"
  ]
}

```

# webpackの設定

`webpack`をコマンドラインで実行することで`entry`の依存関係を解決したファイルが`output`で記述したファイルで生成されます。

```js:webpack.config.js

module.exports = {
  entry: ['dog.js', 'cats.js'],
  output: {
    path: './dist',
    filename: 'bundle.js',
  },

  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
    ],
  },
},

```

## webpack.config.jsの書き方

上の例では`bundle.js`にひとまとめされてしまうので、依存関係のあるファイルごとにファイルを生成する場合、以下のように`entry`をオブジェクトで指定します

```diff:webpack.config.js
...
- entry: ['dog.js', 'cats.js'],
+ entry: {
+   'dog': 'src/dog.js',
+   'app': 'src/app.js',
+ }
  output: {
    path: './dist',
-   filename: 'bundle.js',
+   filename: '[name].js'
  },
```

# todo
webpack.config.jsの詳細
webpack -watch

参考
[webpack.config.jsの読み方、書き方](http://dackdive.hateblo.jp/entry/2016/04/13/123000)
[ECMAScript6で書こう！WebPackとES6-loaderで環境を作り、ES6を先取り体験する方法]
(https://liginc.co.jp/web/js/other-js/132046)
端末の暦設定とdateFromString:のズレ

# 事象

サーバから取得した日付文字列をNSDateに変換する際に、想定と異なる変換結果が返却されてきた。


# 環境

* Objective-C
* iOS 9.3.2, 9.3.5
* XCode 7.3.1


# 実際のコード

```objc
NSString *serverResponse = @"2016/09/08 10:00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *responseDate = [dateFormatter dateFromString:serverResponse];
NSLog(@"%@", responseDate.description);
```


# 実行結果

```
4004-09-08 01:00:00 +0000
```


# 原因

iPhoneの暦法が「和暦」に設定されていたため、「平成2016年09月08日」と認識されてしまった。
（平成元年は1989年のため、1989-1+2016=4004となる）


# 対応

端末の暦設定に関わらず、西暦としてNSDateに変換を行う。

```objc
+ (NSDate *)convertGregorioDate:(NSString *)convertTargetStr {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    formatter.locale = [NSLocale systemLocale];
    formatter.timeZone = [NSTimeZone systemTimeZone];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *resultDate  = [formatter dateFromString:convertTargetStr];
    
    return resultDate;
}
```


# おわりに

開発時に一週間近く悩んだ問題で、コードからはなかなか見つけられなかった。
（トレースして1行ごとに変数をチェックすれば見つかったかもしれないが。）
サーバと通信して日付を文字列として返却するアプリなら必ず発生しうる問題なので、注意が必要。


# 参考サイト

* [日付を扱う際に注意しなければならない３つのプロパティ](http://dev.classmethod.jp/smartphone/ios-nsdate/)

* [【Swift】iPhoneの設定によらず西暦・24時間表示で日付を取得する方法](http://mzgkworks.hateblo.jp/entry/dateformat)
WRF > namelist.input > WRFV3/run/README.namelist > 簡易説明

WRF(Weather Research and Forecasting Model)関連。

WRFで使うnamelist.inputファイルに関して以下のリンク先に記載があった。
http://esrl.noaa.gov/gsd/wrfportal/namelist_input_options.html

>`<WRF INSTALL DIR>/run/README.namelist` contains descriptions of all the namelist variables as well as variables that can be added to the namelist for special model setups.

runディレクトリに移動してREADME.namelistを確認すればちょっとした表記を確認できる。
PrefabやSceneのSerializeされた変数の値を保持したままリネームする

# リファクタリング時に参照が外れる問題
UnityではPublicや[SerializeField]属性のついた変数はSceneやPrefab上に値が保持されます
コードのリファクタリングなどで変数名をそのまま変更すると
これらの値や参照は外れ、Default値にリセットされてしまいます
変数名のリネーム毎にPrefabの値の再設定が必要となり、非常に大変

# FormerlySerializedAsAttributeを使用する
Unityで提供している属性にFormerlySerializedAsAttributeというものがあります
http://docs.unity3d.com/jp/current/ScriptReference/Serialization.FormerlySerializedAsAttribute.html

この属性と変数に使用してリネームをかけることで
Serializeされた情報が保持されたまま変数名を変更することができます

###例）
```csharp
puclic class Hoge : MonoBehaviour
{
    [SerializeField] private MyClass Foo;
}
```

このクラスのFoo変数をリファクタリングするとします

```csharp
public class Hoge : MonoBehaviour
{
    [FormerlySerializedAs("Foo")]
    [SerializeField] private MyClass _foo;

    public MyClass Foo
    {
        get { return _foo; }
    }
}
```

このように変更したら、Unityを開いてSave Projectします。
そうすると元々Foo変数にSerializeされていたMyClassの参照が
_foo変数に保持されます

一度Save Projectかけて値が保持されたのを確認したら

```csharp
[FormerlySerializedAs("Foo")]
```

の記述は消してしまってOKです
Project Saveがするのが若干面倒ですが、Prefabの変数を
いちいちアタッチしなおす苦労に比べると雲泥の差です
Listから重複を除いたうえで指定個数に分割する方法(guavaの場合)

Listを使っている時に、重複したアイテムを除外したいなぁーって思うとき、あると思います。
また、Listを指定件数ごとに分割したいとき、あると思います。


1. 「Listからサクッと重複をのぞく」ために、重複が含まれたListを引数にしてHashSetを作り、それをまたListに戻すという方法を使います
	
	> HashSet (Java Platform SE 8 ) 
	> https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashSet.html
	
	_※ HashSetを使うと重複アイテムをサクッと除外してくれるんですが、上記にあるように順番がバラバラになったり、null値は取り除いてくれないという条件がありますのであしからず..._

	(追記)
@kacchan6@github さんにからフィードバック頂いて、「LinkedHashSetなら順序を保持」できることを思い出しましたので追記してます。ありがとうございます！
	null値は取り除けません。

	> LinkedHashSet (Java Platform SE 8 ) 
	> https://docs.oracle.com/javase/jp/8/docs/api/java/util/LinkedHashSet.html

		
2. 「Listを指定個数に分割する」にはLists.partitionを使います
	> Lists (Guava: Google Core Libraries for Java 19.0 API)
	> http://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Lists.html




この2つの処理をguavaを使ってやっちゃうサンプルです。

```build.gradle
dependencies {
	compile group: 'com.google.guava', name: 'guava', version: '19.0'
}
```

```java:PartitionedListWithoutDuplication.java
import java.util.List;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

public class PartitionedListWithoutDuplication {
	public static void main(String... args) {
		List<String> favBands = Lists.newArrayList("Lotus","STS9","Disco Biscuits","New Deal","Flying Lotus","STS9");
		System.out.println(favBands);

		// without duplicate(HashSet)
		List<String> favBandWithoutDups = Lists.newArrayList(Sets.newHashSet(favBands));
		System.out.println(favBandWithoutDups);
		
		// without duplicate and keep order(LinkedHashSet)
		List<String> favBandWithoutDupsKeepOrder = Lists.newArrayList(Sets.newLinkedHashSet(favBands));
		System.out.println(favBandWithoutDupsKeepOrder);

		// partitioned
		List<List<String>> partitionedLists = Lists.partition(favBandWithoutDupsKeepOrder, 2);
		System.out.println(partitionedLists);
	}
}
```

実行結果

```
[Lotus, STS9, Disco Biscuits, New Deal, Flying Lotus, STS9]
[STS9, Flying Lotus, New Deal, Lotus, Disco Biscuits]
[Lotus, STS9, Disco Biscuits, New Deal, Flying Lotus]
[[Lotus, STS9], [Disco Biscuits, New Deal], [Flying Lotus]]
```

重複していた「STS9」が除外され、さらに指定数(2)でみごとに分割されていますねー。

## 参考
http://google.github.io/guava/releases/19.0/api/docs/
特定の環境からsshログインした場合のみ、Tomcatの起動に失敗する

# 特定の環境からsshログインした場合のみ、Tomcatの起動に失敗する
というか、deployに失敗する。
ある人のPCからsshログインした場合は、Tomcat再起動問題なく動作するのに、
別の人のPCからsshログインしてTomcat再起動するとdeploy失敗する。

# 原因

* とあるライブラリが、環境変数LANGを使ってプロパティファイルにアクセスしていた
* 「とあるライブラリ」用のプロパティファイルを、もともと、日本語用しか用意していなかった
* sshログインした場合に環境変数LANG設定される値は、クライアント側の設定に依存する

* 成功している人はLANG=ja_JP、失敗してる人はLANG=en_USだった

# 補足
* もちろん、ログイン先の.bashrc、.bash_profileにLANGが設定してある場合は、それが優先されるよ！
WRF > namelist.inputのパラメータの説明

WRF(Weather Research and Forecasting Model)関連。

WRFで使うnamelist.inputファイル内の設定項目。
http://esrl.noaa.gov/gsd/wrfportal/namelist_input_options.html

以下の説明が網羅されている。

- &time_control	
- &domains 
- &dfi_control 
- &physics
- &fdda (grid nudging)
  - (for spectral nudging)
  - (for obs nudging) Observation nudging
- &scm
- &dynamics
- &bdy_control 
- &tc 
- &namelist_quilt 
- &grib2

| 項目 | 説明 |
|:-:|:-:|
| time_control  | Time control  |
| domains | domain def: dimensions, nesting params |
| dfi_control | Grib2 (この説明おかしい?)  |
| physics  | physics options  |
| dynamics  | Diffusion, damping, advection options |
|  bdy_control | boundary condition control  |
| tc  | controls for tc_em.exe ONLY, no impact on real, ndown, or model  |
| namelist_quilt  |  Option for async I/O for MPI apps |
[Rails5]jsonapi-resourcesでresourceのgenerateでエラーが出たら

## 事の発端

jsonapi-resources導入後に
```
rails generate jsonapi:resource [xxx]
```
でエラーが出る

## エラーの種類
`Rails 5: Uninitialized constant ActionDispatch::ParamsParser::DEFAULT_PARSERS (NameError) `

> https://github.com/cerebris/jsonapi-resources/issues/681

## 対処方法
どうも現状(9/8)ではrubyGemでは上記の対応は入っていないようなので、
githubから直接取得する

```ruby:Gemfile 
... 
gem 'jsonapi-resources', git: 'git@github.com:cerebris/jsonapi-resources.git', branch: 'master'
...
```
RedshiftからRDSにコピーする

# 概要

大量のデータをコピーしたい場合、SELECTして成形INSERTする作業をコード上で行おうとすると、メモリを食うしバッチサーバの性能が悪いとCPUネックで遅くなる

AWS上で出来るだけ早くうまいことしたい

# 手順

今回は以下のようにやってみた。

- Redshift → S3 に UNLOAD
- S3 → Batch Server にファイルをダウンロード
- Batch Server → RDS に LOAD DATA LOCAL INFILE

## Redshift → S3

LOAD DATA LOCAL INFILE に流せるように CSV 形式で UNLOAD する
通常 UNLOAD は、ノードスライス単位で並列に行うので SELECT することを考えるとだいぶ速い

```sql
UNLOAD ( ${SELECT_STATEMENT} )
TO 's3:// ${S3_PATH} '
CREDENTIALS 'aws_access_key_id= ${ACCESS_KEY_ID} ;aws_secret_access_key= ${ACCESS_KEY} '
DELIMITER ','
ALLOWOVERWRITE
ESCAPE
ADDQUOTES
```

## S3 → Batch Server → RDS

```rb
# ruby

bucket = AWS::S3.new.buckets[BUCKET_NAME]
tree = bucket.as_tree({prefix: S3_DIR_PATH})

# UNLOADしたファイルリスト
file_paths = tree.children.select(&:leaf?).map(&:key).reject{|f| f.match(/\/\z/)}
file_paths.each do |file_path|
  local_file_path = "/tmp/#{file_path.gsub('/', '_')}_#{Process.pid}"

  begin
    # UNLOADしたファイルをBatch Serverに書き込む
    File.open(local_file_path, 'w') do |f|
      bucket.objects[file_path].read do |chunk|
        f.write(chunk.force_encoding("UTF-8"))
      end
    end

    # utf8mb4で読み込む
    ActiveRecord::Base.connection.execute("SET character_set_database=utf8mb4")

    # RDSにImport
    ActiveRecord::Base.connection.execute(<<-SQL
      LOAD DATA LOCAL INFILE '#{local_file_path}'
        REPLACE INTO TABLE #{TABLE_NAME}
        FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    SQL
    )
  ensure
    # ファイル削除
    File.unlink local_file_path
  end
end
```

# 追記: ESCAPEがうまくいかない

UNLOAD時に、不適切なところでESCAPEされ、RDSにLOADするときにエラーが起きる場合があった。
今回の場合、以下のようにtextカラムの最後の文字が`(`だった場合におかしくなった。

```
# expected
"hoge","huga","longtext (","2016-01-01"

# actual
"hoge","huga","longtext (\,"2016-01-01"
```

対処法あれば教えて下さい。。
Quantum Chemistry - Degeneracy

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Degeneracy
https://www.youtube.com/watch?v=vtlgDgHLpfQ&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=23

- Degeneracy
  - 「縮退」と訳すことがある
  - 複数のものが１つの状態になっている、というような場合に使う
  - 余談:ブラックホールも縮退しているものであったりする
- 緑の式
  - 3D box modelにより導出されたwave equation
- 紫の式
  - エネルギーの式
- ピンクの式
  - ハミルトン・オペレータ
  - [このビデオ](https://www.youtube.com/watch?v=ktrJ-sqaaBs&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=13)にて重要なオペレータと言っていた
  - Total Energyに関係するので重要
  - ∇
     - ナブラ
     - または、デル
  - ∇が2階の式
- 黄色の式
  - ハミルトン・オペレータとエネルギーの式からなる
  - [このビデオ](https://www.youtube.com/watch?v=cUUFIk0ISuY&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=14)の左下緑の式
- 水色の式
  - ∇^2の定義
  - ラプラシアン・オペレータとも言う
     - ラプラス演算子
- オレンジ
  - 長さがx,y,z方向に等しい時cubeになる
- 紫の式
  - エネルギーの式
  - nx, ny, nzからなる
  - [このビデオ](https://www.youtube.com/watch?v=aXiyOUxUJAA&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=22)の右下の水色の式のエルxなどを置き換えたもの
- 赤色の式
  - (nx, ny, nz)の組合せでエネルギーが等しくなるという意味
  - nx=1,ny=1,nz=2はnx=1,ny=2,nz=1と同じエネルギーを持つ
  - degeneracy: 縮退
  - 3つの状態が同じエネルギーを持つ
      - triply (3-fold) degenerate
- 黄色
  - 長さエルが対称性を持つと縮退が起きる
  - 対称性が悪いと縮退が起きにくい
- 右のグラフ
  - 縦軸の値 3, 6, 9
  - (nx^2 + ny^2 + nz^2)の計算値
  - 211の場合 2^2 + 1^2 + 1^2 = 6
  - 異なる(nx, ny, nz)の組合せが同じエネルギーを持つ。degenerate
UE4でコンソール

#はじめに
UE4エディターを使いこなす上で欠かせないのが、コンソールコマンドと言われるものです。
洋ゲーのgod modeとかでピンときた方は、それです。

Windows10 UE4.10.4
Mac UE4.12.0

#UE4でコンソール
まずはコンソールコマンド自体、デフォルトの設定は日本語キー（JIS配列）で入力できないキーにわりあてられています。

##mac
BootCampをいれても、Windowsキーが無いとショートカットすらできません。
UE4ではF8とかそのた色々なショートカットキーを活用します、できればUS配列のGaming PC用がベストバイな気がします。F11がアレになっているのはつらい。 私の構成はこんな感じです。
![IMG_2713.JPG](https://qiita-image-store.s3.amazonaws.com/0/25895/f8c45c44-5f8a-ac69-4d02-c56de6f16c44.jpeg)

おそらくMacはビルド用なのでしょう。
それにOpenGLのシェーダーなので色味がDirectXと違います。
初期設定でマックだけではにっちもさっちもいかないので、PCキーボードのHomeキーを設定してみました。
![スクリーンショット 2016-09-10 11.01.09.png](https://qiita-image-store.s3.amazonaws.com/0/25895/9cc7e34f-0347-8c07-b3f4-927480ddf250.png)



##PC
PCもJIS配列のキーボードでは入力できないので、参考資料のところおすすめの、＠キーを設定してみました。

UE4エディターから
編集->プロジェクト設定->エンジン インプットのしたの方のConsole Console keyのエレメントを追加してみました。
![pcconsoleset1.png](https://qiita-image-store.s3.amazonaws.com/0/25895/6afee9f9-9ca7-9b25-9824-8eee7b325183.png)

![pcconsoleset.png](https://qiita-image-store.s3.amazonaws.com/0/25895/031d7735-1fab-5dc1-bc6a-dc575282b235.png)


[r.SetRes200x200 t.MaxFPS 500 stat FPS これ](https://twitter.com/satoru_noda/status/788056307106406401)は、チートです。


[参考資料 ヒストリアさんのブログ](http://historia.co.jp/archives/1739)
Wolfram mathematica > 2つの積分の式の表示 > +1する

http://qiita.com/7of9/items/52e16ba558d5893e36a3
で検討していた積分。

積分の仕方で異なる式が出るようだ。

http://integrals.wolfram.com/index.jsp?expr=sin%28kx%29cos%28kx%29&random=false
で出るのは１つの結果。

別の結果をだすには「+1すればいい」というのが分かった。
http://integrals.wolfram.com/index.jsp?expr=sin%28kx%29cos%28kx%29%2B1&random=false
で別の式がでた。

漫画「帯をギュッとね!」の後ろの巻の方で倉田典善が主人公らに「体形のがっちりした人を動かす方法」を指導していた。
「ゆさぶり」をかけるのがいいとのこと。

+1でゆさぶることで、別の解が見える、と思いついた。
yumが中国に行くので日本国内サーバーに行くようにする

##概要
CentOS6.8でyumでいろいろインストールしようとすると
`http://mirrors.163.com/centos/6.8/extras/x86_64/repodata/repomd.xml: [Errno 12] Timeout on http://mirrors.163.com/centos/6.8/extras/x86_64/repodata/repomd.xml: (28, 'connect() timed out!')
Trying other mirror.`
とタイムアウトしてしまう。
##yum確認
yumを実行するとどこに問い合わせに行くのか確認する。
とりあえずyum search ntpとしてみると
>Loading mirror speeds from cached hostfile
 * base: mirrors.nwsuaf.edu.cn
 * extras: mirrors.nwsuaf.edu.cn
 * remi: mirror.innosol.asia
 * remi-php55: mirror.innosol.asia
 * remi-safe: mirror.innosol.asia
 * updates: mirrors.163.com

と中国サーバーに行っているようで、iptablesでCNをブロックしているのでこれが原因のようだ。
##CentOS-Base.repoの変更
vi /etc/yum.repos.d/CentOS-Base.repo で問い合わせ先のbaseurlまたはmirrorlistの最後に&cc=jpを付けて国内サーバーに行くようにする。
>mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&cc=jp

確認のyum search ntp
># yum search ntp
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
epel/metalink                                                                                | 4.5 kB     00:00
 * base: www.ftp.ne.jp
 * epel: ftp.riken.jp
 * extras: www.ftp.ne.jp
 * remi: mirror.innosol.asia
 * remi-php55: mirror.innosol.asia
 * remi-safe: mirror.innosol.asia
 * updates: www.ftp.ne.jp

日本国内に行ったみたいだ！
Makefileをコマンドメモ代わりに使う

みなさん耄碌してますか?

私はもう耄碌してます。そうなるともう、つい昨日に叩いたちょっと長いコマンドラインなんて覚えていられなくなってしまいます。そのコマンドラインを実行するための前提条件とか、もう頭に入りきらないです。
別に耄碌してなくても、頭のメモリは空けておきたいですよね。

ちょっとしたコマンドの使い方をメモするのに `Makefile` が便利だ、ということに気付いたので Qiitaに吐き出しておきます。

# Makefileってなに?
ずっと前から存在しているビルドツール make のためのスクリプトファイルです。お使いのシェルに make と入力してみて、 command not found って怒られなければ使える環境が整ってます。こんな感じ:

```mf
all: default.css

default.css: default.scss
        scss --style expanded default.scss:default.css

nginx:
        docker run -d -v ~/www:/usr/share/nginx/html:ro -p 8080:80 nginx

作りたいもの: 材料 材料 材料...
    作り方
    作り方
      : 

```

# コマンドラインのメモ書きとして使う

「docker で Webサーバ立てて wwwディレクトリを 8080/tcp で公開する」なんてのをコマンドラインで指定するときのオプションとか、長すぎて覚えられない。そこで、上記のように Makefile の「作り方」のところに書いておく。

```mf
nginx:
        docker run -d -v ~/www:/usr/share/nginx/html:ro -p 8080:80 nginx
```

そして、思い出すとか、実行するとか。

```bash
matobaa@matobaa:~$ make -n nginx   # -n をつけるとコマンドを表示する。実行しない
docker run -d -v ~/www:/usr/share/nginx/html:ro -p 8080:80 nginx
matobaa@matobaa:~$ make nginx      # -n を外すと実行してくれる
docker run -d -v ~/www:/usr/share/nginx/html:ro -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d34921bc2709: Pull complete 
7062b3d97728: Pull complete 
6ef91dbeea1d: Pull complete 
5577be6571ad: Pull complete 
5061d717b9a7: Pull complete 
0ec95b15a374: Pull complete 
7a6b73207086: Pull complete 
bfdd4ced794e: Pull complete 
Digest: sha256:dc53b036d0084d56d7957026c785762359620681096f405218c4cfb715012948
Status: Downloaded newer image for nginx:latest
3e764bed08e2670225f463019562c1116019a2316230d86bf748322abc2d3f3b
matobaa@matobaa:~$ 
```

前提条件があるときは「材料」のところにリストアップしておけば、「材料がないから実行できないよ!」とか指摘してくれる。便利!

----

## TODO

- 整っていない場合の導入方法を書く。brewとかyumとかapt-getとか
- Windows での導入方法 → https://qiita.com/tokikaze0604/items/e13c04192762f8d4ec85