OmniAICreator/Qiita-1.07M huggingface dataset:
AnsibleのPlaybook実行時に牛とゆかいな仲間たちを表示させる

# 1.準備
cowsayという牛が表示されるツールをインストールします。
（参考：[コマンドラインにイラストを](http://qiita.com/b4b4r07/items/1a53862e3ee857b8888e)）

Ubuntuの場合：

```text
apt-get install cowsay
```

RedHat系の場合：

```text
yum install cowsay
```
基本的な準備は以上です。

# 2. Playbookの実行
## 2.1 普通に表示
ansibleではcowsayがインストールさている環境ではデフォルト
playbook実行時に牛が表示されるようになります。
なので普通に実行するだけです。

```text:実行例
user@ubuntu-vm:/etc/ansible$ ansible-playbook cat_pass.yml
 ______________
< PLAY [cisco] >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

 ________________________
< TASK [change password] >
 ------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

略
```
## 2.2 ゆかいな仲間たちも表示させたい
「牛だけじゃ飽きる」という方は、もっといろんな種類を表示させるには
`ansible.cfg`に以下の設定を追加します。

```text:ansible.cfg
[defaults]
cow_selection = random
```

この状態で、もう一度実行してみます。

```text:実行例（ランダム表示板）
user@ubuntu-vm:/etc/ansible$ ansible-playbook cat_pass.yml
 ______________
< PLAY [cisco] >
 --------------
   \
    \
    ____
   /# /_\_
  |  |/o\o\
  |  \\_/_/
 / |_   |
|  ||\_ ~|
|  ||| \/
|  |||_
 \//  |
  ||  |
  ||_  \
  \_|  o|
  /\___/
 /  ||||__
    (___)_)

 ________________________
< TASK [change password] >
 ------------------------
     \
      \
          oO)-.                       .-(Oo
         /__  _\                     /_  __\
         \  \(  |     ()~()         |  )/  /
          \__|\ |    (-___-)        | /|__/
          '  '--'    ==`-'==        '--'  '

changed: [192.168.1.13]
 ______________
< TASK [DEBUG] >
 --------------
   \         ,        ,
    \       /(        )`
     \      \ \___   / |
            /- _  `-/  '
           (/\/ \ \   /\
           / /   | `    \
           O O   ) /    |
           `-^--'`<     '
          (_.)  _  )   /
           `.___/`    /
             `-----' /
<----.     __ / __   \
<----|====O)))==) \) /====
<----'    `--' `.__,' \
             |        |
              \       /
        ______( (_  / \______
      ,'  ,-----'   |        \
      `--{__________)        \/
略
```
これなら飽きなそうです。

# 3. そもそも表示させたくない場合 
`ansible.cfg`に以下の設定をしておきます。

```text:ansible.cfg
[defaults]

nocows=1

```

オライリーの「[初めてのAnsible](http://www.oreilly.co.jp/books/9784873117652/)」の表紙も牛ですし、
牛を表示させておくのもよいと思います。
Firefox のキャッシュ機能を無効化する

レンタルサーバーの解約により、以前 301 リダイレクトを設定していたアドレスを元に戻すことになった。

転送元サーバーの設定を変えて、確認のため Firefox でアクセスする。予定ではステータスコードは 200 に変化していて、レスポンスのボディには数 kb の HTML が含まれているはずだった。

301 。

変更前と同じようにリダイレクトされた。

サーバーの設定がうまくいっていなかったのだろうか。同じアドレスに cURL でアクセスすると 200 が返ってきた。ボディの内容も正しい。

Firefox に戻り、付属のネットワークツールを起動させて再度アクセス。するとどうやらサーバーを見に行ってもいない。キャッシュの情報をもとに転送しているらしい。

ツールから HTTP リクエストを弄って送り直してもサーバーにアクセスせず、キャッシュのデータを参考に 301 転送。

301 Moved Permanently 。

永久に移転していることを表わすステータスなので、このエコな振る舞いは正しい。だって永久に移転していることを宣言しているのだから。

前回のアクセスからほんの数分で別のステータスになっているなんて、考えられない状態である。そんなダサく管理されたサーバーのことなんて、考慮に入れる方がダサい。

あと cURL で変更が通っているのを確認できているのに Firefox での確認に固執しているのもダサい。

### というわけで

Firefox のキャッシュを無効化する方法を調べた。

環境
----

- Firefox 46.0.1

方法
----

1. `about:config` を開く。
1. `browser.cache.disk.enable` と `browser.cache.memory.enable` を無効化する。

再起動なしで即座にキャッシュを使わなくなった。

やったー。

### 補足

- 片方だけだとキャッシュは無効化されなかった。
  - 今回問題になったのが 301 リダイレクトであることと、サーバーの設定を変更する直前にアクセスしたせい？
- ふたつ無効化するってなんかダサい。
  - 調べ方がダサいせいで見つからなかっただけかもしれない。
GoogleAppsEngineでancestor queryを使うときはparentには実在するentityを使わなくてもよい



タイトルで言いたいことをいいました。
ancestor queryを使うことにより[Strongly consistent](https://cloud.google.com/datastore/docs/concepts/structuring_for_strong_consistency)が適用されます。

```python
from google.appengine.ext import ndb

class Customer(ndb.Model):
    name = ndb.StringProperty()

class Purchase(ndb.Model):
   price = ndb.IntegerProperty()

customer_entity = Customer(name='me', id='aaa@example.com')
purchase1 = Purchase(parent=customer_entity.key, price=100)
purchase2 = Purchase(parent=customer_entity.key, price=200)
purchase1.put()
purchase2.put()
print Purchase.query(ancestor=customer_entity.key).fetch()
#[Purchase(key=Key('Customer', 'aaa@example.com', 'Purchase', 5414888608366592), price=200), Purchase(key=Key('Customer', 'aaa@example.com', 'Purchase', 5977838561787904), price=100)]

key = ndb.Key('user', 'bbb@example.com')
purchase3 = Purchase(parent=key, price=100)
purchase4 = Purchase(parent=key, price=200)
purchase3.put()
purchase4.put()
print Purchase.query(ancestor=key).fetch()
#[Purchase(key=Key('user', 'bbb@example.com', 'Purchase', 4711201166589952), price=200), Purchase(key=Key('user', 'bbb@example.com', 'Purchase', 6540788515209216), price=100)]
```
ヒアドキュメントのパラメータ展開を個別に制御する（及びそれに関してハマったところ）

ヒアドキュメントでパラメータ展開（変数等の展開）をさせないためにはテキスト終端記号を`'`、`"`、`\`を使ってクォートすればよいが、パラメータ毎に展開するか否か制御したい場合がある。

```bash:argcheck_bad.sh
cat <<EOF
$0=$0
$1=$1
$2=$2
EOF
```
```bash
$ ./argcheck_bad.sh 12 34
./argcheck_bad.sh=./argcheck_bad.sh
12=12
34=34
```
この場合は展開したくないパラメータの`$`記号を`\`でエスケープしてやればよい。

```bash:argcheck.sh
cat <<EOF
\$0=$0
\$1=$1
\$2=$2
EOF
```
```bash
$ ./argcheck.sh 12 34
$0=./argcheck.sh
$1=12
$2=34
```
以下自分がハマったところ

ところでヒアドキュメントの内容を変数に格納したい時はコマンド置換を使って次のように書ける。

```bash:argcheck2.sh
result=`cat <<EOF
\\$0=$0
\\$1=$1
\\$2=$2
EOF`

echo "$result"
```
```bash
$ ./argcheck2.sh 12 34
$0=./argcheck2.sh
$1=12
$2=34
```
ここで二重のバックスラッシュ`\\`を使っている点に注意。バッククォートを使ったコマンド置換では、原則的にはバックスラッシュ`\`はそのまま解釈されるが、`$`、`` ` ``、`\`の前にある場合は例外となるためこのようにしている。

```bash:escape.sh
result=`cat <<EOF
\ttab
\\\\
EOF`

echo -e "$result" # -eはechoにエスケープを解釈させるのに必要
```
```bash
$ ./escape.sh 
	tab
\
```
nim 0.14.0 リリース

追記
6/11に0.14.2がリリースされました。緊急リリースなのかな？

### 概要

nim 0.14.0が6/7にリリースされました。
[リリースノート](http://nim-lang.org/news/2016_06_07_version_0_14_0_released.html?hn=1)

* using ステートメント
* Generic type classes

#### サマリ

| 対象 | 件数 |
|:--|--:|
| ライブラリへの追加  | 8  |
| コンパイラへの追加  | 1  |
| 言語仕様への追加  | 3  |
| バグフィックス  | 109  |

##### using ステートメント

プロシジャの引数の型を省略するためのものみたいです。
なんかPythonぽい記述だけど、ちゃんと型はあるよっていうことですね。

```nim
var socket = newSocket()
using socket

# 第１引数がSocket型のメソッドは、記述を省略
connect("google.com", Port(80))
send("GET / HTTP/1.1\c\l")

#以下と同様
#connect(socket,"google.com", Port(80))
#send(socket,"GET / HTTP/1.1\c\l")
```

```nim
{.experimental.}
using
  c: Context
  n: Node
  counter: int

# 型指定はせずにusingパラメータをならべるだけの簡単なお仕事です
proc foo(c, n) = ...
proc bar(c, n, counter) = ...
proc baz(c, n) = ...
```
AquaSKK で ; (セミコロン) を Sticky Shift に使う

Emacs では Sticky Shift を使っているので、 Mac(AquaSKK) でも使いたかった。
実現するにはキーをリマップするアプリが必要らしかった。

## 手順
Karabiner.app をインストール [Karabiner](https://pqrs.org/osx/karabiner/) (旧KeyRemap4MacBook)

Karabiner.app 起動

```Misc & Uninstall``` タブを開く

```Open private.xml``` をクリック ![kobito.1465469365.252217.png](https://qiita-image-store.s3.amazonaws.com/0/10012/0c4a4f96-8397-69f8-3d64-b3c07846011a.png "kobito.1465469365.252217.png")

開いた XML を下記のように編集 参考: [stickyで「:」を設定(emacs skk, aquaSKK共に)](http://rakkyoo.net/?p=931) (記事のコロンをセミコロンにしただけ)

```xml
<?xml version="1.0"?>
<root>
  <list>
    <item>
      <name>Sticky Shift</name>
      <appendix>Use semicolon to Sticky Shift_L</appendix>
      <identifier>private.semicolon_to_sticky_shift_l</identifier>
      <inputmode_only>JAPANESE</inputmode_only>
      <autogen>--KeyToKey-- KeyCode::SEMICOLON, KeyCode::VK_STICKY_SHIFT_L</autogen>
    </item>
  </list>
</root>
```

```Change Key``` タブを開く
右上の ```Reload XML``` をクリックすると
設定シートの中に ```Use semicolon to Sticky Shift_L``` が表示されるのでチェック
![kobito.1465469816.041389.png](https://qiita-image-store.s3.amazonaws.com/0/10012/2ba12ab3-e295-ed70-249e-49e574b4c110.png "kobito.1465469816.041389.png")


**完了**

## 注意点

AquaSKK の IME を有効にした状態だとSKKの半角英数モードでも ; 入力出来なくなる。
IME 自体を切り替えて入力する必要がある。
AndroidでFirebase Analytics 使ってみた

Google I/O 2016で発表されてたGoogleのMobile BaaSであるFirebase.
この1機能のAnalyticsが基本無料だとかで話題になっていたので，
とりあえずAndroid AppにLogを仕込んでWebから見えるところまでやってみた．

---

# 1. Firebase Project作成

https://firebase.google.com/
にアクセスしてGoogle AccountでLoginする．
すでにGoogleにLogin中のChromeなんかでアクセスすれば，FirebaseにLoginした状態で表示される．
(ページの右上にGoogleアカウントのIconがあるのでここで気づく)

Topページの"GET STARTED FOR FREE"
↓
"新規Projectを作成"

といくとDialogがでてくるので，

- Project名
- 国

あたりを入力して"Projectを作成" をClickしてDone.

# 2. FirebaseにAndroid Appを登録

作成したProjectを選択すると，Projectの詳細画面に移動する．

"アプリを追加" をClick
↓
Android，iOS，Webの3つから選択できる．今回はAndroidを選択．
↓
3 Step のDialogが出てくるので，流れに合わせてそれぞれ入力．説明も出てくるので困らないはず．

### Step 1
このProjectとひも付けるAndroid AppのPackage名を入力．
サーバ側のAndroid-Firebaseのひも付けはこれで完了．
(Auth機能のためにSHA-1を入れるところもあるが，Analytics機能は入力なしでOK)

### Step 2
.json をDownloadして，Android StudioのApp ProjectのRootに配置．
このjsonの中にAPI KeyやOAUTHの認証なんかの情報と一緒にPackage名も入っているので，
Android側のAndroid-Firebaseのひも付けはここで行われている模様．

### Step 3
Android ProjectのProject Level/App Levelそれぞれのbuild.gradleに依存関係を追加．
Google Serviceを使ってるらしい．

```text:root/build.gradle
buildscript {
  dependencies {
    // Add for FireBase
    classpath 'com.google.gms:google-services:3.0.0'
  }
}
```

```text:app/build.gradle
// Fileの最後に入れる．これの手前に追加する関連Libに対して処理をするから順番制約があるっぽい
apply plugin: 'com.google.gms.google-services'
```

---

ここまででFirebase Service側でやることは終了．のこりはAndroid App側のみ．
(すでにbuild.gradleとか一部やってるけど)

# 3. Android AppにFirebase機能を組み込む
https://firebase.google.com/docs/android/setup#available_libraries
このページで自分が使いたい機能のLibの名前を確認，App Levelのbuild.gradleに追加する．
今回はAnalyticsなので，com.google.firebase:firebase-core:x.y.z を追加．

```text:app/build.gradle
dependencies {
  // Firebase analytics.
  compile 'com.google.firebase:firebase-core:9.0.0' // ADDED
}

// Add for Firebase.
apply plugin: 'com.google.gms.google-services'
```

これだけで，Firebaseが標準でサポートする統計情報は取得できる．
24時間くらいまってからFirebaseのProjectページからAnalyticsを見に行くと情報が取れているはず．

# 4. カスタムEventを取得する
https://firebase.google.com/docs/analytics/android/events

かなり少ない実装でLog取りできる模様．

```java:SampleActivity.java
// Get instance.
FirebaseAnalytics fba = FirebaseAnalytics.getInstance(this);

// Send event log.
Bundle bundle = new Bundle();
bundle.putString("started_app_name", "SampleActivity");
fba.logEvent("app_started", bundle);
```

Reference見ながらあとは実装していけば良さそう．
https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics

///---
Androidアプリでforegroundとbackgroundを検知する



アプリとして今foregroundにあるのか？backgroundに回っているのか？を検知するクラス。

* アプリ起動時には○○しない、などの処理に使用した。

## ActivityLifecycleCallbacksを拡張する
[参考]
* http://qiita.com/wasnot/items/e7e4699de4b21f150c63

これをベースにさせてもらいました。Activityの`onResume`,`onPause`で生きているactivityを判定するとFragment系で作っている画面が関わってくるとこの判定が狂う。
今回はほぼすべてのクラスが継承している親Activityが存在したので、そのActivityのライフサイクルを見て判断することにした。

```java:MyLifecycleHandler
public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks {
    private boolean isForeground = false;

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

    }

    @Override
    public void onActivityStarted(Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
        if (activity instanceof CommonActivity) {
            isForeground = true;
        }
    }

    @Override
    public void onActivityPaused(Activity activity) {
        if (activity instanceof CommonActivity) {
            isForeground = false;
        }
    }

    @Override
    public void onActivityStopped(Activity activity) {
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }

    /**
     * アプリが前面にいるかどうかを取得します.
     * @return Foregroundにいたら<code>true</code>,backgroundにいたら<code>false</code>をかえします
     */
    public boolean isForeground() {
        return isForeground;
    }

}
```


## ApplicationクラスでHandlerを持っておく
Applicationクラスがhandlerをメンバー変数で持っておいた。

```java
public class MyApplication extends Application {

 @Override
    public void onCreate() {
		 lifecycleHandler = new MyLifecycleHandler();
    }
~    
    public boolean isAppForeground(){
        return lifecycleHandler.isForeground();
    }
```


## アプリがforegroundかどうか取得する

foreground判定が必要なところで、
`if(((MyApplication)context.getApplicationContext()).isAppForeground())`
などで判定する。



もっとスマートにできたらいいのに！
Windowsバッチ私的テンプレート

ちょこっとした処理を書くのに未だにバッチ(Windows的bat)は便利な場合も多い。最近個人的に流行ってるテンプレをメモしておく。

~~~ sample.bat
setlocal enabledelayedexpansion
set logfile=%~nx0_%date:~0,4%%date:~5,2%%date:~8,2%.log

echo !date! !time! ほげほげ
echo !date! !time! ほげほげ >> %logfile%
~~~

いずれにしても適切にログを吐いておく習慣がないと、あんま意味が無いといえばないけども。

その他、また流行りだしたら追記する。
めざせNode.jsライブラリマスター （5）google-maps-direction-cli

#【ライブラリ説明】
　google mapを使用した２地点間の移動方法表示
　（おそらく車での移動）

#【プログラム】
　`direction <出発地> <到着地>`
<img width="401" alt="command.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/c782446f-a9b5-33c0-493d-354337d110d6.png">

google mapとの比較
<img width="274" alt="google.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/d6d5420c-3825-e8fd-de60-11f35ac0b32b.png">

#【参考サイト】
　[npm](https://www.npmjs.com/package/google-maps-direction-cli)
　[github](https://github.com/yujinlim/google-maps-direction-cli)
めざせNode.jsライブラリマスター （4）html-tableify

#【ライブラリ説明】
　jsonをhtmlテーブルへ変換する

#【プログラム】

```js:html-tableify.js
const tableify = require('html-tableify');
 
console.log(tableify([{
  name: 'optionalArray',
  description: 'Description of optionalArray.',
  required: '',
  type: 'array',
  defaultValue: '[]'
}, {
  name: 'optionalBool',
  description: 'Description of optionalBool.',
  required: '',
  type: 'bool',
  defaultValue: 'false'
}], {
  headers: [{
    name: 'name',
    align: 'left',
    title: 'Your Name'
  }, {
    name: 'description',
    align: 'left'
  }, {
    name: 'type',
    align: 'left'
  }, {
    name: 'required',
    align: 'center'
  }, {
    name: 'defaultValue',
    align: 'center',
    title: 'Default Value'
  }]
}));
/*
<table>
  <thead>
    <tr>
      <th style="text-align: left">Your Name</th>
      <th style="text-align: left">Description</th>
      <th style="text-align: left">Type</th>
      <th style="text-align: center">Required</th>
      <th style="text-align: center">Default Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">optionalArray</td>
      <td style="text-align: left">Description of optionalArray.</td>
      <td style="text-align: left">array</td>
      <td style="text-align: center"></td>
      <td style="text-align: center">[]</td>
    </tr>
    <tr>
      <td style="text-align: left">optionalBool</td>
      <td style="text-align: left">Description of optionalBool.</td>
      <td style="text-align: left">bool</td>
      <td style="text-align: center"></td>
      <td style="text-align: center">false</td>
    </tr>
  </tbody>
</table>
*/
 
console.log(tableify([{
 name: 'optionalArray',
 description: 'Description of optionalArray.',
 required: '',
 type: 'array',
 defaultValue: '[]'
}, {
 name: 'optionalBool',
 description: 'Description of optionalBool.',
 required: '',
 type: 'bool',
 defaultValue: 'false'
}], {
 tidy: false
}));
// <table><thead><tr><th style="text-align: center">Name</th><th style="text-align: center">Description</th><th style="text-align: center">Required</th><th style="text-align: center">Type</th><th style="text-align: center">DefaultValue</th></tr></thead><tbody><tr><td style="text-align: center">optionalArray</td><td style="text-align: center">Description of optionalArray.</td><td style="text-align: center"></td><td style="text-align: center">array</td><td style="text-align: center">[]</td></tr><tr><td style="text-align: center">optionalBool</td><td style="text-align: center">Description of optionalBool.</td><td style="text-align: center"></td><td style="text-align: center">bool</td><td style="text-align: center">false</td></tr></tbody></table>
```

#【結果】
<img width="381" alt="tabel.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/485f68c7-4ce0-fd46-f0ef-a508867ec477.png">

#【参考サイト】
　[npm](https://www.npmjs.com/package/html-tableify)
　[github](https://github.com/ly-tools/html-tableify)
【論文シリーズ】積層ノイズ除去自己符号化器

## 原文
[ノイズ除去積層自己符号化器：局所的なノイズ除去基準を利用した深層ネットワークにおける有用な特徴量の学習(Stacked denoising autoencoders: Learning useful representations in a deep network with a local denoising criterion)](http://goo.gl/Ln1G9J)
Pascal Vincent (2010)

## 1. 要約
* 岡谷青本5.7.2項の元論文(詳細記述)
* 自己符号化器の入力値にノイズ(corrupted input)を付加し、出力層へ再構成させる。
* 結果的には、ノイズを除去する機構の学習にもつながり、対照モデルに比べ、頑健性が増す。
* SVMのような浅層の識別器にも適用できる。



## 2. 骨子の理論
～ノイズの種類～
・ガウシアンノイズ→標準正規分布に基づく乱数を入力値に加える
・マスキングノイズ(MN)→入力要素のうち、一部をマスキングして、自己符号化器が使えないようにする
・ソルト＆ペッパーノイズ(SP)→入力値のうち、一部を最大値か最小値(たいてい0と1)のいずれかに変換する(白黒画像のような2値データを扱うときに有効)

自己符号化器の評価関数は、ノイズ(corruption)の場合も内包したモデリングになる。まず、二乗誤差関数を評価する場合。

```math
L_{2,\alpha}({\bf x},{\bf z}) = \alpha\Bigl(\sum_{j\in J(\tilde{\bf x})}({\bf x}_j - {\bf z}_j)^2\Bigr) + \beta\Bigl(\sum_{j\notin J(\tilde{\bf x})}({\bf x}_j - {\bf z}_j)^2\Bigr)
```
$J(\tilde{\bf x})$はノイズ項の集合を表す。
交差エントロピーを評価関数に置く場合は、次のようになる。

```math
L_{{\bf H},\alpha}({\bf x},{\bf z}) = \alpha\Bigl(-\sum_{j\in J(\tilde{\bf x})}[{\bf x}_j\log{\bf z}_j - (1-{\bf x}_j)\log(1-{\bf z}_j)]\Bigr) + \beta\Bigl(-\sum_{j\notin J(\tilde{\bf x})}[{\bf x}_j\log{\bf z}_j - (1-{\bf x}_j)\log(1-{\bf z}_j)]\Bigr)
```
αおよびβは、設定パラメータである。
SDAEの模式図を下に記す。この図では、マスキングノイズの様子を図示している。

![151126141544_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/913618d9-e04a-6eb3-78c2-00e8b5b31007.jpeg)



## 3. モデル適用例
①順伝播型NN、DBNとの比較
MNISTに色んな脚色を施したサンプルを用意して、性能を比較した。
期待通り、3層SDAEのパフォーマンスが最も良かった。

![151126141544_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/8b3b3b1b-65d3-7246-c9d3-ac2f3f2ba210.jpeg)


②テストデータのノイズ量との関係
ノイズが少ない領域では、積層の数に応じて識別能力が高くなった。しかし、ノイズの程度が大きくなるほど積層による効果の差分がなくなっていった。

![151126141544_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/7299fbac-3e9f-e85e-cb0e-1a5b07155a0c.jpeg)


③SVMのようなNN以外の識別器との併用について
結論を言うと、パフォーマンスの向上が確認された。

![151126141544_6.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/434f25c7-7213-2a99-d9bd-e3aade2778a3.jpeg)
gulp.spritesmithで出力画像の順番がめちゃくちゃになってハマった

このオプションを付けることで直りました。

```js:config.js
algorithmOpts: {sort: false}
```

最終的なspriteのコンフィグは下記の通り

```js:config.js
  sprite: {
    src: src + '/**/sprite/*.png',
    dest: dest + '/image/',
    options: {
      imgPath: '/image/sprite.png',
      imgName: 'sprite.png',
      cssFormat: 'stylus',
      cssName: '_sprite.styl',
      algorithm: 'top-down',
      algorithmOpts: {sort: false}
    }
  }
```
（できるけど望ましくなさそう）生PHPにて、クラスの外部からグローバル定数を参照

# やりたかった事

フレームワークを使わず生PHPを使用しているWebサイトにおいて・・・

不特定多数のページで同一のものを使う設定を、設定ファイルに記載し使用箇所で参照する。
その設定を、クラスの中でも使いたい。

この定数、クラス定義の中からでも参照できないかな？と考えた。


# 環境
PHP 5.4

# 実装例

サーバ内において、
`/page.php`というファイルから
`/conf/config.php` という設定ファイルおよび
`/function/someone.php`というクラスが記載されているファイルを参照すると仮定。

```php:page.php
<?php
  //設定ファイルとクラスファイルを参照する
 require_once("/conf/config.php");
 require_once("/function/someone.php");

 //インスタンス作ってメソッド呼び出し
 $so = new someOne();
 $so->hello();
?>
``` 

```php:/conf/config.php
<?php
  //設定ファイル。説明に関係有るものだけ記載する。
  define(TEXT_REGEX,"/^invalid/");
?>
``` 

```php:/function/someone.php
<?php
  //クラスの定義（説明用なのでごく単純）
  class someOne{
    public function hello(){
      echo TEXT_REGEX;
    }
  }
?>
``` 

# ブラウザでの表示結果

page.phpをブラウザで開くと、確かにグローバル定数の内容が表示される

```page.php
/^invalid/
```

# できたけど、致命的な問題があるし、もっと他の方法があったのでやめた

このsomeOneクラスには、致命的な問題がある。
外部の、定義されているかどうかわからない定数を使っているため、変な依存関係があることだ！

（定数が定義されていなければ、エラーを発することになる）

そして、実運用においてはもっと良い方法があった。
なんてことはない。

正規表現処理と判定は、クラスの外側でやればよかった（笑）
RecyclerViewのdividerをDataBindingで設定する

DataBindingのカスタムBindingAdapterを使って楽する。

## 都合の良いItemDecorationを用意する

```DividerDecoration.java
public class DividerDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;

    public DividerDecoration(Drawable drawable) {
        mDivider = drawable;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    }
}
```


## カスタムBindingAdapterを定義する

```RecyclerViewBindingAdapter.java
public class RecyclerViewBindingAdapter {

    @BindingAdapter("dividerDrawable")
    public static void setDividerDrawable(RecyclerView recyclerView, Drawable drawable) {
        recyclerView.addItemDecoration(new DividerDecoration(drawable));
    }
}
```


## XMLで指定する

```activity_main.xml
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
        app:dividerDrawable="@{@drawable/divider}"/>

</layout>
```

```drawable/divider.xml
<shape
    xmlns:android="http://schemas.android.com/apk/res/android">

    <size android:height="1dp"/>
    <solid android:color="@color/divider_color"/>

</shape>
```
ASP.NET Web APIのJSONをprrety printする


# モチベーション

[翻訳: WebAPI 設計のベストプラクティス - Qiita](http://qiita.com/mserizawa/items/b833e407d89abd21ee72#json-%E3%81%AF%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E6%95%B4%E5%BD%A2%E3%81%97%E3%82%88%E3%81%86)

> JSON はデフォルトで整形しよう
圧縮された状態の JSON をブラウザ上で見るのは、決して気持ちの良いものではありません

はい。整形されたJSONを返したいです。

# 手段

[Web API Poster - ASP.net](http://www.asp.net/media/4071077/aspnet-web-api-poster.pdf)によると、アクション（Controllerのメソッド）の返した結果を変更するには、ActionFilterを追加します。
事後処理は`OnActionExecuted`メソッドに定義します。

```csharp:PrettyPrintFilterAttribute.cs
using System.Net.Http.Formatting;
using System.Web.Http.Filters;

namespace WebApplication1
{
    public class PrettyPrintFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            JsonMediaTypeFormatter jsonFormatter = actionExecutedContext.ActionContext.RequestContext.Configuration.Formatters.JsonFormatter;
            jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
            base.OnActionExecuted(actionExecutedContext);
        }
    }
}
```


AcitionFilterを[HttpConfiguration](https://msdn.microsoft.com/ja-jp/library/system.web.http.httpconfiguration(v=vs.118).aspx)に登録すると、すべてのアクションに適用できます。

```csharp:WebApiConfig.cs
using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API の設定およびサービス
            config.Filters.Add(new PrettyPrintFilterAttribute());

            // Web API ルート
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}
```

`WebApiConfig.Register`は`Global.asax.cs`で呼び出されている前提です。

```csharp:Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;

namespace WebApplication1
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}
```


# 参考
- [Handling json pretty print param in ASP.NET Web API application in HttpConfiguration instance - Stack Overflow](http://stackoverflow.com/questions/29289185/handling-json-pretty-print-param-in-asp-net-web-api-application-in-httpconfigura)
- [ASP.NET MVC4 の Web API を学んでみる その4 〜Filter編〜 - 割と普通なブログ](http://normalian.hatenablog.com/entry/20121014/1350217800)
- [ASP.NET Web API で 独自 フィルター の実装方法](http://garafu.blogspot.jp/2013/11/aspnet-web-api_2.html)
めざせNode.jsライブラリマスター （3）python-runner

#【ライブラリ説明】
　node.jsでpythonが使える

#【プログラム】
```js:python-runner.js
var Python = require("python-runner");
 
