OmniAICreator/Qiita-1.07M huggingface dataset:
Chainerを用いた簡単なニューラルネットワーク実装〜モデルの記述編〜

[前回](http://qiita.com/moroku0519/items/aed0ad38040a234cc9ed)から深層学習のフレームワークであるChainerを使って実際にニューラルネットワークを構築する記事を書いています．
今回は
1.データの準備
2.モデルの記述
3.最適化アルゴリズムの設定
4.学習
5.結果の出力
のうち

2.モデルの記述

について書いていきます．

#構築するニューラルネットワーク
[前回](http://qiita.com/moroku0519/items/aed0ad38040a234cc9ed#iris%E3%83%87%E3%83%BC%E3%82%BF)書いた通り，今回使用するIrisデータは入力が4次元で，その出力が3次元です．
ものすごく単純に考えたら，そのネットワークは以下の図のように構築できます．

![Irisのネットワーク_1.png](https://qiita-image-store.s3.amazonaws.com/0/28622/05598159-35e4-a09a-8541-00a956b71e3b.png)

しかし，構築すべきなのは中間層を持ったニューラルネットワークです．入力と出力の間に層が必要です．
事例を単純にして，中間層を1つ追加します．ノードの数は6つとします．

すると，ネットワークは以下の図のようになります．
![Irisニューラルネットワーク_2.png](https://qiita-image-store.s3.amazonaws.com/0/28622/64fb1588-86ea-8800-20e0-d49ae020eef0.png)

またまたしかし，[Chainerの基本オブジェクトについて〜links編〜](http://qiita.com/moroku0519/items/d648bd2ed3d1001f7f16)で書いたように，l層からl+1層への写像は

```math
y = wx + b
```

という線形で表します．つまり，入力層，中間層にそれぞれバイアスbが必要です．
それを考慮した図が以下のものです．

![Irisニューラルネットワーク_3.png](https://qiita-image-store.s3.amazonaws.com/0/28622/b29d3f76-53e5-291d-1643-e200a36b3d37.png)

#Irisモデル

では，Chainオブジェクトを用いてIrisのニューラルネットワークモデルを表現します．

```
class IrisChain(Chain):
    def __init__():
        super(IrisChain, self).__init__(
             l1 = L.Linear(4, 6),
             l2 = L.Linear(6, 3),
    )

    def __call__(self, x, y):
        return F.mean_squared_error(self.fwd(x), y)

    def fwd(self, x):
        h1 = F.sigmoid(self.l1(x))
        h2 = self.l2(h1)
        return h2
```

詳しい説明は[こちら](http://qiita.com/moroku0519/items/b693e87e301411e41a08)の記事を参照してください．
入力層:4
中間層:6
出力層:3
なので，
4 → 6を

```
l1 = L.Linear(4, 6)
```

6 → 3を

```
l2 = L.Linear(6, 4)
```

と表現しています．

今回はここまでです．
次回はこのモデルで求まった誤差の最小値を求める最適化について書きます．

#参考

山下隆義
イラストでわかるディープラーニング 講談社
新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社
docker-composeでコマンドライン補完を使う


mac+bash環境でのメモです

### bash-completionのインストール

まず`bash-completion`をインストールします。

homebrewで入れます

[Homebrew — macOS 用パッケージマネージャー](http://brew.sh/index_ja.html "Homebrew — macOS 用パッケージマネージャー")

```bash
$ brew install bash-completion
```

```~/.bash_profile
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi
```

### 定義ファイルを持ってくる

[Command-line completion - Docker](https://docs.docker.com/compose/completion/ "Command-line completion - Docker")

公式サイトでは`/usr/local/etc/bash_completion.d/`にファイルをcurlしてきて次回ログイン時から有効にする方法が載っていますが、今回は個人的スタイルで作業しました。基本的にcompletion関連は全部`~/.bash_profile`に記載しているので・・・まあ個人の好みだと思います

#### ホームディレクトリにドットファイルとして設定を持ってくる
```
$ curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > ~/.completion-docker-compose.sh
```


### .bash_profileに追記

```
# docker-compose completion
. ~/.completion-docker-compose.sh
```

### シェルを再読込

```
$ exec $SHELL -l
```

### 動作テスト

```
$ docker-compose
build    bundle   config   create   down     events   exec     help     kill     logs     pause    port     ps       pull     push     restart  rm       run      scale    start    stop     unpause  up       version
```

コレでコマンド入力がちょっとだけ楽になります
Slack・ChatWork・Messsngerほぼ何でも一元管理できる「Franz」が超便利！

<h2>Slack・ChatWork・Messsngerほぼ何でも一元管理できる「Franz」が超便利！</h2>
最近は便利なコミュニケーション・メッセージアプリがたくさん有り、大変便利なのですが使い分けが面倒です。
Slack,ChatWork,Facebook Messanger,Hipchat,Skypeアプリを切り換えるだけでもいやになってきます。
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-01.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-01-1024x297.jpg" alt="161125-01"class="alignnone size-large wp-image-3061" /></a>

<h3>Franz対応アプリ</h3>
2016年11月現在、Franzは以下34のアプリに対応しています。どんどん増えていますね。
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-2.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-2-1024x550.jpg" alt="161125-2" class="alignnone size-large wp-image-3081" /></a>

・Slack
・Messenger
・WhatsApp
・Telegram
・Skype
・WeChat
・HipChat
・ChatWork
・Hangouts
・TweetDeck
・Gmail
・Outlook.com
・ICQ（懐かしい！）
個人的には、Slack/Messenger/Skype/ChatWorkを統合できるのが最高です！そして失礼ながらICQまだあったんですね・・・
流行ったのは大学生の頃だから、もう15年は前でしょうか。

<h3>アプリの入手</h3>
[Franz](http://meetfranz.com/)
Windows/Mac/Linux用があるのでばっちりですね

<h3>サービス追加の仕方</h3>
サービスを新たに追加から追加したいサービスを選びます。
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-3.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-3.jpg" alt="161125-3" class="alignnone size-full wp-image-3091" /></a>

表示されるダイアログに入力します。Slackを選択してみました。サービス名は、自由につけて構いません。そのままタブ名になります。
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-4.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-4.jpg" alt="161125-4" class="alignnone size-full wp-image-3101" /></a>

タブをクリックして、ID/PW認証するといつもの画面になります。
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-5.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-5-1024x550.jpg" alt="161125-5" class="alignnone size-large wp-image-3111" /></a>

アプリの選択は上部のタブをクリックするだけ
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-tab.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-tab.jpg" alt="161125-tab" class="alignnone size-full wp-image-3132" /></a>

ChatWorkも
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-cw.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-cw-1024x427.jpg" alt="161125-cw" class="alignnone size-large wp-image-3151" /></a>

Skypeも（ビデオ通話なども普通に出来ます
<a href="http://www.alice3.net/wp-content/uploads/2016/11/161125-skype.jpg"><img src="http://www.alice3.net/wp-content/uploads/2016/11/161125-skype-1024x534.jpg" alt="161125-skype" class="alignnone size-large wp-image-3161" /></a>

<h3>Franzのお薦めポイント</h3>
・アプリ切換が楽（いちいちSkypeは～ChatWorkは、と探さなくなります）
・同じサービスのアカウント毎にタブ追加できる（アカウント切換が面倒なアプリも楽になります）
・地味にGmailなどのメールサービスが便利
複数アプリでさらに複数アカウントを使っている人にはめっちゃおすすめです！
Adobe Air HTMLによる開発の一連の流れ

# Adobe Airでデスクトップアプリを作る一連の流れをまとめた。
###※この記事は、以下のサイトの内容をまとめたものになります。
[【Adobe Air】HTMLでデスクトップアプリを作る一連の流れをまとめた](http://ikechannel.tk/blog/b-1.html "【Adobe Air】HTMLでデスクトップアプリを作る一連の流れをまとめた-いけちゃんの日記")

##作るもの
http://codepen.io/takumi/pen/vygbNa

##手順

###・1.HTMLを書く

HTMLを書いてください。ここはあなたに任せますが、これは練習なので簡単なものがいいと思われます。

###・2.XMLを書く

ウィンドウのサイズなどの設定は、xmlファイルに記述します。
＜アプリ名＞.xml
というファイルを作成して、以下のコードをコピペしてください。

&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;application xmlns="http://ns.adobe.com/air/application/1.5" minimumPatchLevel="0"&gt;
&lt;id&gt;index.html&lt;/id&gt;
&lt;version&gt;1.0&lt;/version&gt;
&lt;filename&gt;(アプリ名)&lt;/filename&gt;
&lt;initialWindow&gt;
&lt;content&gt;index.html&lt;/content&gt;
&lt;visible&gt;true&lt;/visible&gt;
&lt;width&gt;380&lt;/width&gt;
&lt;height&gt;260&lt;/height&gt;
&lt;/initialWindow&gt;
&lt;/application&gt;

widthタグの中とheightタグの中は、ウィンドウのサイズです。状況に応じて編集してください。
尚、http://ns.adobe.com/air/application/1.5 はAdobe Air SDKのバージョンによって変わります。

###・3.デバッグ

HTMLとXMLを作成したら、デバッグを行いましょう。
コマンド プロンプトを開いて、HTMLとXMLがあるファイルに移動します。
そこでこれを入力します。

adl (アプリ名).xml

ウィンドウが開いて、HTMLが表示されたら成功です。

###・4.インストーラの作成

・インストーラを作成するための(証明されていない)証明書を作ります。
コマンド プロンプトを開いて、HTMLとXMLがあるファイルに移動します。
そこでこれを入力します。

adt -certificate -cn test 1024-RSA test.pfx pass

test.pfxというファイルができたら成功です。

・インストーラ(.airファイル)の作成

コマンドプロンプトにこれを入力

adt -package -storetype pkcs12 -keystore test.pfx -storepass pass <インストーラ名>.air <アプリ名>.xml index.html <その他同梱ファイル(js,css,画像など)> <その他同梱ファイル(js,css,画像など)>

インストーラ名のところを、出力ファイルの名前を自由に決めて書き換える。
アプリ名のところは、さっき作ったXMLファイルの名前。
その他同梱ファイルは、例えばjqueryを使っているならjquery-～～～.jsとか。画像ファイルがあるなら～～～.pngとか。何個でもOK。

できたairファイルをダブルクリックで実行して、インストールします。
Nokogiri のインストールをした時のメモ

Ruby の　Gem である [nokogiri](https://rubygems.org/gems/nokogiri/versions/1.6.6.2) をインストールする際に必要だったパッケージ群のメモ。
OS は Linux を想定。

# やってみた

```bash
sudo yum groupinstall "Development Tools"
sudo yum -y install ruby-devel
sudo yum install -y zlib-devel
```

これでOKでしたー
Linux/Mac 256パレット確認ツール

256色対応ターミナルで、カラーパレットを確認するツールです。

Linux と Mac で、かつMacのターミナルで確認していますが、他のターミナルソフトだと、ちゃんと見えないかもしれません。
`/usr/local/bin/` などに置いたりして、活用してください。

## 解説

256ターミナルのパレットの配色順番はちょっと独特で、昔の[WEB SAFEカラー](http://www.htmq.com/color/websafe216.shtml)のような色群に純色、純色のちょっと暗い色、グレースケールを足したものを、0~255の数字で指し示す。[^1]

[^1]: 例えばプロンプトの色を変更するときなど。ソース中にあるような `tput setab N` や `tput setaf N` といった指定で用いる。

何か設定したい時にいちいち調べるのもめんどいので、簡単に確認出来るシェルスクリプトを作成し、さらに発色を確認しやすいように１行単位で表示するものとした。
ただ単に見るだけでも綺麗かも。

（参考） [Bash/プロンプトのカスタマイズ - https://www.archlinuxjp.org/](https://wiki.archlinuxjp.org/index.php/Bash/%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA#Terminfo_.E3.81.AE.E3.82.A8.E3.82.B9.E3.82.B1.E3.83.BC.E3.83.97.E3.82.B7.E3.83.BC.E3.82.B1.E3.83.B3.E3.82.B9)

### ソース

```bash:256pallete.sh
#!/usr/bin/env bash
# Color pallete checker for shell

for C in {0..255}; do
    echo "$(tput setab $C)"
    echo -n $C
done
tput sgr0
echo
echo
```

### 実行画面サンプル

![スクリーンショット 2016-11-25 21.59.45.png](https://qiita-image-store.s3.amazonaws.com/0/98745/a6aa3f47-c057-5802-33ce-67a3db38e8da.png)
[Mac][El Capitan][MySQL] HomebrewでインストールしたMySQLを自動起動設定する

之だけで済むようです

```zsh
$ brew services start mysql

==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 10 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
Checking connectivity... done.
Tapped 0 formulae (26 files, 32.4K)
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
```
PostgreSQLが提供するバックアップ機能

# はじめに
PostgreSQLにはコア機能として提供されているバックアップの機能がいくつか存在します。
今回はそれらの機能から、PostgreSQLが稼働した（サービスを継続した）状態で取得できる「論理バックアップ」、「オンラインバックアップ」についてまとめてみました。

# 1. PostgreSQLで実施可能なバックアップ手法の一覧
追加モジュール等を利用せず、PostgreSQLが提供する機能で実施可能なバックアップの取得方法を以下にまとめます。

## 論理バックアップ
データベースの内容をSQLで保存することを論理バックアップと呼びます。

|項番|バックアップの格納先|バックアップの対象|コマンド|コマンド実行例(*1)|リカバリに必要なWALのバックアップ(*2)|
|:--:|:--|:--|:--|:--|:--|
|1-1|ローカル|特定のデータベース|pg_dump|$ pg_dump -Fc db_name > db.dump       |-（不要）|
|1-2|ローカル|特定のテーブルのみ|pg_dump|$ pg_dump db_name -t tbl_name > db.sql|-（不要）|
|1-3|ローカル|データのみ        |pg_dump|$ pg_dump db_name -a > db.sql         |-（不要）|
|1-4|ローカル|スキーマ情報のみ  |pg_dump|$ pg_dump db_name -s > db.sql         |-（不要）|
|1-5|ローカル|DBクラスタ全体    |pg_dumpall|$ pg_dumpall > db.sql      |-（不要）|
※ローカル：PostgreSQLがインストールされたサーバ上でマウントされているディスク

## 物理バックアップ
本項目では、物理バックアップのうち、PostgreSQLが稼働した状態で取得可能なオンラインバックアップについて記載する。（DBを停止した状態で取得するオフラインバックアップも存在するが、PostgreSQLではオフラインバックアップで提供される機能はないため、本項目では説明をしない。）
取得したバックアップファイルをPostgreSQLでは「ベースバックアップ」と呼びます。リストアには、ベースバックアップとWALファイルが必要になります。

|項番|バックアップの格納先|バックアップの対象|コマンド|コマンド実行例(*1)|リカバリに必要なWALのバックアップ(*2)|
|:--:|:--|:--|:--|:--|:--|
|1-6|ローカル|DBクラスタ全体    |pg_start_backup<br>pg_stop_backup|\$ psql -c "SELECT pg_start_backup(now()::text)"<br>\$ rsync 等<br>\$ psql -c "SELECT pg_stop_backup()"|手動(*3)|
|1-7|ローカル|DBクラスタ全体    |pg_basebackup|\$ pg_basebackup -D \$BACKUP --xlog-method=stream|自動|
|1-8|リモート|DBクラスタ全体    |pg_start_backup<br>pg_stop_backup|\$ psql -c "SELECT pg_start_backup(now()::text)"<br>\$ scp 等<br>\$ psql -c "SELECT pg_stop_backup()|手動(*3)|
|1-9|リモート|DBクラスタ全体|pg_basebackup|$ pg_basebackup -F tar -D - -z --xlog｜ssh remote_node "cat > BACKUP.tar.gz"|自動(*4)|
※リモート：PostgreSQLが入っていないサーバ上のディスク等

- (*1) 各コマンドで使用できるオプション等の詳細についてはマニュアルを参照してください。
    - [pg_dump](http://www.postgresql.jp/document/9.5/html/app-pgdump.html)
    - [pg_dumpall](http://www.postgresql.jp/document/9.5/html/app-pg-dumpall.html)
    - [pg_start_backup, pg_stop_backup](http://www.postgresql.jp/document/9.5/html/continuous-archiving.html)
    - [pg_basebackup](http://www.postgresql.jp/document/9.5/html/app-pgbasebackup.html)
- (*2) データベースをリストアするには、「ベースバックアップ」と「以下のWAL」が必要になります。
    - 項番1-6、1-7の場合、pg_start_backup実行後～pg_stop_backup実行完了までの期間中に発生したWAL
    - 項番1-9の場合、pg_basebackupコマンド実行から完了までの期間中に発生したWAL
- (*3) ベースバックアップ取得中に発生したWALを手動で回収する必要があります。
- (*4) ベースバックアップ取得中の処理量が多く、WALがローテートした場合は手動で回収する必要があります。


# 2. バックアップ方式はどうやって決めるのか？
上記のようにバックアップ方式は色々ありますが、どの方式を選択すべきかは、何をどのようにバックアップしたいかという要件によって変わります。

例として、いくつかの要件とそれに当てはまる方式を考えてみました。

|項番|要件例|選択すべき方式|
|:--:|:--|:--|
|2-1|特定のテーブルやDBのみをバックアップしたい。|項番1-1,1-2 pg_dumpのみ実施可能。|
|2-2|任意のスクリプト経由でDBクラスタ全体のバックアップを行いたい。|項番1-6 pg_start_backup/pg_stop_backupで実施可能。|
|2-3|リストアに必要なアーカイブWALを自動で回収したい。|項番1-7 pg_basebackupコマンドの「--xlog-method=stream」オプションで実施可能。|
|2-4|リモートにDBクラスタ全体のバックアップを送りたい。|項番1-9 pg_basebackupコマンドの「-F tar -D -」オプションで実施可能。|

こんな感じで、要件によって選択すべきバックアップ方式は異なります。
他にも「リストアに掛かる時間を短くしたい」や「バックアップファイルのデータ量を小さくしたい」等というように要件は様々なため状況によって都度何が良いか考える必要があります。

# さいごに
色々書いてみたものの、冗長化のためにスタンバイ作るときにも使うし、特別な要件でもない限りpg_basebackupコマンド（項番1-7）を使えばいいんじゃないかと思う。
Scalaz.ValidationでOption型の中身を検証する方法

## モチベーション

任意の`A`型を検証するバリデーションを`Option[A]`型の検証にも使いたい。`None`のときはバリデーションを実行したくない。

## 実装

```scala
import scalaz._
import Scalaz._

object PresenceValidator {
  def apply(value: String): ValidationNel[String, String] =
    if (value.trim.isEmpty) "Can't be blank".failureNel
    else value.successNel
}

object OptionalValidator {
  def apply[A](value: Option[A])(f: A => ValidationNel[String, A]): ValidationNel[String, Option[A]] =
    value match {
      case Some(v) => f(v).map(_.some)
      case None    => value.successNel
    }
}
```

## 使い方

```scala
case class User(screenName: String, nickname: Option[String])

object Main extends App {
  val user1 = User("tarou", Some("Tarou Yamada"))
  val user2 = User("tarou", Some(""))
  val user3 = User("tarou", None)

  val res1 = (PresenceValidator(user1.screenName) |@| OptionalValidator(user1.nickname)(PresenceValidator.apply))(User)
  val res2 = (PresenceValidator(user2.screenName) |@| OptionalValidator(user2.nickname)(PresenceValidator.apply))(User)
  val res3 = (PresenceValidator(user3.screenName) |@| OptionalValidator(user3.nickname)(PresenceValidator.apply))(User)

  println(res1)
  println(res2)
  println(res3)
}
```

```plain:実行結果
Success(User(tarou,Some(Tarou Yamada)))
Failure(NonEmpty[Can't be blank])
Success(User(tarou,None))
```
ElectronアプリをWindowsのタスクマネージャーに適切に表示する

## exeファイル名 !== タスクマネージャーでの表示名

パッケージング済みElectronアプリ(この記事では`Application.exe`)を起動してタスクマネージャーを開いてみましょう。どのように表示されているでしょうか。
もしElectronと表示されているのであれば、最終的なexeファイルのプロパティのうち「ファイルの説明」が元のElectronのバイナリのままになっているかと思います。

![task_manager_electron.png](https://qiita-image-store.s3.amazonaws.com/0/116133/1529294d-8148-b231-b519-b5984ee806e8.png) ![property_electron.png](https://qiita-image-store.s3.amazonaws.com/0/116133/1c197015-49d5-2ef6-1aba-44cd5f87c1b9.png)

これではちょっと格好がつかないので、適切に説明を付けてあげましょう。また、この部分はアプリをタスクバーやスタート画面にピン留めしたときに作成されるショートカットの名前にも使用されるので、やはり適切に設定しておくとよいです。

## 対策
Electronアプリをパッケージングしているのであれば`electron-packager`か`electron-builder`のいずれかを使っていると思いますから、適切にオプションを追加します。

- electron-packager:
  - CLIの引数に[`--win32metadata.FileDescription=DESCRIPTION`](https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#win32metadata)を追加します。
  - [electron-api-demoのnpm script](https://github.com/electron/electron-api-demos/blob/v1.2.0/package.json#L16)が具体例になりますが、引数が多すぎたり、他のプラットフォームと設定を共通化したいといったことがあると思うので場合に合わせて別途スクリプトを書いた方が良いかもしれません。

- electron-builder:
  - ~~[パッケージングされる側の`package.json`に`description`](https://github.com/electron-userland/electron-builder/wiki/Options#application-packagejson)を設定します。~~
  - [バージョン10.4.3以降では`package.json`の`productName`を使用するようになった](https://github.com/electron-userland/electron-builder/releases/tag/v10.4.3)ため特に設定不要です。

設定が済んだら再度パッケージングして、設定した説明がタスクマネージャーに表示されているか確認してみましょう。

![task_manager_correct.png](https://qiita-image-store.s3.amazonaws.com/0/116133/b1b00461-bbcb-3b35-dc55-2cc0ab648b2e.png) ![property_correct.png](https://qiita-image-store.s3.amazonaws.com/0/116133/06666dca-8044-b6f2-85c1-95777b6f8acd.png)
OSXでOpenCV3 + python3の環境を作る

## 環境
osx El Capitan

## インストールするもの
- python 3.5.1
- openCV 3.1

## 流れ
1. pyenvでpython3.5.1をインストール
2. OpenCV3のインストール
3. 2.の環境でOpenCV3が動くようにする

## 1. pyenvでpython3.5.1をインストール
動かしたいのはOpenCV3系だしpythonも新しいものを使いたい。けど、OpenCV2系向けに書かれたものも多く転がっているため、OpenCV2系も動かせるようにしておきたい。OpenCV2系はpython2系でないと動かないみたいなので、複数環境を動かせるような状態にしておきたい。なのでpyenvをインストールしてそこから環境を変えることにする。

```
$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc

# python3.5.1をインストール
$ pyenv install 3.5.1
```

## 2. OpenCV3のインストール
brewから導入。

```
# brew install opencv3 --with-python3 を打ってみたけど、opencv3をhomebrew/science/opencv3に変更しろと言われる
$ brew install homebrew/science/opencv3 --with-python3
```
brewから上記のコマンドを入れるが、以下のようなエラーが出てうまくいかない。

```
/tmp/opencv3-20161123-64293-17bmzya/opencv-3.1.0/modules/videoio/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found
#import <QTKit/QTKit.h>
```

http://qiita.com/masaori/items/0c78fcd58a6c6bf4f655
こちらのリンクではOSX Sierraで発生したとあるが、ElCapitanでも発生。解決法は今のところ同じで、brewのオプションにHEADを指定して新しいものを取得する。HEADを取得することで何か別のコミットも交じっているだろうけど、現時点では特に不都合なし。

```
$ brew install homebrew/science/opencv3 --with-python3 --HEAD
```

## 3. 2.の環境でOpenCV3が動くようにする
pyenv経由でOpenCVのsoファイルを読めるようにシンボリックリンクを張る

```
$ ln -s /usr/local/Cellar/opencv3/HEAD-b8c875d_4/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so ~/.pyenv/versions/3.5.1/lib/python3.5/site-packages
```

以下でREPLからちゃんと読み込めるか確認

```
$ python

Python 3.5.1 (default, Nov  7 2016, 22:30:16)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
```

## はまったこと
どこかのタイミングでpython2.7のモジュールを読み込むようになってしまっていた。そのため、brewでOpenCVをビルドした時にsoファイルが`/usr/local/opt/opencv3/lib/python2.7/site-packages/`に置かれたり、ファイルの中でもpython2.7前提でのビルドがされているために、シンボリックリンクを張っても以下のようなエラーが出てpythonで読み込めなかったりした。

```
$ python

Python 3.5.1 (default, Nov  7 2016, 22:30:16)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/usr/local/opt/opencv3/lib/python2.7/site-packages/cv2.so, 2): Symbol not found: _PyCObject_Type
  Referenced from: /usr/local/opt/opencv3/lib/python2.7/site-packages/cv2.so
  Expected in: flat namespace
 in /usr/local/opt/opencv3/lib/python2.7/site-packages/cv2.so
>>>
```

こちらからそのモジュール読み込み問題を解決
http://qiita.com/Asakage/items/690ce9048e708de41166

` ~/.local/lib/python3.5/site-packages/homebrew.pth`にある行をコメントアウトするとちゃんとpython3.5を読み込んでくれるようになった。どのタイミングでこのパスが読み込まれたのかは不明。pyvenvを設定したりここに書いてないことも少しやっていたので、そのタイミングで発生したのかもしれない。

ビルドにも時間かかるし色々問題が発生したので、condaを使ってOpenCV入れるのが一番早いかもしれない。
rails: wheneverを使ってrake taskを自動化する。がログが`/private/var/mail`に送られてきてハマる。

#初期セットアップ
初期セットアップは以下を参考に

- [Railsのバッチ処理のcrontab設定をwhenever&capistranoで自動化](http://djangoapplab.com/36/)
- [RailsでWheneverを使ってCrontabを仕込む](http://o.inchiki.jp/obbr/56)
- [アプリケーションに依存するバッチを"アプリケーションで自動生成"してcronに登録する方法](http://interu.hatenablog.com/entry/20100914/1284473611)
- [whenever を使って Rails で cron 的な](http://esoz.blog.fc2.com/blog-entry-41.html)
- [本家サイト](https://github.com/javan/whenever)

#やりたいこと

##テスト
コンソール上に`test case passed`と表示するテストバッチを作成し、そのタスクをwheneverを使って自動化させてみる。一分ごとに`test case passed`と表示する。

```schedule.rb
# Use this file to easily define all of your cron jobs.
#
# It's helpful, but not entirely necessary to understand cron before proceeding.
# http://en.wikipedia.org/wiki/Cron

# Example:
#
#set :output, "/log/development.log"
job_type :rake, 'cd :path && RAILS_ENV=:environment /usr/bin/env rake :task'
set :environment, :development
set :output, { :error => 'log/error.log', :standard => 'log/cron.log' }

#every 1.day, at: '3:00 am' do
every 1.minute do
  rake "scrape:get_scrape_target_list"
  rake "item:create_items_from_scraped_items"
end

# every 3.minutes do
#   rake "batches:test"
# end

# every 2.hours do
#   command "/usr/bin/some_great_command"
#   runner "MyModel.some_method"
#   rake "some:great:rake:task"
# end
#
# every 4.days do
#   runner "AnotherModel.prune_old_records"
# end

# Learn more: http://github.com/javan/whenever
```

```batches.rake
# lib/tasks/batches.rake

namespace :batches do

 desc "test"
    task :test_whenever => :environment do
      puts "test case passed"
    end
end
```

![Screen Shot 2016-11-25 at 5.33.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/543613e9-67a2-585d-d827-48af86037eb4.png)

バッチの動作確認が完了したところで実際にスケジューリングに入る。

`bundle exec whenever`と`whenever --update-crontab`でタスクの確認と登録。しかしなぜかログが`/private/var/mail`の方に来る。。一応ちゃんと実行はされているのだが。

![Screen Shot 2016-11-25 at 6.38.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/5b767c83-81b6-80cd-622c-f1788a3f4147.png)

そしてなぜか怒られれてもいるみたいだ。

#エラー一覧

###なぜか怒られる`/bin/bash: shell_session_update: command not found`
どうやら`shell_session_update`を呼んでいるのにそんなものはないと怒られている？<a href="http://superuser.com/questions/1044130/why-am-i-having-how-can-i-fix-this-error-shell-session-update-command-not-f" target="_blank">Why am I having / how can I fix this error: “shell_session_update: command not found”</a>を参考に、これは`rvm head`で最新版に更新したら解決。

###ログが`/log/cron_log`ではなく`/private/var/mail`に送られてくる。

<a href="https://github.com/javan/whenever/wiki/Output-redirection-aka-logging-your-cron-jobs" target="_blank">Output redirection aka logging your cron jobs</a>によると、

>you should put this global level set :output above your job definition, otherwise it wouldn't work

と書かれていたので`output: `一番上に持ってくる。のだがそれでも現状は変わらず。。解決策探し中。。。



#まとめ

やる手順を簡単にまとめると、
1. wheneverセットアップ
2. テストバッチ作成
3. バッチ単体で動かしてみる
4. whenever使ってバッチを動かしてみる
5. 2を本番バッチに変えてみて動かしてみる

を繰り返してエラーが出る度に原因を突き止めていけば動くようになると思います。とりあえず今はまってる現状を脱会できる策を探してみます。
npm i -g npmでnpmのバージョンが上がらない

###経緯
久方ぶりにnpmのコマンドを打った。
すると、できれば3か4使ってくれ、みたいな警告を受けた。

```bash
$ npm -v
2.7.4
```
だいぶ放置してましたからね。

さて、npmはさっぱりなのでgoogle先生に聞きつつ更新してみる。
なるほどnpmコマンドから自身を更新できるのだとか。

```bash
$ npm i -g npm
$ npm -v
2.7.4
```
…あれ？

###結論
詳細はさっぱりですが、どうもnodejsのバージョンが古すぎたっぽい？
（そもそも```npm r -g npm```してもnpm打てたりと謎が多かったけれども）
```node -v```してみたところ0.12とか言われて仰天したので最新版をインストール。
改めて。

```bash
$ npm i -g npm
$ npm -v
4.0.2
```
よし。
DynamoDB BatchGetItem における注意点

よく 複数のデータを取得する時は、BatchGetItem でという記事がありますが、これには注意点があります。 

http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations

>さまざまなオペレーションに対応するキャパシティーユニットの計算
>
>（バッチ内の各項目が別々に読み込まれる）BatchGetItem については、DynamoDB は、まず各項目のサイズを次の 4 KB に切り上げ、次に、合計サイズを算出します。この結果は、すべての項目の合計サイズと必ずしも同じではありません。たとえば、BatchGetItem が 1.5 KB の項目と 6.5 KB の項目を読み込むと、DynamoDB は、サイズを 8 KB（1.5 KB + 6.5 KB）ではなく、12 KB（4 KB + 8 KB）と算出します。


この様に BatchGetItem は各サイズを４KB単位に切り上げてから合計するので キャパシティーユニット の削減にはなりません。
ですが、Queryの場合は合計サイズを算出してから４KBに切り上げてくれます。

>Queryの場合、返されるすべての項目は、単一の読み込みオペレーションとして処理されます。その結果、DynamoDB はすべての項目の合計サイズを算出し、次の 4 KB 境界に切り上げます。たとえば、クエリの結果、合計サイズが 40.8 KB になる 10 項目が返されるとします。DynamoDB はオペレーションの項目サイズを 44 KB まで切り上げます。クエリの結果、64 バイトの項目が 1,500 項目返されると、累積サイズは 96 KB になります。

可能であれば、Queryを利用する様にすると、キャパシティーユニットの消費が削減できます。
これから設計するのであれば、Queryでデータの取得ができるように設計される事をオススメします。
Staging用の環境設定をXcodeに追加する

swift3で新規アプリを作ることになったので備忘録です。

他の備忘録
- [StoryBoardを使わないでプロジェクト作成（Xcode8,Swift3）](http://qiita.com/rika-sakuma/items/d975c2d9f85e8bb4aef5)
- [アプリ開発でdebug/staging/release環境があるならbundleは３種類あったほうが捗る](http://qiita.com/rika-sakuma/items/37e77c3a83e3a9855825)
- [Staging用の環境設定をXcodeに追加する](http://qiita.com/rika-sakuma/items/cc8f86ed6f4ad3f2514c)
- [設定画面をコードだけで書く時いつも悩む](http://qiita.com/rika-tawashi/items/6461180c518afeeb20fb)

## 前提
たいていWebサーバ側はDebug、Staging、Production環境を作ってるところが多いかと思います。Xcodeの設定もをれに合わせてURLを変えたりしたいので、環境を作ります。すでにDebugとReleaseはあるので、Stagingを追加します。

## 手順
- 1. Configurationsをコピーして追加
- 2. コード内で#ifで分岐できるようにFlagを追加
- 3. Debug、Staging、Releaseを切り替えて実行

## 1. Configurationsをコピーして追加する。
DuplicateはDebugでもReleaseでもどちらでもいいかな。。。
![スクリーンショット 2016-11-25 20.38.59.png](https://qiita-image-store.s3.amazonaws.com/0/50839/724d4605-f5b5-92c8-e170-98400dff2123.png)

## 2. コード内で#ifで分岐できるようにFlagを追加する
<img width="1147" alt="スクリーンショット 2016-11-25 20.49.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/50839/91133434-e5cd-564b-e16a-aa4d395f4681.png">

こうすると、コード内で分岐できます

```
#if DEBUG
    print("でばっぐー")
#elseif STAGING
    print("すてーじんぐー")
#else
    print("ほんばんー")
#endif
```

## 3. Debug、Staging、Releaseを切り替えて実行する
上部のドロップダウンからEditSchemeを選んで画像の部分で選択します。

![スクリーンショット 2016-11-25 20.59.01.png](https://qiita-image-store.s3.amazonaws.com/0/50839/19e7dad3-1e90-6bfe-9156-ed620cc04719.png)
[PHP][Mac][El Capitan] PHPを5.5系から5.6系へバージョンアップする

# 前置き
Laravel5.2を使うに当たって、ElCapitanデフォルトのPHPのバージョンでは古いらしく、PHPを5.6系にバージョンアップします。（7系じゃないです）

# 手順
## Homebrewのアップデート

```zsh
$ brew tap homebrew/versions
$ brew tap homebrew/dupes
$ brew tap homebrew/php
$ brew update
```

## PHP 5.6のインストール

```zsh
$ brew install homebrew/php/php56-amqp
```

色々とインストールされます

## TerminalをRestart
```zsh
$ php -v
PHP 5.6.27 (cli) (built: Oct 15 2016 09:29:55) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```
Quixel Megascansの植物を描画するためのシェーダをShaderForgeで実装

* Albedo.jpg, Normal.jpg, Opacity.jpgがDLできる
* 透明のために3枚のテクスチャを使うシェーダが必要
* （シェーダが分からない場合はPreview.pngを使っても透明表示はできる）
* ShaderForgeのグラフは下記の通り
* 裏面も描画する

![plant.png](https://qiita-image-store.s3.amazonaws.com/0/12309/f18bfcec-7c1f-4558-64d8-b7ab7798a7ef.png)
Railsで、 model.save if model.changed? する意味はあるか

Railsで、modelの保存をする処理で、何らかの値が変更されているときだけ保存するイディオムとして、以下のようなコードを書いていました。

```
model.hoge = 'moge'
model.save if model.changed?
```

ただ、ActiveModel::Base#save の中で、changed == false なら 何も更新されないように処理されているので、明示的に changed? をチェックする必要はあるのかという指摘をプルリクでもらいました。

確かにそんな気もするので、明示的に changed? をチェックすることに意味があるのか、調べてみました。


model.changed == false のとき、model.save を呼び出しても update文が実行されることはありません。
これは、save の実装で changed で変更されたフィールドだけを更新するように処理されていて、changed が無ければ update 文自体が実行されないためです。

ただ、この時でも トランザクションの実行と、callback は呼ばれます。

なので、「changed? == false なら何も処理しない」という意図を表現するなら、

```
model.save if model.changed?
```

というイディオムを使うことに意味はある、と自分の中で結論づけました。

ご参考まで。
JetBrains IDE プラグインのインストールがタイムアウトで失敗する場合の対処法

IDE からプラグインをインストールしようとしても、タイムアウトしてエラーになる時の対処法。

* ブラウザで、https://plugins.jetbrains.com/ にアクセス
* 目的のプラグインをダウンロード
* ダウンロードがタイムアウトしても、ブラウザの機能でダウンロードを再開して、ダウンロードを行う
* `Install plugin from disk...` から、ダウンロードしたファイル（zip）を指定してインストール
<img width="701" alt="Plugins_と_main_go_-_backup-to-s3_-____dev_src_github_com_shin1x1_backup-to-s3_.png" src="https://qiita-image-store.s3.amazonaws.com/0/12272/bf5d6138-68a9-71e8-58b0-c338da3c2bf9.png">

ダウンロードは、curl でも何でも ok。

IDE からだとタイムアウトした場合、毎回最初からやり直すので、ダメな時は何度やり直してもタイムアウトしてしまう。
StoryBoardを使わないでプロジェクト作成（Xcode8,Swift3）

swift3で新規アプリを作ることになったので備忘録です。

他の備忘録
- [StoryBoardを使わないでプロジェクト作成（Xcode8,Swift3）](http://qiita.com/rika-sakuma/items/d975c2d9f85e8bb4aef5)
- [アプリ開発でdebug/staging/release環境があるならbundleは３種類あったほうが捗る](http://qiita.com/rika-sakuma/items/37e77c3a83e3a9855825)
- [Staging用の環境設定をXcodeに追加する](http://qiita.com/rika-sakuma/items/cc8f86ed6f4ad3f2514c)
- [設定画面をコードだけで書く時いつも悩む](http://qiita.com/rika-tawashi/items/6461180c518afeeb20fb)

# 手順
1. プロジェクト作成
2. 「Main.storyboard」を削除
3. 「Info.plist」の「Main storyboard file base name」を「Main」→なし
4. 「AppDelegate.swift」にビューを定義する

## 1.　プロジェクト作成
中身の設定はお好みでどうぞ
<img width="1251" alt="スクリーンショット 2016-11-25 19.43.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/50839/a8ee864d-db8a-df59-e5c9-377c7d9d62fe.png">

## 2.　「Main.storyboard」を削除
「Move to Trash」で豪快に消しちゃいます
<img width="265" alt="スクリーンショット 2016-11-25 19.51.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/50839/e82bd95a-dcee-78e4-c92b-a29af95a29e6.png">

## 3. 「Info.plist」の「Main storyboard file base name」を「Main」→なし
<img width="1072" alt="スクリーンショット 2016-11-25 19.50.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/50839/87f22f37-ae71-a6eb-984f-c47f2ad4d030.png">

## 4.  「AppDelegate.swift」にビューを定義する

```
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = ViewController()
    self.window?.makeKeyAndVisible()

    return true
}
```

このまま動きますが、動かしても真っ黒でつまらないので、ViewControllerに以下を追加

```
override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.red // 背景を赤に
}
```

## できあがり
<img width="487" alt="スクリーンショット 2016-11-25 20.11.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/50839/04f81d3b-7f3b-8dcb-f800-d6088d7eb578.png">
Parallel クラスの使いかたメモ

https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.parallel

```basic:Parallel.Invoke.vb
Sub L()
'proc1
End Sub

Sub M()
'proc2
End Sub

Sub N()
'proc3
End Sub

Parallel.Invoke(L, M, N)
```

```basic:Parallel.For.vb
Parallel.For(0, N, Function(i) 
                       Console.WriteLine(i + i)
                   End Function)

' - OR -

Sub QQQ()
'proc
End Sub

Parallel.For(0, N, AddressOf QQQ)

```

```basic:Parallel.ForEach.vb
Dim data = Enumerable.Range(0, N)
Parallel.ForEach(data, Function(x) 
                           Console.WriteLine(x + x)
                       End Function)
```
2点の空間座標の距離を計算するサンプル

#説明
空間座標(x, y, z)を2点指定すると、距離を計算し表示します。

##ソースコード
````C++:SpaceCalc.cpp
/*
	三次元座標２点を入力すると、
	距離を弾き出す
*/
#include <iostream>
#include <cmath>
using namespace std;

//座標クラス
class coordinate{
public:
	double m_x,m_y,m_z;
	coordinate(double x, double y, double z);
};
//constructor.
coordinate::coordinate(double x, double y, double z){
	m_x = x;
	m_y = y;
	m_z = z;
}

//入力部分。引数には表示したい案内文。
coordinate input(const string& message){
	double x, y, z;
	cout << message << "x:" << flush;
	cin >> x;
	cout << "y:" << flush;
	cin >> y;
	cout << "z:" << flush;
	cin >> z;
	return coordinate(x,y,z);
}

//計算部分
double SpaceCalc(const coordinate& z1, const coordinate& z2){
	return sqrt(pow(z1.m_x - z2.m_x, 2) + pow(z1.m_y - z2.m_y, 2) + pow(z1.m_z - z2.m_z, 2));
}

int main(){
	coordinate cd1 = input("ひとつ目の座標を入力してください ");
	coordinate cd2 = input("ふたつ目の座標を入力してください ");
	cout << "二つの座標点の距離は " << SpaceCalc(cd1, cd2) << "です" << endl;
}
````

##makefile

````make:makefile
.PHONY: SpaceCalc

SpaceCalc:
	g++ -o SpaceCalc SpaceCalc.cpp
````
ポインタレシーバでメソッド実装した型は、実体をインターフェースで受けられない

はじめに
----------------------------------------
題名の通りです。使用言語がJavaからGolangへ変わり、ポインタで苦しんでおります。

前提
----------------------------------------

```go
// インターフェース
type MyInterface interface {
	method1() int
	method2() int
}

// レシーバー
type MyStruct struct {
	int1 int
	int2 int
}

func (s MyStruct) method1() int { return s.int1 }
func (s MyStruct) method2() int { return s.int2 }

// ポインタレシーバー
type MyStructWithPtrReceiver struct {
	int1 int
	int2 int
}

func (s *MyStructWithPtrReceiver) method1() int { return s.int1 }
func (s *MyStructWithPtrReceiver) method2() int { return s.int2 }
```

ポインタについておさらい
----------------------------------------

```go
var myStruct1 MyStruct = MyStruct{}
var ptrOfMyStruct1 *MyStruct = &MyStruct{}
var ptrOfMyStruct2 *MyStruct = &myStruct1
var myStruct2 MyStruct = *ptrOfMyStruct1
/*
 * mystruct MyStruct ---(&myStruct)---------------------> *Mystruct
 *
 *          MyStruct <--(*ptrOfMyStruct)--- ptrOfMyStruct *MyStruct
 */
```

- `Struct`型のポインタ型は`*Struct`
- `&struct`で実体`struct`からポインタを取得
- `*pointer`でポインタ`pointer`から実体を取得

今回のハマりポイント
----------------------------------------

```go
var myIF1 MyInterface = MyStruct{}
var myIF2 MyInterface = &MyStruct{}
// var myIF3 MyInterface = MyStructWithPtrReceiver{} -> コンパイルエラー
var myIF4 MyInterface = &MyStructWithPtrReceiver{}
```

- 値レシーバでメソッドを実装した`MyStruct`型
  - 実体`MyStruct{}`を`MyInterface`型で受けられる
  - ポインタ`&MyStruct{}`を`MyInterface`型で受けられる
- ポインタレシーバでメソッドを実装した`MyStructWithPtrReceiver`型
  - 実体`MyStructWithPtrReceiver{}`は`MyInterface`型で受けられない
  - ポインタ`&MyStructWithPtrReceiver{}`なら`MyInterface`型で受けられる
KVMで仮想シリアルコンソール接続中のSSH接続断によるエラー解決方法

# 概要
KVMで仮想シリアルコンソールに接続してる最中にSSHが接続断されてしまった場合、次回以降に接続すると以下のようなエラーメッセージが出力されます。

```bash
[root@localhost ~]# virsh console <Virtual Machine Name>
Connected to domain <Virtual Machine Name>
Escape character is ^]
error: operation failed: Active console session exists for this domain
```

この場合、解決方法としては二種類の方法があります。

# サービス再起動による解決
```bash
[root@localhost ~]# service libvirtd restart
```

# プロセスkillによる解決
```bash
[root@localhost ~]# ps aux | grep console
root     11449  0.0  0.0 300964  3648 pts/1    Sl    2016  33:33 /usr/bin/virsh --connect qemu:///system console 2

[root@localhost ~]# kill -9 11449
```

サービス再起動による解決を行う場合は、同一のKVMに共存している仮想マシンが起動していない場合に実行した方が良いでしょう。

:::note info
プロセスkillによる解決を行う場合は、自分の接続プロセスのみをkillするので同一のKVMに共存している仮想マシンがシャットダウンされるような事にはなりません。
:::
Seleniumを利用したファイルのドラッグ&ドロップ

### やりたいこと
JQuery#FileUpload等を利用している場合に、ドラッグ&ドロップのエリアにファイルをドロップするテストをSeleniumで行いたい。

SeleniumのWebElementの操作だけだと難しいので、JavascriptExecutorを利用して、JavaScriptで実現することを目指した。

### 動作環境
- Java 1.8
- Selenium 2.53.1

###サンプル
```java
final String dropAreaId = "#ドラッグドロップエリアのID";
// ダミーのinput-fileタグをスクリプトで生成する.
StringBuilder inputFileScript = new StringBuilder();
inputFileScript.append("seleniumUpload = window.$('<input/>').attr({id: 'seleniumUpload', type:'file', style:'display:none'}).appendTo('body');");
// スクリプトを実行する
((JavascriptExecutor) driver).executeScript(inputFileScript.toString());

// アップロードファイルパス(絶対パス)を設定する.
driver.findElement(By.id("seleniumUpload")).sendKeys(path);

// ダミーのinput-fileタグからドラッグドロップするスクリプト生成.
StringBuilder uploadScript = new StringBuilder();
uploadScript.append("e = $.Event('drop'); ")
            .append("e.originalEvent = {dataTransfer : { files : seleniumUpload.get(0).files } }; ")
            .append("$('" + dropAreaId + "').trigger(e); ");
// スクリプトを実行する
((JavascriptExecutor) driver).executeScript(uploadScript.toString());
```

一応これでうまくいきました。

### 参考
[Using Selenium to imitate dragging a file onto an upload element](http://stackoverflow.com/questions/5188240/using-selenium-to-imitate-dragging-a-file-onto-an-upload-element)
※リンク先はRubyのサンプル

[Javaで絶対パスを取得するgetAbsolutePath()の罠と解決方法]
(http://qiita.com/nwtgck/items/5dd7a3008a5a31bf964e)
※相対パスから絶対パスの取得時に参考にしました
【JavaScript】「クリップボード」にテキストをコピーする。

##「JavaScriptを使ってクリップボードにテキストをコピーしたい！」
と思ってあれこれやったので記載しておきます。

**公式**
https://clipboardjs.com/
英語ドキュメントなので、解読がしんどかったですけど、
やれる事もやれない事も書いてます。

**参考にしたサイト**
https://syncer.jp/clipboardjs
英語読むの面倒って人はこっちでも良いかも。
僕はこっちも見ました。

##簡単に動きの説明

```html:cb.html
<div id="copyText">
  <span name="hoge">ココがコピーされる。</span>
  <a name="copy" data-clipboard-target="#copyText span[name=hoge]">クリップボードにコピー</a>
</div>

<script>
  $(document).on('click', 'a[name=copy]', function() {
    var cp = new Clipboard('a[name=copy]');
    cp.on('success', function(e) {
      // destroy()を指定しておかないと、延々とhiddenフィールドが増え続ける。
      // (気になる方はブラウザの開発者ツール開いた状態でクリップボードコピーしてみて下さい)
      cp.destroy();
    });
    cp.on('error', function(e) {
      alert('クリップボードへのコピーに失敗しました。');
      cp.destroy();
    });
  });
</script>
```

①aタグが押下される
②scriptが走り、a[name=copy]を探しにいく
③a[name=copy]と同タグ内のdata-clipboard-targetを探しにいく(->#copyText span[name=hoge])
④#copyText span[name=hoge]の内容をクリップボードにコピーする

##補足①
上記のソースにも書いてますが、成功時/失敗時にdestroy()を指定してあげましょう。
別に指定しなくても問題はないと思いますが、延々とhiddenフィールドが増えて気持ち悪いです()

以下、公式より引用。
>Also, if you are working with single page apps, you may want to manage the lifecycle of the DOM more precisely. Here's how you clean up the events and objects that we create.


##補足②
Safariはクリップボードへのコピーが出来ないかもしれないです。
（セキリティ上の制約なので仕方ない）
（何かしらの方法はあるでしょうが、ここには記載しません。）

以上。
C言語でPPAP

つい、やってしまった。出来心。http://qiita.com/on0z/items/ef32f79bde5452a2ccec が発祥？

```C
#include <stdio.h>
#include <stdlib.h>

int main()
{
  const char* kw[] = {"Pen", "Pineapple", "Apple", "Pen"};
  unsigned ppap = -1;

  while (ppap != 0x1b) { // '00 01 10 11'
    ppap = ((ppap << 2) | (rand() & 3)) & 0xff;
    puts(kw[ppap & 3]);
  }
}
```

See also: http://qiita.com/yohhoy/items/09c95cae51146d3fd788
CloudWatch LogsでEC2インスタンスのタグで設定した名前を使うためのスクリプト

もともとは下記のような設定ファイルとなっています。

```/etc/awslogs/awslogs.conf
[/var/log/messages]
file = /var/log/messages
log_group_name = /var/log/messages
log_stream_name = {instance_id}
datetime_format = %Y-%m-%d %H:%M:%S
```

変数 `{instance_id}`と記載していれば、自分自身のインスタンスIDが設定されるようになるのですが、logsの一覧で見たときに、「あれ？自分のみたいインスタンスはどれだっけ・・・」みたいになります。

ですが、設定ファイル自体に固定で埋め込んでいるとAnsibleのようなツールを使う場合は結構面倒。
なので、自分自身のメタデータ取得とインスタンス情報取得の組み合わせでタグに設定している「Name」を取得するように設定します。 

```rename_log_stream_name.sh
#!/bin/sh

INSTANCEID=`curl -s http://169.254.169.254/latest/meta-data/instance-id/`
Name=`aws ec2 describe-instances --instance-ids ${INSTANCEID} --region ap-northeast-1 --output text --query 'Reservations[].Instances[].Tags[?Key==\`Name\`].[Value]'`

sed -i -e "s/{instance_id}/${Name}/g" /etc/awslogs/awslogs.conf
```


Ansibleだとこんな感じに設定できます。

```role/awslogs/tasks/main.yml
- name: install awslogs
  yum: name=awslogs state=latest

- name: Configure awscli.conf
  template: src=awscli.conf.j2 owner=root dest=/etc/awslogs/awscli.conf

- name: Configure awslogs.conf
  template:
    dest: /etc/awslogs/awslogs.conf
    group: root
    mode: 0644
    owner: root
    src: awslogs.conf.j2
  notify: restart awslogs agent

- name: インスタンスID置換スクリプト
  shell: /home/ec2-user/rename_log_stream_name.sh
  notify: restart awslogs agent
```
初心者が2016のプログラミングで思うこと

2016年11月25日現在、筆者が2016年のプログラミングで感じたことをまとめてみた。数年後これをみたときに何を感じるだろうか？（初心者プログラマーなので間違っていることや偏見だらけです。もし良ければご指摘お願いします！あくまでも自分の備忘録のような感じです。）

# クライアント・フロントエンド
## react.js
react.jsがよく使われている。JavaScriptが猛威を振るっているが、特にreact.jsがすごく普及している。コンポーネント化されていることで、色々再利用できて便利そう。学習コストもあまり高くなく、気軽に書くことができる。

## Go lang
Googleが作成した言語。モダンな言語で、並列処理が簡単に書ける。また、高速であることが特徴。文法が非常に少なく、c言語を学んでいたら、気軽にかける。
マスコットキャラクターが非常に気持ち悪い。

# サーバーサイド（？）
## php
多くのエンジニアがオワコンと言っている言語。しかし、まだまだ受託の案件（wordpress）はたくさん模様。果たしてあと数年後なくなるのか？

## Ruby on Rails
多くの若手エンジニアが使用しているフレームワーク。若ければ若いほど使用している人が多い模様。MVCの概念を理解していれば、Twitterぐらいなら一日で作れる（かも）。

## scala
関数型言語である。関数型言語を理解していないので、何が特徴なのかがいまいちわからない。一度学習してみたが、書き方が特殊でよく分からなかった。

## python
現在、絶大な支持を受けている言語の一つ。言語自体も、簡単で書きやすい。インデントさえ慣れれば、割とすぐに習得できる。
今の時代人口知能が流行っており、多くのデータを気軽に扱え（行列の計算などの数学的な処理が簡単にかけるのかな...）、また人口知能系のフレームワークが豊富にある。

## Java
これも多くのエンジニアがオワコンといっている。しかし、根強い人気がありそう。どこかで見た図で、シリコンバレーでは今でも非常に人気の言語だった。
個人的には、嫌いではないが、pythonとかrubyを書いたあとに触ると少し面倒に感じる。（文法が長くて、class名も長い....）

# その他
## Unity
2016年だか2015年だかが、Unity元年、ないしはVR元年と呼ばれ、ゲーム業界では非常に普及している。プログラムもするが、GUIでいろいろいじることが多く、ゲームへの参入障壁を大いに低くしたと言える。何回か触ってみたが、結構楽しい。VRも簡単に作れる。


# まとめ
なんだかんだ言って、半年で今流行りの技術をいろいろ触った気がする。まだ駆け出しなので、react.jsやGo langがどれだけ凄いのか、体感するのは難しい（そのような言語がない時代は、どれほど大変だったのか知らないから）。
あと、数年後にみた時、私は何を思うだろうか？個人的には、ウェブサイトで今よりも簡単にリッチなアニメを作れるようなフレームワークが欲しい（賢い人お願いします！）。
PHPを使って GoogleAnalytics にある特定ページの情報を受け取る


V4 の話です。V3以前の事は知らない。

V4 はすべて batchGet を経由して取得をするみたい。

https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#top_of_page


細かくは後で書く。

## インストールとか

[はじめてのアナリティクス Reporting API V4: サービス アカウント向け PHP クイックスタート](https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/service-php) で、実行できるところまでできます。

## 特定ページの検索

`filters` を使います。

こんな感じでとってこれる。


```php
<?php
    public function getPageViewsFromGoogleAnalytics(Carbon $date, $VIEW_ID, $path)
    {
        // Create the DateRange object.
        $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
        $dateRange->setStartDate( $date->format( 'Y-m-d' ) );
        $dateRange->setEndDate( $date->format( 'Y-m-d' ) );

        // Create the Metrics object.
        $sessions = new \Google_Service_AnalyticsReporting_Metric();
        $sessions->setExpression( "ga:pageviews" );

        $dimention = new \Google_Service_AnalyticsReporting_Dimension();
        $dimention->setName( 'ga:pagePath' );

        $filter = new \Google_Service_AnalyticsReporting_DimensionFilter();
        $filter->setDimensionName( 'ga:pagePath' );
        $filter->setOperator( 'REGEXP' );
        $filter->setExpressions( [ '^'. $path .'$' ] );

        $filters = new \Google_Service_AnalyticsReporting_DimensionFilterClause();
        $filters->setFilters([$filter]);

        // Create the ReportRequest object.
        $request = new \Google_Service_AnalyticsReporting_ReportRequest();
        $request->setViewId( $VIEW_ID );
        $request->setDateRanges( $dateRange );
        $request->setMetrics( array( $sessions ) );
        $request->setDimensions( [ $dimention ] );
        $request->setDimensionFilterClauses( $filters );

        $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
        $body->setReportRequests( array( $request ) );

        return $this->gcp_analytics->reports->batchGet( $body );
    }
```



## 参考

1. [はじめてのアナリティクス Reporting API V4: サービス アカウント向け PHP クイックスタート](https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/service-php)
【メモ】C++の綺麗な多重継承

例として、外部に公開するインタフェースと、その実装クラスのライブラリを作るとします。
インタフェースとしてIUnknown、それを継承するISub1、ISub2というインタフェースを提供します。
内部では、それぞれ実装クラスとしてClass1、Class2を作るとします。

```cpp
struct IUnknown {
  virtual void hoge() = 0;
} ;

struct ISub1 : public IUnknown {
  virtual void foo() = 0;
} ;

struct ISub2 : public IUnknown {
  virtual void bar() = 0;
} ;

class Class1 : public ISub1 {
public:
  void hoge(){ puts("call Class1::hoge()"); }
  void foo(){ puts("call Class1::foo()"); }
};

class Class2 : public ISub2 {
public:
  void hoge(){ puts("call Class2::hoge()"); }
  void bar(){ puts("call Class2::bar()"); }
};
```

次に、IUnknown::hogeの実装を共通化したい

```cpp
class Common : public IUnknown {
public:
  void hoge(){ puts("call Common::hoge()"); }
} ;

class Class1 : public ISub1, public Common {
public:
  // void hoge(){ puts("call Class1::hoge()"); }
  void foo(){ puts("call Class1::foo()"); }
};
```
実際これでnew Class1とかすると

> クラス 'Class1' は抽象クラス（'IUnknown::hoge() = 0' のため）

とかのエラーが言われます。
つまりClass1にはIUnknown::hogeとCommon::hogeが別物として必要だということになり
IUnknown::hogeの実装が見つからないということです。
さてどうしよう

```cpp
class Class1 : public ISub1, public Common {
public:
  void hoge(){ Common::hoge(); }
  void foo(){ puts("call Class1::foo()"); }
};
```

コンパイルは通ります。はい。ですがこれで共通化というのは。。。

```cpp
template<class T> class Common : public T {
public:
  void hoge(){ puts("call Common::hoge()"); }
} ;

class Class1 : public Common<ISub1> {
public:
  // void hoge(){ puts("call Class1::hoge()"); }
  void foo(){ puts("call Class1::foo()"); }
};

class Class2 : public Common<ISub2> {
  // void hoge(){ puts("call Class2::hoge()"); }
  void bar(){ puts("call Class2::bar()"); }
};
```

なぜこんなことが可能なのかというと、Class1が継承しているCommonテンプレートクラスはISub1インタフェースを継承していることになるからです。

```cpp
ISub2* isub = new Class2;
IUnknown* iunk = new Class2;
```

というように普通に使えます。
サンフランシスコで役立つかもしれないシリーズ

エンジニア大好きサンフランシスコに３ヶ月間ほど滞在して来たので
そこで得た役に立ったり立たなかったりする知識を紹介します。
これから行こうとしている人がほんの少しだけ幸せになれたら良いなくらいの気持ちで書いてます。

※生活や文化やスラングだったり、かなりゆるめです。

#**生活**

## Uber
言わずと知れた白タクを呼べるアプリです。
日本はまだまだですが、アメリカではうじゃうじゃ走ってるので、深夜でも簡単に捕まります。
電車も終電が早いので、いざという時の為にも登録しておきましょう。
支払いも登録クレカで全自動なので、呼んで乗って降りて評価するだけ。

ドライバーの評価レートが4を下回るとクビになるという話もあり
運転手も別れ際に「☆５付けてね！」とか言われる事もあります。
実は乗客も運転手からレーティングされていて、[自分の評価の確認](https://help.uber.com/ja_JP/h/e9302f73-8625-427f-abf7-dbe7ab25af7d)も出来ます。
初めて５以外の評価を受けた時は凄い凹みます。

最近はLyftも流行ってるそうです。
Uberよりもちょい安い代わりにチップを払うことが出来るみたいです。

## Airbnb
民泊サービスの定番。Webとアプリがあります。
ホテルに泊まるよりかは遥かに安いです。
特にサンフランシスコのホテルは、週末やカンファレンスの時期は2倍以上の値段になるのもザラ。
多少の英語のコミュニケーションは必要になりますが、頑張りましょう。
てめーの英語まじクソとか言ってくる人はいないので安心しましょう。

Airbnb内のチャット以外にもSMS、Whatsappで対応してくれる人もいます。
アジア系の人はLINEを使える方も多いです。

Airbnbへの登録手順が少し特殊なので、使う予定のある方は早めに済ませておきましょう。
GoogleやFacebookなどのアカウントから信頼性をチェックする為です。
長く使ったアカウントであればあるほど通り易い仕組みです。
時間が掛かったり、審査に落ちたりする場合があるので注意。

## Pliny the Elder
超うまいレア物ビール。
サンフランシスコからゴールデンゲートブリッジを渡った先にある
Russian River Brewingが作ってるIPA。
地元でもなかなか飲めないビールです。
近いので直接ブリュワリーに行ってしまう手も。
ブリュワリーには年に一度だけ飲めるPliny the Youngerという伝説のビールも。

クラフトビール好きは必ず抑えておきたい一品。

## 美味しいハンバーガーと焼き加減
Super DuperとUmami Burgerは美味しかったです。

アメリカは注文時にハンバーガーの焼き加減も聞いてきますが、
英語を聴きなれてないと、よく聴き逃します。
How would like〜、How do you like〜が来たら、すかさず焼き加減を答えましょう。
Midiumとか、Rareとか。
あとステーキはともかく、ハンバーガーのRareは素人にはおすすめできません。

## 自炊するならSafeway
安定の品揃えのスーパーマーケット。
長期間滞在するなら、Safeway付近に宿を取ると幸せになれます。
アメリカのクラフトビールも日本の半額くらいで買えます。
ステーキも安いです。

## タバコ売ってる場所を見付けたい
ガソリンスタンドを探しましょう。
ここらは何故かガソリンスタンドとコンビニがいつもセットになっていて、タバコもあります。

## 寒暖差
年中気候が安定していて温かいですが、基本的に夜は冷えます。
あと皆ちょー暑がりなんで、オフィスが冷房キツイ可能性が高いです。
職場に上着を置いておきましょう。

## 家電製品買いたい
Amazonじゃなくて実店舗行きたいなら、Best BuyかTargetを探しましょう。
Market Streetにだいたいあります。

## Sushi
米が逝ってる場合が殆どなので、非推奨です。

## Japan Town
Japan Townと呼ばれるエリアがあります。
https://goo.gl/maps/NonaD9QNmCP2

Nijiyaでは日本の食材が揃います。即席麺やお菓子も有り。
紀伊国屋もあって、日本の英訳コミックが沢山置いてあります。
アメリカから見た日本のサブカルを覗けて結構面白いのでオススメです。

#**文化**

## San Francisco Giants
地元MLB球団。
サンフランシスコを本拠地としているだけに、殆どの人間がGiantsファン。
試合日の球場周りはめちゃくちゃ込みます。
まだ本拠地がNew Yorkだった頃、同じくNew Yorkを拠点としていたDodgersとはライバル関係。
巨人と阪神以上に仲が悪いです。
マエケン知ってる？とか聞いたら冷たくあしらわれます。

試合を見た後は、近くのUmami Burgerでも如何ですか？

## TGIF
Thank God It's Friday.
ようは花金です。
企業によってですが、TGIFと称して金曜日にお菓子やお酒と一緒に全社員でミーティングする事が多いです。
発表資料もお酒のつまみ、色んなスラングが見れるかも知れません。

#**スラング**

## Leeroy Jenkins
ほぼネットスラング。
World of WarcraftというMMORPGの有名プレイヤー。

ランチで
「Leeerooooy！　Jeeenkiiiins!」
と叫びながらチキンを食べれば人気者になれるかも知れません。

※パーティプレイ中にチキンを温めてて話聞いてなかったリーロイさんが
戻ってくるなり自分の名前叫んでボスの間に突入したせいでパーティが全滅した動画が超有名。
https://www.youtube.com/watch?v=mLyOj_QD4a4

## It's over 9000!
古いネットスラング。
ランチのネタにでもしましょう。

※アメリカ版ドラゴンボールでベジータが叫んだ言葉です。
笑いのツボの違いがわかりますね。"Thousaaaand"を強調するのがコツです。

## It's Happening
スラング。
なんかよく資料に現れる。
![itshappening.gif](https://qiita-image-store.s3.amazonaws.com/0/24204/fd4f7e1a-bf19-a4b0-5710-edc6ffdb2f74.gif)

元ネタはよくわかりません。

## LGTM
Looks good to me.
エンジニアが一回言ってみたいシリーズ。
主にgitのコードレビューの返しに使いますが、実質イイねと同じなので
チャットの返しにラフに書いても良いです。

##
実機のスクリーンショットをサッと撮るショートカットを登録する

実機でデバッグしている時に、画面のスクリーンショットを撮りたいときってありますよね。
その時に、実機側でホームボタン+電源ボタンでスクリーンショットを撮るのも良いのですが、これをPCに転送したりは面倒だったり。

なので、Xcodeでショートカットを使ってサッとスクリーンショットを撮影して、PCに保存できるようにしてみます。

## 設定でショートカットを登録する
Xcodeの設定画面(`cmd + ,`)を開き、 **[Key Bidings]** の項目に移動します。

<img width="744" alt="スクリーンショット 2016-11-25 15.37.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/76b5dfb3-58fe-76c1-b87d-dd5a03a99376.png">

ここから、 *Filter* を使って、「take screenshot of active device」 と調べます。すると、このように項目がでてきます。

<img width="747" alt="スクリーンショット 2016-11-25 15.39.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/385ee5af-47fa-3842-6366-672497bb020f.png">

あとは、keyの部分をダブルクリックし、好きなショートカットキーを登録します。
自分は **`cmd + opt + shift + T`**で撮影できるようにしました。

このように、ショートカットキーが設定できれば完了です。

<img width="707" alt="スクリーンショット 2016-11-25 15.43.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/bcdb6258-eafa-e6d0-e67f-41154d9f98b5.png">


ちなみにこの項目は、メニューバーから見ると、ここにいます。

<img width="533" alt="スクリーンショット 2016-11-25 15.41.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/e429d76b-5e05-1782-2311-724e828570fa.png">


## 撮影してみる
設定したショートカットを押すことで、実機のスクリーンショットを撮影できます。保存先は(おそらく)Desktopになるかと思います。

ただし、注意点として、以下のようにXcodeでRunするときに選択する端末を実機にしておかないと、このショートカットは作動しないです。
ので、シミュレーターが指定されていると、作動しません。
選択されていれば問題ないので、Runしている間じゃないといけないということはありません。

![スクリーンショット 2016-11-25 15.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/27802/c4d1c051-aaa4-b2ae-6db3-910474f0488c.png)

こちらの場合は、接続されていればXcodeのRunで実行する端末として選択されていなくても撮影することが可能です。



## 別の方法
ちなみに、Xcodeから、 [Window] -> [Devices] \(`cmd + shift + 2`) でDeviceの一覧画面を開いて、今接続している実機を選んで、 **「Take Screenshot」** を押すことでスクリーンショットを撮ることもできます。

<img width="725" alt="スクリーンショット 2016-11-25 15.35.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/4e94bd26-67c8-96b7-70a0-a0d862ead5dd.png">


## ちなみにシミュレーターでは
シミュレーターの場合は、 `cmd + S`で保存することができます。

## まとめ
**「Take Screenshot of Active Device」** にショートカットを入れてあげると幸せになれる。
iPhoneのメッセージが届かない時の対策

iPhoneをお持ちの皆さん、メッセージが届かない時、どうすれば良いのでしょうか？

ここで、iPhoneのメッセージが届かない時の対策を5つをご紹介します。

方法１、iPhoneを再起動する
iPhoneには不具合が出てから、再起動のは定番です。

方法２、ネット環境を確認する
ネット環境の原因でメッセージが届かないケースもよくありますね。その時には、iPhoneのWi-Fi状況、モバイル通信に接続しているかを確認してください。

方法３、iMessageをオンにする
相手はiMessageの形式でMessageを送る時、オンにするだけで、届けます。その場合、iMessageをオンにしてください。
iPhoneで「設定」　＞　「メッセージ」に入って、「iMessage」をオンにします。
![Bad Request]()
　
方法4、iPhoneのキャリア設定をアップデートする

ステップ1：iPhoneで「設定」　＞　「一般」　＞　「情報」に入ります。
![Bad Request]()

ステップ2：もしキャリアアップデートが提供されているなら、キャリア設定をアップデートするオプションが表示されます。「アップデート」をタップして、iPhoneのキャリア設定をアップデートしてくだい。
![Bad Request]()

いよいよ方法5ですね。

方法５、「着信拒否」設定を確認する

時々誤って相手の電話番号、またはメールアドレスを着信拒否リストに追加してしまうこともありますから、相手の連絡先が「着信拒否」に入っているかを確認してください：

ステップ1、iPhoneで「設定」　＞　「メッセージ」に入ります。
ステップ2、「着信拒否設定」に入ります　＞　「編集」をタップして、メッセージが届かない電話番号またはメールアドレスを削除してください。
![Bad Request]()

以上です、いかがでしょうか？この文章は、iMobieの公式サイトの【iPhoneのメッセージが届かない時のやるべき対処法】を参考して書きます。

もし、詳細は知りたいなら、https://www.imobie.jp/support/cant-receive-messages-on-iphone.htmまでにご参考ください。
[PHP][Composer] Composer本体をインストールする方法の1つ

# 前置き
Laravel 5.2を使うことになり、LaravelはComposerを使ってインストールするようなので、Composerをインストールしてみた。

# 環境
- OSX El Capitan

# Composerとは
- PHPのパッケージ管理システム。依存性を含めて管理できるので、とても楽。
- **RubyにおけるBundlerやJavaScriptにおけるnpmと同様のもの**

## 参考
- http://qiita.com/yudsuzuk/items/7ec595d9cb93dadcaae0

# 手順
## composerをインストールして、通常パスが通ってるディレクトリに移動させます

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

## 疎通確認

```zsh
$ composer                                                                                                           
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.2.2 2016-11-03 17:43:15
```

## Composerのアップデート

```zsh
$ composer self-update
```