OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftのTupleでできること

## Tupleとは
Tupleとは複数の値の集合で、配列やディクショナリーに近いものです。
しかしメソッドを持っていなかったり様々型の値を混在させられたりと独特の性質を多く持っています。
この記事ではTupleの様々な仕様について書いていこうと思います。

## よくある使い方
要素へは.0, .1, .2という形でアクセスします。
Arrayと違って様々な型を混在させる事ができます。

```swift
let tuple = (1, 2, "3")

print(tuple.0) // 1
print(tuple.1) // 2
print(tuple.2) // 3
```

## ラベル名付きのTuple

```swift
let tuple = (int: 1, str: "2")

print(tuple.int) // 1
print(tuple.str) // 2
```

補完には出てきませんが通常のTupleと同じアクセス方法も使えます。

```swift
let tuple = (int: 1, str: "2")

print(tuple.0) // 1
```

## ラベル付きとラベル無しの混在
ラベル付きとラベル無しの要素を混在させる事ができます。

```swift
let tuple2 = (int1: 1, 2)

print(tuple2.int1)
print(tuple2.1)
```

## ラベル付きとラベル無しの型
dynamicTypeで型を調べるとどちらも同じ型のように見えます。

```swift
let tuple1: (Int, Int) = (1, 2)
let tuple2: (int1: Int, Int) = (int1: 1, int2: 2)
print(tuple1.dynamicType) // (Int, Int)
print(tuple2.dynamicType) // (Int, Int)
```

Mirrorでプロパティー一覧を調べたところ、どちらも.0と.1がありました。
ラベルはプロパティー一覧で取得できなかったのが意外でした。

```swift
let tuple1: (Int, Int) = (1, 2)
let tuple2: (int1: Int, int2: Int) = (int1: 1, int2: 2)
print(Mirror(reflecting: tuple1).children.map { $0.label }) // [Optional(".0"), Optional(".1")]
print(Mirror(reflecting: tuple2).children.map { $0.label }) // [Optional(".0"), Optional(".1")]
```

## ラベル付きとラベル無しタプルの代入
ラベル付きとラベル無しのタプルはお互いに代入できます。

```swift
let tuple1: (Int, Int) = (int1: 1, int2: 2)
let tuple2: (int1: Int, int2: Int) = (1, 2)
```

しかしラベル名が異なっている場合は代入できません。

```swift
let tuple: (int1: Int, int2: Int) = (int3: 1, int4: 2) // エラー
```

## Tupleを使った代入
Tupleを使うと複数の変数を同時に初期化する事ができます。

```swift
let (value0, value1) = (1, 2)
print(value0) // 1
print(value1) // 2
```

この性質を使えば複数の値を返すメソッドを作る事ができます。

```swift
func method() -> (Int, Int) {
    return (1, 2)
}

let (value0, value1) = method()
print(value0)
print(value1)
```

2つの変数の値を入れ替える事もできます。

```swift
var value0 = 0
var value1 = 1

(value0, value1) = (value1, value0)
print(value0) // 1
print(value1) // 0
```

## typealiasを使ってTupleに別名を付ける
Tupleにtypealiasで名前を付ける事もできます。
プロトタイプを作る際にEntityとして使うと

```swift
typealias MyTuple = (int: Int, str: String)

let tuple = MyTuple(int: 1, str: "AAA")
print(tuple)
```

しかしextensionで拡張をする事はできませんでした。

```swift
typealias MyTuple = (int: Int, str: String)
extension MyTuple {} // エラー
```

## Tupleは値渡し
Tupleはstructやenumと同じで値渡しになります。

```swift
var tuple1 = (int: 1, str: "AAA")
let tuple2 = tuple1
tuple1.int = 10
print(tuple1) // (10, "AAA")
print(tuple2) // (1, "AAA")
```

## 要素が一つだけのTuple
要素が一つだけのTupleはTupleではなくなります。

```swift
let tuple1: (Int) = (1)
print(tuple1.dynamicType) // Int
```

## 要素が0個のTuple
メソッドの定義でよく出てくるVoidですが、実態は空タプルのAliasになります。

```swift
public typealias Void = ()
```

```swift
let closure: Void -> Void = {}
let closure: () -> () = {}
```
LabeledSliderをMVIで書く