Python.exec(
	"print('Carma Carpooling')" + "\n" + 
	"print('Get there together')" + "\n"
	//Carma Carpooling
	//Get there together
)
.then(function(data){
	console.log(data);
});
```
他にもpython3を使えたり、.pyファイルからの実行が可能

#【参考サイト】
　[npm](https://www.npmjs.com/package/python-runner)
　[github](https://github.com/teamcarma/node-python-runner)
セレクトボックスを選択したらサブミット

##### セレクトボックスを選択したらサブミットしてほしい時がありませんか？
##### （例えば、名古屋事業所と福岡事業所とで表示させる内容を変えたい時とか）
##### 忘れるといけないので、書き留めておこうと思います。 
## ①submit()関数をonchangeイベントで呼び、this.formのアクションを実行させる方法
```html:html
<form method="post" action="#">
<select name="office" onchange="submit(this.form)">
  <option value="名古屋">名古屋</option>
  <option value="福岡">福岡</option>
</select>
</form>
```
## ②①の処理をJQuery関数で作成
```js:jQuery
<script type="text/javascript">
$(function(){
  $("#submit_select").change(function(){
    $("#submit_form").submit();
  });
});
</script>
```
```html:html
<form id="submit_form" method="post" action="#">
<select id="submit_select" name="office">
  <option value="名古屋">名古屋</option>
  <option value="福岡">福岡</option>
