OmniAICreator/Qiita-1.07M huggingface dataset:
html/templateに追加して便利だったテンプレート関数4選

> （2017-02-25追記）当初は自作のisset関数を紹介していたのですが、`if .foo`や`if not .foo`などで十分だということに気づいたので削除しました。

GoでHTML出力するようなWebサービスを作る場合、素で書くにせよフレームワークを採用するにせよ`html/template`のお世話になることが多いのではないでしょうか。

私も素の`net/http`+`html/template`でコードを書いていますが、なぜこのテンプレート関数がないんだ！と感じることが何度かあり、自前で関数を追加して対処しました。PHP脳の私が追加した4つの関数を紹介します。

ちなみに全部[Revel](http://revel.github.io/)からのパクリです。

## set

テンプレート変数に値を代入・追加できます。

これはテンプレート間で値を受け渡す場合に便利です。`{{ template "foo.tpl" . }}`で呼び出されたテンプレート内で`set`することで、その値を呼び出し元で参照することができます。

```
    {{ set . "_nav" "contact" }}
```

また、未定義かもしれないテンプレート変数にデフォルト値を与えたいようなときにも便利です。未定義の変数にアクセスすると`nil`が得られますが、変数を`eq`で文字列と比較したいような場合`nil`のままだとエラーになってしまいます。以下のようにデフォルト値を与えれば解決できます。

```
    {{ if not ._nav }}
        {{ set . "_nav" "" }}
    {{ end }}
```

この関数は、`parseHTML`の第三引数に`map[string]interface{}`が渡されることを想定しています。nilなどを渡すと実行時エラーになりますので注意してください。

[パクリ元](https://github.com/revel/revel/blob/master/template.go#L49-L52)。

## default

`nil`または空文字列に対するデフォルト値を指定します。

```
    {{ .name | default "名無しさん" }}
```

これは[Revelのfirstof関数](https://github.com/revel/revel/blob/master/template.go#L62-L77)の引数の順序を入れ替えて2引数しか受け取れないようにしたものです。可変引数になっているのはパイプラインの前段が`nil`のとき引数が渡されないことに対する対策です。

## nl2br


文字列を受け取り、改行文字を`<br>`に変換して表示します。

```
{{ .Msg | nl2br }}
```

[パクリ元](https://github.com/revel/revel/blob/master/template.go#L132-L135)。

## raw

文字列をHTMLとして表示します（自動適用されるHTMLエスケープを抑止します）

```
{{ .Html | raw }}
```

[パクリ元](https://github.com/revel/revel/blob/master/template.go#L137-L140)。

## ソースコード

上記4つの関数は次のようにすれば追加できます。簡単ですね。

``` go
	TemplateFuncs := map[string]interface{}{
		"set": func(renderArgs map[string]interface{}, key string, value interface{}) template.JS {
			renderArgs[key] = value
			return template.JS("")
		},
		"default": func(defVal interface{}, args ...interface{}) (interface{}, error) {
			if len(args) >= 2 {
				return nil, fmt.Errorf("wrong number of args for default: want 2 got %d", len(args)+1)
			}
			args = append(args, defVal)
			for _, val := range args {
				switch val.(type) {
				case nil:
					continue
				case string:
					if val == "" {
						continue
					}
					return val, nil
				default:
					return val, nil
				}
			}
			return nil, nil
		},
		// Replaces newlines with <br>
		"nl2br": func(text string) template.HTML {
			return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br>", -1))
		},
		// Skips sanitation on the parameter.  Do not use with dynamic data.
		"raw": func(text string) template.HTML {
			return template.HTML(text)
		},
	}
    tmpl, err := template.New("base").Funcs(TemplateFuncs).ParseFiles("...")
```
UDPの疎通確認はtracerouteよりncが便利

## 概要
「UDP 疎通確認」でググると、tracerouteを使った方法が最上位でヒットする。

```
$ traceroute -U -p <port> <hostname>
traceroute to hostname (xxx.xxx.xxx.xxx), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
```

しかし、tracerouteは途中の経路に依存するため、場合によっては上記のように延々と米印を見続ける羽目になる。

単純に目的のサーバ（の特定のポート）に疎通できているか知りたい場合は、ncを使ったほうが便利だ。

## クライアント

下記のコマンドは、`hostname`の`port`へUDPで接続する。

```
$ nc -u <hostname> <port>
```
`-u`でUDPを指定している。何もつけなければTCPになる。

このままでは、接続だけしてデータは送られていないので、適当に打ち込んでEnterキーを押そう。

```
$ nc -u example.com 10000
Hello, World!

```

これで相手に"Hello, World!"が送られた。

### 送信元IPアドレス、送信元ポートを指定する
さらに発展的な使い方として、送信元IPアドレス、送信元ポート番号を指定できる。
このとき指定する送信元IPアドレスは、自身がすでに持っているIPアドレスに限定される。

```
$ nc -s <送信元IP> -p <送信元ポート> <hostname> <宛先ポート>
```

## サーバ
`nc`ならサーバをたてるのも一瞬だ。下記のコマンドは、自分の`port`(UDP)を待ち受ける。

```
$ nc -lu <port>
```
-uでUDPを指定して、何もつけなければTCPになるのは、クライアントのときと同じだ。`-l`はListenを示す。

サーバをたてた後、先ほどのクライアントの例のように"Hello, World!"を送ると下記の結果になる。

```
$ nc -lu 10000
Hello, World!

```
素人の言語処理100本ノック:77


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第8章: 機械学習
>本章では，Bo Pang氏とLillian Lee氏が公開しているMovie Review Dataのsentence polarity dataset v1.0を用い，文を肯定的（ポジティブ）もしくは否定的（ネガティブ）に分類するタスク（極性分析）に取り組む．

###77. 正解率の計測
>76の出力を受け取り，予測の正解率，正例に関する適合率，再現率，F1スコアを求めるプログラムを作成せよ．

####出来上がったコード：

```python:main.py
# coding: utf-8

fname_result = 'result.txt'


def score(fname):
	'''結果ファイルからスコア算出
	結果ファイルを読み込んで、正解率、適合率、再現率、F1スコアを返す

	戻り値：
	正解率,適合率,再現率,F1スコア
	'''
	# 結果を読み込んで集計
	TP = 0		# True-Positive		予想が+1、正解も+1
	FP = 0		# False-Positive	予想が+1、正解は-1
	FN = 0		# False-Negative	予想が-1、正解は+1
	TN = 0		# True-Negative		予想が-1、正解も-1

	with open(fname) as data_file:
		for line in data_file:
			cols = line.split('\t')

			if len(cols) < 3:
				continue

			if cols[0] == '+1':			# 正解
				if cols[1] == '+1':		# 予想
					TP += 1
				else:
					FN += 1
			else:
				if cols[1] == '+1':
					FP += 1
				else:
					TN += 1

	# 算出
	accuracy = (TP + TN) / (TP + FP + FN + TN)		# 正解率
	precision = TP / (TP + FP)		# 適合率
	recall = TP / (TP + FN)		# 再現率
	f1 = (2 * recall * precision) / (recall + precision) 	# F1スコア

	return accuracy, precision, recall, f1


# スコア算出
accuracy, precision, recall, f1 = score(fname_result)
print('正解率　\t{}\n適合率　\t{}\n再現率　\t{}\nF1スコア　\t{}'.format(
	accuracy, precision, recall, f1
))
```

####実行結果：

```console:実行結果
正解率　	0.8660664040517726
適合率　	0.8675833490299492
再現率　	0.8640030013130745
F1スコア　	0.8657894736842107
```

###正解率

正解率は、すべてのレビューのうち、正しく予測できたものの割合です。

###正例に関する適合率

正例（肯定的）に対する適合率とは、肯定的と予測したレビューの中で、実際に肯定的だったものの割合です。

例えば、キノコ狩りにいって食べられるキノコ（これを正例とします）を選ぶ場合、間違って毒キノコ（負例）を選んでしまったら大変です。でも、食べられるキノコを毒キノコだと思って見逃してしまっても、食べられるキノコの量が減ってしまうだけで、それほど実害はありません。
このように、正例を多少見逃しても構わないから、確実に正例のものだけを選びたい場合に重視する指標です。間違ったものを選ぶことに厳しく、正しいものを見逃してしまうことには寛容な場合の指標といえます。

極端な例ですが、肯定的かどうか怪しいものや良く分からないものは全部否定的という乱暴な予測ロジックにすると、適合率は上げることができます。

###正例に関する再現率

正例（肯定的）に対する再現率は、実際に肯定的なレビューの中で、肯定的と予測できたものの割合です。

例えば商品の出荷前のチェックで不良品を検出する（これを正例とします）場合、不良品を見逃して出荷してしまうと大騒ぎになってしまいます。そうなるくらいなら、良品を不良品と誤判定して出荷対象から外してしまった方が実害がありません。その後の再検査で良品と分かれば出荷できます。
このように、多少は間違って負例を選んでしまってもいいから、とにかく正例を見逃すのを避けたいといった場合に重視する指標です。間違ったものも選んでしまうことには寛容ですが、正しいものを見逃すことには厳しい指標です。

肯定的かどうか怪しいものや良く分からないものを全部肯定的という予測にしてしまえば、再現率は上げることができます。

###正例に関するF1スコア

F1スコア（Fスコア、F値、F-尺度などとも呼ばれます）は適合率と再現率のバランスを定量化したもので、次の式で求められます。

$$ F1スコア = 2 \times \frac{適合率 \times 再現率}{適合率 + 再現率} $$

F1スコアの計算には適合率と再現率の計算が必要です。その際、True Positive、False Positive、False Negative、True Negativeの4つの数字をカウントすると計算が楽になります。

|| 実際が1（陽性）| 実際が0（陰性） |
|---|--------|--------|
|予測が1（陽性）|  True Positive（真陽性）| False Positive（偽陽性） |
|予測が0（陰性）|  False Negative（偽陰性） | True Negative（真陰性）  |

今回のコードでも、この4つの数字をカウントしてから、各値を算出しています。

なお、適合率や再現率とF1スコアの関係は問題79で可視化してみます。

###学習データでの検証結果

いずれも0.86前後の値でした。86%くらいの予測精度ということですね。肯定的と否定的のデータが半分半分なので、当てずっぽうでも50%は当たることを考えると、ちょっと低いような気がしないでもありませんが...

　
78本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。*
結果型を省略したimplicit定義は実際に使用される箇所の"後ろ"に書いてはいけない


## TL;TR

暗黙の型変換/暗黙のパラメーターで結果型/型注釈を明示しない場合に、実際に使われる箇所と同一ソース上で後ろに定義するとコンパイルエラーになる

## 環境

Scala 2.11.7

## 解説

自分で書いててよく分からなかったのでコードで見てみる。

```scala
class Foo(str: String) {
  def bar() = println("bar")
}

object Main extends App {
  "hoge".bar()
  implicit def stringToFoo(str: String) = new Foo(str)
}
```

以上のコードは暗黙の型変換が上手くいかずにコンパイルエラーとなる。

> Error:(8, 10) value bar is not a member of String
 Note: implicit method stringToFoo is not applicable here because it comes after the application point and it lacks an explicit result type
  "hoge".bar()
  
これは[Odersky先生曰く](https://issues.scala-lang.org/browse/SI-801)、

>An implicit conversion without explicit result type is visible only in the text following its own definition. That way, we avoid the cyclic reference errors. 

暗黙の型変換の定義の結果型を省略した場合、定義より前で型変換を行うことはできないようだ。

コンパイルエラーを避けるには、

* 結果型を明示する

```scala
object Main extends App {
  "hoge".bar()
  implicit def stringToFoo(str: String): Foo = new Foo(str)
}
```

* 型変換が行われる箇所よりも前で定義する

```scala
object Main extends App {
  implicit def stringToFoo(str: String) = new Foo(str)
  "hoge".bar()
}
```

これで無事コンパイルが通るようになる。

---

このエラーは次のようなコードでも発生する。

```scala
object Main {
  import Sub._
  "hoge".bar()
}
object Sub {
  implicit def stringToFoo(str: String) = new Foo(str)
}
```

MainオブジェクトはSubオブジェクトから暗黙の型変換の定義をimportしている。実は、このエラーは **同一ソースファイル内ならスコープ関係なく発生する。**
なのでエラーを消すには上述した通り、結果型を明示するか、SubオブジェクトをMainオブジェクトの上に書くか、あるいはMainとSubを別々のソースファイルに書けばよい。

---

さらに、暗黙のパラメーターでも同じようなエラーが発生する。

```scala
object Fuga {
  def doSomething(str: String)(implicit num: Int) = println(str + num)
}
object Hoge {
  import Piyo._
  Fuga.doSomething("a") //コンパイルエラー！
}
object Piyo {
  implicit val num = 1
}
```

implicit valの型注釈が省略されていることに注意してほしい。この場合も暗黙の型変換の場合と同じように、暗黙のパラメーターが使用される箇所より後ろに定義することができない。

コンパイルエラーを解消するにはやはり、型注釈を明示するか、PiyoをHogeの上に書くか、ソースファイルを分けることが必要になる。

## 結論

implicit使うときは結果型/型注釈を書こう。

## 参考

https://issues.scala-lang.org/browse/SI-801
AWS SDK(JavaScript)で再帰処理をいい感じで書く

AWS SDKのリソースのリスト取得系のAPIでは、「ある程度の塊で結果を返すけど、全部返しきれない場合はtokenも返すので、次回はそのtokenを使って呼んでくれたら続きを返すよ」という物が多いです。


例） [IAM#listRoles()](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/IAM.html#listRoles-property)

``` javascript
var params = {
  Marker: 'STRING_VALUE',
  MaxItems: 0,
  PathPrefix: 'STRING_VALUE'
};
iam.listRoles(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
```
callbackのパラメータ

> * IsTruncated — (Boolean)
>  * A flag that indicates whether there are more items to return. 
>
> 　〜略〜
> 
> * Marker — (String)
>  * When IsTruncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent pagination request.

callbackのパラメータのIsTruncateがtrueだったら、全部を返していないので次回呼び出し時にMarkerをパラメータにセットしてlistRoles()を呼ぶ必要があります。

これをPromiseを使っていい感じに書いてみます。

## しばり

* バベらない
* Lambdaのコンソールにそのまま書ける


# 実装

``` javascript
const listIAMRoles = () => new Promise( // 1
    (resolve, reject) => {
        const iam = new AWS.IAM();
        const result = [];
        const loop = (marker) => {
            iam.listRoles({
                Marker: marker // 3
            }).promise() // 4
            .then((data) => {
                data.Roles.map((role) => { // 6
                    result.push({
                        roleName: role.RoleName,
                        arn: role.Arn,
                        path: role.Path
                    });
                });
                if (data.IsTruncated) { // 7
                    loop(data.Marker);
                } else {
                    resolve(result); // 8
                }
            })
            .catch(reject); // 5
        };
        loop(); // 2
    }
);
```

## 実装の説明

1. listIAMRoles()がPromiseを返すようにします。
2. まず、markerを引数に取るloop()関数を定義し、初回分として引数無しでloop()を呼び出します。
3. loop()の引数をMakerプロパティにセットしてIAM#listRoles()を呼び出します。
 * 初回は引数markerがundefinedなので、listRoles()はMarkerがセットされずに呼ばれます。
4. IAM#listRoles()の戻り値のPromiseを取得します。
5. IAM#listRoles()が失敗した場合、.catch()に処理が進むので、そのままreject()を呼び出します。
 * reject()の引数にはIAM#listRoles()でのエラーが渡されるので、このlistIAMRoles()の呼び出し元の.catch(_fn_)の引数に渡されます。
6. .then(_fn_)の引数にIAM#listRoles()の結果が渡されるので、任意に処理します。
7. data.IsTruncatedがtrueの場合、まだIAM#listRoles()で返されるべきデータが残っているということなので、data.Makerを引数にloop()を再帰呼び出しします。
8. もう残りのデータがない場合は、resolve()を呼び出して、listIAMRoles()を終了します。

## Lambda内でつかう

listIAMRoles()がPromiseを返すので、こちらも.then()/.catch()で後続処理します。

``` javascript
exports.handler = (event, context, callback) => {
    listIAMRoles()
        .then((roles) => {
            callback(null, roles);
        })
        .catch((e) => {
            callback(e); // LambdaFunctionをエラーで終了する
        });
};
```

# まとめ

再帰処理をいい感じで実装できました。IAM#listRoles()以外にもこのような
出し惜しみ系APIはたくさんあるので、同じように実装できると思います。

では！
Android OSのビルド方法

Ubuntu14.04でAndroid OSをビルドしたときの手順を残しておく。

最新情報は以下を参照
https://source.android.com/source/initializing.html

##PCの初期設定

http://packages.ubuntu.com/vivid/openjdk-8-jdk から以下をDLする。
自分のPCアーキチェクチャに合ったバイナリをDLすること。
・openjdk-8-jre-headless
・openjdk-8-jre
・openjdk-8-jdk

PCのアーキチェクチャ確認方法

```bash
$uname -m
```

x86_64→amd64
i386/i486/i586/i686→i386

自分の場合は以下をDLした。
・openjdk-8-jre-headless_8u45-b14-1_amd64.deb
・openjdk-8-jre_8u45-b14-1_amd64.deb
・openjdk-8-jdk_8u45-b14-1_amd64.deb

DLした三つのファイルそれぞれに対して以下を実行する。

```bash
$sudo dpkg -i {downloaded.deb file}
```

途中でエラーがでるので以下を実行する。

```bash
$ sudo apt-get -f install
```

先にJavaが入っていた場合でpathの切り替えが必要な場合は以下を実行する。

```bash
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
```

ビルドに必要なツール一式をインストールする。

```bash
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
```
USBアクセス許可を設定する。

```bash
$ wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
```

反映する。

```bash
$ /etc/init.d/udev restart
```

ソースコードのDLに必要となるRepoをインストールする。RepoはGitコマンドをまとめて実行してくれるようなもの。

```bash
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
```

##Androidソースコードのダウンロード

基本的にはビルドしたいVersion毎にフォルダを作成し、そこへ目的のブランチをクローンする。ブランチ、タグの一覧はここで確認できる。
https://source.android.com/source/build-numbers.html

例えば"android-7.0.0_r1"のブランチをクローン場合は以下。

```bash
$ mkdir ~/git/aosp/android-7.0.0_r1
$ cd ~/git/aosp/android-7.0.0_r1
$ repo init -u https://android.googlesource.com/platform/manifest -b android-7.0.0_r1
```
そして同期する。ゼロからの同期には数時間かかる。

```bash
$ repo sync
```

特定のブランチではなくmasterをクローンしたい場合は"-b"オプションなしでinitする。

##Androidソースコードの変更

同期直後は、指定したブランチのHEADを指している状態。ソースコードを変更する場合ははトピックブランチを作成しそこから枝を分岐させた方がよい。

```bash
$ repo start <topic_branch_name> <repository> ... <repository>
```

##ソースコードのビルド

```bash
$ cd ~/git/aosp/android-7.0.0_r1
$ source build/envsetup.sh
$ lunch
```
lunchでビルド対象デバイスを指定する。一覧はここで確認できる。
https://source.android.com/source/running.html

ビルドする。

```bash
$ make
```
"-jN"オプションで並列処理が可能。

```bash
$ make -j4
```

手元の環境(Intel® Core™ i7 3.60GHz × 8 Memory32GB)でクリーンビルドに2,3数時間かかった。参考程度に。
gulp-ejsはv3.0.0から引数の数が変わったらしいぞ

どうやら最新版のgulp-ejs v3.0.0から新しいインタフェースに変わったようで引数の数が増えています。

githubのREADME.mdでいうとこの部分
https://github.com/rogeriopvl/gulp-ejs/commit/a53321155b9b7bfb38a669d1c5a6a15e0d9376f7#diff-04c6e90faac2675aa89e2176d2eec7d8R41

APIがejs(options, settings) から ejs(data, options, settings)に変わっています。今までejsに変数として渡すデータはoption引数の中に含まれていましたが、それをdata引数として切り分けたということですね。

> Note: As of v2.0.0 the output file extension is no longer .html by default, you need to specify it, otherwise it will have the same extension of the input file.

また、こちらは以前(v2.0.0)からですが、変換後の拡張子を指定しないと.htmlではなく.ejsとして吐き出されます。


```gulpfile.js
var gulp = require("gulp")
var ejs = require("gulp-ejs")

gulp.task("default", function() {
    gulp.src("./templates/*.ejs")
        .pipe(ejs({}, {}, {"ext": ".html"}))
        .pipe(gulp.dest("./dist"))
});
```



＊余談ですが
今回この変更に気づいた理由としては、業務中に新しく入ってきたメンバーの方にgulpでビルドしてもhtmlが吐き出されないという指摘を受けたことがキッカケでした。
というのもpackage.jsonにversionを指定しておらず、それぞれの開発環境で異なったversionのgulp-ejsが入ってしまっていたという...
基本的なことですがパッケージのバージョンは指定しておく必要がありますね
Bash on Ubuntu on WindowsでClangをビルドするまで

# 概要
　題名通りです。Windows 10(64bit)にClangをBash on Ubuntu on Windows(以下BUW)で入れました。
　以下はそのメモ書きです。

**警告：ただClangを使いたいだけの人はapt-getすればClang3.8まで入ります。以下の記述は自力ビルド用です**

# BUWを導入
これには次の記事を参照しました。
　[Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

- Windows 10がビルド1607・OSビルド14393.693だったせいか、「**ホスト名の明記**」の項目で見事に詰まりました
 - ただし「sudo: unable to resolve host」といった英字表記ではなく日本語表記でしたが……
 - これの解決には「[sudo: unable to resolve host が表示されたら](http://qiita.com/ogomr/items/89e19829eb8cc08fcebb)」を参照しました
 - **エラーメッセージが出ていてもコマンドが通っていることがある**ので確認を忘れずに
- 他のコマンドはつつがなく進行。wgetが素で使えるのがclang導入時に効いてきます

# clangを導入する前の準備
これには次の記事を参照しました。
　[Ubuntuでclangをビルドしてインストールする](https://www.tmp1024.com/tips/clang-install-ubuntu)

- 「`svn co`」でLLVMおよびClangのソースコードを落とします
 - この際、分量がデカいのと回線の細さから**猛烈に待たされる**ので注意しましょう
- 「`cmake -G "Unix Makefiles" ../llvm/ -DCMAKE_INSTALL_PREFIX=/xxxxx -DCMAKE_BUILD_TYPE=Release`」を叩く際、
 - 「cmakeのバージョンが古い(要約)」と怒られました。なので、次の記事を参考に、cmakeをアップデートしました
 - [Ubuntu に cmake を install する。](http://qiita.com/YutakakINJO/items/69f01d2abfb958ada88b)
 - ちなみに「/xxxxx」は言うまでもなくユーザーが自由に決めていいです。「/clang」でも「/0v0」でもお好きにどうぞ
 - **apt-get無能説**
- `make`した際のビルド時間ですが、Core i7-4790Kで`make -j5`した際に30分20秒掛かりました
 - もっと低スペのPCだとどうなるかは**お察しください**
- 最後に`make install`する際は、sudoを付けて`sudo make install`しないとエラーでclangが入りませんでした……

# インストールの仕上げ
以上でインストール作業は終わりです、お疲れ様でした。
環境変数のPATHを設定しないと次のように「コマンドが見つからない！」となりますので、
![image](https://qiita-image-store.s3.amazonaws.com/0/29802/4a594c82-3179-6434-8ea3-a518fd05ca97.png)
[`export PATH=$PATH:/xxxxx/bin`などとPATHを設定しましょう](http://pocketstudio.jp/linux/?%A5%D1%A5%B9(PATH)%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9)。
![image](https://qiita-image-store.s3.amazonaws.com/0/29802/4bfe2a6f-b6ab-b974-ed7d-c7f37993c9ec.png)
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part3

「データサイエンティストに必要な数理について」

※この投稿はシリーズものの一部です。
[part2](http://qiita.com/yuusei/items/f55cfe69d3fcf8b3ce1b) <-[part0](http://qiita.com/yuusei/items/49a63f4402afc66243e6)->[part4](http://qiita.com/yuusei/items/342fced5a45095172400)

どうも。Yuuseiと申します。
家の近所でアナリストとしてB2B周りの分析をしてるんですが、
本格的にデータサイエンティストと名乗るために自分の中で整理をつけようと思い、
重い腰を上げた次第です。

が、仕事とプライベートで色々と重なり、筆が進んでいない状態でした。

その間にも色々な記事や本を読み、改めてここの構成を考えた時に、
手法ツールのまとめも重要だが、その裏にある「モデルができた背景」を伝えていくほうが、
実は~~楽しいんじゃないか~~必要なんじゃないかと思いました。

と、いうのも、モデルや手法についての説明書はいっぱいあります。
「こう言うシーンではこれを使うんだよ」
「このモデルの使い方はこうだよ」

と言った実務ベースの本や、
「統計学概論」
「確率解析入門」

と言った専門書はあるんですが、
ぶっちゃけどれも**読んでて苦痛**なんだと思うんですよ。

僕みたいに確率や統計の理論側から実務に入ってきた人間は、
どちらも(難しいなぁと思いながらも)意味を見出しながら楽しめるんですが、
そう言うバックグラウンドのない方にしてみれば**ただただ苦痛なのかな**と。

何が足りないのかなぁ・・・

そう思った時に、多分数式から絵が描けない、つまりイメージが湧かない人が大半なのだろうな、
と言う仮説ができました。

なので、part1でも書いてた
「それに沿った形で後続のPartは手法やツール、概念の紹介にする流れにします。」を、
次のpar4から「数式からイメージを描く」を裏テーマとして実践していこうと思います。

今考えている、全体の章立てはこうです。

1章　記述統計の基本と基本的な確率分布 
    (平均/分散/標準偏差/共変動と相関/一様分布/ガウス分布  etc…)
2章　推計統計の基本と対応する確率分布
    (検定/推定/t分布/χ二乗分布/F分布 etc…)
3章　様々な確率分布
    (二項分布/ポアソン分布/負の二項分布/対数正規分布/指数分布/アーラン分布 etc…)
4章　確率過程を理解する為の基礎概念
    (確率空間/独立性/ルベーグ積分/大数の弱・強法則/フーリエ変換/中心極限定理 etc…)
5章　確率過程入門
    (ウィーナー過程/レヴィ過程/ガウス過程/マルコフ過程/MCMC etc…)
6章　確率的最適化入門
    (確率過程の入った待ち行列理論 / 確率的最適制御-動的計画法)

自分の専門が Operation Research である事と、
論文のテーマが Stochastic Optimal Control / Dynamic Programming (確率的最適制御/動的計画法)の隅っこにあったため、
できればここまでは書き切りたいと思います。

上記の章立てを見てわかると思いますが、
データサイエンティストがよく使う手法としてよく上がっている、
ランダムフォレスト/xgBoosting/ニューラルネットワークについては、特に語る予定がありません。

これらの手法は、基本的にあらゆるところで説明しているので、そちらに任せるとして、
このシリーズでは、より基本的なところ、かつ汎用性のある確率・統計に的を絞って、
なるべくブレずに書き切る事を目指します。
~~何より自分が移り気なので、書きたいものを絞らないと発散してしまうと言うのがあります~~
この辺の手法については、~~気が向いたら~~都度別エントリーを作って回収します。

仕事をしながらになるので、
繁忙期などでどうしても難しい時もあると思いますが、
だれないようにベンチマークを置いておこうと思います。

1〜4章までを2017年9月までに、5章を年内、6章を来年6月までに、
と言った感じのスパンで書いていく予定です。

それでは、この記事と同時に第1章を上げましたので、
そこからスタートとして、合わせてご笑覧ください。

第1章　[記述統計の基本と基本的な確率分布 〜1.1 確率関数と記述統計](http://qiita.com/yuusei/items/342fced5a45095172400)
brewでGitressをインストールする方法とglコマンドが使えない問題の解決策

#はじめに
Gitlessはgitの仕組みを簡単にするために作られたCUIツールです。

詳しくは[Gitless公式サイト(英語)](http://gitless.com/)または、[gitをシンプルでわかりやすくするツールGitlessの紹介[和訳]](http://qiita.com/Shitimi_613/items/8b25de2c586cc85737af)をご覧ください。

Gitlessのインストール方法はいくつかあるのですが、今回はHomebrewを利用してインストールします。
また、zshを使っている人はglコマンドが正しく実行できない可能性があるので、その場合は[こちら](#zsh)をご覧ください。

#環境
* macOS Sierra 10.12.3
* Homebrew 1.1.10
* zsh 5.2 (x86_64-apple-darwin15.2.0)

#インストール方法
1. Homebrewを更新して、formulaを最新版にする。*1
`$ brew update`

2. Gitlessをインストールする。
`$ brew install gitless`

3. インストール完了！

*1 `Error: The /usr/local directory is not writable.`と出て、アップデートできない場合、[brew update: /usr/local 権限周りの問題＝更新で解消](http://qiita.com/masa_36/items/a811c9335e2e985f6adc)を参考にしてください。

<a name="zsh"></a>
#gl initができない！
##問題
さっそくGitlessの練習用のフォルダを作り、`gl init`でリポジトリを作成しようとしたところ、次のエラーが発生しました。

```bash:zsh
$ gl init
fatal: Not a git repository (or any of the parent directories): .git
```

今からリポジトリを作るのに、"リポジトリ(.git)がない！"と怒られました。

##原因
しょうがないのでhelpを見ようと思い`gl -h`を実行したところ、次のメッセージがでました。

```bash:zsh
$ gl -h
usage: git pull [<options>] [<repository> [<refspec>...]]
.
.
.
```

どうやら`gl`は`git pull`を略したaliasとなっていたみたいですが、私は身に覚えがありません。
調べたところ、[zshが標準で設定していた](https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/git.plugin.zsh)みたいです。

> 170 alias gl='git pull'
*[git.plugin.zsh](https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/git.plugin.zsh)より引用*

##解決策
.zshrcにaliasを追加しましょう！

```bash:.zshrc
alias gl='gl'
```

もう一度`gl init`を実行してみます。

```bash:zsh
$ gl init
✔ Local repo created in /Users/hoge/foo
```

こんどこそインストール完了！
FirebaseでテーブルをJOINする


FirebaseでもRDBのようにテーブルをJOINしたい。そんなときは以下のように実装する。

```js
const ref = new Firebase('https://examples.firebaseio.com/');
ref.child('posts/12345').once('value', (postSnap) => {
   ref.child('users/' + postSnap.val().userId).once('value', (userSnap) => {
       console.log(postSnap.val());
       console.log(userSnap.val());
   });
});
```

`ref.child('posts/12345').once`でひとつの投稿をとってきて、その中で`posts`にはいっている`userId`を使って、該当する`user`を取得している。

では、投稿すべてを取得する時はどうするか？それは以下のようになる。

```js
const ref = new Firebase('https://examples.firebaseio.com/');
ref.child('posts').once('value', (postsSnap) => {
   postsSnap.forEach((postSnap) => {
     ref.child('users/' + postSnap.val().userId).once('value', (userSnap) => {
       console.log(postSnap.val());
       console.log(userSnap.val());
     });
   })
});
```

`ref.child('posts').once`で全投稿を取得し、投稿毎に該当する`user`を取得している。

RDB的に考えると、いわゆるn+1問題が心配になるかもしれない(実際懸念していた)。しかし、Firebaseはwebsocketを使っていて、何万ものリクエストをしない限り、この方法は極めて妥当な実装になるように設計されていると公式でもいっている。実際には、何万データもあったとしても、一度に取得することはないので、特に心配することはなさそうである。

以上、FirebaseでテーブルをJOINする方法でした。

### 参考

* [Firebase Realtime DBの実践投入するにあたって考えたこと - Qiita](http://qiita.com/1amageek/items/64bf85ec2cf1613cf507)
* [第6回　Firebaseデータベースの効率的なデータ構造と高速化のポイント：スマホアプリ開発を加速する，Firebaseを使ってみよう｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/firebase/0006)
* [The Firebase Blog: Queries, Part 1: Common SQL Queries Converted for Firebase](https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html#join)
* [Structuring Data - Firebase](https://www.firebase.com/docs/android/guide/structuring-data.html)
Androidの開発環境構築において、emulatorで躓いたところ

# emulatorの起動に失敗
```
Hax is enabled
Hax ram_size 0x60000000
HAX is working and emulator runs in fast virt mode.
emulator: Listening for console connections on port: 5554
Failed to sync vcpu reg
emulator: Serial number of this emulator (for ADB): emulator-5554
emulator: ERROR: Unfortunately, there's an incompatibility between HAXM hypervisor and VirtualBox 4.3.30+ which doesn't allow multiple hypervisors to co-exist.  It is being actively worked on; you can find out more about the issue at http://b.android.com/197915 (Android) and https://www.virtualbox.org/ticket/14294 (VirtualBox)
Failed to sync vcpu reg
Failed to sync vcpu reg
Internal error: initial hax sync failed
```

VirtualBoxとAndroidエミュレータは同時に起動ができないため、エミュレータの起動に失敗していた。
DockerでVirtualBoxを使っていたので、Dockerを落としてからEmulatorを起動。

<h2>ローカルサーバに接続に失敗</h2>
androidのエミュレータから127.0.0.1に接続すると、エミュレータ自身への接続となってしまい、ローカルサーバには接続ができない。
10.0.2.2に接続することで、ローカルサーバへの接続可能。
Railsのwebrickで立ち上げている場合(port: 3000)、
http://10.0.2.2:3000
で、アクセスする事が出来る。
Basic Operators - Comparison Operator


Swift は標準的なC言語の比較演算子を備えている。

* 等しい `a == b`
* 等しくない `a != b`
* より大きい `a > b`
* 未満 `a < b`
* 以上 `a >= b`
* 以下 `a <= b`

```
Swift はこれらのほか、2つの identity operators === と !== を備えている。
これは2つのオブジェクトが同じオブジェクトインスタンスを参照しているかどうかをテストするもの。
これについての詳細は *Classes and Structures* を参照すること。
```

それぞれの比較演算子はその文の真偽を表す Bool値 を返します。例としては、

```swift
1 == 1 // true, 1 と 1 は等しいため。
2 != 1 // true, 2 と 1 は等しくないため。
2 > 1 // true, 2 は 1 より大きいため。
1 < 2 // true, 1 は 2 未満のため。
1 >= 1 // true, 1 は 1 以上のため。
2 <= 1 // false, 2 は 1 以下ではないため。
```

比較演算子はよく if文 の条件判断に利用されます。

```swift

let name = "world"
if name == "world" {
     print("hello, world")
} else {
     print("not equal to \"world\"")
}
// name の値は "world" と等しいので "hello, world" がプリントされる。
```

if文 については *Control Flow* を参照すること。

また、同じ個数の値でそれらが同じ型であることを前提にタプルを比較することもできる。例えば、両方とも Int型、String型のタプルならば比較が可能。
それに対して、Bool型のタプルは比較できない。

タプルの比較は、値左側から1つずつ行われ、2つの値が等しくない判定を受けるまで続けられる。その2つの値が比較され、その比較結果がタプル全体の比較結果となる。もし全ての値が同じだった場合のみタプル同士等しいと判断される。

例えば：

```swift
(1, "zebra") < (2, "apple")
// true, 1は2未満のため。String型の値の比較は行われない。

(3, "apple") < (3, "bird")
// true, 3と3は等しく、"apple"は"bird"未満（abc順で先、という概念）のため。

(4, "dog") == (4, "dog")
// true, 4と4, "dog"と"dog" 両方が等しいため。
```

上記例から、値が左から順に比較されている様子が観れる。
1つ目の例でいうと、Int型の比較で 1 が 2未満のためタプル(1, "zebra") は (2, "apple") 未満と判定される。Int型で結果が出ているため、他のタプル内の比較結果は判定に影響しない。
もし、タプル内の1つ目の値が等しかった場合、2つ目の値は比較される。これは上記2つ目の例で確認できる。

```
Swiftのスタンダードライブラリでのタプル比較は、値個数が6個以下の場合のみ対応される。
もし7個以上の値を持つタプルを比較したい場合は比較演算子の実装が必要になる。
```
Vim修行　vimをおしゃれに着飾ろう

##対象者　
- atom sublimeに飽きてきた、遅いと感じる人
- 一緒にvim修行をやってくれる人
- 何事も形から入る人
- Vim×Railsで開発してる人

まだ、一週間しかVimやってないけど、結論から言うとVimの使いづらさは
**買ったばかりのMacと大差ない！！！！！！！**
設定しないから使いづらいんですよねー

設定してみたらめっちゃかっこよくなったし、
なによりカスタマイズしたAtomと同じ仕事をVimがやってくれましたよ。
覚えることは多いけど、覚えちゃえば楽だし早い！！！！
早い！！！！　早い！！
はず....
まだ不安があるので家ではVim縛り、仕事ではAtomに頼りっきりです...
再来週くらいにはAtomをアンインストールしてやるんだ...


#本題
#Vimちゃんにドレス着せちゃいました！

![スクリーンショット 2017-02-23 22.04.05.png](https://qiita-image-store.s3.amazonaws.com/0/141049/31cb31cc-4bf2-c573-a1a7-0577fe45680a.png)

もう醜い彼を見なくていい！！
背景透明、配色とかはiterm2で適当にできちゃいます！
https://github.com/kosukeKK/dotfiles
説明うんぬんは書いてあるので適当にダウンロードしてつかっちゃってください！
rails使ってない人はrailsなんとかってやつ消せばちょっとは軽くなると思います！
あとはこれ使って開発してたらどんどん作業効率上がっていいですね～

あれから一日触ってたらもっとおしゃれになりました！！！
ファイルアイコンがいかしてるねー
下のステータスバーなんかちょうかっこいい！！branch名まで書いてあるわい
![スクリーンショット 2017-02-24 21.04.47（2）.png](https://qiita-image-store.s3.amazonaws.com/0/141049/3f628508-76f5-e35e-99c3-1ad888390dbb.png)
Go言語のTemplateパッケージを使い作成したHTMLテンプレートでCSS等の静的ファイルをリンクさせる時の注意

# GoのTemplateパッケージを使い作成したHTMLテンプレートでCSS等の静的ファイルをリンクさせる時の注意
Goでtemplateパッケージを使用し、MVCなアプリを作成した時に、ちょっと引っかかったので、メモ<br>
Goでwebサーバを立て、Templateパッケージを使い作成したHTMLテンプレートを表示させたところ、HTMLテンプレートでリンクしたcssが適用されないという事態に陥った<br>

ダメなコードと、解決済みのコードを使ってメモする<br>

以下の簡単なパッケージ構成のコードを例にする<br>

``` 
sample
      |_resources <-以下に各種類別静的ファイル(今回はcssのみ)
      |         |_css
      |_view
      |    |_index.html(テンプレート)
      |_main.go
      
``` 

なお、HTMLテンプレートとCSSは以下を例にする<br>


index.html

``` html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>テスト</title>
    <link rel="stylesheet" type="text/css" href="../resources/css/index.css">
</head>

<body>
<p>名前:{{.Name}}</p>
<p>出身:{{.From}}</p>
</body>

</html>
```

index.css

``` css
p {
color:blue;
}
```


## HTMLのテンプレートにCSSが反映されないコード
以下のコードではHTMLのテンプレートにCSSが反映されない

``` go
package main

import (
	"fmt"
	"net/http"
	"html/template"
)

func main() {
	fmt.Println("The Server runs with http://localhost:8080/")

	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
}

type Person struct {
	Name string
	From string
}

func Handler(w http.ResponseWriter, r *http.Request) {

	p := Person{
		Name:"sekky",
		From : "埼玉",
	}

	tmpl := template.Must(template.ParseFiles("./view/index.html"))
	tmpl.Execute(w, p)
} 
```

## HTMLのテンプレートにCSSが反映されるコード

以下のコードでは、HTMLのテンプレートにCSSが反映される

``` go
package main

import (
	"fmt"
	"net/http"
	"html/template"
)

func main() {
	fmt.Println("The Server runs with http://localhost:8080/")
	// ここで静的ファイルであるCSSを適用
	// Handler : 第一引数で与えたパターンに対して、第二引数Handlerを登録
	// StripPrefix : 第一引数で与えたURLのパスを取り除いて、第二引数Handlerを発動させる
	// FileServer : 、HTTPリクエストに対して、第一引数のrootを起点とするファイルシステムのコンテンツを返すハンドラを返す
	// ここでいうrootは、resources

	// つまり、resourcesディレクトリ以下の静的ファイル(ここでいうcss/index.css)を探して返す
	http.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir("resources/"))))
	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
}

type Person struct {
	Name string
	From string
}

func Handler(w http.ResponseWriter, r *http.Request) {

	p := Person{
		Name:"sekky",
		From : "埼玉",
	}

	tmpl := template.Must(template.ParseFiles("./view/index.html"))
	tmpl.Execute(w, p)
}
```

## どこが違うのか
HTMLのテンプレートにCSSが反映されるコードと反映されないコードは、以下の1行が存在するかしないかの差

``` go 
http.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir("resources/"))))
``` 

## この一行で何をやっているのか
使用しているhttpパッケージの各メソッドの説明はコード内のコメントに記載したが、ざっくり言うとあるディレクトリを指定して、そのディレクトリから静的ファイル（ここでいうcssファイル）をレスポンスするようにハンドリングしている

個々のメソッドについては、公式のドキュメントを見るとわかりやすい
https://golang.org/pkg/net/http/

## 参考にさせていただいたサイト
http://stackoverflow.com/questions/13302020/rendering-css-in-a-go-web-application
https://golang.org/pkg/net/http/

※ ブログでも同一記事を投稿している
http://www.sekky0905.com/entry/2017/02/23/_Go%E8%A8%80%E8%AA%9E%E3%81%AETemplate%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%BF%E3%81%84%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9FHTML%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88
Scala入門　-目次-

Scala入門の記事です。他の入門記事と差別化を図るため、この入門記事での方針を定めておこうと思います。

- 文法の説明はしません
- 1つの記事に覚えるべきエッセンスは、1つか2だけ
- 既存言語との比較を取り入れる

文法を網羅的に勉強していくような記事は書きません。もちろんある程度記事に載せるコードを読むための文法は最低限しますが、そのような記事や書籍は多く存在するので、そちらにおまかせします。

1つの記事辺りに覚えるべきエッセンスは少なく抑えます。それよりも覚えたことが、どのようなことに使えるか、どれほど重要かを重視して書いていきたいと思っています。

基本的には、プログラミング初心者というよりも既にオブジェクト指向言語を触っている方を対象にしたいと思っています。既存の使っている言語からScalaにシフトしてみたい！と思ってもらえたら幸いです。比較対象としては、主にJavaを取り上げると思います。

- [0 -環境構築-](http://qiita.com/ababup1192/items/7515509fcc1711a9fc17)

- [1 -式と値-](http://qiita.com/ababup1192/items/0637275a7cd041f7ccd1)
PerfectCURL が swift buildで落ちる問題

##　問題　
ServerSideSwiftのPerfectででサンプル動かそうとしたらbuildで落ちる

https://github.com/PerfectExamples/Perfect-Turnstile-MySQL-Demo

```bash
<unknown>:0: error: could not build Objective-C module 'Foundation'
<unknown>:0: error: build had 1 command failures
error: exit(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/tantakan/src/github.com/PerfectExamples/Perfect-Turnstile-MySQL-Demo/.build/debug.yaml
```
とか

https://github.com/PerfectExamples/Perfect-ToDo-iOS-Demo

```bash
<unknown>:0: error: could not build Objective-C module 'Foundation'
<unknown>:0: error: build had 1 command failures
error: exit(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/tantakan/src/github.com/PerfectExamples/Perfect-ToDo-iOS-Demo/.build/debug.yaml
```

とか、PerfectCURLを使ってるものが落ちる

## 解決策

```bash
$ brew uninstall pkg-config
$ swift build
```
これで解決
ちなみにこれっぽい
https://bugs.swift.org/browse/SR-3129
つまり、pkg-configをbrewで入れてるとダメっぽい
Illustratorで、選択画像のマスクサイズでオブジェクトを作るAppleScript

要求を勘違いしてたけど、せっかく書いたので公開


表題の通り、Illustrator用のAppleScriptです。
選択した画像にマスクがあるなら、そのサイズでグレーの塗りのオブジェクトをつくります。
マスクがない場合はなにもしません。

回転には対応していません





```AppleScript

tell application "Adobe Illustrator"
	
	tell document 1
		set selectList to selection
		
		if selectList is not 0 then
			repeat with theItem in selectList
				
				my getPathItem(theItem)
				
			end repeat
		end if
	end tell
end tell


on getPathItem(selObj)
	tell application "Adobe Illustrator"
		if class of selObj is group item then
			set myCount to count page items of selObj
			repeat with N from 1 to myCount
				my getPathItem(page item N of selObj)
			end repeat
		else if class of selObj is path item then
			
			my newRectangle(selObj)
			
		end if
	end tell
end getPathItem


on newRectangle(selObj)
	tell application "Adobe Illustrator"
		tell document 1
			
			tell selObj
				
				set geoBounds to geometric bounds
				
			end tell
			
			make new rectangle at beginning with properties {bounds:geoBounds, fill color:{cyan:0, magenta:0, yellow:0, black:30}}
			
		end tell
	end tell
end newRectangle

```

参考にしたサイト[たけうちとおるのスクリプトノート](http://www.adg7.com/takenote_b/applescriptillustrator/00illustrator/)
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part4

1章　記述統計の基本と基本的な確率分布 〜1.1 確率関数と記述統計

※この投稿はシリーズものの一部です。
[part3](http://qiita.com/yuusei/items/25e606fe6961efd21794) <-[part0](http://qiita.com/yuusei/items/49a63f4402afc66243e6)->[part5](http://qiita.com/yuusei/items/1b8e90899a8497d54759)

注意)このエントリは下記の章立てたシリーズの最初のエントリとなります。
	これらのエントリは数式を理解する為に絵が多く入っています。
　　 ただし、当然数式も多く入っている為、あまり耐性のない方は無理をせず閉じていただければと思います。

1章　記述統計の基本と基本的な確率分布 
(平均/分散/標準偏差/共変動と相関/一様分布/ガウス分布  etc…)
2章　推計統計の基本と対応する確率分布 
(検定/推定/t分布/χ二乗分布/F分布 etc…)
3章　様々な確率分布 
(二項分布/ポアソン分布/負の二項分布/対数正規分布/指数分布/アーラン分布/ガンマ分布 etc…)
4章　確率過程を理解する為の基礎概念 
(確率空間/独立性/ルベーグ積分/大数の弱・強法則/フーリエ変換/中心極限定理 etc…)
5章　確率過程入門 
(ウィーナー過程/レヴィ過程/ガウス過程/マルコフ過程/MCMC etc…)
6章　確率的最適化入門 
(確率過程の入った待ち行列理論 / 確率的最適制御-動的計画法)

それでは始めます。

#1章　記述統計の基本と基本的な確率分布 
この章の目標は、平均や分散、標準偏差などを3次元までのレベルで絵を記載して理解できるようにするのが目標です。
著者の好みでわけのわからないこだわりが入る場合がありますが、なるべくわかりやすく書いていきたいと思います。

##1.1 確率関数と記述統計
この節では、まず確率関数の定義を示し、続けてその定義を基にして、平均や分散、標準偏差や相関を絵にして
説明していきたいと思います。

###1.1.1 確率関数(離散-連続)
離散の世界での確率関数の定義は下記のようになります。

$\forall x \in \mathbb {R}$ なる $x$ に対して、
(翻訳：整数の集合$\mathbb {Z}$ = {$\cdots , -2, -1, 0, 1, 2, \cdots$ } に含まれるどんな$x$を選んでも)
確率関数 ${\rm P}(x)$を下記で定義します。

```math
\begin{eqnarray}
	{\rm P} (x) & \geq &  0 & ,  \\
	\sum_{x \in \mathbb{Z}} {\rm P} (x)& = &  1 & .  
\end{eqnarray}
```
これが定義で、直感的に絵を描くと、

<img width="578" alt="1.1.1離散ヒストグラム.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/60769a9b-963b-d42f-e4ca-1a15bfdbfc31.png">


です。範囲はとりあえず $-4\leq x \leq 4$ 左右対称にしているのは、わかりやすくする以上の意味はありません。
また、連続の世界では確率関数の定義は下記のようになり、
名前が「確率密度関数」に変わります。

$\forall x \in \mathbb {Z}$ なる $x$ に対して、
(翻訳：実数の集合$\mathbb {R}$ = {-$\infty,  \cdots , \cdots, +\infty$} に含まれるどんな$x$を選んでも)
確率関数 $p(x)$を下記で定義します。

```math
\begin{eqnarray}
	p(x) & \geq &  0 & ,  \\
	\int_{- \infty}^{\infty} p(x)& = &  1 & .  
\end{eqnarray}
```

これで絵を描くと

<img width="535" alt="1.1.1_ProbabilityDencityFunction.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/fad8f037-ceaf-f165-bddb-f6870d0a53bf.png">

です。範囲はやっぱりとりあえず $-4\leq x \leq 4$ で正規分布で表現しています。

**離散と連続で何が違うかと言うことが理解できれば、
記述統計と推計統計がまた違った目で見えてきます。**

数式上は色々違いがあるように見えますが、
根本的には**「整数値の集合を対象にする」**か**「連続値の集合を対象にする」** かの違いだけです。

少しだけ数学語っぽく表現すると、

整数値の集合=個数は無限にあるけど、並べて数えるのできる量だけしかない数の集合
実数値の集合=個数は無限にあるし、並べて数える事もできない量がある数の集合
(※いわゆる可算無限集合か非可算無限集合かって事です)

数えられるか数えられないかの違いなわけですが、
この違いはどこから来るかと言うと、
「ちょちょぎれている」か「切れ目なく繋がっている」かの違いです。
これを「非連続」、「連続」と表現するわけです。

整数は「非連続」であり「数えられます」。
実数は「連続」であり「数えられません」。

自分はこれが記述統計学と推計統計学の違いであると思っています。

記述統計 = 非連続な実世界のデータの特徴を調べる作業
推計統計 = 非連続な実世界のデータを基にして、連続の世界でも同じ傾向が観察されるか調べる作業

これが自分なりの基準になります。
一般的な推計統計は「サンプルの集団から母集団の傾向を調べる道具」と言う認識があるようですが、
自分は「推計統計で母集団と思っているものも実はもっと大きい集合のサンプル集合」であり、
本当の値を推計するなら、数えないくらい多い(つまり連続値で表せる)データが必要になると言う考え方です。

なので、推計統計の特に仮説検定が「母集団が特定の分布に従っているかの検定」をしている観点から、
(手元にあるのは非連続なデータだけど)実際は非連続な世界を扱っていると考えています。

この非連続=離散から連続へ発想がジャンプした時、
第5章に予定している確率過程が扱われる様になります。
ですが、考え方として扱える様になるのと、
数学的な理論として扱える様になるのは天と地ほどの難易度の差があります。

なので、4章でその準備をしますが、
今回と同じく、あまり難しくするのは避けて、
理論を定義や公理から証明すると言うのは専門書に任せ、
絵を描きながら、どうしてその公理が必要なのかなどの背景を説明していければな、
そう思っています。

それでは、この辺で。今回は終わりにします。
次回は　1.1.2 同時確率　を予定しています。
平均や分散が出て来るのは 1.1.3.の予定です。

part5投稿しました->[1.1.2 同時確率(離散)](http://qiita.com/yuusei/items/1b8e90899a8497d54759)
Basic Operators - Compound Assignment Operator


Swift はいくつかの *複合代入演算子 compound assignment operators* を備えている。
そのうちの1つ *加入代入演算子 addition assignment operator +=* がよく使われる。

```swift
var a = 1
a += 2
// これは a = a + 2 と同意で、a の値は 3 になる。
```

```
注意
加入代入演算子は値を返さない。そのため
let b = a += 2
はエラーになる。
```

そのほかの複合代入演算子については *Swift Standard Library Operators Reference* を参考にすること。
Goでコンストラクタ

# Goでコンストラクタ

オブジェクト指向の言語でよく用いられるコンストラクタ<br>
Goでもそのコンストラクタを書くことが可能だということで書いてみた

``` go
import "fmt"

type Language struct {
     Name     string
     LangType string
}

// コンストラクタ
// 戻り値として返すのは、構造体のポイントであることに注意
func NewLanguage(name string, langType string) *Language {
     // コンストラクタの関数内で、構造体をnew
     l := new(Language)
     // 以下、構造体の各フィールドを引数で受け取った値に設定
     l.Name = name
     l.LangType = langType
     // 構造体のインスタンスを返す
     return l
}

func main() {
     l := NewLanguage("Go", "Static")
     fmt.Println("名前" + l.Name)
     fmt.Println("言語" + l.LangType)
}
```

## 注意点
1. コンストラクタ内で、対象の構造体をnewする
2. フィールドを設定した構造体を戻り値として返す 


## 他の言語では...
ちなみにTypeScriptのコンストラクタはこんな感じなので、だいぶ違う<br>

``` js
class Language { 
    constructor(
    private _name: string,
    private _langType: string) {}

    get name(): string {
        return this._name;
    }

    get langType(): string{ 
        return this._langType;
    }
}

var lang = new Language('TypeScript', 'Static');
console.log(`名前:${lang.name}`);
console.log(`名前:${lang.langType}`); 

```

## 参考文献
* 松尾 愛賀　(2016/4/15)『スターティングGo言語』 翔泳社

※ ブログでも同一記事を書いている
http://www.sekky0905.com/entry/2017/02/23/Go%E3%81%A7%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF
オフラインリアルタイムどう書くE10の解答


rubyでオフラインリアルタイムどう書くE10の問題を解きました。
1時間の時点で方針は決まっていましたが、
バグが見つけられずに結局3時間ぐらいかかりました。

white 白のエリア数
black 黒のエリア数
round_black 外周に接している黒のエリア数
center_black 中央にある黒のエリア数
corner_black 四隅にある黒のエリア数
を更新して計算しています。

``` count_white.rb
def process(input)
  input.split('').inject( [ 0, 1, 1, 1, 1, ' ', ] ) { |state, m|
    (white, black, round_black, center_black, corner_black, prev_m) = state
    case prev_m + m
    when ' X'
      [ 5, 4, 4, 0, 0, m, ]
    when ' O'
      [ 4, 5, 4, 1, 4, m, ]
    when 'XX'
      [ 1 + black, black * 4, round_black, 0, 0, m, ]
    when 'OX'
      [ 1 + black + corner_black, black * 4, round_black + corner_black, 0, 0, m, ]
    when 'XO'
      [ white + round_black, black * 5, round_black * 2, center_black, corner_black, m, ]
    when 'OO'
      [ white + round_black + corner_black, black * 5, round_black * 2 + corner_black, center_black, corner_black, m, ]
    end
  }[0].to_s
end

def test(input, answer)
  result = process(input)
  if result != answer then
    puts 'NG: input = %s, answer = %s, result = %s' % [ input, answer, result, ]
    exit 1
  else
    puts 'OK: input = %s' % [ input, ]
  end
end

test("X", "5")
test("O", "4")
test("XX", "5")
test("OX", "10")
test("XO", "9")
test("XOO", "17")
test("OXX", "21")
test("OXO", "18")
test("OOOX", "130")
test("OXXO", "29")
test("XXOX", "81")
test("XOXXO", "89")
test("OOOOX", "630")
test("OXOOO", "66")
test("OXOXOX", "2001")
test("OXOXXO", "417")
test("OXXOXX", "1601")
test("XXXOXOO", "345")
test("OOOOOXO", "3258")
test("OXXOXXX", "6401")
```
rspec multipleなselect boxをテストする

multipleなselect boxのテストはどうやるのかという話
例えばこんな複数選択可能なセレクトボックスがあったとして
複数選択についての検証をどうするか

```
= select_tag 'hoge_form', options_for_select(@form.selectables), multiple: true
```

セレクトボックス内の候補がちゃんと入っているかを検証したい場合は
have_selectの場合は配列で指定してあげればOK

```
given(:menu1) { 'ラーメン' }
given(:menu2) { 'カレー' }
scenario '選択の対象がセレクトボックス内にあること' do
  expect(page).to have_select('hoge_form', options: [menu1, menu2])
end
```

セレクトボックス内で複数の項目が選択されていることを検証する場合も
配列で指定してあげればチェックができる

```
scenario '選択されていること' do
  expect(page).to have_select('hoge_form', selected: [menu1, menu2])
end
```
Ubuntu16.04LTS、Pure Data0.47.1-3環境でJackを有効化する

PulseAudioとJackを共存させつつエラーをなくすためにやったことをメモしていきます。

まずJackをインストールします。

`sudo apt-get install qjackctl`


次にPulseAudioとJackを連携させるモジュールをインストールします。

`sudo apt-get install pulseaudio-module-jack `


Jack起動時にモジュールが自動で有効化されるようにJackのセッティングを行います

ターミナル内で

`qjackctl`

でJackを起動

設定を開き、オプションタブ内のスクリプトで

スタートアップ後にスクリプトを実行にチェックを入れ

右のボックス内に

`pacmd load-module module-jack-source channels=2; pacmd load-module module-jack-sink channels=2;`

を入力

PulseAudioでSinkやSourceとClientを自由に接続できるユーティリティである、PulseAudio Volume Controlを導入します。

sudo apt-get install pavucontrol

Jackのリアルタイムスケジューリングを有効化させるために現在のユーザーをaudioグループに追加する必要があります。

`sudo usermod -aG audio <ユーザー名>`

再起動して完了です。


実際にPure DataでJackを用いる際は

`qjackctl`

開始を押し

Pure Dataを起動

`pd`

MediaタブでJackを選択
ターミナルでAWS操作が楽になるスクリプト

## 便利スクリプト2つ

https://github.com/tilfin/homebrew-aws で公開しています。

* [ec2ssh](https://github.com/tilfin/homebrew-aws#ec2ssh) - EC2インスタンス一覧を表示して番号選択してSSHできるスクリプト
* [swrole](https://github.com/tilfin/homebrew-aws#swrole) - AssumeRoleを使ってターミナル上でプロファイルをスイッチできるスクリプト


## インストール方法

homebrew 経由でインストールできます。

```
$ brew tap tilfin/aws
$ brew install ec2ssh
$ brew install swrole
```

## ec2ssh

AWSアカウント内（プロファイル）に所属する EC2 インスタンス一覧から選択して SSH することができます。

![ec2ssh_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/8924/4afdb8ba-9acf-b1dc-231f-18809587a964.png)

## swrole

AWSアカウントを開発とステージング、本番環境のように複数使っていると、aws コマンドで毎回 `--profile <xxx>` と指定するのが面倒だったりします。また `AWS_PROFILE` 環境変数に対応していない SDK やコマンドもあったりします。
`swrole` コマンドは、引数で指定したプロファイルに AssumeRole を使ってクレデンシャルを発行し、AWS の環境変数を export した状態の bash を呼び出します。

![swrole_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/8924/e34989f2-5b97-5b07-872b-c7abbfe50184.png)
Haskell GHCのソースコードレビューを見ることができます

【追記】(2019/1/20)
=====================

2019/1/20時点で、この記事の内容は古くなっています。
2018年末に、GHC開発におけるソースコードレビューの手続きは、PhabricatorではなくGitLabを用いて行うように変更されました。

新しいソースコードレビューの手順などについては、こちらを参照してください。
「[GHC(Haskell)の上流リポジトリ等がGitLabに移行しました](https://qiita.com/takenobu-hs/items/a2eeb327088bb1d2fe77#%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E9%80%81%E4%BB%98merge-request%E3%81%8A%E3%82%88%E3%81%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)」

以下は、追記前のオリジナルの記事です。
（過去の情報として、この記事も削除しないで残しておきます。）


はじめに
=======

HaskellのコンパイラであるGHCについて、開発で使用されているコードレビューの環境について簡単に記載します。



Phabricator
===========

Phabricatorは、コードレビューや継続的インテグレーションなどを行うための、Web強調型のソフト開発ツールです。
現在は、[phacility](https://www.phacility.com/)が主体となってメンテナンスされています。



GHCのコードレビュー環境
=====================

現在、GHCの開発では、Phabricatorの**differential**機能を使用して、コードレビューが行なわれています。
コードレビューの状況は、Phabricatorのアカウントを持っていないユーザーでも参照することができます。

以下のURLによって、Phabricatorのdifferentialのページへアクセスできます。

* https://phabricator.haskell.org/differential/


各々の`Dxxxx`ごとのリンクから、それぞれのコードレビューの内容を参照することが出来ます。
各ファイルについて変更前後の箇所や、議論の状況を参照できます。
これによって、それぞれのバグ修正や、機能の追加をどのように行ったかを知ることができます。




補足
=========

### Phabricatorでのコードレビュー依頼

Phabricatorのdifferentialでは、参照だけではなくコードレビューを依頼することが出来ます。
コードレビューを依頼する手順は、以下の公式情報が参考になります。

- [Using Phabricator for GHC development](https://ghc.haskell.org/trac/ghc/wiki/Phabricator)

Phabricatorでのパッチの送信例が、以下で詳しく解説されています。（追記）

- [Contributing to GHC　via Phabricator](https://medium.com/@zw3rk/contributing-to-ghc-290653b63147)

### GHC開発の中でのPhabricatorの位置づけ

GHC開発の中でのPhabricatorの位置づけについては、以下の資料もどうぞ。

- [GHC development flow](https://takenobu-hs.github.io/downloads/ghc_development_flow.pdf#page=11)

### 追記：

GHCへのパッチ送付とソースコードレビューの手順については、以下の記事もどうぞ。

- [GHCへの変更提案とパッチ送付の手順例](https://haskell.jp/blog/posts/2018/ghc-proposal-and-patch.html)

以上です。
ネストした関数定義のユースケース

変数`x`の型が`y`でないとエラーとなる関数`is_y(x)`を、次のように複数の型に対して作成するための関数`is_type_factory`の実装方法のメモです。

```py:config.py
is_int = is_type_factory(int)
is_bool = is_type_factory(bool)
is_float = is_type_factory(float)
is_str = is_type_factory(str)
is_unicode = is_type_factory(compat.text_type)
is_text = is_instance_factory((str, bytes))
```

[pandas]
(https://github.com/pandas-dev/pandas/blob/master/pandas/core/config.py)のソースで見かけました。

関数定義のネストはこういう風に使うのかという例です。`is_type_factory`に渡された引数`_type`は、返される関数オブジェクト`inner`の中では静的な変数の役割をしています。



```py:config.py
def is_type_factory(_type):
    """

    Parameters
    ----------
    `_type` - a type to be compared against (e.g. type(x) == `_type`)

    Returns
    -------
    validator - a function of a single argument x , which returns the
                True if type(x) is equal to `_type`

    """

    def inner(x):
        if type(x) != _type:
            raise ValueError("Value must have type '%s'" % str(_type))

    return inner
PillowのModeFilterを使って写真を絵画調にする

pillowの`ImageFilter.ModeFilter`の有効な使い方がわかったので、それを使って絵画調フィルタを作ります。
numpyなどは使いません、pillowのみです。

#### 元画像
![mono.jpg](https://qiita-image-store.s3.amazonaws.com/0/140075/7287220f-c4ea-8848-5e37-a6296fcb14e8.jpeg) 

#### 変換後

![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/140075/f42cc17c-6306-34ad-c8f8-8f4e5cdbc433.png)

ソースはこれだけです。

```python
from PIL import Image, ImageChops, ImageOps, ImageFilter

img = Image.open("test.jpeg")
qant_img = img.quantize(8, kmeans=True).convert("RGB")

t = qant_img
t = t.filter(ImageFilter.ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(5))
t = t.filter(ImageFilter.ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(1))
color_img = t.convert("RGB")

gray = img.convert("L")
gray2 = gray.filter(ImageFilter.MaxFilter(5))
line_inv = ImageChops.difference(gray, gray2)
line_img = ImageOps.invert(line_inv).convert("RGB")

ImageChops.multiply(color_img, line_img)
```
##### 2017/02/24 ソースにエラーがあったので修正しました

# 解説
## 減色する

まず、色数が多いと絵画調になりにくいので減色します、減色は`Image.quantize`を使います。
色数は何色でも良いのですが、色数が少ないほどベタ塗りになります、ここではkmeans法を使って8色に減色します。
色数が多い画像は、16〜32色にしたほうがいいかもしれません。

```python
qant_img = img.quantize(8, kmeans=True).convert("RGB")
```

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/140075/8b586df5-8189-58d8-922a-514cfa381db8.png)


## 塗り画像を作る
`ImageFilter.ModeFilter`は、今までいまいち使い方が不明でしたが、かけると色が単調化します。
カーネルウインドウの中の最頻値を選択する畳込み演算をするので、色の領域が広がっていきます。

```python
t = qant_img.filter(ImageFilter.ModeFilter(12))
```

![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/140075/1e056b71-745c-5b37-2a78-9db0551d395d.png)

絵画っぽくなってきましたね。

### ガウシアンブラーと単調化を交互に繰り返す

今回は「にじみ」を表現したいので、更にガウシアンブラーをかけて再び単調化します。
「単調化→ガウシアンブラー」を繰り返していくと、画像がどんどんにじんでいきます。
最後に、少しぼかした感じにしたいので軽くガウシアンブラーをかけます。

```python
t = t.filter(ImageFilter.GaussianBlur(5))
t = t.filter(ModeFilter(12))
t = t.filter(ImageFilter.GaussianBlur(1))
```

![ダウンロード (2).png](https://qiita-image-store.s3.amazonaws.com/0/140075/20aa88da-f099-e4de-8f48-ae707bb1e3ae.png)

もっとにじみを出したい場合は「単調化→ガウシアンブラー」をもっと繰り返しますが、今回はこれくらいで良いでしょう。

## 線画をつくる

最後に元画像から線画を作成します、アルゴリズムは[こちら](http://www.mathgram.xyz/entry/cv/contour)を参考にしました。
この方法は単純ながら、非常に綺麗な線画を生成できるのでお薦めします。

```python
gray = img.convert("L")
gray2 = gray.filter(ImageFilter.MaxFilter(5))
line_inv = ImageChops.difference(gray, gray2)
line_img = ImageOps.invert(line_inv).convert("RGB")
```
![ダウンロード (3).png](https://qiita-image-store.s3.amazonaws.com/0/140075/92bf5335-4dd8-28d5-9d9e-8b7731d3f19d.png)

## 塗り画像と線画を合成する

最後にこの２つを合成すれば完成です。

```python
ImageChops.multiply(color_img, line_img)
```

![ダウンロード (4).png](https://qiita-image-store.s3.amazonaws.com/0/140075/fa8b8fd5-9e4c-caa3-9563-192b6318749b.png)

# まとめ

もう少しパラメータを調整すれば、もっと綺麗な表現ができるかもしれません。
`ImageFilter.ModeFilter`とガウシアンブラーの組み合わせで「にじみ」が出てくるので、何かと使えるかと思います。

やはり、パラメータ調整は必要で`ImageFilter.ModeFilter`の値を5くらいにすると「にじみ」がやわらかくなります。

![ダウンロード (8).png](https://qiita-image-store.s3.amazonaws.com/0/140075/b820855d-676c-e166-20f7-8d768a2394a5.png)
Svelteを使ってみた

[JavaScriptはフレームワークについて考え直すときが来ています](de6d3d3fd32dfd1c4672) / [Svelteを使ってみた](c650136538d9f2f05a35)


今回はJavaScriptのノンフレームワーク、[Svelte](https://github.com/sveltejs/svelte)を紹介しましょう。

## また新FWかよ、もういいよ。

まあそう言わずにちょっと見てってくださいよ。
何しろあの[Front-End Developer Handbook 2017](https://frontendmasters.gitbooks.io/front-end-handbook-2017/content/2017.html)でも今後伸びるって言われてますよ、これは今後も期待大ですよ！？

## これまでのFWと何が違う？

[JavaScriptはフレームワークについて考え直すときが来ています](http://qiita.com/rana_kualu/items/de6d3d3fd32dfd1c4672)になんとなく書いてあるけど、トランスパイラで変換した後のJavaScriptがフレームワークを読み込む必要がないというのが特徴です。
とりあえずHelloWorldしてみましょう。

## Svelteをインストール

> npm install -g svelte-cli

npmについては[別記事](http://qiita.com/taipon_rock/items/9001ae194571feb63a5e)などを参照。
最近のはWindowsでも普通に動くから楽でいいね。

## ソース

```index.html
<!DOCTYPE html>
<html lang="ja">
<body>
  <main></main>
  <script src="MyApp.js"></script>
  <script>
    new MyApp({
        target: document.querySelector('main'),
        data: { name: 'world' }
    });
  </script>
</body>
</html>

```

```MyApp.svelte
<h1>Hello {{name}}!</h1>
```


## コンパイル

> cd `MyApp.svelteのディレクトリ`
> svelte compile --format iife MyApp.svelte > MyApp.js

`MyApp.js`というファイルが出力されます。

## 表示

index.htmlにアクセスすると、「Hello world!」が表示されるはずです。

index.htmlは`MyApp.js`を呼んでるだけで、重量級のライブラリをインポートしたりといったことは全くしていません。

`MyApp.js`には、`MyApp.svelte`のコンパイル結果が入っています。
1行だったソースが200行弱に増えているのですが、中身はcreateElementとかappendChildとかの、素のJavaScriptです。
こちらも外部ライブラリを呼び出したりはしていません。


# 感想

フロントエンド開発者に恩恵をもたらすというより、どちらかというと閲覧者側へのメリットが多いと感じた。
何しろ出力が素のJavaScriptだから軽い。

あとライブラリを使う場合に、jQueryを先に読み込んで次にこれを、みたいな面倒な順序を考えないでいいのは楽そう。