OmniAICreator/Qiita-1.07M huggingface dataset:
Nested ESXi with OpenStackハマりどころ

すぐに忘れてハマりまくるのでメモ。

##前提
ESXi 6.0.0、OpenStack Libertyで確認しています。

##KVMサポート
kvm-okでnot supportといわれる場合の対処方法

```
root@compute:~# kvm-okk
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used
```

1.仮想マシンのvmxファイルの設定
vSphere Clientで、ESXホストの「Configuration」タブ＞「Storage」>対象をデータストアを右クリックして「Browse Datastore」をクリック
対象の仮想マシンのフォルダを選択して「<仮想マシン名>.vmx」ファイルをダウンロード
「vhv.enable = "TRUE"」を追記
「<仮想マシン名>.vmx」ファイルをアップロード

2.CPU/MMU Virtualization設定
仮想マシンを右クリックして「Edit settings」をクリック
「Options」タブをクリック
「CPU/MMU Virtualization」をクリック
「Use Interl VT-x/AMD-V for instruction set virtualization and Interl EPT/AMD RVI for MMU virtualization」を選択

上記設定でKVMが使用可能となる。

```
root@compute:~# kvm-ok
INFO: /dev/kvm exists
```

##Floating IP経由でping/ssh不可

1.Floating IPで使用するExternal Networkポートの設定を変更

vSphere Clientで、ESXホストのConfigurationタブ＞Networking>対象を仮想スイッチのプロパティをクリック
対象のポートグループを選択して「Edit」をクリック
「Security」タブをクリック
「Promiscuous Mode:」を「Accept」に変更
「Forged Transmits:」を「Accept」に変更

上記設定でOpenStack側の設定がうまく出来ていればping/sshが可能となる。

##トラブルシュート
1.br-exに正しいポートが設定されているか？

```
miyamoto@controller:~/devstack$ sudo ovs-vsctl show
    Bridge br-ex
        Port "eth2"
            Interface "eth2"
        Port "qg-956f6873-a6"
            Interface "qg-956f6873-a6"
                type: internal
        Port br-ex
            Interface br-ex
                type: internal
```
2.NATが正しく設定されているか？

qrouterにログイン

```
miyamoto@controller:~/devstack$ sudo ip netns exec qrouter-6b8457d0-9995-4dce-8d2b-c45e7d369b11 bash
```

NAT設定を確認
以下の場合は、Fixed IP=192.168.210.10、Floating IP=10.0.0.183の例

```
root@controller:~/devstack# iptables -t nat -nL | grep DNAT
DNAT       all  --  0.0.0.0/0            10.0.0.183       to:192.168.210.10
root@controller:~/devstack# iptables -t nat -nL | grep SNAT
SNAT       all  --  192.168.210.10       0.0.0.0/0            to:10.0.0.183

```

以上。
C++ テンプレート　ヘッダと実装を別にした時に起こること

#1つのファイルを書いた場合

簡単な例（簡単のため参照は使用しない）

以下の関数funcをtemplateで書いてみよう．

```C++:main.cpp
#include <iostream>
using namespace std;

int func(int); //関数定義

int main(){

    cout << func(2) << endl;
    
    return 0;
}

int func(int a){ //実装
    return a+a;  //テキトーに足し算でもして返しましょう
}
```

templateで書いた．

```C++:main.cpp
#include <iostream>
using namespace std;

template <typename T>
T func(T);             //templateで定義

int main(){

    cout << func<int>(2) << endl;
    
    return 0;
}

template <typename T>   //実装
T func(T a){
    return a+a;
}
```

これで，問題なく動きます．

ここでtemplateを用いた関数funcの定義，実装部分をmain.cpp, func.h, func.cppのように分けたい．

#分けた場合


```C++:main.cpp
#include <iostream>
#include "func.h"
using namespace std;

int main(){

    cout << func<int>(2) << endl;
    
    return 0;
}
```

```C++:func.h
#pragma once

template <typename T>
T func(T);
```


```C++:func.cpp
template <typename T>
T func(T a){
    return a+a;
}
```

いつものように分割コンパイルすると．．．
**エラー**

#問題発生
エラー

```:log
In function `main':
main.cpp:(.text+0x15): undefined reference to `int func<int>(int)'
collect2: エラー: ld はステータス 1 で終了しました
make: *** [main] エラー 1
```

何故だろう？

g++の-cオプションでオブジェクトファイルを生成してみよう．

```:log
g++: 警告: func.o: リンクが完了しなかったのでリンカの入力ファイルは使われませんでした
```

リンカが上手くいっていないようだ．

いろいろ悩んで，twitterのフォロワー様にアドバイスを頂き，Google先生に訊いてみたところ，
**分割コンパイルはあくまでもファイル単位でコンパイル**（詳細は下の参考まで）
ということを理解すれば原因がわかる．

#エラーの仕組み

では，なぜエラーが出たのか見ていこう．
まず，main.cppのコンパイルを考える．
main.cppでfunc\<int\>(2)を呼び出しているので，ヘッダにある

```
template <typename T>
T func(T);
```

を見に行く．実装はコンパイラからは見えていないが，ヘッダにはちゃんと宣言されているのでひとまずOK．
（”C++はcppファイルごとにコンパイルするので他のcppファイルのことは知りません。なので教えてあげる必要があります。”@Drafear さんより）

次に，func.cppをコンパイルに移る．

```
template <typename T>
T func(T a){
    return a+a;
}
```

templateで書かれているので，具体的な処理の実体化は行いようがない．
なので，特になんの具体的な処理も記述されていないオブジェクトファイルが生成される．

これで，すべてのファイルの分割コンパイルが終了．
リンク作業が始まります．mainのオブジェクトファイルがfunc\<int\>関数の実体を探しますがint型のfunc関数は存在しません．

なので，リンクが上手くいきませんでしたというエラーがでたということになる（らしい）．

#解決法

・ヘッダに実装に全て書く．
・特定の型に対するインスタンスを明示的に書く

後者に関しては，func.cppを以下のように変更すれば良い．

```C++:func.cpp
template <typename T>
T func(T a){
    return a+a;
}
template int func<int>(int); //追加
```

これでコンパイルが通る．