</select>
</form>
```
## ③複数のセレクトボックスがある場合(例えば、事業所＋表示件数)
##### 　idに添字番号を付与し取得する、それだけで十分です。
```js:jQuery
<script type="text/javascript">
$(function(){
    $("[id^=submit_select]").change(function(){
        $("#submit_form"+$(this).attr("id").slice(-1)).submit();
    });
});
</script>
```
```html:html
<form id="submit_form1" method="post" action="#">
<select id="submit_select1" name="office">
  <option value="名古屋">名古屋</option>
  <option value="福岡">福岡</option>
</select>
</form>
<form id="submit_form2" method="post" action="#">
<select id="submit_select2" name="office">
  <option value="100">100</option>
  <option value="10">10</option>
</select>
</form>
```
## ④最後にメソッド名を付けプラグイン化してみます
```js:jQuery
<script type="text/javascript" src="./scripts/jquery.select-submit-change.js"></script>
<script type="text/javascript">
$(function() {
  $("[id^=submit_select]").SelectSubmitChange();
});
</script>
```
```js:jquery.select-submit-change.js
;(function($) {
  $.fn.SelectSubmitChange = function(){
    $(this).change(function(){
      $("#submit_form"+$(this).attr("id").slice(-1)).submit();
    });
  }
})(jQuery);
```
Gulpのyamlタスクが動かない


こちらの記事を参考にGulpを導入したが、vinyl-yaml-dataで引っかかって動かなかった。

## 解決方法
npmのバージョンを5.7以上にあげる。

npmのバージョンが0.12.12だったので、最新の6.2.1にあげたら動いた。

## 参考
[Github](https://github.com/ParsePlatform/parse-dashboard/issues/278#issuecomment-212004486)
めざせNode.jsライブラリマスター （2）humem

#【ライブラリ説明】
　メモリの使用量がわかる

#【プログラム】
```js:humen.js
var humem = require('humem');

