OmniAICreator/Qiita-1.07M huggingface dataset:
欠損値に関するメモ（オミックス研究と関連して）

欠損した値を推定する事をimputationという

### 欠損値に関する方法論について
#### 古典的な統計学の方法
欠損値のメカニズムの分類 : MAR（Missing at random）, MCAR（Missing completely at random）, MNAR（Missing not at random）

対策
- そのまま
- 削除 : リストワイズ除去、ペアワイズ除去
- 補完 : 平均値代入、回帰代入、Hot-deck代入（似たデータから補完）、Cold-deck代入（同じデータの違う状況下でのデータから補完）、Average the available items, Last observation carried forward, Stochastic回帰代入
- 欠損メカニズムをモデル化
- 最近の方法 : Full Information maximum likelehood（FIML）、多重代入法

#### 遺伝学的な方法
- referenceにするデータは、HapMapから手にいれるらしい（人種を気にする）
- LD（連鎖不平衡）ブロックで相関が高いSNPを参考に推定する
- MAF（マイナーアレル頻度）が合うように値を推定する（EMアルゴリズム）
- HMM（隠れマルコフモデル）を使うらしい
- 有名なソフトとして、IMPUTE1/2, BEAGLE, MACH, BIM-BAM, fastPHASE

#### transciptome研究での方法
- 最初は、データを削除、0/平均値を入れるなどしていたらしい
- referenceはStanford Microarray Databaseを利用した論文がある
- 遺伝学的な方法と同様に、相関が高い遺伝子の発現量を参考に推定する
- referenceを利用せず、データセット内で相関が高い遺伝子のデータを利用する場合が多い（この場合、ある程度のサンプルサイズが無いと相関が見れないはず）
- 推定したい遺伝子と類似する遺伝子を見つけるのにk近傍法が広く利用されている（kは10 - 20くらいのイメージ）
    - 異なる実験条件での寄せ集めデータをreferenceにする中で、q個のクラスター（数10個くらい）に実験条件が分かれるとして、次元を削減して利用する場合が多い（クラスタリング手法がここで多用される）
- 手法の検証の仕方は、完全データにランダムに欠損値を発生させ、どれだけ適切な値を入れられるか、元データとのRMSE値で競う
- 定番手法がなさそうだが、Rパッケージは多い（kNNベースは引用が比較的多い）


