OmniAICreator/Qiita-1.07M huggingface dataset:
牛歩なGolang稚児ようやく動くものが作れた

#背景
2016/07/20
※個人的なあれなので読まなくてOKです
さて、MVPか。何作ろう。。
マインドマップなアプリでも作ろうかなあ
CSVデータで扱いたい：簡単だから
GUI

XMind(+ Bonjour)を入れる 
FreeMindも入れるか：excelと親和性があった気がする。

どっちもコピペとか行けるのだろうか？
ツリー構造の汎用データ構造を持って共有したい
できるならRDBSみたいに・・・いやそれは要らないか

LibreOfficeでコピペ実験してみたらXMindがいい感じにコピペできた。

CSVを扱うコードはWeb上にすでにあった
http://qiita.com/kesuzuki/items/202cc58db3fd1763c095
⇒クリップボードを扱ってXMind向けに疑似汎用Export/Importでも実装しようかな。
※ほんのちびっと自動化するだけだけど。すでに機能あるかもだけど。

クリップボードもあった。
https://github.com/atotto/clipboard

事前のパッケージのインストールもコマンド一発でやって欲しいなあ
簡単にスクリプト化できないんだろうか。
⇒スクリプト作りながら既存のCSVを扱うコードを走らせてみよう

最近git-bash使ってるから.batにgo getをコピペしたものを
cmd.exeの引数にして叩いてみる。
http://d.hatena.ne.jp/m-hiyama/20110729/1311910095

コマンドプロンプトの動作がおかしい。。
動いてるのだろうか・・・？
よく分からないので素直にcmd.exeから.batを叩く。
いつもログないので不安になるけどERROR出ないから多分うまくいったんだろう。

CSV読み込みコードを書いている間に、
どうやって取り出したい対象を読み込むんだ？
ということに思い当たる。

要件自体は普通にコピペすればできてるから
やり方を選ばなければすでに実装されているわけで。

コマンドラインからやるのだとしても
.xmindファイルパースするの。。？
コマンドライン以外から引数付きで実行する方法ってすぐ分かるんやろか？？

何も産み出さないかもしれないとは思いつつ
とりあえずGolangの勉強だけになってもいいじゃないかと自分に言い聞かせる。

#ようやく簡単なプログラムを作成
まずはCSVを扱うコードを作成しようと思ったら、
苦労する苦労する。。

##主な参考サイト
http://qiita.com/kesuzuki/items/202cc58db3fd1763c095
http://qiita.com/ikawaha/items/28186d965780fab5533d