console.log(humem.freemem);
// 3.65 GB

console.log(humem.totalmem);
// 8.51 GB

console.log(humem.usedmem);
// 4.86 GB
```

#【参考サイト】
　[npm](https://www.npmjs.com/package/humem)
　[github](https://github.com/hemanth/node-humem)
Android でステートマシンを実現するメモ（Enum版）


State パターン（GoF）を適用したくなるケースとしては、同じメソッドでも **状態** によって処理の内容が変わる場合、かつ、`if` 文等による分岐処理を書くと複雑になりコードの見通しが悪くなってしまう場合。または **状態** に関連するコードを一箇所に集めて見通しを良くしたい場合。

> 例：通信状態の場合はローディングを表示したい、ボタン押下を無効にしたい等

今回は次のような **状態** と **遷移** の簡単なステートマシンを実現したいとします。

```
  [ Idle ]

      ↓ doApiCall()

  [ Processing ]
```

これを Java の `Enum` で表現すると次のようになります。今回は `Enum` の定義を Activity のコードの中に内包します。

> コード量が多くなる場合は `Enum` 用のファイルを別に作ってもよいかと思います。また状態を `Enum` でなくクラスで表現する方法もあります。

```java:SampleActivity
public class SampleActivity extends AppCompatActivity {

    // ...

