OmniAICreator/Qiita-1.07M huggingface dataset:
python3と科学計算ライブラリ周りをUbuntuにインストール(virtualenv+pip)

#Installing python3 on Ubuntu

入れた履歴。
入れたライブラリは、numpy,scipy,matplotlib,seaborn,jupyter等である。主にvirtualenv上でpipでインストールした。
他にaptで入れる方法や、anacondaで入れてしまう方法があるようだ。（そちらのほうが安定していそう。）

>追記：2016/09/26
Anacondaの方が管理が楽で、作られるパッケージもanacondaに対応したものが出るなど、デファクトになっているようです。なので以下に書いてある方法はあまりおすすめしない方法になります。


```
# なんか入れる.
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y install build-essential
sudo apt-get -y install python3-dev
python -V
python3 -V

#pythonと打つとpython3になるようにする。(追記：バグの原因になるのでやらないほうがいいようだ)
#echo alias python=python3 >> ~/.bash_aliases
#source ~/.bash_aliases
#python -V


# pipを入れる。
sudo apt-get install python3-setuptools
sudo easy_install3 pip
# pip の場所がpython3になっているか確認する。
pip -V
# 現在入っているもの
pip list


#virtualenvを入れる
sudo pip install virtualenv


#projectディレクトリを作る
mkdir ./projectPath
cd ./projectPath


#環境を作って起動
virtualenv venv
source venv/bin/activate


#gitignoreに加える
#echo venv >> .gitignore

#確認
pip list


#以下はpipを使っていろいろ入れてみる。
#numpyを入れる。
pip install numpy


#scipyを入れる。fortranコンパイラがいる。
sudo apt-get install libatlas-base-dev gfortran
pip install scipy


#matplotlib,seabornを入れる。freetypeがいる。
sudo apt-get install libpng-dev
sudo apt-get install libfreetype6-dev
pip install matplotlib
pip install seaborn
#以下は必要ないかも。matplotlibで、qt4とpysideを使う場合。
sudo apt-get install qt-sdk
sudo apt-get install cmake
sudo pip install pyside
#matplotlibの設定ファイルに書き込む
vim ~/.config/matplotlib/matplotlibrc
#backend     : qt4agg
#backend.qt4 : PySide


#Jupyter
pip install jupyter


#testライブラリ
pip install nose


#その他
pip install quandl
pip install scikit-learn



#書き出しておく
pip freeze > requirements.txt

#仮想環境から抜ける。
deactivate

```

サンプルコードを書いてみる。

```test.py
import numpy as np
import pandas as pd
import seaborn as sns

x = np.random.normal(size=100)
sns.distplot(x, kde=False, rug=False, bins=10)

```
seaborn君import時にerror吐く、けどipython上だと吐きながら動く。

#ipython
対話環境の強化版らしい。
以下は気づいたことを箇条書きで。
マジックコマンド等は?をつけると説明が読める。（例:#run?)


###グラフ描画時に別ウィンドウでグラフが出るようにする。
自分の環境だとなんかqtいれて指定しないといけなかった。普通だとmatplotlib inlineでいけるっぽいです。

```
%matplotlib qt4
```

###ipython起動時に指定する。

```
ipython --matplotlib qt4
```

###fileのロード

```
%load filename.py
```

###fileをロードじて実行

```
%run filename.py
```

###fileに書き込む

```
%%writefile filename.py
...
```
コマンド後書いたものでfileを上書きする

###履歴表示
```
%history -n
```

```
%history -n range 2-3
```

###どこかの行をfileに書き込む

```
%save -a filename.py 2
```
上ではhistory番号を指定して保存している。In[n]、Out[n]のような指定も出来る。
-aオプションで上書きじゃなく追記になる。

###変数の値を書き出す

```
%store foo >> a.txt
```

#jupyter(旧iPython Notebook)
ブラウザエディタの科学計算用のwordみたいな感じ。ipythonをコアにしている。
iPythonからNotebookを切り出したもので、pythonに限らずrubyやhaskellのnotebook（.ipynb）も扱える。
サーバにもなる。
##notebookを編集する使い方。

```
jupyter notebook
```
で起動

右上のnewからpython3を選べば、新しいnotebookを作れる。

行単位で編集していく。左上のプラスで新しい行を作れる。
行の種類は、code,markdown,とか。右上から選べる。

codeを書いた場合は、ctrl+enterを押すと実行され、結果が画面にでる。

グラフを表示する場合は、

```
%matplotlib inline
```
を実行する.
Active Directory Service Interface(ADSI)を使用したプライマリグループの変更

ADSIを使用して任意のユーザーのプライマリグループを変更する方法を以下に記載します。

```ps1
$primaryGroup = [adsi]"LDAP://CN=group1,OU=ou1,dc=hoge,dc=local"
$primaryGroup.GetInfoEx(@("primaryGroupToken"), 0)
$primaryGroupToken = $primaryGroup.Get("primaryGroupToken");
$user = [adsi]("LDAP://CN=user1,OU=ou1,dc=hoge,dc=local")
$user.Put("primaryGroupId", $primaryGroupToken)
$user.SetInfo()
```

# 参考

* http://www.tomsitpro.com/articles/powershell-active-directory,2-786.html
* http://www.indented.co.uk/2010/01/22/changing-the-primary-group-with-powershell/
pascal triangle



```python
def vs_pascal(p):
    max_len = len(l_to_str(p[-1]))
    for e in p:
        print(l_to_str(e).center(max_len))

def l_to_str(l, d="  "):
    return d.join(map(lambda x: str(int(x)), l))


def comb(n, r):
    if n == 0 or r == 0: return 1
    return comb(n, r - 1) * (n - r + 1) / r


def pascal(x):
    p = []
    for n in range(x + 1):
        t = []
        for r in range(n + 1):
            t.append(comb(n, r))
        p.append(t)
    return p

vs_pascal(pascal(15))

```







Output

```
                                       1
                                      1  1
                                    1  2  1
                                   1  3  3  1
                                 1  4  6  4  1
                               1  5  10  10  5  1
                             1  6  15  20  15  6  1
                           1  7  21  35  35  21  7  1
                         1  8  28  56  70  56  28  8  1
                      1  9  36  84  126  126  84  36  9  1
                 1  10  45  120  210  252  210  120  45  10  1
               1  11  55  165  330  462  462  330  165  55  11  1
            1  12  66  220  495  792  924  792  495  220  66  12  1
        1  13  78  286  715  1287  1716  1716  1287  715  286  78  13  1
    1  14  91  364  1001  2002  3003  3432  3003  2002  1001  364  91  14  1
1  15  105  455  1365  3003  5005  6435  6435  5005  3003  1365  455  105  15  1
```

ref:

http://www.geocities.jp/m_hiroi/light/pyalgo01.html
@3xを使うときは@1xも忘れずに

やらかしたので反省文です。

iOSで解像度に応じた画像リソースを使うには、xxx.png（なにもつけないだけなのですが以下説明として@1xとします）、xxx@2x.png、xxx@3x.png と各解像度のデバイスのファイルを添付する、もしくはAssets Catalogを使用する。
また、実行においてデバイスに適合したサイズの画像が無ければ、あるものから適時サイズが拡大縮小されて表示される、というのが大体の仕様です。

iOS9以降対応のデバイスの解像度を整理するとこんな感じです。
x1 : Normal
x2 : Retina/2倍解像度
x3 : Retina/3倍解像度
として、

| x1 | x2 | x3 |
|---|---|---|
|iPad2<br/>iPad mini1 | iPhone4,5,6 <br/>iPad (左記以外)  | iPhone6 Plus|



ここまではよいとして、全部は用意しなくてもなんとかしてくれるため容量も勿体無いのではしょったりしてしまうのですが、ここにバグがあるようで、Assetsでない場合において、**@2xと@3xのファイルのみの画像をStoryBoardなどで使った場合、x1デバイスで画像が表示されない** なんてことがおきます。

まぁ、その場合はワーニングが出るので注意深く見ていれば気付くのですが。

```
Could not load the "left.png" image referenced from a nib in the bundle with identifier "xxx.xxx.xxx"
```