[Componentsページにサンプルとして紹介されているLabeledSlider](http://cycle.js.org/components.html)を写経し、MVI化してみる。

ドキュメントは理屈重視であまり実践的な書き方が無くてちょっと辛い（Reduxも似た印象だが）。

isolateは全体をdivでラップするだけのようだが、ネストした時どうなるのか要調査。

```js:ex/LabeledSlider.js
import {Observable} from "rx";
import Cycle from "@cycle/core";
import {hJSX} from "@cycle/dom";

function intent(DOM) {
  return {
    slide$: DOM.select("input[type=range]").events("input").map(ev => ev.target.value)
  };
}

function model(props$, actions) {
  const initialValue$ = props$.map(props => props.initial).first();
  return initialValue$.concat(actions.slide$).map(value => ({value}));
}

function view(props$, state$) {
  return Observable.combineLatest(
    props$, state$,
    (props, state) =>
      <div>
        <span className="label">{props.label}</span>
        <input type="range" min={props.min} max={props.max} value={state.value} />
        <span>{state.value}</span>
      </div>
  );
}

export default function LabeledSliver(drivers) {
  const actions = intent(drivers.DOM);
  const state$ = model(drivers.props$, actions);
  const vtree$ = view(drivers.props$, state$);
  return {
    DOM: vtree$,
    state$
  };
}
```

```js:main.js
import {Observable} from "rx";
import Cycle from "@cycle/core";
import isolate from "@cycle/isolate";
import {makeDOMDriver, hJSX} from "@cycle/dom";
import LabeledSlider from "./ex/LabeledSlider";

function main(drivers) {
  const sliderWidth = isolate(LabeledSlider)({
    DOM: drivers.DOM,
    props$: Observable.of({
      label: "Width",
      unit: "",
      min: 10,
      max: 50,
      initial: 30
    })
  });

  const sliderHeight = isolate(LabeledSlider)({
    DOM: drivers.DOM,
    props$: Observable.of({
      label: "Height",
      unit: "",
      min: 10,
      max: 50,
      initial: 30
    })
  });

  const vtree$ = Observable.combineLatest(
    sliderWidth.DOM, sliderWidth.state$,
    sliderHeight.DOM, sliderHeight.state$,
    (widthVTree, widthState, heightVTree, heightState) =>
      <div>
        {widthVTree}
        {heightVTree}
        <div style={{
          backgroundColor: "#F88",
          width: String(widthState.value) + "px",
          height: String(heightState.value) + "px",
        }} />
      </div>
  );

  return {
    DOM: vtree$
  }
}

Cycle.run(main, {
  DOM: makeDOMDriver("main")
});
```
ubuntu+swift+perfectでperfectserverhttp実行してlocalhost:8181にアクセスしたらThe file "/" was not found.と言われたのでとりあえず静的なhtmlファイルが表示されるまで

タイトルの状態になったんで、Examplesの中を見ていたら

```
Examples/URL Routing/URL Routing/PerfectHandlers.swift
``
上記ファイルのルーティングが

```PerfectHandlers.swift
Routing.Routes["GET", ["/", "index.html"] ] = { (_:WebResponse) in return IndexHandler() }
```

こんな感じでかかれていて、
PerfectServerに入ってるAppDelegateはドキュメントルートを./webroot/としていたので、

PerfectServer/webroot/に

```index.html
<span style="font-size: 36px">どや！</span>
```

上記ファイルをおいてみたら、一応表示されました。
まだ色々わからんことが多いのでまともに使えるようになるまで調べることが多そう、、
責務配置設計 - DDD第1歩

**※この記事は書きかけの記事です。**

第1歩なのでサラッと行きます。

ツッコミ待ってます。（ただし、鉞は怖いのでやめてください）

# 責務配置とは

## 責務とは

>せき‐む【責務】
責任と義務。また、果たさなければならない務め。「―を負う」
https://kotobank.jp/word/%E8%B2%AC%E5%8B%99-547440

Controllerであれば View と Model をつなぐのが責務であり、ビジネスロジックは責務の範囲外といった感じの、それぞれが担うべき役割。

# なぜ責務配置が必要か
責務配置について考える必要性は、責務配置がなかったらどうなるのかという視点から見ていきます。

## 責務配置がぐちゃぐちゃだったら
何か処理を追加したい、変更したいと思った時にどこに処理を追加すればよいのか、変更したい処理がどこにあるのかを発見することが困難になり、生産性が落ちます。
生産性が落ちるだけならまだしも、同じ処理が各クラスに記載されて保守性が落ちる可能性を大いに孕んでいます。

また、いわゆる技術的負債をどんどん積んでいくことになるわけです。
あなたの技術的負債を返済するのは誰ですか？あなたですか？見知らぬ誰かですか？
他の人の技術的負債を返済するのは誰ですか？

## 責務配置を考える上での設計思想
責務配置を考える上ではきちんとした設計思想が必要となります。

DDD,DCIとかあるみたいですが、全然詳しくないのでほかにどのような思想があるのか情報提供を受けたいです。

ちなみにNTTデータさんのTERASOLUNAのアーキテクチャを見るとひとつこういった思想もあるのだというのがわかります。(But Not DDD)
http://terasolunaorg.github.io/guideline/5.0.0.RELEASE/ja/

先日ソースコードのお掃除の記事を書きましたが、既存コードをDDDの設計に切り替えるのは無理だと判断しTERASOLUNAと同じ思想でリファクタリングを行いました。
http://qiita.com/FScoward/items/539e62098088e09cb757

# DDD
**ドメイン駆動設計**

## なぜDDDか
現状ではDDDを利用した設計をしたことがないのでうまいことメリットを説明できないので、動画を貼っておきます。
https://youtu.be/77BTZWq3GiQ
https://youtu.be/FNEfk-dlIKU

## DDD参考資料（ネット）
http://d.hatena.ne.jp/asakichy/searchdiary?word=*[DDD]
http://d.hatena.ne.jp/j5ik2o/searchdiary?word=*[DDD]
http://d.hatena.ne.jp/higayasuo/20080519/1211183826
http://qiita.com/opengl-8080/items/4f8938c65d8a2b7e50d0
http://labs.gree.jp/blog/2013/12/9354/

## DDD参考資料（本）
<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/4798121967/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4798121967&linkCode=as2&tag=coward0d-22">エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=coward0d-22&l=as2&o=9&a=4798121967" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/479813161X/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=479813161X&linkCode=as2&tag=coward0d-22">実践ドメイン駆動設計 (Object Oriented SELECTION)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=coward0d-22&l=as2&o=9&a=479813161X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## ドメインイベント
DDDにおいてはドメインが**最大の**関心事

## サービスは消極的に作成する
基本的にはエンティティと値オブジェクトを使用するように設計します。

### サービスに頼ってしまうと
サービス毎に分断されてしまうため同じ処理が各サービスに散らばる危険性がある。
またドメインモデル貧血症に陥ります。
http://bliki-ja.github.io/AnemicDomainModel/

## エンティティとは何なのか
振る舞いを持つ。
Serviceをextendsすることもある。


# DIをどうするか
scalaを使用すると以下のようなシンプルなDIを実現することが可能です。

>シンプルなDI
http://www.michaelpollmeier.com/2014/06/29/simple-dependency-injection-scala/

ただし、このシンプルなDIがDDDで活用できるかどうかはちょっとまだわかっていません。

# DDD sample code
https://github.com/oluies/ddd-sample-scala
Matplotlibで画像を表示


###とにかく表示

とにかく表示するだけなら、Image.show()メソッドが使える。
各OSの標準ビューアが開く。

```py
#coding:utf-8
from PIL import Image

#画像の読み込み
im = Image.open("./achan.jpg")

#表示
im.show()
```

![py2](http://www.bluecode.jp/qiita/python02/001.png)


###普通のPythonプログラム

普通？のPythonプログラムの中で表示したければ、グラフ同様、Matplotlibを利用することができる。
キャプションとかが入れられるので便利といえば便利。

```py
#coding:utf-8
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#画像の読み込み
im = Image.open("./achan.jpg")

#画像をarrayに変換
im_list = np.asarray(im)
#貼り付け
plt.imshow(im_list)
#表示
plt.show()
```

![py2](http://www.bluecode.jp/qiita/python02/002.png)

どうやらピクセル数が座標にマップされるようです。

###Jupyter

Jupyter(IPython)のnotebookの中で表示したい場合は、プログラム初頭で、%matplotlib inlineとする。
すると、インライン表示される（しなければ、別ウインドウが開く）。

>notebook起動時にinlineオプションをつける方法もある。コードを変えたくない場合はそちらのほうがいいかも。

```py
#coding:utf-8
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#Jupyterでインライン表示するための宣言
%matplotlib inline #追加

#画像の読み込み
im = Image.open("./achan.jpg")

#画像をarrayに変換
im_list = np.asarray(im)
#貼り付け
plt.imshow(im_list)
#表示
plt.show()
```

![py2](http://www.bluecode.jp/qiita/python02/003.png)
CentOS7でelrepoリポジトリを有効化してkernel-mlを入れる

CentOS7のカーネルバージョンは 3.10 で、これだとDocker 1.9 の swarm network で overlay ネットワークが使えません。またデフォカーネルではreiserfsが使えなかったりと色々不便だったので新しくしたい。でも kernel を自分でビルドするのは更新まで考えると面倒なので yum で入れたい。そこで ElRepo です。

# ElRepo
http://elrepo.org/tiki/tiki-index.php

これはRHELに新しいカーネルやファイルシステムやドライバ等を提供してくれるリポジトリで、ここを使うとより新しいカーネルをyumでインストール出来るようになる。

セットアップ手順は上記URLに書いてある通り以下のようにすれば `elrepo-release` が入る。

```bash:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
```

# kernel-ml を入れる
で、elrepo-kernel リポジトリに kernel-ml っていうパッケージがあるのでこれを以下のように入れてやれば良い。

```bash:
yum install --enablerepo=elrepo-kernel kernel-ml
```

で一度再起動して新しい方のカーネルを選択して起動（またはgrubのdefaultを弄って再起動）する。
起動したら uname とか見て新しくなってることも確認する。

```shell-session:
[kawaz@r17 ~]$ uname -a
Linux r17.kawaz.jp 4.3.3-1.el7.elrepo.x86_64 #1 SMP Tue Dec 15 11:18:19 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
```

あと以後も kernel-ml を使うならアップデート忘れをしないよう `/etc/yum.repos.d/elrepo.repo` の `[elrepo-kernel]` セクションの `enabled` を `1` に修正しておきます。コピペで編集するなら以下を貼り付け。

```bash:elrepo.repo.patch
# elrepo-kernelをenabledする
sudo patch -p1 /etc/yum.repos.d/elrepo.repo <<EOF
diff --git a/etc/yum.repos.d/elrepo.repo.orig b/etc/yum.repos.d/elrepo.repo
index 86845cd..e9e17b5 100644
--- a/etc/yum.repos.d/elrepo.repo.orig
+++ b/etc/yum.repos.d/elrepo.repo
@@ -35,7 +35,7 @@ baseurl=http://elrepo.org/linux/kernel/el7/$basearch/
        http://repos.lax-noc.com/elrepo/kernel/el7/$basearch/
        http://mirror.ventraip.net.au/elrepo/kernel/el7/$basearch/
 mirrorlist=http://mirrors.elrepo.org/mirrors-elrepo-kernel.el7
-enabled=0
+enabled=1
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
 protect=0
EOF
```



ついでに kernel-ml で問題無さそうなら既存の kernel パッケージは消してしまって良い。

```bash:
yum remove kernel
```

むしろ残しておくと kernel パッケージがアップデートした時に grub がそちらのカーネルを使うように書き換えられてしまうので再起動時に kernel-ml じゃなくなってハマるということが起こりうるので消したほうがすっきりする。


## kernel-headers, kernel-tools, kernel-tools-libs とかも -ml に入れ替える

普通に yum で kernel-ml-* を入れようとすると既存の kernel-* とコンフリクトと言われるので既存の kernel-* のパッケージを削除すれば良い。だが、kernel-headers を削除するとそれに依存する gcc や glibc-devel とかも消えるので後で入れなおすのも面倒くさい。

こういうときは yum swap を利用するのが便利だ。

```bash:
yum swap kernel-headers -- kernel-ml-headers
yum swap kernel-tools-libs kernel-tools -- kernel-ml-tools-libs kernel-ml-tools
```

こんな感じにしてやると既存パッケージに依存していたパッケージの削除と代わりのパッケージのインストールが依存関係を壊すこと無しに同時に行うことが出来る。

これでカーネル類は全部 kernel-ml なパッケージになってスッキリだ。

```shell-session:
[kawaz@r17 ~]$ rpm -qa kernel\* | sort
kernel-ml-4.3.3-1.el7.elrepo.x86_64
kernel-ml-headers-4.3.3-1.el7.elrepo.x86_64
kernel-ml-tools-4.3.3-1.el7.elrepo.x86_64
kernel-ml-tools-libs-4.3.3-1.el7.elrepo.x86_64
```
SELECT文の評価順序の話

# はじめに
この投稿は[アイスタイル Advent Calendar 2015](http://qiita.com/advent-calendar/2015/istyle)の25日目の記事です。

最終日の記事になりますが、今回もDBAの@toshifusaが、RDBMS関連の話題を、地味に淡々と書かせていただきます。

# SELECT文とは
SQLの構文のうち、データを取得する文がSELECT文になります。

最近はORMがSQLを生成してくれるため、素でSQLを書く機会が減ってきているかと思いますが、ORMのSQL生成は完璧ではありません。
必ずしも効率の良いSQLを生成する訳でも、自動的に必要なインデックスを作成してくれる訳でもありません。

RDBMSをブラックボックスにせず、何をやっているのかを理解して、ORMと付き合っていくのが正しい態度ではないかと思います。

# こんな疑問がわいた経験ないですか？
- LIMITで出力件数を数件に制限しているのに、なんでこのクエリは遅いんだろう
- ASで別名を定義しているのに、なぜWHEREに書くとエラーになるんだろう
- JOINのONで条件指定するのと、WHEREで条件指定するのはどちらの方が速いんだろう

それらは、SELECT文の評価順序が分かると納得がいくと思います。

# SELECT文の評価順序
1. FROM
1. ON
1. JOIN
1. WHERE
1. GROUP BY
1. HAVING
1. SELECT
1. DISTINCT
1. ORDER BY
1. TOP（LIMIT）

# LIMITで出力件数を数件に制限しているのに、なんでこのクエリは遅いんだろう
LIMIT（TOP)が処理されるのは、最後の最後です。

全ての処理が終わった結果セットからの出力件数を絞っているだけなので、LIMIT（TOP)が速く動作するのは以下の条件の場合になります。

1. ORDER BYの指定が無い
1. ORDER BYで指定されたカラムがインデックスに定義されている

必要なレコードをWHEREで十分に絞り込むか、インデックスを作成しないと速くなりませんのでご注意下さい。

# ASで別名を定義しているのに、なぜWHEREに書くとエラーになるんだろう
WHEREはSELECTより先に評価されます。
なのでWHEREではSELECTで付けられた別名を参照出来ないのです。

ちなみにSELECTより後に評価されるORDER BYでは参照可能です。

# JOINのONで条件指定するのと、WHEREで条件指定するのはどう違うんだろう
ONで指定できるものは、ONで指定した方が取得されるデータ量が少なく出来るので、速くなります。

ただし、JOIN後のカラムの状態に対して条件を指定したい場合などはONに書くと結果が異なるので注意が必要です。
結合条件と検索条件を混同しないように。

クエリを速くするには、とにかく早い段階で取得するデータ量を少なくする必要があります。
サブクエリをたくさん含む複雑なクエリを作成する場合も、最後にまとめてWHEREで絞るのではなく、各サブクエリ内でレコード数を減らしましょう。

# まとめ
クエリを速くするには、結果セットをなるべく小さくする。それも早い段階で。ってのがポイントです。
SELECTに関しては評価順序以外にも知って欲しいことがありますが、それはまた別の機会に。

# 参考文献
- [SELECT (Transact-SQL)](https://technet.microsoft.com/ja-jp/library/ms189499(v=sql.110).aspx)
- [SELECT（PostgreSQL 9.4.5文書）](http://www.postgresql.jp/document/9.4/html/sql-select.html)
Elixirのtail call（末尾再帰）を確認する

書籍版の Programming Elixir を読み返していると、P.170 に下記のような末尾再帰の話がありました。

> If the very last thing a function does is call itself, there's no need to make the call. Instead, the runtime can simply jump back to their start of the function. If the recursive call has arguments, then these replace the original parameters as the loop occurs

実際その通りなのか、またどれぐらいでスタックが溢れるのか（どれぐらいまでなら、スタックを気にせず再帰させられるのか）を知るため、実際に再帰処理をしてみて確認してみました。

# ソースコード

スタック消費版

```elixir:stack.exs
defmodule Recursion do
  def sub(i) do
    IO.puts i
    0 + sub(i+1)
  end
end

Recursion.sub(0)
````

末尾再帰版

```elixir:tailcall.exs
defmodule Recursion do
  def sub(i) do
    IO.puts i
    sub(i+1)
  end
end

Recursion.sub(0)
```

# 実行結果

約１時間動かしてみた後のメモリ使用量です。末尾再帰版は、最初から最後まで、ほとんど変動ありませんでした。

| スタック消費版 | 末尾再帰版 |
| :--: | :--: |
| 2.1GB | 30MB |

この時の呼び出し回数はスタック消費版は約1億4000万回、末尾再帰版は3億強です。スタック消費版を回数で単純に割ると、5000万回以上の呼び出ししで1GBしか消費しません。

貧乏臭さが抜けないというか、何となく「スタックやヒープを無駄に消費する」のは避けたくなりますが、これだけ繰り返すことができ、その消費量もそう多くないのであれば、末尾再帰になっているかどうかを心配する必要はあまり無いかもしれません（もちろんやることや、状況次第ですが）。

ちなみに `ulimit -s` が 10240 の環境で、C言語で再帰処理をして見た所、約392,786回で `Segmentation fault (core dumped)` で落ちました。

```c
#include <stdio.h>

void recursive(unsigned long i)
{
  printf("%ld\n", ++i);
  recursive(i);
}


void main()
{
  recursive(0);
}
```
GuzzleのMiddleware::retryを使ってみた

Guzzleを使ってリトライ処理をしたかった
Guzzleでは
https://github.com/guzzle/guzzle/blob/master/src/Middleware.php#L163
が使えるようだ。

<Font color="red">※利用方法が間違っていたのでコードを直しました。</font>
参考にしたサイト　http://addshore.com/2015/12/guzzle-6-retry-middleware/


## 使ってみた。

```php:php 
//リトライ判断
$decider = function ($retries, $request, $response, $exception) {
    if ($retries >= 3) {
        return false;
    }

    if ($exception instanceof ConnectException) {
        return true;
    }

    if ($response && $response->getStatusCode() != '200') {
        return true; //リトライさせる場合はtrueを返す
    }

    return false;
};

//遅延させたい場合
$delay = function ($retries) {
    return 1; //ミリ秒で返す。
};

$retry = Middleware::retry($decider, $delay);

$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push($retry);
$this->client = new Client(['base_uri' => $base_uri, 'verify' => $verify, 'handler' => $stack]);
```


## 分かったこと・出来たこと
* リトライが出来た！
* リトライ時にリクエストのheaderの中身をいじろうとしたが変更できなかった。

## 結論
* 400系500系のエラーの場合に、もう一度同じ内容でリトライする場合には使える
* リクエストを書き換えてリトライさせる場合は使えない（書き換えられるなら教えてください。）

## 分かったこと追加
* 処理回数をカウントするようにしていたが$retriesを使うべき
* $responseがnullで来る場合があるのでチェックが必要
* 接続に失敗した場合ConnectExceptionが$exceptionで渡される
EmacsカレントファイルをATOMエディタで開いてリアルタイムプレビュー

ATOMエディタのmarkdown等のリアルタイムプレビュー機能はとても便利。ただ，基本EmacsにこもっているのでEmacsからATOMを立ち上げてさくっとリアルタイムプレビューの恩恵を得たい。

ATOMエディタはインストールされており，atomコマンドのパスが通っていること。

以下のelispを読み込ませて，

```
(defun open-atom ()
  (interactive)
  (call-process
   "atom" nil nil nil buffer-file-name))
```

対象バッファにいるときに，

```
M-x open-atom
```

でATOMが立ち上がり，この後に，ATOMで

```
control + shift + M
```
でプレビュー開始。
ナビゲーションバーに UISearchBar を ScopeBar 付きで表示


ナビゲーションバーに UISearchBar を載せ、編集中のみ ScopeBar を表示する。

|標準|編集中|
|:------------:|:------------:|
|![UISearchBar.png](https://qiita-image-store.s3.amazonaws.com/0/41879/746b8774-e4d7-3219-f8c6-d5cf806f6a85.png "UISearchBar.png")|![UISearchBar+Editing.png](https://qiita-image-store.s3.amazonaws.com/0/41879/c9142545-a536-446a-7c19-f3f5ca8255c6.png "UISearchBar+Editing.png")|

コードサンプルは以下の通り。高さの調整はもっとマシな方法があるかもしれない。


```swift
    override func viewDidLoad() {
        super.viewDidLoad()

        let searchBar = UISearchBar()
        searchBar.delegate = self
        searchBar.scopeBarBackgroundImage = UIImage() // 空の画像をセットしないと親 View に背景色がつく
        self.navigationItem.titleView = searchBar
    }

    // MARK: - UISearchBarDelegate
    
    func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
        searchBar.showsCancelButton = true
        searchBar.scopeButtonTitles = ["A", "B"]
        searchBar.showsScopeBar = true
        self.navigationController?.navigationBar.frame.size.height = 84
        return true
    }
    
    func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool {
        searchBar.showsCancelButton = false
        searchBar.scopeButtonTitles = [] // 空にしないと showsScopeBar = false にしても表示される
        searchBar.showsScopeBar = false
        self.navigationController?.navigationBar.frame.size.height = 44
        return true
    }
    
    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        searchBar.text = ""
        searchBar.resignFirstResponder()
    }

```
OS X：ログインパスワードの変更後にキーチェーンアクセスでキーチェーン「ログイン」が要求される際の対処法


OS X El Capitan 10.11.2を利用中です。

Macにログインする際のIDパスワードをApple IDと統合したら、次回ログイン時に key chain というウィンドウが開いてパスワードを求められるようになりました。

ツールチェインというツールに認証情報が保管されているようですが、ツールチェイン自身のパスワードが変更されないことが問題のようです。以下の公式サイトにある手順でツールチェイン自身のパスワードを変更すると問題は解消されました。

* [OS X：ログインパスワードの変更後にキーチェーンアクセスでキーチェーン「ログイン」が要求される](https://support.apple.com/ja-jp/HT201609)
leJOS EV3 の LinearCalibrationFilter

これは、[ETロボコン Advent Calendar 2015 - Adventar](http://www.adventar.org/calendars/734)の 6日目のエントリーです。

主にleJOS担当な某地区実行委員です。6日目、当日になってもエントリが無かったので、小ネタですが書いてみます。

ETロボコン 2015 の公式プラットフォームの１つにもなっている leJOS EV3 ですが、EV3本体、センサー、モータの API 以外にもロボテックス関連のちょっとよい API がいろいろあります。今回はその中から LinearCalibrationFilter クラスを紹介します。

leJOS EV3 はセンサーフレームワークという手順でセンサー値を取り出します。様々なセンサーを統一的な手段で扱うようにするためですが、ちょっと面倒くさいです。こんな感じです。

```java:
センサー = new センサークラス(ポート);
センサープロバイダー = センサー.getMode(センサーモード);
float[] sample = new float[センサープロバイダー.sampleSize()];
センサープロバイダー.fetchSample(サンプル, 0);
```

leJOS EV3 では、このセンサーフレームワークを応用したフィルタクラス群があって、lejos.robotics.filter パッケージにあります。LinearCalibrationFilter はその中の１つで、センサーのキャリブレーション、目標値との差分を取り出すことができます。

例として、ライントレースでよく使われるカラーセンサーの輝度検出モードを扱う場合には以下のようにします。

```java:
EV3ColorSensor colorSensor = new EV3ColorSensor(SensorPort.S3); // カラーセンサー
SensorMode redMode = colorSensor.getRedMode(); // 輝度検出モード
float[] sample = new float[redMode.sampleSize()];
LinearCalibrationFilter calibrator = new LinearCalibrationFilter(redMode);
```

これで準備はできました。キャリブレーションは以下のようにします。ESCAPEボタンが押されるまでキャリブレーションを行います。

```java:
calibrator.startCalibration();                 // キャリブレーション開始
while (!Button.ESCAPE.isDown()) {
    calibrator.fetchSample(sample, 0);           // キャリブレーション実行

    // この間に、輝度の最大と最小が得られる所、適当にセンサー位置を変える
    // モータで自動でやるのもよし、手で動かすのもよし
}
calibrator.stopCalibration();                  // キャリブレーション停止
calibrator.save("redcalpar");                  // キャリブレーション結果のセーブ
```

ちなみにキャリブレーション中は、センサー値にローパスフィルターもかかります。

これでキャリブレーション結果が leJOS EV3 内の `/home/root/sensorCalibration/redcalpar.cal` に格納されます。このファイルの中身は以下のようなものです。</p>

```
sampleSize=1
calibrationType=0.0
type=LinearCalibrationFilter
scale=1.0
offset=0.38000003
```

|項目            |説明               |
|:--------------|:------------------|
|sampleSize     |サンプル数、要するにセンサー値の数|
|calibrationType|0 ならセンサー値そのもの、1ならスケールに対する割合、なぜか float|
|type           |キャリブレーションしたクラス|
|scale          |センサー値のスケール。センサー値がとり得る幅のこと|
|offset         |キャリブレーションしたセンサー値の最小値の最大値の中間値|

キャリブレーション結果を使った実行は以下のような感じです。

```java:
LinearCalibrationFilter tracker = new LinearCalibrationFilter(redMode, "redcalpar");
while (!Button.ESCAPE.isDown()) {  // ESCAPE ボタンが押されるまで
    tracker.fetchSample(sample, 0);
    float error = sample[0];         // offset (要するに目標値)との差分

    // 差分から PID 制御してモータ動かすなりなんなりと

}
```

ちなみに、このキャリブレーションでないモードでの実行ではローパスフィルターかかりません。かけたい場合は `lejos.robotics.filter.LowPassFilter` も使いましょう。

`LinearCalibrationFilter` の詳しい仕様は [leJOSのAPIドキュメント](http://www.lejos.org/ev3/docs/lejos/robotics/filter/LinearCalibrationFilter.html)を参照。

`lejos.robotics` 配下には、この他にも使えそうなものがあるので、興味のある方は調べてみてください。
Building Microservices : Outline

### **はじめに**
Building Microservices（O'Reilly、2015/2/2）の読書メモです。

著者は、Sam Newmanという人。Martin Fowlerが所属するThoughtWorksの方です。

Amazon 売れ筋ランキング: 2015/12/27時点は、こんな感じの本です。

> 2位 ─ 洋書 > Computers & Technology > Hardware > Design & Architecture
> 3位 ─ 洋書 > Computers & Technology > Hardware > Parallel Processing Computers
> 4位 ─ Kindleストア > Kindle洋書 > Computers & Internet > Software

ちなみに、私は、現在、モノリシックなシステムをマイクロサービスへ移行するプロジェクトに携わっています。対象システムは、マイクロサービスへの移行で有名な[クックパッドのシステム規模](http://knowledge.sakura.ad.jp/tech/3870/ "Ruby on RailsのModelのクラス数が1851個")よりも、さらに大きなシステムです。

章ごとに数回に分けて記事にまとめていこうと思っています。
目次は、こんな感じになっています。

### **目次**
1. マイクロサービスとは
2. マイクロサービスのアーキテクチャ設計
3. マイクロサービスのモデリング手法
4. マイクロサービス同士の連携方法
5. モノリシスなシステムをマイクロサービスに分割する方法
6. マイクロサービスのデプロイ
7. マイクロサービスのテスト
8. マイクロサービスのモニタリング
9. マイクロサービスのセキュリティ
10. マイクロサービスと組織論
11. マイクロサービスとクラウド
12. マイクロサービスのまとめ
ubuntu15.10にswift+Perfect環境を作ろうとしたらmakeで結構怒られたのでメモ

http://qiita.com/yonell/items/79bf4ee3cd65f69903ec

こちらの記事を参考にさせて頂きながら環境構築していたら、僕の環境の場合makeでlibがない系エラーが結構出たので、メモ書き。

```bash
▶ make
cd PerfectLib && make
make[1]: Entering directory '/root/Perfect/PerfectLib'
clang++ ICU.o NetNamedPipe.o File.o Threading.o LibEvent.o Bytes.o FastCGI.o LogManager.o NetTCPSSL.o PerfectServer.o WebConnection.o Closeable.o FastCGIServer.o Net.o Utilities.o MimeReader.o NetTCP.o SessionManager.o WebRequest.o HTTPServer.o MimeType.o PageHandler.o SQLite.o WebResponse.o Dir.o Mustache.o PerfectError.o SysProcess.o DynamicLoader.o JSON.o Utilities-Server.o Routing.o LinuxBridge.o util.o -L/usr/local/swift-2.2/usr/lib/swift/linux -lFoundation -lswiftCore -lswiftGlibc -ldl -lm -shared -levent -levent_pthreads -lssl -lcrypto -lsqlite3 -licudata -licui18n -licuuc -lpthread -o PerfectLib.so
/usr/bin/ld: -lsqlite3 が見つかりません
/usr/bin/ld: -licudata が見つかりません
/usr/bin/ld: -licui18n が見つかりません
/usr/bin/ld: -licuuc が見つかりません
clang: error: linker command failed with exit code 1 (use -v to see invocation)
makefile:61: recipe for target 'PerfectLib.so' failed
make[1]: *** [PerfectLib.so] Error 1
make[1]: Leaving directory '/root/Perfect/PerfectLib'
makefile:4: recipe for target 'all' failed
make: *** [all] Error 2
```

こんな感じですね。

以下apt-getして対応

```bash
apt-get install -y libicu-dev libsqlite3-dev
```

うまく行きました。
【Swift】KVOでプロパティーの変更を監視する

## KVOを使ってみる
KVOとはKey-Value Observingの略で、プロパティーの値の変化を通知してくれる仕組みです。

実装は下のように行います。
addObserverの引数にプロパティー名を渡すと、そのプロパティーが変更された時にobserveValueForKeyPathメソッドが呼ばれるようになります。

```swift
class MyClass: NSObject { // NSObjectのサブクラス
    dynamic var prop = 0 // 監視対象にはdynamicを付ける必要がある
    
    override init() {
        super.init()
        addObserver(self, forKeyPath: "prop", options: [.New, .Old], context: nil)
    }
    
    deinit {
        removeObserver(self, forKeyPath: "prop")
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        print(keyPath) // Optional("prop")
        print(object) // Optional(<MyApp.MyClass: 0x7fdad1c013d0>)
        print(change) // Optional(["old": 0, "new": 10, "kind": 1])
    }
}

let obj = MyClass()
obj.prop = 10 // プロパティーの値を変更したのでMyClassのobserveValueForKeyPathが呼ばれる
```

以下のようにObserverを別クラスに分ける事もできます。

```swift
class MyClass: NSObject {
    dynamic var prop = 0
}

class MyObserver: NSObject {
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        print(keyPath) // Optional("prop")
        print(object) // Optional(<MyApp.MyClass: 0x7fdad1c013d0>)
        print(change) // Optional(["old": 0, "new": 10, "kind": 1])
    }
}

let observer = MyObserver()
let obj = MyClass()
obj.addObserver(observer, forKeyPath: "prop", options: [.New, .Old], context: nil)
obj.prop1 = 10
obj.removeObserver(observer, forKeyPath: "prop")
```

## willSet/didSetとの違い
willSet/didSetとの違いとしては動的に監視を追加できる事があります。
動的に追加するので、サブクラスで追加されたプロパティーに対する監視も行う事ができます。

```swift
class MyClass: NSObject {
    override init() {
        super.init()
        propertyNames.forEach {
            addObserver(self, forKeyPath: $0, options: [.New, .Old], context: nil)
        }
    }
    
    deinit {
        propertyNames.forEach {
            removeObserver(self, forKeyPath: $0)
        }
    }
    
    var propertyNames: [String] {
        let mirror = Mirror(reflecting: self)
        return mirror.children.map { $0.label ?? "" }
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        print(keyPath)
        print(object)
        print(change)
    }
}

class SubClass: MyClass {
    dynamic var prop = 0
}

let obj = SubClass()
obj.prop = 10
```
CentOS7 SELinuxの無効化手順



# 概要
SELinuxは、WindowsでいうところのUACのような機能だが、サーバーとして動作させる際に、予期せぬ制約がかかることが多いので無効化しておく。


# 設定ファイルの修正

現状の設定を確認する。以下のコマンドで、現在の設定を確認する。
CentOS7 (1708) Minimalの導入直後であれば、「Enforcing」となっている。

```bash:SELinuxの設定状況を確認
getenforce

<出力結果>
Enforcing
```

以下のコマンドで、設定ファイルをバックアップする。

```bash:設定ファイルのバックアップ（rootユーザで実行）
cp -piv /etc/selinux/config /etc/selinux/config.`date "+%Y%m%d"`

<出力結果>
‘/etc/selinux/config’ -> ‘/etc/selinux/config.YYYYMMDD’
```

以下の設定ファイルを修正する。

```text:/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
### Disalbe SELINUX begin
##SELINUX=enforcing
SELINUX=disabled
### Disalbe SELINUX end
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```


# 再起動
以下のコマンドで再起動する。

```bash:OS再起動（rootユーザで実行）
shutdown -r now
```

# 結果の確認
再起動後に以下のコマンドで、状態を確認する。
「Disabled」になっていれば良い。

```bash:SELinuxの設定状況を確認
getenforce

<出力結果>
Disabled
```


# 次の手順
[CentOS7 パッケージ管理（インストール済みRPMの最新化）](http://qiita.com/mattsun/items/2a71eef5b396a8495264)


以上
Raspbian Jessieでdpkg-debコマンドが失敗する場合

## 参考

* [dpkg binaries broken? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/249712/dpkg-binaries-broken)

## 現象

```bash:
$ LANG=C sudo apt-get install screen
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  dc
Use 'apt-get autoremove' to remove it.
Suggested packages:
  iselect screenie byobu
The following NEW packages will be installed:
  screen
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/522 kB of archives.
After this operation, 854 kB of additional disk space will be used.
/usr/bin/dpkg-deb: 1: /usr/bin/dpkg-deb: �z����c���9��3��_<��]�3�ǳ�`��?�v��,�;�Y����#ny��w�b�
                                                                                                   {t5�9�[��{��>�~|����ẏqϣ
                                                                                                                             �G;��瓞�<r���W�}������uϣ?}_ޚ^}.y�<���^}_~��E<~���Z�"�}�|����ǯ��|���R����鬗P�}/��[���վ,�ߗAg��q��e��ŗя�^��V�: not found
/usr/bin/dpkg-deb: 1: /usr/bin/dpkg-deb: �: not found
/usr/bin/dpkg-deb: 2: /usr/bin/dpkg-deb: Syntax error: word unexpected (expecting ")")
dpkg: error processing archive /var/cache/apt/archives/screen_4.2.1-3+deb8u1_armhf.deb (--unpack):
 subprocess dpkg-deb --control returned error exit status 2
Errors were encountered while processing:
 /var/cache/apt/archives/screen_4.2.1-3+deb8u1_armhf.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

パッケージがインストールできない・・・。

## 対処

* http://archive.raspbian.org/raspbian/pool/main/d/dpkg/dpkg_1.17.26_armhf.deb

を取得し差し替える

```bash:
ar x dpkg_1.17.26_armhf.deb data.tar.gz
tar xf data.tar.gz ./usr/bin/dpkg-deb
sudo mv usr/bin/dpkg-deb /usr/bin/
```

これで動くようになりました。
電子工作 > トランジスタ > 2SC2720 > ピンアサイン: EBC

バイポーラトランジスタ

2SC2720

[ボントン](http://www.bonton-nagoya.com/index.php?main_page=product_info&products_id=1126)

> ピンアサイン： EBC


[本家](http://japan.renesas.com/products/discrete/transistor/bip_sig/device/2SC2720.jsp
)の方のデータシートがいまいち検索性が悪く、他のサイトで情報を探さないといけない。

古いICなので仕方ないのかもしれないが。
PHPStormでnode.jsのプラグイン。

PhpStormでnode使おうと思ったらrequireがまず補完されなかったのでプラグイン入れたメモ。

1. 左上メニューのPhpstormからPreferencesを選択してPreferencesウインドウを開く。
2. Plugins でNodeJSで検索すれば出てくるのでインストールする。
3. Languages & FrameworksのJavaScript -> LibrariesでNode.js Globalsをチェックして適応するとOK.

<img width="1040" alt="スクリーンショット 2015-12-27 13.25.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/e4ccfd01-ead8-dac2-5134-27bccc6aecd7.png">
MacでPython使う時の最低限のメモ（pyenv編）


pyenvを利用したPythonのインストールおよびバージョン切り替えの方法。
標準インストールのものやbrewでインストールされたものがあっても、原則問題無く共存（切り替え）可能です。

##pyenvのセットアップ

###インストール

インストールはbrewでできるのでbrewで。

```bash
brew install pyenv
```

###環境変数の設定

環境変数を設定。全てのPATHに優先して~/.pyenvを見るようになっていればOK（/usr/binや/usr/local/binになっていると既存のPythonが優先されてしまいます）。

```bash
export PYENV_ROOT="${HOME}/.pyenv"
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
```

変数を反映します。

```bash
source .bash_profile
```

##使ってみる

###インストール可能なバージョンのチェック

pyenvで設定可能なバージョン一覧を見てみます。

```bash
pyenv install -l
```

###特定バージョンのインストール

お好みのバージョンをインストールします。私は、計算系で使うことが多いのでanacondaの2.x系をインストールします。

```bash
pyenv install anaconda-2.4.0
```

###インストールされた（利用可能な）バージョンの確認

インストールされたバージョン一覧を得ます。なお、この状態ではまだ利用できる状態にはなっていません（PATHが通っていません）。

```bash
pyenv versions
```

###利用バージョンの設定

実際に指定のバージョンを利用するためにはglobalコマンドでバージョンを指定します。

```bash
pyenv global anaconda-2.4.0
```

なお、特定のディレクトリのみで適用したい場合はlocalというオプションもあります。
localを利用することで、作業ディレクトリ以下に.python-versionが作成され、バージョンが設定され、その設定がglobalより優先される。

###Shimsの更新

バージョン等を変更したら、正しく動作させるために諸々の情報を更新します。

```bash
pyenv rehash
```

>なお、この操作は、brew install pyenv-pip-rehashをインストールすることで自動化できるようです。
インストール時はbrew install homebrew/boneyard/pyenv-pip-rehashとする必要があるようです。

###元々のものを使う

元々のものはsystemとして扱われる。

```bash
pyenv versions
* system (set by /Users/user/.pyenv/version)
  anaconda-2.4.0
```
となっているようなので、

```bash
pyenv global system
```
とすればよいようです（ただ、whichをしても/usr/bin等にはならない模様）。

##その他

当然ですが、pipでのインストール、管理も各バージョン毎に行われるようです。
Aerospikeのログがやっとこさローカルタイムで出るようになった

設定はserviceスタンザに書いてください。
log-local-time true を入れるだけ
v3.7.0.1からです

```
[root@aero01 ~]# cat /etc/aerospike/aerospike.conf | head -20
# Aerospike database configuration file.

service {
        user root
        group root
        paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1.
        pidfile /var/run/aerospike/asd.pid
        service-threads 4
        transaction-queues 4
        transaction-threads-per-queue 4
        proto-fd-max 15000
        log-local-time true
}


```

あとはこんな感じでログが日本時間で出てますね^^

```
[root@aero01 ~]# cat /etc/aerospike/aerospike.conf  | grep log-local-time
log-local-time true
[root@aero01 ~]# date
2015年 12月 27日 日曜日 12:52:44 JST
[root@aero01 ~]# tail  /var/log/aerospike/aerospike.log
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (thr_info.c::5117)    tree_counts: nsup 0 scan 0 dup 0 wprocess 0 migrx 1366 migtx 0 ssdr 0 ssdw 0 rw 0
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (thr_info.c::5133) {test} disk inuse: 0 memory inuse: 27495216 (bytes) sindex memory inuse: 0 (bytes) avail pct 100
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (thr_info.c::5191) {test} migrations - remaining (0 tx, 1288 rx), active (0 tx, 2 rx), 52.21% complete
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (thr_info.c::5200)    partitions: actual 730 sync 677 desync 1288 zombie 0 absent 1401
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (hist.c::137) histogram dump: reads (0 total) msec
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (hist.c::137) histogram dump: writes_master (0 total) msec
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (hist.c::137) histogram dump: proxy (0 total) msec
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (hist.c::137) histogram dump: udf (0 total) msec
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (hist.c::137) histogram dump: query (0 total) msec
Dec 27 2015 12:52:45 GMT+0900: INFO (info): (hist.c::137) histogram dump: query_rec_count (0 total) count
```

参考URL

http://www.aerospike.com/docs/reference/configuration/#log-local-time
Getting StartedのサンプルをMVIで書く

[Getting Started](http://cycle.js.org/getting-started.html)のサンプルをMVIで書くと多分こんな感じ。

```js
import Cycle from "@cycle/core";
import {makeDOMDriver, hJSX} from "@cycle/dom";

function intent(DOM) {
  return {
    toggleSwitch$: DOM.select("input").events("change")
      .map(ev => ev.target.checked)
  };
}

function model(actions) {
  return actions.toggleSwitch$.startWith(false)
    .map(isOn => ({isOn}));
}

function view(state$) {
  return state$.map(({isOn}) =>
    <div>
      <input type="checkbox" /> Toggle me
      <p>{isOn ? "ON" : "OFF"}</p>
    </div>
  );
}

function main(drivers) {
  return {
    DOM: view(model(intent(drivers.DOM)))
  };
}

Cycle.run(main, {
  DOM: makeDOMDriver("main")
});
```

ちなみにJSXをbabelで変換する場合は、pluginの場合`["transform-react-jsx", { "pragma": "hJSX" }]`、preset reactを使う場合はファイル冒頭にコメント`/** @jsx hJSX */`を入れる必要がある。
SplunkでCloudFrontのアクセスログを取り込む設定

# CloudFrontのアクセスをログをパースする設定（props.confとtransforms.confの例）

※自分用のメモ書きなので、あまり余人には役に立たないかもしれません

## 前提条件

- Splunkがインストール済み
- Splunk Add-on for AWSがインストール済み
- AWSにアカウントがある
- CloudFrontのログがS3に出力されているようになっている
- SplunkがS3からログの取り込み自体は出来る状態になっている（アクセスキーが設定済みな状態）

と言うような前提条件で、Splunk上でS3から取り込んだCloudFrontのログをパースできるようにする設定のメモ書きです。
S3からSplunkへのログ取り込みのやり方については、Splunk Add-on for AWS自体それほど難しい設定は無いので、GUIからサクサクと設定出来ると思いますので省略。

## 事前設定情報

- 取り込んだログのSourceTypeは "aws:cloudfront" とします
- フィールド名はAWSのフィールド名から一部変更します
- 設定がSplunkのシステム権限の所に配置します($SPLUNK_HOME/etc/system/local/ 配下に配置）

## 設定

- 既に指定の場所にファイルがある場合は追記します
- `$SPLUNK_HOME` はSplunkのインストールディレクトリ（デフォルトでは `/opt/splunk`）に読み替えて下さい

``` $SPLUNK_HOME/etc/system/local/props.conf
[aws:cloudfront]
pulldown_type=true
CHECK_FOR_HEADER = false
REPORT-CloudFront = tab-CloudFront
TRANSFORMS-CloudFront = header-CloudFront
TZ = UTC
```
```$SPLUNK_HOME/etc/system/local/transforms.conf
[tab-CloudFront]
DELIMS="\t"
FIELDS="date", "time", "x_edge_location", "sent_bytes", "clientip", "method", "cloudfront_host", "uri_stem", "status", "Referer", "UserAgent", "uri_query", "Cookie", "x_edge_result_type", "x_edge_request_id", "x_host_header", "protocol", "rcvd_bytes", "time_taken", "x_forwarded_for", "ssl_protocol", "ssl_cipher", "x_edge_response_result_type"

[header-CloudFront]
REGEX=^#
DEST_KEY=queue
FORMAT=nullQueue
```

- `transforms.conf` の `[tab-CloudFront]` でタブ区切りの解釈をしています
- `[header-CloudFront]` でファイルの先頭2行にある `#` の行を読み飛ばしします
テキストファイルから1行ずつ読み込む

テキストファイルの中身を1行ずつ読み込みたいことが少なからず発生する.
今回勉強がてらに調べたため,Perl5とcshでメモとして残すことにした（未来の自分への備忘録）.

*cshのバージョン*：tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-apple-darwin) options wide,nls,dl,al,kan,sm,rh,color,filec
※tcsh？
*Perl5のバージョン*：This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
![スクリーンショット 2015-12-26 17.34.47.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/321d4ea2-700c-9791-80ed-199dc08ca71e.jpeg "スクリーンショット 2015-12-26 17.34.47.jpg")

■以下,読み込みファイル内容
ファイル名：1lineGet.txt
![スクリーンショット 2015-12-26 17.42.05.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/e1c24288-a4e5-a92d-0d1c-61ac745dbf1f.jpeg "スクリーンショット 2015-12-26 17.42.05.jpg")

※白色の文字を読み込む.他の色はエディタの機能で色づけされている.

#■Perl5
Perl5で実装するのは私の完全なる自己満足なので,突っ込みがあれば教えてください.
・結論（出力結果）
![スクリーンショット 2015-12-26 18.08.08.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/f32d0ddb-d023-bcfd-e8f4-51d4d1e9e60a.jpeg "スクリーンショット 2015-12-26 18.08.08.jpg")
ファイル内容が表示されているのがわかると思います.

・ソースコード

```perl:1lineGet.pl
#!/usr/bin/perl
# vim:set ts=4 sts=4 sw=4 tw=0:

use 5.010;
use strict;
use warnings;

print "今からファイル内を1行ずつ読み込み,表示する.\n";

open FILE, '<', '1lineGet.txt' or die "$!";
while ( <FILE> ) {
	print;
}
close FILE;

print "END.\n";
```

#■csh
職場で苦心した末に,スーパープログラマーにやり方を教えてもらいました.

・結論（出力結果）
![スクリーンショット 2015-12-26 18.17.41.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/26b05179-c5e4-2d3c-5062-9240d489faaf.jpeg "スクリーンショット 2015-12-26 18.17.41.jpg")
問題なく表示されているのがわかると思います.

・ソースコード

```csh:1lineGet.csh
#!/bin/csh -f
# vim:set ts=4 sts=4 sw=4 tw=0:

set FILE='1lineGet.txt'

echo "今からファイル内を1行ずつ読み込み,表示する."
set COUNT=`wc -l $FILE | awk '{print $1;}'`
@ i = 1
while ( $i <= $COUNT )
	set line="`cat $FILE | head -$i | tail -1`"
	echo "$line"
	@ i++
end
echo "END."
```

今回の肝は2点あり,行数にてループを制御している箇所と`cat`コマンドにパイプで1行読み込みが出来るように制御している箇所です.
`nawk`を駆使すれば同じように出来るようですが,私の技術力が無いため,上記のようになりました.
入力ファイルを確認していただければわかると思いますが,タブ・半角スペース・諸々の記号に屈すること無く,問題なく読み込めていることに感動しました.
入力ファイルの記号は以下の通りです.
 *>---*：Tab表示
 *<*：行末表示

**2点の肝解説**
1点目：行数取得後のループ制御
![スクリーンショット 2015-12-26 18.31.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/18d34b06-19aa-6993-7d23-9c922feb10b1.jpeg "スクリーンショット 2015-12-26 18.31.13.jpg")
`wc`コマンドにて入力ファイルの行数を取得し,`awk`コマンドにて行数部分のみを切り出しています.
入力ファイルと照らし合わせても37行存在していることがわかり,正しく取得できているのがわかります.

2点目：`cat`コマンド
`cat`コマンドだけの使い方では,全行取得してしまうため,パイプにて`head`コマンドにて1行目を取得しています.
![スクリーンショット 2015-12-26 18.34.47.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/8674728d-e53f-05ac-76c4-2d402503f727.jpeg "スクリーンショット 2015-12-26 18.34.47.jpg")
入力ファイルの1行目だけを取得し続けるわけに行かないため,`head`コマンドへの引数を`while`でインクリメントしながら取得行数を増やしています.
このままでは1行目を37回取得することになるため,さらに`tail`コマンドにて最終行のみを取得するように取得内容を抑止しています.
![スクリーンショット 2015-12-26 18.38.23.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/d638631b-d685-be0d-4a3f-60f0c990c24b.jpeg "スクリーンショット 2015-12-26 18.38.23.jpg")
取得した内容を変数に入れて表示しています.

この後は,変数（ここでは`$line`）を加工するなり何なりでメイン処理として使用することになります.
なぜ,ここまでめんどくさいやり方を用いているかと言えば,入力ファイルの1行にタブやスペースが入力されていた場合そこで区切られて変数に格納されてしまうため,このようなやり方にたどり着きました.
※家で再現できずorz

教えていただいた使用方法とは言え,感動したためQiitaに投稿しました.
以上です.
Linuxインストール時の設定、忘れがちなもの

というか、主にRespberry Pi2

# フォルダ英語化
`LANG=C; xdg-user-dirs-gtk-update`

# IPv6を無効
## Ubuntu 最近(20151226時点)の
```
/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

sudo sysctl -p
```
# アカウントロック
```
passwd -l アカウント
```
アンロックは-u

# グループへ追加

# パーティション変更

# 追加インストール

## フォント追加
Ricty,Dejavu Sans
Raspbian Jessie Lite使ってみた

* minibian, DietPiなどを使うのも良いが、公式が軽そうなの配布したので使ってみる。

## download

* [Download Raspbian for Raspberry Pi](https://www.raspberrypi.org/downloads/raspbian/)

* pi : raspberry でログイン

----

# raspi-config

```bash:
sudo raspi-config
```

![config.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e6dfc396-2b22-f7cb-0bd9-21b78d376796.png)

## 2 Change User Password

* piユーザのパスワード変更

## 1 Expand Filesystem

* reboot

### 5 Internationalisation Options

* I1 Change Locale > ja_JP.UTF-8
* I2 Change Timezone > Asia/Tokyo

### 8 Overclock

* `Medium 900MHz ARM, 250MHz core, 450MHz SDRAM, 2 overvolt`

### メモリを開ける

* GPUにメモリが64MB持って行かれているので、16MBに減らす。

```bash:/boot/config.txt
gpu_mem=16
```

* もしくは 9 Advanced Options > A3 Memory Split

----

## sources.list

* [RaspbianMirrors - Raspbian](https://www.raspbian.org/RaspbianMirrors)

```bash:/etc/apt/sources.list
deb http://ftp.jaist.ac.jp/raspbian/ jessie main contrib non-free rpi
```

* /etc/apt/sources.list.d/raspi.list はそのまま。
    * `http://ftp.jaist.ac.jp/raspbian/dists/jessie/InRelease`内に`ui`がなかったので。

## swap無効化

```bash:
sudo dphys-swapfile uninstall
sudo dpkg --purge dphys-swapfile
sudo rm -f /var/swap
```

## RAMディスク

* [Raspberry Pi のtmpディレクトリをRAMディスクに移動 (r271-635)](http://netlog.jpn.org/r271-635/2013/04/raspberry_pi_tmp_ramdisk.html)
* [tmpfs - ArchWiki](https://wiki.archlinuxjp.org/index.php/Tmpfs)

```bash:/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

# ramdisk
tmpfs           /run            tmpfs   defaults,size=32m 0       0
tmpfs           /var/log        tmpfs   defaults,size=32m 0       0
tmpfs           /tmp            tmpfs   defaults,size=32m 0       0
```

```bash:確認
$ df -h 
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root        7.4G  888M  6.2G   13% /
devtmpfs         237M     0  237M    0% /dev
tmpfs            242M     0  242M    0% /dev/shm
tmpfs             16M  4.4M   12M   28% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            242M     0  242M    0% /sys/fs/cgroup
tmpfs             32M     0   32M    0% /tmp
tmpfs             32M  116K   32M    1% /var/log
/dev/mmcblk0p1    60M   20M   41M   34% /boot
```
Azure CLI を使ったリソースグループ作成後によく使うコマンド

Azure CLI でリソースグループをデプロイする記事の多くは，正常にデプロイできることが前提で書かれていて，設定ミスでうまくいかない時のトラブルシュートのtips共有が手薄と感じます．
なので，メモ．


create 後の進捗どうですか?
========================

```shell-session
$ azure group deployment list {デプロイ名}
```

ここでは `xxxx-deploy` というデプロイ名だったとします．

```
info:    Executing command group deployment list
+ Listing deployments                                                          
data:    DeploymentName     : xxxx-deploy
data:    ResourceGroupName  : xxxx-xxxx
data:    ProvisioningState  : Running
data:    Timestamp          : 2015-12-27T02:04:49.8832646Z
data:    Mode               : Incremental
info:    group deployment list command OK
```

`ProvisioningState` が `Running` なら作成中です．
`Succeeded` なら成功です．おつかれさまでした．

```
+ Listing deployments                                                          
data:    DeploymentName     : xxx-deploy
data:    ResourceGroupName  : xxxx-xxxx
data:    ProvisioningState  : Succeeded
data:    Timestamp          : 2015-12-27T02:18:58.2633395Z
data:    Mode               : Incremental
info:    group deployment list command OK
```

でも，不幸にして失敗することもあります．その場合は `Failed` が表示されます．

```
info:    Executing command group deployment list
+ Listing deployments                                                          
data:    DeploymentName     : xxxx-deploy
data:    ResourceGroupName  : xxxx-xxxx
data:    ProvisioningState  : Failed
data:    Timestamp          : 2015-12-24T21:30:40.6881865Z
data:    Mode               : Incremental
info:    group deployment list command OK
```

(それはさておきタイムスタンプ．クリスマスイブが台無しです．)

何が既に作成済みかを見る
=====================

```shell-session
$ azure group show {リソースグループ名}
```

これは，リソースグループのデプロイ中でも実行可能です．
`Running` が長く続く場合に，どこまで進んでいるかを確認できます．
でも，きっと Azure に負荷がかかるので，暇だからといって乱発するのはやめましょう．

何が悪かったのかを確認する
=======================

```shell-session
$ azure group log show {リソースグループ名} > log
```

別にリダイレクトしなくても構わないのですが，そこそこの分量になりますので．
お好みのエディタで開いて，`Failed` や `BadRequest` あたりで grep かけると理由がわかります．
メッセージの内容は，この手のサービスにしては親切な部類と思います．
Elasticsearch を yumでインストール (CentOS)


https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html
ここに書いてあることやるだけですがメモ。

### 1. yum レポジトリの設定

```
# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
```


```
# vim /etc/yum.repos.d/elasticsearch.repo


[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
```

### 2. インストール

```
# yum install elasticsearch
```

### 3. 起動

```
# /etc/init.d/elasticsearch start

Starting elasticsearch:                                    [  OK  ]

```

### 4. 自動起動設定

```
# chkconfig --add elasticsearch
```

### 5. 設定変更

設定ファイルは、/etc/elasticsearch/elasticsearch.yml にある模様。
今回はローカルのVagrantのIPを設定。port はそのまま。

```
 # network.host: 192.168.0.1
+network.host: 192.168.33.10
```

```
# /etc/init.d/elasticsearch restart
```

http://192.168.33.10:9200/ にアクセスして確認

```
$ curl 'http://192.168.33.10:9200/'
{
  "name" : "Obituary",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.1.1",
    "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
    "build_timestamp" : "2015-12-15T13:05:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.3.1"
  },
  "tagline" : "You Know, for Search"
}
```

### 6. kuromoji のインストール

[Japanese (kuromoji) Analysis Plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/analysis-kuromoji.html) に書いてあるのを実行

````
$ cd /usr/share/elasticsearch
$ sudo bin/plugin install analysis-kuromoji
```

インストールされているか確認

```
$ curl -X GET 'http://192.168.33.10:9200/_nodes/plugins?pretty'

{
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "t3aQ5-NMTmGUno7vqRYVgg" : {
      "name" : "Aleksander Lukin",
      "transport_address" : "192.168.33.10:9300",
      "host" : "192.168.33.10",
      "ip" : "192.168.33.10",
      "version" : "2.1.1",
      "build" : "40e2c53",
      "http_address" : "192.168.33.10:9200",
      "plugins" : [ {
        "name" : "analysis-kuromoji",
        "version" : "2.1.1",
        "description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
        "jvm" : true,
        "classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin",
        "isolated" : true,
        "site" : false
      } ]
    }
  }
}

```

### その他

データとかログは、デフォルトでは下記にある模様

> path.home=/usr/share/elasticsearch
> default.path.logs=/var/log/elasticsearch
> default.path.data=/var/lib/elasticsearch
> default.path.conf=/etc/elasticsearch
laravel の homestead で急に homestead.appに接続できなくなる問題と解決方法



## 現象

* 急にhomestead.appアクセスできなくなる
* 以下のようなエラーがでる

```
homestead up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
The specified host network collides with a non-hostonly network!
This will cause your specified IP to be inaccessible. Please change
the IP or name of your host only network so that it no longer matches that of
a bridged or non-hostonly network.
```

## 原因

* ネットワーク・セグメントがかぶっている

僕の場合、他人のWifiに繋いだら、192.168.10.0/24を割り当てていたので、homesteadのデフォルトIPの192.168.10.10と同じになってアクセスできなくなった。


## 解決方法


以下のipを変更

```txt:.homestead/Homestead.yaml 
ip: "192.168.10.10"
```

/etc/hosts も変更


以上。