	// 普通に Activity のロジックを書く。今回は略
	
	// ...

    private State state = State.Idle; // 初期状態

    // 状態を変更するメソッド
    private void changeState(State nextState) {
        state.exit(this);
        state = nextState;
        state.enter(this);
    }

    // ステートマシン。状態別に処理させたい内容を定義
    private enum State {
        Idle {
            @Override
            public void doApiCall(SampleActivity parent) {
                parent.changeState(Processing); // 状態を Processing へ変更

                // 何か通信処理 ..
            }
        },
        Processing {
            // 今回は略してますが enter() でローディング表示など書く
        },
        ;
        public void enter(SampleActivity parent) {} // 状態に入った際の処理を何か定義したい場合はオーバーライドする
        public void doApiCall(SampleActivity parent) {} // 中身が空なのでオーバーライドしなければ呼びだされても何も処理されない
        public void exit(SampleActivity parent) {} // 状態から出た際の処理を何か定義したい場合はオーバーライドする
    }
}
```

> `Enum` の中で直に `SampleActivity` を参照していますが `Interface` を定義して参照しても良いかと思います。

あとは Actvity のどこかで `state.doApiCall(this)` とすれば通信処理が始まり、状態は `Processing` に遷移します。`Processing` 状態では `doApiCall()` を受け付けません（オーバーライドしていないので）。

今回は省略していますが、通信処理が終わったらまた状態を `Idle` に戻せばよいかと思います。

State パターンでは状態遷移をどこから指示するか問題があり、上記の例では状態遷移メソッド `changeState()` を `Enum` の定義の中から呼び出していますが、状況に応じて Activity 側から `changeState(State.Processing)` のように呼び出して遷移させても構いません。

## ほか

- 状態数が少ない場合やそもそも複雑でない場合は使わない方がよいかもしれない。
- `if` 文で分岐している処理やフラグで分岐する処理は何でもこれで表現したくなる気分になるが、それを「状態」として昇格するか吟味すること。
	- フラグはフラグで分かりやすいケースは多い。
- Rx のストリームの中で分岐処理を書きたい場合に有用かも（未検証）。

## 参考にした記事・書籍

- [要約：知らないと損するアプリ開発におけるStateMachineの活用法](http://qiita.com/mokemokechicken/items/9a4f7dea5a0fe37bd26f)
- [Java言語で学ぶデザインパターン入門(書籍)](https://www.amazon.co.jp/dp/4797327030/)
- [Android:Stateパターンを使ったアプリの状態遷移の実装例](http://taiyoproject.com/post-121)
- [隊長、Androidアプリのソースがぐちゃぐちゃであります！！](http://qiita.com/tshinsay/items/bf5c3bd7a9f928f8a920#%E5%86%85%E5%9C%A8%E3%81%99%E3%82%8B%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%9E%E3%82%B7%E3%83%B3%E3%82%92%E6%B4%97%E3%81%84%E5%87%BA%E3%81%99)
Macのbrewで旧バージョンのアプリをインストールする

* 前はbrew versionsというのがあったそうだが、「非推奨です」→「使えません」となったそうな。
* 似たような名前だが、Homebrew-versionsというものを使うとインストールできるようになる。

## homebrew-versions導入

* brewコマンドでhomebrew/versionsをtapする。
	
	```console
	$ brew tap homebrew/versions
	```

## bomebrew-versionsの使い方

* 旧バージョンのbisonをインストールしてみる。

	* インストールできるバージョンをチェック。
			
		```console
		$ brew search bison
		bison            homebrew/versions/bison27
		```
	* bison 2.7をインストール

		```console
		$ brew install homebrew/versions/bison27
		```

	* リンクを貼る

		```console
		$ brew link homebrew/versions/bison27 --force
		```
		
	* バージョンを確認
		
		```console
		$ bison --version
		bison (GNU Bison) 2.7.12-4996
		Written by Robert Corbett and Richard Stallman.
		
		Copyright (C) 2013 Free Software Foundation, Inc.
		This is free software; see the source for copying conditions.  There is NO
		warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
		```

		* 無事バージョンが上がった。
GitHub PagesをHTTPSにしてみる

こちらの記事をTwitterで見かけたので...
https://github.com/blog/2186-https-for-github-pages

試しに、すでに作ってある**GitHub PagesをHTTPSにしようと思います。**

### ① `Settings`を選択
![スクリーンショット 2016-06-09 17.43.10.png](https://qiita-image-store.s3.amazonaws.com/0/53996/746abf10-ec7f-a8bf-63e4-cb1afdf7bc4c.png)

### ② 下の方にある`GitHub Pages`の`Enforce HTTPS`を選択
![スクリーンショット 2016-06-09 17.43.35.png](https://qiita-image-store.s3.amazonaws.com/0/53996/747e8b04-665b-e50e-f3f5-836138a1366b.png)

### ③ HTTPSになっているか確認する
※時間がかかる場合がある

![スクリーンショット 2016-06-09 17.44.04.png](https://qiita-image-store.s3.amazonaws.com/0/53996/5063b7c6-1c87-1a62-dfbf-d08b96b6dd99.png)

以上です。とても簡単でした。

## おまけ

- GitHub Pagesって、何？という人は、[こちら](https://pages.github.com/)を参照してください。
Laravel5でページャーを自前のテンプレートを用いる方法

ここ一ヶ月ぐらいLaravel5.1を触るようになって
勉強しながら色々覚えていった内容を正当なやり方かわかりませんが書きとめておきます。

Presenterを使うのはほとんど他に書いてあるエントリーと同じですが
私が見つけた記事では大体が(new XXXPresenter($paginator))->render();
という形でテンプレートで書き換えているか
Controller側で同じようにnewしてるのだったので
ここではテンプレートは書き換えず設定を行う方法を書いておきます

下記はSimpleBootstrapThreePresenterを継承して次へ前への文字列を変えただけです

```php:app/Presenters/SmartphonePresenter.php
<?php

