OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studioでビルドエラー : Unable to locate a java runtime to invoke android studio

コードは変更していないのに、急に`Unable to locate a java runtime to invoke android studio`というエラーでビルドできない時の対処方法です。

```java
Execution failed for task ':app:assembleProductionRelease'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
  	/Developer/android-sdk-osx/build-tools/19.0.1/dx --dex --output ....略...
  Error Code:
  	1
  Output:
  	Unable to locate a Java Runtime to invoke.
```

結論からいうと、他のgradleデーモンプロセスが原因みたいです。
以下のコマンドで一回stopしてから再度実行するとうまくいくはずです。

```shell
$ ./gradlew --stop
```
ノートパソコンを閉じてもスリープにしない方法

ノートパソコンを閉じてもスリープにならないようにして、
外部ディスプレイのみで作業したい。

### 1. デスクトップでスタートボタンを押し、コントトールパネルに行く。
コントロールパネル　＞　ハードウェアとサウンド

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/2079c021-1253-f7d9-ca62-0d9ceb49f262.png)


 
### 2. ハードウェアとサウンド　＞　電源オプション

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/cb70b142-d03b-6ff2-dd76-020d7b767795.png)


 
### 3. 電源オプション画面の左ナビにある「カバーを閉じたときの動作の選択」をクリック

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/84c7da8b-b877-ec6d-91a5-62a79074043b.png)


 
### 4. カバーを閉じたときの操作のところから「何もしない」を選択し、変更の保存を押す。

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/9dbdd9db-bbdd-88da-6548-43b708d13144.png)
dataLayerを制するものはGTMを制す

お仕事で自社タグをGoogleTagManagerに対応できないか調査した時に、結局これが分かっていれば大丈夫だなと思ったことです。
解析ノウハウではありません。

# GoogleTagManagerのタグ

## Before

```html
<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
```

## After

```html
<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>

<script>
  (function (window, document, script, dataLayer, id) {
    window[dataLayer] = window[dataLayer] || [];
    window[dataLayer].push({
      'gtm.start': new Date().getTime(),
      event: 'gtm.js'
    });

    var js  = document.getElementsByTagName(script)[0],
        gtm = document.createElement(script),
        dl  = dataLayer != 'dataLayer' ? '&l=' + dataLayer : '';

    gtm.async = true;
    gtm.src = '//www.googletagmanager.com/gtm.js?id=' + id + dl;
    js.parentNode.insertBefore(gtm, js);

  })(window, document, 'script', 'dataLayer', 'GTM-XXXXXX');
</script>
<!-- End Google Tag Manager -->
```

## 7行目に注目！

```js
    window[dataLayer] = window[dataLayer] || [];
```
dataLayerをグローバル配列として定義しています。

# dataLayerの中身

3つのオブジェクトがデフォルトで格納されています。