これに気づかない＆今や数も少なくなってきたx1デバイスでの検証を忘れると、えらい目にあってしまいます、というお話。

この条件がすごく微妙で、@2xと@3xのみがある場合だけ発生します。
@1xのみ、@2xのみ、@3xのみ、@1xと@3xのときは発生しません。
また、StoryBoard,xib以外、つまりコードで使用した場合も発生しません。

例で示しますと、
![a1.png](https://qiita-image-store.s3.amazonaws.com/0/17516/8b4de5b8-f1cb-0789-0b8b-bf89b19bd348.png)

こんな感じで、left@2x.png,left@3x.pngを添付し、StoryBoardにUIImageViewとして貼ります。

ちなみに右側はAssetsで、@2x,@3xをUIImageViewで貼ったもの。

![a3.png](https://qiita-image-store.s3.amazonaws.com/0/17516/e973f0fe-8a58-ecdc-4419-7164e75ce05d.png)


これをx1デバイスのiPad2で実行してみると、
![a2.png](https://qiita-image-store.s3.amazonaws.com/0/17516/02e1999b-ab4c-3ceb-aae4-e9d67a9fcbd9.png)


**表示されませんっ、残念っ！**

x2,x3デバイスでは表示されます。（故に確認を忘れてえらい目に…）

Assetsやらを実装している間にバグってしまったと思うのですが、リリースされてしまっているOSである以上、こちらで注意するしか仕方なく。

知ってしまえば間違うことはないのですが、Assetsではどの組み合わせでも出るようなので、ここは素直に、**StoryBoardで貼る画像はAssetsを使いましょう。**
ということで。
あのXPでPHP練習環境作り（Apache+PHP+MySQL）メモ

ボロいパソコンでPHPしようと思いWindows XPへのApache+PHP+MySQLインストールを試みました。**練習環境であり最新版でもなんでもありません。全然分からず無駄に時間がかかりましたので、私レベルの人間は無理をせずにナウなWindows OSとそれに対応した新しいXamppの使用をお勧めします。**

#Apache 2.4.18 VC9

ダウンロード先にVC11はXPで動かない的な記述あり。
>Apache Haus Downloads
http://www.apachehaus.com/cgi-bin/download.plx

ということでApache2.4.18 VC9を使わなければならないようです。
>Apache 2.4.x VC9
Built using C sources from the ASF and OpenSSL on Visual Studio 2008 (VC9).
![ApacheXP.png](https://qiita-image-store.s3.amazonaws.com/0/93397/65afec70-4625-a203-22c9-4e3daefb1f16.png)


ダウンロードしたZipを解凍してコピー。
例えばC:￥Apache24

コマンドプロンプトで以下を実行して起動。
C:￥Apache24￥bin￥httpd

エラーが表示される場合はVisual Studioが無いかもしれないので、コントロールパネル＞アプリケーションの追加と削除で確認。

Apache 2.4.xダウンロード画面の下の方にリンクがあります。
>Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)
![Visual C++.png](https://qiita-image-store.s3.amazonaws.com/0/93397/6f3cd15c-513c-16ad-acad-726627aa3fa9.png)

ファイル名はvcredist_x86.exe

再度コマンドプロンプトから実行して他のPCなどからアクセスし、Welcomeの画面が表示されることを確認してください。

#PHP 5.4 Thread Safe VC9

サポートの終わった時代遅れなOSでは最新のものはおろかPHP5の新しいほうも使えないもようです。そんなダサい環境を使っている私は以下のページのThread Safeと書かれたphp-5.4.45-Win32-VC9-x86.zipをダウンロードしました。
>PHP For Windows: Binaries and sources Releases
http://windows.php.net/download/#php-5.4-ts-VC9-x86

解凍してわかりやすいところに展開。ちなみにThread Safeがなんなのかも分かっていません。

全体的な流れはダサITメンではない方が作ったと思われる以下のサイトを参考にしました。
>PHP 5.5.7 ダウンロードとインストール - PHPインストールと初期設定 
http://www.phpbook.jp/install/install/index1.html

#MySQL 5.5.47

インストールしようとしたところ出汁がなければ駄目みたいなことを言われました。dotNetFx40_Full_setup.exeをインストール。
>Download Microsoft .NET Framework 4 Full 日本語 Language Pack (x86/x64) from Official Microsoft Download Center
https://www.microsoft.com/ja-jp/download/details.aspx?id=3324

いよいよMySQLです。使用するのはmysql-5.5.47-win32.msi
以下のページのMySQL Community Server 5.5.47
>MySQL :: Download MySQL Community Server
https://dev.mysql.com/downloads/mysql/5.5.html

インストール時の設定に関してはこちらのデキる男感ほとばしるサイトを確認してください。
>Windows XP にMySQL5をインストール＆設定｜MySQLのインストール＆設定｜MySQL｜PHP & JavaScript Room
http://phpjavascriptroom.com/?t=mysql&p=mysql5install


以上
ElasticsearchをUbuntu 14.04にインストールする


## Elasticsearch をインストールする

参考:[Repositories](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html])

インストール方法は、上記の公式ドキュメントに丁寧に書かれているが、ここでは主要な手順だけを抜き出してみます。

#### リポジトリを登録する

```bash
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
```

#### インストールする

```bash
$ sudo apt-get update && sudo apt-get install elasticsearch
```

#### 起動時にサービスが立ち上がるよう設定する

```bash
$ sudo update-rc.d elasticsearch defaults 95 10
```

#### 起動させる

````bash
$ sudo /etc/init.d/elasticsearch start
````

## Elasticsearch の設定について

### メモリの割り当て

参考:[Configuration](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html) / [ElasticSearchでmlockall:trueが効かない時にチェックすること](http://kakakazuma.hatenablog.com/entry/2015/03/12/015504)

Elasticsearch を高速化するため、実メモリの半分程度(かつ32GBを超えないようにする)を割り当てます。

下記二つの設定ファイルで、次のパラメータを指定します。

```bash:/etc/init.d/elasticsearch
ES_HEAP_SIZE=4g
MAX_LOCKED_MEMORY=unlimited
```

```bash:/etc/elasticsearch/elasticsearch.yml
bootstrap.mlockall: true
```

これで Elasticsearch を再起動させ、mlockall が true になっていればOKです。

```bash
$ sudo /etc/init.d/elasticsearch restart
$ curl 'http://localhost:9200/_nodes/process?pretty'
  ...
  "process" : {
    "refresh_interval_in_millis" : 1000,
    "id" : 3016,
    "mlockall" : true
  }
```

#### Pluginをインストールする (elasticsearch-head / ElasticHQ)

Elasticsearch の plugin コマンドを使ってインストールする。
古いバージョンだと -install というオプションで指定していたが、現在のバージョン(v2.1)だとハイフンは必要なく install というオプションになっているようです。

```bash
$ sudo /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
$ sudo /usr/share/elasticsearch/bin/plugin install royrusso/elasticsearch-HQ
```

Proxy 経由でインストールする場合は -DproxyHost=XXX -DproxyPort=XXX を指定する。

```bash
$ sudo /usr/share/elasticsearch/bin/plugin -DproxyHost=XXX -DproxyPort=XXX install XXX
```

これで次の URL にアクセスすれば、Plugin の画面が表示される。
http://localhost:9200/_plugin/head/
http://localhost:9200/_plugin/hq/
IntelliJ IDEA - gradle - groovy でSpark FrameworkのHello World

GroovyでSpark Framework（Apache Sparkじゃない方）を使いたかったので、IntelliJで環境をつくってみました。

## JDKのインストール
Spark FrameworkはJava1.8のラムダ構文前提なので、Java8をインストールしてください。

## IntelliJのインストール
ここからCommunityエディションをダウンロードします。
https://www.jetbrains.com/idea/

最新版はIntelliJ IDEA 15 CE
ideaIC-15.0.2-custom-jdk-bundled.dmg

ダウンロードが終わったらインストールして起動します。

## プロジェクトの作成
Create New Projectを選んでGradleとGroovyを選択します。Project SKDにはJava8を指定してください。

![スクリーンショット 2016-01-09 0.15.25.png](https://qiita-image-store.s3.amazonaws.com/0/88743/6a2fdac7-df73-3b1c-01b3-c5032b4cba61.png)

2つめの画面で、GroupIdとArtifactIdを指定します。
![スクリーンショット 2016-01-09 0.21.34.png](https://qiita-image-store.s3.amazonaws.com/0/88743/d129ba4e-174f-58fa-2547-6454af889454.png)

3つめの画面でUse auto-importとCreate directories for empty content roots automaticallyにチェックを入れます。
![スクリーンショット 2016-01-09 0.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/88743/f45d7a45-02e3-9239-0504-fe4efe5068af.png)

4つめの画面では特に何も変えずFinishボタンを押します。

## Spark Frameworkをdependenciesに追加
![スクリーンショット 2016-01-09 0.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/88743/7cae97f7-c87e-fb7f-d1e2-ed78e26c3ddd.png)

Projectツリーからbuild.gradleファイルを選択して、dependenciesにcompile 'com.sparkjava:spark-core:2.3'を追記します。

![スクリーンショット 2016-01-09 0.44.01.png](https://qiita-image-store.s3.amazonaws.com/0/88743/f9fe03e6-0f84-b24e-4fa3-97946c03da69.png)


## GradleをRefresh

ウインドウ右端のGradleアイコンをクリックして、開いたウインドウの一番左の矢印がグルグルしているボタンをクリックします。これで、build.gradleに追記したSparkの依存関係のライブラリがダウンロードされます。

![スクリーンショット 2016-01-09 0.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/88743/cd048725-1998-b70a-901f-c66084690c62.png)


## Groovyスクリプト追加

Groovyのスクリプトファイルを作ります。

Projectツリーでsrc > main > groovyで 右クリック > New > Groovy classをクリック > Nameに"Main" > OKボタン

```groovy:Mail.groovy
import static spark.Spark.*

class Main {
    public static void main(String[] args) {
        get "/hello", {req, res -> "Hello World"}
    }
}
```


## Spark起動
Projectツリーでsrc > main > groovy > Main で右クリックして
'Run Main.main()'を選択

ログが出てSparkが起動します
```
[Thread-1] INFO org.eclipse.jetty.util.log - Logging initialized @1389ms
[Thread-1] INFO spark.webserver.JettySparkServer - == Spark has ignited ...
[Thread-1] INFO spark.webserver.JettySparkServer - >> Listening on 0.0.0.0:4567
[Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.3.2.v20150730
[Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@72fcf0be{HTTP/1.1,[http/1.1]}{0.0.0.0:4567}
[Thread-1] INFO org.eclipse.jetty.server.Server - Started @1609ms
```

## ブラウザからアクセス
ブラウザから http://0.0.0.0:4567/hello にアクセスして、Hello Woldが表示されたら成功です。
FreerモナドとCoyonedaについて

この辺を読んで書いた、数学の人向けのメモ
http://fumieval.hatenablog.com/entry/2013/05/09/223604
http://halcat.org/scala/extensible/

# Freerモナドとは何か
$\mathcal{H}$ をHaskellの圏だとかその類としたとき、

- Coyonedaと呼ばれる、対象の間の写像 $\mathrm{Ob}(\mathcal{H})\to\mathrm{Ob}(\mathcal{H})$ から自由に生成される関手 $\mathcal{H}\to\mathcal{H}$
- 関手 $\mathcal{H}\to\mathcal{H}$ から生成される自由なモナド（ http://qiita.com/monae/items/0fe34a6bb1b285be172a ）

を定義することができる。これらを続けて行えば単なる $\mathrm{Ob}(\mathcal{H})\to\mathrm{Ob}(\mathcal{H})$ からモナドを作ることができる。
それがFreerモナドだとか、Operationalだとか色々呼ばれている。

# Coyonedaの定義
（豊穣圏で話をするのが面倒なので、集合の圏 $\mathcal{Set}$ を基準にしてやります。クラスやら宇宙の大きさの話も雑です）

$\mathcal{C}$ を圏とする。$F$ を対象間の写像 $\colon\mathrm{Ob}(\mathcal{C})\to\mathrm{Ob}(\mathcal{Set})$ とするとき、$A\in\mathcal{C}$ に対し

```math
F^+(A)=\coprod_{X\in\mathcal{C}}F(X)\times\mathrm{Hom}_{\mathcal{C}}(X,A)
```

と定めると、射の変換も自然に定義できて（右成分にかければいい） $F^+$ は関手 $\mathcal{C}\to\mathcal{Set}$ になる。
$F$ から $F^+$ を作る操作は、関手に対して対象間の対応だけ取り出す忘却の左随伴なので、$F^+$ を $F$ で生成された自由な関手と言っても差し支えないだろう。

要するに、集合から自由加群を生成するやつの単なるmulti-objectバージョン。
これをHaskellやScalaで書いたものが冒頭のリンク先に掲載されている。

# なんでこれがCoyonedaと呼ばれているのか

反変関手 $\mathcal{C}^{\mathrm{op}}\to\mathcal{Set}$ の圏（前層の圏）を $\mathcal{C}^\wedge$ と書くことにする。
$A\in\mathcal{C}$ に対し $\mathrm{Hom}\_{\mathcal{C}}(\bullet,A)$ はそのような関手、つまり $\mathcal{C}^\wedge$ の対象となっており、これを ${H\_A}$ とおく。
対象 $A\in\mathcal{C}$ と関手 $F\in\mathcal{C}^\wedge$ を取ると、集合として自然に1:1対応（$\mathcal{S}\mathcal{et}$ における同型）

```math
F(A)\simeq\mathrm{Hom}_{\mathcal{C}^\wedge}(H_A,F)
```

があるというのが米田の補題。

そこで今度は共変関手 $G\colon\mathcal{C}\to\mathcal{Set}$ を取ろう。このときは自然に

```math
G(A)\simeq G\otimes_{\mathcal{C}}H_A
```

となる。ここで出てきた共変関手と反変関手のテンソル積を具体的に書けば、右辺は

```math
\big(\coprod_{X\in\mathcal{C}}G(X)\times\mathrm{Hom}_{\mathcal{C}}(X,A)\big)\big/{\sim}
```

である。割るのに使う同値関係 $\sim$ は普通の加群と加群のテンソル積でやったのと同様（書くのが面倒なので省略）。

関手の圏でのHomの定義を思い出せばこれが米田の双対版（直積→直和、Ker→Coker、Hom→テンソル）であることがわかる。
よく見るとさっきのやつが割る前のところに出てきているのでこれが名前の由来だろう。
割るか割らないかの違いは、そもそもにしてHomの元の同一性なんて計算する気がないので黙殺されていると思われる。

# 感想
当たり前のものに変な名前を付けるのをやめてほしい
ユーザーエージェントに依存しない、JavaScriptでのブラウザハックまとめ

#ユーザーエージェントに依存せず、ブラウザがサポートしている機能で判定を行う

JavaScript ユーザエージェント条件分岐便利スニペット
https://w3g.jp/blog//js_browser_sniffing

> UA情報には依存しないブラウザがサポートしている機能でブラウザ判別を行う試みです。

基本的に上記のページのコードをベースにして、Microsoft Edge対応も含め改変したものです。

```js:
var supportHack = (function() {
  return {
  IE9:document.uniqueID && document.documentMode == 9,
  IE10:document.uniqueID && document.documentMode == 10,
  IE11:document.uniqueID && document.documentMode == 11,
  Trident:document.uniqueID,
  Edge:'-ms-scroll-limit' in document.documentElement.style && '-ms-ime-align' in document.documentElement.style && !window.navigator.msPointerEnabled,
  Gecko:'MozAppearance' in document.documentElement.style,
  Presto:window.opera,
  Blink:window.chrome && window.chrome.webstore,
  Webkit:!window.chrome && 'WebkitAppearance' in document.documentElement.style,
  Touch:typeof document.ontouchstart != "undefined",
  Mobile:typeof window.orientation != "undefined",
  ltAd44:typeof window.orientation != "undefined" && typeof(EventSource) == "undefined",
  Pointer:window.navigator.pointerEnabled,
  MSPoniter:window.navigator.msPointerEnabled
  }
})();
```

詳しい変更点は以下になります。

* Edgeを追加
* BlinkがEdgeにも判定されていたので、window.chrome.webstoreを追加
* レガシーIEを削除してIE9以降のみに変更

上記に含まれないハックでは以下のサイトが参考になります。

Browserhacks
http://browserhacks.com/
fibonacchi



```python
"""
fibonacci

          ┌ 1;                     n = 0
fibo(n) = ┤ 1;                     n = 1
          └ fibo(n-1) + fibo(n-2); n > 1

http://www.geocities.jp/m_hiroi/light/pyalgo01.html
"""


"""
  fibo(5) ┬ fibo(4) ┬ fibo(3) ┬ fibo(2) ┬ fibo(1)
          │         │         │         │
          │         │         │         └ fibo(0)
          │         │         └ fibo(1)
          │         └ fibo(2) ┬ fibo(1)
          │                    │
          │                    └ fibo(0)
          │
          └ fibo(3) ┬ fibo(2) ┬ fibo(1)
                    │         │
                    │         └ fibo(0)
                    └ fibo(1)
There are many duplicated calls above. This is inefficient.
"""
def fibo(n):
    if n == 0 or n == 1: return 1
    # double recursion
    return fibo(n - 2) + fibo(n - 1)

"""
Tail recursive
fibo(5)
  fibo(4, 1, 1)
    fibo(3, 2, 1)
      fibo(2, 3, 2)
        fibo(1, 5, 3)
          fibo(0, 8, 5)
          => return a1: 8
        => 8
      => 8
    => 8
  => 8
=> 8
"""
def fibo_tr(n , a1=1, a2=0):
    if n < 1: return a1
    return fibo_tr(n-1, a1 + a2, a1)

"""
Tail recursive optimization
"""
def fibo_tr_opt(n):
    a1, a2 = 1
    while n > 0:
        a1, a2 = a1 + a2, a1
        n -= 1
    return a1

"""
memorize fibo

http://www.python-course.eu/python3_memoization.php
"""
def fibo_memo(n, memo):
    if n == 0 or n == 1: return 1
    if n in memo:
        return memo[n]
    memo[n] = fibo_memo(n - 2, memo) + fibo_memo(n - 1, memo)
    return memo[n]


def memorize(f):
    memo = {}
    def helper(x):
        if x not in memo:
            memo[x] = f(x)
        return memo[x]
    return helper

fibo_memo2 = memorize(fibo)

@memorize
def fibo_memo_dec(n):
    if n == 0 or n == 1: return 1
    # double recursion
    return fibo(n - 2) + fibo(n - 1)

class Memoize:
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
    def __call__(self, *args):
        # args is tuple
        if args not in self.memo:
            self.memo[args] = self.fn(*args)
        return self.memo[args]

@Memorize
def fibo_memo_dec(n):
    if n == 0 or n == 1: return 1
    # double recursion
    return fibo(n - 2) + fibo(n - 1)

```



ref:
http://ymotongpoo.hatenablog.com/entry/2015/02/23/165341


http://www.geocities.jp/m_hiroi/light/pyalgo01.html
メモ scala のtype Aliasのアクセスの仕方


```scala
trait Fuge { 
  type A = String
}
```

Fuge.Aを見たい場合 普通に`Fuge.A`でアクセスする場合と　`Fuge#A`でアクセスする場合がある

* traitなどの定義からアクセスする方法

```scala
implicitly[Fuge#A =:= String]
```



* instanceからアクセスする場合 

```scala
val fuge = new Fuge{}
implicitly[fuge.A =:= String]
```
SwiftでProxyパターンを使ったデータ更新ロジック


#I Proxy Patternを使ったデータ更新ロジック
デザインパターンを、現実に起こりそうな事例を参照しながら学習すれば、短時間で深い理解を得られる。

Swiftで現実に起こりそうな状況を題材にしたProxy Patternの例がいまいち見つからなかったので、書いてみた。

今回は事例を元に、後述の状況下でなぜProxy Patternが有力な実装方法となるのかを説明。
その後、サンプルコードを記載する。

#II 作成するシステム
##要件
- 画面を開くたびに、サーバーの情報をロードして表示する
- 情報をロードする間、ユーザーを待たせてはいけない
- 表示する情報は、サーバー上のものと比較して多少古くても良い



##サンプル
Main Screenで左上の"Contents"ボタンを押すと、コンテンツの一覧が表示される。
コンテンツの一覧画面は、表示されるごとにサーバからUITableViewに表示するString型の配列をロードする。
<img width="320" alt="Simulator Screen Shot 2016.01.08 21.46.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/103299/75aaf909-8528-f5ac-b1bb-c31b8c40e1f9.png">　<img width="320" alt="Simulator Screen Shot 2016.01.08 21.50.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/103299/ec7efc93-dce7-9b1c-539e-ba551d2caa18.png">


#III Proxy Patternは他の実装より優れる

##非Proxy Patternでは妥協が生じる
まず、Proxy Patternを使わない２つの実装を紹介する。
これらの方法では、ユーザーを待たせる、設計が複雑になる可能性があるなどの
問題を抱えている。


###シンプルな実装
シンプルで単純明快だが、ユーザーを待たせてしまう実装。

ContentsTableViewControllerは、開かれるたびにContent Classから新しい情報の取得をリクエストする。
Content Classはリクエストがあるたびに、サーバーへ接続して情報を取得して返す。
ユーザーはサーバからの情報取得が完了するまでの間、待たされる。
![Simple.png](https://qiita-image-store.s3.amazonaws.com/0/103299/ce6e4acf-969e-44f1-19ec-102af8b574bc.png)


###複雑な実装
要件を満たすが、設計が複雑になる可能性のある実装。

Appが起動するたびにバックグランドでデータを読み込み、ユーザーがContantsTableViewControllerを開いたときには、すでにデータの更新が完了しているようにする実装が考えられる。

この方法は、状況によっては設計が複雑になってしまう可能性がある。

##Proxy Patternは弱点を全て克服
Proxy Patternを使うことによって、前述の２つの問題を解決することができる。
前述の"シンプルな実装"にContentProxy classを追加することで実装する。

####Content Proxy Class
1. リクエストを受けると、前回リクエストを受けた時の情報を返す。
2. 同時にバックグランドでContent Classへアクセスして情報を取得して、それを次回のために保存する。
![Proxy.png](https://qiita-image-store.s3.amazonaws.com/0/103299/87f74af1-5a3b-dc6a-13fe-5c866dd1241a.png)

```swift:ContentProxy
import UIKit

class ContentProxy: NSObject, ContentProviding {
    
    let contentsSaveKey = "ContentsSaveKey"
    
    func getContents() -> AnyObject {

        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) {

            // 非同期処理で、次回アクセスされた時用のコンテンツをロード＆保存
            let newContents = Content().getContents()
            NSUserDefaults.standardUserDefaults().setObject(newContents, forKey: self.contentsSaveKey)
            
        }
        
        // 前回(上記の非同期処理で)保存したコンテンツを返す。 NSUserDefaultsから取り出すので、ユーザーを待たせない。
        if let lastContents = NSUserDefaults.standardUserDefaults().objectForKey(self.contentsSaveKey) {
            return lastContents
        
        // 前回保存したコンテンツがない場合（Appの初回起動時など）はContent Classからコンテンツを取り出す。
        // Content Classgはサーバーから情報を取り出すので、このケースに限り、ユーザーを少し待たせることになる。
        } else {
            return Content().getContents()
        }
    }
}
```

####ユーザーから見た挙動

- ユーザーの閲覧する情報は、ContentsTableViewControllerを開くごとに更新される。
- 表示される情報は、サーバーの最新のものではなく、前回アクセスした時のもの。


#IV 結論
今回の方法は、要件で示したとおり、ユーザーは最新ではなく前回コンテンツ一覧を表示したときの情報を見ることになる。
ただし、コンテンツは一覧を見るたびに更新されるので、サーバーの情報とユーザーに表示される情報をシビアに同期したい場合以外では、設計を単純に保てるので有力な候補となり得る。
Scala: sealed traitでもoverride methodの同一視はできないっぽい？

sealed traitならoverrideしたメソッドの同一視くらいできそうかなと思ったが、コンパイラはそこまで見てくれないようだ。

```scala
sealed trait CounterCommand
case class IncrementCounter() extends CounterCommand
case class DecrementCounter() extends CounterCommand

case class Counter(counter: Int) {
  def handleCommand(command: IncrementCounter): Counter = copy(counter = counter + 1)
  def handleCommand(command: DecrementCounter): Counter = copy(counter = counter - 1)
}

object Counter {
  def handleCommand(command: CounterCommand) = Counter(0).handleCommand(command)
}
```

```
[error] .../src/test/scala/examples/DomainEventExample.scala:57: overloaded method value handleCommand with alternatives:
[error]   (command: examples.DecrementCounter)examples.Counter <and>
[error]   (command: examples.IncrementCounter)examples.Counter
[error]  cannot be applied to (examples.CounterCommand)
[error]   def handleCommand(command: CounterCommand) = Counter(0).handleCommand(command)
[error]                                                           ^
```

<img width="887" alt="Screen Shot 2016-01-08 at 22.39.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7a170e9a-9ab9-39c8-342e-a88b5583cbc6.png">

この程度のコードなら`match`を使えば解決するけれど、やりたいことはclassの`handleCommand`ではそれぞれ別の型を戻り値に明示する、かつ、objectの`handleCommand`では全ての`handleCommand`を同一視することで、ざっくり次のようなコードを実現したい。

```scala
sealed trait CounterCommand
case class IncrementCounter() extends CounterCommand
case class DecrementCounter() extends CounterCommand

sealed trait CounterEvent
case class CounterIncremented(value: Int) extends CounterEvent
case class CounterDecremented(value: Int) extends CounterEvent

case class Counter(counter: Int) {
  def handleCommand(command: IncrementCounter): CounterIncremented = CounterIncremented(counter + 1)
  def handleCommand(command: DecrementCounter): CounterDecremented = CounterDecremented(counter - 1)
}

object Counter {
  def handleCommand(command: CounterCommand): CounterEvent = Counter(0).handleCommand(command)
}
```

何かいい方法はないものだろうか。
Emacs を立ちあげると同時に cider-jack-in する

Clojure で仕事をするようになって随分と経つんですが、 Emacs を立ちあげて Cider を起動するまでに必ず行なう作業があるのでどうにかしたいと思っていました。具体的には 1. Emacs の起動 2. ファイルを開く 3. `C-c M-j` です。この 3 ステップを毎回繰り返すのがいい加減嫌になったのがきっかけですが、これは次のように解決できました。


```
$ cd ~/cljure-project
$ emacs project.clj -e cider-jack-in
```

このように実行すれば Emacs が起動すると同時にファイルを開き `cider-jack-in` することができます。
MacのRubyを最新化する手順

## 前提

事前にHomebrewでrbenvをインストールしていた場合の手順。


## 作業手順

### ruby-buildのアップデート

```bash
$ brew upgrade ruby-build
```

### 最新のRubyがあるか確認

2.3.0を入れたかったので、ここではそれを確認している。

```bash
$ rbenv install --list | grep 2.3.0
  2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  rbx-2.3.0
```

### 最新のRubyのインストール

あとは、いつもどおり。

```bash
$ rbenv install 2.3.0
$ rbenv global 2.3.0
```

### 確認

無事バージョンアップできた。

```bash
$ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
```
sensu @ windows note


# Powershell plugins

```json:client.json
{
  "client": {
    ...  
    "ruby": "c:/opt/sensu/embedded/bin/ruby.exe",
    "powershell": "Powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Unrestricted -NoLogo",
    "plugins": "c:/opt/sensu/plugins"    
  }
}
```


```json:check.json
    "check-process-photon": {
      "handlers": ["mailer"],
      "command": ":::powershell::: -File :::plugins:::/check-windows-service.ps1 \"Photon Socket Server: Loadbalancing\"",
      "interval":  300,
      "standalone": true
    },
```


# with metrin
```json:check.json
	"check-cloudwatch-cpu-load": {
      "handlers": ["mailer"],
      "command": "/opt/cloudpack/bin/metrin.exe -r us-west-2 -n AWS/EC2 -d \"InstanceId::::instance_id:::\" -m CPUUtilization -s Average -p 300 -S -120 check --warning-gt 70 --critical-gt 90",
      "interval":  300,
      "standalone": true
    },
```
Quote via `\"` if this token contains `:`, due to josn_multi error.

# check-ports.rb (old version)
`nmap` for windows
I found new version check_port.rb. It's nmap-free.

https://github.com/sensu-plugins/sensu-plugins-network-checks/blob/master/bin/check-ports.rb 

## use net-ping

net-ping support `udp` ping!

```
gem install win32-security
gem install net-ping
```

https://gist.github.com/YoshihitoAso/4696911

```ruby:
require 'net/ping'

r = Net::Ping::TCP.new('127.0.0.1', 23)
p r.ping? #true or false

```

## check-ports.rb (new version namp-free)

```
gem install sensu-plugins-network-checks

check-ports.rb.bat -H localhost -p 22
> CheckPort OK: ...
```

# check-service

```
gem install sensu-plugins-network

check-windows-service.rb.bat -s 'W32Time'

```

`sc query ` To get `service_name`

## linux <=> Win 
|linux-daemon|Win-Service|
|------------|-----------|
|ntp,chrony  |W32Time    |
|rsyslogd    |eventlog   |
|crond,atd   |Schedule   |
整数配列の連続区間をグループ化するやつの改良

[昼間に書いたやつ](http://qiita.com/nijojin/items/0888066efcee979827c7)は整数にしか対応してなかったので文字でもできるようにしてみた。

scalazを使うと簡単にできる。

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

object Main extends App {

  def group_mini[A](seq: Seq[A], s: A, e: A)(implicit enum: Enum[A]): Seq[(A, A)] = seq match {
    case Nil => Seq((s, e))
    case h+:t =>
      if(h === e.succ)
        group_mini(t, s, h)
      else
        (s, e) +: group_mini(t, h, h)
  }

  def group[A](seq: Seq[A])(implicit enum: Enum[A]) = seq match {
    case Nil => Nil
    case h+:t => group_mini(t, h, h)
  }

  val sample1 = Seq(1, 2, 3, 4, 5, 8, 9, 10, 13, 14, 20, 22)
  val sample2 = "ABCabc01234def56789DEF".sorted

  println(group(sample1))
  println(group(sample2))
}
```

実行結果

```scala
List((1,5), (8,10), (13,14), (20,20), (22,22))
List((0,9), (A,F), (a,f))
```

scalaz使わなくてもできるのかな?
Bigquery上で実行するバッチ処理のテストコードを書く (Ruby編)

bigquery上でデータを加工して集計する時、このSQLが本当に合ってんのかテストコードで検証したくなる。
しかし、こういう外部サービスを使った処理のテストコードを書くのはとても面倒臭い。
とはいえ、書かんわけにもいかんし、実際に動かしてみないと分からないこともあるので、実際にbigqueryで処理を実行してテストする方法をまとめてみる。

## テストデータのロード
bigqueryにデータを突っ込む方法はバルクロードするかStreaming Insertの二つ。
しかし、バルクロードはテストコードを書く時に困るのが、データ量に関わらず処理に一定時間かかること。
どれだけ小さいデータでも最低1分前後は待たされる上に、時々謎の刺さり方をして最悪数分かかる場合がある。
一方でStreaming Insertはまずテーブルを作っておかなければいけないし、Streaming Insertのレスポンスが返ってきた時点でクエリを即発行できるのかイマイチはっきりしない。

しかし、一つ裏技的なやり方があって、それが[BigQuery で無からリレーションを出現させる - Qiita](http://qiita.com/yancya/items/9af89b6f8d7975ef5892 "BigQuery で無からリレーションを出現させる - Qiita")である。
テストデータを静的なSQLに変換してViewとして定義すればAPIリクエストを送るだけでクエリ可能なダミーテーブルが準備できる。
bigqueryにおいてはViewはほぼテーブルと同じなのだが、どうもJOINした時のカラムの扱いに微妙な違いがあるような挙動をする。
端的に言うとテーブル名エイリアスを省略するとカラムが見つからなくなったりする。よく分からん……。
とはいえ、概ね問題なく処理が可能なのでテストデータの投入はこれで行うことにした。

で、このテクニックをテストコードから楽に実行するためにgemを作った。

[joker1007/bq_fake_view](https://github.com/joker1007/bq_fake_view "joker1007/bq_fake_view")

使い方はこんな感じ。


```ruby
bq_fake_view = BqFakeView.new(Google::Auth.get_application_default(["https://www.googleapis.com/auth/bigquery"]))

data = [
  {foo: 1, bar: "bar", time: Time.now},
  {foo: 2, bar: nil, time: Time.now}
]
schema = [
  {name: "foo", type: "INTEGER"},
  {name: "bar", type: "STRING"},
  {name: "time", type: "TIMESTAMP"}
]
bq_fake_view.create_view("your_project_id", "your_dataset_id", "test_data", data, schema)
# =>
# create "test_data" view.
# view query is
# SELECT * FROM (SELECT 1 as foo, "bar" as bar, TIMESTAMP('2016-1-8 10:02:01') as time), (SELECT 2 as foo, CAST(NULL as STRING) as bar, TIMESTAMP('2016-1-8 10:02:01') as time)

bq_fake_view.view_query(data, schema) # => return Query string used by View definition
```

スキーマの指定が必要なのはNULLに型を指定しないと上手く結合できないからだ。

この方法で大量のレコードを差し込むのはかなり無理があるのだが、ロジックのテストについてはこれでも充分に実施できる。

## データのクリア
テストを実施する時には、過去に実行したテスト結果をクリアしてフラットな状態からテストデータをロードしなければならない。
手元のDBだったら、database\_cleanerを使うとかすれば簡単にデータをクリアできる。
bigqueryの場合はそんなもの無いのでAPIを叩いてクリアする必要がある。
しかもbigqueryはレコード単位の削除が存在しないのでテーブルごと消さなければならない。
しかし、バッチ処理なんかだと中間テーブルが大量に発生することもあって、それを逐一APIを叩いて削除するのはとても面倒臭い。
というわけで、datasetごと削除してデータをクリアするようにした。

```ruby
def reset_test_dataset!
  begin
    Bigquery.client.delete_dataset("project_id", "test_dataset", delete_contents: true)
  rescue Google::Apis::ClientError
  end

  Bigquery.client.insert_dataset("project_id", Google::Apis::BigqueryV2::Dataset.new({
    dataset_reference: {
      dataset_id: "test_dataset"
    },
    default_table_expiration_ms: 3600000, # 1hour
  }))
end
```

こんな感じのヘルパーメソッドを定義しておいて、beforeフックで呼び出すようにする。
これで割とすぐにデータをクリアできる。


テストデータのロードとクリアが可能になれば、後はテストコードを書くだけだ。
テストコードは実際にバッチ処理を実行してみて、出力結果を取得して手元の正解と見做したデータと付き合わせているだけ。
とは言え、あんまり頻繁にbigqueryのAPIコールをするのも問題ありそうなので、RSpecで適当な粒度でdescribeを分けて、before(:context)でテストの事前準備を整える様にした。
ちなみに、テストコード実施後のテーブル状況を確認できるように、afterフックでデータセットを消すようにはしていない。その代わり放置してもデータが消えるようにdatasetにexpiration timeを設定している。
travis-ciでOS XとLinuxの環境でMinicondaを使ってPythonのテストをする

Travisは長らく`language: python`の[OSXのビルドが壊れている](https://github.com/travis-ci/travis-ci/issues/2312)ので、`language: c`で戦わなければならない。

https://github.com/chezou/fastFM/blob/travis-conda/.travis.yml に実際のymlがあるが、
だいたいこんな感じで書く。

envでPythonのバージョンをベタベタっと書いていく感じ。

```.travis.yml
language: c

env:
    - TRAVIS_PYTHON_VERSION="2.7"
    - TRAVIS_PYTHON_VERSION="3.5"

os:
    - linux
    - osx

before_install:
    - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi
    - # install some brew package
    - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get update -qq;  fi
    - # install some apt package
    - if [[ "$TRAVIS_PYTHON_VERSION" =~ "^2" ]]; then
        if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
          wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
        else
          wget https://repo.continuum.io/miniconda/Miniconda-latest-MacOSX-x86_64.sh -O miniconda.sh;
        fi
      else
        if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
          wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
        else
          wget https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -O miniconda.sh;
        fi
      fi
    - bash miniconda.sh -b -p $HOME/miniconda
    - export PATH="$HOME/miniconda/bin:$PATH"
    - hash -r
    - conda config --set always_yes yes --set changeps1 no
    - conda update -q conda
    # Useful for debugging any issues with conda
    - conda info -a
    - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION # some needed packages
    - source activate test-environment

install:
    - pip install .

script:
    - nosetests
```

辛いけど、Cythonとか使うコードのテストはMiniconda使わないとCIに20分とかかかるので、しかたない。
Ubuntu+Python2.7にTensorFlowを導入


# 0. TensorFlowとは
Googleが提供している機械学習ライブラリ
@shuhei_fさんの[TensorFlow ってなんだろ](http://qiita.com/shuhei_f/items/5ba61fff4e47e073c24f) が分かりやすいです。

# 1. Ubuntuの準備
[Vagrant+VirtualBoxでUbuntu環境構築](http://qiita.com/w2-yamaguchi/items/191830191f8af05ac4dd) などでUbuntuを用意する。

# 2. 環境の確認
Ubuntu 15.04 / Python 2.7.9

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.04
DISTRIB_CODENAME=vivid
DISTRIB_DESCRIPTION="Ubuntu 15.04"

$ python --version
Python 2.7.9
```

# 3. Proxyの設定（必要があれば）
```
$ export http_proxy="$USERNAME:$PASSWORD@$HOST:$PORT"
$ export https_proxy="$USERNAME:$PASSWORD@$HOST:$PORT"
```
# 4. pipのインストール（入ってない場合）

```
$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
```

# 5. virtualenvのインストール（入ってない場合）

```
$ sudo pip install virtualenv
```

# 6. TensorFlow用環境の作成

```
$ mkdir ~/tensorflow
$ virtualenv --system-site-packages ~/tensorflow
$ cd ~/tensorflow
$ source bin/activate
```

# 7. TensorFlowのインストール

```
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
```

下記のエラーが出る場合は、「python-dev」が入っていないため、
`sudo apt-get install python-dev`で導入する。

```
（略）
    SystemError: Cannot compile 'Python.h'. Perhaps you need to install python-dev|python-devel.
    
    ----------------------------------------
Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-ZZhjh_/numpy/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-UmWBtU-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-ZZhjh_/numpy
```

# 8. TensorFlowの動作確認

```py:hello-tf.py
import tensorflow as tf
import multiprocessing as mp
 
core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)
 
hello = tf.constant('hello, tensorflow!')
print sess.run(hello)
 
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)

```
```
(tensorflow)$ python hello-tf.py
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 2
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 2
hello, tensorflow!
42
```

# 9. TensorBoard
##ポートフォワードの設定

```text:Vagrantfile
config.vm.network :forwarded_port, host: 6006, guest: 6006
```

```
$ vagrant reload
```

##TensorBoardの起動

```
$ tensorboard --logdir=[log_dir]
Starting TensorBoard on port 6006
(You can navigate to http://localhost:6006)
```

#参考
[いつの間にかpipのインストールが楽になってた件](http://qiita.com/who_you_me/items/831d62f396e6d66dda66)
[TensorFlowで Hello Worldを動かしてみた&その解説](http://dev.classmethod.jp/machine-learning/tensorflow-hello-world/)
Windows Translatorで "ArgumentOutOfRangeException: 'to' must be a valid languageというエラーが出るときの対処



## 症状

Microsoft Translator APIを使おうとしたら、タイトルどおりのエラーメッセージが出た。

APIに渡すクエリは
```?text=翻訳したいテキスト&from=ja&to=en```
のようになるのだが、何度ソースをみても```&to=en```は間違いなく入っている。

ググると結構はまっている人がいるみたいだが、わかりやすい解決方法はみつからない。
半日以上かけてなんとか解決したので記録しておく。

## 原因：URLエンコードしすぎ

いろいろ確認すると、

```
?text=hello&from=en&to=ja
```

と手で入力したときにはエラーがでない。

コードを見直してみると、クエリ全体をURLエンコードしていた。
どうやらそれが原因らしく、上記のクエリのエンコードされた後の文字列を確認してみると、

```
%3Ftext%3Dhello%26from%3Den%26to%3Dja
```

みたいになっていた。

'&'や'='などもエンコードされていて、そりゃエラーがでるよね…。

URLエンコードは翻訳したいテキストだけすることにしたら解決しました。

いちおう翻訳部分だけコードを載せておきます。
>
アクセストークンは別に用意してください。


```ts:TypeScript
import qs = require('querystring');

// 略

    translate(token, text, from_lang, to_lang, callback) {
        const options = "text=" + qs.escape(text) + // ここだけエンコード
                        "&from=" + from_lang +
                        "&to=" + to_lang +
                        "&oncomplete=callback";

        const request_options = {
            host: 'api.microsofttranslator.com',
            path: '/V2/Ajax.svc/Translate?' + options,
            method: 'GET',
            headers: {
                "Authorization": 'Bearer ' + token
            }
        };

        const req = https.request(request_options, function(res) {
            var body = '';
            res.setEncoding('utf8');

            res.on('data', function(chunk) {
                body += chunk;
            });

            res.on('end', function() {
                // body の中身は "callback(translated_text)"　という形になっているはず。
                eval(body); // callback関数に翻訳されたテキストだけ渡す。
            });

        });
        req.on('error', function(e) {
            console.log(e.message);
        });
        req.end();
    }
```


## 参考

[Microsoft Translator APIを使ってみる](http://qiita.com/kemayako/items/21fe36005e6e729aff77)
sar用のグラフ化ツール【ksar】を使ってみた


メモメモ程度に。
SEならたまに見るであろう `sar`　。
直接見ても醜いだけのあのログを一発でグラフ化できるツールがあります。

困ったときは是非使ってみましょう。

-

# 1. ksarってなんだ？

`ksar` は、Linux、Mac、Solarisなどのsar用のグラフ作成ツール。
グラフをPDFに出力できる。


# 2. インストールしてみる

いろんなページにインストールファイルはありますが、今回は下記から。。。
https://osdn.jp/projects/sfnet_ksar/

ダウンロードできるのは、 `ZIP形式` と `jar形式` の2ファイル。
また、ツール使うために `java` が必要になるので、使用している環境に `java` が
インストールされていない場合は事前にこちらもインストールする必要あり。

ファイルサイズは、3.5MB程度。



## 2.1. ファイルをインストール

![kobito.1452253351.063307.png](https://qiita-image-store.s3.amazonaws.com/0/33479/62533117-89d4-5956-2891-4abb2b63d32d.png "kobito.1452253351.063307.png")

↓

![kobito.1452253374.547198.png](https://qiita-image-store.s3.amazonaws.com/0/33479/ecaf74ec-84ca-4ea5-7cca-c103893df0d5.png "kobito.1452253374.547198.png")


## 2.2. 起動してみる

![kobito.1452253526.570604.png](https://qiita-image-store.s3.amazonaws.com/0/33479/7f9d0ce3-ac3b-ee80-32e5-8fe7ee32cd2a.png "kobito.1452253526.570604.png")

直ぐにアプリケーション起動します。

## 2.3. 使ってみる

![スクリーンショット 2016-01-08 20.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/33479/54a574b7-2589-94d7-2e28-aec7b00a1ed7.png "スクリーンショット 2016-01-08 20.46.17.png")

データは、いろいろとインポートする方法があるみたい。。

手元にsarファイルが無かったので、他のサイトを参照。
こんな感じにグラフ化できますね。

![kobito.1452254318.477471.png](https://qiita-image-store.s3.amazonaws.com/0/33479/0e0b19dd-a909-80e1-bddb-5e8a94eab7b4.png "kobito.1452254318.477471.png")
Jupyterで好きなHTMLを埋め込む

# やり方
`IPython.display.HTML`を使う。

# Hello world!
```py
from IPython.display import HTML
HTML("<h1>Hello world!</h1>")
```

# その他
ローカルにある画像なんかも、base64エンコードしてimgタグのソースに文字列突っ込めば表示できます。

YouTubeの動画なんかも埋め込めます。 [(nbviewerへ)](http://nbviewer.ipython.org/gist/xeno1991/3964719cbe4d212657d7)
![eb261656c601e6dc2cbe30468eb8f501.png](https://qiita-image-store.s3.amazonaws.com/0/35173/74d4b1f5-6ba8-acd9-8912-a360ba1f2821.png)
「ほとんどのエンジニアには解けるが、下位20％のダメなエンジニアにだけ解けないパズル?」作ってみた

# あらすじ

なんかFacebookを見ていたら流れてきたのでボクも作ってみました。

https://challenge-make-now-just.herokuapp.com/

偉大なる元ネタさまはこちらになります。

[【パズル２】ほとんどのエンジニアには解けるが、下位20％のダメなエンジニアにだけ解けないパズル?](http://tango-ruby.hatenablog.com/entry/2015/12/28/212010)


# どういうもの？

[上のURL](https://challenge-make-now-just.herokuapp.com/)に行って、どこかにヒントがあるので探して、まあなんかがんばってください。

最終的には名前と一言の入力が求められるので、そこまで来たら一応クリアということになります。
そこで入力した名前と一言はトップページに公開されることになるので注意してください。

それと、元ネタの方は最悪`curl`だけで解けますが、このパズルは厳しいと思います。むしろ不可能に近いし、趣旨に反するので出来れば色々なツールを使い分けていってください。


# なんで作ったの？

最後までやれば分かるのですが、もっと技術の深いところまで知ってもらいたいなぁ、という思いがあったからです。解けたとしても、ぱっと見ではどうやって動いているのかよく分からない部分があるかもしれません。
そういったときに少し立ち止まり、どうやってこの問題を作ったんだろう、という部分を想像してみると楽しいかもしれません。

嘘です。上は綺麗事です。純粋に楽しそうだったからです。あと、昨日録画した[SHIROBAKO](http://shirobako-anime.com/)を見て、何か作らねばいけないという衝動に駆られたからです。
どんどんドーナツどーんと行こう!!
(コイツはすぐアニメの影響を受ける)


# 最後に

記事のタグはヒントです。

それと、タイトルは敢えて元ネタのものをそのまま持ってきたのですが、ぶっちゃけほとんどのエンジニアが解ける必要がある問題だとは思ってないです。

まあちょっとでいいのでやってみてください。楽しんでもらえれば、ボクにとってそれ以上に幸いなことはありません。

https://challenge-make-now-just.herokuapp.com/
ポアソン分布に従うカウントデータの平均値の差の検定

# はじめに

業務でポアソン分布に従うカウントデータの平均値の差の検定を行う必要があったのですが、日本語の情報がなく、下記の論文を参考に実装を行ったので備忘録として残しておきます。

[A more powerful test for comparing two Poisson means]
(http://www.sciencedirect.com/science/article/pii/S0378375802004081)

検定の方法には、the conditional test (C-test) と呼ばれる方法と、この論文で提案されているP値を使った検定 (E-test) があるとのことでしたが、今回は検出力の高い E-test の方を実装しました。

# 簡単な説明

$n1, n2$：単位時間の経過回数
$k1, k2$：事象の発生回数の全期間の合計
$d$：検定したい平均の差

としたとき、

帰無仮説 $H_0: \lambda_1 = \lambda_2 + d$
対立仮説 $H_1: \lambda_1 \neq \lambda_2 + d$

の仮説検定を行う場合のP値は下記の式で求められる。

```math

\begin{align}
& \hat{\lambda}_{2k} = \frac{k_1 + k_2}{n_1 + n_2} - \frac{d n_1}{n_1 + n_2}\\[2mm]

& p = \sum_{x_1=0}^{k_1} \sum_{x_2=0}^{k_2}
\frac{e^{-n_1(\hat{\lambda}_{2k}+d)}(n_1(\hat{\lambda}_{2k} + d))^{x_1}}{x_1!}
\frac{e^{-n_2\hat{\lambda}_{2k}}(n_2(\hat{\lambda}_{2k}))^{x_2}}{x_2!}
\end{align}
```

# 実装

## 使い方

上記の式をPython と Ruby で実装したものが下記になります。例えば、比較したいカウント数がそれぞれ、40と65だった場合、２つの平均値に有意な差があるかどうか知りたい場合は、

```
pois_mean_diff_test(40, 65)
=> 0.04921332025427114
```

とするとP値を計算することができます。今回は、P値が 0.05 を下回ることがわかるので、5%水準で有意に差があるということがわかります。

## 注意点

数式をそのまま実装すると、浮動小数点の計算でオーバーフローするので、階乗の計算を下記のように分解して実装しました。

```math
\frac{e^{-n_1(\hat{\lambda}_{2k}+d)}(n_1(\hat{\lambda}_{2k} + d))^{x_1}}{x_1!}
= e^{-n_1(\hat{\lambda}_{2k}+d)} \times
\frac{n_1(\hat{\lambda}_{2k} + d)}{x_1} \times \frac{n_1(\hat{\lambda}_{2k} + d)}{x_1 -1} \times \dots \times \frac{n_1(\hat{\lambda}_{2k} + d)}{1}

```

## Pythonでの実装

```py:Python
import math
import numpy as np

def pois_mean_diff_test(k1, k2, n1=1, n2=1, d=0.0):

    x1_seq = range(0, k1 + 1)
    x2_seq = range(0, k2 + 1)
    l2k = (k1+k2)/(n1+n2) - d*n1/(n1+n2)

    p_value = sum([math.exp(-n1*(l2k+d)) * np.prod([n1*(l2k+d)/i for i in range(1, x1+1)]) * \
                   math.exp(-n2*l2k) * np.prod([n2*l2k/j for j in range(1, x2+1)]) \
                   for x2 in x2_seq for x1 in x1_seq])

    return p_value

if __name__ == '__main__':
    print "P-value is " + str(pois_mean_diff_test(40, 65))
```

## Rubyでの実装

```ruby:Ruby
def pois_mean_diff_test(k1, k2, n1=1, n2=1, d=0.0, alpha=0.05)

  x1_seq = Array(0..k1)
  x2_seq = Array(0..k2)

  l2k = (k1+k2)/(n1+n2) - d*n1/(n1+n2)

  p_value = x1_seq.product(x2_seq).map{|x| x1=x[0]; x2=x[1];
    Math.exp(-n1*(l2k+d)) * Array(1..x1).map{|i| n1*(l2k+d)/i }.inject(:*).to_f *
    Math.exp(-n1*l2k) * Array(1..x2).map{|j| n2*l2k/j }.inject(:*).to_f
  }.inject(:+)

  return p_value
end

out = "P-value is " + pois_mean_diff_test(20,10).to_s
puts out
```


# 参考文献

[K. Krishnamoorthy, Jessica Thomson, A more powerful test for comparing two Poisson means, *Journal of Statistical Planning and Inference*, Volume 119, Issue 1, 15 January 2004, Pages 23-35]
(http://www.sciencedirect.com/science/article/pii/S0378375802004081)
[Apache24] CentOS7にhttpd24をインストール

[Apache HTTP Server 2.4 by Software Collections](https://www.softwarecollections.org/en/scls/rhscl/httpd24/)

``epel-httpd24.repo``は``el6``なので``el7``のライブラリがインストールできないようだ


```shell-session

# yum install centos-release-scl
=======================================================================================================================
 Package                              Arch                  Version                        Repository             Size
=======================================================================================================================
Installing:
 centos-release-scl                   noarch                1-1.el7.centos                 extras                 12 k
Installing for dependencies:
 centos-release-scl-rh                noarch                1-1.el7.centos                 extras                 12 k

Transaction Summary
=======================================================================================================================
Install  1 Package (+1 Dependent package)

# yum install httpd24
=======================================================================================================================
 Package                            Arch               Version                        Repository                  Size
=======================================================================================================================
Installing:
 httpd24                            x86_64             1.1-9.el7                      centos-sclo-rh             3.8 k
Installing for dependencies:
 audit-libs-python                  x86_64             2.4.1-5.el7                    base                        69 k
 checkpolicy                        x86_64             2.1.12-6.el7                   base                       247 k
 httpd24-httpd                      x86_64             2.4.12-6.el7.1                 centos-sclo-rh             1.2 M
 httpd24-httpd-tools                x86_64             2.4.12-6.el7.1                 centos-sclo-rh              80 k
 httpd24-runtime                    x86_64             1.1-9.el7                      centos-sclo-rh              27 k
 libcgroup                          x86_64             0.41-8.el7                     base                        64 k
 libsemanage-python                 x86_64             2.1.10-18.el7                  base                        94 k
 policycoreutils-python             x86_64             2.2.5-20.el7                   base                       435 k
 python-IPy                         noarch             0.75-6.el7                     base                        32 k
 scl-utils                          x86_64             20130529-17.el7_1              base                        24 k
 setools-libs                       x86_64             3.3.7-46.el7                   base                       485 k

Transaction Summary
=======================================================================================================================
Install  1 Package (+11 Dependent packages)

```
VPC内のpublic subnetのインスタンスからNATを追加せずに、WEBへ接続する方法(EIPを持ってるインスタンスがいる場合)

# 参考記事
- [S3 をプロキシサーバー経由でアクセスする | cloudpack技術情報サイト](http://blog.cloudpack.jp/2014/07/10/s3-proxy-server/)
- [pipをプロキシ環境下で使って、パッケージをインストールする方法 - ろむめも](http://romth.hatenablog.com/entry/2014/09/17/075937)
- [\[linux\] proxyのせいでcurlが「curl: (7) couldn’t connect to host」でつながらない時の解決方法 | 迷走男子！！](http://tazakazushi.net/curl_proxy.html)
- [Using New Relic to Monitor Your Servers - Envato Tuts+ Code Tutorial](http://code.tutsplus.com/tutorials/using-new-relic-to-monitor-your-servers--cms-21303)


# EIPを持つインスタンスにsquid(プロキシサーバ)をインストール
```bash
$ sudo yum install squid
$ sudo vim /etc/squid/squid.conf
# 接続元のIPを設定
acl localnet src zzz.zzz.zzz.zz1/32
# 接続許可されているか確認
http_access allow localnet

$ sudo service squid start
$ sudo chkconfig squid on
```

# yumのプロキシ設定

```/etc/yum.conf
$ sudo vim /etc/yum.conf
# 下記を追加
proxy=http://10.0.0.XX:3128
```

# curl,pipのプロキシ設定

```/etc/basrc
$ sudo vim /etc/basrc
# 下記を追加
alias pip="pip --proxy=http://10.0.0.XX:3128"
alias curl="curl -x http://10.0.0.XX:3128/"
```

# newrelic-sysmond動かしたい。

```/etc/newrelic/nrsysmond.cfg
$ sudo vim /etc/newrelic/nrsysmond.cfg
# 下記を追加
proxy=http://10.0.0.XX:3128
```

# newrelic-plugin-agent動かしたい。

```/etc/newrelic/newrelic-plugin-agent.cfg
$ sudo vim /etc/newrelic/newrelic-plugin-agent.cfg
# 下記を追加
proxy: http://10.0.0.XX:3128
```

# プロキシインスタンスのセキュリティグループへWEBアクセスするEC2からの80番ポートへのINBOUNDを許可
![EC2 Management Console (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/14268/79b17230-a148-76a4-f0a1-f5f7d5080a1e.jpeg)

# NewRelicにて、データが取れてるか確認。
![ip-10-0-0-XXX - New Relic.jpg](https://qiita-image-store.s3.amazonaws.com/0/14268/09d15e46-7512-89d8-2541-1d44cd34724d.jpeg)