namespace App\Presenters;

use \Illuminate\Pagination\SimpleBootstrapThreePresenter;

class SmartphonePresenter extends SimpleBootstrapThreePresenter
{

    public function render()
    {
        if ($this->hasPages()) {
            return sprintf(
                '<ul class="pager">%s %s</ul>',
                $this->getPreviousButton(\Lang::get('pagination.previous')),
                $this->getNextButton(\Lang::get('pagination.next'))
            );
        }

        return '';
    }

}
```

そして上のPresenterを下記のようにミドルウェアでpaginateのpresenterに設定

```php:app/Http/Middleware/Pagination.php
<?php

namespace App\Http\Middleware;

use Closure;

class Pagination
{
    public function handle($request, Closure $next)
    {
        \Illuminate\Pagination\LengthAwarePaginator::presenter(function($t){
            return new \App\Presenters\SmartphonePresenter($t);
        });
        return $next($request);
    }
}
```

あとはKernelのmiddlewareにPaginationを設定すれば
テンプレート側では
{{ $items->render() }}
のように元々の書き方のまま自前のテンプレートを反映させることができます。

この書き方であれば
middlewareで条件判断して
スマホ用、タブレット用、PC用とページャーを出し分けることができるようになります。
<Bus Stop プロジェクト用>おすすめツール

#ツールについて

プログラミングやチームでの開発、ファイルの管理など便利なツールを使えば効率的に作業ができます。
ツールを使いこなせるかで時間効率や手間が天と地ほど差が出ますね。

学生目線でいいと思ったツールを紹介します。

##プログラミングの勉強
###ドットインストール
[ドットインストール](http://dotinstall.com/lessons)
プログラミングを動画形式で学ぶことができて、手軽でおすすめです！
参考書は挫折する可能が高めなので、まずこのサイトで触りを勉強するのがいいかもしれません。
一つの動画は2分くらいです。
###Qiita
[Qiita](http://qiita.com)
プログラミングの知識を記事として投稿してノウハウの共有ができるサイトです。いろいろな分野の技術について知れるのでおすすめ！
暇つぶしにもなります！

###SlideShare
[SlideShare](http://www.slideshare.net)
企業の人が作った資料を閲覧できるサイトです。
いろいろな情報を集めるのにおすすめです！

##開発
###Sublime Text
[Sublime Text](http://www.sublimetext.com)
プラグインが充実しているテキストエディタです。
###Atom
[Atom](https://atom.io)
プラグインが充実しているテキストエディタです。

###GitHub
[GitHub](https://github.com)
バージョン管理で有名なgitのホスティングサービスです！
ここではソースコードの公開や、バージョン管理やレビューができます。
ぜひgitについて勉強してみてください。

###IntelliJ IDE
[IntelliJ](https://www.jetbrains.com/idea/)
Java言語での開発ではよく使われるIDEです。eclipseと似た感じです。

##チームでの作業
###Slack
[Slack](https://slack.com/is)
最近流行っているチャットツール！
チャットでの話し合いや、進捗報告などを素早くできます。
またチャットツールの中でもSlackが流行っている理由で大きいのは、外部ツールとの連携ができるってところです。
カスタマイズでGitHubとの連携なんかもできます！

###サイボウズLive
[サイボウズLive](https://live.cybozu.co.jp)
プロジェクト内ツールとしても使われているグループウェア！
サイボウズ製品は使いやすさが特徴です！
チームでスケジュールやTodoやファイルの共有などが無料で行えます！
PCやスマートフォンどちらからでも見やすのもいいですね。

##その他
###EVERNOTE
[EVERNOTE](https://evernote.com/intl/jp/)
友達とノートを共有できたり、PCとアプリで素早く共有できるノートツールです。

###Dropbox
[Dropbox](https://www.dropbox.com)
有名なストレージサービスです。
友達とファイルの共有などができておすすめです。

###Trello
[Trello](https://trello.com)
ToDoを管理することができるツールです。やることを視覚的に確認することができるのがいいところです。
カードをドラッグアンドドロップしてリスト間を移動させることで進捗を表現できます。
SQLのcountを使った条件分岐


```sql
CREATE table person(
id int not NULL auto_increment primary key,
sex VARCHAR(255)
);
```

I insert data.


```sql
INSERT INTO person(sex)VALUES('m');
INSERT INTO person(sex)VALUES('m');
INSERT INTO person(sex)VALUES('m');
INSERT INTO person(sex)VALUES(null);
INSERT INTO person(sex)VALUES(null);
INSERT INTO person(sex)VALUES('f');
INSERT INTO person(sex)VALUES('f');
INSERT INTO person(sex)VALUES('f');
INSERT INTO person(sex)VALUES('f');
```

These are current data.

```sql
SELECT * FROM person;
```

![スクリーンショット 2016-06-09 16.45.54.png](https://qiita-image-store.s3.amazonaws.com/0/39073/f330cf17-1041-e29e-63ce-fa4b6f381968.png "スクリーンショット 2016-06-09 16.45.54.png")

```sql
SELECT COUNT(*) FROM person;
```

=> 9

The COUNT() does not count null.

```sql
SELECT COUNT(sex) FROM person;
```

=> 7

sex='m' is 3. Other false data return null.
The COUNT() does not count null.

```sql
SELECT COUNT(sex='m' or null) FROM person;
```

=> 3

sex='f' is 4. Other false data return null.
The COUNT() does not count null.

```sql
SELECT COUNT(sex='f' or null) FROM person;
```

=> 4


We can count male, female in both way.

```sql
SELECT
  COUNT(sex='m' or NULL),
  COUNT(sex='f' or NULL)
FROM person;
```

```sql
SELECT
  SUM(CASE WHEN sex='m' then 1 else 0 end),
  SUM(CASE WHEN sex='f' then 1 else 0 end)
FROM 
 person; 