[参考]
- [Illuminaの資料](http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB0QFjAA&url=http%3A%2F%2Fwww.illuminakk.co.jp%2Fdocuments%2Fpdf%2Ftechnote_imputation_estimates_genotypes-j.pdf&ei=1FCVVJCmOaXXmAXM5ICgCg&usg=AFQjCNEdvAQnBj-Nrjj2eNUU2XhN7P927A&sig2=LIVn0SB2RYWKwS8SsgC-lQ&bvm=bv.82001339,d.dGY)
- [Missing Data Analysis (DARM勉強会#3）](http://www.slideshare.net/masarutokuoka/darm3-missing-data-analysis)
- [Genotype imputation for genome-wide association studies](http://www.nature.com/nrg/journal/v11/n7/full/nrg2796.html)
- [Comparative analysis of missing value imputation methods to improve clustering and interpretation of microarray experiments](http://www.biomedcentral.com/1471-2164/11/15)
Pylearn2で学習モデルの検証を行う

Pylearn2で学習したモデルとテストデータを使って検証を行う方法を説明します。

# テストデータを読み込む

テストデータはpylearn2.datasetsモジュールから読み込む方法と、pklファイルを読み込む方法があります。
読み込んだあと、入力値はdata.X, 出力値はdata.yで参照できます。

pylearn2.datasetsモジュールからMNISTデータセットを読み込む場合:

```
from pylearn2.datasets import mnist

data = mnist.MNIST(which_set="train")
```

pklファイルを読み込む場合:

```
import pickle

data = pickle.load(open("path/to/test_dataset.pkl"))
```

# モデルを読み込む

学習後のモデルはpklファイルになっており、それを読み込めばよいです。

```
import pickle

model= pickle.load(open("path/to/model.pkl"))
```

# 予測値を計算する

予測値を計算する関数を作ります。
モデルのfpropメソッドを使ってtheano関数を生成し、その関数に入力値を渡すことで予測値を得ることができます。
ただしfpropの入力とデータセットの入力とで空間が異なることがあるので、Space#format_asを使って変換を行います。
生成した関数は複数の入力値に対する予測値を一度に計算することができます。
予測値を複数回に分けて計算していますが、これは１度に計算するとメモリ不足になることがあるためです。
以下の関数ではinputsにデータセットのX、modelにモデルをとります。

```
import theano
from pylearn2.space import VectorSpace

...

def simulate(inputs, model):
    space = VectorSpace(inputs.shape[1])
    X = space.get_theano_batch()
    Y = model.fprop(space.format_as(X, model.get_input_space()))
    f = theano.function([X], Y)
    result = []
    batch_size = 100
    for x in xrange(0, len(inputs), batch_size):
      result.extend(f(inputs[x:x + batch_size]))
    return result
```

# 結果を集計する

統計分類の場合は以下のようにして集計することができます。
以下の関数のoutputsにはsimulateの戻り値、labelsにはデータセットのyを渡します。
numpyのargmaxを使って出力が最大となる要素を求め、データセットのyと比較します。

```
import numpy as np

...

def count_correct(outputs, labels):
    correct = 0;
    for output, label in zip(outputs, labels):
        if np.argmax(output) == label:
            correct += 1
    return correct
```

# 使用例

MNISTデータセットを使う場合の例を示します。

```
import pickle
from pylearn2.datasets import mnist

model = pickle.load(open("path/to/model.pkl"))
data = mnist.MNIST(which_set="test")

predicts = simulate(data.X, model)
correct = count_correct(predicts, data.y)
print "{} / {}".format(correct, len(data.X))
```

# 参考文献

http://fastml.com/how-to-get-predictions-from-pylearn2/
マグネットスイッチ等をつかってサンタさん検出器を考えてみる。

##はじめに
>この記事は[おうちハック Advent Calendar 2014](http://qiita.com/advent-calendar/2014/ouch-hack)の21日目の記事です。
昨日の記事はajimiteiさんの[hue 目覚ましか、それ以外について書きます]()でした。

もうすぐクリスマスです。クリスマスといえば、サンタさんのプレゼントが子供のころの楽しみですね。私も小さいころはサンタさんを信じていて、どうやってプレゼントを置いたのか不思議におもってた記憶があります。

昔のサンタさんは煙突から入ってきたようですが、いまや煙突がある家は日本では数少ないのではないでしょうか。となると、最近のサンタさんはどうやって入ってくるか。どうにかして扉や窓のカギを開けてはいってきてるに違いないはずです！

では、家じゅうの扉や窓にセンサーをつけておけば検出できるはずです！

窓や扉の開閉を検出するための王道といえば、マグネットスイッチ。これをつかったセンシング装置は、sasaoさんが[ボタン電池1個で数年持つ無線ドア開閉センサを作る](http://qiita.com/ksasao/items/1a221843894fdb57677b)で先日書かれていたので、そちらで詳しく書かれてますので、ここでは触れません。

ちなみに私は、こちらの[SEEED STUDIOのマグネットスイッチ](http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-0P6V)を使用しています。TWE-Lite DIPは買ったそのままのファームを使用しました。買ってそのまま使えるのは便利ですね。

作成した試作品はこんな感じです。
![switch_proto01.jpg](https://qiita-image-store.s3.amazonaws.com/0/51272/ae10e165-2d3a-772f-cb1c-93e33b18a37a.jpeg)

##判定装置
判定装置には、Raspberry piを使います。Raspberry piのUSBにToCoStickを接続します。
![IMG_1109.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/4c01aaaf-cf28-426b-5edd-2fffd366e7a6.jpeg)

Raspberry piにSSHでログインし、

```Terminal
$ screen /dev/ttyUSB0 115200
```
とすれば、TWE-Lite DIPから送信されてきた値を見ることができます。

```Terminal
:7C8115019981008CCC78825A000B491A0101FFFFFFFFFFBC
:7C8115019681008CCC78825C000B491A0001FFFFFFFFFFBE
```
33,34桁目が開閉で00<->01に変化します。

##もうひとひねり

さて、マグネットスイッチだけだと、夜遅くに仕事で帰ってきたお父さんや、子供の寝顔を覗きにきたお母さんを検出してしまうかもしれません。（背の高いお父さん・お母さんのいる方は、すいません、別の方法を考えてください。）

その為にもう一捻り。[聞くところによると](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11117944951)、サンタさんの身長は非常に高いそうです。であれば、ドアや窓の上に赤外線距離センサーを天井に設置して、背の高さをある程度予測できないかと考えました。

天井までの距離が、我が家（マンションです）だと220cmくらいです。サンタの背の高さが180cmとすると40cm程度の距離が測定できなければなりません。そこで候補になるのが、[GP2Y0A21YK](http://akizukidenshi.com/catalog/g/gI-02551/)。これだと80cm程度まで測定できます。

ただし、この赤外線距離センサーの電源電圧は4.5～5.5Ｖということで、電源を5vにする必要があります。
一方、TWE-Lite DIPは3.3v駆動なので、以下の仕組みが必要になるかと思います。
・5vから3.3vに降圧する仕組み
　→[三端子レギュレーター](http://akizukidenshi.com/catalog/g/gI-00534/)とか
・アナログの信号をレベル変換する仕組み
　→[ロジックレベル変換モジュール](https://www.switch-science.com/catalog/1523/)とか

上記の赤外線距離センサーの試作と判定用のコードをrubyで書こうと思っていたのですが、なにかと12月は忙しくて、すいませんまだできていません。年内・年始の休暇中には作成して検証する予定です。

マグネットスイッチが反応した時、対応する赤外線距離センサーの値を見ることで、サンタさんが検出できる！かもしれません。その際に、mp3で"サンタさんありがとう"と再生されるようにしておけば、きっとサンタさんも喜んでくれるのではないでしょうか。

##サンタさんにもハッキング能力が必要な時代がやってきた
先日、ソニーさんがスマホで鍵を開け閉めする機器を来年春に発売すると[報道されました](http://www.asahi.com/articles/ASGDH4F97GDHULFA00Z.html)。そうなると、サンタさんにもハッキング能力が要求されることになりますね。サンタさんも大変です。

##最後に
クリスマスシーズンということで、サンタバージョンで書きましたが、そもそもこのシステム、学校から家に子供が帰ってきた時に教えてくれる仕組みが欲しくて、真面目に考えてます。子供が二人（小学生と中学生）いるので、それもわかる方法がないかなと。

背の高さの検出は赤外線距離センサー以外も視野に入れて、今後もいろいろと考えていきたいと思っています。
また、検出した際には、私と嫁さんの携帯にメールが届くようにしたいと思っています。rasberry piならメールを出すくらいは難しくないですし。

それでは、よいクリスマスをお迎えください。ちょっと早いですが、Merry X'mas!
SVGのpath dをCGPathRefに変換する

iPhoneの解像度が増えた影響で、アイコンなどにベクターデータを使うメリットが増してきています。
ただ、iOS標準フレームワークではこの辺りはちょっとばかしかゆいところに手が届かないところです。

今回は小さな対応策の１つとして、

**SVGのpath d要素をCGPathに変換する**、

というのをやろうと思います。

この方法には、

・svg全部パースするより遥かに簡単
・読み込んだCGPathRefは描画前に編集したり、描画方法を自由にカスタマイズできる

といったメリットがあります。

また、SVGKit( https://github.com/SVGKit/SVGKit )なんかもありますが、
ちょっとわりと大きなフレームワークなので、
一部だけSVG使いたいだけの時にはちょっとオーバースペックな気がします。



というわけでソースです。
コピペしてすぐ使い始めることができます。

https://github.com/Ushio/SVGPathD
※コア実装はSVGPathD.h, SVGPathD.mmで、あとはデモ用です。

path dの要素はとても単純で、
コマンド文字と、それに付随する数値データで構成されています。

NSScannerを使えばこのあたりの連続データは比較的簡単に読むことができました。
SVGのたくさんのタグをパースして適切に対応するのに比べたらずいぶんと軽いです。

また、今回は、Aコマンド（円弧を描くコマンド）は面倒だったのでサポートしていませんが、
Mm, Ll, Hh, Vv, Cc, Ss, Qq, Tt, Zz
のコマンドは読むことができます。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/8588/67a6fda5-fe6c-a68e-7975-909b80353209.png)

デモのパスデータはこちらからお借りしています。
http://www.flaticon.com/packs/merry-christmas-line
http://creativecommons.org/licenses/by/3.0/


今回提案した手法は、全然万能な解決策ではありませんが、
結構ガチっとはまるケースだってあるような気がします。
Visibilityプロパティのアニメーション時の振る舞い

visibilityプロパティはdisplayプロパティと違い、指定する値が数値などではないにもかかわらずアニメーション可能なプロパティとして扱われます。

実際にはプロパティの「アニメーション」というよりは、プロパティの「切り替え」といった挙動ですが以下のルールに基づいて、アニメーションを行っています。

##プロパティの置き換えルール

[CSS Transitions](http://www.w3.org/TR/css3-transitions/#animtype-visibility)
>visibility: if one of the values is ‘visible’, interpolated as a discrete step where values of the timing function between 0 and 1 map to ‘visible’ and other values of the timing function (which occur only at the start/end of the transition or as a result of ‘cubic-bezier()’ functions with Y values outside of [0, 1]) map to the closer endpoint; if neither value is ‘visible’ then not interpolable.

1. プロパティの値の片方がvisibleだった場合、timing-functionの計算値が0より大きく1未満のとき'visible'扱いする
2. timing-functionの計算値が0未満の場合は0、1より大きかった場合は1扱いする
3. プロパティ値の両方がvisibleでない場合、なにもしない

つまり以下のようなコードがあった場合 #sample-wrap にマウスオーバーすると、すぐに#sampleが現れ、マウスアウトすると1秒後に#sampleが消えます。

http://codepen.io/bukurocci/pen/zxBmbN

```css:css
#sample-wrap {
  width: 100px;
  height: 100px;
  border: 1px solid #000;
}

#sample {
  width: 100px;
  height: 100px;
  background: #f00;
  visibility: hidden;
  -webkit-transition: visibility 1s ease-out;
  -moz-transition: visibility 1s ease-out;
  transition: visibility 1s ease-out;
  cursor: pointer;
}

#sample-wrap:hover #sample {
  visibility: visible;
}
```

これは置き換えルールの1で 0 < value < 1 の区間がvisible扱いされるためです。
SwiftでのUIWebViewサンプル

環境：Xcode 6.1.1
webViewのアウトレットはAssistant Editorで生成

```swift
class ViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.delegate = self
        
        var url = NSURL(string: "http://google.com")
        var urlRequest = NSURLRequest(URL: url!)
        webView.loadRequest(urlRequest)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func webViewDidFinishLoad(webView: UIWebView) {
        NSLog("web loaded")
    }
}
```

参考
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/index.html
非非Prolog的Prologプログラミング

[12/2の記事](http://qiita.com/mandel59/items/0111154e5dbeb537ec32) で [mandel59](http://twitter.com/mandel59) さんが書かれた記事に [TakaoOzaki](http://twitter.com/TakaoOzaki) さんが尾崎さんらしいコメントしてたのが面白かったです．そこで私も**Prolog的**という妄念について個人的なコメントをしようと思いました．

#非Prolog的Prologプログラミング
まず元のコードを引用．

```prolog
f(0, 0).
f(1, 1).
f(N, Y) :-
    N > 1,
    !,
    N1 is N - 1,
    f(N1, Y1),
    N2 is N - 2,
    f(N2, Y2),
    Y is Y1 + Y2.
```

**Prolog的**という概念は特に定義されていないと思いますので，私はこのコードが取り立てて**非Prolog的**だとは思わないですが，敢えて申しますと，

```prolog
?- f(N, 55).
```

というクエリが通らないのは嫌です．ここで改めて [mandel59](http://twitter.com/mandel59) さんの記事に目を戻しますと，

> 関数を基本単位としたプログラミングをしてきたのに、いきなり述語で書けと言われても、どうすればいいか分からない。今回は、関数を述語で表現してみる。

と書かれています．しかしながら記事中のフィボナッチ関数の定義には n に関する記述がありませんので well-defined になっていません．当然この n は自然数です．実際に Prolog 処理系は変数 N を決定する術が無くて困っているので，関数を述語で表現する際には可能な限り well-defined に与えてやらなくてはなりません．

#非非Prolog的Prologプログラミング

私は別に**Prolog的**という概念を述べたいわけじゃないんですけど，非Prolog的ってことも無いんじゃないの？という感じの書き方を示したいと思います．

まず自然数を定義してやります．

```prolog
nat(0).
nat(N) :- nat(N0), succ(N0, N).
```

これで `?- nat(N).` とすれば自然数 N が列挙できます．ちなみに succ/2 は ISO-Prolog の仕様にはありませんが，大半の処理系では実装されています．自分で書いたとして難しくありませんので，興味がある人は調べてください．

あとはほぼ元のコードのままで問題ありません．

```prolog
fib(1, 1) :- !.
fib(2, 1) :- !.
fib(N, M) :-
    nat(N), 2 < N,
    N1 is N - 1,
    N2 is N - 2,
    fib(N1, M1), fib(N2, M2),
    plus(M1, M2, M), !.
```

これで先程の問題は解決します．

```prolog
?- fib(10, X).
X = 55.
?- fib(N, 55).
N = 10.
```

#予告

明日は [suharahiromichi](https://twitter.com/suharahiromichi) さんの記事についてです．
Qiita API v2のPythonラッパー実装した


Qiita API v2のPythonラッパーがなかったので作りました

- Github: [petitviolet/qiita_py](https://github.com/petitviolet/qiita_py)
- Pypi: [qiita_v2 0.1.0 : Python Package Index](https://pypi.python.org/pypi/qiita_v2)


テストとか`doctest`で適当に書いてるのしか無いので、バージョンは`0.1.0`としています

# インストール

Pypiに登録しているので`pip`で出来ます

```sh
pip install qiita_v2
```

# 使い方

```py
from qiita_v2.client import QiitaClient

client = QiitaClient(access_token=<access_token>)
response = client.get_user('petitviolet')
res.to_json()
# => jsonified contents
```

アクセストークンは`access_token`に引数として渡すか、
yamlファイルに`ACCESS_TOKEN:<access_token>`と書いてそのファイル名を`config_file`に渡しても良いです

もう少し詳しい使い方はちゃんと書いていないので、[client.pyの実装](https://github.com/petitviolet/qiita_py/blob/master/qiita_v2/client.py)を見て下さい
docstringは[increments/qiita-rb](https://github.com/increments/qiita-rb/blob/master/lib/qiita/resource_based_methods.rb)を
パクって
参考にして書いてあります...
python の nosetests を実行するためのgulpのtask runner

<pre>
// -*- coding: utf-8 -*-
var fs = require('fs');
var gulp = require('gulp');
var child_process = require('child_process');
 
gulp.task('test', function (){
    var status = 'stop';
    var cmd = 'nosetests';
    var targets = [
        'src/**/*.py',
        'tests/**/*.py'
    ];
 
    var testing = (function (event){
        console.log('run: ' +  event.path);
        if(status != 'running'){
            status = 'running';
            var child = child_process.exec(cmd, function (err, stdout, stderr){
                if (!err){
                    console.log('stdout: ' + stdout);
                    console.log('stderr: ' + stderr)
                } else {
                    console.log(err);
                    // err.code will be the exit code of the child process
                    console.log(err.code);
                    // err.signal will be set to the signal that terminated the process
                    console.log(err.signal);
                }
                status = 'stop';
            });
        };
    });
 
    gulp.watch(targets, function (event){
        testing(event);
    });
});
 
gulp.task('default', function (){
    gulp.run('test');
});
</pre>
goenvでgae/goと普通のgoの環境を切り替える

gae/goはSDKの中にgoそのものも内包しているため、GOROOTとGOPATHを切り替えてやる必要が出てきます。
shellで切り替えても良いのですが、環境を切り替えるためのtoolに[goenv](https://bitbucket.org/ymotongpoo/goenv)があるので、今回はこちらを使って環境を切り替えるやり方を紹介します。

# goenv install

[goenv](https://bitbucket.org/ymotongpoo/goenv)のinstallは公式Documentに書いてある通りです。

# projectを作る
goenvを利用してgae/go用のprojectを作ります。

```bash
$ goenv -gae -go /Users/sinmetal/bin/google-cloud-sdk/platform/google_appengine/goroot -deps /Users/sinmetal/go sample

Environment /Users/sinmetal/Documents/temp/sample created!sample created!
```

## option

### -gae 
GAE用のproject作成を指示するために-gaeを設定します。
これにより、app.yamlを生成してくれます。
普通のgoのproject作る時は、指定する必要はありません。

### -go
-goはGOROOTを独自設定にするためのものです。
gae/goはSDKにgoそのものを持っているので、ここで指定します。
gae/goではなく普通のgoのprojectを作る時は、goがinstallされているpathを指定します。

### -deps
作業ディレクトリ以外のPATHをGOPATHに追加するオプションです。
GAEの場合go getしたライブラリを作業ディレクトリの中に置くとデプロイ時にbuildされてしまうため、作業ディレクトリの外にGOPATHを置きます。
-depsを使えば外に置いてあるGOPATHと作業ディレクトリを連結してGOPATHに設定してくれます。

[GAE/Go でのGOPATH設定](http://knightso.hateblo.jp/entry/2014/11/26/103637)

## 成果物

GAE設定の場合、以下のようなdir構造ができあがります。
activateに設定が書き込まれています。

```bash
sample
├── activate
└── src
    ├── app.yaml
    └── sample.go
```

ここまでで既にlocal serverは立ち上げることができます。

```bash
$ goapp serve sample/src/app.yaml                                                                                                                       

INFO     2014-12-20 08:38:43,540 devappserver2.py:745] Skipping SDK update check.
WARNING  2014-12-20 08:38:43,554 simple_search_stub.py:1115] Could not read search indexes from /var/folders/qt/n8vfptws13n9kgw4yddt4j8r0000gn/T/appengine.sample.sinmetal/search_indexes
INFO     2014-12-20 08:38:43,557 api_server.py:172] Starting API server at: http://localhost:59581
INFO     2014-12-20 08:38:43,561 dispatcher.py:186] Starting module "default" running at: http://localhost:8080
INFO     2014-12-20 08:38:43,564 admin_server.py:118] Starting admin server at: http://localhost:8000
```

## goenv使い方

activateの適用と解除を実行すれば、projectに合わせて、
gae/goと普通のgoを切り替えることができます。

### 設定適用

source {activate path} を実行すれば、activateの内容に設定を書き換えてくれます。

```bash
$ source sample/activate

(go:sample) ╭─sinmetal@Aggron.local ~/Documents/temp
```

### 設定解除

deactivate を実行すれば、元の状態に戻ります。

```bash
$ deactivate

sinmetal@Aggron.local ~/Documents/temp
```
vue.js + webpack の紹介(その2)

[その1](http://qiita.com/hashiratokei/items/05c590a9da3a3851f7c2)の続きです。
vue.jsは、以下のようにscriptタグで外部jsを読み込むことでも使えます。

``` index.html
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
<script src="app.js"></script>
```

``` app.js
var app = new Vue({
  el: '#app',
  // 以下略 
});
```

しかし、基本的にはwebpackやBrowserify、Componentといった "CommonJS modules"に対応したbundleツール？と一緒に使うことが前提となっています。bundleツールを使うことで、上記を以下のように書くことができるようになります(*1)。

``` index.html
<script src="app.js"></script>
```

``` app.js
var Vue = require('vue');

var app = new Vue({
  el: '#app',
  // 以下略
});
```

vue.min.jsの読み込みが無くなり、代わりに```var app = require('vue');```という1行が追加されているのが分かると思います。このインポート用の```require```と、未紹介ですがエクスポート用の```module.exports```という機能が"CommonJS modules"です。そう、クライアントサイドJSにも、遂にimportやusing的な機能がやって来たのです(*2)！

> *1 正確ではありません。実際のindex.htmlではwebpackによって生成されるbundle.jsを読み込むことになります。
> *2 RequireJSなんて無かった。


## webpackを使った開発の流れ

とても便利なwebpack(require/module.exports)ですが、代償としてビルドが必要になります。具体的な流れを書いたほうがわかりやすいと思うので、例を書きます。

- 使いたいライブラリを```npm```や```bower```といったライブラリ管理ツールを使ってインストールする
- 自分で書いたコードも、モジュール化できるところは```module.exports```でモジュールとして定義する。vue.jsで言えば、各ComponentやDirectiveは1つ1つ別々のjsファイルで書いて、exportsする。
- 使いたいモジュールを、使いたい所で```require('hogehoge')```する
- webpackコマンドを叩く(ビルドする)
- 全ての参照関係が解決された、bundle.jsができあがる

> bundle.jsの名前は変更できます

## webpackのすごいところ

ここまでは、どのbundleツールにもある機能ですがwebpackには更にいい感じの機能が追加されています。

### bundle.jsの分割

全てが1つのbundle.jsにまとめられてしまうと、初期表示までが遅くなってしまいます。そこでwebpackでは、以下のようにrequire.ensureを使うことで、

```hugahuga.js
require.ensure(['hogehoge'], function(require) {
  var hoge == require('hogehoge');
});
```

'hogehoge'ライブラリをbundle.jsから分割し、必要になったタイミングで読み込んでもらうことができます。全てwebpackがいい感じにやってくれます。別途定義ファイルに記述するなどの作業は必要ありません。

### 静的ファイルの読み込み

webpackではjsの他にも、cssやhtml、画像などの静的ファイルも```require()```できます。
詳しくは省略しますが、必要なローダーと呼ばれるもの(たとえばhtml-loaderなど)をnpmでインストールし、webpackのconfigファイルである、webpack.config.jsに、

```webpack.config.js
  // ...
  module: {
    loaders: [
      { test: /\.css$/, loader: "style!css" },
      { test: /\.html$/, loader: "html" }
    ]
  },
  // ...
```

のような定義を行っておくことで、jsファイル内で

```app.js
require('main.css');

Vue.component('im-top-view', {
  template: require('im-top-view.html'),
  // 以下略
});
```

と書けます。
同じように、必要なローダーとその定義があれば、sassやless, CoffeeScriptやTypeScript(たぶん)を、同じようにrequireすることもできます。requireされた各ファイルは、ビルド時に変換され、bundle.jsとして出力されます。


### 変更箇所のみのビルド

```webpack --watch``` することで、変更を監視し自動でビルドしてくれます。
またIncremental buildsなため、ビルドが早く気持ちが良いです。


## まとめ

私のにわか知識や、色々端折ったためイマイチ不正確な情報ですが、なんとなくvue.jsとwebpackの良さが伝わったら幸いです。[公式のサンプル https://github.com/vuejs/vue-webpack-example](https://github.com/vuejs/vue-webpack-example) もあるのでぜひ覗いてみてください。
vue.js + webpack の紹介(その1)

最近少しずつvue.jsを触っています。vue.js + webpack という組み合わせが個人的に好きなので、会社を休んだ償いに紹介します。
しっかり作るならAngularJS + TypeScript, 適当に作るならvue.js + webpackというのが、悪くない選択肢なのではと思っています。

## vue.jsはどんなもの？
Angularさんで言う、Directiveの作成に特化したライブラリです(たぶん)。
```<span v-show=“isMobileDevice”>```みたいなオレオレ属性や、```<im-sp-tag></im-sp-tag>```のようなオレオレタグが簡単に作れます。むしろ、それだけの機能しかありません(*)。Angularさんでは、属性とタグ、どちらもDirectiveと呼びますが、vue.jsでは、

- 属性 => Directive
- タグ => Component

と別々の名前が付けられています。
AngularさんのDirectiveが無駄に取っ付きにくい原因の1つが、Directiveという名前に複数の概念を押し込んだことだと思うので、ここは素晴らしい改善だと思います。名前が違うので、それぞれの役割も明確に分かれています。

> *属性とタグの他に、filter機能もあるのですが、簡潔に紹介するために省略します。


### Directive(属性)の役割

各タグに共通(*)の超汎用的機能？を提供することです。

- 例1: “v-repeat”: ```<li v-repeat="user : users">```
- 例2: “v-on”: ```<a v-on="click: showMessage>Click Me!</a>```

vue.jsにバンドルされているDirective以外にも、”v-t”(i18n用)や、”v-touch”(touch対応)などがpluginとして開発されています。バンドルされているDirectiveの一覧です。=> http://vuejs.org/api/directives.html

> *特定のタグにしか使えないDirectiveもあります。input系専用の"v-model"など。


### Component(タグ)の役割

カスタムビューを作ることです。Componentを使うことで、あれほど醜かったindex.htmlも

```index.html
<body>
  <im-header></im-header>               <!-- Componentその1 -->
  <im-top-contents></im-top-contents>   <!-- Componentその2 -->
  <im-footer></im-footer>               <!-- Componentその3 -->
</body>
```

と書けます。なんということでしょう。
更に、Componentは入れ子にできるので、

```index.html
<body>
  <im-top-view></im-top-view>   <!-- Componentその1,2,3を中に持っている -->
</body>
```
とすることもできます。なお、様々な理由で、

```index.html
<body>
  <div v-component="im-top-view"></div>
</body>
```
と書くことも多いみたいです。


## まとめ

日本語の資料も徐々に増えてきましたし、何より見通しの良いライブラリになっているので、是非触ってみてください。なお、Angularさんとは違いフルスタックではないので、Router機能やサーバとの通信には、別のライブラリと連携する必要があります。以下参考リンクなどです。その2で、vue.jsとwebpackの連携について書きます。=> [書きました](http://qiita.com/hashiratokei/items/1305a957491ae396cae9)

- http://qiita.com/icoxfog417/items/49f7301be502bc2ad897 (はじめてのvue.jsとしておすすめです)
- http://vuejs.org/examples/ (公式のサンプル。コードも見られます)
- http://vuejs.org/guide/application.html (大きなアプリを作りたくなったら)
Gitの初期化からサーバ用のGitの作成まで


プロジェクトを立ち上げる際、Gitを用いてソース管理しているのだが、最初に行う手続きに関しての手続きをしょっちゅう忘れてしまうので、今回備忘録としてアップする事にした。

## Gitの初期化
管理するソースファイル（またはドキュメント類など）が含まれているディレクトリ配下で、以下のコマンドを実行する。

``` shell-session
$ git init
```

これを実行すると、 **.git/** という名前のサブディレクトリが作られ、リポジトリに必要なすべてのファイル（Gitリポジトリのスケルトン）がその中に格納される。なお、 **.git/** ディレクトリが置かれるディレクトリを **リポジトリルート** と呼ぶ。

## Gitの管理対象外ファイル
Git上で、バージョン管理外としたいファイルは、リポジトリルートに **.gitignore** ファイルを作成・配置し、その中に管理外としたいファイルを記述する。 **.gitignore** に記述する内容のサンプルを以下に示しておく。

```
.gitignore
.DS_Store
.project
.pydevproject
```

## 現在のバージョン状態を確認するには
```shell-session
$ git status
```

現在のバージョン管理状態を確認するには上記のコマンドを実行する。
このコマンドの実行結果からは、前回コミットされた時の状態から変更が加わったファイルや、新規に追加されたファイルなどが、リスト化されて表示される。なお、このコマンドは頻繁に使用するものであるため、出力される結果の見方などは、理解しておいた方が良い。

## バージョン管理追跡外ファイルからバージョン管理追跡対象ファイルへ
Git上で追跡対象外となっているファイル（例えば、新規に追加したソースファイル等）を追跡対象ファイルへと状態を変更するには、以下のコマンドを実行する。

- 以下のコマンドの「Sample_001.py」は、利用環境に応じて追跡対象としたいファイル名に差し替えること。

```shell-session
$ git add Sample_001.py
```

## サーバ用Gitの作成
Gitサーバを立ち上げるには、既存のリポジトリをエクスポートして新たな **ベアリポジトリ** （作業ディレクトリ）を作る必要があるので、下記コマンドを実行すること。

``` shell-session
$ git clone —-bare my_project my_project.git
```

上記第3引数に示す **my_project** は **.git/** が含まれるディレクトリ名を指し示す事。

## リモートでの作業
サーバ用Gitを作成した後、それをリモートで作業できる様に以下の設定をしておく。

```shell-session
$ git remote add origin my_project.git
```

上記の例は、my_projecto.git を **origin** という名前でアクセスできるように設定した。

なお、リモートの設定状況は以下のコマンドで確認できる。

```shell-session
$ git remote -v
```

## 変更履歴をリモート先のGitへ反映するには

```shell-session
$ git origin master
```

を行う事で、リモート先へ変更点をコミットする事が出来る。

## ひとまず
細かいコマンドなどなど、色々あるが、上記の流れを一通り押さえておけば良いかと思う。。。。個人的にね。。。。
SeleniumWebdriver で Jenkins から Firefox 多重起動時 の 「e is null」エラー対処法

こちらは、[Selenium/Appium Advent Calendar 2014](http://qiita.com/advent-calendar/2014/selenium)の20日目の記事となります。

Selenium Webdriver で Jenkins からFirefox多重実行時にハマった現象について書いていきたいと思います。


## 現象

Jenkins から Firefox 多重起動時に下記のエラーが発生
```
JavaScript Error: "e is null"
```

## 前提(使用環境)
- FireFox
- Jenkins
- Selenium Webdriver
- Ruby

## 原因

sleepを使っているのが、よろしくないみたい

> Using Thread.sleep() also can cause it, 
because it increases overhead so instead implicitlyWait or WebDriverWait should be used.

## SleepよりWaitコマンドを使うほうがいいみたいです

1. Implicit Wait

```ruby:implicit_wait.rb
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # seconds

driver.navigate.to "https://www.google.co.jp/"
driver.find_element(:id => "gbqfq").click
```

2. Explicit Wait

```ruby:explicit_wait.rb
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "https://www.google.co.jp/"

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
  element = wait.until { driver.find_element(:id => "gbqfp") }
ensure
  driver.quit
end
```

## 結論
Sleepはよろしくない
Waitを使うべし

### 注意
あくまでもアプローチの一つです。
Sleepを使っていなくても、上記のエラーが発生することがあると思います。

その場合の対処法は自分が教えてもらいたいです。。

## 参考
https://www.linkedin.com/groups/I-have-problem-in-my-961927.S.221787622
忘備録　modulesやpackagesのマイグレーション呼び出し

どうやったけ？とたまに忘れので...(^^;

http://fuelphp.jp/docs/1.7/general/migrations.html
> マイグレーションはモジュールとパッケージもサポートします。oil コマンドで、すべてをマイグレートしたり、特定のモジュールやパッケージのみを指定することができます。 モジュールやパッケージを指定した場合に、アプリケーションのマイグレーションも含めたい場合は、 '--default' を指定します。

```php:
$ php oil refine migrate --modules="モジュール名"
$ php oil refine migrate --packages="パッケージ名"
```
ターミナルを介さずに起動するアプリケーションが参照する環境変数を設定する


## 変数に値を設定

```
$ launchctl setenv STUDIO_JDK /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk
```

## 変数の値の確認

```
$ launchctl getenv STUDIO_JDK
/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk
```

## システム起動時に変数を設定

`/etc/launchd.conf` ファイルに以下のように記述する（無い場合は作成する）

```
setenv STUDIO_JDK /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk
```

上記に設定した値はシステム起動時に読み込まれるので、値を有効にするためにはシステムの再起動が必要。

# 参考

[Beginning OS X Mavericks/インフラ整備編](http://osx.miko.org/index.php/Beginning_OS_X_Mavericks/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%95%B4%E5%82%99%E7%B7%A8#.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0.E3.81.AE.E8.A8.AD.E5.AE.9A)
Ruby on Railsで テーブルを削除するときの処理

Rails で、テーブルを削除したくなったときの処理記述

hogefuga 日付（不要かも）
footale2s テーブル名　（“s”　は自動的に付与されます）

hogefuga_drop_footable2s.rb

class DropBook2s < ActiveRecord::Migration
  def change
    drop_table :Book2s
  end
end
ApacheでPOSTデータをログに記録したい

ApacheでPOSTデータをログに記録したい
=====================================

はじめに
---------

Apacheのデフォルトの設定ではaccessログにはPOSTデータの
内容は表示されません。
というか、ユーザの機密情報をログに残さないことが目的の一つで
POSTメソッドを使っているので、それで正しい思います。

ただ、開発中の検証などで、POSTデータをログに記録したいことが
あると思いますので、その方法を説明します。

もっとも、自分はPOSTするようなWEBアプリケーションを作るときはWEBフレームワークを
使っていて、だいたいのフレームワークはdebugモードにすると、POSTのデータを
見ることができるので、めったに使うことはないと思いますが、、、


環境について
--------------

下記の環境で設定をしました。

* OS: CentOS6.4 x86_64

* Apache: Apache 2.2.25 (ソースからインストールしたもの)


mod_dumpioインストール
------------------------

POSTデータをログに残すためには、`mod_dumpio`というモジュールが必要になります。

まず、これがインストールされているかチェックします。

インストールされている場合:

```bash
# httpd -M |grep dumpio
dumpio_module (shared)
Syntax OK
```

インストールされていない場合:

```bash
# httpd -M |grep dumpio
Syntax OK
```

`mod_dumpio`がインストールされていない場合は、インストールします。
下記は拡張モジュールをソースからインストールする方法です。

mod_dumpioモジュールがある、Apacheのソースアーカイブに移動:

```bash
# cd /..Apacheのソース../modules/debug/
```

apxsコマンドを使ってモジュールをインストール:

```bash
# apxs -i -a -c mod_dumpio.c
```

Apacheの設定ファイルhttpd.confを編集
----------------------------------------

`apxs`コマンドの`-a`オプションで、`httpd.conf`に下記が追記されていることを確認:

```bash
LoadModule dumpio_module      modules/mod_dumpio.so
```

サーバ設定ファイルにDumpIOInputディレクティブを追記:

**これにより、HTTPリクエストのヘッダやボディの内容がerrorログに表示されるようになります**

```bash
DumpIOInput On
```

サーバ設定ファイルにDumpIOOutputディレクティブを追記:

**これにより、HTTPレスポンスのヘッダとボディの内容がerrorログに表示されるようになります**

```bash
DumpIOOutput On
```

ログレベルを`dubug`にする:

```bash
LogLevel debug
```

以上でApacheのerrorログにPOSTの内容が表示されるようになります。

私は最初勘違いしてaccessログ見てました、、、
sedコマンド

はじめに
---------

sedコマンドだけで1冊の本が書けてしまうらしく、実際に本も売ってますが
他の本を読むのに忙しく、まだ読んだことがない。。。

なので、実際に疑問に思って試した結果をチップスとして集めていきたいと思います。


空行を削除する
----------------

```bash
$ sed -e "/^$/d" ham.txt
```

ヒットする文字列の先頭に#をつけてコメントアウトする
-------------------------------------------------------

```bash
$ cat ham.txt
aaa bbb ccc

$ sed -e 's/^\(aaa .*\)$/#\1/g' ham.txt
#aaa bbb ccc
```

ファイルを置き換える
---------------------

このオプションを知る前は下記のような感じでやってました

```bash
$ cat text.txt
aaa bbb ccc

$ cp test.txt test.bak

$ cat test.bak | sed -e 's/aaa/zzz/g' > test.txt

$ cat test.txt
zzz bbb ccc
```

sedコマンドのオプション`-i`を使うと下記のようにスマートに

```bash
$ cat text.txt
aaa bbb ccc

$ sed -i -e 's/aaa/zzz/g' test.txt

$ cat test.txt
zzz bbb ccc
```
git reset --hardでのファイル変更取り消しについて

はじめに
---------

作業中に、まだインデックスに登録していない作業ツリーのファイルを
HEADの状態に戻したいことがあります。

そこでためしに、`git reset --hard HEAD -- [任意のfilename]`とやったところ
`fatal: Cannot do hard reset with paths.`と怒られました。

このような場合の対処について説明します。


対処法
-------

`git reset`コマンドの場合、`--mixed`、`--hard`、`--soft`のオプションを使用すると
引数には、`<commit>`しか指定できません。

そのため、特定のファイルのみを過去のある時点に戻す場合は`git checkout`を利用します。

例えばファイル`test_file.txt`をHEADの状態に戻す場合は、下記のように実施します。

```bash
$ git checkout HEAD -- test_file.txt
```
マージで競合が発生した時に、マージをやり直す方法

はじめに
---------

マージを実行して競合が発生した時、競合を解決しているうちに、途中で
何をやっていたかわからなくなり、マージを最初からやり直したくなることが
あります。

ここではその方法を簡単に解説します。


マージで競合が発生した時に、マージをやり直す
---------------------------------------------

masterブランチでファイルを作成

```bash
$ git branch -l
* master

$ vi master_file1
* new: commit by master branch --> 1行目を編集する

$ git add master_file1 

$ git commit -m "add master_file1"
```

topicブランチで`master_file1`を編集

```bash
$ git checkout -b topic
$ vi master_file1
* edit: commit by topci branch --> 1行目を編集する

$ git commit -am "edit master_file1 by topic branch"
```

masterブランチで`master_file1`を編集

```bash
$ git checkout master
$ vi master_file1
* edit: commit by master branch --> 1行目を編集する

$ git commit -am "edit master_file1 by master branch"
```

masterブランチでtopicブランチをマージ

> ここでコンフリクトが発生する

```bash
$ git branch -l
* master
  topic

$ git diff topic                                          
diff --git a/master_file1 b/master_file1
index fc507c7..c65fc62 100644
--- a/master_file1
+++ b/master_file1
@@ -1 +1 @@
-* edit: commit by topci branch
+* edit: commit by master branch

$ git merge topic                                         
Auto-merging master_file1
CONFLICT (content): Merge conflict in master_file1
Automatic merge failed; fix conflicts and then commit the result.

$ git status -s
UU master_file1

$ cat master_file1 
<<<<<<< HEAD
* edit: commit by master branch
=======
* edit: commit by topci branch
>>>>>>> topic
```

マージをやり直す

> 先ほどマージした時にコンフリクトしたファイルが、マージ前の
> 状態に戻っている。

```bash
$ git reset --hard HEAD                                   
HEAD is now at bb4408f edit master_file1 by master branch

$ cat master_file1 
* edit: commit by master branch
```
Oracle ORIONの紹介

はじめに
----------

これまで、LinuxサーバのDiskパフォーマンスを検証するにあたり、
**Bonnie++**や**IOZone**を使っていましたが、なんとなくしっくりきて
いませんでした。

そんな時、Oracleの**ORION**というベンチマークソフトに出会いました。

なんでも、**Oracle Database（DB）のI/O ワークロードをシュミレートできるフリーの
ディスクI/O 性能測定ツール**、ということで、現実味があり、とてもよさそう。

参考URLが下記にありますが、使い方はとても簡単なので、検証で重宝しそうです。

参考URL
--------

* [Oracle ORIONの使用方法 （Linuxディスクベンチマーク）](http://hesonogoma.com/linux/oracle_orion_disk_performance_benchmark.html)

* [Oracle ORIONの使用方法 （Windowsディスクベンチマーク）](http://hesonogoma.com/Windows/oracle_orion_disk_benchmark.html)

* [Oracle Orion測定ツールによるI/O測定](http://docs.oracle.com/cd/E16338_01/server.112/b56312/iodesign.htm#CACJEEDI)
MagicaVoxelでつくった3DモデルをlibGDXで表示するときの注意

最近 [libGDX](http://libgdx.badlogicgames.com/) というゲームフレームワークを触り始めました。
はじめての3Dゲームの開発にも挑戦しようと思っています。

[チュートリアル](http://blog.xoppa.com/basic-3d-using-libgdx-2/)をすすめながら libGDX で遊んでいたところ、ハマったのでメモです。

[MagicaVoxel](https://voxel.codeplex.com/) というドット絵っぽい3Dモデルを作れるツールがあります。
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/12564/967dac18-941b-0264-0785-b31e31dbc07f.png)

このツールで作成したモデルをエクスポートし、libGDX で表示しようとしました。
MagicaVoxel では obj 形式でモデルをエクスポートします。
右下の方にあるボタンを押すと、MagicaVoxel の実行ファイルがあるディレクトリ下のexport ディレクトリに出力されます。obj, mtl, tga の3つのファイルが出力されます。

この3つのファイルを libGDX で作成したアプリケーションから読み込めるディレクトリに配置し、AssetManagerで obj ファイルを読み込み表示してみると普通に表示されます。

ただし、実行テストでは obj ファイルのままでよいけれど、実際のアプリケーションでは [fbx-conv](https://github.com/libgdx/fbx-conv) なるツールを使って g3db 形式に変換すべしと書いてありました( http://blog.xoppa.com/loading-models-using-libgdx/ )。

fbx-conv を使って g3db 形式に変換し、表示させようとしたところ何も表示されませんでした。エラーメッセージもありません。

調べてみると、どうやら MagicaVoxel(0.94)がエクスポートするファイルがよくないみたいです。
以下の2つの操作をすることでモデルを表示することが出来ました。

* mtl ファイルのパレットファイルを指定しているところ、`map_kd` を `map_Kd`と修正する。（k が大文字）。
* mtl ファイルに `d 1.0` と書いた行を追加する。（マテリアルのopacityを1.0に）

mtl ファイルを修正したあとに fbx-conv を使って変換した g3db ファイルを読み込むとモデルが正しく表示できました。
Debian使いがGentooインストールしてみたよ

# isoイメージをダウンロード

```
$ wget http://ftp.jaist.ac.jp/pub/Linux/Gentoo/releases/amd64/current-iso/install-amd64-minimal-20141204.iso
```

このisoファイルをvirtualboxから起動する。

# stage3まで

pingしてみて、ネットワークが通っていることを確認。

xxx

以下のlinksコマンドでstage3アーカイブをダウンロードする。

```
$ cd /mnt/gentoo
$ links http://ftp.jaist.ac.jp/pub/Linux/Gentoo/releases/amd64/current-iso/stage3-amd64-20141204.tar.bz2
```
# 参考文献

* Gentoo Linux ドキュメント -- Gentoo Linux x86 ハンドブック http://www.gentoo.org/doc/ja/handbook/handbook-x86.xml
* Handbook:AMD64 - Gentoo Wiki http://wiki.gentoo.org/wiki/Handbook:AMD64
Aptanaで掴んでいる9000番ポートの解放


# YEOMANを利用する際の開発ツールとして
今まではSublimeTextを利用していたのだが、コードの折りたたみ方法がしっくり来ていなかったので、これまでなじみのあるAptana Studioに戻ってきてみた。

# Aptana Studio上で"Grunt Serve"とすると
エラーメッセージとして、既に何かのプロセスが9000番ポートが使っている旨のエラーメッセージに遭遇。

```shell-session
Fatal error: Port 9000 is already in use by another process.
```

# 色々調べてみると
どうもAptana StudioではPHPのデバックで使用するXDebug用に既に9000番ポートを確保していた様だった。

ひとまず、PHPは使用しないので、以下の手順で9000番ポートを別のポート番号に割り当てる事とした。

1. Aptana Studio 3  -> 環境設定 -> Aptana Studio -> Editors -> PHP -> Debug を選択
2. Install Debuggers の XDebugのPort値を **9000 -> 9001** へと変更

# これでようやく
お目当てだった開発を進める準備が整いました ^^;
定番有益技術書メモ




ハッカーと画家
リファクタリングウェットウェア
リファクタリング、
リーダブルコード、
達人プログラマー、
珠玉のプログラミング、
デザインパターン入門、
プログラミング作法、
Effective Java、
CODE COMPLETE、
計算機プログラムの構造と解釈
My Job Went To India オフショア時代のソフトウェア開発者サバイバルガイド
quickrun.vim の *_spec.rb ファイル (RSpec3) 用の設定 (行指定実行、カラー出力)


``*_spec.rb`` に対して quickrun.vim で rspec (RSpec 3) が実行されるようして、更に rspec の出力がカラー表示されるように設定する。

```.vimrc
NeoBundle 'thinca/vim-quickrun'

let g:quickrun_config = {
\   ...
\   "ruby.rspec" : {
\     "command": "rspec",
\     "cmdopt": "-c -fd --tty"
\   },
\   "ruby.rspec_line" : {
\     "command": "rspec",
\     "exec": "%c %s:%{line('.')} %o" ,
\     "cmdopt": '-c -fd --tty'
\   },
\   ...
\}
```

``*_spec.rb`` というファイルに対して ``ruby.rspec`` ファイルタイプが適用されるように設定。

```.vim/ftdetect/ruby.vim
autocmd BufNewFile,BufRead *_spec.rb set filetype=ruby.rspec
```

行指定 (カーソル上のexampleだけ) を実行するためには、新しいキーバインドを定義しておくことにする。

```.vim/after/ftplugin/ruby.vim
nnoremap <silent><buffer> <Leader>rr :<C-u>QuickRun ruby.rspec_line<CR>
```

更に rspec の出力をカラー表示するために AnsiEsc.vim というプラグインを使う。

```.vimrc
NeoBundle 'vim-scripts/AnsiEsc.vim'

augroup quickrun
  autocmd!
  autocmd FileType quickrun AnsiEsc
augroup END
```

## 参考にしたサイト

- [RSpec3.0.0をvim-quickrunとvimprocで行指定実行 - Qiita](http://qiita.com/nabewata07/items/c5c6a208db7972d0cab5)
- [Vim で ANSI color を表示する - miauの避難所](http://d.hatena.ne.jp/miau/20110112/1294832870)
POH Lite4 エンジニアでも恋がしたい-転職初日にぶつかった女の子が同僚だった件 ミッション3

[ミッション1](http://qiita.com/rana_kualu/items/390f72ec444a33a41261) / [ミッション2](http://qiita.com/rana_kualu/items/e5c6cdffe8c459e76575) / [ミッション3](http://qiita.com/rana_kualu/items/4f2f05ca2ab7eb0db7be) / [共通解](http://qiita.com/rana_kualu/items/e5984759d1f81f18d3f0)

```php
<?php
	$input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	
	$una = array_shift($input);
	$una = explode(' ', $una);
	$max = 0;
	
	for($i=0; $i<$una[1]; $i++){
		$tmp =  array_sum(array_slice($input, $i, $una[0]));
		if($tmp > $max){
			$max = $tmp;
		}
	}
	print($max);
```

問題文にある解き方をそのままなぞっただけです。
とっても簡単。

https://paiza.jp/poh/enkoi-ending/e9dcd311
なん…だと！？
単純にやり過ぎたようだ。
答えは合ってるはずだが、効率が悪すぎてタイムオーバーになってしまいました。
もう少し効率の良い方法を考えてみましょう。

```php
<?php
	$input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	
	$una = array_shift($input);
	$una = explode(' ', $una);
	$now =  array_sum(array_slice($input, 0, $una[0]));
	$max = $now;
	
	for($i=$una[0]; $i<$una[1]; $i++){
		$now = $now + $input[$i] - $input[$i-$una[0]];
		if($now > $max){
			$max = $now;
		}
	}
	print($max);
```

https://paiza.jp/poh/enkoi-ending/5d116982
見事にハワイでハネムーンをゲットしました。

動作をサンプルで解説します。
まず左端の4+5+1=10点を前提として計算、MAXも10点と仮置きし、ここをスタート地点とする。
次に右隣の10点をプラス、左端の4点をマイナスすると、これが次の5+1+10=16点となる。
現在のMAX10点を超えているので最大値を更新。
次に右隣の3点をプラス、左端の5点をマイナスすると、これが次の1+10+3=14点となる。
現在のMAX16点以下なのでそのまま。
これを右端に移動するまで繰り返す。

最初のやつに比べて計算量が激減し、全テストケースを時間内に解くことができました。
というわけで、今回は最後まで簡単でした。

しかし正直、このゲーム絶対つまらないだろ。
GAEでPythonのログをコンソールに出力

GoogleAppEngineでは仕様上ログファイルを作成したりできないので、コンソールにログを出力する方法しかありません。[ドキュメント](https://cloud.google.com/appengine/docs)

ログを出力するにはpythonの`logging`モジュールをインポートします。

```python:main.py
import logging

logging.getLogger().setLevel( logging.DEBUG )
logging.info('### info output ###')
logging.debug('### debug output ###')

```

こんなかんじでいかがでしょうか。
簡単なカスタムボタンの作り方


[去年のAdvent Calendar](http://qiita.com/t-kashima/items/adb7e823cc2269aed3f4)もカスタムボタンを作ったのですが、Cocos2d-xの3系が盛り上がっているので、今回はCocos2d-x 3.2を使ってカスタムボタンを作りました。
https://gist.github.com/t-kashima/0c6c51c90d3df02f2631

ここではそのポイントを紹介します。


まずは以下のコードでタッチのリスナーを作ります。

```cpp:CustomButton.cpp
 auto listener = EventListenerTouchOneByOne::create();
```

次にそれぞれのタッチの状況に応じて、タッチされた時のコールバックを設定します。
「onTouchBegan」-> タッチされた時
「onTouchMoved」-> タッチが動いた時
「onTouchEnded」-> タッチが離された時

ラムダ式が使えるのでとても簡単にコールバックが書けますね。


```cpp:CustomButton.cpp
listener->onTouchBegan = [this](Touch *touch, Event *event) {
 
    log("onTouchBegan");
    
    // タッチされた場所を取得する
    Vec2 touchPos = touch->getLocation();
        
    // このオブジェクトがタッチされているかの判定
    bool isTouchInSide = this->getBoundingBox().containsPoint(touchPos);
    if (isTouchInSide) {
        
        // タッチされた時に縮めて小さくする
        this->setScale(0.9f);
        this->setColor(Color3B::GRAY);
           
        return true;
    }
        
    return false;
};
    
listener->onTouchMoved = [this](Touch *touch, Event *event) {
    log("onTouchMoved");
};
    
listener->onTouchEnded = [this](Touch *touch, Event *event) {

    log("onTouchEnded");
        
    
    // タッチが離れた時に元に戻す
    this->setScale(1.0f);
    this->setColor(Color3B::WHITE);
};
```

「onTouchBegan」の中では自分自身がタッチされているかを判定して、タッチされている場合は、少し小さくしてグレーにしています。「onTouchEnded」で元の大きさと色に戻しています。


最後にさきほど作ったタッチのリスナーを登録します。

```cpp:CustomButton.cpp
getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
```

これで最低限ではありますが、ボタンとして機能すると思います！
Swiftまとめ - struct（構造体）-

## 用途

クラスと同じようにプロパティ、メソッドを定義できる。

```swift
struct User {
  var name: String
    
  func hello(){
      print("Hello," + name)
  }
}

var user: User = User(name: "太郎")
user.hello() // => "Hello,太郎"
```

## クラスとの違い

* **structはinitメソッドがいらない。（書いても良い）**

クラスで同じことをする場合は次のようになる。

```swift
class User {
    var name: String
    
    init(name: String){
        self.name = name
    }
    
    func hello(){
        print("Hello," + name)
    }
}

var user: User = User(name: "太郎")
user.hello()
```

* **structは参照型ではない**

structをコピーして2つの値を比較してみる。

```swift
struct User {
  var name: String
}

var user: User = User(name: "太郎")
var user2: User = user
user2.name = "次郎"

println(user.name)   // => "太郎"
println(user2.name)  // => "次郎"
```

両方とも違う値が出力される。

次に、クラスで同じことをやってみる。

```swift
class User {
  var name: String
  
  init(name: String){
    self.name = name
  }  
}

var user: User = User(name: "太郎")
var user2: User = user
user2.name = "次郎"

println(user.name)   // => "次郎"
println(user2.name)  // => "次郎"
```

オブジェクトはコピーしても同じ値を参照し続けているので、2つとも同じ値が出力される。

応用として、structは値なので、クラスのインスタンス変数として使用することができる。プロパティをまとめたい、などの場合に組み合わせて使うと便利。

```swift
struct Bookshelf {
  var width: Int
  var height: Int
}

struct Desk {
  var width: Int
  var height: Int
}

class Room {
  var bookshelf: Bookshelf
  var desk: Desk
    
  init(bookshelf: Bookshelf, desk: Desk){
    self.bookshelf = bookshelf
    self.desk = desk
  }
}

var bookshelf: Bookshelf = Bookshelf(width: 80, height: 120)
var desk: Desk = Desk(width: 60, height: 70)

var room: Room = Room(bookshelf: bookshelf, desk: desk)

print(room.desk.width) // => 60
```

* **structは継承できない**
Swiftまとめ - enum（列挙型） -

## 用途

値をグループ化するのに使用する。

```swift
enum Size {
  case S, M, L
}

// または
enum Size {
  case S
  case M
  case L
}

var size = Size.S // 型はSize型、値はEnum Valueという型で扱われる。
```

参照する

```swift
if(size == Size.S){
  print("Sサイズ")
}

// 型推論で.Sだけでもいける
if(size == .S){
  print("Sサイズ")
}
```

## enumに値（Raw Value）を割り当てる

enumに型宣言が必要。

```swift
enum Size: Int {
  case S = 1
  case M 
  case L
}
```

※ Intの場合、設定値を省略すると、0, 1, 2... という数値が自動的に割り振られる。1から始めると、同じように2, 3, 4...という数値が自動で割り振られる。

Raw Valueを参照するには、`.rawValue`を使用する。

```swift
var size = Size.S
if(size.rawValue == 1){
  print("Sサイズ")
}
```

## 関数を定義する

```swift
enum Size {
  case S, M, L
    
  func sizeToString() {
    switch self {       
      case .S:
        print("Sサイズ")
      case .M:
        print("Mサイズ")
      case .L:
        print("Lサイズ")
      default:
        break
    }
  }
}

var size = Size.S
size.sizeToString() // => "Sサイズ"
```

## rawValue から case を求める

型を指定する必要があります。

```swift
enum Size: Int {
    case S = 0, M, L
    
    func sizeToString() {
        switch self {
        case .S:
            print("Sサイズ")
        case .M:
            print("Mサイズ")
        case .L:
            print("Lサイズ")
        default:
            break
        }
    }
}

let section = Size(rawValue: 0)!
print(section) // S
```
【iOS8とiOS7対応】SwiftでPush

iOS8からPush通知の登録方法が変わりましたが、現場ではiOS7も対応しないといけないと思います。

```
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        var currentVersion = (UIDevice.currentDevice().systemVersion as NSString).floatValue
        if currentVersion >= 8.0{
            var types:UIUserNotificationType = UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound
            var settings: UIUserNotificationSettings = UIUserNotificationSettings( forTypes: types, categories: nil )
            application.registerUserNotificationSettings( settings )
            application.registerForRemoteNotifications()
        }else{
            var types:UIRemoteNotificationType = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Alert | UIRemoteNotificationType.Sound
            application.registerForRemoteNotificationTypes(types)
        }

        return true
    }
    
    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
            application.registerForRemoteNotifications()
    }
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        var characterSet: NSCharacterSet = NSCharacterSet( charactersInString: "<>" )
        
        var deviceTokenString: String = ( deviceToken.description as NSString )
            .stringByTrimmingCharactersInSet( characterSet )
            .stringByReplacingOccurrencesOfString( " ", withString: "" ) as String
        
        println( deviceTokenString )
    }
    
    func application( application: UIApplication!, didFailToRegisterForRemoteNotificationsWithError error: NSError! ) {
        
        println( error.localizedDescription )
    }
```

サンプルコードを載せておきます。
Swift で iPhone のシェイク動作を検出する


# motionBegan, motionEnded を使う

一番手っ取り早いのが UIResponder の motionBegan/motionEneded をオーバーライドする方法です。

まずは canBecomeFirstResponder をオーバーライドして motionBegan/motionEneded が呼ばれるようにします。

```
    override func canBecomeFirstResponder() -> Bool {
        return true
    }
```

motionBegan/motionEneded を実装して行いたい処理を書きます。 

```    
    override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent) {
        if event.type == UIEventType.Motion && event.subtype == UIEventSubtype.MotionShake {
			// シェイク動作始まり時の処理
        }
    }

    override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) {
        if event.type == UIEventType.Motion && event.subtype == UIEventSubtype.MotionShake {
			// シェイク動作終了時の処理
        }
    }

```
## 利点

実装が簡単。

## 欠点

シェイク動作開始・終了時しか検知できません。シェイクした回数をカウントしたい、などの場合はこの方法は使えません。

# CMMotionManager を使う

シェイクした回数をカウントする場合は加速度センサーを使います。

1. CoreMotion.framework を追加
1. CMMotionManager を生成
1. 計測間隔を指定(ここでは 0.2 秒)
1. x,y,z 座標の加速度を取得
1. 直前の加速度と向きが変わっていればシェイクしたと判断する

```
    let motionManager = CMMotionManager()
    var x = 0
    var y = 0
    var z = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        self.motionManager.accelerometerUpdateInterval = 0.2
        self.motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) {
            (data, error) in
            dispatch_async(dispatch_get_main_queue()) {
                self.updateAccelerationData(data.acceleration)
            }
        }
    }

    func updateAccelerationData(data: CMAcceleration) {

        Logger.log("x = \(Int(data.x)), y = \(Int(data.y)), z = \(Int(data.z))")
        
        var isShaken = self.x != Int(data.x) || self.y != Int(data.y) || self.z != Int(data.z)

        if isShaken {
			// シェイクされたときの処理
        }
        
        self.x = Int(data.x)
        self.y = Int(data.y)
        self.z = Int(data.z)
    }
```

## 利点

細かい情報まで取れる。

シェイクしたと判断する基準(計測間隔やどの軸の加速度に着目するか)を用途に合わせて変えられる。

## 欠点

実装がちょっとめんどくさい。
docker-registry 0.9.0のREADMEから


dockerのimageをpush/pullしたり検索したりできるregistry機能を提供するdocker-registryですが、11月に0.9.0が出ていたの知りませんでした。[README](https://github.com/docker/docker-registry/blob/0.9.0/README.md)からアップデート見てみたいと思います。

### Configuration flavorsに2つ追加
`ceph-s3`: S3 API使ってcephをdata storeにする。
`azureblob`: Azure Blob Storageをdata storeにする。

もともとs3というflavorあったんですがあえてceph-s3が出来たのはちょっと違うということでしょうか。WindowsやAzureでdockerサポートされた流れでazureblobなんてのもできましたね。


### debugオプションの追加
General optionsに`debug`オプションが追加されました。エンドポイントの`/_ping`を叩くとlibralyバージョンやホストの情報など色々見れるらしいです。気になるのでちょっと見てみます。

環境変数でDEBUG=trueにします。

```bash
docker run -d -p 5000:5000 \
  --name myreg -v /var/tmp/registry:/opt/registry \
  -e DEBUG=true \
  registry:0.9.0
```

こんな感じのでました。jsonで出力されるのでjqで整形してます。

```json
$ curl -s 192.168.59.103:5000/_ping | jq "."
{
  "host": [
    "Linux",
    "d723b307fcab",
    "3.16.7-tinycore64",
    "#1 SMP Tue Dec 16 23:03:39 UTC 2014",
    "x86_64",
    "x86_64"
  ],
  "launch": [
    "/usr/local/bin/gunicorn",
    "--access-logfile",
    "-",
    "--error-logfile",
    "-",
    "--max-requests",
    "100",
    "-k",
    "gevent",
    "--graceful-timeout",
    "3600",
    "-t",
    "3600",
    "-w",
    "4",
    "-b",
    "0.0.0.0:5000",
    "--reload",
    "docker_registry.wsgi:application"
  ],
  "versions": {
    "SocketServer": "0.4",
    "argparse": "1.1",
    "backports.lzma": "0.0.3",
    "blinker": "1.3",
    "cPickle": "1.71",
    "cgi": "2.6",
    "ctypes": "1.1.0",
    "decimal": "1.70",
    "distutils": "2.7.6",
    "docker_registry.app": "0.9.0",
    "docker_registry.core": "2.0.3",
    "docker_registry.server": "0.9.0",
    "email": "4.0.3",
    "flask": "0.10.1",
    "gevent": "1.0.1",
    "greenlet": "0.4.5",
    "gunicorn": "19.1.0",
    "gunicorn.arbiter": "19.1.0",
    "gunicorn.config": "19.1.0",
    "gunicorn.six": "1.2.0",
    "jinja2": "2.7.3",
    "json": "2.0.9",
    "logging": "0.5.1.2",
    "parser": "0.5",
    "pickle": "$Revision: 72223 $",
    "platform": "1.0.7",
    "python": "2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]",
    "re": "2.2.1",
    "redis": "2.10.3",
    "requests": "2.3.0",
    "requests.packages.chardet": "2.2.1",
    "requests.packages.urllib3": "dev",
    "requests.packages.urllib3.packages.six": "1.2.0",
    "requests.utils": "2.3.0",
    "rsa": "3.1.4",
    "simplejson": "3.6.2",
    "sqlalchemy": "0.9.4",
    "tarfile": "$Revision: 85213 $",
    "urllib": "1.17",
    "urllib2": "2.7",
    "werkzeug": "0.9.6",
    "yaml": "3.11",
    "zlib": "1.0"
  }
}
```

また他にも[advanced features documentation](https://github.com/docker/docker-registry/blob/0.9.0/ADVANCED.md)というのがあったので時間のあるときに見てみようと思います。
以上です
Xcode6でズレが生じる際の対策

こんにちは,nyagato_00です.
Xcode6とiOS8になってStoryboard上のレイアウトと,iOSシュミレーター(実機)でコンテンツのレイアウトにズレが生じることがあるかと思います.

これは,Xcode6からレイアウトが自由に設定できるようになったからなのですが,Xcode5の間隔で開発をすると"アレッ！！"となるかと思います.
(私もなりました.)

![スクリーンショット 2014-12-20 13.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/50627/e2968f98-2146-80e6-add6-c93e21f869f5.png)
こんな感じ...

(´ε｀；)ｳｰﾝ…困りましたねぇ....

Add New Alignment Constrainsを呼び出します.
次に,Horizontal Center in Containerにチェックを入れます.
Update Framesが"None"になっていることを確認し,Add 1 Constraintをクリックします.
![スクリーンショット 2014-12-20 13.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/50627/36a957e7-bc0a-1c33-8b91-97b5b8caa00c.png)

これで,ラベルをセンターに位置させることが出来ます.
![スクリーンショット 2014-12-20 13.08.48.png](https://qiita-image-store.s3.amazonaws.com/0/50627/b663e20c-b97c-6497-89c8-a22be7f9cb59.png)
こんな感じ.
WPFからWindowsFormで作られたFormを呼び出すと・・・

WindowsFormで作成されたFormを表示する
==================================
WPFで作成したアプリからWindowsFormで作ったFormを呼び出すのは特に難しくなく

```csharp
System.Windows.Forms.Form form = new WindowsFormで作られたForm();
form.Show();
```
とすれば良いだけです。

ビジュアルスタイルが適用されない
============================
しかし、上記だけでは表示したFormにビジュアルスタイルが適用されません。
ビジュアルスタイルを適用する方法は
[ハイブリッド アプリケーションで視覚スタイルを有効にする](http://msdn.microsoft.com/ja-jp/library/ms750800%28v=vs.110%29.aspx)
に書かれている通り
`System.Windows.Forms.Application.EnableVisualStyles();`
を呼び出せば、ビジュアルスタイルが適用されます。
もともとWindowsFormの場合はProgram.csの中で`Application.EnableVisualStyles()`を実行してるからですね。

しかし!
======
ちょっとだけ、本当にちょっとだけレイアウトが変わりました。
WindowsFormで作成した親ウィンドウから呼び出した場合と、
WPFで作成した親ウィンドウから呼び出した場合で
`Button`のテキストや`CheckBox`のチェックボックスとテキストの位置、`RadioButton`のボタンとテキストの位置などが微妙にズレています。

![WindowsForm_WPF.gif](https://qiita-image-store.s3.amazonaws.com/0/52493/08ce98d4-4ea2-690c-c255-604106f7092c.gif)

原因や解決方法は分かっていません。
これが問題になることは、まずないと思いますがご参考まで。