![dataLayer.png](https://qiita-image-store.s3.amazonaws.com/0/51479/b17cf3e0-b5e6-65f2-6f5b-feeb8f91bc18.png)

## {event: "gtm.js", ... }

GoogleTagManagerのタグが読み込まれたタイミングで発生するイベント

## {event: "gtm.dom", ... }

DOMの読み込みが完了したタイミングで発生するイベント
（DOMContentLoadedイベントと同じ）

## {event: "gtm.load", ... }

外部リソースも含めて完全に読込が完了したタイミングで発生するイベント
（loadイベントと同じ）

# dataLayerのカスタマイズ

上記で見たように、dataLayerは配列なので、`.push()`で独自のデータを追加して、GoogleTagManager管理画面で利用できます。

## イベントの追加

```js
dataLayer.push({'event': 'event_name'});
```

## 変数の追加

```js
dataLayer.push({'variable_name': 'variable_value'});
```

## 増えました
![dataLayer2.png](https://qiita-image-store.s3.amazonaws.com/0/51479/3bd0f4a5-098e-18d7-ccce-da260df76fe0.png)

# あとは、、、

GoogleTagManager管理画面で、「どのタグ」を、「どのタイミング」で、「どのページ」に適用するかを制御するだけです。

gtm.domイベントがあるお陰で、ある程度のDOM操作も可能でしょう。
PHPの変数 Set/Get 用関数つくった

PHPで変数をグローバルに Set/Get したいときに個人的に使っている関数。

```php
function vars($keys = null, $value = null)
{
	static $values = array(), $buffer = array();

	if (empty($keys)) {
		return $values;
	} elseif (is_string($keys)) {
		if (null !== $value) {
			if (false !== strpos($keys, '.')) {
				$ex = explode('.', $keys);
				$last = count($ex) - 1;
				$current = current($ex);

				$before = $after = null;
				foreach ($ex as $i => $key) {
					if ($i !== $last) {
						$before .= '{"'.$key.'":';
						$after .= '}';
					} else {
						$before .= '{"'.$key.'":'.json_encode($value);
						$after .= '}';
					}
				}
				
				$data = json_decode($before.$after, true);
				$values[$current] = array_replace_recursive(
					$values[$current],
					$data[$current]
				);
				return $buffer[$keys] = $value;
			} else {
				$values[$keys] = $value;
				return $value;
			}
		} elseif (!empty($values[$keys])) {
			return $values[$keys];
		} elseif (!empty($buffer[$keys])) {
			return $buffer[$keys];
		} else {
			$value = $values;
			foreach (explode('.', $keys) as $key) {
				if (!array_key_exists($key, $value)) {
					return null;
				}
				$value = $value[$key];
			}

			return $buffer[$keys] = $value;
		}
	}
}
```

第一引数がキー、第二引数が値で、値がある場合はSet、値がない場合はGetになる。
基本的な使い方としては以下のような感じ。

```php
// キーを「A」、値を「B」とした変数のセット
vars('A', 'B');

// キー「A」を取得
echo vars('A'); //　-> "B"



// 「A」を上書き
vars('A', 'アタイはAの値');

// 再びキー「A」を取得
echo vars('A'); //　-> "アタイはAの値"



// もちろん多次元配列などもセット可能
$value = array(
    'C1' => 'ぼくはC1の値',
    'C2' => array(
        'C2-1' => '俺はC2-1の値',
        'C2-2' => 'オラ、C2-2の値',
        'C2-3' => '我はC2-3の値',
    )
);

vars('C', $value);


// 引数なしの場合は、これまでセットした全部を取得
$all = vars();
/*
array(
    'A' => 'アタイはAの値',
    'C' => array(
        'C1' => 'ぼくはC1の値',
        'C2' => array(
            'C2-1' => '俺はC2-1の値',
            'C2-2' => 'オラ、C2-2の値',
            'C2-3' => '我はC2-3の値'
        )
    )
)
*/


// 存在しないキーの場合は NULL が返る
var_dump(vars('who')); // -> NULL
```

多次元配列の場合、下層の値へはドットつなぎの文字列でアクセス可。

```php
// 上の例でセットした「C2-2」の値を取得
echo vars('C.C2.C2-2'); // -> "オラ、C2-2の値"
```

下層の配列の一部を上書きしたい場合もドットつなぎで。

```php
// 上の例でセットした「C2-2」の値を再セット
vars('C.C2.C2-2', '小生がC2-2を上書き');

echo vars('C.C2.C2-2'); // -> "小生がC2-2を上書き"


// この時、「C」の配列は以下のようになっている
array(
    'C1' => 'ぼくはC1の値',
    'C2' => array(
        'C2-1' => '俺はC2-1の値',
        'C2-2' => '小生がC2-2を上書き', // ここだけ上書き済み
        'C2-3' => '我はC2-3の値',
    )
)
```

ドットつなぎでの取得は `static` 変数でプチキャッシュしてるので2回目以降は速いはず。  

それと、関数内で `array_replace_recursive` という関数を使っていて、これは PHP5.3 からの機能なので、それ以下のバージョンの場合は [公式ドキュメントにあるユーザー関数](http://php.net/manual/ja/function.array-replace-recursive.php#109390) とかを書いておく必要があるかも。
libGDX & Box2Dで、長方形の剛体を作るときの注意

libGDXで、Box2Dを使用するときに、うっかり間違ったまま使っていたポイントを紹介します。
(Box2Dの基本的な使い方は割愛します。)

## まちがった長方形の作り方

長方形の剛体を作るとき、こんなコードを書きます。

```
Texture img = new Texture("square.png");
Sprite sprite = new Sprite(img);

float w = sprite.getWidth();   // 100px
float h = sprite.getHeight();  // 100px

// ここから剛体の定義

BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(300, 200);

Body body = world.createBody(bodyDef);
body.setUserData(sprite);

PolygonShape shape = new PolygonShape();
shape.setAsBox(w, h);    // <===== ここ注目!

FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.restitution = 0.6f;

body.createFixture(fixtureDef);

shape.dispose();
```

PolygonShapeオブジェクトを作成して、横幅、縦幅を指定して形を指定しています。
square.pngが100x100(px)なので、__100x100px相当の剛体が定義できません。__

Box2Dで計算した座標にあわせて、Spriteを描画すると、以下のようになります。
(Spriteの描画位置は、中心があうようにしています。)
(四角の外側にある、細い線はDebugRendererの表示で、剛体の境界を示します。)

![large_shape.png](https://qiita-image-store.s3.amazonaws.com/0/68840/b03230ce-058f-55c1-c89a-bf8258d5bfc1.png)


画像の倍の大きさの剛体が定義されていることがわかります。

## 正しい長方形の作り方

PolygonShape.setAsBox(float, float)のソースコードを見ると、__横幅・縦幅ともに半分の値を指定するよう、javadocに書いてありました。__

したがって、縦幅・横幅を半分にしましょう。

```
  PolygonShape shape = new PolygonShape();
- shape.setAsBox(w, h);    // <===== ここ注目!
 +shape.setAsBox(w/2, h/2);// <===== それぞれ半分
```

画像サイズとぴったりになりました。

![correct_shape.png](https://qiita-image-store.s3.amazonaws.com/0/68840/1e383b1a-c5e2-37f1-d8a1-b69555b45d39.png)

## まとめ

- 長方形の剛体定義は、横・縦半分の値を指定する。
- JavaDocコメントで引数の意味は確認する。

※実は、setAsBoxは縦横半分があたりまえなんでしょうか?
 Box2Dに詳しいわけではないので、詳しい人教えてください。

[使用したコード @ gist](https://gist.github.com/ichiko/b9608edf39764197c763)
追いかけてくるフローティングボックスを作る



# やりたいこと
こういうソーシャルボックスとかが、記事をスクロールしてもついてくる感じのやつ
http://websae.net/wordpress-starter-theme-20141104/
![スクリーンショット 0026-11-13 午後0.01.05.png](https://qiita-image-store.s3.amazonaws.com/0/18614/a8cadbe6-cde8-233c-7000-072aa5b78a05.png)

# 仕組み
jQueryを使って、指定した位置より下にスクロールしたら、ボックスのdisplayプロパティがabsoluteからfixedに変わるようにする。



# ソース

```html:article.html
<div id="float-sns-box">
	ボックス
</div>
```

```css:style.css
#float-sns-box {
	position: absolute;
	width: 100px;
	height: 470px;
	margin-left: -110px;
	display: block;
	border: #e0e0e0 1px solid;
	z-index: 2;
	background-color: white;
}
```


```js:floating.js
// HTMLの要素が全て準備できれば処理を行う
var setBoxId = '#float-sns-box';      // スクロールさせる要素
var initOffsetTop = null;   // 要素の初期位置
$(document).ready(function() {
    // 初期位置取得
    initOffsetTop = $(setBoxId).offset().top;
    
});

//スクロールしたらこの処理が走る
$(window).scroll(function() {
	scrollbox();
});
 
// スクロール処理
function scrollbox(){
    // 初期位置が取れていなければ処理を抜ける
    if(initOffsetTop == null) return;
    
    // 現在のスクロール位置を取得
    var scrollTop = $(document).scrollTop();
 
    // スクロールさせる要素の初期位置と現在のスクロールの位置を比較
    //初期位置より下にスクロールした時
    if(initOffsetTop < scrollTop) {
        // positionを設定
        $(setBoxId).css('position', 'fixed');
        // topの位置を設定
        $(setBoxId).animate({top: '10'}, {duration: 0});
    } else {
        // 設定したスタイルを持とに戻す
        $(setBoxId).css('position', 'absolute');
        $(setBoxId).animate({top: initOffsetTop}, {duration: 0});
    }
}
```
以上でできるはず。
MACで隠しファイルを表示する方法


# 手順

## 1. ターミナルを起動して以下のコマンドを実行

```
$ defaults write com.apple.finder AppleShowAllFiles TRUE
```

## 2. Finderを再起動
以下のコマンドでFinderを再起動させる。

```
$ killall Finder
```

以上。


# もとに戻す方法

上記のTRUEの部分をFALSEにすればOK。

```
$ defaults write com.apple.finder AppleShowAllFiles FALSE
```
NumPy でビンの作成、データとビンの対応関係の取得

データをビンに分けてヒストグラム等を描画する処理自体は、matplotlibの hist() に array を渡せばデータに応じて良い感じのビンに切り分けて描画してくれますが、任意のビンでデータを分けたい場合や、どのデータがどのビンに入っているか知りたい場合があります。

今回は、ビンの作成および、データとビンの対応関係を取得を行います。


分布の作成
===
まず適当な分布の array を作成します。

```py
import numpy

n = 100
dist = numpy.random.normal(0, 1, n)

```

ビンの作成
===
ビンの数の妥当性に関しては議論があるようですが、Microsoft Excel 等では標準でデータ数 n に対してビンの数 k を n の平方数とするみたいです。


```math
k=\sqrt{n}
```

今回はこの方法でビンの数を決めて、データの範囲を k 分割する array をビンとして作成します。

```py
import math

bin_num = math.sqrt(n)
bins = numpy.linspace(min(dist), max(dist), bin_num)
```

次のような array が作成されました。

```
[-2.28875045 -1.72785426 -1.16695807 -0.60606188 -0.0451657   0.51573049 1.07662668  1.63752287  2.19841906  2.75931524]
```

確認
===
作成したビンを使ってデータがどのようにプロットされるか確認してみます。

```py
import matplotlib.pyplot as plt

plt.hist(dist, bins=bins) 
plt.show()
```

![binning.png](https://qiita-image-store.s3.amazonaws.com/0/3139/78abb134-2b8f-dc49-4e0b-b51ee6257396.png)



データとビンの対応の取得
===
numpy.digitize() でデータに対応したビンの位置情報が格納されたリストを取得できます。

```py
bin_indice = numpy.digitize(dist, bins)

```

以下の結果の場合は、dist[0] は4番目のビン、dist[1]は5番目のビンに対応するという感じです。

```
[ 4  5  8  6  4  6  8  1  6  6  8  2  6  3  5  4  5  4  5  3  8  2  5  5  4 4  4  4  2  3  5  6  5  3  4  3  7  6  4  3  4  4  8  2  4  4  8  6  6  3 6  2  9  5  5  4  4  1  8  6  5  5  5  5  4  1 10  3  1  8  7  3  4  3  8 2  6  5  6  3  6  7  5  3  3  5  5  5  4  1  3  6  5  6  7  3  4  7  8  4]
```

zip() でくっつけてみます。

```py
bin_data_map = zip(dist, bin_indice)
```

```
[(-0.16840296791127732, 4), (0.43715458127052381, 5), (1.8635306330264274, 8), (0.89273121368100206, 6),...
```
bashやzshで動かすshell-scriptでランダムな数値を得るの術

RANDOM環境変数を取ると良い感じ。

```shell-script
echo $RANDOM
```

`man bash`によると、0~32767の値が得られるとのこと。

```
Each  time this parameter is referenced, a random integer between 0 and 32767 is generated.  The sequence of random numbers may be initialized by assigning a value to RANDOM.  If RANDOM is unset, it loses its special
              properties, even if it is subsequently reset.
```

セキュアな用途だったら`openssl`や`/dev/random`を使うべきですが、ちょっとしたスクリプトを書くときには便利っぽい。
ssh接続して「REMOTE HOST IDENTIFICATION HAS CHANGED!」と表示され接続できない際の対処

# 事象

ターミナルからssh接続した際に下記のエラーメッセージが表示され、接続できない。

```text:terminal
$ ssh 192.168.1.101
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
4d:4c:ae:ae:74:5e:df:65:11:79:27:4c:01:d5:14:20.
Please contact your system administrator.
Add correct host key in /c/Users/korenaga_makoto/.ssh/known_hosts to get rid of this message.
Offending key in /c/Users/user_name/.ssh/known_hosts:12
RSA host key for 192.168.1.101 has changed and you have requested strict checking.
Host key verification failed.
```

# 原因

指定したホスト名に過去に接続したことがあり、その際のRSAキーのフィンガープリントと異なる為。

# 解決策

自身のユーザフォルダ内の.ssh/known_hostsを編集し、接続しようとしていたホスト名の行を削除する

# 備考

今回はVirtualBoxの仮想サーバを切り替えた際に発生しました。
力試し：SwiftのOptionalでこれできますか？　にチャレンジ

サクッとやってみました(Swift 1.1)

元記事はこちらです。
http://qiita.com/koher/items/627a90017e3d4be1dd5b

まずはシンプルなカスタムオペレータを定義します。

```swift
infix operator >>> { associativity left }
public func >>><T, U>(optional: T?, f: T -> U?) -> U? {
    if let x = optional {
        return f(x)
    } else {
        return nil
    }
}
```

次にそれを使って問題を解決します。

```
// 1.
func function1(x: Double?) -> Double? {
    return x >>> { sqrt($0) }
}
println("1. ---")
println(function1(nil))
println(function1(2.0))

// 2.
func function2(x: String?) -> Int? {
    return x?.toInt()
}
println("2. ---")
println(function2(nil))
println(function2("10"))

// 3.
func safeSqrt(x: Double) -> Double? {
    return x < 0.0 ? nil : sqrt(x)
}

func function3(x: Double?) -> Double? {
    return x >>> safeSqrt
}
println("3. ---")
println(function3(nil))
println(function3(-2.0))
println(function3(2.0))

// 4.
func function4(a: Int?, b: Int?) -> Int? {
    return a >>> { a in
        b >>> { b in
            a + b
        }
    }
}
println("4. ---")
println(function4(nil, nil))
println(function4(nil, 2))
println(function4(1, nil))
println(function4(1, 2))

// 5.
func function5(a: Int?) {
    if let a = a {
        println(a)
    }
}
println("5. ---")
function5(nil)
function5(2)
function5(nil)
function5(1)
```

出力

```
1. ---
nil
Optional(1.4142135623731)
2. ---
nil
Optional(10)
3. ---
nil
nil
Optional(1.4142135623731)
4. ---
nil
nil
nil
Optional(3)
5. ---
2
1

```

はい、完全に

functional programming in swift
http://www.objc.io/books/

から得たものをほとんどそのまま書いているだけです。すみません。
2015/2月 Windows上への最新Ruby on Rails環境の構築（トラップ解除済み）


WindowsでRuby on Rails環境を構築してみました。その際に現在のWindowsでのRails環境の構築には意外と落とし穴があったのでメモしてきます。（以下、仮想マシン上に構築するのも良いですが、やっぱり素のディレクトリにファイルがあるのは便利です。なので、rubyinstallerを使ってインストールすることにします。）

## 1.Rubyをインストールする (通常運転)
[http://rubyinstaller.org/downloads/](http://rubyinstaller.org/downloads/)
より、rubyinstallerを取得し、インストールします。普段通りです。（最新版はrubyinstaller-2.1.5-x64.exe）です。

## 2.DevKitをインストールする。（通常運転）

同じサイトにあるDevKit（DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe）をダウンロードします。自己解凍形式のファイルですので、devkitと名づけたディレクトリを作成し、その中へ解凍します。

これをRubyをインストールしたフォルダにコピーし、その場所で以下のコマンドを実行します。これもいつも通りです。

```
>ruby dk.rb init

>ruby dk.rb install
```

## 3.Poodleバグ対応をする（落とし穴１）

[Poodleバグ](http://internet.watch.impress.co.jp/docs/news/20141015_671482.html)は昨年Googleが発表したバグのこと。SSL v3を使えなくなった関係で、gem取得の際に利用する証明書環境が変更されています。

[こちら](http://qiita.com/shimoju/items/394818b4989b94680aaf)のとおりに証明書を追加します。手順を実行し、新しい証明書を取得して、以下のフォルダにコピーしておきます。

(Rubyをインストールしたフォルダ)\lib\ruby\2.1.0\rubygems\ssl_certs

## 4.gemコマンドでRailsをインストールする(通常運転)

いつも通りgemができるようになりましたので、Railsをインストールします。

```
> gem install rails --no-ri --no-rdoc

```

## 5.JavaScript実行環境（落とし穴2)

最後のエラーはScaffoldした際に発生します。普段通りscaffoldされたページにアクセスすると、サーバー内でJavaScriptが実行され、その際にExecJS::RuntimeErrorが発生します。[こちら](http://stackoverflow.com/questions/12520456/execjsruntimeerror-on-windows-trying-to-follow-rubytutorial)に、いろいろ対応が書いてあります。

結局はJavaScriptを動かすエンジンがよくないのでNode.jsいれておくが正解です。

ということで、[Node.js](http://nodejs.org/)をインストールします。Windows版のバイナリがあるので黙ってインストールします。


## 6.いつもどおり!!

これでいつも通りのRails環境の出来上がりです。お疲れ様でした。心置きなく

```
>rails new MyApp

```
しましょう。

とはいえ、すんなりインストールできるようにして頂戴。。。
SQLのCOALESCEと同じステートメント

[??　演算子](http://msdn.microsoft.com/en-us/library/ms173224.aspx)

```csharp
class NullCoalesce
{
    static int? GetNullableInt()
    {
        return null;
    }
    static string GetStringValue()
    {
        return null;
    }

    static void Main()
    {
        int? x = null;
        // x が null でなければ y に x が代入される。このケースでは -1 になる。
        int y = x ?? -1;

        // メソッドの戻り値 が null でなければ i に 戻り値 が代入される。このケースでは default(int) (=0) になる。
        int i = GetNullableInt() ?? default(int);

        // ?? は参照型でも有効。このケースでは Unspecified が出力される。
        string s = GetStringValue();
        Console.WriteLine(s ?? "Unspecified");
    }
}
```

Linqを使う方法もある(Coalesceメソッドのところ)
[?? Coalesce for empty string?](http://stackoverflow.com/questions/2420125/coalesce-for-empty-string)
DateTimeの計算は参照渡し

知らなかった・・のでメモ。

ある時間から5分前の時刻を取得したい。そんなとき

```php
$date = new \DateTime('2015-02-15');
$subDate = $date->sub(new \DateInterval('PT5M'));
var_dump($subDate)
```

とやればいいのね、と思っていたが、じつは`$date->sub`で新しいDateTimeオブジェクトが返るわけではなく、$dateオブジェクト自体が変更され、その参照が返るみたい（参照渡し）。

参照渡しされてますね。

[実行プログラム]

```php
$date = new \DateTime('2015-02-10');

$subDate = $date->add(new \DateInterval('PT5M'));
var_dump($subDate);
var_dump($date);
```

[結果]

```html
object(DateTime)[1]
  public 'date' => string '2015-02-09 23:55:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Asia/Tokyo' (length=10)
object(DateTime)[1]
  public 'date' => string '2015-02-09 23:55:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Asia/Tokyo' (length=10)```
```

ということで下記のようにすればいいです。

```php
$date = new \DateTime('2015-02-10');

$cloneDate = clone $date;
$cloneDate->sub(new \DateInterval('PT5M'));
var_dump($cloneDate);
var_dump($date);
```

```html
object(DateTime)[2]
  public 'date' => string '2015-02-09 23:55:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Asia/Tokyo' (length=10)
object(DateTime)[1]
  public 'date' => string '2015-02-10 00:00:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Asia/Tokyo' (length=10)
```

[追記]
PHP5.5以上であれば[DateTimeImmutable](http://php.net/manual/ja/class.datetimeimmutable.php)（DateTimeとは違い自身を変更せずオブジェクトを返す）を使うことで、簡単に実装できるそうです。
bundle updateで特定のgemのみ更新する

# 概要

既存のbundlerを使ったプロジェクトを立ち上げる時、通常は、 `bundle` とするだけで、 Gemfile.lock の内容に沿って gem がインストールされる。これは非常に便利。

ただ、特定の gem がOSのバージョン等によりインストールが失敗してしまうことがある。（例えば、 therubyracer とか libv8 などの gem）

この時、次のようにすれば、最新のOSで動作する状況には持っていけるはず。
（※その gem が常に最新のOSに追随しているとき）

```shell-session
bundle update
```

しかし、この方法では、目的外の gem まで更新してしまうことがあり、
それによって、アプリケーションが予期しないエラーを吐いたりすることがある。

（※最新の gem でも動くようにするべきだという指摘はあるかもしれないが、今回とは別問題）

# 方法

実は、 bundle update は gem の名前をオプションとして渡すと、その gem だけをupdate してくれる。
ちなみに、man によると、複数指定もできる。

```shell-session
bundle update therubyracer
```

そして、Gemfile.lock ファイルが更新される。

# 注意点

ただし、上記の方法だと依存関係にあるものも同時に更新されてしまうので注意。

~~依存関係を更新しないためには次のようにすればいいらしい（未確認）~~

```shell-session
bundle update --source therubyracer
```

追記：
コメントで教えたいただきましたが、現在は --source を使うのではなく、 --conservative を使うのが正しいとのことです。参考にあげていた stackoverflowの方も更新されています。

```shell-session
bundle update --conservative therubyracer
```

# 参考情報
http://stackoverflow.com/questions/11263150/update-just-one-gem-with-bundler
http://bundler.io/v1.7/man/bundle-update.1.html

### 蛇足
問題が生じた状況や例示しているgemたちも変更したいところだが。
VirtualBox上のCentOSにインストールしたPostgreSQLに外部接続する際にハマった

1日無駄にしたので、記録残しておきます。
VirtualBox上にCentOS6を作って、PostgreSQLをインストールし、ホストマシンからpsqlでアクセスしようとしましたが、
上手く行きませんでした。
失敗したコマンドは以下の通り。

`> psql -h ipアドレス -U ユーザ名 データベース名`

ホストマシンや、CentOS自身のコンソールから実行した↑のコマンドに対して、
↓のようなエラーを返してテコでも動きませんでした。

`FATAL: no pg_hba.conf entry for host ipアドレス user "ユーザ名", database "データベース名", SSL off`

上記のエラーメッセージを検索して出てくる解決策である、
data/pg_hba.confの『host all all 0.0.0.0/0 trust』
や、
data/postgresql.confの『listen_addresses = '*'』
も設定したのにダメ。
VirtualBoxのネットワーク設定でホストオンリーアダプターも設定済み（ipアドレスはデフォルトの192.168.56.1）だし、
ipアドレスにpingを打ってもちゃんと通るし、
PortQryを使って5432ポートを調べてもLISTENになってました。
iptablesやhosts.allowなんかも調べても問題なし。

そして、CentOS自身のコンソールから
`> psql -h 192.168.56.1 -U ユーザ名 データベース名`
だと通らないのに、
`> psql -h 127.0.0.1 -U ユーザ名 データベース名`
だと通る。

で、打つ手なし状態になっていたのですが、
別の問題を解決したら、一緒に解決しました。

CentOSにTeraTermからssh接続しようとしても「接続が拒否されました」と言われてログインできなかったのですが、
VirtualBox上のCentOSにssh接続する情報を探して、
`/etc/sysconfig/network-scripts/ifcfg-eth1`
を修正し、
`IPADDR=192.168.56.2`
と設定したら、sshもpsqlも192.168.56.2でつながりました。
（※上記ファイルの他の項目も修正しましたが、本筋ではないので省略。）

という事で、同じようなエラーにハマったら、
一度「/etc/sysconfig/network-scripts/ifcfg-eth1」を検討してみると解決するかも。
Windows Azure のWindows仮想マシン上で1TB以上のディスクを接続する方法

Azure上で構築した仮想マシンに接続できるディスクのサイズは～1023ＧＢまでの制限があります。これは仮想マシンの種類によらず固定です。

どうしても1024GB以上のディスクを使いたい時は以下の方法で利用可能になります。

## 仮想マシンのサイズと接続できるディスク数制限
https://msdn.microsoft.com/ja-jp/library/azure/dn197896.aspx

最上位のGシリーズだと64個のディスク接続が可能です。
つまり64TBまで利用可能になります。

## Azureコンソール上でディスク接続する方法
１．Azure管理ポータルの仮想マシンのページで該当の仮想マシンを選択
２．[ディスクの接続]->[空のディスクの接続]
３．適当なファイル名とファイルサイズを設定
　ファイルサイズは１ＧＢ～１０２３ＧＢまでの制限あり

http://qiita.com/unosk/items/330376faadf648aa8ccc

この方法で2つ以上のディスクを仮想マシンに接続します。

##スパンボリュームの作成
http://www.atmarkit.co.jp/ait/articles/1011/18/news128_5.html
>スパン・ボリュームは、複数のディスクにまたがってディスクのブロックを連結したものである。複数のディスクをまとめることができるので、ディスク・サイズを超えたボリュームを実現できる。

「コントロールパネル」＞「管理ツール」＞「コンピュータの管理」を開く。
ディスクを接続すると未フォーマット状態のディスクが接続されているので右クリックで「スパンボリュームの作成」を選択。

1TBのディスクを2つ繋ぐと2TB、3つ繋ぐと3TBになる。

スパンボリュームとして連結した後の画面。
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/58176/e4401928-7320-c36f-e719-159230edb923.jpeg)

5つの1TBディスクをスパンボリュームとして連結したので約5TBのディスクとして認識できている。
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/58176/43a5d9fd-103f-e020-41f1-4ae5d2400edb.jpeg)



オンプレで稼働している2TBのSQL Serverを移行したいと思い、今回の手順を実施しました。

セカンダリパーティションを作ってもよかったのですが、色々めんどくさそうだったので今回の方法を採用しました。
http://www.sqlquality.com/Self2012/Self2012_DP/Text/Step01-01.html
Swift1.2で複数の変数を1度にOptional Bindingできるように

Xcode6.3betaのリリースに伴い、[Swift1.2](https://developer.apple.com/swift/blog/?id=22)がリリースされましたね。

Swift1.2の仕様を見ていると、複数の変数のOptional Bindingを1行で書けるようになったらしいですね。

Swift1.1までは複数の変数のOptional Bindingの代替として、この[記事](http://qiita.com/rizumita/items/14f92c540039af16b7a5)のような方法がありました。

```swift:~swift1.1
let first : Int? = "1".toInt()
let second : Int? = "2".toInt()

switch (first, second) {
case (.Some(let f), .Some(let s)):
    println(f + s)
default:
    println("error")
}
```

また、それ以外の方法として複数の変数のOptional Bindingをやる場合、

```swift:~swift1.1
let first : Int? = "1".toInt()
let second : Int? = "2".toInt()

if let f = first {
    if let s = second {
        println(f + s)
    }
} else {
    println("error")
}
```

このように、Optional Bindingだけでネストが深くなってしまうような状態でした。

しかし、Swift1.2からは

```swift:swift1.2
let first : Int? = "1".toInt()
let second : Int? = "2".toInt()

if let f = first, s = second {
    println(f + s)
} else {
    println("error")
}
```

と複数の変数を1度にOptional Bindingできるようになりました。

これでOptional Bindingでネストが深くなるという心配はなくなりましたね！
力試し：SwiftのOptionalでこれできますか？

力試し
----------------------------------------------------

`Optional` は Swift を使う上でとても重要です。 `Optional` を使いこなせているか試してみて下さい。

`Optional` を使って次のことをやる場合に、 __簡潔かつ安全__ に書く方法を考えて下さい。

1. `a: Int?` があるとき、 `a` の値を二乗したい。ただし、 `a` が `nil` の場合は `nil` を得たい。
2. `array: [Int]?` があるとき、 `array` の最初の要素を取得したい。ただし、 `array` が `nil` か、最初の要素が存在しない（ `Array` が空の）場合は `nil` を得たい。（ヒント：  `[Int]` は `first: Int?` というプロパティを持つ。 `first` は最初の要素が存在しない場合は `nil` を返す。）
3. `x: Double?` があるとき、 `x` の平方根を計算したい。ただし、 `x` が `nil` または負の数の場合は `nil` を得たい。なお、 `sqrt` を安全にした（負の数を渡すと `nil` を返す）関数 `safeSqrt: Double -> Double?` があるものとして考えて良い。
4. `a: Int?` と `b: Int?` があるとき、 `a + b` を計算したい。ただし、 `a` か `b` が `nil` の場合には `nil` を得たい。
5. `a: Int?` があるとき、 `a` の値を `print` で表示したい。ただし、 `a` が `nil` の場合には何も表示したくない。

1, 2, 4 では結果の型が（ `Int` ではなく） `Int?` に、 3 では `Double?` になることに注意して下さい。また、 3 の `safeSqrt` は次のように実装できます。

```swift
func safeSqrt(x: Double) -> Double? {
	return x < 0.0 ? nil : sqrt(x)
}
```

ダメな解答例
----------------------------------------------------

### 簡潔でない例

下記はいずれも正しい結果が得られますが __簡潔ではありません__。

#### 1.

```swift
let result: Int?
if let a0 = a {
	result = a0 * a0
} else {
	result = nil
}
```

たかが値を二乗するためだけに _Optional binding_ で分岐して計算するなんてやってられません。

#### 2.

```swift
let result: Int?
if let array0 = array {
	result = array0.first
} else {
	result = nil
}
```

#### 3.

```swift
let result: Double?
if let x0 = x {
	result = safeSqrt(x0)
} else {
	result = nil
}
```

#### 4.

```swift
let result: Int?
if let a0 = a, b0 = b {
	result = a + b
} else {
	result = nil
}
```

#### 5.

```swift
if let a0 = a {
	print(a0)
}
```

### 安全でない例

下記はいずれも正しい結果が得られますが __安全ではありません__。また、一見短くて簡潔なように見えますが、 `nil` チェックと三項演算子、 _Forced unwrapping_ （ `!` ）の組み合わせは複雑で、簡潔とは言えません。

#### 1.

```swift
let result: Int? = a == nil ? nil : a! * a!
```

せっかく `Optional` によって安全なコードが書けるようになっているのに、 `!` を使ったら台無しです。 `nil` チェックをしていても `:` の左右を書き間違えるなどしたら _Forced unwrapping_ に失敗してクラッシュしてしまいます。コードを読む人も `!` を見かける度に、この `!` はいつも安全なのか、それとも異常系ではクラッシュしてしまうのかを考えなければなりません。

また、わざわざ `nil` チェックをしなければならないなんて `Optional` がない時代まで逆戻りしており、 `Optional` の恩恵を享受できていません。まるで Java で書いているみたいです。

```java
// Java
Integer result = a == null ? null : a * a
```

#### 2.

```swift
let result: Int? = array == nil ? nil : array!.first
```

#### 3.

```swift
let result: Double? = x == nil ? nil : safeSqrt(x!)
```

#### 4.

```swift
let result: Int? = a == nil ? nil : b == nil ? nil : a! + b!
```

模範解答は・・・
----------------------------------------------------

["SwiftのOptional型を極める"](http://qiita.com/koher/items/c6f446bad54442a28bf4) で解説しています。この力試しもその一部だったんですが、長くなりすぎたので分離しました。

なお、 2 は簡単ですが出題ミスではありません（話の流れ上必要だったので）。
gitコマンドメモ

よく使うものはエイリアスに登録すると便利です。
~/.zshrc や ~/.bashrc にこんな感じで入れてます。
```alias gci="git commit"
alias gad="git add -p"
alias gp="git pull"
alias glmy="git log --author=yulily"
```

#### ■ git add
```git add -p```
変更箇所を確認しながらインデックスへ追加。

#### ■ git branch
```git branch```
ローカルにあるブランチの一覧を表示する。
```git branch -r```
リモートにあるブランチの一覧を表示する。
```git branch -a```
ローカルとリモートのブランチを表示する。
```git branch -d```
ローカルブランチを削除する。 ( マージされていないとできない
-d を -D にするとマージされていなくても削除できる。
リモートブランチも削除する場合。
```git push --delete origin [ブランチ名]```
または
```git push origin :[ブランチ名]```
2つ目は[こちら](http://www-creators.com/archives/1062#i-2)に何故そうなるのか解説がありますmm

#### ■ git-checkout
```git checkout -b newbranch([派生ブランチ名])```
現在のブランチから派生ブランチを作成し、派生ブランチに切り替える。
#### ■ git cherry-pick 
```git cherry-pick 123hoge(HASH)```
別ブランチのコミットを適用させる。
```git cherry-pick -n 123hoge(HASH)```
コミットせず該当コミットを取り込む。

#### ■ git fetch
リモートリポジトリから最新情報をローカルへ持ってくる。

#### ■ git stash
コミット前の作業を一時退去。
別のブランチで作業する必要がでた場合などに使用。
```git stash save```
現在の作業ツリーを保存。
```git stash save "message"```
メモも付ける事ができる。
```git stash list```
スタックに格納した一覧を表示  。
```git stash pop```
最後に格納したスタック内容を現在のブランチに適用。
適用後スタックから削除。
```git stash pop stash@{[stash番号]}```
指定した stash番号 の内容を現在のブランチに適用する。
[stash番号]は、listした時に表示されるのでそれを入れる。
```git stash apply```
適用後スタックから削除しない。
```git stash drop```
スタックから削除する。
```git stash clear```
スタックに保存されている内容を全て削除。
```git stash show stash@{[stash番号]}```
指定したスタック内容と親コミットのdiffstatを表示。
-pを付けると差分表示。
```git stash branch new-branch stash@{[stash番号]}```
最後のスタックから新しいブランチを作成。
```git stash show -v```
保存されている修正内容の詳細を表示。
```git checkout stash@{[stashの番号]} [ファイル名]```
指定した stash番号 の特定のファイルだけワークツリーに戻す。
```git stash -p```
使ったこと無いが、指定したファイルだけ stash に入れられるようです。
git add -p のように使えるらしいです。
#### ■ git revert
```git revert 123hoge(HASH)```
指定したコミットの変更分を元に戻すための新しいコミットを追加する。
指定したコミットのみを元に戻すコマンド (打ち消し)。
そのコミットの後に行われたすべてのコミットを元に戻して過去のある状態に戻すコマンド (取り消し) ではない。
打ち消し -> revert
取り消し -> reset

#### ■ git log
```git log author=yulily```
特定ユーザのコミット履歴閲覧。

#### ■ git merge 
```git merge [ブランチ名]```
指定したブランチ名の変更を現在ブランチに合流させる。
```git merge --squash```
指定したブランチのコミット全てをまとめたコミットが追加される

#### ■ git rebase 
コミットの移動・修正
```git rebase -i 123hoge(HASH)```
HEAD から指定したコミットハッシュまでを対象に、必要なコミットを取捨選択し統合、ハッシュではなくブランチ名でもできる。
ここでコミットのコメント修正したり、順序入れ替えができる。
```git rebase --onto [ブランチ名1] [ブランチ名2] [ブランチ名3(省略可)] ```
ブランチ名2 からブランチ名3 の内容を、ブランチ名1 の上に乗せる。ブランチ名3は省略された場合、現在いるブランチになる。

#### ■ git diff
```git diff origin/master..master --name-only```
ローカル master とリモート master ファイル名のみ差分抽出。

#### ■ git reflog
commit 以外のコマンドの履歴が確認できる。

#### ■ git update-index
```git update-index --skip-worktree [file_name]```
git管理下にあるファイルを無視する。

```git update-index --no-skip-worktree [file_name]```
無視した設定を取り消す。
C#で深さ優先検索(DFS)と幅優先検索(BFS)の実装

#深さ優先検索
```lang:cs
    public class DFS
    {
        public static void Search( Node root )
        {
            if(root == null)
            {
                return;
            }
            Visit(root);
            root.Visited = true;
            if (root.Children != null)
            { 
                foreach (var node in root.Children)
                {
                    if(!node.Visited)
                    {
                        Search(node);
                    }
                }
            }
        }

        private static void Visit(Node root)
        {
            // nop
        }
    }

    public class Node
    {
        public bool Visited { get; set; }

        public Node[] Children { get; set; }
    }
```

#幅優先検索
```lang:cs
        public static void Search( Node root )
        {
            var queue = new Queue<Node>();
            root.Visited = true;
            Visit(root);
            queue.Enqueue(root);

            while(queue.Count != 0)
            {
                var current_node = queue.Dequeue();
                if (current_node.Children != null)
                { 
                    foreach (var node in current_node.Children)
                    {
                        if(!node.Visited)
                        {
                            Visit(node);
                            node.Visited = true;
                            queue.Enqueue(node);
                        }
                    }
                }
            }
        }

        private static void Visit(Node root)
        {
            // nop
        }
```

GitHubにもあげてあります。
https://github.com/Koki-Shimizu/DFS
Ruby | Windows 環境でシステム音声を鳴らす

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Windows 環境でシステム音声を鳴らします

## <i class="fa fa-cube" style="font-size:1em;"></i> 準備
win32-sound gem を利用します。

~~~bash
$ gem install win32-sound
~~~

## <i class="fa fa-cube" style="font-size:1em;"></i> 試行

~~~ruby
require "win32/sound"
include Win32

Sound.play("c:\\windows\\media\\tada.wav")

# ニコニ・コモンズで拾ってきた ロマサガの閃き音
# http://commons.nicovideo.jp/material/nc71293
Sound.play("c:\\windows\\media\\nc71293.wav")
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [win32-sound RubyGems](https://rubygems.org/gems/win32-sound)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [win32-sound GitHub](https://github.com/djberg96/win32-sound)
正規表現まとめ ~基本~

まとめて検索かけたり置換するときとかに便利（☝๏ʚ๏ื）☝ < マッチ

##メタ文字
> .   ^   $   [   ]   *   +   ?   |   (   )

普通の文字として使うときは直前に \ をいれる (エスケープ)

##構文

####文字表現
* **.**  **なんでもいい**任意の１文字にマッチ

> .　◎あ 
... ◎りン5 ×りン
..... ◎Summer　×Sum

* **[ ]**  カッコ内に含まれる１文字にマッチ
*[]内ではメタ文字をエスケープさせなくてOK*
* **[^ ]**  カッコ内に含まれない１文字にマッチ

> [a-z] ◎a ×A ×0 ×あ
[a-z0-9A-Z] ◎a ◎A ◎0 ×あ
[^a-z0-9A-Z] ×a ×A ×0 ◎あ

####位置
* **^**  行の最初にマッチ(※↑の^と意味が違う）
* **$**  行の最後にマッチ

> ^こんにちは　◎こんにちはお嬢さん　×どうもこんにちは
> こんにちは$　×こんにちはお嬢さん　◎どうもこんにちは

####繰り返し
* **\*** 直前の文字の０回以上の繰り返し（いくら繰り返しててもOK）
* **+**  直前の文字の１回以上の繰り返し（少なくとも１回）
* **?** 　直前の文字の１回以下の繰り返し（重複を除く）

> らんど*せる ◎らんせる　◎らんどせる　◎らんどどどどせる
らんど+せる　×らんせる　◎らんどせる　◎らんどどどどせる
らんど?せる　◎らんせる　◎らんどせる　×らんどどどどせる

* **{ }**  直前の１文字を繰り返す回数を指定

> あ{3} ×あ　◎あああ　×ああああ
> あ{3,} ×あ　◎あああ　◎ああああ
> あ{1,3} ◎あ　◎あああ　×ああああ

####部分
* **|**  いずれかの *文字列*（※１文字じゃない）
* **( )**  グループ化

>これは|あれは　◎これは　◎あれは
吾輩は(猫|犬)である ◎吾輩は猫である　◎吾輩は犬である　×私は猫である

####後方参照
正規表現中にでてきた前出のグループを前から順に\$1,\$2,..と呼び出せる

[サルにも分かる正規表現入門](http://www.mnet.ne.jp/~nakama/)
[正規表現の構文](https://msdn.microsoft.com/ja-jp/library/cc392020.aspx)
[正規表現の解説　目次](http://www4.ocn.ne.jp/~kaerume/k2e/regex_top.html#mnu_top)
一般化線形モデル(GLM)とニューラルネットって一緒やんね (2)

前回の続きで、一般化線形モデル(GLM)と多層パーセプトロンの比較です。

<a href="http://qiita.com/tkazusa/items/038aae133c0d1932a533">"一般化線形モデル(GLM)とニューラルネットって一緒やんね (1)"</a>



## 機械学習の観点から：多層パーセプトロン
ニューラルネット、パーセプトロンについては下記に非常にわかりやすくまとめて下さっているので、是非ご参考に下さい。

<a href="https://github.com/levelfour/machine-learning-2014/wiki/%E7%AC%AC3%E5%9B%9E---%E5%8D%98%E7%B4%94%E3%83%91%E3%83%BC%E3%82%BB%E3%83%97%E3%83%88%E3%83%AD%E3%83%B3">"第3回 単純パーセプトロン · levelfour/machine-learning-2014 Wiki · GitHub"</a>
<a href="https://github.com/levelfour/machine-learning-2014/wiki/%E7%AC%AC3%E5%9B%9E---%E5%A4%9A%E5%B1%A4%E3%83%91%E3%83%BC%E3%82%BB%E3%83%97%E3%83%88%E3%83%AD%E3%83%B3">"第3回 多層パーセプトロン · levelfour/machine-learning-2014 Wiki · GitHub"</a>




単純パーセプトロンだと線形分離可能、つまり直線でデータを分けきれる場合のみ、識別関数のパラメーターは収束します。
もし線形分離不可のデータを与えると、健気にパラメーターを求め続けたりもして可愛げあります。



学習データを[tex:x_1, x_2,…,xi…]、結合係数を[tex:w_1, w_2,…,wi…]とそれぞれ置くと、
単純パーセプトロンは、数式で下記のように表現されます。

```math
  z = \sum_{i=0}^n w_i x_i =　W^{\mathrm{T}}X
```  

しかし、世の中は直線のみで分離出来るほど簡単な事象ばかりではありません。
線形分離不可能な事象をどう取り扱うか考えた末に、隠れ層(中間層)にシグモイド関数で処理をする形で多層化することになりました。
なんかいきなり出てきた感のある、シグモイド関数ですがここで活用する理由は、
・非線形であるから。線形だと階層増やしたとしても、線形和の形で階層を圧縮できてしまうから。
・あらゆる説明変数で微分可能な単調増加であるから
ということで、厳密にこれじゃないとダメってわけでも無さそうです。

隠れ層でのj番目の出力素子を数式で表すと、

```math
  y = \frac{1}{1+exp(-\alpha (\sum_{i=0}^n w_{ji} x_{ji}))} = \frac{1}{1+exp(-\alpha W_j^{\mathrm{T}}X)}     (2)
```

となります。

機械学習では、この後「入力層→隠れ層→出力層」についての
識別関数を考慮しながら結合係数(パラメーター)を推定していきます。

## 結局一緒だよね
一般化線形モデル(GLM)と多層パーセプトロンは2つの手法は用途が異なるので、当然手続が異なる部分があったり、今回ざっくりの理解のために、
厳密性を欠いている部分があったりしますが、(1)式と(2)式を見比べて頂と、
「ばらばらのデータの中にばちっと線をひく」ために似たようなことをやっていることが、感覚的に理解できるのではと思います。

※(1)式と(2)式の差である右辺分母にあるαは、ゲイン(gain)と呼ばれるそうで、0付近の勾配に影響します。
　なんでこれがくっついているのかは、ごめんなさい知りません、どなたか教えて下さい。
一般化線形モデル(GLM)とニューラルネットって一緒やんね (1)

ちょっと乱暴な気もしますが、一般線形化モデル(GLM)とニューラルネットの多層パーセプトロンってやってること一緒なんですよね。
バラバラっと散らばったデータの中に、納得感ある線をバチっとひいちゃうわけで。
両方の分野をやる方も多いかと思いますが、一気に理解しちゃった方が楽かなと。


で統計モデリングと識別関数のそれぞれで、
・線形モデル(LM)で、どんなデータの中でも直線でびゅんと線を引くのはいかがなもんか。
　→一般化(GLM化)することで、非線形な線もひけるようにしよう。
　※もちろん一般化には応答変数の分布を正規分布から拡張する意味もあります
・単純パーセプトロンは線形判別可能(直線で境界が引ける)なデータしか分類できない。
　→隠れ層(中間層)作って複雑な識別関数で分類しよう。
って感じの拡張をしました。





## 統計モデリングの観点から：一般化線形モデル(GLM)
線形モデル(LinearModel)や一般線形化モデル(Generalized Linear Model)については、
こちらに統計解勉強会の資料をまとめて下さっていて、かなりわかりやすいのです。
<a href="http://logics-of-blue.com/%E7%B5%B1%E8%A8%88%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AE%E8%B3%87%E6%96%99%EF%BD%9E%E4%BA%8C%E6%97%A5%E7%9B%AE-%E4%B8%80%E8%88%AC%E5%8C%96%E7%B7%9A%E5%BD%A2%E3%83%A2%E3%83%87%E3%83%AB%E7%B7%A8%EF%BD%9E/">"統計勉強会の資料～二日目 一般化線形モデル編～ ：Logics of Blue"</a>



で、線形モデル、単回帰や重回帰モデルを一般的に書き表すと、

```math

{ \displaystyle
y_i = \alpha + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 … + \beta_i x_i + \varepsilon_i
}

```

行列で書き表すと、


```math

\begin{equation}

\left(
    \begin{array}{c}
      y_1 \\
      y_2 \\
・  \\
・  \\
      y_n
    \end{array} 

\right)

=

\left(

 \begin{array}{ccc}
      1 & x_{11} & x_{12} \\
      1 & x_{12} & x_{22} \\
　･ &  ･ & ･ \\
  ･ &  ･ & ･ \\
      1 & x_{n1} & x_{n2}
    \end{array}
\right)

\left(
   \begin{array}{c}
     \alpha \\
     \beta_1 \\
     ･ \\
      ･ \\
     \beta_n 
    \end{array}
\right)

+

\left(
   \begin{array}{c}
     \varepsilon_1 \\
     \varepsilon_2 \\
     ･ \\
      ･ \\
     \varepsilon_n 
    \end{array}
\right)


\end{equation}
```


さらに

```math
y = B X + \epsilon
```

とも書けます。
今回は話を単純にするために説明変量数を2とした、

```math
y = \beta_1 x_1 + \beta_2 x_2 = BX
```

について考えます。

次に上記式から直線かつ正規分布のみを想定するという制約を外すために、
回帰式左辺にリンク関数を使います。
ベルヌーイ分布を想定してロジットリンク関数を使うと、


```math
\log \frac{y}{1-y} = \beta_1 x_1 + \beta_2 x_2
```


左辺がリンク関数、右辺が線形予測子ですね。
この式を逆関数で変換すると、


```math
  y = \frac{1}{1+exp(-(\beta_1 x_1 + \beta_2 x_2))} = \frac{1}{1+exp(-BX)}　　(1)
```


を得ることができます。

統計モデリングではこの後、尤度関数などを用いてパラメータ
```math
\beta_1  \beta_2
``` を推定してモデルを作り上げる=データの中に線を引きます。

長くなってきましたので、続きは次回記事で。
Sublime Textのカラースキーマを変更する

# Sublime Textでカラースキーマを変更する


## カラースキーマとは？

カラースキーマを変更することで、フォントの色を自由に設定することが出来ます。  
![スキーマ](https://qiita-image-store.s3.amazonaws.com/0/49429/beae47ad-278c-f491-ce0d-1b304d98479b.png)


## 作り方

カラースキーマファイル自体はXMLなので頑張れば作れるのですが、めんどくさすぎるので`TmTheme Editor`を使います。  

[TmTheme Editor](http://tmtheme-editor.herokuapp.com/)


## TmTheme Editorの使い方

1. 右下から`言語`を選ぶ
2. `Gallery`からベースを選ぶ
3. 変えたいところを`ダブルクリック`して、色を変更
4. ダウンロードする

これでカラースキーマファイルが作成できます。

![色](https://qiita-image-store.s3.amazonaws.com/0/49429/6c5145a5-8906-9074-ae7d-c6168046e63d.png)


## Sublime Textへの反映

1. `Packagesフォルダ`の下にある`User`フォルダに作成した`スキーマファイル`を設置
2. 作成したスキーマをメニューから選択する.  

　[基本設定]-[カラースキーマ]-[User]-[作成したスキーマファイル]

※Windows用(日本語化済み)なのでMacの場合は少しメニュー等が違うかもしれません
AWSでプロジェクトごとに請求額を見る


EC2などなど[詳細参照](http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-how)のサービスをタグ付けし、タグごとの請求額がわかるらしい。

なのでこれにプロジェクトを指定しておけば、プロジェクトごとに赤黒わかっていろいろ判断できてステキ。部署ごとにコストを出したり、お客様ごとにコストを出したり、活用できるのではないか。


# 1. 請求レポートをS3Bucketに受け入れるようにする。


1. bucketを作成する。
2. Billing & Cost Managementページの左のPreferenceを選択
2. 作成した名前を「請求レポートで受け取る」に入れてやる。Verifyを押す。
	3. ポリシーがあわないと、エラーになるので、すぐ下にある「ポリシー」をクリックし、サンプルポリシーの中身をコピー
	4. bucketのページに戻り、1.で作成したものを選択、右側から「Permission」を選択肢、でてきた、項目の中から「Edit bucket Policy」をクリックし、コピーした内容をペーストすればOK


# 2. タグをつける

例えば、プロジェクト Alpha に関係するEC2のコストをみたい場合。

1. EC2のコンソールにいく。
2. 対象のインスタンス1つを選んで、下段のTagsタブから **Add/Edit Tags** を選び **Key: Project Value: alpha** と入力して保存。
3. 2.を対象としたいインスタンス分繰り返す。
4. EBSでもやる。
5. Elastic IPとかLBは対応していないらしい。 

タグをつける(リソースグループから)
----------------------------

Reserved Instanceを借りたら、タグ付け機能がconsoleに無い・・・。対応していないのかな？
と思ったら、これはconsoleのUIが対応していないだけ。

日本語consoleにしてしまったが、おそらく英語も同じであろう、console home に行き、
右側に **resource group** 、 **tag editor** があるので、そこの **tag editor** をクリックし、
検索項目を入力(ここでは Regions: Asia Pasific(Tokyo) Resource Types: Reserved Instance)。

でてきたresourceを選択し、 **Edit tags for selected** で前述で決定した 'Project' のキーを指定
してやればOK

※ここの検索にでてこないリソースがタグ未対応である 


# 3. タグを指定する

1. Billing & Cost Managementページの左のPreferenceに戻る
2. bucketを入力してVerifyしていたら、下段に項目が増えるので、 **Manage report tags**を推して、先ほど作成したKeyの Project を選択して保存する。

# 4. 結果を見る

指定したbucketに、csvが保存されているので、適当に開くと、3.で指定されたタグごとに集計
されているものがあるので、それで請求額がわかる。

例えば私の場合、下記を開くと、2月の分、集計結果が表示されているので、LibreOfficeなどで
開き、オートフィルタを使うと非常に見やすい。

```
646675259617-aws-cost-allocation-2015-02.csv
```
github でブランチ・commit間の diff を見る

# github でブランチ・commit間の diff を見る

githubのちょっと便利な使い方。  
https://github.com/cakephp/cakephp/  の部分は自分の環境によって変更して下さい。  
/compare/ がみそね。

## ブランチ間の diff を見る

ブランチ 3.0 と 3.0-fix-log-scope の差異を見る。

```
https://github.com/cakephp/cakephp/compare/3.0...3.0-fix-log-scope
```

## commit間の diff を見る

コミット b5cbe4de58eedc1e10bb0ac06da8d134e38a1dc4 と 970cb81d03dc8f3db9efe7b9271f4b4e089dd3ae の差異を見る。

```
https://github.com/cakephp/cakephp/compare/b5cbe4de58eedc1e10bb0ac06da8d134e38a1dc4...970cb81d03dc8f3db9efe7b9271f4b4e089dd3ae
```

## commit と ブランチの間もいける

```
https://github.com/cakephp/cakephp/compare/b5cbe4de58eedc1e10bb0ac06da8d134e38a1dc4...master
```

ってなわけで知っておくと意外と便利。
今更ですけど、fluentdについてマトメてみる(その2)

# railsアプリのログの集計
今回は前回の応用としてrailsアプリのログの集計をしてみます。
とはいっても、[こちら](http://www.fluentd.org/datasources/rails)を参考にすれば余裕でできます。

## 事前準備
1.Gemfileに以下の二つを追加します。

```rb:Gemfile
gem 'act-fluent-logger-rails'
gem 'lograge'
```

そして<code>bundle install</code>します。

2.次にfluentdの設定です。
fluentdのconfファイルを以下のように作成します。

```conf:fluent.conf
<source>
  type forward
  port 24224
  tag rails.log
</source>

<match rails.log>
  type file
  path /****/***/log/out.log
</match>
```

今回は収取した結果をファイル出力させちゃいます。

3.railsアプリ側の設定
まずはログの設定をします。<code>config/application.rb</code>に以下の行の追加をします。

```rb:config/applicatin.rb
   # fluentD
   config.log_level = :info
   config.logger = ActFluentLoggerRails::Logger.new
   config.lograge.enabled = true
   config.lograge.formatter = Lograge::Formatters::Json.new
```

json形式で出力するように設定します。
次にconfig/fluent-logger.ymlを作成します。

```yaml:fluent-logger.yml
development:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'rails.log'
  messages_type: 'string'

test:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'rails.log'
  messages_type: 'string'

production:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'rails.log'
  messages_type: 'string'
```

以上で設定は終わりです。

## 確認
ではfluentdをrailsアプリを起動して確認してみましょう

<code>
$ fluentd -c fluent/fluent.conf -vv &
</code>

<code>
$ rails s
</code>

![スクリーンショット 2015-02-10 1.49.59.png](https://qiita-image-store.s3.amazonaws.com/0/1686/0caaff94-7edc-23ca-c6de-6201da9a5359.png)

例えばこんな感じでログが出力されると思います。
では次のステップとしてこのログをelasticsearchにいれますが、それは次回！！
パイプで渡したパスに無理やりcdするシェルスクリプト


## パイプで渡したパスにcdできない
ターミナル上で、コマンドで出力したパスに移動したいことがままあるのですが、パイプで`cd`コマンドに渡してもうまくいきません。

```bash
$ echo ~ | cd
# なにも起こらない

$ echo ~ | xargs cd
# なにも起こらない

$ cd "$(echo ~)"
# これはOK
```

ところで、実行可能ファイル形式のシェルスクリプトで`cd`しても、現在のシェルに反映されないという問題があります。

* [シェルスクリプト内で実行した cd コマンドをターミナルに反映させる方法を教わった - わからん](http://d.hatena.ne.jp/kitokitoki/20120101/p2)

これは、ファイルからシェルスクリプトを実行した場合、サブシェルが起動しているためです。

これと同様の理由で、パイプでつないだ先の部分で`cd`しても`exec /bin/bash`しても、元々のシェルには反映されません。

```bash
$ pwd | cd ~
# なにも起こらない

$ echo $$
32187
# パイプの前のコマンドはなんでもいい
$ pwd | cd ~;exec /bin/bash
$ echo $$ # プロセスIDが変化していない
32187
```

パイプを使い、さらに現在のシェルに`cd`を反映させるには、もはや新たにコマンドを実行するしかありません。

## AppleScriptを使い無理やり実現
以下はiTerm2依存ですが、他のターミナルエミュレータでも同様のスクリプトは書けると思います。
（Build 3.1対応）

```~/.bashrc
pcd () {
  if [ ! -p /dev/stdin ]; then
    if [ $# -ge 1 ]; then
      cd "$1"
      shift
      if [ $# -ge 1 ]; then
        echo "Too many arguments. After second arguments are not processed."
      fi
    else
      echo "ERROR: No stdin or argument"
      return 1
    fi
  else
    osascript -e "tell application \"iTerm\" to tell current session of current tab of current window to write text \"cd $(cat -)\""
  fi
}
```

（パイプからの）標準入力がなければ、引数を移動先ディレクトリとして普通に`cd`します。標準入力がある場合、そこに`cd`するコマンドをAppleScript経由で実行します。

どうせなら、渡された引数や標準入力がディレクトリパスか判断して`dirname`したり、後ろにパイプがないか判断してエラーチェックもしたいですね。

## 参考
* [シェルスクリプト内で実行した cd コマンドをターミナルに反映させる方法を教わった - わからん](http://d.hatena.ne.jp/kitokitoki/20120101/p2)
* [ShellScript - シェルスクリプトでパイプを判断する - Qiita](http://qiita.com/b4b4r07/items/77c589f21a99db8bb682)
atom 操作 備忘録

# atom 操作(Windows)

## <span style="color:red">ファイル操作</span>

### Ctrl + O
* ファイルを開く

### Ctrl + Shift + O
* ディレクトリ指定して開く

## <span style="color:red">View</span>

### Ctrl + \
* Tree View の表示/非表示

### Ctrl + 0 (ゼロ)
* Tree View と Editor の切り替え

## <span style="color:red">コマンドパレット</span>

### Ctrl + Shift + p

## <span style="color:red">Settings</span>

### Ctrl + ,

### Editor Settings

* Show Indvisibles　をチェック
	* 半角空白とか改行とかタブとかを可視化
* Soft Tabs　チェックを外す
	* ハードタブは通常のタブ
	* ソフトタブはスペースを複数入れる
* Tab Length
	* 2 -> 4

### Packages

* "language" で filter
	* 各言語毎の設定
* Themes

### Install

* 以下をインストール
	* "autocomplete plus"
	* "file icons"
	* "japanese wrap"
	* "atom-color-highlight"

　

## <span style="color:red">検索</span>

### Ctrl + t
* 今開いているフォルダ全体からファイル検索

### Ctrl + b
* 今開いているタブの中からだけファイル検索


### Ctrl + f
* テキスト検索
* F3
* Shift + F3

### Ctrl + Shift + f
* 全てのフォルダから検索

### Ctrl + r
* シンボル検索

## <span style="color:red">Editor</span>

### Ctrl + m
* go to matching Bracket
* 対応するカッコに飛ぶ

### Ctrl + g
* 指定した行に移動
* 15:6
	* 15行目の6桁目

## <span style="color:red">bookmarks</span>

* Ctrl + F2
	* bookmarks: view all
* F2
	* bookmarks: jump to next bookmark
* Ctrl + Alt + F2
	* bookmarks: toggle bookmark

## <span style="color:red">マルチカーソル</span>

### Ctrl + マウスクリック
### Ctrl + Alt + ↑↓

### 単語選択

#### Ctrl + d
* find and replace: select next

#### Ctrl + u
* find and replace: select undo
* 1つ戻る

#### Ctrl + k
* find and replace: select skip
* 1つ飛ばす

#### Alt + F3
* find and replace: select all
* 一気に同じ単語を選択

## <span style="color:red">行操作</span>

### Ctrl + ↑↓
* 現在の行を上下に移動させて行を入れ替え

### Ctrl + l
* 現在の行を選択

### Ctrl + Shift + k
* 現在の行を削除

### Ctrl + Shift + d
* 現在の行を複製

### Ctrl + ], Ctrl + [
* インデント

### Ctrl + Enter
* 次の行に挿入

### Ctrl + Shift + Enter
* 前の行に挿入

## <span style="color:red">pane</span>

### Ctrl + k の後に 矢印
#### split
* pane: split Up
* pane: split Down
* pane: split Right
* pane: split Left

### Ctrl + k の後に Ctrl + 矢印
* paneを移動

### Ctrl + w
* paneを消す

## <span style="color:red">折りたたみ</span>

### Ctrl + Alt + [
* ブロックをたたむ

### Ctrl + Alt + ]
* 開く

### Ctrl + Alt + Shift + [
* 全ブロックをたたむ

## <span style="color:red">markdown</span>

### Ctrl + Shift + m
* マークダウン文書プレビュー

### 日本語の折り返し
* "japanese wrap"　をインストール
* コマンドパレット(Ctrl + Shift + p)から **soft wrap** を実行

ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
現在との時間差を計算する(後追い)

「[Swiftで現在からの経過時間を計算するNSDateのExtension](http://qiita.com/hayakawatomoaki/items/8f1d5aeb74ba2156245c)」(@hayakawatomoakiさん) を読んだら面白そうだったので、自分でも書いてみたくなりました。
　まるきり後出しなので、なるべく短く、いかにも簡単そうに書きたいです (希望)。

```swift
import Foundation

enum TimeDuration {
    case Day(Int), Hour(Int), Minute(Int), Second(Int)
}

extension NSDate {
    func durationFromNow() -> TimeDuration {
        let value = Int(self.timeIntervalSinceNow)
        let duration = (Minute: 60, Hour: 3600, Day: 3600*24)
        switch abs(value) {
        case 0..<duration.Minute:
            return .Second(value)
        case duration.Minute..<duration.Hour:
            return .Minute(value / duration.Minute)
        case duration.Hour..<duration.Day:
            return .Hour(value / duration.Hour)
        default:
            return .Day(value / duration.Day)
        }
    }
}
```

　戻り値を文字列ではなく、列挙型にしてみました。測定結果を秒･分･時･日の4タイプに分け、具体的な数字をくっつけて返します。データが単純なので、処理もカンタン。
　素直に文字列を返すほうが使いやすいのですが、このくらい緩いメソッドなら使い回しもできそうです。

　使うときはこのような感じになります。

```swift
// 対象時刻を用意 (2015年1月1日)
let day = NSCalendar.currentCalendar().dateWithEra(1, year: 2015, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)

// 変換用のクロージャ
let s = { (n: Int, s: String) -> String in
    String(abs(n)) + s + (n <= 0 ? "前" : "後")
}

// NSDateを取り出して処理
day.map {
    d -> () in
    var str: String
    switch d.durationFromNow() {
    case .Second(let n):
        str = s(n, "秒")
    case .Minute(let n):
        str = s(n, "分")
    case .Hour(let n):
        str = s(n, "時間")
    case .Day(let n):
        str = s(n, "日")
    }
    println("\(str)のNSDateです") // -> 40日前のNSDateです (ﾋｴｰ)
}
```

　`durationFromNow ()` の戻り値は、列挙型に整数がついてくるだけです。したがって用途に応じて文字列に変える必要があります。ここではクロージャを使っていますが、enumに関数を付けてもよさそうですね。
　なおNSDateはNSCalendarで用意しました。これだけでかなり楽ができます。
PHPの文字数検知 Tips

文字数を計算して、指定以上の文字数ならエラー出すの処理で引っかかったのでメモ


####1.phpでの文字数検知####
使ってみた検知用の関数は、以下2つ

```
 icov_strlen(str)
```
与えられたバイト列 str 中に現れる文字の数を 指定された文字セットに基づいて数えます。この結果は、必ずしも文字列の バイト数と一致するとは限りません。
[本家リンク](http://php.net/manual/ja/function.iconv-strlen.php)より

```
mb_strlen(string $str [, string $encoding = mb_internal_encoding() ])
```
文字列の長さを取得します。
[本家リンク](http://php.net/manual/ja/function.mb-strlen.php)より

####2.動作検証####
以下のコードで実行してみました。ターミナルで実行すると文字コード見られないので、
htmlのbodyの中入れて、ブラウザで検証します。

```lang:hoge.php

$characters = array(
          "test&",
          "テスト",
          "♡"
);
for($i = 0; $i < count($characters); $i++){
  echo $characters[$i]."<br>";
  echo "iconv_strlenでの文字数 :".iconv_strlen($characters[$i])."<br>"; 
  echo "mb_strlen(utf-8なし)文字数 :".mb_strlen($characters[$i])."<br>";
  echo "mb_strlenでの文字数 :".mb_strlen($characters[$i],"utf-8")."<br><br>";
     }
```

####3.結果####

```
test&
iconv_strlenでの文字数 :5
mb_strlen(utf-8なし)文字数 :5
mb_strlenでの文字数 :5

テスト
iconv_strlenでの文字数 :9
mb_strlen(utf-8なし)文字数 :9
mb_strlenでの文字数 :3

♡
iconv_strlenでの文字数 :3
mb_strlen(utf-8なし)文字数 :3
mb_strlenでの文字数 :1
```

mb_strlenはutf-8を追加しないと、欲しい結果をくれないことがわかりました。

####4.まとめ####
全角や半角を区別したい場合

```
icov_strlen(文字);
```

全角か半角のどちらでも１文字なのか判断したい場合

```
mb_strlen(文字,"utf-8");
```