```

We can check SQL cost like this.
It is same in this case.

```sql
SHOW LOCAL STATUS like 'Last_query_cost';
```
【論文シリーズ】RNNを言語モデルに組み込む

## 原文
[RNNベースの言語モデル(Recurrent neural network based language model)](http://goo.gl/sqRxHk)
Tomas Mikolov (2010)

## 1. 要約
* NN (Neural Network) より進んだ言語モデル(Language Model)として、RNN (Recurrent Neural Network) を起用した。RNN言語モデルの先駆け的位置づけの成果ではないだろうか。
* RNNのもつ**記憶効果(long- or short- term memory; LSTM effect)**により、不変な特徴量の抽出(語順や位置関係)が精度よくできる。


## 2. 骨子の理論
RNNの骨子も、基本はNNにある。
言語モデルのNNで特徴的なのは、投射層(projection layer)の存在である。
N字の入力ワードは、1-of-K符号化法という手法で、一度変換される。
各文字列において、文字がある／ないという判断を0/1に変換して格納する(例：3文字目が"b"だったら、26次元のアルファベットベクトルにおいて、1次元目の"a"には0, 2次元目の"b"には1を入れるという感じ)
その後、線形変換で、投射層 (Projection Layer) に落とし込まれる。

![151126111712_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/3b06b803-230e-ef3f-3afb-640d84276626.jpeg)


RNNのコンセプトは、教科書どおりである。
前後の記憶を、言語上の文脈(Context)把握として捉えている点が特徴である。

![151126111712_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/ce02a73f-c2b0-2185-ba22-e3c2cab165af.jpeg)


RNN化に伴い、頻度の低い単語は、ひとつのトークンに結合するとパフォーマンスが改善するらしい。


## 3. モデル適用例
Switchboardというコーパスから400万語を取り上げ、性能を比較した。
PPLは、Perplexityの略で、数値が低い方が、誤用が少ない(＝性能がいい)と解釈できる。
RNNのネットワークが大きく、N-gram法を併用して万全の実装をしたモデルが、最良の成果を出した。

![151126111712_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/72512730-36bd-be1e-32f7-ae1ad1c6e676.jpeg)
pandasでaverage pairwise correlationの計算がめっちゃ簡単だったのでメモ

## average pairwise correlationってなに

いったいこの計算をする必要がある人が世界に何人いるかはおいといて。

average pairwise stock correlationとは株式どうしの値動きの相関係数の平均をとったものです。一般に、リーマンショックや欧州債務危機やらの危機時には市場全体が大きく下げ、その後反動で大きく上げる、という環境になり、株式同士の相関係数が高くなります。相関が跳ね上がるとどの銘柄も同じように動くので、アクティブ株式投資家が銘柄選択によって超過収益を稼ぐのが難しい市場環境になります。
ということで、この指標を使ってポートフォリオのリスクレベルを調整したり（勝てる見込みが少ないときにはリスクを落とす等）するのに使います。もっとしょぼい例としては、アクティブ株式運用者が「最近勝ててませんがこういう市場環境ですから勘弁して下さい」という言い訳に使ったりします...

## pandasを使うとこんなに簡単

まずはデータを用意します。縦に日付(m日とします）、横に株式銘柄(n個とします）、各要素に株式の日次リターンが入ったDataFrame（m x n）を用意しましょう。
今回はデータは外で用意してcsvで読み込みました。
[こちらの記事](http://qiita.com/ynakayama/items/1801d374224d6914a382)などを参考にして、pandasを使ってyahooから株価をダウンロードして`pct_change()`メソッドを使って日次リターンに直してもよいでしょう。

そしていよいよ相関係数を計算するのですが、

```py
# pairwise correlation の計算 (結果はPanel)
result = df.rolling(window=60, min_periods=30).corr()
```
rolling pairwise correlationの計算はこれ一行で完了！
やっていることは「その日までの日次リターンの60日ぶんの全銘柄間の相関係数をとった相関行列(n x n行列)を計算。ただし30日ぶんのデータがない銘柄については`None`とする。これを全日付で繰り返す」です。結果の`result`は`pandas.Panel`オブジェクトで2次元の`DataFrame`に軸（時間軸）を一つ増やして3次元（m x n x n）になったものです。

correlationの計算はできましたが、平均をとるのにはひと工夫必要です。これは 1)相関行列なので対角成分には1が入っており、これを抜いた平均を取る必要がある 2)データ欠損で相関係数が計算できなかった場合はNone値が入っており、これを抜いた平均を取る必要がある という2つの理由からです。

まず対角成分の1ですが、`Numpy`の`np.fill_diagonal()`を使い、`None`値に変更することにします。単一のDataFrameに対しては`np.fill_diagonal(df, None)` のように使いますが、今回は次のように`apply()`メソッドを使って`Panel`全体に適用します。

```py
# 対角成分をNoneに変換する
tmp = result.apply(lambda x: np.fill_diagonal(x.values, None), axis=(1,2)) 
```

次に`mean(skipna=True)`メソッドを適用して、None値を無視した平均値を計算します。これがaverage pairwise correlationです。こちらも`apply()`メソッド一発で時間軸にわたって適用します。

```py
# Noneを無視して平均を計算する
apc = result.apply(lambda x: x.unstack().mean(skipna=True), axis=(1,2))
```

`Panel.apply(..., axis=(1,2))`とすると、時間軸を動きながら、各時点における相関行列をDataFrame `x` として取り出しながら順番に処理できます。

もう計算は完了です！プロットしてみます。

```py
apc.plot()
```
![correlation.png](https://qiita-image-store.s3.amazonaws.com/0/96897/e5a1fa91-f0a4-258a-2f05-78e141744e45.png)

時折訪れる、マクロ要因に市場が左右される時期に相関が跳ね上がっているのがわかります。

## おわりに

コードをまとめるとたったこれだけ。簡単ですね。
pandasは作者のWes McKinney氏がヘッジファンドのAQR Capital在職中に開発をはじめたものだけあって、金融データの取り扱いがとっても簡単にできるようになっています。

```py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# データ読み込み
df = pd.read_csv('data.csv', na_values=' ', index_col=0, parse_dates=True)
# pairwise correlation の計算 (結果はPanel)
result = df.rolling(window=60, min_periods=30).corr()
# 対角成分をNoneに変換する
tmp = result.apply(lambda x: np.fill_diagonal(x.values, None), axis=(1,2)) 
# Noneを無視して平均を計算する
apc = result.apply(lambda x: x.unstack().mean(skipna=True), axis=(1,2))
# プロットする
apc.plot()
```

## 参考文献

- Pandasドキュメント。`rolling`メソッドはpandas 0.18.0以降で変更されたので、最新のpandasに更新してからお使い下さい。
http://pandas.pydata.org/pandas-docs/stable/computation.html#window-functions
Swiftの関数とメソッド

swiftの関数とメソッドの違いについてのメモ。
たまに関数とメソッドの違いってなんだっけってなりますよね。

引数、処理、戻り値の書き方などは一緒ですが、メソッドは、インスタンスについて実行し、インスタンスのプロパティを操作するところが関数と違うようです。

#関数
関数は、関数です。
「function」の名の通り、「機能」 です。
これはまあ理解できますね。

```
// 二つの整数を足す関数（機能）
func plusWithNum(num1: Int, num2: Int) -> Int{
    return num1 + num2
}

// 実行
plusWithNum(3, num2: 5)
```

#メソッド
問題はメソッドについてです。
メソッド（method）という単語を辞書で引いてみると〜「方法」や「手段」と訳されています。
つまり、メソッドは、関数と同じように戻り値を返すこともできますが、基本的にはインスタンスのプロパティを操作する方法（メソッド）として使うものだと推測されます。

```
// Scoreクラス
class Score {
    var score: Int = 0 // クラスの変数（プロパティ）
    
    // scoreを設定するメソッド
    func setScoreWithPoint(point: Int){
        score = point
    }

    // scoreを追加するメソッド
    func addScoreWithPoint(point: Int){
        score += point
    }
    