>参考
>pknight様　[テンプレートの実装をヘッダに書かなければならない理由](http://d.hatena.ne.jp/pknight/20090826/1251303641)
>aki-yam様　[テンプレート関数の明示的インスタンス生成](http://d.hatena.ne.jp/aki-yam/20081129/1227982516)
ofxBox2d バウンドするカラフルな円

ofxBox2dの使い方ソースのメモです。
円をカラフルにしてみました。

![box2d.gif](https://qiita-image-store.s3.amazonaws.com/0/76843/6641c608-89e8-e123-34c6-378ed0cff34c.gif)








```cpp:ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxBox2d.h"

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

		void keyPressed(int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
    
        ofxBox2d box2d;

        // 円の数
        static const int CIRCLE_NUM = 30;

        ofxBox2dCircle circle[CIRCLE_NUM];

        // 円の描画色
        ofColor randColor[CIRCLE_NUM];
};

```



```cpp:ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    
    // 背景色を黒に
    ofBackground(0, 0, 0);
    
    // 円の分割数
    ofSetCircleResolution(64);
    
    // box2d初期化
    box2d.init();
    
    // 重力の設定
    box2d.setGravity(0, 0.98);
    
    // 地面の設定
    box2d.createBounds();
    
    // フレームレート
    box2d.setFPS(30);
    
    for(int i = 0; i < CIRCLE_NUM; i++){
        
        // 質量、跳ね返り係数、摩擦係数
        circle[i].setPhysics(10.0, 1.0, 0.01);
        
        // 生成する円の中心座標をランダムで設定
        float x = ofRandom(0, ofGetWidth());
        float y = ofRandom(0, ofGetHeight());
        
        // 円の半径
        float radius = ofRandom(10, 50);
        
        // 円をBox2dの空間に追加
        circle[i].setup(box2d.getWorld(), x, y, radius);
        
        // ランダムな色設定
        randColor[i] = ofColor(ofRandom(255), ofRandom(255), ofRandom(255));
    }
}

//--------------------------------------------------------------
void ofApp::update(){
    
    box2d.update();
}

//--------------------------------------------------------------
void ofApp::draw(){

    for(int i=0; i<CIRCLE_NUM; i++){
        // 円の描画色設定
        ofSetColor(randColor[i]);
        // Box2d空間の円を描画
        circle[i].draw();
    }

}
```
MacでChromeに導入しているExtensionのソースを見たい

ちょっとChrome拡張のソースを見てみたくなったので調べた自分用メモ。

[ウインドウ]→[拡張機能]で拡張機能一覧を開き、IDを確認する。
下図の例で言えばboadgeojelhgndaghljhdicfkmllpafdに該当する。

![image](https://qiita-image-store.s3.amazonaws.com/0/68671/192a157f-bd47-3dc5-716f-2f840625f9c4.png)

ソースは下記の場所にある。

```
~/Library/Application\ Support/Google/Chrome/Default/Extensions/${調べたID}/
```

若しくはこのChrome拡張を使う。
ストアに並んでいるもの限定だが、ブラウザ上でソースを見ることが出来て便利。
https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin
Jsoupによるmeta info scraping sample

```MetaInfoScrapeSample.scala
package com.rikima.data.practice

import org.jsoup.Jsoup

/**
  * Created by mrikitoku on 2016/01/01.
  */

case class MetaInfo(url: String, title: String, keywords: String, description: String)

object MetaInfoScrapeSample {

  def main(args:Array[String]): Unit = {
    val urls = Array(
      "http://www.orbis.co.jp/)",
      "http://b.hatena.ne.jp/",
      "http://www.sunmarie.com/"
    )

    urls.foreach {
      case url => {
        val doc = Jsoup.connect(url)
          .ignoreContentType(true)
          .ignoreHttpErrors(true)
          .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
          .referrer("http://www.google.com")
          .timeout(12000)
          .followRedirects(true)
          .execute()
          .parse()

        val title = doc.select("title").first().text()
        val keywords = doc.select("meta[name=keywords]").first().attr("content");
        val description = doc.select("meta[name=description]").get(0).attr("content");

        val metaInfo = MetaInfo(url, title, keywords, description)

        println(metaInfo)

      }
    }
  }
}
```
Twitter API を使ってファボ画像を一覧できるサービスを作りました

#サービスの概要
Twitterでファボしたツイート（今はいいね！）に画像がついてることありますよね？
私の場合、ファボはだいたい画像付きツイートにするんですが、Twitterの公式アプリだと、後で見ようと思ったとき、ひとつひとつツイートをクリックしないと画像の全体図が見れなくて使いづらいんですよね。
てことでパッと画像が閲覧できるサービスをExpress上に構築しOpenShiftで公開してみました。

#サービスのURL
QooQ Twitter Favo Photos Viewer
https://app-qooq.rhcloud.com/app-twitter/favolist

#必要になったもの
- OpenShiftのアカウント
- Twitterの開発者アカウント

#OpenShiftについて
RedHatが提供するPasSです。フリーでも３つまでアプリを作成できます。現状ではHerokuのように６時間スリープなどの制限もなく、移行先として注目されているようです。

#一連の流れ
今回はOpenShift上でもTwitterAPIつかえたよをメインにお送りしますので、TwitterAPI周りはさらっと流します。というか全体的に流しで説明しますので、ここで詰まりましたとかありましたら、コメントください。時間があったら補足します。

1. OpenShiftにアカウントを登録します。https://www.openshift.com/
2. OpenShiftにデプロイ環境を構築します。今回はカートリッジにnodejsを選択してデプロイ先を構築します。カートリッジは環境のテンプレートのようなものです。これでデプロイ環境とそのURLが取得できます。
3. 取得したURLをTwitterのAPI使用をするURLとして登録します。https://apps.twitter.com/ 開発者登録に電場番号がいりますが、登録しても最初にSMSで認証番号が送られてるくるぐらいなので臆せずいきましょう。
4. 開発環境でOpenShiftに作成されている雛形となるリポジトリをクローンします。開発環境はCloud9で問題ないです。SSHの公開鍵をOpenShiftに登録してgit cloneしてください。
5. TwitterAPIを使うのでシークレットトークンなどをOpenShiftに登録する必要がでるでしょう。（直書きしないのであれば）。gem install rhcでOpenShiftのコントロールCLIを入手したら、 rhc set-env name=val -a app-name で環境変数を登録できますのでこれを使いましょう。
6. express起動時のIP,Portをprocess.env.OPENSHIFT_NODEJS_IP, process.env.OPENSHIFT_NODEJS_PORTにする必要があります。
7. アプリが完成したらデプロイです。git push originでデプロイ環境に送り込みましょう。起動に成功したらsuccessメッセージがでます。

以上がかなり大雑把ですが全体の流れになります。OpenShift環境はかなり制限がきついので場合によってはできないこともでてくると思います。
実際、ほんとはphoenixを使いたかったんですがmixでこけるので諦めました。
でもカートリッジが存在する環境なら大体つかえると思います。たぶん。

では雑ですがこれくらいで。
気になる点があればコメントください。
Phoenixのlocaleを日本語に設定して、エラーメッセージを日本語にする

[Phoenix 1.1.0 から gettext に対応](http://www.phoenixframework.org/blog/upgrading-from-v10-to-v11)しました。日本語の.poファイルを用意し、locale を設定することでエラーメッセージを日本語に変更することができるようになりましたので、方法を共有します。

# 設定方法
GitHubで公開している[日本語の.poファイル](https://github.com/hykw/phoenix-locale_ja)の説明そのままなので、説明自体は割愛します。

このファイルを適用すると、モデルの changeset/2 で何も設定しなくても、このようにエラーメッセージが日本語で表示されるようになります。

![スクリーンショット 2016-01-01 16.46.15.png](https://qiita-image-store.s3.amazonaws.com/0/16022/3124d56a-9f77-2dec-f025-e06f7400d639.png)

## メッセージの置き換え
標準でメッセージが設定されている関数（[Ecto.Changesetとか](https://hexdocs.pm/ecto/Ecto.Changeset.html#functions)）では、message オプションを指定すると、メッセージを任意の文字列で置き換えることができます。標準の日本語訳だとしっくりこない場合、便利かと思います。

例）

```elixir
model
|> cast(params, @required_fields, @optional_fields)
|> validate_length(:password, min: 2, max: 4)
|> validate_format(:password, ~r/^[0-9]*$/, [message: "数字以外が設定されてるよ！"])
```
Swiftのお勉強 おぼえがき

Swiftについて勉強したことのおぼえがき。


# 変数宣言
変数と定数の宣言について

```swift
// 変数宣言(mutable)
var x = 3

// 定数宣言(immutable)
let y = 4
```

# 型宣言
本によると、Swiftの自動判断に任せてしまって、型宣言しなくていいとあるが、なんか不安。
オプショナル型（JavaのOptionalと近しいもの？？？）なるものを学習すると意味がわかるらしい。

```swift
var x:Int = 3
let str:String = "Hello Swift"
```

# 繰り返し処理（forループ）
pythonに似てる。elseも使えたら良かったのにな。

```swift
for n in 1...5 {
    print(n)
}
```

# 条件分岐(if分)
これはどの言語もだいたい同じ

```swift
if x < 2 {
    // 処理
}else if x < 5 {
    // 処理
}else{
    // 処理
}
```

# 関数定義

```swift

// 関数定義の仕方
func function1(){
    // 処理
}

// 引数の指定方法
func function2(intValue:Int){
    // 処理
}

// 戻り値の指定方法
func function3() -> Int{
    // 処理
    return 0
}

```


functionを引数で受け取ることもできる。
java8だと、function.apply()とかしなければいけないが、この辺はさすがに後発言語が有利か。

```swift 
func intToString(value:Int, f : Int -> String) -> String{
    return f(value)
}
```

# クラス定義とインスタンス化

```swift
class Shape {
    let value:Int // immutableだが、initializerからは設定可能
    
    init(value:Int){
        self.value = value
    }
}

var s = Shape(value:2)

```

Javaで書くとこんな感じ。

```java

class Shape{
	final int value;

	Shape(int value){
		this.value = value;
	}
}

Shape s = new Shape(2);

```

インスタンス化の際に、変数名を指定しなきゃいけないのが面倒だと思ったら、下記のような記述ができる。

```swift
class Shape2 {
    let value:Int
    
    init(_ value:Int){
        self.value = value
    }
}

var s2 = Shape2(2)
```
awkコマンドへ値を渡す手法のまとめ

# 概要
AWKには、awkコマンドへ値やシェル変数を渡す機能が存在する。
一般的には、-vオプションを用いることが多い。
しかし、-vオプションの他にも、もう1つ別の方法が存在する。

本記事では、それら2つの方法の利用法と、それぞれの差異を述べる。


# 実行環境
- Arch Linux (x86\_64, 4.2.5-1-ARCH)
- dash (0.5.8)
- gawk (4.1.3)



# 方法1
ファイル名引数として、値を渡す。
awkコマンドのスクリプトの直後に、awkで用いる変数varと代入する値value(もしくはシェル変数)を記述すれば良い。

```sh
$ awk 'script' var=value file
```

以下に具体例を示す。

```sh
$ cat file
man co
$ awk 'BEGIN{print num} END{print num}' num=100 file

100
```

# 方法2
-vオプションを用いて、値を渡す。
awkコマンドの-vオプションに続き、awkで用いる変数varと代入する値value(もしくはシェル変数)を記述すれば良い。

```sh
$ awk -v var=value 'script' file
```

以下に具体例を示す。

```sh
$ cat file
man co
$ echo | awk -v "sh=$SHELL" 'BEGIN{print sh} END{print sh}' file
/usr/bin/dash
/usr/bin/dash
```

# 各方法の差異
上記2つの方法の違いは、BEGINブロックにおける代入した値の扱いである。
方法1では、BEGINブロック内では代入した値を参照できない。
しかし、方法2では、BEGINブロック内でも代入した値を参照することができる。

以下に差異を示す。

```sh
$ hoge="hoge hage hige"
$ echo | awk 'BEGIN{print var} {print var} END{print var}' "var=$hoge"

hoge hage hige
hoge hage hige
$ echo | awk -v "var=$hoge" 'BEGIN{print var} {print var} END{print var}'
hoge hage hige
hoge hage hige
hoge hage hige
```

# 複数の値を渡す場合
複数の値をawkコマンドへ渡したい場合、awk変数への代入を続けて記述すれば良い。
方法1、方法2のどちらの場合でも、代入を複数回おこなえば良い。

以下に具体例を示す。

```sh
$ echo | awk '{print foo, bar}' foo="a" bar="b"
a b
$ echo | awk -v "foo=$HOME" -v "bar=$CPUTYPE" '{print foo, bar}'
/home/gin x86_64
```



# 参考にしたもの
1. $ man awk
1. The GNU Awk User's Guide - awkを実行する 〈[http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_15.html#SEC136](http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_15.html#SEC136)〉
1. 『sed & awkプログラミング 改訂版』、Dale Dougherty, Arnold Robbins 共著、福崎 俊博 訳、オライリー・ジャパン
1. ShellScript - awkからシェル変数を参照する - Qiita 〈[http://qiita.com/tkyk@github/items/1622970830262355a5a3](http://qiita.com/tkyk@github/items/1622970830262355a5a3)〉

# 雑記
- このawkへ値を渡す2種類の方法は、AWKの仕様として定められているらしい。
    * なので、gawk以外の処理系、nawk・mawkでも同じ動作をする。

- どうして2種類の方法が存在するのか、分からない。
    * この理由に関しては、参考にしたもの2.に記述があった。引用してみる。

> 初期のawk処理系の一部では、変数代入がすべてのファイル名の 前にあったときに、その代入をBEGINルールが実行される前に 行っていた。awkの振る舞いはこのために一貫性を欠いていた。 つまり、一部のコマンドライン上の代入はBEGINルール の内側にあるかのように扱われたが、そうでないものもあった。 しかし、一部のアプリケーションはこの"仕様"に依存していた。 awkがより一貫性を持つように変更されたとき、 `-v'オプションがこのような古い動作を前提としていた アプリケーションに適応させるために追加された。

* ただ、-vオプションを使わない方法は、どのような場面で活用するんだろう... 思いつかない。
SQLPlusでOracleにリモート接続するメモ

## 前提

Oracleクライアントがインストールされていること

### 基本

```
C:\ > sqlplus [username]/[passowrd]@[IP Addr]:[Port Number]/[Service Name]
```

### tnsnames.oraを利用

```
C:\ > sqlplus [username]/[passowrd]@[net_service_name]
```

以下をカレントディレクトリに配置

```file:tnsnames.ora
[net_service_name] = 
 ( DESCRIPTION= 
    ( ADDRESS=(PROTOCOL = [ex:TCP])(HOST = [IP Addr])(PORT = [Port Nuber])) 
    ( CONNECT_DATA= (SERVICE_NAME=[service_name])) 
 )
```
KAKASIとrubyの連携

漢字からかな変換が容易にできるKAKASI。インストールから実際にRubyで使用するまでをまとめた。

# GemfileからKAKASIのインストールができない
KAKASIとrubyの連携ライブラリである、
https://github.com/knu/kakasi_ffi
を使い、以下のように、単純にGemfileでKAKASIをインストールできるかと思いきや、bundle installでエラーが出てできない。

```rb:
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem "kakasi"
```

（※issuesにも上がっているが、エラーメッセージが変更されたのみで、クローズされた笑 https://github.com/knu/kakasi_ffi/issues/2 ）

そこで、まずはソースからインストール（apt-getなどが好ましいが、apt-getだとrubyから呼び出せないようである）。

# KAKASI本体のインストール
http://kakasi.namazu.org/index.html.ja
上記のインストールの項に従って、インストール。

```shell:
gzip -dc kakasi-2.3.5.tar.gz | tar xvf -
cd kakasi-2.3.5
./configure
make
su
make install
```
※最新版のKAKASIは2.3.6

# KAKASIとrubyを連携
続いて任意のディレクトリで https://github.com/eitoball/kakasi-ruby.git のソースをダウンロード。

```shell:
git clone https://github.com/eitoball/kakasi-ruby.git
cd kakasi-ruby
ruby extconf.rb
make
```

Ruby2.0以降を使う場合はここでエラーがでるので、ソースを変更する。

```shell:
mv kakasi.c kakasi.c.org # 元ソースバックアップのため
cat kakasi.c.org | sed "s/RSTRING\(([^)]*)\)->len/RSTRING_LEN\\1/" | sed "s/RSTRING\(([^)]*)\)->ptr/RSTRING_PTR\\1/" > kakasi.c
make
```

漢字からひらがな変換を確認できるよう、test.rbを修正。

```rb:test.rb
require 'kakasi'
puts Kakasi.kakasi('-JK -HK', 'Rubyから案山子を呼び出せます。')
```

結果は下記コマンドで。Rubyカラカカシヲヨビダセマス。

```shell:
ruby test.rb
```
Go で 0 から始まる連続する n 個の整数を重複無く k 個選んだ時の組み合わせの列挙


問題がニッチ過ぎる気もしますが、[Go言語で順列組み合わせ(Permutations and Combinations) - Qiita](http://qiita.com/kokardy/items/a18b574d548c212e58e6)にある通り、これを列挙できると任意の有限集合の組み合わせを列挙できます。

なぜ車輪の再発明をしたかといえば、非再帰的実装を思いついたからです(リンク先にある`combinations`は再帰関数)。実用性とは関係無く、思いつきを形にしたくて実装しました。

下記コードは[The Go Playground](http://play.golang.org/p/NrN9RfUSVW)で実行できます。

```go
package main

import "fmt"

func main() {
	n := 6
	k := 4

	for xs := range CombinationInts(n, k) {
		fmt.Println(xs)
	}
}

func CombinationInts(n int, k int) <-chan []int {
	ch := make(chan []int)

	if 0 <= k && k <= n {
		go combInts(n, k, ch)
	} else {
		close(ch)
	}

	return ch
}

func combInts(n int, k int, ch chan<- []int) {
	defer close(ch)

	xs := makeFirstConb(n, k)
	sendCopy(xs, ch)

	for xs[0] < n-k {
		updateNextConb(xs, k)
		sendCopy(xs, ch)
	}
}

func makeFirstConb(n int, k int) []int {
	xs := make([]int, k+1)
	for i := range xs {
		xs[i] = i
	}
	xs[k] = n
	return xs
}

func updateNextConb(xs []int, k int) {
	for i := k - 1; i >= 0; i-- {
		if xs[i]+1 < xs[i+1] {
			xs[i]++

			for j := i + 1; j < k; j++ {
				xs[j] = xs[j-1] + 1
			}

			return
		}
	}
}

func sendCopy(xs []int, ch chan<- []int) {
	ys := make([]int, cap(xs)-1)
	copy(ys, xs[:len(xs)-1])
	ch <- ys
}
```
[ bash ] 正規表現パターンマッチング

##memo

```bash
while read input_data; do
    if [[ ! ${input_data} =~ [Aa] ]]; then
        echo ${input_data}
    fi
done
```
入力された文字列に「A」または「a」があったらechoしない、というサンプル
ポイントは
1. `[[]]` 二重に囲む
2. `=~`(イコール＋チルダ)
3.  ダブルクォーテーションで正規表現囲まない
LinuxのBeep音を無効化する

ターミナルのBeep音が気になるので鳴らないようにしたい。

# 環境
- debian 5.0.10


# Beep音を鳴らしているのは誰か
pcspkr(Beep音のドライバ)
pcspkrが無ければ、Beep音は鳴らなくなる。


# 一時的にBeep音を無効化
## 確認
```console
# lsmod | grep pcspkr
pcspkr                  2432  0
```

pcspkrがある。

## pcspkrを削除
```console
# modprobe -r pcspkr
#
```

`modprobe -r pcspkr`でモジュールを削除する。
以下manより-rオプションの抜粋。

```man
-r --remove
         This option causes modprobe to remove, rather than insert a module.  If the modules it depends on are also unused, modprobe will try to remove them, too.  Unlike insertion,
         more than one module can be specified on the command line (it does not make sense to specify module parameters when removing modules).

         There is usually no reason to remove modules, but some buggy modules require it.  Your kernel may not support removal of modules.
```

## 再確認
```console
# lsmod | grep pcspkr
#
```

pcskrが消えた。
ここまでだと再起動すると、またBeep音が鳴る。


# 永続的にBeep音を無効化
```console
# echo blacklist pcspkr >> /etc/modprobe.d/blacklist
```

# Bashの場合
```
set bell-style none
```

を `.bash_profile` 等に記載しておくことで抑制できる。

```console:manからの抜粋
bell-style (audible)
      Controls what happens when readline wants to ring the terminal bell.  If set to none, readline never rings the bell.  If set to visible,  readline  uses  a
      visible bell if one is available.  If set to audible, readline attempts to ring the terminal's bell.
```
福笑い 2016

# あけましておめでとうございます

年末年始に暇だったので、jquery.uiの `draggable()` を使って
しょうもない福笑いを作ってみた

![fuku.png](https://qiita-image-store.s3.amazonaws.com/0/87716/f12b4cc1-3080-72b2-17e8-8235423a5ce4.png)

マル秘エリアにフェイスパーツをドラッグアンドドロップして、
置き終わったら、「Show Time!!」を押すだけ!

http://yotasasaki.github.io/fukuwarai/

突貫で、CSSもひさしぶりに扱ったためPCじゃないとスタイルが崩れているかも。

# ソースコード
https://github.com/yotasasaki/fukuwarai/tree/gh-pages

# 参考
http://js.studio-kingdom.com/jqueryui/interactions/draggable
http://black-flag.net/jquery/20120509-3821.html
slack と Hubot を連携するためにやること

# Hubot プロジェクトの準備 (Mac)
## Hubot のインストール
```:shell
$ npm install -g yo generator-hubot
```

## Hubot のプロジェクトを作成

```:shell
$ mkdir mybot(プロジェクト名)
$ cd mybot
$ yo hubot
# 今回は Slack と連携したいので Bot adapter には slack を指定
```


# slack bot の用意
## slack で適当なチームを用意する
* https://slack.com/

## slack で hubot を使用するための設定をする
* Apps & Custom Integrations を選択

![Apps & Custom Integrations.png](https://qiita-image-store.s3.amazonaws.com/0/28573/ad706f72-0ef7-5a34-ae6b-e06350119f2a.png)

* hubot を検索
![Search_hubot.png](https://qiita-image-store.s3.amazonaws.com/0/28573/c14af0a7-2579-cadf-4a91-9f5b3d2ed00f.png)

* 見つかったらインストールして、名前を設定 (今回は mybot)
    * API token が発行されるのでメモ
    * HUBOT_SLACK_TOKEN=xxx


# Heroku の設定
## ターミナルから Heroku を操作するための準備
* 下記を参考に toolbelt を取得する
    * https://toolbelt.heroku.com/osx
* heroku にログイン

```
$ heroku login
```

## Heroku 上にアプリケーションを作成

```:shell
$ heroku create app_name
Creating app_name... done, stack is cedar-14
https://app_name.herokuapp.com/ | https://git.heroku.com/app_name.git
Git remote heroku added
# ちなみに heroku 上でユニークな名前じゃないといけないっぽい
$ git remote -v
heroku  https://git.heroku.com/app_name.git (fetch)
heroku  https://git.heroku.com/app_name.git (push)
```

## Heroku の config を追加

```:shell
$ heroku config:add HUBOT_SLACK_TOKEN=xxx
# slack の token を設定する(上で発行された API token)
$ heroku config:add HUBOT_CHATWORK_ROOMS="room_id"
# slack で hubot を参加させたい room id を設定
$ heroku config:add TZ=Asia/Tokyo 
# タイムゾーンを日本に設定
```

## Heroku が起きている時間をスケジューラで設定

* 無料プランは 1 日 6 時間眠ってしまうので Process Scheduler というアドオンで時間を管理
    * https://elements.heroku.com/addons/process-scheduler

## keep-alive 設定
* heroku は 30 分間アクセスがないと sleep するので hubot-heroku-keepalive を設定

```:shell
$ npm install hubot-heroku-keepalive --save
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=https://app_name.herokuapp.com/
# Process Scheduler と合わせて wakeup time と sleep time を設定する
$ heroku config:add HUBOT_HEROKU_WAKEUP_TIME=7:00
$ heroku config:add HUBOT_HEROKU_SLEEP_TIME=24:00
```

# Heroku へのデプロイ
## bot がやること
* 毎正時に時刻を知らせる機能を追加

```coffeescript:script/notice.coffee
cronJob = require('cron').CronJob
module.exports = (robot) ->
  new cronJob('0 0 * * * *', () =>
    date     = new Date()
    hour     = date.getHours()
    envelope = room: process.env.HUBOT_CHATWORK_ROOMS
    robot.send envelope, "#{hour} 時です。"
  ).start()
```


## デプロイ

* heroku に push

```
$ git push heroku master
```

# 結果

* こんな感じで決まった時間に決まったメッセージを post できる

![notice.png](https://qiita-image-store.s3.amazonaws.com/0/28573/4c1cba42-6d71-6b5d-a8e2-ab266b3b14f3.png)

# 参考
* https://hubot.github.com/
* https://github.com/hubot-scripts/hubot-heroku-keepalive
* https://elements.heroku.com/addons/process-scheduler
rubyでの正しいgmailの取得方法を教える

rubyさわっていて、gmailの中身を取得して色々したい人がいると思う
「gem gmail 取得」というクエリで調べると下記がたぶん出てくると思う

* [gmail](https://github.com/gmailgem/gmail)
* [ruby-gmail](https://github.com/gmailgem/gmail)

いずれも[mail](https://github.com/mikel/mail)というメールの送受信をよしなに行ってくれるgemをラッパーしている感じ。
ただし上記を使うには[安全性の低いアプリがアカウントにアクセスするのを許可する](https://support.google.com/accounts/answer/6010255?hl=ja)をしないといけない。
なんか気持ち的にちょっと嫌だ

## **と思ったらこれは [GmailのAPI](https://developers.google.com/gmail/api/) が公開されるまでの話で2014年夏?移行はAPIある！！**

なのでgoogle周りのサービス使うときにはお馴染みの
`gem install "google-api-client"`
これでいける。嬉しい。安心。

[公式](https://developers.google.com/gmail/api/quickstart/ruby)にラベルを取得するまでの手順がかいてるので、それを参考に動かしてみる
※ 下記からは上記のサンプルが動いてる前提で！

## 実際にgmailを取得するサンプルを動かしてみる
メールは[ココ](https://developers.google.com/gmail/api/v1/reference/users/messages/get)のapiを叩くのだが、それにはmailを識別しているidが必要になる。
それを[ココ](https://developers.google.com/gmail/api/v1/reference/users/messages/list)から取得する。

### メールのidリストを取得
```lang:ruby
results = client.execute!(
  api_method: gmail_api.users.messages.list,
  parameters: { 
    userId: 'me',
    q: 'is:read after:2015/12/20 before:2015/12/30 ' 
  }
)

results.data.messages.each do |message|
  p message.id
end

=> "211df4423fb88"
   "31fsd4423fb88"
```
上記のpointはparametersにいれてるqで、ここにはgmailの検索クエリをそのまま入れられる！めっちゃ便利

### メールの詳細を取得
```lang:ruby
results = client.execute!(
  api_method: @gmail_api.users.messages.get,
  parameters: { userId: 'me', id: '【さっき取得したmailのid】' },
)
# jsonでかえってくるからパースする
obj = JSON.parse(results.response.body, symbolize_names: true)
enc_base64url = obj[:payload][:parts].first[:body][:data]
headers = obj[:payload][:headers]

{
  subject: headers.select { |e| e[:name] == 'Subject'}.try(:first)[:value],
  from: headers.select { |e| e[:name] == 'From'}.try(:first)[:value],
  date: Time.parse(headers.select { |e| e[:name] == 'Date'}.try(:first)[:value]),
  # メール本文だけはBase64ulrでencodeしてあるので、デコードする
  body: Base64.urlsafe_decode64(enc_base64url).force_encoding('UTF-8'),
}
```
上記のポイントになるのは、メール本文の取得。
取得した時はbase64urlでエンコードされておりデコードする。するとASCII-8BITでかえってくる。
表示するとかだけならこれでよいのだが、matchかけたりgsubしたりしたいとなると
utf8にしないといけないので、`force_encoding('UTF-8')`する

## 所感
ざっくりだけどこんな感じ
メール本文を取り出す時に結構はまったけどドキュメント読めば難しいことはないので
しっかりドキュメント読む
babel6のExperimental(策定中の言語仕様)をeslintで解釈可能にする。

Decoratorなどの策定中の実験的機能は、[ESLintのFAQ](https://github.com/eslint/eslint#what-about-ecmascript-72016-and-experimental-features)にある通りデフォルトではサポートされません。

> ESLint doesn't natively support experimental ECMAScript language features. You can use babel-eslint to use any option available in Babel.

これに対応させるためには上記に有るように[babel-eslint](https://github.com/babel/babel-eslint)へparserに切り替える必要があります。

```bash
# インストール
npm install babel-eslint
```

```json
// .eslintrc
{
  "parser": "babel-eslint"
}
```

ただ、[ちょいバグもある](https://github.com/babel/babel-eslint#known-issues)みたいなのでご注意を。

Babel6になってbabel-eslintが不要になって良かったんですが、策定中の機能を使うためにはやっぱりbabel-eslintが必要という
いたちごっこですね。まぁ仕方ないんですが。
テトリスをつくってみました　説明６　オブジェクトとは？　tetris.js

オブジェクトをnewすると、メモリにメソッド、プロパティがのります。それが、実体であります。（まずメモリ」を理解する必要がありますよ）

Render()としたときに、オブジェクトが作られます。
obj = new Render()
とすると、つくられたオブジェクトが作られたままobjとして保持されます。

作られることに違いはなく、保持するかしないかの違いです。


renderはnewしています。実は、newする必要は　「ありません」。
オブジェクト内で、保持しておくものはなにもないからです。（確かそうだったと思う）失礼。違いました。nullBlockというプロパティ値がありました。このおかげでnewしておく必要があります。

保持するものがなければ、newの必要はありません。
都度、Render().initなどとして使えばいいのです。


オブジェクト指向　で作るのに
オブジェクトを作る(newする)必要はない

なんだか矛盾している気がしますか？これは、矛盾しません。:)


専門家の方からより正確、厳密なコメントによる説明を期待します。
Elixirで使用できるアトムの上限

すごいE本を読んでいてErlangではアトムの数が制限されていて（[公式ドキュメント](http://www.erlang.org/doc/efficiency_guide/advanced.html)によるとデフォルトで1,048,576）、しかもガーベジコレクトされないので、アプリケーションの中で動的にアトムを生成するようなことは避けるべきと書いてありました。
これがElixirにも当てはまるのかどうか検証をしてみたところ、以下のように100万をちょっと超えたところでクラッシュしてしまいました。1万程度はすでに使われていると想定するとElixirもErlangに準じていると思われます。
ElixirでKey-Valueストアを自作するような時は注意したほうがよさそうですね。

```ex
#!/usr/bin/env elixir
for a <- 0..9,
    b <- 0..9,
    c <- 0..9,
    d <- 0..9,
    e <- 0..9,
    f <- 0..9,
    g <- 0..9
    do
      val =
      "a" <>
      Integer.to_string(a) <>
      Integer.to_string(b) <>
      Integer.to_string(c) <>
      Integer.to_string(d) <>
      Integer.to_string(e) <>
      Integer.to_string(f) <>
      Integer.to_string(g)
      IO.inspect val
      String.to_atom(val)
    end
```

```bash
$ ./lib/atom_limit.exs
"a0000000001"
"a0000000002"
"a0000000003"
・
・
・
"a0001037169"
"a0001037170"
"a0001037171"

Crash dump is being written to: erl_crash.dump...
```
テトリスをつくってみました　説明５　renderオブジェクト　tetris.js

ひとつめ

```js

function Render () {
  this.init = function(x, y, COLOR [ i ]){};
  this.drawUnit = function (x, y, TETRIS_BLOCK [ i ]) {};
}


```
こんな感じで別ファイルに書いておきます。おなじ識別子は上書きされるから問題なし。（実際にやってませんが）

その２

思いつきませんでした。


アイデア募集です。
テトリスをつくってみました　参考書籍

・独習javascript
・まるごとJavaScript＆Ajax Vol.1（達人に学ぶ最新テクニック）
・速効!図解プログラミJavaScript　古籏 一浩 
・改訂第3版 JavaScriptポケットリファレンス 


以下、蛇足
c言語なら以下おすすめ
・C言語 入門書の次に読む本
・C言語によるオブジェクト指向プログラミング入門 




職業執筆者：
本を書くことで生計を立てている

プログラマ執筆者：
プログラマが本業。本を書くことは、頼まれたり、サイドビジネス。


2種類います
プログラマ執筆者の本を買ってください。上の坂井さんのような方です、つまりは。

ポイント
・捨て身で2、3冊で望むこと。
完璧な本などありえません。数冊かう気持ちで望みましょう。古い中古の本でいいのです。

・外人の書いた本も使いどころがある戸思っています。クロージャ」などまぎらわしい概念を辞書的に引く場合です。つくった本場に聞くのが一番いいのです。多くの言語は外国で作られています。
UnityのuGUIで外部フォントを使う


[公式サイト](http://docs.unity3d.com/ja/current/Manual/class-Font.html)から
> フォントファイルのインポート
>
>プロジェクトにフォントを追加するには、Assets フォルダーにフォントファイルを置く必要があります。そうすると、Unity が自動的にフォントをインポートします。サポートしているフォント形式は TrueType(.ttf) と OpenType(.otf) です。

ということなので、
Assetsフォルダにttf形式、otf形式のフォントをインポートしましょう！

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/97338/ccad0e02-b537-a54c-4a21-e9efb7c44c99.png)

(画像ではFont/フォルダに入れています)

uGUIのTextコンポーネントの、
Character → Fontを変更します。
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/97338/462c6e40-6e7d-bf30-11b0-da578ded029d.png)

これだけです！簡単です！
テトリスをつくってみました　説明４　renderオブジェクト　tetris.js


Renderファンクションオブジェクトは、３つのメソッドを持ちます。
・drawBlockUnit
・init
・drawBlockType
・drawBoard

```js
	this.drawBlockType =
	function drawBlockType ( 

```

```js
function  Render () {
	
	function init () {
```

最初はこう書いていました。
オブジェクトメソッドの書き方がどこにも書いてなかったからです。

それから今のようにしました。
ちなみに、

```js
function  Render () {
	
	this.init ()　=　function　() {
　　　　}
```
右側は無名でもOK。消すのが面倒だったのと、オリジナルへの愛情で残しただけです。


this.fooはどこだ？
オブジェクトメソッドを見つけるのが大変ですね。C言語のプロトタイプ宣言的なものを書いてみましょう。

（ところで、fooってなに？と言う人はこちらへ(http://blog.dacelo.info/net/entry-662.html）

続く
Mac OSXでオーディオ出力を切り替えるApplescript

#Mac OSXでオーディオ出力を切り替えるApplescript
```applescript:
tell application "System Preferences"
	reveal anchor "output" of pane id "com.apple.preference.sound"
	activate	
	tell application "System Events"
		tell process "System Preferences"
			select (row 1 of table 1 of scroll area 1 of tab group 1 of window "サウンド" whose value of text field 1 is "内蔵スピーカー")
		end tell
	end tell
	quit
end tell
```
テトリスをつくってみました　説明４　回転パターン　tetris.js


```js


var ROTATE_CHANGE ={};
ROTATE_CHANGE [ COLOR [ 0 ] ]= 
		[
			[
			0,0,0,0,
			1,1,1,1
			],
```
 ROTATE_CHANGE [あか]　で、赤ブロックの回転パターンが得られます。

ewCurrent[ y ][ x ] = current[ 3 - x ][ y ];として回転させています。面白いですね。（引用）
おったち野郎さんは、数式を使ってやっています。

僕のは16版テトリスを真似しています。（それも、数式で実現できるかもしれませんが、頭がいたくなるので地道にブロックパターンを入力としました）

```js

			[
			0,0,1,0,
			0,0,1,0,
			0,0,1,0,
			0,0,1,0
			],
		];
		
ROTATE_CHANGE[ COLOR [ 1 ] ] = 
		[
			[
			0,0,0,0,
			1,1,1,0,
			1
			],


```
割愛します。



```js

var playerBlock = {
	x : 0,
	y : 0,
	tetrisBlock : 0 ,
	rotatePattern: 0,
};

```

rotatePattern　は後から付け足しました。
rotate(playerBlock)
playerBlockを渡して、回転したものに変えてもらう。こうすれば、roattePatternプロパティはいりません。どれもありでしょう。ただ、近しいことは、近くにあった方が分りやすい」。その考えで、プロパティを選択しました。


```js

function keyPress ( key ) {
	
	switch ( key ) {
		case 'down' :
			/// reset setTimeInterval 250ms
			moveBlock(0, 1);
			break;
		case 'rotate' :
			moveBlock(0, 0, 1);
			break;
		case 'left' :
			moveBlock(-1, 0);
			break;
		case 'right' :
			moveBlock( 1, 0);
			break;
	}
}

		
```

これはほぼ同じです。
/// reset setTimeInterval 250ms
下キーを押したら、自動的に落下していく間隔をリセットする。
はい、未実装です。

setTimeIntervalは、後ほど詳しく書きます。

つづく
ど素人が10分で理解できるjQuery/JavaScriptの基礎

下記、とても良い英語のビデオがあったのでシェアします。
英語苦手な方でも、コードと画面デザインのみ見ていれば意味はわかると思います。
jQueryとは、WebsiteをインタラクティブにするJavaScriptのライブラリで、
多彩な機能を短いコードで表現できとても便利です。
JavaScriptそのものより敷居が低いです。
何より手軽に自分のサイトがインタラクティブになるのはとても楽しいです。

https://youtu.be/hMxGhHNOkCU?list=PLoYCgNOIyGABdI2V8I_SWo22tFpgh2s6_

この様なわかりやすいチュートリアルビデオを作るととても勉強になるので、
私も時間を取って制作したいと思います。
テトリスをつくってみました　説明３　プロパティ保持のthisで対応　tetris.js



```js
s
			BoardWithColor [ i ] [ j ] = [];
			
			Object.defineProperty ( BoardWithColor [ i ] [ j ], 'Board' , {
				
				get () { return Board [this.i] [this.j]; },
				set (value) { Board [this.i] [this.j] = value; },
			});
			
			BoardWithColor [ i ] [ j ].i = i;
			BoardWithColor [ i ] [ j ].j = j

```


このソースコード。初めはこうでした。


```js

Object.defineProperty ( BoardWithColor [ i ] [ j ], 'Board' , {
				
				get () { return Board [i] [j]; },
				set (value) { Board [i] [j] = value; },
			});
```
```js

		get () { return Board [i] [j]; },
```

これが評価されるのは、getつまり、BoardWithColor [ i ] [ j ].Board　と書いたときです。すると、その時初めて関数である中身　Board [ i ] [ j ]　を評価します。これではi,jが思うように解決できません。 


・処理の時（Board [ i ] [ j ]が評価される時）に、所望のi,jが参照できないといけない→
・i,jを保持しないといけない→
・自身のオブジェクトに保持すればよい（プロパティという形で）

そこで、BoardWithColor[ i ] [ j ]に、わかりやすくi,jというプロパティをつくってfor分の際に値を入れておくわけです。

自分のプロパティですから、this.i　となりますね。

次いきます。
会社の年末休暇で新規ガチャを実装してきた話

![画像](http://cdn-ak.f.st-hatena.com/images/fotolife/m/maaaato/20151231/20151231150817.jpg)
もう2年ほど前でしょうか。以前いたアプリチームで年末休暇に課題が出されました。それは**新しい施策を考える**でした。  
ソシャゲは常に新しい施策や機能を追加していく事が多いと思います。このチームも正にそれで、新しい施策、機能が必要となっていました。  

自分は施策を考えるのは得意ではなかったのですが、なにがいいかなーと考えてしました。  
するとふと思い出した事がありました。それは、ディレクターがやりたがっていた**新規ガチャ**でした。

休みに入る一ヶ月ほど前でしょうか。ディレクターがこうつぶやいてました**「引き直しガチャやってみたいんだよねー」**...

## 引き直しガチャとは？
基本的にガチャは一度引いて出たアイテムはプレゼントボックスに送られてガチャは終了します。引き直しがガチャは、決まった回数までは引き直す事が出来るので、気に入ったアイテムが出るまでは引き直しが出来ます。

実はこの一ヶ月前は新婚旅行に行く直前で、その話をディレクターから聞いた時に、「うーんソース見て出来るかどうか調べてみますね〜」と軽い返事で終わっていました。しかし、やれるかちゃんと調べておかないと**出来る・出来ない**は答えられないので、新婚旅行中にDBのテーブル設計とソースを改修するポイントを調べて置きました。  
旅行から帰ってきたときははっきりとした答えは出さずにいましたが、なんとなく出来そうくらいは答えたような覚えがあります。

そして、その課題が出された時に「よし！家でがっつり実装したろ！」と決めました。実装出来る自信もありましたし、なによりディレクターがやってみたかった事をすぐにでもやれる状態を作ってビックリさせたかったという気持ちもありました。  
実装は2日ほどで出来ましたが、休みが終わる2日前という土壇場ぶり（笑）

課題を発表する当日は、確か会議室を借りて、考えてきた人がリードディレクター、リードエンジニア、プロデューサーの前で発表するというスタイルでした。他のメンバーは新規イベントを考えてきたりしており、そのほとんどがKeynoteなどのスライド系でした。
自分はディレクターから聞いていた仕様を箇条書きで書いた簡単なスライドを作り、発表をしました。  

その中の一枚に、**実装してテスト環境にデプロイ済みです**の一言を書きました。結果即採用で、テストしたらリリースしようという話になりました。（実際はテストしてもらったときに引き直せないという致命的なバグが出ましたが、すぐに修正しました（笑）

そして、リリースまではいままで時間が無いことを理由にして出来なかったコードレビューをエンジニアで行いました。実装がほぼ終わっており時間的に余裕があったので、エンジニアに声を掛けて、コードレビューをしました。その中で、行ロック漏れが発覚したりと致命的な問題に気づく事が出来ました。コードレビュー大事！


## そしてリリース
新規テーブルがあったので、DBのマイグレートを行い、そしてデプロイ！するとデプロイ直後にバグを発見...メンテナンス中の出来事だったので、メンテ開ける前に修正する事が出来ました。ガチャの期間としては確か一週間ほどでしたが、その間はほとんどバグも出ずに無事乗り切る事が出来ました。  
ただ、残念ながら引き直しガチャは大ヒットまではいかず、それ以降再び施策に入る事はありませんでした。


## この話は残念な話ではない
「なんだ売れなかったのか」「残念だったね」という話ではありません。むしろ大きく得たものがありました。それは、**「このゲームのユーザは引き直しガチャに大きなメリットを感じていない可能性が高い」**それを工数を掛けず（営業日的に）分かった事は大きい。もちろんガチャで排出されるアイテムやキャラクターの引きが弱かったという可能性もありますけどね。  

これで得た経験は**「フィードバックを素早く得ること」**です。はっきり言ってしまえば、施策がユーザに喜んでもらえるかなんて、リリースしてみないとわかりません。仮説を立てる事はとても大事ですが、それが本当にそうなのか？は実際にリリースしてみないと分からないという事です。

最近読んでいる本に「継続的デリバリー」があります。この本はフィードバックを素早く得る事が大事で、それを得る為にデプロイやテスト、環境構築を「簡単に」「素早く」やってしまおうという話です。（間違った解釈をしているかもしれませんので、ツッコミお願いします）  
この考えはとても共感出来るもので、自分は引き直しガチャ実装で似たような経験が出来たと思っています。そして、一部分のみ自動化するのではなく、全体を自動化するように意識して、チームをデザインしなければならないと気づきました。それは今後の課題ですが。

いままではサーバ自動化うぇーいと考えていましたが、ふと昔の経験を思い出してみると「誰かからの結果を素早く知る事が大事」という事を思い出しました。いま頭にあるのは、サーバ自動化うぇーいではなく、アプリチームが素早くフィードバックを得るためになにをしなければならないのか？を考えるようになりました。  

サーバ構築が楽になっても、デプロイするアプリチームが大変では、フィードバックまで時間が掛かってしまいまし、デプロイが複雑である為にデプロイ時にミスが発生したりなどがあるのはとても問題です。
継続的デリバリー、CIが回る環境を作るには、インフラ、アプリで作業領域を分けるのではなく、お互いが1つのチームとして動いていく必要があると考えています。  

本番リリースで心臓が痛くなったり、サーバ構築が複雑で時間が掛かったりなんてことはさっさと自動化させて楽して終わらせてしまい、ユーザからのフィードバックを得ましょうよ！それがきっとやりがいに繋がると思います。

[この記事は自分のブログを転載しています。](http://tech.nikuniku.me/entry/2015/12/31/152500)
AWS ECR と docker-compose

参考: [EC2 Container Registry – 一般利用可能に](http://aws.typepad.com/aws_japan/2015/12/ec2-container-registry-now-generally-available.html)

EC2 Container Registry を利用できるようになったので、Private Registryの管理から解放されて楽々にできるようになる！
ということで、さっそく試してみた

手順通りにやれば、すぐ利用できるので書くほどでもないですが... 一応メモ

## 1. IAMで作成したアカウントのアクセスキーを ~/.aws/credentials に記載

credentials に記載しておけば、CLIで引数に渡さなくて良いので便利

```
[ecr]
region = us-east-1
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
```

## 2. ログイン用のコマンドを発行

`--profile` のオプションで指定すれば credentials の設定使ってくれます

```bash
$ aws --profile ecr ecr get-login
docker login -u AWS -p ***** -e none https://************.dkr.ecr.us-east-1.amazonaws.com
```

## 3. 発行したコマンドでログイン

```bash
$ docker login -u AWS -p ***** -e none https://************.dkr.ecr.us-east-1.amazonaws.com
```

ログインしたらあとは手順通りにビルドしてタグ付けして、push すれば AWS の registry に登録されてます

## 4. docker-compose.yml のimageでパス指定

ログイン済みであれば、up するだけで、ちゃんとpullして起動してくれる

```
web:
  image: ************.dkr.ecr.us-east-1.amazonaws.com/hoge/web:latest
```
DockerfileでPATHを通す時はRUNではなくENVを使おう


ある時Dockerfile内でPATHを通したいと思い、テストコンテナで以下のコマンドを実行して正しい環境になっていることを確認していました。

やりたかったことはCentOS6.7にopenjdk1.8をインストールしている環境にScala-2.11.7をインストールするということです。

<h2>OpenJDK1.8が入っているコンテナに手動でScalaをインストール</h2>

```
wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
tar xvzf scala-2.11.7.tgz
mkdir /usr/local/scala
mv scala-2.11.7 /usr/local/scala
export PATH=$PATH:/usr/local/scala/scala-2.11.7/bin
```

これを実行した後に
`which scala`
や
`scala`
を実行してもちゃんと起動することが確認出来ました。


<br>
<h2>buildに失敗したDockerfile</h2>

```Dockerfile
FROM takashioshikawa/java8

WORKDIR /tmp

RUN wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
RUN tar xvzf scala-2.11.7.tgz
RUN mkdir /usr/local/scala
RUN mv scala-2.11.7 /usr/local/scala
RUN export PATH=$PATH:/usr/local/scala/scala-2.11.7/bin
RUN echo $PATH

RUN which scala

CMD /bin/bash
```


このDockerfileを使って
`docker build -t takashioshikawa/scala-2.11.7 .`
を実行すると
`RUN echo $PATH`
でexportしたはずのPATHが追加されておらず
`which scala`
でエラーが帰ってきました。


<br>
<h2>buildに成功したDockerfile</h2>
そこで調べてみると
http://stackoverflow.com/questions/27093612/in-a-dockerfile-how-to-update-path-environment-variable
http://inokara.hateblo.jp/entry/2013/12/28/121828
DockerfileのPATHはRUNではなくENVで通すことを知りDockerfileを書き換えました。

```Dockerfile
FROM takashioshikawa/java8

WORKDIR /tmp

RUN wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
RUN tar xvzf scala-2.11.7.tgz
RUN mkdir /usr/local/scala
RUN mv scala-2.11.7 /usr/local/scala
ENV PATH $PATH:/usr/local/scala/scala-2.11.7/bin
RUN echo $PATH

RUN which scala

CMD /bin/bash
```

`RUN export PATH=$PATH:/usr/local/scala/scala-2.11.7/bin`
を
`ENV PATH $PATH:/usr/local/scala/scala-2.11.7/bin`
に変更しただけです。
これでビルドが通るようになり

`docker --rm -it --name testscala takashioshikawa/scala-2.11.7`
でコンテナを立ち上げてwhichしてみるとちゃんとScalaが使えるようになりました。

地味にハマるとこがあるのでどんどんハマって知見を貯めていきたいですね、以上です。
<br>
nodebrewでnodejsがインストール出来ないときの対処法

こんな感じでコマンドを打つとエラーが出てnodeをインストール出来ない

```shell-session

nodebrew install stable
```

下記記事を参考にディレクトリを作成すると無事 node install が出来た
[Can't install node with nodebrew](http://stackoverflow.com/questions/34104883/cant-install-node-with-nodebrew)


```shell-session

 mkdir -p ~/.nodebrew/src

```

ディレクトリのパーミッションが原因のようだ
パスワードを忘れてkvmゲストに入れなくなった

# rootパスワードを忘れてkvmのゲストに入れなくなった
Kickstartでrootパスワードを設定したが覚えてたパスワードと違うのでhost上からGuestのrootパスワードを更新したメモ。

`OS:CentOS6`
作業前に対象ゲストは落としましょう。

## 作業内容
1. imgをマウント
2. chrootしてpasswdコマンドで新規パスワード発行

## 1. hostから読み書きできるようにする
対象ゲストimgをhostにマウント

```
# losetup -f /var/lib/libvirt/images/<image>
# losetup -a
# kpartx -a /dev/loop0
# ls -l /dev/mapper/
# mount /dev/mapper/loop0p2 /mnt
# mount
```

`kpartx -a /dev/loop0` は、`losetup -a` で確認したループバックを指定。


## 2. chrootしてpasswdコマンドで新規パスワード発行
chrootあんま使った事がない。。。

```
# chroot /mnt/ /bin/bash
# whoami
# cd /etc/;pwd
# cp -ip shadow .backup/shadow.`date +"%Y%m%d"`
# passwd
# diff .backup/shadow.`date +"%Y%m%d"` shadow
# exit
```

## 後かたづけ
```
# mount
# umount /mnt
# mount
# ls -l /dev/mapper/
# kpartx -d /dev/loop0
# losetup -a
# losetup -d /dev/loop0
# losetup -a
```

## ゲストを起動してログイン確認して終了

kickstartで設定するrootパスワードなんだっけ…
NSDateFomatter、日付、時刻書式の表示一覧


時刻書式を時々忘れるのでメモ。

例:2016/01/02 08:03:05

| 　書式  |   表示  | 説明       |
|:-------|-------:|-----------:|
| yy     |16      |2桁表記      |
| yyyy   |2016    |4桁表記      |
| M      |1       |前0なし      |
| MM     |01      |前0あり      |
| MMM    |Jan     |月の短縮     |
| MMMM   |January |月の短縮なし  |
|d       |2       |前0なし      |
|dd      |02      |前0あり      | 
|EEE     |Sat     |曜日の短縮    |
|EEEE    |Saturday|曜日の短縮なし|
|h(K)    |8       |12時間制前0なし|
|hh(KK)  |08      |12時間制前0あり|
|H       |8       |24時間制前0なし|
|HH      |08      |24時間制前0なし|
|m       |3       |前0なし      |
|mm      |03      |前0あり      |
|s       |5       |前0なし      |
|ss      |05      |前0あり      |
|a       |AM      |AM or PM    |
|z       |GMT+9   |            
|G       |AD      |時代/年号　　 |
Pythonでデータの分析を出来るようになりたい（その４）

（その４）

（文中に出てくるページ参照は [統計学が最強の学問である［実践編］データ分析のための思想と方法 - 西内啓 著](http://www.diamond.co.jp/book/9784478028230.html) という本のページです。）

#16枚のコインを投げた場合

P63で「参考までに」とある、16回コインを投げた場合の結果。

表が出る確率が1/3という、非対称なコインを投げるという場合でも「データの合計が正規分布に収束する」と著者は強調している。

なぜ「山」の形になるかだけど、一番理解しやすかったのが、2x2や3x3や8x8の表としてデータが表されている場合、右上から左下に向かって「同じ結果を出す別のパターン」がいくつも存在し、それらを足し合わせることで、対角線に近いほど合計の値が大きくなる＝山の一番高いところになる、というもの。

#コード

今回は棒グラフのみ作るので、表にするためのデータは準備しない。

```py

from random import randint
from decimal import Decimal
import numpy as np

def tossBiasedCoin():
    """ Returns 0 or 1 with 0 having 2/3 chance """
    return randint(0,2) % 2

# Prepare counters
tossCount = 16
counts = [0]*tossCount

# Toss a coin many times to get counts
sampleCount = 50000
for num in range(sampleCount):    
    headCount = 0
    for i in range(tossCount): # Toss the coin 16 times
        headCount += tossBiasedCoin()
    counts[headCount] += 1

# Conert all counts to perentage
TWOPLACES = Decimal(10) ** -2 
for i in range(tossCount):
    value = counts[i]        
    counts[i] = (100 * Decimal(counts[i])/Decimal(sampleCount)).quantize(TWOPLACES)
    print("Converted the value {} to percentage {}".format(value, counts[i]))

# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(np.arange(tossCount),
                 counts, 
                 0.5,
                 alpha=0.4,
                 align="center", 
                 color='b')

plt.xlabel('Number of heads for 16-toss')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(np.arange(tossCount))

plt.tight_layout()
plt.show()
```

##カウンター変数を作る

素直に、要素が16個の list を作る。

```py
# Prepare counters
tossCount = 16
counts = [0]*tossCount
```

##コインを投げる

16回投げて何枚表になるかを50万回実行する（こんなに回さなくてもいいんだけど）

```py
## Toss a coin many times to get counts
sampleCount = 50000
for num in range(sampleCount):    
    headCount = 0
    for i in range(tossCount): # Toss the coin 16 times
        headCount += tossBiasedCoin()
    counts[headCount] += 1
```

##パーセントに変換する

```py
# Conert all counts to perentage
TWOPLACES = Decimal(10) ** -2 
for i in range(tossCount):
    value = counts[i]        
    counts[i] = (100 * Decimal(counts[i])/Decimal(sampleCount)).quantize(TWOPLACES)
    print("Converted the value {} to percentage {}".format(value, counts[i]))
```

##棒グラフを作る

特に特別なことはしていない。

```py
# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(np.arange(tossCount),
                 counts, 
                 0.5,
                 alpha=0.4,
                 align="center", 
                 color='b')

plt.xlabel('Number of heads for 16-toss')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(np.arange(tossCount))

plt.tight_layout()
plt.show()
```

#結果

P64の図表1-21にそっくりのグラフが出来た。

![image](https://qiita-image-store.s3.amazonaws.com/0/103139/d321a7a4-dcfc-9e85-99a4-05f0a226fdac.png)

#まとめ

Pythonでデータの分析が出来るようになるためのコツというか、今後やらなくてはいけないなと感じること。

- Pythonとは関係ないけれど、統計・確率の根本的な復習と勉強
- Pythonのキモのひとつは シーケンス型と見た
- matplotlib をはじめとするプロットやグラフ用のライブラリに馴れる
Pythonでデータの分析を出来るようになりたい（その３）

（その３）

#コイン投げ1セット＝3回投げる

これは本にはなかったんだけど、単純に「1セット2回投げ」を「1セット3回投げ」にして、合計を「4枚投げ」から「6枚投げ」にしてみた。

#コード

解説はなし。前回の[（その１）](http://qiita.com/yoshiwatanabe/items/3fd11e3c9daee8f06953)と[（その２）](http://qiita.com/yoshiwatanabe/items/807f6b68806b99cdfae4)と内容は同じ。

```py
from random import randint
from decimal import Decimal
from prettytable import PrettyTable
import numpy as np

def tossBiasedCoin():
    """ Returns 0 or 1 with 0 having 2/3 chance """
    return randint(0,2) % 2

# Make a 4x4 array
counts = [[0 for j in range(4)] for i in range(4)]

# Toss a coin many times to get counts
sampleCount = 500000
for num in range(sampleCount):    
    firstSet = [tossBiasedCoin(),tossBiasedCoin(),tossBiasedCoin()] # 0, 1, 2, 3
    secondSet = [tossBiasedCoin(),tossBiasedCoin(),tossBiasedCoin()]
    counts[sum(secondSet)][sum(firstSet)] += 1

# Conert all counts to perentage
TWOPLACES = Decimal(10) ** -2 
for i in range(4):
    for j in range(4):
        value = counts[i][j]        
        counts[i][j] = (100 * Decimal(counts[i][j])/Decimal(sampleCount)).quantize(TWOPLACES)
        print("Converted the value {} to percentage {}".format(value, counts[i][j]))

# Make summaries of number of heads.
keys = np.arange(7)
values = [counts[0][0], # 0
          counts[0][1]+counts[1][0], # 1
          counts[0][2]+counts[2][0]+counts[1][1],
          counts[0][3]+counts[1][2]+counts[2][1]+counts[3][0],
          counts[1][3]+counts[2][2]+counts[3][1],
          counts[2][3]+counts[3][2],
          counts[3][3]]
          
# Add row descriptions
counts[0].insert(0, '2nd set 0 head')
counts[1].insert(0, '2nd set 1 head')
counts[2].insert(0, '2nd set 2 heads')
counts[3].insert(0, '2nd set 3 heads')

# Create table with column descriptions, add rows, then show it.
table = PrettyTable(["", "1st set 0 head", "1st set 1 head", "1st set 2 heads", "1st set 3 heads"])
table.padding_width = 1
table.add_row(counts[0])
table.add_row(counts[1])
table.add_row(counts[2])
table.add_row(counts[3])
print table

# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(keys,
                 values, 
                 0.5,
                 alpha=0.4,
                 align="center", 
                 color='b')

plt.xlabel('Number of heads')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(keys, np.arange(7))

plt.tight_layout()
plt.show()
```

#結果

またさらに標準偏差みたいになってきた。

![image](https://qiita-image-store.s3.amazonaws.com/0/103139/e202c292-6e43-489e-803f-f23a1f6528ca.png)

6枚投げて何枚表になるかは、「6 x 1/3」で、2になるから「2枚表になりやすい」ということ。

[（その４）](http://qiita.com/yoshiwatanabe/items/76cbd61e843b7d3c11c3)につづく。
Babel6でreact-reduxの@connectを実現する。


Babel6を使って[react-redux](https://github.com/rackt/react-redux/)(バージョンは4.0.6)の[@connect](https://github.com/rackt/react-redux/blob/master/docs/quick-start.md#support-for-decorators)を気軽に使おうとしたらサクッとハマりました。
以下の事項に関して気をつける必要があります。

## 1.babel-plugin-transform-decoratorsを使わない
[babel-plugin-transform-decorators](https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-decorators)はBabel6になったタイミングで仕様?が変わったため、そのまま利用すると正しく動作しません。以下のようなエラーが出ます。
> Decorators are not supported yet in 6.x pending proposal update.

エラーにさせずに期待通りの動きをさせるためには、[babel-plugin-transform-decorators-legacy](https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy)を使う必要があります。Babel5とBabel6でdecoratorの動きがどのように変わったかはまだ検証しきれてないのでここでは触れません。

`.babelrc`(あるいは`package.json`のbabelプロパティ)には、忘れずに`transform-decorators-legacy`を追加しておきましょう。

```json
  "babel": {
    "presets": [
      "es2015"
    ],
    "plugins": [
      "transform-decorators-legacy"
    ]
  },

```

※ *[この辺り](https://github.com/rackt/react-redux/pull/212/files#diff-b9cfc7f2cdf78a7f4b91a753d10865a2R45
)も見るにpresetsに`stage-0`(むしろ`stage-1`)を設定する必要があるのかなと思いましたがなくても大丈夫でした。あとで確認しよう...。*

## 2.staticプロパティ定義をES7記法に合わせる
[redux](https://github.com/rackt/redux/)の[#589](https://github.com/rackt/redux/issues/589#issuecomment-133185422)でも言及されていますが、ES7のDecoratorとClassPropertiesをES6で代替する記法は両立しません。

こんなエラーになります。
> Uncaught Invariant Violation: Could not find "store" in either the context or props of "Connect(XXXX)". Either wrap the root component in a <Provider>, or explicitly pass "store" as a prop to "Connect(XXXX)".

具体的には、こういう記述はNGになります。

```es6
@connect
class Stuff {} 

Stuff.contextTypes = {
  router: React.PropTypes.object,
};

```

これを回避するためには以下のようにES7で書く必要があります。

```es6
@connect
class Stuff {
  static contextTypes = {
    router: React.PropTypes.object
  }
} 
```

ClassPropertiesを使うので、[babel-plugin-transform-class-properties](https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-class-properties)のインストールと、babelのplugin設定をお忘れなく。

```json
  "babel": {
    "presets": [
      "es2015"
    ],
    "plugins": [
      "transform-decorators-legacy",
      "transform-class-properties",
    ]
  }

```

## TODO
* Babel5とBabel6でのDecoratorの仕様や挙動の違いを検証する。
* Babelのpresetsについて再度確認する。

以上です。
promiseの無限ループはメモリリークする

# promiseの無限ループはメモリリークする

注意しないとやっちゃうパターンとして。

## メモリリークするパターン

```
const timeout = ms => new Promise((resolve, reject) => setTimeout(() => resolve(), ms))

const start = (ctx) => {
    return timeout(ctx.timer).then(() => {
        return start(ctx)
    }).catch(e => {
        return start(ctx)
    })
}

const main = () => start({timer:0})

main()
```

* return start(ctx)の箇所でpromise chainができているため無限に伸びてメモリが足りなくなります

## メモリリークしないパターン

```
const timeout = ms => new Promise((resolve, reject) => setTimeout(() => resolve(), ms))

const start = ctx => {
    timeout(ctx.timer).then(() => {
        start(ctx)
    }).catch(e => {
        start(ctx)
    })
}

const main = () => start({timer:0})

main()
```


## ハマりやすいパターン（メモリリークするパターン）

```
const timeout = ms => new Promise((resolve, reject) => setTimeout(() => resolve(), ms))

const start = ctx => timeout(ctx.timer)
        .then(() => start(ctx))
        .catch(e => start(ctx))

const main = () => start({timer:0})

main()
```

## PS

私はこれで年末～正月ハマりました
Promiseで無限ループする場合はreturnで返さずにオブジェクトに状態をもつようにするとよいです