OmniAICreator/Qiita-1.07M huggingface dataset:
privateネットワークを利用したDNS浸透問題回避


この記事は[SoftLayer Advent Calendar 2015](http://qiita.com/advent-calendar/2015/softlayer)の13日目の記事です．

SoftLayerで仮想マシンを構築するとpublicとprivateの2つのネットワークアドレスが割り当てられます．
これを利用してサーバ引っ越し時のDNS浸透待ちを回避する方法を紹介します．

# DNS(Domain Name System)

DNS(Domain Name System)とはIPアドレスとドメイン名を対応付けて管理する方法のことです．
ドメイン名からIPアドレスを特定することを **名前解決** と呼び，この情報を管理するサーバのことを
**DNSサーバ**と呼びます．
> [お名前.com](http://www.onamae.com/)なんかが有名ですね．

ネットワーク上のコンピュータにアクセスするにはIPアドレスを指定する必要がありますが，
DNSのあるおかげで`192.168.1.1`のようなアドレスを覚えずに http://www.usa-mimi.jp 
などのように覚えやすい名前でアクセスすることができます．
また，サーバのIPアドレスが`192.168.1.2`に変更された場合でも，
DNSサーバの設定を変更するだけでユーザは新しいサーバへアクセスすることができるようになります．

![dns_sample.gif](https://qiita-image-store.s3.amazonaws.com/0/58048/93652c00-3b30-e169-df21-6da771793d94.gif "dns_sample.gif")

>DNSの仕組みについて詳しく知りたい方は → [DNSの仕組みの基本を理解しよう](http://www.atmarkit.co.jp/ait/articles/0112/18/news001.html)
>こんな感じのページが色々あるので検索してみてください．


# DNS浸透問題

当然のことですが，DNSサーバに全ての対応表を持つことは出来ません．
実際のDNSサーバは木構造になっており，各DNSサーバごとに取り扱っている対応表が違いますし，
一度問い合わされた結果は一定時間キャッシュされます．
キャッシュ時間はTTL(Time to live)というフィールドで管理されており，3600（1時間）や86400（1日）など，
割と長い時間が設定されています．
通常の動作時にはキャッシュがあるため高速に名前解決が行えるようになるわけですが，
設定変更時に即座に反映されないという問題が発生します．
データ登録を伴うwebサービスの場合，引越し後に古いサーバにデータ登録をされるとデータの欠乏や不整合が生じてしまいます．
そのため，IPアドレス変更前には予めTTLを小さめの値にしておき，変更を反映させやすくするなどの対策が取られています．

![dns_problem_sample.gif](https://qiita-image-store.s3.amazonaws.com/0/58048/610f00a4-e6c4-cd7d-be34-6f3c37b25252.gif "dns_problem_sample.gif")



# privateネットワークを介した新サーバへの誘導

えー，色々とめんどくさいことを並べましたが，要は旧サーバへのアクセスを全て新サーバに流してあげれば問題解決です．
通常，SSLを使用している場合は旧サーバと新サーバ間の暗号化をどうするかで少し考える必要がありますが，
SoftLayerの場合はprivateネットワークを持っているのでこの部分に気を使う必要がありません．
今回はnginxのproxyとして使用する際の設定と動作イメージを紹介します．

## 旧サーバの設定

旧サーバのconfigはこんな感じです．

```serverA.conf
server {
    listen 80;
    server_name dns-test.usa-mimi.jp;
    proxy_set_header Host $http_host;

    location / {
        proxy_pass http://10.132.2.101;
    }
}
```

`listen`と`server_name`の部分は通常の設定と変わりません．
http://dns-test.usa-mimi.jp のように，この名前で80番ポート（デフォルトのポート番号）でアクセスが有った場合にこの設定を使う，という意味です．
`proxy_set_header`はちょっと大事です．nginxはあくまでもproxyなので，代理先に元のアクセス情報（この場合は`dns-test.usa-mimi.jp`でアクセスが来た，という情報）を渡してあげる必要があります．

`location`は特定のpathに対するアクセスを別のサーバへ挿げ替えるという，まさにproxyとしての動作です．
この例では新サーバのprivateアドレスへ飛ばすようにしています．

## 新サーバの設定

新サーバ側の設定はこんな感じです．

```
server {
    listen 10.132.2.101;
    server_name dns-test.usa-mimi.jp;

	# 以下特別な設定はないので略
}
```

`listen`設定によって`10.132.2.101`という新サーバのprivateネットワークにアクセスが合った場合にこの設定が有効になるようにしています．
`server_name`は今回の場合はあってもなくてもいいです．
旧サーバ側で`proxy_set_header`を設定しているのでdns-test.usa-mimi.jpをhost名としてアクセスしてきます．

## 動作イメージ

この設定による動作を図にするとこんな感じです．

![dns_access_sample.gif](https://qiita-image-store.s3.amazonaws.com/0/58048/cf8f383c-01e5-b8b0-94e7-6b397b7732be.gif "dns_access_sample.gif")

このようにキャッシュなどの問題でDNSからの応答が旧サーバのアドレスであっても，
privateネットワークを通じて新サーバへアクセスすることができます．
なお，今回はすべて`http`で実験しましたが，実線部分が`https`でも同じように動作します．
その場合はpublic側(161.202.130.89, 92)の通信は`https`，
private側の通信(10.132.2.92, 101)は`http`（今回の設定そのまま）のように書くといいです．
点線部分の通信は`http`になりますが，privateネットワークなのでそんなに問題にはならないでしょう．
AngularJS勉強メモ その5(filter)

これはAngularJSを勉強した内容をまとめたものです。

# 今回したこと
* フィルターとは？
* ビューでフィルターを利用してみる
* コントローラーでフィルターを利用してみる

# 環境
* Ubuntu 14.04 (VirtualBox)
* AngularJS 1.4.7

# フィルターとは？
* 出力する値を整形(フィルタリング)するもの

## 構文
* ビューで使う場合
 * {{ 式 | フィルター [:パラメーター] }}
     * |(パイプ)の後にフィルターを指定する
<br/><br/>
* コントローラーで使う場合
 * $filter(フィルター)(式, パラメーター)
     * コントローラーのコンストラクタに引数で$filterを渡しておかないといけない！

# ビューでフィルターを利用してみる
１. 以下のようなhtmlを用意

```html
<!DOCTYPE html>
<html ng-app>
  <head>
    <title>filter</title>
    <script src="angular.min.js"></script>
  </head>
  <body>
    <ul ng-init="str = 'hoge HUGA Piyo'">
      <li>そのまま = {{ str }}</li>
      <li>小文字 = {{ str | lowercase }}</li>
      <li>大文字 = {{ str | uppercase }}</li>
    </ul>
    
    <ul ng-init="pi = 3.141592653589793">
      <li>そのまま = {{ pi }}</li>
      <li>小数点以下0桁まで = {{ pi | number: 0}}</li>
      <li>小数点以下2桁まで = {{ pi | number: 2}}</li>
    </ul>
    
    <ul ng-repeat="num in [{id: 2},{id: 5},{id: 3},{id: 4},{id: 1}] | orderBy: 'id'" >
      <li>{{ num.id }}</li>
    </ul>
  </body>
</html>
```

２. ブラウザでhtmlをみてみる
![フィルター.png](https://qiita-image-store.s3.amazonaws.com/0/97052/f100d8e3-1afb-82ef-883e-af40ca79d6a0.png)


式の結果が整形されて出力されている！

## 処理の内容を確認
### 文字の整形
* lowercase
 * 文字を小文字に変換する
* uppercase
 * 文字を大文字に変換する

### 数値の整形
* number
 * 数値を3桁ごとに，で区切って出力する
 * パラメータを渡すと、渡した数値の桁で小数点以下を丸める

### 配列の整形
* orderBy
 * パラメータで渡されたキーでソートする
  * '-キー名'(マイナスを付ける)とすると降順にできる

# コントローラーでフィルターを利用してみる
１. 以下のようなhtmlを用意

```html
<!DOCTYPE html>
<html ng-app="testMod">
  <head>
    <title>filter</title>
    <script src="angular.min.js"></script>
    <script>
      angular.module('testMod', [])
        .controller('testController', function($scope, Pi, $filter){
          $scope.pi = $filter('number')(Pi(), 3)
        })
        
        .value('Pi', function(){
          return 3.141592653589793;
        });
    </script>

  </head>
  <body ng-controller="testController">
    {{ pi }}
  </body>
</html>
```

２. ブラウザでhtmlをみてみる
![フィルター2.png](https://qiita-image-store.s3.amazonaws.com/0/97052/18131e0d-28d3-324d-ebed-9ca813890709.png)


コントローラーでもフィルターが使えた!
関数型プログラミングにおける再帰関数の考え方

この記事は[FP in Scala勉強会#2](http://fp-in-scala-nagoya.connpass.com/event/20258/)にて触発されました。
主催者のもがみんより再帰の記事説明してくださいと言われたので。
しかしコードはSMLで書きます。それが一番自分が説明楽なので。
読む方は自分の言語に適宜置き換えてください。（放棄）
また、[ML Advent Calendar 2015]()の13日目です。

loopにforやwhileを使う言語から来た人が関数型プログラミングでよく躓く1つが再帰関数だと思います。
実際に勉強会でも例題を再帰関数で書く人は少なかったと思います。
そこで本記事では簡単な例ですが再帰関数初心者の設計の助けになればと思います。

# 再帰関数とは

自分の定義の中で自分自身を呼び出す関数です。
例えば以下のコードは何もしない無限ループですが、再帰関数です。

```sml:loop.sml
fun loop () = loop ()
```

# 再帰関数の使い方・考え方

### 対象とするデータ構造は？

代数的データ型が対象となります。
例えば一般的なリストは以下の様な代数的データ構造をしています。
簡単に言うと、`nil`（空のリスト）、または、要素とリストを`::`で組み合わせたものになります。
ちなみにSMLではリストの糖衣構文として`[]`も用意されています。

```sml:list.sml
datatype 'a list = nil
                 | :: of 'a * 'a list
```
```sml:list_example.sml
val list1 = nil
val list2 = 1 :: nil
val list3 = "a" :: "list" :: "is" :: "like" :: "this" :: nil

val list1' = []
val list2' = [1]
val list3' = ["a", "list", "is", "like", "this"]
```

### 再帰関数の設計

代数的データ型に対して各要素に操作をしたいときに、構造にしたがってパターンマッチと再帰を使います。
リストの定義は、終端である`nil`と、自身の構造が再帰している`::`があります。
よってパターンマッチは`nil`と`::`で分けます。
さらに自身の構造が再帰している`::`では再帰関数を使うことになります。

例えばリストの全整数要素に対して`+1`するうな関数を書こうと思うときを考えます。
リストの構造でパターン分けをしています。
さらにパターンのうち`h::t`では、`t`がさらにリストなので`addOne t`を使って再帰するはずです。

```sml:add1.sml
fun addOne list =
  case list of
    nil  => (* 何らかの式 *)
    h::t => (* 再帰 addOne t を使った何らかの式 *)
```

### 再帰関数の実装

個人的な考えですが、一番大事なことは、
**「元の引数よりも構造が小さデータに対する再帰関数は正しい結果を返すと仮定して書く。」**
だと思っています。

例えば先の例では、`addOne`という関数は、「全要素を`+1`する」という動作を実現しようとしています。
そこで、パターン``h::t``においてより小さな構造をした`t`の再帰関数である`addOne t`は、「正しくリスト`t`の全要素を`+1`する」として使えるのです。
よって、パターン`h::t`内では、残った要素`h`をどうやって`addOne t`と結合するかだけを考えればよいのです。
今回の例では、`h`も`+1`してリストを組めば良いので、以下のようになります。

```sml:add1.sml
fun addOne list =
  case list of
    nil  => nil
    h::t => (h+1) :: addOne t
```

## 末尾再帰関数との関係

末尾再帰関数とは、関数内で再帰関数を呼び出す位置がその関数の最後の計算であるものです。
さらに、末尾再帰関数はコンパイラによって最適化がかかり、スタックオーバーフローを防いだり、高速に動いたり、となることがあります。

個人的な考えとしては、末尾再帰関数は必須ではありません。
まずは素直に上記の考えで実装を行い、速度やメモリ消費量に問題があるときに、末尾再帰化を考慮すればいいと思います。
※本記事では末尾最適化は取り扱いません。

# まとめ

- 再帰関数は構造が再帰している代数的データ型を扱うときに使う
- 元の引数より小さな構造をしたデータへの再帰関数は正しい結果を返すと仮定して実装する
- 再帰関数は怖くない！

# アペンディクス：Scalaの`Array`での例

話の元となった勉強会では以下の様な例題で、対象は`Array`でした。
`List`などとは違い、`Array`のデータ構造は再帰的な定義ではありませんが、
`for`ループで配列長を使って終了条件を判断するように、
`if`で配列長を判定して再帰をするような記述ができると思います。

```scala:add.scala
def addOne(as: Array[Int]): Unit = {
  def loop(i: Int): Unit = {
    if (i >= as.length) ()
    else {
      as[i] = as[i] + 1
      loop(i+1)
    }
  }
  loop(0)
}
```
Scratchでパズドラっぽいゲームを作ってみた

Scratch のパズドラのパズルゲームの部分の機能を作成してみました。
作成方法についてまとめました。

![about.png](https://qiita-image-store.s3.amazonaws.com/0/54192/27195187-c270-d8fa-3487-24212994e75b.png)

https://www.gitbook.com/book/kyorohiro/doc_scratch/details


きろく

# 作業Table
すぐに実装できそうなところから、順に少しずつ機能追加していきます。
何度も作りなおす事になると思います。
徐々に理解を深めながら、ゴールを目指しましょう。


## ドロップを描画する
![c1.png](https://qiita-image-store.s3.amazonaws.com/0/54192/fe553a1f-3d27-298f-1961-3cd6f16067f2.png)


https://scratch.mit.edu/projects/91284919/

ゲームで使用するドロップを描画する機能を追加します。

<br>
## ドロップを生成する

![c2.png](https://qiita-image-store.s3.amazonaws.com/0/54192/5e2b6c80-7c3b-eebb-1f66-c78cd163eaae.png)


https://scratch.mit.edu/projects/91290061/

今回つくるゲームでは、36個のドロップを使用します。
これらのドロップは6x6テーブルに表示されます。
ここでは、これらのドロップを、Listで管理する機能を追加します。

<br>

## Tableを描画する

![c3.png](https://qiita-image-store.s3.amazonaws.com/0/54192/647576cb-20d5-3ed9-2114-cb29705ed93e.png)


https://scratch.mit.edu/projects/91341934/
生成したドロップを表示してみましょう。

<br>

## ドロップを選択できるようにする

![c4.png](https://qiita-image-store.s3.amazonaws.com/0/54192/75fd9b27-1f30-5bd6-c314-57519ed5ac73.png)


https://scratch.mit.edu/projects/91343315/

マウスが押された時のドロップの位置を記録してみる。

<br>

## ドロップを移動する

![c5.png](https://qiita-image-store.s3.amazonaws.com/0/54192/fcb78399-bb1e-f3b7-2c53-5199e1dd2474.png)


https://scratch.mit.edu/projects/91347588/

ドロップを移動すると、ドロップが入れ替わるようにします。

<br>
## X軸方向に揃ったら、ドロップをクリアする

![c6.png](https://qiita-image-store.s3.amazonaws.com/0/54192/241df910-f9d0-fb8c-6e97-9a16eb1f772c.png)


https://scratch.mit.edu/projects/91349418/

<br>
## Y軸方向に揃ったら、ドロップをクリアする

![c7.png](https://qiita-image-store.s3.amazonaws.com/0/54192/a9574e13-a9ce-c4ec-1c23-b8e088d23bc5.png)


https://scratch.mit.edu/projects/91353699/#player

<br>
## クリアした後、Tableを正規化する。

![c8.png](https://qiita-image-store.s3.amazonaws.com/0/54192/53340cb3-7bd2-4328-3828-f91a58441a0c.png)

https://scratch.mit.edu/projects/91354269/

ドロップを下側に押し込みます。押し込めるものは。

<br>
## クリアされたプロックを再設定する

![c9.png](https://qiita-image-store.s3.amazonaws.com/0/54192/30f8f2da-5db0-3880-be14-e4942c0a546e.png)


https://scratch.mit.edu/projects/91357595/


<br>
## 完成!!

![ca.png](https://qiita-image-store.s3.amazonaws.com/0/54192/92639cd0-f9fc-7c9a-0513-a1e37f257b81.png)


https://scratch.mit.edu/projects/91358081/

<br>



------
Kyorohiro Work
http://kyorohiro.strikingly.com/
[今の最新] sbt-assembly 0.14.1 + spark 1.5.2 でとりあえずspark-submitできるjarを作る設定ファイル

```scala:build.sbt
name := "spark_collaborative_filtering_for_tweet_anime" //自分のアプリ名にする

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  ("org.apache.spark" %% "spark-core" % "1.5.2").
    exclude("org.mortbay.jetty", "servlet-api").
    exclude("com.google.guava","guava").
    exclude("org.apache.hadoop","hadoop-yarn-api").
    exclude("commons-beanutils", "commons-beanutils-core").
    exclude("commons-collections", "commons-collections").
    exclude("commons-logging", "commons-logging").
    exclude("org.spark-project.spark", "unused").
    exclude("com.esotericsoftware.minlog", "minlog").
    exclude("javax.xml.bind", "jsr173_api") //javax.xml.bind/jsr173_api/jars/jsr173_api-1.0.jar
)

libraryDependencies ++= Seq(
  ("org.apache.spark" %% "spark-mllib" % "1.5.2").
    exclude("org.mortbay.jetty", "servlet-api").
    exclude("com.google.guava","guava").
    exclude("org.apache.hadoop","hadoop-yarn-api").
    exclude("commons-beanutils", "commons-beanutils-core").
    exclude("commons-collections", "commons-collections").
    exclude("commons-logging", "commons-logging").
    exclude("org.spark-project.spark", "unused").
    exclude("com.esotericsoftware.minlog", "minlog").
    exclude("javax.xml.bind", "jsr173_api") //javax.xml.bind/jsr173_api/jars/jsr173_api-1.0.jar
)

mainClass in assembly := Some("prediction_save") // メインクラスを指定
```
電気回路 > 3端子レギュレータ > 3.3V出力

ESP8266を使おうとしてうまくいかない。

電源VCCがあやしいかと思い、三端子レギュレータを作った。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a6d7a860-66c6-3d1d-6868-6e18798c32dc.png)

発振防止用のコンデンサの容量は大きめにとっている。

入力電源は単３ｘ３本を使用。

3.3Vが出力されることを確認した。

しかし、ESP8266はまだ動かない。。。

<hr>
(追記 2016/02/08)

[BA033CC0のデータシート @ tyro-teq](http://www.tyro-teq.com/ds/pdf/b/0055/BAJ2CC0FP.pdf)
Ember.js向けのRewriteRuleをH2Oで置き換えると


Ember.jsのWebアプリケーションをH2Oでホストできるかな。


- [Ember.js - A framework for creating ambitious web applications.](http://emberjs.com/ "Ember.js - A framework for creating ambitious web applications.")


## Ember.jsのルーターと挙動について簡単に

Ember.jsのバージョンは1.13くらい系。
アプリケーションをビルドすると、ざっくり下のようなツリーができます。

```
dist/
├── assets
│   ├── vendor-******.css
│   └── vendor-******.js
├── crossdomain.xml
├── index.html
└── robots.txt
```

Ember.jsに限らずこの手のWebアプリケーションは、サーバサイドではJavascriptのファイルを配布にとどめ、クライアントで全部動かします。

ブラウザでの見た目は次のようになりますが、

- /login => ログインページ
- /users => ユーザのページ

すべてのリクエストは`index.html`に仕込まれたルータが対応しています。


### mod_rewriteなどでブラウザのリロードに対応する

通常使っている分には特に違和感無く使えますが、例えば`/users`の表示中にブラウザでリロードすると、`index.html`のルータを通りません。
普通に`/users`へのリクエストとなるため、対策を取っていないと404になります。

この対策に、Apache httpdでmod_rewriteを使用する場合の例が下記です。

```
RewriteEngine On
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.html [L]
```

おおざっぱにいうと、リクエストが存在するファイル/ディレクトリでなければ、`index.html`に処理を投げます。


## H2OでEmber.js向けに設定を書いてみる

まずはこちらを参考に。

- [Kazuho's Weblog: H2OとPHPを組み合わせるの、超簡単です（もしくはmod_rewriteが不要な理由）](http://blog.kazuhooku.com/2015/06/h2ophpmodrewrite.html "Kazuho's Weblog: H2OとPHPを組み合わせるの、超簡単です（もしくはmod_rewriteが不要な理由）")

なるほど超簡単。

で、うまくいったのが次の記述。H2Oは1.6.0を使用、Webアプリケーションは`/public`に置いてます。


```
hosts:
  default:
    listen:
      port: 8000
    paths:
      /index.html:
        redirect: /
      /:
        file.dir: /public
        redirect:
          url: /index.html?
          internal: YES
          status: 307
```


いくらか試して、redirect.urlを`/index.html?`とするのが今のところ挙動がしっくりくる。


### ほか、redirect.urlで試した記述。

- NG: `/index.html` => リクエストが`/index.htmlusers`になり、さらにネストされたリダイレクトへ。
- NG: `/index.html/` => リクエストが`/index.html/users`になり、`/users`になり、リダイレクトループへ。
- OK?: `"/#"` => `internal=NO`でなら動作可能。2回リダイレクトされて元に戻る。旧Ember風な挙動。イマイチ。
- OK?: `/index.html#` => `internal=NO`でなら動作可能。2回リダイレクト後に"/"にたどり着けるのでなんとかなる模様。合計でリダイレクト3回。イマイチ。


H2OとJavaScriptフレームワークを組み合わせるのも超簡単。。かな。。？
デスマの打破に効いたBGM。


この記事は [作業用BGM(個人or社内) Advent Calendar 2015](http://qiita.com/advent-calendar/2015/bgm) の15日めです。




こんにちはmiccです。
今日は、個人的に目頭が熱くなる、懐かしい４年位前のゴールデンウィークの話を書かせてもらいます。

##GWの前と後に大きなリリースが入る

私は、とあるEC制作会社で１年弱過ごした頃、その頃チームは７名と小さかったのに、
大きなECサイトのリニューアルとこれまた大きなECサイトの新規制作が同時に勃発、


- リニューアルは４月末リリース（デザインは内製）
- 新規サイトのリリースがGW明け（デザインは外部のパートナーさん）

既にスケジュールの時点で負の匂いしかしません。
**だって、もう連休ないじゃん。。。**

それらの前にも別のリリース等があり、実際着手できたのは共に４月に入ってから。

この時、リーダーは何をどう考えたのか**全員をリニューアルにアサイン**しました。

ん？まてよ？と。全員あてがったら、どう考えても次の案件がヤバ過ぎる。
GWだけで１サイト作る気だったのでしょうか？　どう考えても鬼畜ですｗ

とかくデザインが上がっているのに、コーディングの着手もしてない状態でGWを迎える事だけは絶対に避けたい。
もしデザインに修正が入った時、外注さんは普通にGW休み、これはまずい奴だぞ、と。


**くぅるーーーー、きっとくるーーーーー♪（納期が)**


やばい。マジでやばい。

##立て直しを提案してみる

とかく早期に立て直すしか無い。
私にはリニューアル案件のサイトを元々触っておらず、案件特有のコードが多く、これらを捌くのが得意ではありませんでした。
リニューアル案件から私ともう一名の新人は外れて先輩たちに任せ、新規案件の着手を直訴しました。
リニューアルが終わって、我々で残った部分は最後手伝って貰いたい、それでなんとか間に合うんじゃないかと。
（まぁ、普通に同時並行で進めたほうが塩梅いいはず。）

そして、先輩たちは、なんとか４月末のリニューアルをやり終えました。最後は泊まり込みで。。。

そこに、新規サイトの残です。リリース後で半分燃え尽きている先輩たちですが、ここで燃え尽きるわけにはいきません。心を傷めないかと心配する感じでした。
なにがなんでもGW明けに最終チェックを通してリリースしなければならない。

いや、それよりも何よりも、１日でもいいから、**我々にも連休が欲しいんだぁぁぁぁぁああああ！！！（心の声）**

##そして、連休に突入。そして一筋の光となるBGMが…

そんな、出たくもない４月２９日の朝、私はBGMの主導権を取るため、先輩より３０分早く出社し、スピーカー付のMacで流したのは、


**「Perfume Complete Best」です・・・！**


パフューーーーーーーーーム神降臨ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!


- 先輩の期限が悪いとドスの効いたクラブミュージックになる
　(そうなると他のメンバーが皆イヤホンをしだす)
- コーダーの１人はアニソン系多め

どうにか共通解が欲しかったんですね。
イヤホンしだすと、コミュニケーション取りにくく、デスマの最後には不向きです。
なにより、先輩のBGMのチョイスが暗かったのも、チームの雰囲気を悪くする一因になっていました。
そんな空気を打破したわけですね。一気に空気が和みました。
クラブ系もアニソン系も満足させられるヤスタカ先生流石です。

祝日くらいせめて、朝から爽やかな音楽を掛けて、晴れやかな気持ちで作業しよう、と。
そして奇跡的に、４日頃作業を終えて、５日から休みを（１日と土日…）とり、リリース前日に飲み会が開かれる位の歴史的大勝利を収めたのでした。

ここで得られた教訓は、
・スケジュール管理、アサインは計画的に
・連休明けにリリースを設定するのは良くない
・働く環境において爽やかなBGMはチームの活性化を産み出す

リリース日については、週末は避けるなど、この後工夫がされるようになりました。

このあとチームも倍以上に拡大し、もう少し機能的になったと思いますが、力任せで何事も進めていたチームだったなぁと、ふと懐かしくなります。
そして、パーフェクトスタイルの歌い出しを聴くと、その時の情熱が沸き返り、胃酸が湧き上がりそうなので最近はあまり聴いても、爽快感は取り戻せそうにありません。
今は自宅で一人なので、tofubeatsかけながらブログもふってます。

明日は、[ki_230](http://qiita.com/ki_230) さんです。こちらも楽しみに待ちましょう。
powershellでエクセルの行をコピーして挿入する

解説しているところが見つからなかったのでメモ

```
テンプレートのエクセルをコピー
Copy-Item C:\work\tmp.xls C:\work\work1.xls

# Excelオブジェクト作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

# コピーしたエクセルを開く
$book = $excel.Workbooks.Open("C:\work\work1.xls")

#開いたエクセルの1枚目のシートを開く
$sheet = $excel.worksheets.item(1)

#1枚目のシートの2行目に行を挿入して1行目をコピペ
$sheet.rows.item(2).insert()
$sheet.rows.item(1).copy($sheet.rows.item(2))

# 上書き保存
$book.Save()

# 閉じる
$excel.Quit()

# プロセスを解放する
$excel = $null
[GC]::Collect()
```
誰でもできる, 複雑なifをちょっと駆逐する方法


確かリーダブルコードか, code completeに乗っていた方法な気がします。
まさかり歓迎

# 忙しいんだけど

楽に理解できるくらいにコードを分割しましょうという話です。


# こんなコードがつらい＞＜

選択項目によってコンテンツが何パターンか変わるみたいなコード、Web制作でもありますよねぇ...

```js

if (hoge === "aa" && !(piyo === "bb" || fuga === "aaaa")) {

  /*
   * 共通処理
   */

  if (hige == "cc") {
  	//固有な処理A
  }
} else if(hoge === "bb" && !(piyo === "aa" || fuga === "aa")) {

  /*
   * 共通処理
   */

  if (piyo == "puyo") {
  	//固有な処理B
  }
} else {
	//なんでもなかった時
}
```

サンプルコードを考えるのもつらい

## つらいポイント

つらポイ

* ifの条件が複雑で一発で理解できない
* 状態による分岐/分岐ごとの処理をまとめてやってしまっている  
  ふぇぇ、 **こんな複雑なコード読めないよ＞＜**
* 分岐ごとの処理内では同じような処理を繰り返している  
  **コピペ!コピペ!コピペ!**

# こうすると少し良いかも

長いけど我慢してください＞＜

```js

var status = 分岐判定();

switch (status) {

	case 'パターンA': 
		パターンAの時の処理();	
		break;

	case 'パターンB':	
		パターンBの時の処理();	
		break;

	default:	
		alert('エラーだよ')
		break;
}

function 分岐判定() {
	var status;
	
	/*
	 * 条件をDOMなり変数なりから分岐して判定
	 */

	// status = 'パターンA'; 分岐をかけてみたいな感じのものを入れる

	// 戻す情報は一つ
	return status;
}

function パターンAの時の処理(){
	共通処理();
	固有な処理A();
}

function パターンBの時の処理(){
	共通処理();
	固有な処理B();
}

function 共通処理() {
	// ...
}

function  固有な処理A() {
	// ...
}

function  固有な処理B() {
	// ...
}

```

## ポイント

### それぞれの処理を分割した

関数やif文ごとに一つのことしかやらないようにしました。
というかifは分岐しかやらないのでswitchに化けました。チーン
分割してみると、一つ一つの処理は大抵簡単になります。
本当の処理自体は``固有な処理A``,``固有な処理B``に押し込めれらえていることがわかります。
それぞれのブロックが一体何をやっているのか分かりやすくなりました。

これは **単一責任の原則**と呼びます。

http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%8D%98%E4%B8%80%E8%B2%AC%E4%BB%BB%E5%8E%9F%E5%89%87

実際にテスト実行してみて、バグが出た際に、バグが出た箇所さえ特定できれば **何が原因となっているのか**
理解しやすいというメリットもあります。

まとめると
* 読みやすく
* 書きやすく
* テストしやすい

がメリットとなります。

### 共通化

繰り返しコピペが発生していた **共通処理** は一つの関数として独立し、
繰り返し呼び出されて利用されるようになりました。

もしこの処理へ変更が入った際も、一つの関数を修正すれば良いのでラクです。
一つ一つ再コピペなど、 **しなくて良いのです。いいですかしなくて良いのです。** (大事なry

# 終わりに

改善されたコードは結構長いです。
扱うif文の複雑さにより、部分的に取り入れるなどのトレードオフをしても良いでしょう。
(Web制作とか、そんなに時間かけてられない時もありますからねぇ...)

早すぎる最適化は諸悪の根源であるみたいな格言もありますので、コードを見直した際に段階的に取り入っていっても良いでしょう。
SlackでTravisCIからの通知を受け取る


チャットツールはやっぱりSlackいいなぁ〜
お金が許すならwebhockが豊富なSlackで行きたいもんです

## 前提条件
- TravisCIのアカウントを作成
- Slackのアカウント作成
- .travis.ymlを作成してTravisCIでCIが行えている

## Slackでの操作
1. SlackのIntegrationsからTravis CIを検索
2. Post to ChannelでChannelを選択し、Addで追加

<img width="315" alt="slack_setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/20424/3135fb2f-14c3-eaee-ec82-0131cc840ede.png">


### travisコマンドのインストール

```bash
$ gem install travis
```

### travisコマンド操作

#### travis login

```bash
$ travis login
# githubのユーザ名、パスワードを入力
```

#### 同期

```bash
$ travis sync
```

#### Tokenを設定
1. Slackの設定ページ `Browse Apps > Travis CI > Edit configuration`
2. `Setup Instructions` expandで設定項目が表示される
3. `Encrypting your credentials`のコマンドを入力


<img width="891" alt="slack_travis_cmd.png" src="https://qiita-image-store.s3.amazonaws.com/0/20424/645aedea-30a3-ae4e-1911-1b1d36bc35c2.png">

※ 上記をコピペするだけでは、Github上のレポジトリが設定されていないので`-r owner/repos`を指定する必要がある  

```bash
travis encrypt -r owner/repos "domain:token" --add notifications.slack
```

### Githubへpushしてみる
push後Slackへ下記のように通知が来ていればOK

<img width="641" alt="スクリーンショット 2015-12-13 16.40.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/20424/00f43840-7a4b-082b-cb4a-831909f65793.png">
myThingsを使って、Twitter連携サイネージを作る！

#イントロ
私は、インタラクティブなサイネージやアート作品を作っています。
今回は、Twitterから任意の画像を収取し、それらを使って展示をするサイネージをmyThingsを使って作ります。

##なぜ、myThingsを使うのか？
私は、普段Touchdesignerというヴィジュアルプログラミング環境を使って制作をしています。
そのため、Web系の話がさっぱり分かりません。
TwitterAPIなどを利用すれば、目的のものは、作れるのだろうということは想像できますが、JSなど全く分からないので、その方法は諦めます。

そこで、Web側の処理をmyThingsにやってもらおう、というのが今回の趣旨です。

以下がの図が今回のシステムです、Twitterとの間にmyThingsに入ってもらうことで、楽に実装できることを目指します。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/100228/94e6e38e-787b-d290-deb4-4fac52edaddc.png)


#myThingsでTwitterから画像を収集する
Iphoneアプリに以下の設定を作ります。

<img width="375" alt="写真 2015-12-13 16 05 08.png" src="https://qiita-image-store.s3.amazonaws.com/0/100228/89d1b06d-5713-1eac-0a35-5c737a1ab89a.png">


Twitterをトリガーにし、
「特定のアカウントがツイート」したら、「Dropboxへ画像を保存する」
という設定を作りました。

これだけでもう、Twitterから画像が収取できますね！

ツイートすれば、どんどん保存されます。
![フォルダ.PNG](https://qiita-image-store.s3.amazonaws.com/0/100228/322079bf-2451-120d-3c88-8253c5f1e1d0.png)

「特定のアカウント」を有名人にしたり、企業にしたりすればサイネージにも活用できそうです。
また、トリガーになる条件は、他にもあるためうまく使えば、もっと細かいこともできそうです。
<img width="375" alt="写真 2015-12-13 16 05 28.png" src="https://qiita-image-store.s3.amazonaws.com/0/100228/23d5b008-7b6f-3c4c-0d8f-d85fd56b7c52.png">



#保存した画像を使ってアプリケーションを作る
myThingsによって保存された画像のビューワーをTouchdesignerを使って作ります。
folder DATを使って、画像を保存したディレクトリを読み込みます。
そして、Moviefilein TOPに画像のパスをいれ画像を読み込ませます。

![td2.PNG](https://qiita-image-store.s3.amazonaws.com/0/100228/8c8373a1-9181-f5ae-6f61-16df14735e97.png)

作り方次第では、読み込む画像数を動的に増やすこともできますが、今回は20個固定としました。

Leap Motionを使って、画像を操れるインターフェイスを作りました。
この部分は割愛します。
（以前、作ったビューワーのデモです:https://vimeo.com/121474938）


![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/100228/7b6f2436-8be5-39a5-d3a6-e220241a05c6.jpeg)
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/100228/392fecff-e316-9b61-3991-acd53e345139.jpeg)


#結論
myThingsを使うことで、非常に簡単にTwitterから画像を取得して使うということが、できました。
iot向けということで、センシングデバイスとの連携での事例の多いmyThingsですが、
このように自分で作ると面倒な部分を、myThingsにやってもらうという使い方もありなのでは？と思います。
TravisCIの対象にgh-pagesブランチを加えるには


GitHub Pagesについてはデフォルトで、Travisの対象から外れていますが、ホワイトリストに明示的に加えることで、対象にすることができます。ドキュメントサイトなどを、コミュニティ運営している場合、`gh-pages`をメインブランチにするケースはままあると思うので、そんなときはこの方法で。

## .travis.yml

`branches`セクションで、`only`のところがホワイトリスト指定になっています。ここに、`gh-pages`を書けばOK。これで、`gh-pages`ブランチでもテストしてくれます。そのままだと、他のブランチのテストをしなくなってしまうので、下記の例では`/^.*$/`も足しています。


```yaml
language: node_js
node_js:
  - "4.1"
branches:
  only:
    - gh-pages
    - /^.*$/
```


ちなみに、2012年の[機能リクエスト](https://github.com/travis-ci/travis-ci/issues/476)で実現されているので、新しい話ではないです。

公式ドキュメントの記載は[こちら](https://docs.travis-ci.com/user/customizing-the-build/#Whitelisting-or-blacklisting-branches)。
コルーチンを for で使い回したときの各言語における振る舞い


言語によって振る舞いが異なるようなのでメモ。

## C# ##

```csharp
using System;
using System.Collections.Generic;

class Program {
    static IEnumerable<string> Three() {
        yield return "one";
        yield return "two";
        yield return "three";
    }

    static void Main() {
        var co = Three();

        Console.WriteLine("1");
        foreach (var x in co)
            Console.WriteLine(x);

        Console.WriteLine("2");
        foreach (var x in co)
            Console.WriteLine(x);
    }
}
```

実行結果:

```
1
one
two
three
2
one
two
three
```

## JavaScript(Node)

```javascript
"use strict"

function* three() {
    yield "one";
    yield "two";
    yield "three";
}

function main() {
    var co = three();

    console.log("1");
    for (let x of co)
        console.log(x);

    console.log("2");
    for (let x of co)
        console.log(x);
}

main();
```

実行結果:

```
1
one
two
three
2
```

## Julia

```julia
function three()
    produce("one")
    produce("two")
    produce("three")
end

function main()
    co = @task three()

    println("1")
    for x = co
        println(x)
    end

    println("2")
    for x = co
        println(x)
    end
end

main()
```

実行結果:

```
1
one
two
three
2
```

## Lua

```lua
function three()
    coroutine.yield("one")
    coroutine.yield("two")
    coroutine.yield("three")
end

function main()
    co = coroutine.wrap(three)

    print("1")
    for x in co do
        print(x)
    end

    print("2")
    for x in co do
        print(x)
    end
end

main()
```

実行結果:

```
1
one
two
three
2
lua: a.lua:17: cannot resume dead coroutine
stack traceback:
	[C]: in function 'for iterator'
	a.lua:17: in function 'main'
	a.lua:23: in main chunk
	[C]: in ?
```

## Python

```python
def three():
    yield "one"
    yield "two"
    yield "three"

def main():
    co = three()

    print("1")
    for x in co:
        print(x)

    print("2")
    for x in co:
        print(x)

main()
```

実行結果:

```
1
one
two
three
2
```

追記:

下記のような方法もあります。

```python
class three:
    def __iter__(self):
        yield "one"
        yield "two"
        yield "three"
```

実行結果:

```
1
one
two
three
2
one
two
three
```

## Ruby

```ruby
def three
  Enumerator.new do |y|
    y << "one"
    y << "two"
    y << "three"
  end
end

def main
  co = three()

  puts "1"
  for x in co
    puts x
  end

  puts "2"
  for x in co
    puts x
  end
end

main
```

実行結果

```
1
one
two
three
2
one
two
three
```

## まとめ

C# と Ruby では、for 文で同じコルーチンを使い回すと要素の先頭から取り出されるような振る舞いとなった。JavaScript(Node), Julia, Lua, Python では、コルーチンは使い切りで使い回しができないような振る舞いとなった。

## 各言語のバージョン

- C#: Mono JIT compiler version 4.2.1
- Node v5.1.0
- julia version 0.4.0
- Lua 5.3.0
- Python 3.4.0 (v3.4.0:04f714765c13, Mar 15 2014, 23:02:41)
- ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
quickrun.vimでOracleにSQL実行→CSV表示

[quickrun.vim](https://github.com/thinca/vim-quickrun)を使って、OracleにSQL実行、見やすくCSVで結果表示する設定をまとめました。

Oracleの場合、単純にquickrunを使ってSQLファイルを実行すると、出力形式が酷く非常に見難くなってしまいます。これを回避するため、CSV形式に出力するテンプレートを定義しています。

また、接続対象のDBは切替できるように、接続文字列をquickrunの設定とは別に設定するようにしています。

# 前提

* quickrun.vimのインストールが終わっていること。NeoBundleなど、お好きなもので。
* Oracle（およびsqlplus）のインストールが終わっていること。[簡易接続ネーミング](http://www.shift-the-oracle.com/sqlplus/tutorial/sqlplus-remote.html)が使える10g以降の想定で記載していますが、他のバージョンでも応用はできると思います。

#vimrcの設定

SQLファイルに対するquickrunプラグインの設定を.vimrcに記述します。

```vim:.vimrc
let g:quickrun_config['sql'] = {
\ 'exec': '%c %o \@%s',
\ 'command': 'sqlplus',
\ 'cmdopt': '-S %{get(g:, "quickrun_oracle_conn", "/nolog")}',
\ 'hook/output_encode/encoding': 'sjis',
\ 'hook/eval/enable': 1,
\ 'hook/eval/template':
\   'set echo off' . "\r" .
\   'set linesize 1000' . "\r" .
\   'set trimspool on' . "\r" .
\   'set feedback off' . "\r" .
\   'set colsep ","' . "\r" .
\   'set heading on' . "\r" .
\   'set underline off' . "\r" .
\   '%s',
\}
```

以下で設定値を解説します。

* ```'exec': '%c %o \@%s'```
    * ```sqlplus -S DB接続文字列 @SQLファイル```の形式で実行する雛形を定義しています。
    * ```@```はquickrunに展開されてしまうので、```\```でエスケープしています。
* ```'command': 'sqlplus'```
    * 雛形の```%c```に```sqlplus```が代入されます。
* ```'cmdopt': '-S %{get(g:, "quickrun_oracle_conn", "/nolog")}'```
    * 雛形の```%o```に代入されるコマンドオプションです。
    * ```-S```はメッセージおよびプロンプト・初期メッセージを抑制する、sqlplusのオプションです。
    * ```%{```から```}```の部分が```g:quickrun_oracle_conn 変数```（後述）からDBの接続文字列を読み込む設定です。
    * ```g:quickrun_oracle_conn 変数```は後で定義する想定なので、```%{}```を使って実行時に評価します。
    * ```g:quickrun_oracle_conn 変数```が定義されていない場合は```/nolog```オプションを指定してログインなしで実行します。
* ```'hook/output_encode/encoding': 'sjis'```
    * アウトプットのエンコーディング設定です。ここではWindows想定で```sjis```を設定しています。自分の環境に合わせてください。
* ```'hook/eval/enable': 1```
* ```'hook/eval/template': （省略）```
    * CSV出力するための実行テンプレートをhookスクリプトで設定します。
    * これによりSQLファイルの前に```set echo off```などのCSV形式で出力する設定が差し込まれます。

#DB接続文字列の設定

対象のDBを接続する変数を設定します。

```
let g:quickrun_oracle_conn = 'user/pass\@server/servicename'
```

上記をコマンドモードなどで実行して変数設定します。
@はエスケープします。
私は[localrc.vim](http://d.hatena.ne.jp/thinca/20110108/1294427418)を使って、フォルダごとに設定できる形にしています。
.vimrcに書いてもいいですが、対象のDBを変更するために.vimrcの再読み込みが必要になります。

#QuickRun実行

SQLファイルを開いて、``` :QuickRun ```で実行結果が表示されます。
SQLファイルは```;```の区切り文字が必要です。

#todo
* [Alignta](https://github.com/h1mesuke/vim-alignta)使って、CSVをより綺麗に整形するhookスクリプト書きたい。

#参考サイト
* [QuickRun で Oracle に対して SQL を実行したときの結果表示を整える - blog.scheakur.com](http://blog.scheakur.com/post/40013190825/quickrun-%E3%81%A7-oracle-%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6-sql-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E7%B5%90%E6%9E%9C%E8%A1%A8%E7%A4%BA%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B)
PythonでWebページのリンクを抽出するスクリプトを書いた

BeautifulSoup4、素晴らしい。

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# python 2.x
#
# usage: python this_script.py "http://qiita.com/"
#
# 事前に beautifulsoup4 をインストール
# pip install beautifulsoup4

import codecs
import urllib2
import sys
from bs4 import BeautifulSoup

url = sys.argv[1]
html = urllib2.urlopen(url).read().decode('utf-8', 'ignore')
soup = BeautifulSoup(html, "html.parser")
links = [a.get("href") for a in soup.find_all("a")]

for l in links: print l
```
Vagrantメモ

# Vagrantメモ
メモです。日々更新追加されます。

## 外部アクセス用IP

Vagrantfileの

```
config.vm.network "private_network", ip: "192.168.33.10"
```

のコメントを外す。
あとはfirewallでsshやhttpが許可されているなら、上記ipでアクセスが可能となる。
IPは変えても良い。

## ローカルホストマシンとの同期

**rsync**できます。
Vagrantfileに以下を設定

```
config.vm.synced_folder "<同期元>", "同期先", type: "rsync", rsync__exclude: ["Vagrantfile", ".git/", "vendor/"]
```

同期元は、ローカルマシン、WindowsとかMacとか。人による。
同期先はVagrantで立ち上げたbox環境。
**rsync__exclude**は同期させたくないファイルタイプが指定できます。

▼設定例

```
config.vm.synced_folder "./", "/usr/share/nginx/html", type: "rsync", rsync__exclude: ["Vagrantfile", ".git/", "vendor/"]
```

上記は、ローカルのカレントディレクトリをホストマシンのドキュメントルートと同期を取っている。
これで、カレントディレクトリで例えば、以下のindex.htmlを作成し、

```
<html>
<body>
hoge
</body>
</html>
```

Vagrantが起動している状態で、かつVagrantfileがあるディレクトリで

```
vagrant sync
```

コマンドを実行すれば、ホストのファイルがゲストの同期先に同期されます。
同期がとれたので、

```
http://192.168.33.10/
```

でhogeが表示されます。
毎回手で同期とるのが面倒なら

```
vagrant sync-auto
```

で常駐監視されます。

## VM環境のbox保存

```
vagrant package
```

で構築したVM環境をpackage.boxで保存できます。このboxファイルを他人に配布すれば、
あなたが頑張って構築した環境をそのまま渡せます。

受取人は

```
vagrant box add hoge package.box
```

とすればboxファイルが追加されます。
あとはinitしてupすれば、使えます。
これはPJ内で開発環境構築するのにも便利ですね。

## port fowarding
Mantisバグ管理システム導入　備忘録

# ローカル環境へのMantisのインストール方法
近々仕事で使うとのことでしたので練習がてら、マンティスを入れてみました。
ローカル環境へインストールします。
メール機能もあるといいのでpostfixでphpからメール送信できるようにしておきます。
※ローカル環境構築の方法はこちら
http://qiita.com/taiti/items/6460795e4fd6522be207

## インストール環境
vagrantで構築したcentos6.6

## 用意するもの
MantisBT1.2.19　公式サイトからダウンロードします。
	http://www.mantisbt.org/download.php
Mantis用のDB
バーチャルホストでMantisを使えるようにする

### インストール手順

1. Mantis用のDBを作成する。
2. Mantis用ディレクトリにダウンロードしたファイル一式をコピー
3. ローカル環境へアクセスする。（httpdの再起動が必要）
アクセスすると↓の様に表示されます。
![2015-12-13_141518.png](https://qiita-image-store.s3.amazonaws.com/0/56318/b7809e09-9a7b-26aa-c91b-d218cdca9d75.png)



4. アクセス用のDB設定
画面に必要なテーブル構造が表示されますのでこれをコピペでDB設定していきます。
※一気に全コピすると途中エラーが出るので少しずつコピペしてください。
![2015-12-13_141643.png](https://qiita-image-store.s3.amazonaws.com/0/56318/01b071cd-11c9-3be8-5e74-f93419015f58.png)
![2015-12-13_142039.png](https://qiita-image-store.s3.amazonaws.com/0/56318/e1349e32-105b-7512-3079-a4fb2449ed57.png)


5. Mantisのconfig_inc.phpファイルを編集する

ファイルの中身を↓のように修正します。
※sampleファイルを参考にすればよいかと思います。
　修正ポイント：日本語化、送信先メールアドレス
　基本的にgmail経由で構築しています。

```lang:php
<?php
$g_hostname = 'localhost';
$g_db_type = 'mysql';
$g_database_name = 'mantis';
$g_db_username = 'root';
$g_db_password = '123456';

$g_default_language = 'japanese';

$g_phpMailer_method = PHPMAILER_METHOD_SMTP;
$g_smtp_host = "smtp.gmail.com";
$g_smtp_port = 587;
$g_smtp_username = "*****@gmail.com";
$g_smtp_password = "********";
$g_smtp_connection_mode = 'tls';
$g_administrator_email = '*****@gmail.com';
$g_webmaster_email = '*****@gmail.com';
$g_from_email = '*****@gmail.com';
$g_return_path_email = '*****@gmail.com';
```

最後にサーバの再起動を行います。
↓の様にログイン画面が表示されればOKです。
初期の管理者アカウントはこちらです。

```lang:login
ID:administrator
PW:root
```

![2015-12-13_142652.png](https://qiita-image-store.s3.amazonaws.com/0/56318/7a9672bf-2320-a0d2-d25e-1f0d8180cf55.png)


ログインに成功するとこのように表示されます。
※ここまでくればOKで一通りユーザーを作って、チケット発行までできればなおOKです。

![2015-12-13_143146.png](https://qiita-image-store.s3.amazonaws.com/0/56318/71a633d9-eace-63d3-33c1-ceeacaa45800.png)

少し使ってみます。
リセットメールを送信して作成したユーザーでログインできるようにします。

![2015-12-13_143643.png](https://qiita-image-store.s3.amazonaws.com/0/56318/73468e0f-7968-e5fe-b312-ce8667e959a4.png)

送信されたメール
![2015-12-13_143807.png](https://qiita-image-store.s3.amazonaws.com/0/56318/c59cbf5f-7c37-b13f-e768-37e8157a444b.png)

ユーザーの初期設定画面まで表示されればOKだと思います。
![2015-12-13_143849.png](https://qiita-image-store.s3.amazonaws.com/0/56318/0806baa3-cb4b-549b-c317-bfecdbc6c428.png)
boot2dockerをCloudAtCostで使う

## インストール

* [Releases · boot2docker/boot2docker · GitHub](https://github.com/boot2docker/boot2docker/releases)からboot2docker.isoをダウンロード

```bash:
dd if=boot2docker.iso of=/dev/sda bs=1M;sync;sync;sync;reboot
```

## データ保存領域

```bash:
fdisk /dev/sda
```

* 500Mのswapと、残りをsda3に割り当て

```bash:
mkswap /dev/sda2
mkfs.ext4 -L boot2docker-data /dev/sda3
```

* reboot


## /var/lib/boot2docker/bootlocal.sh

* OS起動時に自動実行されるスクリプト。

```bash:/var/lib/boot2docker/bootlocal.sh
ip addr add 192.168.58.220/24 dev eth0
ip route add default via 192.168.58.1
echo nameserver 8.8.8.8 >> /etc/resolv.conf

echo 'TZ="JST-9"' > /etc/sysconfig/timezone

mount -o bind /var/lib/boot2docker/home /home/docker
sh /home/docker/bin/iptables.sh
sh /home/docker/bin/startup.sh
```

# 必要なファイルを設置

* /var/lib/boot2docker/.ssh にdockerユーザ用鍵を置く

## sshd設定

```bash:/mnt/sda3/var/lib/boot2docker/ssh/sshd_config
UseDNS no
Port 23421
PasswordAuthentication no
PermitRootLogin no
```

* パスワード認証を無効にして、sshポートを適当に変える。
* シンボリックリンクは以下に設定されている。
    * `/usr/local/etc/ssh -> /var/lib/boot2docker/ssh/`

### /home/dockerの永続化

```bash:
mkdir -p /var/lib/boot2docker/home
chown -R docker:staff /var/lib/boot2docker/home
mount -o bind /var/lib/boot2docker/home /home/docker
```

----

## iptables

* [CentOS - iptablesの設定【最小構成】 - Qiita](http://qiita.com/asmin/items/59044cd8918afbda1b1e)を参考

```bash:/home/docker/bin/iptables.sh
#!/bin/sh

# iptables 初期化
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

# 受信を破棄 / 送信を許可 / 通過を拒否
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ping(icmp)許可
iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT

#-----------
# ポート開放
#-----------
for i in 22 80
do
  iptables -A INPUT -p tcp --dport $i -j ACCEPT
done

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP
```

### PATHの追加

```bash:/home/docker/.profile
export PATH=$PATH:~/bin/
```

## X転送可能にする

* http://tinycorelinux.net/6.x/x86_64/tcz/

```bash:パッケージダウンロード
BASE=http://tinycorelinux.net/6.x/x86_64/tcz
for i in \
  Xorg-7.7-bin libXinerama libGL libXcursor libXext libX11 libxcb libXau libXdmcp libXdamage libXfixes libxshmfence libXxf86vm libdrm libXrender fontconfig freetype libSM libICE harfbuzz libpng \
  libXmu Xorg-fonts
do
  wget $BASE/$i.tcz
  tce-load -i $i.tcz
done
```

```bash:/usr/local/etc/ssh/sshd_config 
X11Forwarding yes
X11DisplayOffset 10
```
PlaygroundでNSTimerを実行する方法

# 概要

[uikit - Using NSTimer in swift playground - Stack Overflow](http://stackoverflow.com/questions/29232334/using-nstimer-in-swift-playground)によると、playgroundでNSTimerを実行する方法は二つあります。一つは、「XCPlaygroundPageを使う」方法、もう一つは、「CFRunLoopRunを使う」方法です。二つの方法を実際に試してみました。

OS: MacOSX El Capitan, Xcode 7.2で動作確認しました。

# 実装

まず、タイマー実行用に、NSTimerから派生したクラスを作成します。
このクラスは、1秒ごとに現在時刻をコンソールに表示します。

このコードをXCodeで実行すると、コンソールには一度しか表示されません。XCodeの実行プロセスが終了するためです。スレッド実行するためには、実行プロセスを終了させないようにする必要があります。

```swift
class MyTimer: NSTimer {
    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("onTimer"), userInfo: nil, repeats: true)      
    }
    
    func onTimer() {
        let today = NSDate()
        print("現在時刻は \(today) です")
    }
}

var myTimer = MyTimer()
myTimer.startTimer()
```

## XCPlaygroundPageを使う

XCPlaygroundPageは、Xcodeからplaygroundを使うためのモジュールです。playground要素のキャプチャ・表示、Live Viewの管理、コード実行機能を持ちます。

Xcodeは、デフォルトで、すべてのtop-levelコードを実行すると終了します。非同期処理を実行する時には、無限実行を有効にすることによってplyagroundのtop-level codeの終わりに達した後も処理を継続することを許可します。

タイマーを使うためには、無限実行フラグ(needsIndefiniteExecution)をtrueに設定します。

```swift
import Foundation
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
class MyTimer: NSTimer {
    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("onTimer"), userInfo: nil, repeats: true)
        
    }
    func onTimer() {
        let today = NSDate()
        print("現在時刻は \(today) です")
    }
}

var myTimer = MyTimer()
myTimer.startTimer()
```

## CFRunLoopを使う

CFRunLoopは、スレッドに一つ存在し、入力ソースを監視するモジュールです。
CFRunLoopRun()は、現在のスレッドのCFRunLoopオブジェクトを無限に実行します。

ソースコード

```swift
import Foundation
import XCPlayground
class MyTimer: NSTimer {
    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("onTimer"), userInfo: nil, repeats: true)
        
    }
    func onTimer() {
        let today = NSDate()
        print("現在時刻は \(today) です")
    }
}

var myTimer = MyTimer()
myTimer.startTimer()

CFRunLoopRun()
```

# 参考資料
* [uikit - Using NSTimer in swift playground - Stack Overflow](http://stackoverflow.com/questions/29232334/using-nstimer-in-swift-playground)
* [XCPlayground Module Reference](https://developer.apple.com/library/ios/documentation/Miscellaneous/Reference/XCPlaygroundModuleRef/XCPlayground.html)
* [CFRunLoop Reference](https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFRunLoopRef/index.html)
Alamofireでデータ受信が終わるまで待機する方法

# もっとよい解決方法
[こちら](https://qiita.com/wassen/items/fc1aaffa16a49cf6ea8b#_reference-2793e3559dca0a553f7f)を参照して下さい。

# 概要
Alamofireでデータ受信するまで待機したいと思って、以下の様なコードを書いたら、アプリが止まってしまいました。
これは、.responseJSONのブロック内と、その外側が同じスレッドで処理されるためらしいです。
つまり、dispatch_semaphore_waitで待機してしまうと、.responseJSONのブロック内も処理が止まってしまい、いつまで経ってもロック解除ができずにデッドロック・・・という事みたいです。

```
//ロックの取得
let semaphore:dispatch_semaphore_t = dispatch_semaphore_create(0)
        
Alamofire.request(.POST, url, headers: headers, encoding: .JSON)
	.responseJSON { response in
		・・・データを受信した際の処理・・・
		//ロックの解除
		dispatch_semaphore_signal(semaphore)
}

//ロックが解除されるまで待つ
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

・・・後続の処理・・・
```

#解決策
[Async Swift Scripting - NSBogan](http://mgrebenets.github.io/swift/2015/10/08/async-swift-scripting "Async Swift Scripting - NSBogan")によると、NSRunLoopを使ったテクニックが紹介されています。

```
//ロックの取得
var keepAlive = true

Alamofire.request(.POST, url, headers: headers, encoding: .JSON)
	.responseJSON { response in
		・・・データを受信した際の処理・・・
		//ロックの解除
		keepAlive = false
}

//ロックが解除されるまで待つ
let runLoop = NSRunLoop.currentRunLoop()
while keepAlive &&
    runLoop.runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: 0.1)) {
    // 0.1秒毎の処理なので、処理が止まらない
}

・・・後続の処理・・・
```
PlayFrameworkでキャッシュの値の有無によってViewを出し分けするサンプル


## PlayFrameworkでキャッシュの有無によってViewを出し分けするサンプル

複数の画面間でフォームから入力した値を保持したかったのでキャッシュを使うことにしたのだけれど、
キャッシュの値の有無によって画面表示を変更しようとしたらつまづいたのでメモ。


## サンプルプロジェクト

https://github.com/satomikko94/play-cache-sample

- PlayFramework 2.4
- Java 1.8

## サンプルコード

```java:Application.java
    static Form<Task> taskFrom = Form.form(Task.class);

    public Result index() {
    	return ok(setCache.render(taskFrom));
    }
    
    public Result setTask() {
    	// get values from form
        Form<Task> filledForm = taskFrom.bindFromRequest();
        Task task = filledForm.get();
        
        // set Task model to cache
        Cache.set("task", task, 60 * 1);
        
        return redirect(routes.Application.index());
    }
```

```java:Task.java
public class Task {
    public String id;
    public String taskName;
}
```

```html:setCache.scala.html
@(taskForm: Form[Task])
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Play framework - Cache sample</title>
    </head>
    <body>
    	<!-- send data from form -->
        @form(routes.Application.setTask()) {
        	@inputText(taskForm("id"))
        	@inputText(taskForm("taskName"))
        	<input type="submit">
        }
        <!-- show cache data -->
        @showCache()
    </body>
</html>
```

```html:showCache.scala.html
@(task : Task = Cache.get("task").asInstanceOf[Task])
<!-- if cache is not null, show cache data -->
@if(task == null) {
	<h1>Cache has no data!</h1>
} else {
	<h1>Task data from Cache</h1>
	id : @task.id<br>
	taskName : @task.taskName<br>
	<br>
	Cache will expire after 1 minutes.
}
```
##実行結果
http://localhost:9000/ にアクセス。
###初期画面
![Screen Shot 2015-12-13 at 13.33.02.png](https://qiita-image-store.s3.amazonaws.com/0/52554/a20a096a-0b4f-08b0-c6f7-045e81b82e4e.png)


初期画面はCache has no data!と表示される。
フォームに適当な値を入力してSubmit

###フォーム送信後
![Screen Shot 2015-12-13 at 13.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/52554/88d3c39b-baf0-b449-d30f-d9949d327545.png)


Submitすると、フォームの値が下に表示される。
キャッシュに入れているので、直後に画面を更新してもこの値は残ったまま。
キャッシュ期限の1分を過ぎるとまたCache has no data!と表示される。

## ポイント

###Cache.set
setCache.scala.htmlのフォームで入力した値をApplication.javaでTask型として取得し、
`Cache.set("task", task, 60 * 1);`
でキャッシュに保持している。キャッシュ期限は60 * 1 = 1分。
このキャッシュは他のクラスやViewから取り出すことが出来る。


###キャッシュデータのviewでの取得
ここがつまづいた所。
この後のif文で使用するためには、キャッシュのデータを
`@(task : Task = Cache.get("task").asInstanceOf[Task])`
で取得してくる必要がある。`asInstanceOf`でTask型に直すのを忘れずに。

この1行、これより前にHTMLが書かれていると
`')' expected but '=' found.`というコンパイルエラーが表示されてしまうので
必ずincludeしてるhtmlの最初に持ってくる必要がある。
この件についてはちゃんとした理由書いてあるページあると思うのだけれど見つからなかった・・・
どなたかわかったら教えて下さい。


###取得したキャッシュデータの利用
取得できればあとは簡単。if文は
`@if(task == null) { }`
このように`@if`のなかで取得したデータを使用できる。
また、HTMLに取得したデータを埋め込みたい場合は
`id : @task.id<br>`
という使い方もできる。
VS Codeのエクステンションの単体テストを記述する

## はじめに
generator-codeを使って生成したVisual Studio Codeのエクステンションをテストします（generetor-codeについては[以前の記事](http://qiita.com/YuichiNukiyama/items/3b928a67248fe5c9a5ba)を参照してください）。

## エクステンションの単体テスト
### 環境の確認
generator-codeでは、[Mocha](http://mochajs.org/)を使用したテスト設定が自動生成されています。そのため、「Debug」ビューで「Launch Tests」を選んで「start」をクリックするだけで、ダミーテストを実行できます。

![LaunchTests.png](https://qiita-image-store.s3.amazonaws.com/0/67429/38feaaff-5358-fc25-6aaa-d12f4a3253b3.png)

このとき実行されるのは「test」フォルダ内のソースコードになります。自作の単体テストを記述するには、「test」フォルダ内に**任意のファイル名.test.ts**と命名したファイルを追加します。

### Mochaを使った単体テストの記述
初めに単体テストの全体像を確認しておきましょう。

```ts:tabconverter.ts
 public toggleTabSpace() {
        let options = window.activeTextEditor.options;
        if (options.insertSpaces) {
            window.activeTextEditor.options = { tabSize: options.tabSize, insertSpaces: false };
        } else {
            window.activeTextEditor.options = { tabSize: options.tabSize, insertSpaces: true };
        }
    }
```

```ts:tabconverter.test.ts
suite("Tabconverter.toggleTabSpace Tests", () => {

	// Defines a Mocha unit test
	test("toggle", () => {
		// Arrange
		let options = window.activeTextEditor.options,
			defaultInsertSpaces = options.insertSpaces,
			defaultTabSize = options.tabSize,
			tabconverter = new TabConverter();

		// Act
		tabconverter.toggleTabSpace();
		
		// Assert
		let afterOptions = window.activeTextEditor.options,
			afterTabSize = afterOptions.tabSize,
			afterInsertSpaces = afterOptions.insertSpaces;
		assert.notEqual(defaultInsertSpaces, afterInsertSpaces);
		assert.equal(defaultTabSize, afterTabSize);
	});
});
```

テスト対象のtoggleTabSpaceメソッドは、タブキーを押したとき、タブが挿入されるかスペースが挿入されるかを呼び出しの度に切り替えるメソッドです。また、タブキー押下時に挿入されるスペースの数はユーザー設定値がそのまま使われます。

単体テストファイル内には、Mochaを使った単体テスト用のsuiteやtest関数を書きますが、generator-codeが自動生成したextension.test.tsのものをコピペで使いまわせます。そのため、test関数内の単体テストにだけ注力すればよいです。今回の単体テストでは、シンプルにArrrange/Act/Assertの3フェーズで記述しました。

Arrangeフェーズでは最初の状態のエディタの状態取得と、テスト対象メソッドを持つクラス生成をしています。インポートさえしておけば、VS Codeエクステンション用のAPIは単体テストファイルからも参照できます。insertSpacesやtabSizeプロパティは値渡しのようなので、Assert用に実行前の状態を取得して変数に格納しておきました。

Actフェーズではテスト対象のtoggleTabSpaceメソッドを実行しています。

Assertフェーズでは、Mochaのassertオブジェクトを使用した診断を行います。assertオブジェクトには、値が予想値と等しいことを表すequalメソッドなどが含まています。Mochaは初めて使いましたが、ほかの単体テストフレームワークと大枠は似ていますし、VS Codeでインテリセンスが聞くように型定義ファイルも事前に生成されているのでさほど迷わないと思います。今回はtoggleTabSpaceメソッドを実行することで、insertSpacesは変更されているはずのため、notEqualメソッドを使った判定をしています。また、tabSizeは元のままのはずなので、equalメソッドでの判定をしています。

### 単体テストの実行
環境の確認の節で確認したように、単体テストの実行設定は自動生成されているので、あとは「F5」キーなどで実行するだけです。実行結果はVS Code上のDebug Consoleに表示されるのですぐに確認できます。

![debugconsole.png](https://qiita-image-store.s3.amazonaws.com/0/67429/388cfd49-8100-74a4-5744-d0bd5534380f.png)

## 参考
[Testing Your Extension](https://code.visualstudio.com/docs/extensions/testing-extensions)
[Mocha](http://mochajs.org/)
[TabSpacer](https://github.com/YuichiNukiyama/TabSpacer/blob/master/test/tabconverter.test.ts)
java.util.Listのループの書き方

java.util.List は順序をもったコレクションなんすが、
（他言語出身等）Javaに不慣れな方にとっては、このコレクションのループの書き方からググらねばならんという場面に遭遇する。

そんなときなどのための、Javaのversion upでループが書きやすくなっているよというメモ。

### とりあえずサンプルコード
 
```java:LoopOfList.java
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class LoopOfList {
	public static void main(String[] args){
		List<String> list = Arrays.asList("A", "B", "C");
		
		// 1. 愚直な例
		for(int i = 0; i < list.size(); ++i){
			String s = list.get(i);
			System.out.println(s);
		}
		
		// 2. イテレータ
		for(Iterator<String>itr = list.iterator(); itr.hasNext();){
			String s = itr.next();
			System.out.println(s);
		}
		
		// 3. 拡張for文
		for(String s : list){
			System.out.println(s);
		}
		
		// 4. ラムダ
		list.forEach(s -> {
			System.out.println(s);
		});

		// 5. ラムダだが、メソッド参照
		list.forEach(System.out::println);
	}
}
```
以下、能書き

1. 愚直な例
  古い愚直なfor文の例。今でも、これでもぜんぜん動くんで、いいんですが、まあやはりメンテしにくい等々で、敬遠される部類と思います。get(index)でアクセスするのもなんか問題があったような？


2. イテレータ
  これもなつかしいイテレータの書き方。Java5で、ジェネリクスが導入される前は、next()でとってくる値をキャストしないといけなかった。
1番の例であった「i」というインデックス用の変数が不要になるのが、利点といえば利点なんだが、コード量は明らかに増える。


3. 拡張for文
  (たしか)Java5で導入された、foreach構文。シンタックスシュガーで、コンパイル後は2番と同じ処理になるはず。だいぶ見やすくなった。


4. ラムダ
  Java8で導入されたラムダを使う例。Listには、forEachが生えたようなので、stream()をつけなくても使える様子。


5. ラムダだが、メソッド参照
  こちらもJava8で導入されたメソッド参照をつかう例。イメージは4番と一緒。だいぶコード量が減ってくると思われる。が、慣れないとなにやってるかわからんかも。

以上、社内教育用資料みたいなものでした。
Node.jsの「構築事例」、そして「向いていること」と「向いてないこと」

Node.jsはシングルスレッド、ノンブロッキングI/O、イベントループなどの特徴があり、「向いていること」と「向いていないこと」があると思います。

言語選定の際に使えるメモとして、Node.jsの構築事例も加えてまとめてみました。

##Node.jsに「向いていること」

**処理が短時間でイベント処理が重要なアプリ**

例えば、チャットアプリなどの大量のアクセスのあるリアルタイムなネットワークプログラミングが得意

**シングルCPUのサーバー**

シングルCPUの環境化でもその性能を十分使い切れるため、比較的性能の小さいサーバ上で大きなパフォーマンスを発揮できる  
  
  
##Node.jsに「向いていないこと」

**CPU負荷の高い処理**

CPUリソースを大量に必要とするJavaScriptの処理を行うとイベントループが回らない状態になり、イベントハンドリングが行えない状態に陥る。このため、CPU処理が大量に必要とされるアプリではNode.jsの利用は向かない。

**マルチコアサーバー**

Node.jsは基本的にシングルプロセス・シングルスレッドで動作する。しかし、そのままの利用では、最近の高集積化したマルチコアサーバ上ではハードウェアの性能を十分使い切ることはできない。node-v0.6からはクラスターモジュールが導入され、Node.jsがマルチプロセスで動作するようになったが、マルチプロセスを意識してプログラミングの設計をする必要がある。

**画像など静的コンテンツの処理**

大量の静的コンテンツを提供するサーバなどでは、そもそも多数のイベント処理がそれほど必要なく、Node.jsを使うメリットがほとんどない。静的コンテンツの方はNginXなどで対応するらしい。


##Node.jsの「構築事例」
ピグライフ、PayPalなどで構築事例があるみたいです。  

・[[大図解]ピグライフはこう動いている](http://www.slideshare.net/akuwano/ss-8876695)
・[Node.js Cluster+Socket.IO+Redisによるリアルタイム通知システム](http://ameblo.jp/principia-ca/entry-11645942977.html)
・[MongoDB + node.js で作るソーシャルゲーム](http://www.slideshare.net/snamura/mongodb-nodejs)
・[第64回、第65回 NHK紅白歌合戦：生放送と連動したミッションクリティカルなメッセージ配信プラットフォーム](http://classmethod.jp/cases/nhk-kouhaku-64/)
・[PayPal社がバックエンドをJavaからJavaScriptへ移行](http://www.infoq.com/jp/news/2014/01/paypal-java-javascript)
・[ソーシャルアプリのインフラはNode.jsが主役になるか](http://www.atmarkit.co.jp/fsmart/articles/devsummit2012_01/01.html)
・[【NASA】みんなが知っている超有名な企業でもNode.js使っているよ！活用事例とソリューション #nodefestA #nodefest](http://togetter.com/li/896827)
・[node.jsでリアルタイムWEBアプリケーションの開発](http://www.it-tera.com/node-js%E3%81%A7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%96%8B%E7%99%BA/)
・[How Node.js Powers the Many User Interfaces of Netflix](http://thenewstack.io/netflix-uses-node-js-power-user-interface/)

上記PayPalの記事でもあるように、1つのJavaScriptチームでフロントエンドからバックエンドまで記述できるということは大きなメリットがありそうです。

> Harrell氏によると、JavaScriptをブラウザ側からサーバ側まで使用する利点の1つとして、『あらゆるレベルの技術において、理解し、ユーザのニーズに対応することができる』1つのチームが受け持つことにより、フロントとバックエンド開発間の隔たりをなくすことが挙げられる

また、他にもこのような意見があるそうです。

>Node.jsは日々安定度を増しており、採用事例も増え、より大型なプロジェクトでの利用も増えてきている。例えば最新のコミュニケーション・ツールであるSpeekやVoxerは完全にNode.js上に構築されている。他の採用者にも、Walmart、Microsoft、Yahooなど、誰もが知る企業が顔を揃えている。

>「もし私が動的な開発環境を一つだけ選ばなければいけないとしたら、おそらく迷わずNode.jsを選ぶだろう。」

>「Node.jsの良さは小型プロジェクトの開発が本当に簡単に行えるところだ。他の環境なら長時間かかるアイディア・ベースでのプロトタイプなども、Node.jsならばすぐにできてしまう。」
[急成長を遂げるNode.jsがどのように発展したのかをその立役者に聞く](http://readwrite.jp/archives/2539)



他にも構築事例や、向いていること、向いてないこと、上記記事の誤りがあれば教えて下さい。
Swift2 配列の最小値・最大値を求める

## 配列から最小値・最大値を求める方法

### Swift 2
```swift
let numbers = [5, 2, 3, 9, 4, 6]
let numMin = numbers.minElement()
let numMax = numbers.maxElement()
print(numMin!,numMax!)
```

### Swift 1.2
```swift
let numbers = [5, 2, 3, 9, 4, 6]
let numMin = numbers.reduce(Int.max, combine: { min($0, $1) })
let numMax = numbers.reduce(Int.min, combine: { max($0, $1) })
print(numMin,numMax)
```


参考にしたサイト
http://stackoverflow.com/questions/24036514/correct-way-to-find-max-in-an-array-in-swift