参考になりました。誠にありがとうございますm(_ _"m)

###助かった参考サイト
 - 制御構文
http://qiita.com/high5/items/3fe34d2feeff2c11f5ca
http://qiita.com/ohkawa/items/e7a056708ece04d06310

 - 文字列・数値変換
http://matope.hatenablog.com/entry/2014/04/22/101127
 - 定数の宣言（ちょっとハマったので。:=使ってビルドでつまづきました。）
http://qiita.com/hkurokawa/items/a4d402d3182dff387674
※もっとちょうどいいサイト見た気もするけど見つからなかったので情報リッチなサイト

ついでにサンプルデータを下記のサイトから失敬しました。
http://pythondatascience.plavox.info/pandas/csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF/

##できたこと
・go run で正常終了
・引数使用
・ファイル読み込み（３種類）
・タブ区切りファイル

何かに追われるようにとりあえずGitHubにアップ
https://github.com/senoEisuke/mvp/blob/fileReadTrial/my_csv.go

###余談
一番ハマったのはスコープをしくっていたことでした。

以下、詳細。特にオチは無し。
CSV読んで出力するコードを書いてビルドして実行した。
メモリ参照エラーが(笑)
まともに動かない。
⇒　ビルドしないで動かそう
ファイルが分からんかったんやて。拡張子無視？
⇒拡張子以外同じファイルを移動したり、絶対パスにしたり、""で括ったりしてもダメ

いちいちavastがポップアップする(笑)
exeが引っかかるようなのでgo run で実行しても
exeは生成されているんですね。

git-bashでやってもダメ。。なんでやー

とりあえずファイルOpenの前にパスを出力してみようとしたけどダメだった。
csv.goの名前がアカンのか？
⇒my_csv.goでもダメ

んーHello World的なのやったっけかなー　⇒　やったら問題なし。
cmdでもgit-bashでもLiteIDEの実行ウィンドウでもOK。
avastがポップアップ荒ぶってうざい。

関数もfor文も問題ないみたい。

引数取るのがアカンのかな
くそー単なるファイル読み込みからのPrint出力が中々できない。。
　１．CSV（タブ区切り）：ファイルが特定できないと言われた。
　２．bufioでNewReaderSize, ReadLine：返り値の処理ががが。
　３．Scanner：invalid argument

ここ見てスコープミスってることに気付いてとりあえず２．OK
https://groups.google.com/forum/#!topic/golang-nuts/KQd2s6ktMS4

３．１．と順当にOK！

やったー！
とりあえずGitHubにアップしたろ。
思い出だけですけど…

http://enterprisezine.jp/dbonline/detail/8222
この文書で、「データベースが起動できない」という原因は、主に電源障害によるサーバ停止やディスク障害などによってデータファイルが破損しているケースです。

思い出したら、昔の会社はとても古いビルにあります。メンテナンスがあまりしていなくて、時々短路で、火事まで起こったこともあります。短路で電源障害になっても、データベースは起動できないことが一度もなかったです。ラッキーのやつは、たぶんわたしのことだ :smirk: 

（データベース初心者のわたしには、文章を参考になりました。）
ReactとReduxをES6で試す 概要編


## 概要
普段RailsとAndroidのコードしか書いてなくて、js系のフレームワークを全く触ってなかったので流行りのReact.jsを使ってWebアプリを製作してみることにした。
調べてみたらReduxというmoduleが良いと書いてあったので試してみた。

読者対象は基本的に将来の自分ですが、もっとこんなのあるよ！とここ間違ってるよ！みたいな編集リクエストとかは大歓迎です。

今回の学習で[自動車免許学科試験](http://menkyo.site/)というWebアプリを作りました。よければ使ってください。

今回は概要編です。

## Reactとは

![](http://smashingboxes.com/media/W1siZiIsIjIwMTUvMTAvMjAvMTAvNDQvNTMvNjk3L1JlYWN0XzEuMC5wbmciXV0/React%201.0.png?sha=886b9b43c826ec79)

- javascriptを使用したライブラリ
- MVCでいうところのViewのみを担当している
- DOM操作を単純化してくれる

## Reactに出てくる単語

### Component
データ, 見た目, 振る舞い全てをひとまとめにしたもの
state(状態)を受け取ってViewを生成する部分

### State
現在の状態を示すもの。Reactでは基本的にこの値を更新する個でViewを更新していく

## Reduxとは
![](https://camo.githubusercontent.com/f28b5bc7822f1b7bb28a96d8d09e7d79169248fc/687474703a2f2f692e696d6775722e636f6d2f4a65567164514d2e706e67)

- DOM操作を単純化してくれるといっても管理しなければならないものは多い。Reduxはstate(状態)の管理をしてくれるもの。
- Reduxは3原則に則って状態変化の流れを制限することで、状態を管理できるようにしている。

## Redux３原則
Reduxは3原則に則って状態変化の流れを制限することで、状態を管理できるようにしている。

#### Single source of truth
アプリの状態をもつStoreはただ1つ。

####  state is read-only
状態を変更するには必ずActionを発行しなければならない。

####  Changes are made with pure functions
Actionにより状態をどう変更させるかはReducerが行なう。

## Reduxに出てくる単語

#### ActionCreator

- actionを作るための関数
- ajaxリクエストなどの処理を行い、結果を含めたactionを作成する

#### Action

- アプリケーションで何が起きたのかとそれに付随するデータ
- typeと任意のデータを持つ単なるObject
- acitonCreatorによって作成されてdispacherに渡される
- reduxでは、actionCreatorによって作成され、store.dispatch関数に渡される

#### Store
- アプリケーションのstate(状態)を持っている
- store.dispatch関数を通じてstoreのstateを更新する
- reduxではstoreは内部的にredux自体が管理しているので自作する必要はない

#### View
- Reactのcomponentを指す

#### Dispatcher
- action指定してstoreのstateを更新するためのメソッド

#### Provider(componentの一部)
- ルートのコンポーネントとしてreactコンポーネントをラップする
- propsとしてstoreを受け取りreduxのオブジェクトに登録する
- 渡されたstoreはconnect()でラップされたコンポーネントを通じて共有される

#### Reducer
- reduxではstateをreduxオブジェクトが内部的に管理する
- storeのstateを変更する部分
- reducerは現在のstateとactionを受け取り、新しいstateを返す関数
- reducerは、アプリケーションの規模に応じてstateを部分的に担当するreducerとして分割することもできる
- stateの部分毎に複数のreducerに分担する場合は、combineReducers()を利用すると便利

#### Middleware
- dispatchする前、した後にそれぞれ任意の処理を追加することができる仕組み

## 状態遷移
[mae's blog](http://mae.chab.in/)さんのサイトに載ってた図が分かりやすかった
![](http://mae.chab.in/wp-content/uploads/2015/08/flux-diagram-white-background.png)


## 感想
よくわからない単語がたくさん出てきて非常に辛い
最後の状態遷移の画像がよく表されているけれど、それでもなんとなく程度にしか理解できなかった。
実際にコードを書きながらやったほうが早い気がする


## 参考文献
- [Redux入門 1日目 Reduxとは(公式ドキュメント和訳)](http://qiita.com/kiita312/items/b001839150ab04a6a427)
- [5分で理解するReact.js](http://qiita.com/tomzoh/items/7fabe7cb57dd96425867)
- [最小のReact+Redux](http://qiita.com/Chayata/items/28bc6f6af4bc41e89e03)
- [Reduxの実装とReactとの連携を超シンプルなサンプルを使って解説](http://mae.chab.in/archives/2885)
- [公式チュートリアル](https://facebook.github.io/react/docs/tutorial-ja-JP.html)
- [fluxフレームワークreduxについてドキュメントを読んだメモ](http://fukajun.org/66)
tf.Graphの使い所


# 問題
今、tensorflowを使ったウェブアプリを作っています。複数種類のモデルで識別の結果を出したい。それらのモデルは個別に学習させて、学習結果を別々に保存し、サーバ起動時に、それを読みこんで動かそうと思いました。

ざっくりとコードの断片を書くと

```ai/util.py
class MyModel():
	# モデルの管理をしたりするクラス
```

```ai/ai1.py
# モデルを作成
model = MyModel(モデルの詳細)
if __name__ == '__main__':
	# 学習段階なら学習し、save/ai1.ckptに学習結果を保存する
```
(ai2, ai3も同様に)

```app.py
from ai.ai1 imoort model as model1
from ai.ai2 imoort model as model2
from ai.ai3 imoort model as model3

# 学習結果を読み込む
model1.restore()
model2.restore()
model3.restore()
```

のように、別々に学習させて、サーバ起動時に読み込む。
しかし、このようにすると、ai2の学習結果を読み込むmodel2.restoreのところでエラーが出る。model2には◯◯って変数がないよって言われます。もちろん、一つだけなら問題ない。

# 解決
何が原因かというと、すべてのモデルを同じGraphに書き込んでしまっていることがいけなかった。tensorflowはデフォルトで1つのGraphが用意されており、それに書き込んでいくということになっている。importするごとにそこにモデルが書き込まれるわけだが、当然、3つのモデルが混ざっていて、個別にする学習のときのGraphと異なる構成になってしまう。

これを解決するには、別のGraphで読み込めばいい。なので、例えば、app.pyの該当部分を

```app.py
with tf.Graph().as_default():
	from ai.ai1 imoort model as model1
	model1.restore()
with tf.Graph().as_default():
	from ai.ai2 imoort model as model2
	model2.restore()
with tf.Graph().as_default():
	from ai.ai3 imoort model as model3
	model3.restore()
```

のように`with tf.Graph().as_default():`で囲ってしまえば良い。
とにかくすばやくEC2にNodejsをいれるメモ


前提
-----

 - EC2インスタンス作成＆起動済
 - 基本的な設定済み

参考：[とにかくすばやくEC2環境を作るメモ](http://qiita.com/master-of-sugar/items/18fd684fa3938cdfe930)


nvmのインストール
-----

```
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
```

使えるように

```
source ~/.bashrc 
```
※上記をやらなくても再ログインすると勝手に使えるようになっている。

```
nvm --version

0.29.0
```

入れたいバージョンを入れる
-----

入れたいバージョンが決まっているなら `nvm install vx.x.x` のようにすればよいし、バージョンを探したいなら `nvm ls-remote` するとインストール可能なバージョン一覧が出る。


```
nvm install v6.2.0

Downloading https://nodejs.org/dist/v6.2.0/node-v6.2.0-linux-x64.tar.xz...
######################################################################## 100.0%
WARNING: checksums are currently disabled for node.js v4.0 and later
Now using node v6.2.0 (npm v3.8.9)
```

確認

node

```
node -v

v6.2.0
```

npm

```
npm -v
3.8.9
```

さいごに
-----

`nvm` って `maven` の `mvn` とよく間違えるよね。

追記
----
`.bash_profile` とかに `nvm use 6.2.0` しておくとよい。
scrapyでのBasic認証とフォームによる認証

訳あってBasic認証とフォームによるユーザ認証がかかったCMSからスクレイピングする必要があったのでその際のメモ。

##Basic認証(HTTP認証)
[公式ドキュメント](http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.downloadermiddlewares.httpauth)
settings.pyのDOWNLOADER_MIDDLEWARESでHttpAuthMiddlewareを有効にして、Spiderにhttp_userとhttp_passを追加すれば認証通る。

##フォームによる認証
[公式ドキュメント](http://doc.scrapy.org/en/latest/topics/request-response.html#using-formrequest-from-response-to-simulate-a-user-login)
公式のサンプルそのまま。
みんな大好きiptablesの使い方


CentOS6を基準に記載しております。
iptablesの使い方で、よく解説されているコマンドの例は引数が `-A` になっている記事をよく見かけます。

しかし！
このままではよくありません！
みんなでiptables大好きっ子になりましょう！

というわけで下記のコマンドを例にiptablesに追加します
下記はmuninやnagiosからデータを受け取った時のiptablesの設定例です。

```
sudo iptables -I RH-Firewall-1-INPUT 6 -m state --state NEW -p tcp --dport 4949 -j ACCEPT -s 192.168.0.2
sudo iptables -I RH-Firewall-1-INPUT 6 -m state --state NEW -p tcp --dport 5666 -j ACCEPT -s 192.168.0.2
sudo iptables -I RH-Firewall-1-INPUT 6 -m state --state NEW -p tcp --dport 3306 -j ACCEPT -s 192.168.0.0/24
sudo iptables -I RH-Firewall-1-INPUT 9 -p icmp  --icmp-type 255 -j ACCEPT
```

`sudo /etc/init.d/iptables save`

いつもiptablesの後は `-A` 引数を実行していました。
しかし、既存のよくわかっていないサーバ環境に、muninやnagiosを追加しろとお達しを受け、iptablesを制御しなければならなくなりました。
というか、条件の途中ででdropしてるし、うかつに `-A` を使うわけにはいきません！
しかし、iptablesの情報が大量に登録してあり、この後山ほどある登録情報を削除して、登録し直すっていうパターンが出てくるとイヤです。
そんな作業やってられるかーとお嘆きのあなた！
今ならなんと `-I` をつけることで、そんなモヤモヤした悩みから解放され、すっきりした気持ちでiptablesを管理することができます。

つまり、このコマンドの例の中では、 RH-Firewall-1-INPUTというラベル名の6番目に、stateが新規の通信(NEW)であり、送信元ポート(dport)がxxxxでIPがxxx.xxx.xxx.xxxの場合、許可せよ、という例になります。

**やった！！！！これであなたも今後、不明な通信からの接続に悩まされることがなくなりましたね！うおおお！！！！！！**

ちなみに削除したいときは `-D` を指定したら登録情報を削除できます。

保存したいときは `/etc/init.d/iptables save` を実行すれば保存できます。
逆に失敗したり、変更した内容を保存時の状態にまで戻りたいときは、 `/etc/init.d/iptables restart` すれば簡単に戻せます。

他の引数はなんとなく見ればわかるんですけど、iptablesコマンドは引数が多いので曲者ですよねえ。
勉強になりました。

**※ 最近はAWSのセキュリティグループでチョチョイのチョイと弄れば済む話なのでこんな苦労することはないんですけどね**
Ambariのダッシュボードを見てみる

今回は、Ambariのダッシュボードを見ていきます。

ダッシュボードはAmbariにログインした後に最初に表示されるベージです。
または、Web画面の上部にある「Dashboard」をクリックすると表示されます。

# メトリクス

ダッシュボードを開くと、以下のようにクラスタ全体のメトリクスを見ることができます。
これを見ることでクラスタ全体がどういう状況かを確認することができます。

<img width="976" alt="ambari_dashborad" src="https://qiita-image-store.s3.amazonaws.com/0/8576/ffcc2067-461e-a40c-8259-c65808625117.png">

Ambari 2.2.2時点では以下のメトリクスがあるようです。

* Cluster Load
* Memory Usage
* Network Usage
* CPU Usage
* HDFS Disk Usage
* NameNode Heap
* NameNode RPC
* NameNode CPU WIO
* NameNode Uptime
* DataNodes Live
* HBase Master Heap
* HBase Ave Load
* HBase Master Uptime
* Region In Transition
* YARN Memory
* ResourceManager Heap
* ResourceManager Uptime
* Flume Live
* Supervisors Live

サーバリソース系やHDFS、HBase、YARNなどの全体的なメトリクスが含まれてます。
また、各コンポーネントのWeb UIへのクイックリンク的なものも出すことができるようです。

これらのMetricsは、上の方にある「Metric Actions」から追加したり、各Metrics上にマウスオーバすると左上に削除ボタンが出てくるのでそこから削除することが可能となっています。

また、以下のように各Metrics上にマウスオーバするとそのMetricsの詳細が出てきます。
この例だと「HDFS Disk Usage」の詳細である「DFS used」や「non DFS used」などの情報が表示されています。

<img width="204" alt="hdfs_disk_usage_detail" src="https://qiita-image-store.s3.amazonaws.com/0/8576/3d1411c8-b1dc-edd1-7a15-17e46877658c.png">

また、上のスクリーンショットで右上にカスタマイズアイコンがあることがわかります。
これをクリックすると以下のようなポップアップが出てきます。

<img width="880" alt="スクリーンショット 2016-07-21 18.45.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/8576/b89184f6-b92a-5941-1404-4f46c2c56bc6.png">

ここでは、Metricsの色が変わるしきい値の設定をすることができます。この例だと、HDFSの使用量が85%を超えたら黄色く表示され、95%を超えると赤く表示される設定になっています。ダッシュボードでクラスタ状況を確認する際に色が変わっていると一目で何か起こっていることがわかりますね。

# ヒートマップ

次に、「HeatMaps」タグをクリックすると各Metricsをヒープマップで見ることができます。
以下は、HDFSのノードごとの容量の使用率のヒートマップです。

<img width="985" alt="スクリーンショット 2016-07-21 19.01.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/8576/9db1c497-9d87-6bc8-a7c1-2b1396f24a50.png">

今回はHDP SandboxのVMを使っているので、ノードが1つしかなく全然面白くないのですが、ノードの台数が増えていくとヒープマップを見ることで全体的な偏りだったり負荷状況だったりを確認することができます。

Ambari 2.2.2時点では、以下のようにHostのサーバリソース系やHDFS、YARN、HBaseのメトリクスのヒートマップを見ることができます。

* Host
  * Disk Space Used
  * Memory Used
  * CPU Wait I/O
* HDFS
  * Bytes Read
  * Bytes Written
  * Garbage Collection Time
  * JVM Heap MemoryUsed
* YARN
  * Garbage Collection Time
  * JVM Heap Memory Used
  * Memory used
* HBase
  * RegionServer read request count
  * RegionServer write request count
  * RegionServer compaction queue size
  * RegionServer regions
  * RegionServer memstore sizes

# まとめ

今回はAmbariのダッシュボードを見てみました。ダッシュボードを見ると、様々なメトリクスやヒートマップを見ることができてクラスタの状況を確認することができます。

# 参考

http://docs.hortonworks.com/HDPDocuments/Ambari-2.2.2.0/bk_Ambari_Users_Guide/content/ch_viewing_the_ambari_dashboards.html
Rails 4.1 から 4.2 への対応

rails 4.1 から 4.2 へ移行したので、その対応とかつまずいたところをまとめてみました。

以下、引用しているのはリリースノートからです。



# Active Record

代入時に、そのカラムの型に cast されるようになったようです。
cast されないことを期待した validation とかがあったので対応が必要でした。

## 例

例えば以下のようなテーブルを定義したとして、

```rb
    create_table :numbers do |t|

      t.decimal  "rate", precision: 3, scale: 1, default: 1.0, null: false

      t.timestamps null: false
    end
```

### Rails 4.1.15

```
> Number.new(rate: 1.23).rate.to_f
=> 1.23
```

### Rails 4.2.6

```
> Number.new(rate: 1.23).rate.to_f
=> 1.2
```


# Action Pack

> 結合テストの中でprocessヘルパーを呼び出すとき、パスの冒頭にスラッシュ ('/') が必要になりました。以前は省略することができましたが、これは内部実装による副作用であり、意図的な機能ではありません。
> 例:
> ```
> test "list all posts" do
>   get "/posts"
>   assert_response :success
> end
> ```

一部で冒頭スラッシュなしのコードがあったので、その部分の対応をしました。


# rubygems

* state_machine という gem が対応していなかったので state_machines-activerecord を使うようにしました。 (参考) https://www.hsbt.org/diary/20150331.html#p01

# 非互換の対応

> respond_withと、これに対応するクラスレベルのrespond_toはresponders gemに移動されました。この機能を使用したい場合は、Gemfileにgem 'responders', '~> 2.0'を追記してください。

表記の通り responders gem を使うようにしました。


# 非推奨の対応

* ```.findや.exists?にActive Recordオブジェクトを渡すことは非推奨になりました。最初にオブジェクトのidを呼び出すべきです。```
* ```production環境でconfig.log_levelを未設定のままにすることが非推奨になりました。 ```
* ```deliver やdeliver!が非推奨になりました。今後はdeliver_nowやdeliver_now!を使用してください。```
* config.serve_static_assets を config.serve_static_files に変更
Windows 7 > USB 8GBメモリをFAT16フォーマット > format e: /fs:fat は失敗する

```txt:動作環境
Windows 7 pro 32bit
USB メモリ 8GB (USB2.0のもの)
```

DOS プロンプトでFAT16フォーマットするパラメータを試してみた。

```
> format e: /fs:fat
新しいディスクをドライブE:に挿入してください
準備ができたら Enterキーを押してください...
ファイルシステムの種類は FAT32 です。
新しいファイル システムは FAT です。
検査しています  7435M バイト
ボリュームは FAT16/12 には大きすぎます。
```

上記のメッセージが出て、E:ドライブのUSBメモリフォーマットは失敗した。
E:ドライブを開こうとしても「ドライブE:を使うにはフォーマットする必要があります。フォーマットしますか?」のエラーが出る。

やはりFAT16フォーマットには下記のリンク先の方法が必要のようだ。
http://qiita.com/7of9/items/db8aba6227e91cbcb65a
jqの結果をファイルにリダイレクトする

catで読んだjsonをjqに渡して見やすく成形した結果をファイルにリダイレクトしようとしたら、、、

```text
cat foo.json | jq > foo_jq.json                                      
jq - commandline JSON processor [version 1.5]
Usage: jq [options] <jq filter> [file...]

	jq is a tool for processing JSON inputs, applying the
	given filter to its JSON text inputs and producing the
	filter's results as JSON on standard output.
	The simplest filter is ., which is the identity filter,
	copying jq's input to its output unmodified (except for
	formatting).
	For more advanced filters see the jq(1) manpage ("man jq")
	and/or https://stedolan.github.io/jq

	Some of the options include:
	 -c		compact instead of pretty-printed output;
	 -n		use `null` as the single input value;
	 -e		set the exit status code based on the output;
	 -s		read (slurp) all inputs into an array; apply filter to it;
	 -r		output raw strings, not JSON texts;
	 -R		read raw strings, not JSON texts;
	 -C		colorize JSON;
	 -M		monochrome (don't colorize JSON);
	 -S		sort keys of objects on output;
	 --tab	use tabs for indentation;
	 --arg a v	set variable $a to value <v>;
	 --argjson a v	set variable $a to JSON value <v>;
	 --slurpfile a f	set variable $a to an array of JSON texts read from <f>;
	See the manpage for more options.
```
Usageが表示されてしまいリダイレクトがうまくいかず、ちょっとハマったが、、、

```
jq . foo.json > foo_jq.json
cat foo.json | jq . > foo_jq.json
```
こんな感じでうまくいった。

ちょっとした小ネタだけど `jq` `リダイレクト` 等のワードでググっても出なかったので書いてみた。
Windows上のAtomで Haskell開発環境を整える。

# Haskell IDE の dependencyが若干めんどくさいのでメモ。

## Results

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/100271/ce0cd377-ff93-a1ae-f83c-1dc341c28039.png)


## Prerequisites: 
- atom

## Instructions

### Step 1: Install Haskell platform
[Haskell Platform Install Link](https://www.haskell.org/platform/)
ここで Fullをインストールする。

### Step 2: Install dependencies
`cmd` を開いて、`C:\Users\User>stack` と入れて色々と長い --help的なのが出たらStep 1は成功。

`stack setup`でghcのバージョンをそろえる必要があるかもしれません。

`stack install ghc-mod`
`stack install stylish-haskell`
`stack install hlint`

結構時間かかりますけど以上3つをインスコ。恐らく `C:\Users\{User}\AppData\Roaming\local\bin`にバイナリが入っているはず。

### Step 3: Set PATH variable
参考までに：[Windows 環境変数 Path の設定方法](http://next.matrix.jp/config-path-win7.html)

先ほどの`C:\Users\{User}\AppData\Roaming\local\bin`にパスを通します。

### Step 4: Install Atom packages

- autocomplete-haskell
- haskell-ghc-mod
- ide-haskell
- ide-haskell-repl
- language-haskell
- linter
- linter-hlint

以上で特に問題なくAtomのHaskell環境がいい感じになりました。
Windows > Link > 8GB USBメモリをFAT16でフォーマットする手順 on Windows7

Windows7において、8GBのUSBメモリをFAT16でフォーマットしたいときの情報。

[How do I format my 8 GB USB drive to FAT/FAT16 in Windows 7?](http://demo102.phpcaiji.com/article/cacbga-how-do-i-format-my-8-gb-usb-drive-to-fat-fat16-in-windows-7.html)

> There isn't any way to format a FAT16 partition larger than 4 GB (2 GB under Windows).

とある。このためDISKPARTで区画を2GB未満で作成して、それをFAT16でフォーマットするという手順のようだ。


FAT16の容量自体は2GB最大のようだ (特殊例を除く)。
http://faq.buffalo.jp/app/answers/detail/a_id/1079

> FAT16(短所)
> - 1つの領域として確保できる容量は最大2047MBまで
無限リストでFizzBuzz

最近Elixir勉強中なのでFizzBuzz書こうかなぁっと思ってググってたら無限リストでFizzBuzzが書けるということを知ったのでElixirで実装しよっかなぁって

参考 
https://gist.github.com/kofno/6075856#file-thunk_fizz_buzz-rb

# Elixirで

```ex
defmodule FizzBuzz do
  def fizz_buzz(n) do
    threes = Stream.cycle([nil, nil, "Fizz"])
    fives = Stream.cycle([nil, nil, nil, nil, "Buzz"])
    Stream.zip(threes, fives) |> Stream.zip(1..n) |> Stream.map(
        fn
            {{nil, nil}, x} -> x
            {{a, b}, x} -> to_string(a) <> to_string(b)
        end
        )
        |> Enum.take(n)
        |> Enum.each(&IO.puts/1)
  end
end
```

# Scalaで

関数型はScalaくらいしか馴染みがないので

```scala
object FizzBuzz{
  def main(args: Array[String])={
    fizz_buzz(20)
  }
  def fizz_buzz(n: Int) = {
    val threes = Stream.continually(List(None, None, Some("Fizz")).toStream).flatten
    val fives = Stream.continually(List(None, None, None, None, Some("Buzz")).toStream).flatten
    val hoge = threes.zip(fives).zip(from(1)).take(n).map{a =>
      a._1 match{
        case (None, None) => a._2
        case (x, s)=> x.getOrElse("") + s.getOrElse("")
      }
    } foreach (println _)
  }

  def from(begin: Int): Stream[Int] = {
    Stream.cons(begin, from(begin + 1))
  }

}
```

[gist](https://gist.github.com/1984weed/97a0428d61c29aace7017bc2ce91e3a9)はこちら
node.jsの依存ライブラリを整理してみた

Node.jsにどんなライブラリがあるか試行錯誤を繰り返した結果、
node_modulesがぐっちゃぐちゃになったので整理したメモ。

ライブラリを色々入れ過ぎて結局、本当に必要なライブラリはなんだったっけ？
となった場合に確認する方法。
あるいはfsライブラリに限界を感じて途方に暮れた後、fs-extraに光明を見出して
fsが要らなくなったのにpackage.jsonの`dependencies`から消しても
node_modulesからは消えないので整理する方法。

# 環境
Mac OS X El Capitan 10.11.4
Node v6.2.2
npm 3.10.6

# 依存ライブラリの確認
`npm ls --depth=0`
してみる。

`--depth=0` オプションを付けないと`依存ライブラリが依存しているライブラリ`まで見えて
これはこれで面白いのだがまた別の話。

表示された依存ライブラリ中で `extraneous` が付いているライブラリが要確認。
node_modulesに存在するのにpackage.jsonの`dependencies`に無いライブラリに`extraneous`が付く。

# 対応
`extraneous`が付くケースは２つ。

1. 不要なライブラリ
`npm uninstall ライブラリ名`
でアンインストールする。

1. 必要なライブラリだがpackage.jsonに追加されていない
`npm install ライブラリ名 --save`
でpackage.jsonに追加する。

対応後に`npm ls --depth=0`をしてみて`extraneous`が無ければキレイになって気持ち良い。
もくもく会のススメ

<!--
イベントのURL
https://coedo-dev.doorkeeper.jp/events/48264

このスライドのURL
http://qiita.com/kobake@github/items/68528dfa24ec159ce617
-->

## 自己紹介: kobake
<img width="140" src="https://qiita-image-store.s3.amazonaws.com/0/25555/da04f4f3-b2a2-2743-7ab8-0c447751b3ea.png">
プログラマです。(半年くらい仕事してない)
https://twitter.com/kobake_
https://github.com/kobake
http://blog.clock-up.jp/


----
## もくもく会のススメ

----
## もくもく会のススメ、および各種イベントへの向き合い方について

----
## 技術者の繋がりについて
- 注目される技術がころころ変わるので同じ技術を持つ人間と繋がる（リアルで見つける）ことが難しくなった  
↓
- 各技術テーマ毎に開かれている勉強会（？）に参加するのが有意義  

----
## イベントの種類
- セミナー … 講義を聞く
- ハンズオン … 講義や指導に従って作業
- 勉強会 … 割と曖昧
- ハッカソン … テーマ内時間内にモノを作り切る
- もくもく会 … 各自勝手に作業する

----
## イベントの傾向（主観）
![イベントの種類 (4).png](https://qiita-image-store.s3.amazonaws.com/0/25555/10fe4fa0-6ae9-6a00-a87c-3666080cd515.png)

----
## 勉強会あるある
- とりあえず情報は得るが家に帰ってから触ることもなく記憶から消える
- 飲んで食って雑談するのは良いがそればかりに毎週数時間浪費する
- 人との繋がりばかりが増えて自分の力は変化していない

----
## 自分の手を動かしましょう
- コード書いたりしましょう  
↓
- しかし意志が続かない  
↓
- 作業したくなる環境に身を置くと良い

----
## 作業したくなる環境
- カフェ
- もくもく会

----
## 作業したくなる環境
- カフェ
- →→ もくもく会 ←←

----
## もくもく会とは
- とりあえず何かしらのテーマに興味のある人が集まって各自作業をもくもくやる。というだけ。
- 各自無言で作業する時間が割とある。

----
## 集まる意味ある？
- 人が近くにいるだけで何故か人は作業する
- 質問等できる人が近くにいると安心（※答えが得られる保証はない）
- 話題があれば話を振ると良い（同テーマで集まっているので話がしやすい）
- 成果発表等があると目標感が出る

----
## もくもく会の発祥（？）
http://mokumokukai.tumblr.com/
> もくもく会とはカフェとか誰かの家とかに集まって、それぞれ各自もくもくと勉強したり作業したり本を読んだりするだけの会のことです。…(略)…ハッカソンよりもっとゆるい感じで、もくもく作業するだけで別に成果物を発表したりしなくてもいい、という適当な雰囲気の集まり…(略)…

----
## もくもく会の変遷
- コミュニティドリブン
  - とりあえず集まることが大事
  - だいたい同じ人間が集まる  
 ↓
- テーマドリブン
  - 特定のテーマに興味がある人で集まる
  - 興味の変化により人が入れ替わる

----
## もくもく会主催のススメ
- 他イベントに比べて段取りの手間が圧倒的に少ない（というかほぼ無い）
- 自分の参加したいイベントが無いなら自分で主催するのが近道です
- もくもく会やりましょう

---
## もくもく会主催のコツ
- 共有のディスプレイ or プロジェクタ
  - AppleTV or GoogleCast があると接続も楽
- 自己紹介は毎回やる
- 成果発表も毎回やる（できるだけ）
- チャットツールあると良い
  - Slack とか

---
## 日程の選択
- 土日祝日丸一日使うとコアな人間が集まるのでおすすめ

----
## 人数について
- 人が増えすぎると声の小さい人が話しにくくなる気がする
  - 多くても10人程度がちょうど良い
  - チャットツールも活用

----
## 運営コミュニティ
主にC#もくもく会
https://csharp-moku2.doorkeeper.jp

- Xamarinもくもく会 … 次回は8月11日(木)
- ASP.NETもくもく会 … 次回は8月20日(土)
- Windowsもくもく会 … 次回は8月28日(日)

----
## その他イベント
- 勉強会主催ノウハウ共有会  
2016-08-05（金）19:00 - 21:00  
https://coedo-dev.doorkeeper.jp/events/49634
Windows 7 > Cドライブの容量が減る一因 > WinSxSフォルダ

```txt:動作環境
Windows 7pro 64bit
```

同じような環境でのWindows7のPCが二台あり、その片方のCドライブの空き容量がもう片方よりも少なくなっていた。
Cドライブの中を見ていったところ、C:\WinSxSなるフォルダで顕著に使用容量の差が出ていた。

WinSxSの関連情報として以下のリンクを見つけた。
http://azuma006.hatenablog.com/entry/2015/08/29/211528

> また、ディスク クリーンアップ完了後は再起動することでWindows Updateの再適用？　が行われます。これに意外と時間が掛かります。

[Hebikuzure's Tech Memo](https://hebikuzure.wordpress.com/2015/03/28/winsxs-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97/)

> Windows Vista / Windows Server 2008 以降の Windows では、Windows のコンポーネントや更新プログラムのインストールの際に WinSxS フォルダーが「ステージング」領域として利用され、必要なファイルがいったん WinSxS フォルダーにコピーされた後で実際のファイルの置き換えや配置がハードリンクの作成によって行われる動作になっています。
【スニペット】【scss】画像を円形にくり抜く


```html
<img class="imageArea__img" src="http://placehold.it/130x130">
<!--実際の大きさはscssで決めるのでplacehold.itのサイズは適当-->
```


``` scss
@mixin MakeCircle($value) {
  border-radius: $value;
  width: $value;
  height: $value;
}

.imageArea__img {
	@include MakeCircle(80px);
}
```
Eclipse+PHP(PDT)+Pleaides on Mac

バージョンアップの度に調べるのがめんどくさいので自分用にまとめる。

既存のワークスペースをバックアップしておく。

[Eclipse Downlods](https://eclipse.org/downloads/)
からインストーラーをダウンロード。

「Eclipse for PHP Developers」を選択して
インストールフォルダはバージョンが識別できるように
（例）/Applications/eclipse-neon
とする。

ワークスペースは
/Applications/MAMP/htdocs
など。

[MergeDoc](http://mergedoc.osdn.jp)
からPHPの64bitのStandard Editionをダウンロード。

pleaides/eclipse/の
dropins,features,pluginsを
/Applications/eclipse-neon/Eclipse.app/Contents/Eclipse
へコピー。

さらにpleiades安定版「pleiades_x.x.x.zip」をダウンロード。

pleiades_1.7.0/の
features,pluginsを
/Applications/eclipse-neon/Eclipse.app/Contents/Eclipse
へコピー。

```/Applications/eclipse-neon/Eclipse.app/Contents/Eclipse/eclipse.ini@末尾に追記
-javaagent:/Applications/eclipse-neon/Eclipse.app/Contents/Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

ターミナルから起動
```/Applications/eclipse-neon/Eclipse.app/Contents/MacOS/eclipse -clean```

あとは必要なプラグインを入れる
Bash | 複数の echo をつなげて変数に入れる

こんな感じ。

```bash
a=$(echo '1')$(echo '2')$(echo '3')

echo $a # => 123
```

この例では意味がないが、途中に echo じゃないコマンド結果を挟む場合に便利かも。


# 環境

- bash 3.2








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
OmniAuthで開発環境でもmockで認証する方法

テストするときと基本同じなんだけど、メモ。
メールアドレスが固定になるので、これを見て、実際に利用する場合はご注意を。

```rb:initializers/omniauth.rb
if Rails.env.development?
  OmniAuth.config.test_mode = true
  OmniAuth.config.mock_auth[:google_oauth2] = OmniAuth::AuthHash.new(
    provider: 'google_oauth2',
    uid: SecureRandom.uuid,
    info: {
      email: "admin@example.com"
    }
  )
end
```
Windows10にDockerでLAMP環境を構築する　その3

[前回](http://qiita.com/kamonamban/items/6438702478391f7161a7)できなかったMySQLとの疎通を行っていきます。

```
$ docker --version
Docker version 1.11.2, build b9f10c9
$ docker-compose --version
docker-compose version 1.7.1, build 0a9ab35
```

### ライブラリのインストール

まずサーバーにPDOなりmysqliなりが入っているか確認してみます。

```
$ touch ./html/phpinfo.php
```

``` html/phpinfo.php
<?php phpinfo();
```

pdoはsqliteしか入っていませんし、当然ですがmysqliは見当たりません。公式のイメージには入っていないということです。
ではコンテナ内でインストールを……、といっても、また再起動したら消えてしまいます。
インストールディレクトリをホストと共有する？　いやいくらなんでもそれはおかしい。

ここでDockerfileを使います。む、順番が逆な気がするけどきっと気のせいです。
Dockerfileには、イメージをコンテナ化する際に走らせる命令を記述します。立ち上げるたびにインストールされるので、再起動後もわざわざコンテナに入って作業する必要がなくなります。

コンテナをDockerfileから起動するには、docker-compose.ymlの記述を変更します。

``` docker-compose.yml
version: "2"

services:

  web:
    build: ./web
    ports:
      - "80:80"
    volumes:
      - ./html/:/var/www/html

  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes_from:
      - data

  data:
    image: busybox:1
    volumes:
      - /var/lib/mysql:/var/lib/mysql
```

webの起動元を./webディレクトリ内のDockerfileに指定しました。
続けてDockerfileを書きます。

```
$ mkdir web
$ touch web/Dockerfile
```

``` web/Dockerfile
FROM php:5.6-apache

RUN docker-php-ext-install pdo_mysql

EXPOSE 80
```

(´-`).oO(ファイル名が表示されない……)

RUNの後に走らせるコマンドを書きます。例えばapt-getやcurl等々。
docker-php-ext-installは、公式のイメージで用意されているコマンドです。PHPのライブラリのインストールに使います。
ここではPDOを使っていますが、mysqliでも問題ありません。たぶん。
早速起動。

```
$ docker-compose down
$ docker-compose up -d
```

起動時の画面が少し変わったはず。
phpinfoを見てみると、PDO Driversにmysqlが加わっている、はず！

### 疎通テスト

テスト用のファイルを用意します。

```
$ touch html/connection.php
```

``` html/connection.php
<?php

$dns      = 'mysql:host=db;port=3306;dbname=sandbox';
$user     = 'root';
$password = 'root';

try {

    $pdo = new PDO($dns, $user, $password);
    echo 'Connection success';

} catch (PDOException $e) {

    echo 'Connection failed: ' . $e->getMessage();

}
```

Σo(*ﾟдﾟ)ﾉ 待った！　そのホスト名なんだ！？

docker-compose.ymlに記述されたサービス名は、それぞれのコンテナ内のネットワークにその名前で追加されます。
追加ってなんだ？　でも[そう書いてある](http://docs.docker.jp/compose/networking.html)んだからそうなのでしょう。

とにもかくにも、connection.phpにつないでみると……。

> Connection success

٩( 'ω' )و

### くぅ疲

とはいえまだ最低限の環境ができたにすぎません。
mysqlの文字コードがlatinのままだったりするし、フレームワークを入れてDocumentRootを変更する必要が出てきたりします。
そういった初期設定はDockerfileに書いていくことになります。あとはまぁ、適当にググってやれば何とかなります（適当）。

成果: [https://github.com/kamonamban/study_lamp](https://github.com/kamonamban/study_lamp)

この記事を書くにあたっては、[Laradock](https://github.com/LaraDock/laradock)の構成を大いに参考にしました。
[PHP]初心者がハマった、関数を使って結果を変数に代入する２パターン


##まずダメなパターン

```php
 
$message = array();

function hoge($str, $key){
    if(empty($str)){
        $message[$key] = '空です';
    }
}

hoge($message, 'hogehoge');
echo $message['hogehoge'];
```

結果：Notice: Undefined index: hogehoge
$message['hogehoge']なんて宣言してないじゃん！と怒られる


##パターン１:global変数をちゃんと使って、関数の外の変数と関数内の変数を共有する
```php

$message = array();

function hoge($str, $key){
    if(empty($str)){
        global $message;
        $message[$key] = '空です';
    }
}

hoge($message, 'hogehoge');
echo $message['hogehoge'];

```

結果： 空です
これで成功！

##パターン2:関数の外で連想配列を作っておいて、関数がreturnした値を代入する
```php
$message = array();

function hoge($str){
    if(empty($str)){
        return '空です';
    }
}

$message['hogehoge'] = hoge($message);
echo $message['hogehoge'];
```
結果： 空です
こうやるのもあり。


以上、グローバル変数を知っていても使いこなせていなかった私のハマったところでした。
Docker初心者による、初心者のためのDocker入門 #2


# DockerfileでApache+PHPの環境を構築する

というわけで、Dockerを使って、プラグマティックでフレキシブルでみんな大好きな言語PHPを動かせるコンテナを作ってみます。せっかくなのでPHPは7にしまそう。

## 参考
> DockerでPHP7
http://qiita.com/zum/items/135679f7070b4afa468f


Docker HubにPHPの公式リポジトリがあるのでこっから引っ張ってきます。
https://hub.docker.com/_/php/

<img width="300" alt="Screen Shot 2016-07-21 at 15.44.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/a596ede6-0040-a037-e203-11ed6cc2b653.png">

5.5系から7系までいろんなバージョンが利用できますね。
せっかくなので現時点で最新の7.0.8を使ってみます。


今後のことを考えて必要最低限のDockerfileを書いてみます。

```sh:Dockerfile
# 使用する元イメージ
FROM php:7.0.8-apache

# 実行するコマンド
RUN apt-get update
```

イメージのビルド

```sh
# php7は作成されるイメージ名
docker build -t my-php7　.
```

カレントディレクトリにindex.phpを用意

```index.php
<?php
phpinfo();
```


実行

```sh
# カレントディレクトリを/var/www/htmlにマウントしてバックグラウンドでコンテナを実行
docker run -p 80:80 -d --name my-apache-php-app -v $PWD:/var/www/html my-php7
```

ブラウザからアクセス
http://localhost/

<img width="300" alt="Screen Shot 2016-07-21 at 16.40.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/0d895395-9994-2c97-bac2-ae9b964264ca.png">



**もうできちゃった！**
カレントディレクトリをマウントしているので、githubからコードをpullしてきてガリガリ修正しながら動作確認できます。
いいのかこんなに簡単にできて。

Dockerfileを使ってのカスタムイメージビルドに多少時間はかかりますが、次回以降のビルドにはキャッシュが効くのでビルドからコンテナの起動まで含めても一瞬です。すげーー。


次回は私の都合により、作成したPHPのコンテナからAWS上のRDS,S3に接続してみる予定
ニッチですみません...


> 1回目はこちら
Docker初心者による、初心者のためのDocker入門 #1
http://qiita.com/furu8ma/items/e8249ddd48fab42eb7a3
PHPの配列の作成は初期化と代入のどちらが速いのか

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

変数に配列を代入する時点で初期化`$a = [1]`したほうが速い

# <i class="fa fa-cogs" aria-hidden="true"></i> 環境

[Docker PHP:7.0.8]

# <i class="fa fa-cubes" aria-hidden="true"></i> 経緯

うちのコーディングは社内的な癖があったりなかったりします。[^1]
そのうちの一つとして、
「配列は空で宣言し、その後に追加する」
というものがります。
こんなコード。

```php
$a = [];
$a['hoge'] = 'HOGE';
$a['huga'] = 'HUGA';
```

個人的には、読みづらいし文字数増えるしミスが入りやすいしでいいことはないと思うのです。
しかし、結果・出力には違いがない。
別に初期化で作れという規約があるわけでもない。[^2]
そのためか、初期化しましょうと言ってもなかなか受けが良くない気がする。
速度にしても初期化の方が速いとは予想していても、調べてないので説得力がでない。
できれば初期化で配列を作ることを浸透させたいので、速度的にメリットがあるという証拠を突き付けて駆逐していきたい。



# <i class="fa fa-calculator" aria-hidden="true"></i>　計測

計測コードは
[今すぐできるPHP高速化　5つのポイント]
からお借りしました。

結果は約2倍ほど初期化が速い。
ただし、10万回繰り返して差は0.005秒しか変わらない。
でも結果が同じなら少しでも速いほうがいいはず。

## 代入

```php
<?php

//計測回数
define('COUNT',10);
//試行回数
define('TEST_COUNT',100000);
//小数点桁数
define('DECIMAL_DIGITS',10);
//平均値
$average = 0.0;

for($i = 0; $i < COUNT; $i++) {
        $start = microtime(true);
        for($j = 0; $j < TEST_COUNT; $j++) {
                //計測対象
                $a = [];
                $a[] = 1;
                $a['a'] = 'A';
                $a['b'] = 'B';
        }
        $end = microtime(true);
        $result = $end - $start;
        echo number_format($result,DECIMAL_DIGITS)."秒\n";
        $average += $result;
}
//平均値の出力
$average = number_format($average/COUNT,DECIMAL_DIGITS);
echo 'avarage:'. $average.'秒<br>';
```


```
0.0094299316秒
0.0101590157秒
0.0111100674秒
0.0102610588秒
0.0099561214秒
0.0111129284秒
0.0110650063秒
0.0102789402秒
0.0110731125秒
0.0111088753秒
```

## 初期化

```php
<?php

//計測回数
define('COUNT',10);
//試行回数
define('TEST_COUNT',100000);
//小数点桁数
define('DECIMAL_DIGITS',10);
//平均値
$average = 0.0;

for($i = 0; $i < COUNT; $i++) {
        $start = microtime(true);
        for($j = 0; $j < TEST_COUNT; $j++) {
                //計測対象
                $a = [
                        0   => 1,
                        'a' => 'A',
                        'b' => 'B'
                     ];
        }
        $end = microtime(true);
        $result = $end - $start;
        echo number_format($result,DECIMAL_DIGITS)."秒\n";
        $average += $result;
}
//平均値の出力
$average = number_format($average/COUNT,DECIMAL_DIGITS);
echo 'avarage:'. $average.'秒<br>';
```

```
0.0053119659秒
0.0049719810秒
0.0057301521秒
0.0058169365秒
0.0058898926秒
0.0071680546秒
0.0057520866秒
0.0060698986秒
0.0059280396秒
0.0063500404秒
```

# オマケの文字カウント

```
$a = [];
$a[] = 1;
$a['a'] = 'A';
$a['b'] = 'B'
```

スペースあり:44文字
スペースなし:36文字

```
$a = [
    0   => 1,
    'a' => 'A',
    'b' => 'B'
];
```

スペースあり:50文字
スペースなし:28文字

変数名が長く、要素が増えると初期化がもっと有利になるはず。

# 関連

[forの公式通りの最適化 at 低回数 - Qiita]


[今すぐできるPHP高速化　5つのポイント]:http://wp.tech-style.info/archives/123

[Docker PHP:7.0.8]:https://hub.docker.com/_/php/

[forの公式通りの最適化 at 低回数 - Qiita]:http://qiita.com/khsk/items/02ace94123baf516c676


[^1]: 誰も理由を知らず、既存コードの真似をしたりする伝承レベル。
    初使用前にunset()とか、引数は一度変数に入れるとか。

[^2]: このレベルを規約にしたら膨大な量になりそうですね。
[Swift]アプリ開発する際に便利なライブラリ達


#まえがき

みなさんこんにちは。最近後輩が入ってきてSwiftの勉強会を開くことになったので、Swiftを再び一から勉強している筆者です。今回は自分がアプリ開発をしてきて便利だったライブラリについて書いていきたいと思います。

#投稿時の開発環境
* Xcode 7.3.1
* Swift 2.2

#使用ライブラリ

Alamofire
-
![alamofire.png](https://qiita-image-store.s3.amazonaws.com/0/88026/076133bb-eb68-16ed-ec2c-fa8350ffa7da.png "alamofire.png")

https://github.com/Alamofire/Alamofire

AlamofireはSwiftで書かれたHTTPネットワークライブラリです。
GETリクエストやPOSTリクエストが簡単かつSwiftらしい書き方ができるので非常にオススメです。


SwiftyJSON
-

https://github.com/SwiftyJSON/SwiftyJSON

SwiftyJSONはJSONデータを簡単に扱うことのできるライブラリです。こちらもJSONをSwiftらしい書き方で扱うことができてとても便利です。筆者はAlamofireとセットで使うことが多いです。


RealmSwift
-
![realm.jpg](https://qiita-image-store.s3.amazonaws.com/0/88026/77cdeb3d-dcef-4598-c5ab-b77255fe88d7.jpeg "realm.jpg")

https://github.com/realm/realm-cocoa

RealmSwiftは簡単に言うと現代的なモバイル向けのデータベースです。モバイル側でデータを保持したい場合などにオススメです。


SwiftyUserDefaults
-

https://github.com/radex/SwiftyUserDefaults

SwiftyUserDefaultsはSwiftでのNSUserDefaultsの扱いを楽にしてくれるライブラリです。簡単なデータだけであれば、RealmSwiftを使うよりもこっちを使ったほうがいいと思います。


Eureka
-
![eureka.jpg](https://qiita-image-store.s3.amazonaws.com/0/88026/8ae19203-c0ee-f419-f478-ac634e44c3d0.jpeg "eureka.jpg")

https://github.com/xmartlabs/Eureka

EurekaはTableViewを使った入力formや設定画面などを簡単に作成できるライブラリです。


FlatUIKit
-
![flatuikit.gif](https://qiita-image-store.s3.amazonaws.com/0/88026/6a1ac9d0-bf3c-9351-af3c-067d648fcdf0.gif "flatuikit.gif")

https://github.com/Grouper/FlatUIKit


FlatUIKiはフラットデザインのUIを簡単に使用することのできるライブラリです。Webで用いられるフラットデザインとかなり近いです。

Chameleon
-
![chameleon.png](https://qiita-image-store.s3.amazonaws.com/0/88026/a758f0a5-3583-d025-a316-90c115787afc.png "chameleon.png")

https://github.com/ViccAlexander/Chameleon

UIColorの拡張やフラットカラーやグラデーションを簡単に実装することができるライブラリです。デザイン面ではとても役に立つと思います。

#ライブラリ管理
Cocoapods
-
![スクリーンショット 2016-07-21 16.12.23.png](https://qiita-image-store.s3.amazonaws.com/0/88026/d348bb0e-7d08-9a08-d810-43acc597ce14.png "スクリーンショット 2016-07-21 16.12.23.png")

http://cocoapods.org/

書き忘れていましたが、筆者はcocoapodsを使ってこれらのライブラリを管理しています。正直ないと生きていけないです。

#その他
今回は数あるライブラリの中から筆者がよく使うものを紹介しました。この記事を読んでいる方でUI/UXのためのライブラリがもっと知りたい！という方にはこのサイトがオススメです。

CocoaControls
-
![スクリーンショット 2016-07-21 16.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/88026/a980b507-ad6b-6dfc-1f6c-ae324a0391a8.png "スクリーンショット 2016-07-21 16.22.13.png")

https://www.cocoacontrols.com/

CocoaControlsはUIライブラリを条件に合わせて検索することができるサイトです。簡単なサンプルとしても使えるのでオススメです。

#最後に
今回はライブラリの紹介のみでライブラリ自体の実装の仕方については述べませんでした。
次回以降の記事で詳しい実装の仕方についても話すことができればと思ってます。
【SORACOM Conference 2016】SORACOM 基本/ネットワークサービス紹介 SORACOM Air、Canal、Direct

# conferenceの基本情報

* 【日　時】2016年07月13日 10:30~20:00
* 【会　場】ベルサール新宿グランド イベントホール
* 【参加費】無料
* 【主　催】SORACOM会社
* 【申し込み】https://discovery2016.soracom.jp/


# 概要
* SORACOM Air
* SORACOM Canal
* SORACOM Direct/Dor


# 内容
## SORACOM Air
* 基本的なサービス
* SIMカード(docomo)　ー＞ 専用線　ー＞　soracom(API) -> クラウド
    * お客様は、web/APIで、simカードをコントロールできる
* Webコンソール/API
    * SIM情報取得と設定
    * セッション状態、速度、通信量、　停止解約。。。
    * システムの自動化SIMの一括管理
* 料金
    * 初期費：560円 基本：10円
    * 通信速度によって、利用料が違い(上り、下り)
    * 深夜帯が安くなる
* タグ
    * キーと値のペア
    * 任意データを入れる
* グループ単位で管理
    * テスト用、本番用
* イベントハンドラー：　条件を満足の時に、アクション；メールで通信
* ルールとアクション：SIMデータ量超える、速度が変わる、速度変更、lambda, URL
    * 例：通信量：１０MB超えたら、速度を落とす；SIMが解約されたら、slackに通知；lambdaで課金
* カスタムDNS
    * DNSフィルタリング、アクセス先、
* query log
    * 確認、履歴、不正利用
    * キャプティブポータル：　未承認（承認に行く、グループ変更）、承認済み
* メタデータサービス
    * SIM自身情報、認証なしで取得、更新可能
    * SIMのオペレーター間移動
* 特徴
    * いつでも必要なだけIoT通信が使える
    * LTE/3Gから高い接続性、セキュア
    * フェアでリーズナブルなそうりょう課金
    * すぐ調達
    * ビジネス
    * プログラム


## SORACOM Canal
* AWSには、自分のVPCを作る仕組みがある（日通、キヤノン）
* VPG(private Gateway)
* デバイスから、VPC内のサーバのプライベットIPアドレスに接続可能(VPGでNATされる）
    * インターネットアクセス許可
* airの各オプションやBeamも一緒に使える
* SIMごとに通信できることを設定、グループ
* 利用例
    * VPC監視分析システム
* 料金
    * VPG設定：980, 50/h, peering…
* メリット
    * セキュア、簡単に接続、AWSへ容易、Gateと一緒に使って、デバイスへアクセスできる


## SORACOM Direct/Dor
* AWS以外のクラウドや物理DCでも利用、専用線で
* Door -> VPN
* Air利用オプション： 5円・SIM/日
JSONObjectを使おうと思ったらエラーが出た

AssetStoreにあるJSONObject packageを使っていたんですが、Editor上ではうまくいくもののiOS版をビルドしたときに以下の様なエラーが...

```
Assets/JSON/JSONObject.cs(264,41): error CS0576: Namespace `global::' contains a definition with same name as alias `Debug'
```

このエラーの原因は、自前でglobal::にDebug classを作っていたからです。

なんで自前でDebugクラスを作っていたかというとDebugクラスを書いておくことにより、Editor上でだけDebug.Logなどが効いて、実機動作の時は何もしないというようにしたかったからです。

詳しくは、以下の記事が参考になります。

[Debug.Logを開発環境以外で無効化](http://qiita.com/rodostw/items/39183e62ed2a1f52f690)


結局、あまりスマートな解決策は思い浮かばなくて、

JSONObject内の

```csharp

using Debug = UnityEngine.Debug;

```

となっているところを

```csharp

#if DEBUG_LOG_OVERWRAP
using DebugJO = global::Debug;
#else
using DebugJO = UnityEngine.Debug;
#endif

```

っと書き換え、

```csharp

Debug.WriteLine

```

などというところを

```csharp

DebugJO.WriteLine

```

という風に書き換えることで回避しました。

本当はJSONObjectのコードは書き換えずに対処したかったんですが、良い方法が思いつきませんでした。
【SORACOM Conference 2016】基調講演	 Discovery 〜 IoT の最先端を探しに 〜

# conferenceの基本情報

* 【日　時】2016年07月13日 10:30~20:00
* 【会　場】ベルサール新宿グランド イベントホール
* 【参加費】無料
* 【主　催】SORACOM会社
* 【申し込み】https://discovery2016.soracom.jp/

# 概要
* IoTとは
* 事業概要
* 事例
* サービス
* 新発表


# 内容
## IoTとは
* IoTとは、Internet of Thingsの略称だ
* センサーやデバイスといった「モノ」がインターネットを通じてクラウドやサービスに接続され、情報交換する仕組みだ
    * モノ　<-> インターネット <-> クラウド

### 課題の一つ - インターネットへの接続
* 三つの方式
    * 有線LAN: 場所の制約
    * 無線LAN: 事前設定が難あり、安全ではない
    * 3G/LTE: 便利が、人向けの契約形態（初期費用、長期固定契約）

## 事業概要
* 発表
    * 2015.09.30
    * SORACOMプラットフォーム
    * https://soracom.jp/press/2015093001/
* SORACOMプラットフォームの基本
    * SIMカード提供
    * SORACOM Air - モバイル通信サービス
    * コントロール(Web, API)
    * 通信キャリア ー NTTドコモ(AWSと接続)
* 特徴
    * 1日10円~の従量従量課金制
    * 必要に応じてスケール
    * Webコントロール(回線管理、速度変更、利用量把握、監視..)
    * API提供
    * 自在に値付けをして、ビジネスができる

## 事例
* safecast様(NPO)
    * 放射線情報のオープンマップに
* パルコ様
    * 客層分析
* 内田洋行様
    * 百葉箱: 温度
* インフォミクス様
    * 太陽光発電の遠隔監視システム
* フルタイムシステム様
    * 宅配ボックスの遠隔監視、操作
* 十勝バス様
    * 路線バスの運行案内
* ニコン　トリンブル様
    * 支援クラウド
* 東海クラリオン様
    * ドライブレコーダー
* 楽天edy様
    * スマートフォン決済端末
* コニカミノルタ様
    * 医療機関翻訳
* セゾン情報システム様
    * ISDN回線置換え
* eConnect Japan様
    * 日本に旅行者SIM、APIで運営を自動化

## サービス
* SORACOM Air
    * データ通信
* SORACOM Beam
    * テータ転送支援
* SORACOM Canal
    * プライベート接続
* SORACOM Direct
    * 専用線接続
* SORACOM Endorse
    * 認証サービス
* SORACOM Funnel
    * クラウド連携


##　新発表
* SORACOM Door
    * 仮想専用線接続サービス
* SORACOM Gate
    * デバイスLAN接続サービス
* グローバル対応
    * 日本国内から、グローバルで利用可能に
git-cinnabar の導入 - mercurial リポジトリを git で開発する

mercurial リポジトリの [Unity UI](https://bitbucket.org/Unity-Technologies/ui) を git リポジトリで管理・開発したい。
mercurial の作法を意識することなく git リポジトリで開発したり、アップストリームの差分を取り込めるようにしたり、いずれは PR を送るので自社開発した分も mercurial リポジトリに反映したい。

[git-cinnabar](https://github.com/glandium/git-cinnabar) を利用すればそれっぽい事をできそうだったので導入した。
本稿ではその時の手順をまとめてある。

# git-cinnabar

https://github.com/glandium/git-cinnabar
git コマンドが mercurial リポジトリと仲良くなれるようにするモジュール。
git ログもキッチリ反映してくれる優れモノ。


# 環境

OS X : 10.11.5
python : 2.7.10 (built in)
git : 2.7.4 (command line tools for Xcode)
brew : 0.9.9

# 事前準備

- アップストリームの mercurial リポジトリのフォーク
- フォークしたリポジトリと同期するための git リポジトリ作成



## 依存モジュールのインストール

### python module Merculial

https://pypi.python.org/pypi/Mercurial
git-cinnabar が内部で利用しているので入れておいてあげる。

```
$ curl -o https://pypi.python.org/packages/12/a6/c6c8fc072feb0255d18c32f9aa29595d418e542d91bcc50cb77042f7da46/mercurial-3.9-rc.tar.gz#md5=2bb529089511340a01c21c60e2d3bb29 mercurial-3.9-rc.tar.gz
$ tar -xzvf mercurial-3.9-rc.tar.gz # 普通に上記URLから落とすのも良し
$ pushd mercurial-3.9-rc
$ python setup.py install
$ popd
$ rm -rf mercurial-3.9-rc
```

# git-cinnabar のインストール

```
$ git clone https://github.com/glandium/git-cinnabar.git
$ cd git-cinnabar
$ git submodule update --init
$ brew link --force openssl # openssl のリンカエラー回避
$ NO_GETTEXT=1 make helper  # libintl.h が mac にないので gettext を無視する
$ echo "PATH=\${PATH}:$(pwd)" >> ~/.bash_profile # パスを通す
$ source ~/.bash_profile
```

以上で git を利用した通常の開発と同じように mercurial リポジトリを扱えます。

# 注意点

git で PR 用のリポジトリをリモートに作る感覚で下記のようなコマンドを打っても、clone 時のリポジトリに反映されてしまう。

```
git push mercurial sonzaisinai_repo
```

----

ひとまず導入して基本的な操作が出来ることを確認した段階です。
その他の注意点やノウハウは、都度更新します。
iPhoneからLubuntuのvino-serverに接続

トラブル時のためにいつもノートパソコンを持ち歩くのは重たすぎる

* ノートパソコンのバッテリー充電しているか気にしないといけない。
* かばんを投げたりふんだりしないように気を遣う必要がある

iPhone + BlueToothキーボードの組み合わせなら軽くてよい。
sshだけなら[prompt 2](https://itunes.apple.com/jp/app/prompt-2/id917437289?mt=8)。フォントサイズはiPhone6では11ptが見やすい。

## RDPではどうやってもキーボード入力ができなかった

* ホスト: windows10
    * ゲスト: virtualbox5.1上のubuntu16.04
    * ゲスト: virtualbox5.1のRDP機能を使った接続
    * ゲスト: VMWarePlayer12.1上のubuntu16.04

## Vinoでは成功した

* ホスト: windows10
    * ゲスト: virtualbox5.1上のubuntu16.04でvino-server
    * vinoは5900ポートを使う。

windows10 + virtualbox の組み合わせでは、rdesktopやvim-gtkの描画がたびたび固まり操作不能になるため、windows10 + VMWare Playerが良いと思う。

```bash:
sudo apt-get install -y vino
/usr/lib/vino/vino-preferences

# portを5900から変更
gsettings set org.gnome.Vino alternative-port 15900
gsettings set org.gnome.Vino use-alternative-port true

# TLS無効化。gvncviewerを使えば設定不要
gsettings set org.gnome.Vino require-encryption false
/usr/lib/vino/vino-server
```

* iPhoneから[VNC Client](https://itunes.apple.com/jp/app/vnc-viewer/id352019548?mt=8)を使って接続
* [Magic Keyboard - JIS - Apple（日本）](http://www.apple.com/jp/shop/product/MLA22J/A/magic-keyboard-jis)を使った。
    * 日本語入力切替は(デフォルトの) `Control-Space`が今のところおすすめ。

|物理キー|動作|
|:--|:--|
| Control | Control |
| Esc | Esc |
| Command | Alt |
| Option | 効かない |
| かな | space |
| 英数 | space |

## OS起動時にvino起動、解像度設定

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d9443aa8-a687-5e6e-c926-9a4d1c579f57.png)

`xrandr`と入力すると、ディスプレイ一覧が出てくる。

* Virtualboxの場合 : `VGA-1`、1366x768
* VMWare Playerの場合 : `Virtual1`、1360x768

VirtualBoxの`ゲストOSの画面を自動リサイズ`をチェック外しておく。
解像度は`1136 x 640`でもよかったかも

![vbox.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3802b5ad-40a1-7ad8-97e0-afd2050581a6.png)

## gsettingsがない場合の設定方法 (debian8)

* dconf-editorで設定する
    * [dconf-editor で vino の 「No supported authentication methods」を解決した。](http://takaq1.plala.jp/contents/bean/dconf-editor/index.html)

![dconf-edit.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5cb9e12e-7198-4b27-25f6-07beeeada441.png)

![vino.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4111412e-3866-531e-69b8-880ada52588f.png)

* [起動済みのXをTigerVNCで共有 | matoken's meme](http://matoken.org/blog/blog/2016/03/04/share-already-started-x-even-tigervnc/)
    * x0vnc4server あとで試す。
ZendFramework1を捨てられない

## ZendFrameworkのざっくりとした歴史
### ZF1

FrameworkでMVC！MVC！と言っていたあの頃。PHPエンジンを開発したZendのFrameworkということで今もPHP界隈では政治の中心的な立ち位置ですね。

composerが出る前の時代でしたので、これさえいれておけば他にいらないライブラリ集というオールインワンが圧倒的で便利でありました。
はじめは、Zend_DbのためにZF1を入れたのですが、いつの間にか他のコンポーネントを使い出していろいろ学ばせてもらってたのも良い思い出です。

### ZF2

リリースされた当初、コンポーネントが分割できるようになったことに喜んでいたものですが、Zend\Dbの使い方がものすごく変わっていたのを見て唖然としました。

Adapterで手軽に使っていたメソッドが奥のクラス階層に移動していたり・・・
fetchするときも返り値がデータそのものではない時があったり・・・
普通に使うだけでも手順が増えてしまっていたのです。
これですぐ移行するという選択肢はなくなり、なんとか折り合いをつけてからにしようとしていたらZF1はサポートが延長され、折り合いをつける理由がなくなって今に至ります。

## そしてZF3の絶望

PHP7や5.6が登場してライブラリも新しい世代へ変わることに動き出していた時期でしたので、ZendFrameworkの次期バージョンのZF3発表。
とりあえず作っているよ。というアナウンスがありZF2が生まれ変わるのか！と期待していたら、2系での延長上での開発でした。

ここでZend\Dbの使い勝手が変わることはなくなったのです。

## ZF1がEOLに

[Zend Framework 1 End-of-Life Announcement](https://framework.zend.com/blog/2016-06-28-zf1-eol.html)

ZF1の延長されてきたサポートが、ようやくといいますか、やっと9月にEOLを迎えるというアナウンスがされました。
SQL関係でセキュリティ上好ましくないことをしているなどありますので、ZF2や3にしろ他のライブラリにしろなにかしら移行する理由ができました。

## 折り合いをつけるには残念なところを変えてゆく

絶望を感じるところですが、メジャーな上、徳丸さんがとりあえずソース見てくれるところなので、切り捨てるというのはとりあえずなしで考えたら、どうやったら受け入れられるのか？使ってみようと思えるのか？考えました。

### ZF2でよかった点

* オブジェクト指向やイベントハンドラ、DI意識されててZF1よりは設計良くなってたよ
* そのおかげでそれぞれの受け持ち範囲がわかりやすくなったよ
* select結果がIterator(ResultSet)で返されるので、データが大量の時に扱いやすくなったよ

### ZF2でわるかった点

* 手順が全然変わったよ
* 公式マニュアルがひどいよ。ソース見ながら使った方が早いよ
* 今まですぐに届いていた関数が分散してたよ(例：beginTransaction)

### 基本的な使い方

* 主にSelect系SQL文を実行する場合→ Adapter
* Insert,Updateする場合→ AbstractTableで各DBテーブルのサブクラスを作る
* プログラマブルなSQLの組み立て→ Sql `Sql->prepareStatementForSqlObject($select)->execute()`
* TableのFeatureは、Eventで処理を追加できるよ

以上の方針にすると流れがわかりやすく、手順も最短ルートで呼び出してゆけるかと思います。が、メソッド名の長さなどイけてない部分はまだまだあります。
けどそれらをクリアするにはラッパークラスを作るしかないのか･･･
という残念なモチベーションでラッパークラスを作りました。

[github zfdb-compat](https://github.com/reioto/zfdb-compat)

compatとついていますが、完全にZF1のインターフェースではないので互換とはいえないのです。
といいますのも、作ってる途中で過去仕様に捕らわれるのではなくZF2の良いところは本当に良くなっているので、そこは取り入れていくべきだと思ったからです。
具体的にAdapterでは全結果のarrayを返す`fetchAll`よりもイテレータを返す`fetchResult`を使うべきです。
移行するまでのつなぎとか、よく使っていたメソッドがどうなったのかソースを見ていただけるとわかっていただけるかと。ご参考までにどうぞ
Moshiを使ってPOJOからJsonObjectとJsonArrayを作成する



# 前提

**POJO**

```java
public class User {
  @Json(name = "name")
  String name;
  @Json(name = "age")
  int age;
  
  public User(String name, int age) {
    this.name = name;
    this.age = age;
  }  
}
```

# POJOからJsonObjectを作成する

**code**

```java
import com.squareup.moshi.Moshi;
import com.squareup.moshi.Types;

String json = new Moshi.Builder().build().adapter(User.class).toJson(new User("hoge", 10));
```

**json**

```json
{"age":10,"name":"hoge"}
```

# POJOからJsonArrayを作成する

**code**

```java
import com.squareup.moshi.Moshi;
import com.squareup.moshi.Types;
import java.lang.reflect.Type;


List<User> users = new ArrayList<User>();
users.add(new User("hoge", 10));

Type listOfUsersType = Types.newParameterizedType(List.class, User.class);

String json = new Moshi.Builder().build().adapter(listOfUsersType).toJson(users);
```

**json**

```json
[{"age":10,"name":"hoge"}]
```

わんらいなー

```java
new Moshi.Builder().build().adapter(Types.newParameterizedType(List.class, User.class)).toJson(Observable.just(new User("hoge", 10)).toList().toBlocking().single());
```
NginxとApache HTTP Serverの違いメモ


## 簡単なまとめ
### Apache HTTP Server
マルチプロセスモデル : 接続ごとにプロセスをフォークするのでメモリがいっぱいになりやすい

- 利点 : メモリ空間が独立しているので、スクリプト言語が組み込みやすい
- 欠点 : 同時接続が増えるとメモリが欠乏しやすい

→ とは言え、モジュールを使えば、イベント駆動モデルにもできるよ。Nginxには及ばないけど。

### Nginx
イベント駆動モデル : 1プロセス内で、接続ごとにイベント処理を行う。1プロセス1CPUなので、CPUの数だけワーカープロセスが作成できる。

- 利点 : 接続数が増えても、プロセス数やスレッド数が増えない。消費メモリが増えない
- 欠点 : 1つのメモリ空間で動作するため、スクリプト言語を組み込めないことがある。

→ とは言え、プロキシサーバとして利用すれば、スクリプト言語を呼び出せるよ。

### ではApache HTTP Serverを利用するメリットは
WindowsサーバだとApacheのほうが速いので、同時アクセス数が少なければ選択肢に入る。
最初から機能が豊富なので、その機能を早く利用したい場合に消極的に選択するくらいかな。。
その場合でも同時アクセスが多い場合は、Nginxをリバースプロキシにして、Apacheに流す形になるだろう。すくなくとも、圧倒的に良い部分が分からなかった。

## もっと詳細
### Apache HTTP Server
モジュール次第で、マルチプロセスでもマルチスレッドでもイベント駆動にもできる。が、イベント駆動としては、nginxの方が優秀。

![nginx_apache.png](https://qiita-image-store.s3.amazonaws.com/0/14275/a00a10a5-bc50-0e42-03f2-d6b9eba1b4a4.png "nginx_apache.png")

参照 : http://openstandia.jp/pdf/140228_osc_seminar_ssof8.pdf

### Nginx
WebApplicationと連携するときには、プロキシサーバとして動作させる。
- PHP : PHP-FPMで動かし、FastCGI経由で動作させる
- Ruby : unicornで動かし、HTTPプロキシーとしてアクセスする

※ FastCGIはプロセスをメモリ上に永続化することで、起動/終了コストを削減する。

## 中の人はどう思ってるのか

### Nginx からみた Apache

> 　「わたしはApacheは素晴らしいウェブサーバだと思っている。NGINXはApacheとは異なる利用事例を想定している」と同氏は述べている。「Apacheがライバルだとは思っていない。われわれの顧客は、NGINXをロードバランサや、マイクロサービスの構築に使っているが、どちらもApacheに向いた用途ではない」
> 　実際、Robertson氏は多くの顧客がNGINXとApacheの両方を使っていることに気づいたという。「顧客はApacheの手前で、負荷分散やアプリケーションにNGINXを使用している。NGINXのアーキテクチャはかなり異なっており、並行的にウェブサービスを提供するのに向いている」と同氏は言う。また、クラウド構成ではNGINXが有利だと述べている。

参照 : https://japan.zdnet.com/article/35092031/