    // 値を返すメソッド
    func plusWithNum(num: Int) -> Int{
        return score + num
    }
}
```
メソッドを実行するためには、インスタンスを作成して実行する。

```
let score = Score()
score.setScoreWithPoint(3)
score.addScoreWithPoint(6)
var num = score.plusWithNum(4)
```


メソッドは、インスタンスに関して実行するので、<インスタンス>.<メソッド> と書きます。
値を返すplusWithNum(_:)はどうでしょうか。クラスのプロパティを使っていますが、プロパティを変更はしていないので、メソッドとしては意図された使い方ではないと思われます。
こういう時は、`var num = score.point + 4` とすればよいですね。

#結論
メソッドは、インスタンスのプロパティを操作するための関数。



P.S. 変なところなどありましたらコメントください。
めざせNode.jsライブラリマスター （1）xlsx-chart

#【ライブラリ説明】
　Excelでグラフが描ける

#【プログラム】
```js:xlsx-chart.js
var XLSXChart = require ("xlsx-chart");
var xlsxChart = new XLSXChart ();
var opts = {
	file: "chart.xlsx",
	chart: "column",
	titles: [
		"Title 1",
		"Title 2",
		"Title 3"
	],
	fields: [
		"Field 1",
		"Field 2",
		"Field 3",
		"Field 4"
	],
	data: {
		"Title 1": {
			"Field 1": 5,
			"Field 2": 10,
			"Field 3": 15,
			"Field 4": 20 
		},
		"Title 2": {
			"Field 1": 10,
			"Field 2": 5,
			"Field 3": 20,
			"Field 4": 15
		},
		"Title 3": {
			"Field 1": 20,
			"Field 2": 15,
			"Field 3": 10,
			"Field 4": 5
		}
	}
};
xlsxChart.writeFile (opts, function (err) {
  console.log ("File: ", opts.file);
});
```

#【結果】
　chart.xlsxが自動的に作成される。
　<img width="583" alt="excel.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/ff8df360-67dc-a935-bc95-8f1192af0589.png">


#【参考サイト】
　[npm](https://www.npmjs.com/package/xlsx-chart)
　[github](https://github.com/objectum/xlsx-chart)
homebrew python環境構築

#Macでの構築メモ

##方針
- なるべくシンプルに
- 始めたばかりなのでpython3で頑張る
- 混乱するのでPythonのバージョン切り替えはpyenv globalのみ
- jupyter使いたいのでanacondaをpyenvでインストール
- opencv3別途インストール
- [バージョン切り替えについての基本思想はこちらの方に合わせた:Qiita](http://qiita.com/oct_itmt/items/2d066801a7464a676994)


##環境
- OSX 10.11.5(El Capitan)
- homebrewインストール設定済み

###Python3環境の構築
```
$brew install python
$brew install pyenv
$pyenv install anaconda3-4.0.0（一番新しいのを入れる）
$pyenv global anaconda3-4.0.0
$pyenv rehash
$brew tap homebrew/science
$brew install opencv3 --with-python3
```

.bash_profileなどに以下記載。最初に~/.pyenvを参照するように。

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

jupeter notebookを起動してpython3の新規ノート作成、import cv2でエラーがないことを確認。

### anaconda navigatorは何ができるのかよくわからない。
anacondaをインストールすることでMaｃのデスクトップにanaconda navigatorが現れる。
jupyterやIpythonの起動ボタンはあるけど、別に普通にターミナルからコマンド打てば起動するし。。。

これで環境（Pythonバージョン）の切り替えもできるようだけど、自分の環境では上手く切り替わらない。

`$pyenv versions`
に作った環境は表示されるのだが、切り替わらない。。。
`$pyenv global navigatorで作った環境`
としても切り替わらない・・・
なにこれ？？
(下記のAnaconda3を入れた後、python２．７を使いたくなった時の環境構築法に従うと切り替わった）

####参考にさせていただいた方々
[MacでPython使う時の最低限のメモ（Homebrew編）](http://qiita.com/zaburo/items/fbdaf6c04151671407db#_reference-afd07033bae66927324c)
[pyenv globalで切り替わらない！](http://qiita.com/1234224576/items/11ad3509fe4b0a9a33ed)
[Anaconda3を入れた後，python2.7を使いたくなった時の環境構築法](http://qiita.com/LittleWat/items/166f976cccf30bc63e62)
[HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ](http://qiita.com/oct_itmt/items/2d066801a7464a676994)
[Anacondaを入れたらHomebrewの環境が吹っ飛んだ話](http://qiita.com/spiky00/items/3f3ca3a2092e531ea1ad)
めざせNode.jsライブラリマスター （０）リンク集

#【概要】
　Node.jsのライブラリをいろいろ試していきます。
　実行するコードは自分が分かる範囲で、最小限にしておきます。
　Node.jsのバージョンは4.4.5です。
　npmのバージョンは2.15.5です。

#【試したライブラリ】
　Excelでグラフが描ける
　　[めざせNode.jsライブラリマスター （1）xlsx-chart](http://qiita.com/Algebra_nobu/items/a437081ddf4695771dd4)
　メモリ使用量がわかる
　　[めざせNode.jsライブラリマスター （2）humem](http://qiita.com/Algebra_nobu/items/7deb6e1f9c646b988fb2)
　pythonが使える
　　[めざせNode.jsライブラリマスター （3）python-runner](http://qiita.com/Algebra_nobu/items/4149aceb66691b846ec3)
　jsonをhtmlテーブルへ変換
　　[めざせNode.jsライブラリマスター （4）html-tableify](http://qiita.com/Algebra_nobu/items/a653c5e9cb60d1a98597)
　２地点間の移動方法
　　[めざせNode.jsライブラリマスター （5）google-maps-direction-cli](http://qiita.com/Algebra_nobu/items/d4d21d5c657282af8d98)
　画像の色情報を抽出
　　[めざせNode.jsライブラリマスター （6）image-palette](http://qiita.com/Algebra_nobu/items/93b1d35389551e53363f)
　Excel操作ができる
　　[めざせNode.jsライブラリマスター （7）exceljs](http://qiita.com/Algebra_nobu/items/735314ceea1b0e43091a)
　文字列にHTMLタグ付け
　　[めざせNode.jsライブラリマスター （8）html-enclose](http://qiita.com/Algebra_nobu/items/84a105fde68be15ef2cb)
　画像操作
　　[めざせNode.jsライブラリマスター （9）jimp](http://qiita.com/Algebra_nobu/items/09f61c93d81e89bc4d0b)
　CPUやメモリの情報を取得
　　[めざせNode.jsライブラリマスター （10）windows-cpu](http://qiita.com/Algebra_nobu/items/0cfbf3eec447841f83b4)
　音楽作成
　　[めざせNode.jsライブラリマスター （11）scribbletune](http://qiita.com/Algebra_nobu/items/7131b8d5c0eff2ba1f18)
　Webサイトのスクリーンショットが撮れる
　　[めざせNode.jsライブラリマスター （12）webshot](http://qiita.com/Algebra_nobu/items/e9457abee786942fde7f)
　wifiを使って自分の位置がわかる
　　[めざせNode.jsライブラリマスター （13）wifi-triangulate](http://qiita.com/Algebra_nobu/items/f5b4bc22e5409503efdf)
　関数の実行時間を計測できる
　　[めざせNode.jsライブラリマスター （14）time-taken](http://qiita.com/Algebra_nobu/items/3742fa84955e4936bf80)
　コンソールの色を変更
　　[めざせNode.jsライブラリマスター （15）colors](http://qiita.com/Algebra_nobu/items/d5008f39deb8131ae459)
　ファイル名やフォルダ名の取得
　　[めざせNode.jsライブラリマスター （16）find](http://qiita.com/Algebra_nobu/items/7f2d4e523908d1fabb09)
#【参考サイト】
　[npm](https://www.npmjs.com/)

#【python編】
　[めざせpythonライブラリマスター （０）リンク集](http://qiita.com/Algebra_nobu/items/761d99c9ef87ecf99524)
guzzle で Http通信する


````
composer require guzzlehttp/guzzle
````

## 通信処理

基本的な通信の仕方

````
use GuzzleHttp\Client;

$client = new Client();
$res = $client->requestAsync($method,$url,$options)->wait();
````

様々な記法が存在しているが概ね以下の様な形でまとまる。

`request()`による呼び出しは 内部で requestAsync()->wait() を呼び出す。

`get` `post` と言ったメソド名呼び出しは、動的にメソド名を第一引数に据えてrequest を呼び出す。

`getAsync` `postAsync` と言ったメソド名呼び出しは、動的にメソド名を第一引数に据えてrequest Asyncを呼び出す。

### PSR7 によるリクエスト

PSR7形式でのリクエストオブジェクトが存在する場合には sendメソドが利用できる。

````
use GuzzleHttp\Psr7\Request;
$request = new Request('GET', 'http://foo.com', ['X-Foo' => 'test']);
$client->send($request,$options);
````

send と sendAsync の関係は request / requestAsyncの関係とほぼ同じ。

psr7 だけど送信時にoptionを上書き指定することが出来る。

## Options 

詳しくはこちらを参照
http://docs.guzzlephp.org/en/latest/request-options.html

### body / json / form_params / query
 
文字列、リソースまたは`Psr\Http\Message\StreamInterface`で指定する。

````
$client->request('PUT', '/put', ['body' => 'some big body string data...']);
````

json を使用したい場合にはjson キーで配列を渡すほうが楽そう

````
$client->request('PUT', '/put', ['json' => ['foo' => 'bar']]);
````

フォームリクエストを行いたい時にはform_params

```` 
$client->request('POST', '/post', [
    'form_params' => [
        'foo' => 'bar',
        'baz' => ['hi', 'there!']
    ]
]);
````

またGETで使用するURLパラメータには query を使用する事

````
$client->request('GET', '/get', ['query' => ['foo' => 'bar']]);
````

### headers

連想配列で指定する。

````
$client->request('GET', '/get', [
    'headers' => [
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);
````

### http_errors

false にするとエラーをはかなくなる。

デフォルトでは4xx 5xxで例外を投げてくる。

## Client オブジェクトの役割

Client 関数にはコンストラクタでオプションを渡す事が可能となっており、
定型的なリクエストのフォーマットを複数送りたい時などに便利。

option の `handler`という項目にHandlerStack を追加すると、
リクエスト処理にMiddlewareを追加する事ができるそう。この辺はまた次回暇を見て書きたい。

http://docs.guzzlephp.org/en/latest/handlers-and-middleware.html